@craftpipe/projectsync-a2a
v1.0.0
Published
A2A agent for project management — list, create, update, search issues and pro features (sprint management, bulk update, analytics, cross-project reports, backlog grooming, workflow automation) across Linear, Jira & GitHub Issues
Downloads
32
Maintainers
Readme
Production-ready A2A agent for multi-provider project management -- list, create, update,search issues and pro features (sprints, bulk update, analytics, reports, grooming, automation)across Linear, Jira, GitHub Issues & Asana.
Quick Start · Skills · Providers · Configuration · API · Pro Features
Why ProjectSync?
Every project tracker speaks a different API dialect. ProjectSync A2A gives any A2A-compatible orchestrator a single, unified interface to 4 major issue trackers through 13 specialized skills -- 7 free and 6 pro.
- Unified -- one protocol, four providers (Linear, Jira, GitHub Issues, Asana), zero adapter code in your orchestrator
- Skill-based -- each operation is a discrete, strongly-typed skill with Zod validation
- Freemium -- core issue management is free; advanced insights unlock with
PRO_LICENSE - Standards-first -- speaks A2A protocol over JSON-RPC 2.0
- Mock fallback -- works out of the box with built-in mock data (23 issues, 3 projects, 4 sprints, 8 labels)
Architecture
graph LR
O["A2A Orchestrator"] -->|JSON-RPC 2.0| S["ProjectSync A2A :3012"]
subgraph FreeSkills["Free Skills"]
LI[list-issues]
GI[get-issue]
CI[create-issue]
UI[update-issue]
SI[search-issues]
LP[list-projects]
LL[list-labels]
end
subgraph ProSkills["Pro Skills"]
SM[sprint-management]
BU[bulk-update]
IA[issue-analytics]
CR[cross-project-report]
BG[backlog-grooming]
WA[workflow-automation]
end
S --> FreeSkills
S --> ProSkills
subgraph Prov["Providers"]
Linear[Linear]
Jira[Jira]
GH[GitHub Issues]
Asana[Asana]
end
S --> Prov
style S fill:#a855f7,color:#fff,stroke:#9333ea
style FreeSkills fill:#1a0a2e,color:#d8b4fe,stroke:#a855f7
style ProSkills fill:#1a0a2e,color:#fbbf24,stroke:#f59e0b
style Prov fill:#0a1628,color:#93c5fd,stroke:#3b82f6Quick Start
npm
# Install globally
npm install -g projectsync-a2a
# Start with mock data (no credentials needed)
projectsync-a2a
# => projectsync-a2a listening on port 3012
# Or configure a provider
export PROJECTSYNC_PROVIDER=linear
export LINEAR_API_KEY=lin_api_xxx
export PORT=3012
projectsync-a2aDocker
FROM node:20-alpine
RUN npm install -g projectsync-a2a
ENV PORT=3012
EXPOSE 3012
CMD ["projectsync-a2a"]From source
git clone https://github.com/craftpipe/projectsync-a2a.git
cd projectsync-a2a
npm install
npm run build
node dist/index.jsSkills
Free (7)
| Skill | Description |
|-------|-------------|
| list-issues | List issues with filters (project, status, assignee, label, limit) |
| get-issue | Get a single issue by ID with comments |
| create-issue | Create an issue (title, description, project, labels, assignee, priority) |
| update-issue | Update an issue (status, title, description, assignee, labels, priority) |
| search-issues | Full-text search across issues |
| list-projects | List all projects with issue counts |
| list-labels | List available labels with colors and counts |
Pro (6) -- requires PRO_LICENSE
| Skill | Description |
|-------|-------------|
| sprint-management | List, create, update sprints; assign issues to sprints |
| bulk-update | Bulk update multiple issues at once |
| issue-analytics | Velocity, cycle time, burndown metrics, throughput |
| cross-project-report | Aggregate stats across all projects |
| backlog-grooming | Stale issues, unassigned items, priority suggestions |
| workflow-automation | List, create, update auto-transition rules |
Providers
| Provider | Auth | Env Vars |
|----------|------|----------|
| Linear | API key | LINEAR_API_KEY |
| Jira | Basic auth | JIRA_URL, JIRA_EMAIL, JIRA_TOKEN |
| GitHub Issues | Bearer token | GITHUB_TOKEN, GITHUB_OWNER, GITHUB_REPO |
| Asana | Bearer token | ASANA_ACCESS_TOKEN, ASANA_WORKSPACE_GID |
| Mock | None | (default, no env vars needed) |
Select provider via PROJECTSYNC_PROVIDER env var or per-request provider parameter.
Configuration
| Variable | Default | Description |
|----------|---------|-------------|
| PORT | 3012 | Server listen port |
| PROJECTSYNC_PROVIDER | mock | Default provider (linear, jira, github, asana, mock) |
| LINEAR_API_KEY | -- | Linear API key |
| JIRA_URL | -- | Jira base URL (e.g. https://myorg.atlassian.net) |
| JIRA_EMAIL | -- | Jira account email |
| JIRA_TOKEN | -- | Jira API token |
| GITHUB_TOKEN | -- | GitHub personal access token |
| GITHUB_OWNER | -- | GitHub repository owner |
| GITHUB_REPO | -- | GitHub repository name |
| ASANA_ACCESS_TOKEN | -- | Asana personal access token |
| ASANA_WORKSPACE_GID | -- | Asana workspace GID |
| PRO_LICENSE | -- | Enable pro skills |
API
Agent Card
GET /.well-known/agent.jsonReturns the A2A agent card with all 13 skills, their schemas, and metadata.
Health
GET /healthExecute Skill
POST /tasks
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "list-issues",
"params": {
"project": "web-app",
"status": "open",
"limit": 10
}
}Task Status
GET /tasks/:idCancel Task
POST /tasks/:id/cancelStream (SSE)
GET /tasks/:id/streamPro Features
Unlock 6 advanced skills by setting PRO_LICENSE:
export PRO_LICENSE=cpk_your_license_keyGet your license at craftpipe.dev.
Sprint Management
{
"method": "sprint-management",
"params": { "action": "list", "project": "web-app" }
}Issue Analytics
{
"method": "issue-analytics",
"params": { "project": "web-app" }
}Returns velocity per sprint, cycle time (average, median, P90), burndown chart data, and weekly throughput.
Backlog Grooming
{
"method": "backlog-grooming",
"params": { "project": "web-app", "stale_days": 30 }
}Identifies stale issues, unassigned items, and suggests priority adjustments based on age, comment activity, and labels.
Types
type IssueStatus = 'backlog' | 'open' | 'in_progress' | 'done' | 'closed' | 'canceled';
type IssuePriority = 'none' | 'low' | 'medium' | 'high' | 'urgent';
interface Issue {
id: string;
title: string;
description: string;
status: IssueStatus;
priority: IssuePriority;
assignee: string | null;
labels: string[];
project: string;
sprint: string | null;
created_at: string;
updated_at: string;
comments: Comment[];
url: string;
provider: string;
}Development
npm install
npm run build # Compile TypeScript
npm test # Run 245 tests
npm run typecheck # Type-check without emittingLicense
MIT -- see LICENSE.
