OpenSpec × GitHub Issues

The issue is the spec.

Plan in OpenSpec, sync to issues and boards, and ship from one source of truth. Start spec-first or pull an existing board issue and plan implementation tasks locally.

npm npm install -g @androidand/specsync
go go install github.com/androidand/specsync/cmd/specsync@latest

Dogfooded here: every shipped change traces from OpenSpec plan to issue to release notes.

How it works

Two flows. One source of truth.

specsync supports both entry points: spec-first and issue-first (from your issue tracker). Start from either side, keep OpenSpec as the source of truth, and synchronize issue tracker issues/boards as work evolves.

Spec-first

Plan locally, project outward

Start in openspec/changes/, define proposal and tasks, then sync to the tracker when the plan is ready.

Issue-first

Pull inward, then evolve in spec

Start from an existing issue tracker issue via specsync pull, refine locally, and keep issue plus board state aligned.

Everything a spec workflow needs. Nothing heavyweight.

specsync is a small CLI binary: no daemon, no SDK lock-in, and no mandatory central config file. In GitHub mode it uses gh, with flags and env vars controlling behavior.

Plan

Spec-first or issue-first

Start from local proposal.md/tasks.md or pull an existing issue tracker issue with specsync pull.

Planning scan

specsync scan shows what already exists for an area — in-flight changes, loose issues, recent commits — before you plan.

Spin off emergent work

specsync spinoff spawns a new linked change from a discovery, keeping the parent scoped and marking the source task as moved.

Collaborate

Idempotent

Run specsync -change my-change as often as needed. If the issue tracker issue already exists, specsync updates it (same identity marker) instead of creating a duplicate.

Workflow state management

Set stage explicitly with specsync set-stage my-change [active|blocked|in-review|complete] so progress is visible and committed in metadata.

Priority-driven dispatch

Set priorities (1-100) with specsync set-priority my-change 85. Agents respect priority when deciding what to work on next — humans direct focus.

Projects board sync

Project and sync with specsync -change my-change -project my-org/6. Add -status-map "active=In Progress,complete=Done" to align board columns with change stages.

Explicit repo resolution

specsync resolves the target repository deterministically: -repo flag → gh repo set-defaultorigin. Fork-parent writes are refused by default; use -repo to override.

Per-repository board

Board resolution per-repository: -project flag → openspec/specsync.yml → no board. No global default; each repo syncs only to its own declared board.

Spec ↔ issue linker

specsync resolves a change's issue from branch name (feat/42-my-change), issue marker, or ref cache — so pull without -issue and idempotent sync update the right issue instead of creating duplicates.

CLI self-documentation

specsync agent-help provides command guidance without manuals. Use --json for machine-readable schema suitable for agents and automation.

Agent skill diagnostics

specsync doctor detects and diagnoses AI agent skill installations (Claude Code, OpenCode, Copilot, etc.), analyzes token usage, and recommends optimizations.

Ship

Release follow-up

specsync release-plan highlights shipped changes, loose/unlinked work, archive candidates, and advisory release impact from spec-level deltas.

Spec-driven changelog

specsync changelog writes a Keep a Changelog section from your shipped changes — one entry per change, release notes authored at planning time, never a raw commit dump.

Archive audit

specsync audit cross-references archived changes against GitHub PRs to find archived-but-unmerged work. Add -mark-shipped to record the final lifecycle step.

In practice

Two commands, both directions.

Project a local plan outward, or pull an existing issue inward — either way you end up in the same loop.


Repository Evidence

specsync is dogfooded on specsync itself.

Not a staged demo — follow one real change, the v0.8.0 board projection, through every form it takes:

1 · Planning artifact openspec/changes/github-projects-compatibility/ Proposal and task checklist, written before any code. Pinned at the v0.8.0 tag so the link never rots. 2 · Tracker projection specsync#37 The issue specsync generated from that change — same body, live task checklist, closed when the work shipped. 3 · Shipped output v0.8.0 release notes The changelog entry derived from the same change, linking back to #37. The loop closes itself.


Changelog

Recent releases

