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.

Capture ideas

specsync idea "Thought" files a vague or elaborate idea as a GitHub issue in your ideas inbox; specsync ideas lists open intake. Graduate with specsync pull -issue <n>.

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.

Cross-repo epic scaffolding

specsync epic "Feature X" --repo org/planning --child org/backend#12 --child frontend-slug mints a coordination issue and wires every child — local change or existing issue, any repo — to it, idempotently.

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, checks that the openspec CLI dependency is installed and reachable, and recommends fixes.

Any MCP-connected tracker

-provider mcp projects changes through any external MCP server instead of gh — Linear, Jira, GitHub, or in-house. Speaks the current MCP spec with automatic fallback to legacy handshake-based servers.

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.12.0 Aug 19, 2026
Added
  • specsync doctor now checks that the openspec binary is installed and reachable, reporting its path/version or a fix recommendation when missing; doctor install --json now also emits structured JSON. #132
  • Idea intake command #101
  • specsync epic <title> --repo owner/name --child ... mints a type:epic coordination issue and wires cross-repo children to it — local change slugs or existing issue references — idempotently. #100
View complete release details on GitHub →
v0.11.2 Aug 13, 2026
Added
  • Idea intake command #101
View complete release details on GitHub →
v0.11.1 Aug 10, 2026
Fixed
  • archive closeAndLabel pushed a blank-title WorkItem and never attached the label 1462356
  • retry Find before create to close a duplicate-issue race 7cd024d
View complete release details on GitHub →