npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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

Readme

npm version license A2A protocol tests TypeScript node

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:#3b82f6

Quick 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-a2a

Docker

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.js

Skills

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.json

Returns the A2A agent card with all 13 skills, their schemas, and metadata.

Health

GET /health

Execute 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/:id

Cancel Task

POST /tasks/:id/cancel

Stream (SSE)

GET /tasks/:id/stream

Pro Features

Unlock 6 advanced skills by setting PRO_LICENSE:

export PRO_LICENSE=cpk_your_license_key

Get 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 emitting

License

MIT -- see LICENSE.