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.

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.

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.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 →
v0.7.0 Jul 14, 2026
Added
  • resolve refs live at release time, wire into release CI d057829
  • render changelog from CHANGELOG.md, not the GitHub API e2c18f8
Fixed
  • never let a failed build degrade committed content 9035465
  • stop reading bare #N in commit prose as issue evidence aeee62a
View complete release details on GitHub →