v0.10.0 Aug 10, 2026
Added
  • Added specsync doctor command for diagnosing and optimizing Claude Code token usage. Run specsync doctor to see installation status, detect duplicate skills, and get personalized recommendations. Use specsync doctor --json for automation and scripting. #114
  • Advisory title suggestions: warn on unwieldy titles, never rewrite them #52
  • Beads auto-detection requires a Beads database #103
  • Board state reconciliation: three-way merge for shared workflow #42
  • Add specsync validate CI gate #64
  • directed dependency links (BlockedBy/Blocks) with GitHub dependency projection 2847f7b
  • add idea-intake-command spec; ignore .status files 2d46a1b
  • PR-issue traceability with pr-body and verify subcommands (#??) 2e676aa
  • correct archived import path record and add guard test 47b9dcf
  • add audit-archived-not-merged change 5ba4913
  • add set-stage/set-priority tests and atomic write verification (#58) 6664afd
  • add sorting, TASKS/TITLE columns, stage grouping to specsync changes 7122503
  • pluggable SpecSource interface with FileSpecSource and BeadsSource 844f7fe
  • reduce SKILL.md token cost to 60% (#12) a421309
  • add specsync audit command and shipped stage (#58) d815df3
  • pluggable SpecSource interface with FileSpecSource and BeadsSource ecaf195
  • surface external-close deferral in run output f311c35
Changed
  • Consolidated agent documentation to reduce duplication. AGENTS.md is now the authoritative agent guide; CLAUDE.md and .claude/CLAUDE.md are lightweight entry points that reference it. No content lost; improved organization and maintainability. #117
  • Epic & sub-issue projection #2
  • Linker resolves issue refs with source visibility (branch, cache) and slug-aware branch matching to prevent cross-change resolution. #96
Fixed
  • correct archived record, document import path, add guard test (correct-library-import-path) 000ece4
  • record the task merge base, don't drop it 0251e23
  • sync .claude SKILL.md with canonical 037202f
  • require a .beads/ database to auto-select the Beads provider 09f1d6e
  • require a project Beads database for auto-detection (#102) 0c9a635
  • restore AuditTasks to audit.go; fix parseLinksMD 3-return-value call 4c4dd69
  • audit command syntax error, branch matching, archived immutability 5330792
  • make links.md append-only, never rewritten 575f7df
  • build errors in traceability.go and make loadRefs/TasksComplete public 5a13414
  • remove merge conflict markers from changes_test.go 8ad300d
  • only reverse a close specsync made itself c596927
  • two defects found reviewing the preceding three commits c9e9275
  • remove relate case from main.go (belongs to work-graph change) d07979d
  • require a .beads/ database to auto-select the Beads provider e5a0c9c
  • repair CI workflow YAML indentation bug f267b72
View complete release details on GitHub →
v0.9.1 Jul 27, 2026
Added
  • Repo resolution is now explicit. specsync resolves the target repository deterministically and always passes --repo to every gh invocation. Resolution order: -repo flag → gh repo set-defaultorigin. Fork-parent writes are refused by default; use -repo to override. Board resolution also gained a repository-local declaration: openspec/specsync.yml with board: owner/number. The -project flag and this config file are the only ways to set a board; the SPECSYNC_PROJECT env var is no longer used. #76
  • Multi-provider sync (fan-out) #24
  • Auto-detect Beads provider #62
  • Link existing issues by reference, without scaffolding specs #18
  • fix task dogfooding — audit-tasks command and reconcile all changes (#61) 03f0985
  • convergence check for 3-way board merge (#42) (#74) 04ea25a
  • linker cleanup — LinkerResult, slug-matching, dead code removal (#97) 079b913
  • spinoff subcommand — spawn linked child changes from discoveries (#9) 0c2bd80
  • add --worktree flag to pull — create or reuse worktree (#51) (#72) 18c0951
  • add specsync validate command for change structure (#64) (#67) 22cfa58
  • spec-issue-linker — pull integration, Linker context resolution, skill doc (#95) 47cedb8
  • spec-issue-linker — Linker interface, resolvers, sync integration 8b75204
  • stable task ID — position-based mapping for rewritten task detection (#65) (#73) b542d92
  • slug validation, archived priority, slug tests (#43) b6f7136
  • slug validation, archived priority support (#43) (#75) f0d8d40
Changed
  • Claim work in flight so concurrent agents don't collide #78
  • Work graph #19
Fixed
  • Add specsync audit — a read-only command that cross-references archived OpenSpec changes against GitHub PRs to find archived changes whose PR was never merged. Also add a new shipped stage that represents the final step in the lifecycle: the PR has landed. #59
  • apply changelog 0.9.1, bump npm to 0.9.1, archive linker-cleanup (#98) ee000c8
View complete release details on GitHub →
v0.8.0 Jul 16, 2026
Added
  • add three-phase workflow state management for SpecSync 0ba30bd
  • phase 1 - implement SpecSource interface and OpenSpec implementation 1065b59
  • add SpecSourceFactory and --spec CLI flag 1094ca1
  • implement rich-change-state foundation 1ae74b8
  • add change-status commands (partial) 36c7dde
  • implement three-way merge reconciliation with human-move detection 4b7bc5a
  • add three-way merge infrastructure for board-state-reconciliation 8386fe9
  • add explicit archive-completed execution 8389873
  • rework changelog, hero, IA, and a11y per review feedback d0de2e5
  • complete change-status-cli with atomic writes and JSON output fe6e6a3
Changed
  • Breaking: repair set-stage/set-priority semantics; drop dead code and artifact docs 3cd81b7
Fixed
  • show unlinked-but-shipped commits too, not just spec-backed ones 07602bd
View complete release details on GitHub →