{"id":49947328,"url":"https://github.com/aks-builds/openspecpm","last_synced_at":"2026-05-23T22:02:04.612Z","repository":{"id":358391932,"uuid":"1241232487","full_name":"aks-builds/openspecpm","owner":"aks-builds","description":"Spec-driven, BDD-shaped project management for AI agents. OpenSpec proposals → BDD specs → tracked work in GitHub / Azure    DevOps / Jira / Linear / GitLab.","archived":false,"fork":false,"pushed_at":"2026-05-18T09:04:00.000Z","size":994,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-19T20:13:52.645Z","etag":null,"topics":["agent-skills","azure-devops","bdd-framework","claude-code","github-issues","gitlab","jira","linear","nodejs","openspec","project-management","spec-driven-development"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/openspecpm","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aks-builds.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-17T05:51:19.000Z","updated_at":"2026-05-18T08:37:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/aks-builds/openspecpm","commit_stats":null,"previous_names":["aks-builds/openspecpm"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/aks-builds/openspecpm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aks-builds%2Fopenspecpm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aks-builds%2Fopenspecpm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aks-builds%2Fopenspecpm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aks-builds%2Fopenspecpm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aks-builds","download_url":"https://codeload.github.com/aks-builds/openspecpm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aks-builds%2Fopenspecpm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33271430,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T15:12:43.734Z","status":"ssl_error","status_checked_at":"2026-05-20T15:12:42.300Z","response_time":356,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-skills","azure-devops","bdd-framework","claude-code","github-issues","gitlab","jira","linear","nodejs","openspec","project-management","spec-driven-development"],"created_at":"2026-05-17T16:05:22.261Z","updated_at":"2026-05-23T22:02:04.599Z","avatar_url":"https://github.com/aks-builds.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenSpecPM — Spec-driven PM for any backend\n\n[![test](https://github.com/aks-builds/openspecpm/actions/workflows/test.yml/badge.svg?event=push)](https://github.com/aks-builds/openspecpm/actions/workflows/test.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![tests](https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2Faks-builds%2F03ce34dc5c6486c004dd8cf4c27ea87c%2Fraw%2Ftests.json)](cli/tests)\n\n\u003e Spec-driven, BDD-shaped project management for AI agents — author once in [OpenSpec](https://github.com/Fission-AI/OpenSpec), sync to GitHub Issues, Azure DevOps Boards, Jira, Linear, or GitLab.\n\nOpenSpecPM turns natural-language intent (\"plan X\", \"sync the X epic\", \"what's blocked\", \"ship X\") into a disciplined flow:\n\n```mermaid\nflowchart LR\n    Idea[\"💡 **Idea**\"]\n    Proposal[\"📝 **proposal.md**\u003cbr/\u003e(OpenSpec)\"]\n    BDD[\"📋 **BDD specs**\u003cbr/\u003eGiven / When / Then\"]\n    Tasks[\"✅ **tasks**\"]\n    Tracked[\"🎯 **Tracked work items**\u003cbr/\u003eGitHub · ADO · Jira · Linear · GitLab\"]\n    Shipped[\"🚀 **Shipped code**\"]\n\n    Idea --\u003e Proposal --\u003e BDD --\u003e Tasks --\u003e Tracked --\u003e Shipped\n\n    classDef ideaC fill:#FFF9C4,stroke:#F9A825,color:#000\n    classDef artifactC fill:#D5E8D4,stroke:#82B366,color:#000\n    classDef extC fill:#DAE8FC,stroke:#6C8EBF,color:#000\n    classDef doneC fill:#C8E6C9,stroke:#2E7D32,color:#000\n\n    class Idea ideaC\n    class Proposal,BDD,Tasks artifactC\n    class Tracked extC\n    class Shipped doneC\n```\n\nIt is a sibling of [CCPM](https://github.com/automazeio/ccpm), with five differences:\n\n1. **OpenSpec drives spec authoring + BDD scenarios become enforceable.** Every feature gets `proposal.md`, `design.md`, `tasks.md`, and a `specs/` folder of Given/When/Then scenarios. A heuristic linter blocks vague Thens at `sync` time. An optional [LLM judge](#architecture-highlights) (Claude Haiku 4.5, opt-in via `--llm`) catches cross-spec contradictions and missing-coverage gaps the regex linter can't see.\n2. **Five pluggable PM backends** — an interactive wizard at `init` time picks GitHub Issues/Projects, Azure DevOps Boards, Jira, Linear, or GitLab. New backends register without forking via `registerAdapter()`.\n3. **Built for non-engineers too** — PMs/BAs/PgMs can drive the flow. A `doctor` command owns auth-setup pain (with `--install` and `--setup-auth` flags for OS-specific install hints and PAT-creation URLs). Worktrees are hidden by default.\n4. **Audit-logged by default.** Every command appends a JSONL entry (secrets scrubbed) to `.openspecpm/audit.log`. Useful for regulated industries that need a paper trail; useful for the rest of us when something looks weird.\n5. **Cross-feature task graphs.** `depends_on:` can reach across changes (`\u003cfeature\u003e/\u003ctask-title\u003e` or `\u003cfeature\u003e/\u003cexternal-id\u003e`), so `next` and `blocked` reflect the whole project rather than one feature in isolation.\n\n## Architecture\n\n```mermaid\nflowchart TD\n    PM([👤 Project Manager / BA])\n    Dev([👤 Developer])\n    Agent([🤖 AI Agent · Claude Code])\n\n    Skill[\"**Agent Skill**\u003cbr/\u003eskill/openspecpm/SKILL.md\u003cbr/\u003e\u003cbr/\u003eRoutes natural-language intent\"]\n    CLI[\"**Node CLI**\u003cbr/\u003ecli/bin/openspecpm.js\u003cbr/\u003e\u003cbr/\u003eCommander dispatch + audit\"]\n\n    subgraph CMDS[\"📋 Commands · cli/src/commands/\"]\n        direction LR\n        Setup[\"**① Setup**\u003cbr/\u003einit • doctor\"]\n        Plan[\"**② Plan**\u003cbr/\u003epropose • decompose\"]\n        SyncCmd[\"**③ Sync**\u003cbr/\u003esync • comment • reconcile\u003cbr/\u003eassign • bug-report\"]\n        Track[\"**④ Track**\u003cbr/\u003estatus • standup • next\u003cbr/\u003eblocked • validate • search • watch\"]\n        Exec[\"**⑤ Execute / Ship**\u003cbr/\u003efan-out • ship • help-table\"]\n    end\n\n    subgraph CORE[\"⚙️ Core services · cli/src/\"]\n        direction LR\n        Bridge[\"**OpenSpec Bridge + BDD**\u003cbr/\u003eopenspec-bridge.js\u003cbr/\u003ebdd/linter.js\"]\n        TrackingS[\"**Tracking + Audit**\u003cbr/\u003etracking.js\u003cbr/\u003eaudit.js\"]\n        HTTP[\"**HTTP + Rate-limit**\u003cbr/\u003ehttp.js\u003cbr/\u003eratelimit.js\"]\n        IO[\"**Config + Notify + Telemetry**\u003cbr/\u003econfig.js • notify.js\u003cbr/\u003etelemetry.js\"]\n    end\n\n    subgraph ADAPTERS[\"🔌 Adapter contract · cli/src/adapters/ · 9 methods + capabilities()\"]\n        direction LR\n        GHA[\"**GitHub**\u003cbr/\u003edepth 2\"]\n        AzA[\"**Azure DevOps**\u003cbr/\u003edepth 4\"]\n        JiA[\"**Jira**\u003cbr/\u003edepth 3\"]\n        LiA[\"**Linear**\u003cbr/\u003edepth 2\"]\n        GlA[\"**GitLab**\u003cbr/\u003edepth 2\"]\n    end\n\n    subgraph EXT[\"☁️ External PM systems\"]\n        direction LR\n        GHE[(\"GitHub\u003cbr/\u003eIssues / Projects\")]\n        AzE[(\"Azure DevOps\u003cbr/\u003eBoards\")]\n        JiE[(\"Jira\u003cbr/\u003eCloud / Server\")]\n        LiE[(\"Linear\")]\n        GlE[(\"GitLab\u003cbr/\u003eIssues\")]\n    end\n\n    subgraph PERSIST[\"💾 Persistence \u0026 sinks\"]\n        direction LR\n        FS1[\"📁 **openspec/**\u003cbr/\u003echanges/\u0026lt;feature\u0026gt;/\u003cbr/\u003e• proposal.md\u003cbr/\u003e• specs/*.md (BDD)\u003cbr/\u003e• tasks.md\u003cbr/\u003e• updates/progress.md\"]\n        FS2[\"📁 **.openspecpm/**\u003cbr/\u003e• config.json\u003cbr/\u003e• audit.log (JSONL)\u003cbr/\u003e• state.json\"]\n        Sinks[\"🔔 **Webhooks**\u003cbr/\u003e• Slack\u003cbr/\u003e• Teams\u003cbr/\u003e• Generic JSON\"]\n    end\n\n    PM --\u003e Skill\n    Dev --\u003e CLI\n    Agent --\u003e Skill\n    Skill -- invokes --\u003e CLI\n    CLI --\u003e CMDS\n    CMDS --\u003e CORE\n    CORE --\u003e ADAPTERS\n\n    GHA --\u003e GHE\n    AzA --\u003e AzE\n    JiA --\u003e JiE\n    LiA --\u003e LiE\n    GlA --\u003e GlE\n\n    Bridge -. writes .-\u003e FS1\n    TrackingS -. writes .-\u003e FS1\n    IO -. writes .-\u003e FS2\n    IO -. broadcast .-\u003e Sinks\n\n    classDef user fill:#DAE8FC,stroke:#6C8EBF,color:#000\n    classDef agent fill:#FFE0B2,stroke:#D97757,color:#000\n    classDef entry fill:#C5E1A5,stroke:#558B2F,color:#000\n    classDef skill fill:#FFE0B2,stroke:#D97757,color:#000\n    classDef github fill:#222,stroke:#000,color:#fff\n    classDef azure fill:#0078D7,stroke:#005A9E,color:#fff\n    classDef jira fill:#0052CC,stroke:#003580,color:#fff\n    classDef linear fill:#5E6AD2,stroke:#3F47A0,color:#fff\n    classDef gitlab fill:#FC6D26,stroke:#C44A19,color:#fff\n    classDef ext fill:#fff,stroke:#333,stroke-width:3px,color:#000\n    classDef fs fill:#fff,stroke:#444,stroke-width:2px,color:#000\n\n    class PM,Dev user\n    class Agent agent\n    class CLI entry\n    class Skill skill\n    class GHA github\n    class AzA azure\n    class JiA jira\n    class LiA linear\n    class GlA gitlab\n    class GHE,AzE,JiE,LiE,GlE ext\n    class FS1,FS2,Sinks fs\n```\n\n## Lifecycle\n\n```mermaid\nflowchart LR\n    Idea[\"💡 **Idea**\u003cbr/\u003estakeholder feature,\u003cbr/\u003ebug, or refactor\"]\n\n    subgraph P1[\"① PLAN\"]\n        direction TB\n        Propose[\"**openspecpm propose**\u003cbr/\u003eShells out to OpenSpec\u003cbr/\u003eSoft BDD lint\"]\n        Decompose[\"**openspecpm decompose**\u003cbr/\u003eExtract tasks from\u003cbr/\u003eproposal + BDD\"]\n        Propose --\u003e Decompose\n    end\n\n    subgraph P2[\"② REVIEW + SYNC\"]\n        direction TB\n        Review[\"👀 **Human review**\u003cbr/\u003eSign off on BDD\"]\n        Validate[\"**openspecpm validate**\u003cbr/\u003eSchema + BDD sweep\"]\n        SyncCmd[\"**openspecpm sync**\u003cbr/\u003eHard BDD lint\u003cbr/\u003eIdempotent\"]\n        Review --\u003e Validate --\u003e SyncCmd\n    end\n\n    subgraph P3[\"③ EXECUTE\"]\n        direction TB\n        Next[\"**openspecpm next**\"]\n        FanOut[\"**openspecpm fan-out**\u003cbr/\u003eParallel agent prompts\"]\n        Build[\"🤖 **Implement**\u003cbr/\u003eBDD = acceptance criteria\"]\n        Comment[\"**openspecpm comment**\u003cbr/\u003eBroadcast progress\"]\n        Reconcile[\"**openspecpm reconcile**\u003cbr/\u003ePull remote state\"]\n        Next --\u003e FanOut --\u003e Build --\u003e Comment --\u003e Reconcile\n    end\n\n    subgraph P4[\"④ TRACK\"]\n        direction TB\n        Status[\"**Track commands**\u003cbr/\u003estatus • standup\u003cbr/\u003eblocked • search\u003cbr/\u003ewatch • bug-report\"]\n    end\n\n    subgraph P5[\"⑤ SHIP\"]\n        direction TB\n        Ship[\"**openspecpm ship**\u003cbr/\u003eClose tasks + epic\u003cbr/\u003eArchive change\"]\n        Shipped[\"🚀 **Shipped**\"]\n        Ship --\u003e Shipped\n    end\n\n    Idea --\u003e P1\n    P1 --\u003e P2\n    P2 --\u003e P3\n    P3 --\u003e P4\n    P4 --\u003e P5\n    Shipped -. next feature .-\u003e Idea\n\n    classDef ideaC fill:#FFF9C4,stroke:#F9A825,color:#000\n    classDef cmdC fill:#D5E8D4,stroke:#82B366,color:#000\n    classDef humanC fill:#FFF9C4,stroke:#F9A825,color:#000\n    classDef agentC fill:#FFE0B2,stroke:#D97757,color:#000\n    classDef shipC fill:#FFCDD2,stroke:#D32F2F,color:#000\n    classDef doneC fill:#C8E6C9,stroke:#2E7D32,color:#000\n\n    class Idea ideaC\n    class Propose,Decompose,Validate,SyncCmd,Next,FanOut,Comment,Reconcile,Status cmdC\n    class Review humanC\n    class Build agentC\n    class Ship shipC\n    class Shipped doneC\n```\n\n\u003e Cross-cutting on every command: audit log (`.openspecpm/audit.log`, secrets scrubbed) · token-bucket rate-limiting per adapter · OpenSpec version probe · optional opt-in telemetry · optional Slack / Teams / generic-webhook broadcasts on `standup --broadcast`.\n\n## Install\n\n```bash\n# Standalone CLI (any harness)\nnpx openspecpm@latest init\n\n# Claude Code Agent Skill\n# Copy skill/openspecpm/ into your Claude Code skills directory.\n# SKILL.md handles routing — just talk to Claude.\n```\n\nOpenSpecPM shells out to [OpenSpec](https://github.com/Fission-AI/OpenSpec); install it first:\n\n```bash\nnpm install -g @fission-ai/openspec\n```\n\n## In action\n\n\u003e A walkthrough of OpenSpecPM running against two sample features (`dark-mode`, `auth-rate-limit`). Source images live in [`docs/screenshots/`](docs/screenshots/); regenerate with `pwsh docs/screenshots/render.ps1` after CLI output changes — the renderer sets up its own sample data and cleans up after itself.\n\n**1 · Phase-grouped command reference** — `help-table` shows every command grouped by workflow phase (Setup → Plan → Sync → Track → Execute/Ship):\n\n![openspecpm help-table](docs/screenshots/help-table.png)\n\n**2 · Health check across every adapter** — `doctor` diagnoses auth + tooling for all five backends (GitHub, Azure DevOps, Jira, Linear, GitLab) with an English remediation hint on every failure. The `[judge]` section reports `ANTHROPIC_API_KEY` for the optional LLM BDD judge:\n\n![openspecpm doctor](docs/screenshots/doctor.png)\n\n**3 · Author a proposal** — `propose --offline` scaffolds `proposal.md`, `tasks.md`, and `specs/main.md` from templates without calling the OpenSpec CLI. Soft BDD lint runs immediately so placeholder Then-clauses are flagged before you keep editing:\n\n![openspecpm propose](docs/screenshots/propose.png)\n\n**4 · Optional LLM BDD judge** — pass `--llm` (or set `judge.enabled: true` in `.openspecpm/config.json`) to augment the heuristic linter with Claude Haiku 4.5. The judge catches what regex can't: cross-spec contradictions (`bdd/llm-contradiction`), success criteria with no scenario (`bdd/llm-missing-coverage`), and Then-clauses that pass the verb check but state no observable outcome (`bdd/llm-vague-then`). Findings merge into the same lint stream and respect `--force` the same way. Prompt-cached on the proposal so re-runs across multiple specs stay cheap. *Sample output below — real findings vary per scenario set; the judge can't be regenerated by `render.ps1` because it requires a live `ANTHROPIC_API_KEY`:*\n\n![openspecpm propose --llm](docs/screenshots/judge.png)\n\n**5 · Decompose into tasks** — `decompose` walks proposal headings, GitHub-style checklists, a `Tasks` section, and BDD scenarios under `specs/` and writes a structured `tasks.md` with `sync_state` frontmatter:\n\n![openspecpm decompose](docs/screenshots/decompose.png)\n\n**6 · Multi-feature status** — `status` shows the configured adapter and per-change task counts (`synced / pending / failed / done`) at a glance:\n\n![openspecpm status](docs/screenshots/status.png)\n\n**7 · \"What can I work on right now?\"** — `next` lists tasks with no unmet dependencies, marking parallel-safe ones so multiple agents can pick them up:\n\n![openspecpm next](docs/screenshots/next.png)\n\n**8 · \"What's waiting on what?\"** — `blocked` lists every task held up by a dependency and names the blocker, so the path to unblocking is one read away:\n\n![openspecpm blocked](docs/screenshots/blocked.png)\n\n**9 · Parallel-agent dispatch** — `fan-out` emits ready-to-paste prompts for `parallel: true` tasks with no unmet deps. Each prompt embeds the proposal summary, design notes, and BDD spec as acceptance criteria so subagents can work in isolation:\n\n![openspecpm fan-out](docs/screenshots/fan-out.png)\n\n**10 · Cross-file search** — `search` is a case-insensitive grep across every proposal, spec, tasks file, and progress note. Useful for tracing back from a keyword to the change that owns it:\n\n![openspecpm search](docs/screenshots/search.png)\n\n**11 · Project-wide validation** — `validate` runs the schema check and BDD linter across every change and reports per-feature error + warning counts:\n\n![openspecpm validate](docs/screenshots/validate.png)\n\n## Quick start\n\n```bash\n# 1. One-time setup. The wizard asks which PM tool your team uses.\nnpx openspecpm init\n\n# 2. Verify auth before doing anything remote.\nnpx openspecpm doctor\n\n# 3. Author a proposal. OpenSpec generates proposal.md, design.md, tasks.md,\n#    and BDD scenarios in specs/. Soft BDD-lint runs after authoring.\nnpx openspecpm propose dark-mode --prompt \"Per-user dark theme with persistence.\"\n\n# 4. Review the generated files. Refine BDD scenarios until lint is clean.\n\n# 5. Sync to the PM tool. Hard BDD lint runs first; pass --force to override.\nnpx openspecpm sync dark-mode\n\n# 6. Pick up where you left off.\nnpx openspecpm next        # tasks ready to start\nnpx openspecpm blocked     # tasks waiting on dependencies\nnpx openspecpm standup     # progress updates in the last 24h\n\n# 7. When the feature is verified, close + archive.\nnpx openspecpm ship dark-mode\n```\n\n## Command reference\n\n| Command | What it does |\n|---|---|\n| `init` | Interactive wizard. Picks the PM tool. Writes `.openspecpm/config.json`. |\n| `doctor [adapter]` | Auth/tooling health check. English remediation hints on every failure. |\n| `propose \u003cfeature\u003e [--llm]` | Shell out to OpenSpec; create `openspec/changes/\u003cfeature\u003e/`. Soft-lint BDD scenarios; `--llm` adds the LLM judge. |\n| `decompose \u003cfeature\u003e` | Extract tasks from proposal headings/checklists + BDD scenarios into `tasks.md`. |\n| `sync \u003cfeature\u003e [--llm]` | Hard-lint BDD, then create/update work items in the PM tool. Idempotent; `--llm` adds the LLM judge as a hard gate. |\n| `comment \u003cfeature\u003e \u003ctask\u003e` | Broadcast local `progress.md` (or `-m`) to the PM tool with `\u003c!-- SYNCED --\u003e` marker. |\n| `reconcile \u003cfeature\u003e` | Pull remote work-item state into local frontmatter. Detects out-of-band closes. |\n| `bug-report \u003cfeature\u003e \u003ctask\u003e --title \"…\"` | File a linked regression against a shipped task. |\n| `status` | Per-change task counts: pending / created / failed / done. |\n| `standup [--since 24h]` | Recent `progress.md` updates, newest first. |\n| `next [-l 5]` | Tasks with no unmet dependencies. |\n| `blocked` | Tasks waiting on unmet dependencies (with reasons). |\n| `validate [--llm]` | Schema + dependency + BDD-lint sweep across every change; `--llm` adds the LLM judge per change. |\n| `search \u003cquery\u003e` | Grep across proposals, specs, tasks, progress notes. |\n| `fan-out \u003cfeature\u003e` | Emit ready-to-paste agent prompts for `parallel: true` tasks. |\n| `ship \u003cfeature\u003e [-y]` | Close all task work items + close the epic + archive the OpenSpec change. |\n| `help-table [topic]` | Context-aware command reference grouped by workflow phase. |\n\nEvery command appends a JSONL entry (secrets scrubbed) to `.openspecpm/audit.log`.\n\n## Workflow phases\n\nOpenSpecPM is organized into five phases, each with a reference doc under [`skill/openspecpm/references/`](skill/openspecpm/references/):\n\n1. **Plan** ([`plan.md`](skill/openspecpm/references/plan.md)) — Capture requirements through an OpenSpec proposal + BDD scenarios.\n2. **Structure** ([`structure.md`](skill/openspecpm/references/structure.md)) — Decompose into tasks with explicit dependencies and parallelism hints.\n3. **Sync** ([`sync.md`](skill/openspecpm/references/sync.md)) — Push to the PM tool. Capabilities-driven hierarchy collapse for flatter backends.\n4. **Execute** ([`execute.md`](skill/openspecpm/references/execute.md)) — Start work on a tracked item. Optional worktrees, parallel-agent dispatch.\n5. **Track** ([`track.md`](skill/openspecpm/references/track.md)) — Status, standup, next, blocked, ship.\n\n## Architecture highlights\n\n- **Adapter contract.** Every backend implements the same 9-method interface plus `capabilities()` reporting hierarchy depth (GitHub=2, Linear=2, GitLab=2, Jira=3, ADO=4). The sync layer collapses levels gracefully.\n- **OpenSpec anti-corruption layer.** Version-pinned probe on every CLI invocation. One constant absorbs upstream path moves.\n- **Idempotent sync.** Each task carries `sync_state` + `external_id` in frontmatter. Re-running `sync` skips created items and retries failures. Comments use `\u003c!-- SYNCED: \u003cts\u003e --\u003e` markers to prevent duplication.\n- **Token-bucket rate-limiting.** Per-adapter presets tuned for each backend's published limits.\n- **BDD linter.** Heuristic checks: one Given/When/Then per scenario, observable verbs in Then, deny-list for vague phrases (\"should work\"), tautology detection via word-bigram similarity.\n- **Optional LLM judge.** `--llm` (or `judge.enabled: true` in `.openspecpm/config.json`) augments the heuristic linter with Claude Haiku 4.5 to catch cross-spec contradictions, missing success-criteria coverage, and vague Then predicates the regex linter misses. Uses prompt caching on the proposal so re-runs across multiple specs stay cheap. Requires `ANTHROPIC_API_KEY` — `openspecpm doctor` reports its presence.\n\n## Roadmap\n\nActive v2 work is tracked as OpenSpec changes under [`openspec/changes/`](openspec/changes/README.md). The first scaffolded feature — **`bdd-llm-reviewer`** — shipped in v1.0.0. Five remain: dependency-graph visualization, spec → test scaffolding, compliance traceability export, three new adapters (Notion / ClickUp / Asana), and a real agent orchestrator that graduates `fan-out` from prompt-emitter to dispatcher.\n\nOpenSpecPM dogfoods itself: anyone can `openspecpm next` to see what's ready to start, or `openspecpm sync \u003cchange\u003e` to push any of the five into a tracked PM tool.\n\n## Project structure\n\n```\nopenspecpm/\n├── README.md              this file\n├── LICENSE                MIT\n├── CHANGELOG.md\n├── CONTRIBUTING.md\n├── SECURITY.md\n├── package.json\n├── .github/\n│   ├── workflows/         test.yml · auto-approve.yml · release.yml · publish.yml\n│   ├── ISSUE_TEMPLATE/\n│   └── PULL_REQUEST_TEMPLATE.md\n├── docs/screenshots/      README captures + render.ps1 renderer\n├── openspec/changes/      v2 roadmap (each subdir is a tracked change)\n├── skill/openspecpm/      Claude Code Agent Skill\n│   ├── SKILL.md\n│   └── references/        conventions · plan · structure · sync · execute · track\n└── cli/\n    ├── bin/openspecpm.js  Commander entrypoint\n    ├── src/\n    │   ├── commands/      init · doctor · propose · decompose · sync · comment · reconcile ·\n    │   │                  status · standup · next · blocked · validate · search · fan-out ·\n    │   │                  bug-report · ship · assign · watch · help · bulk\n    │   ├── adapters/      base · github · azure · jira · linear · gitlab · index\n    │   ├── bdd/           linter · judge · templates\n    │   ├── audit.js       JSONL audit log + secret scrubber\n    │   ├── http.js        REST helper for ADO / Jira / Linear / GitLab\n    │   ├── tracking.js    listChanges · findNext · findBlocked · findRecent\n    │   ├── notify.js      Slack / Teams / generic-webhook envelopes\n    │   ├── telemetry.js   opt-in, audit-log-only at alpha\n    │   ├── install-hints.js\n    │   ├── openspec-bridge.js\n    │   ├── config.js\n    │   ├── frontmatter.js\n    │   └── ratelimit.js\n    └── tests/             unit + contract tests (count badge is auto-updated by CI)\n```\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faks-builds%2Fopenspecpm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faks-builds%2Fopenspecpm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faks-builds%2Fopenspecpm/lists"}