Skip to content

feat(specs): add spec kit as a selectable spec tool - #138

Open
ixjosemi wants to merge 7 commits into
Inakitajes:mainfrom
ixjosemi:feat/add-speckit-backend
Open

ixjosemi wants to merge 7 commits into
Inakitajes:mainfrom
ixjosemi:feat/add-speckit-backend

Conversation

@ixjosemi

@ixjosemi ixjosemi commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Convoy only reads OpenSpec: a run's contract, the specs reader, spin, archive, close, Propose and the scorer prompts all assume openspec/changes/<id>/. Projects that plan with GitHub Spec Kit (specs/NNN-slug/ with spec.md, plan.md, tasks.md, plus .specify/memory/constitution.md) get no contract and must run every pipeline with --manual.

Change

Implements OpenSpec change add-speckit-backend (proposal, design D1–D6, delta specs in the branch).

  • One spec tool per project: features.specs: openspec | speckit | false. Each tool is one descriptor in src/spec-tools.ts, modeled on src/runners/descriptors.ts; call sites read the descriptor instead of comparing tool names. No auto-detection, no fallback between layouts.
  • Spec Kit features are the changes (src/speckit.ts): a feature is active while it has pending tasks or no tasks.md; task counts come from the checkbox lines, no specify CLI needed. Readers skip dotfiles and symlinks.
  • Runs: the contract bundle is the constitution plus every document of each selected feature: spec.md, plan.md, tasks.md, the optional /speckit.plan outputs (research.md, data-model.md, quickstart.md), contracts/** (Markdown plus text schemas such as OpenAPI YAML/JSON, GraphQL and protobuf) and checklists/**. Binary, hidden and symlinked files are skipped. Only spec.md is required for a feature to exist; the rest attach when present, as Spec Kit itself treats them. With exactly one feature selected, steps get SPECIFY_FEATURE_DIRECTORY and SPECIFY_FEATURE_NO_PERSIST=1; inherited SPECIFY_* values are stripped. RunPlan.openspec becomes RunPlan.specs ({ tool, changeIds, specFiles }), frozen in metadata, so resume, titles and publication don't depend on later config changes.
  • Reader: Spec Kit tabs are Spec, Plan, Tasks, Design Docs (research.md, data-model.md, quickstart.md, contracts/**, merged with per-file headings) and Other (checklists); the constitution takes the canonical specs' place.
  • Wording follows the tool in prompts, the plan review, the launcher and the specs browser; the CLI and UI keep the word "change".
  • Lifecycle: Spec Kit has no archive, so archive/recover/reconcile refuse before any journaling; completing the tasks takes archive's place in close. Spin uses the feat prefix.
  • Propose finds speckit.specify / speckit-specify, including Claude skills under .claude/skills/*/SKILL.md.
  • Docs (README.md, docs/) and the agent skill (skills/convoy/SKILL.md, skills/commands/pipeline.md) updated.

Breaking: features.specs: true is now rejected; use openspec.

The branch also carries chore(openspec): drop deprecated migrate-opencode-v2 change, a separate cleanup commit.

Tests

  • New: test/spec-tools.test.ts, test/speckit.test.ts; Spec Kit cases added across config, launch/review TUI, specs board/reader, spin, worktree commands, close, publish, runner env (test/runner-hosted.test.ts), Propose with Claude (test/conversation-resume.test.ts), and a CLI regression against a scratch Spec Kit repository.
  • bun run typecheck clean; bun test 4042 pass, 1 skip, 0 fail.
  • Not verified: a real specify init --integration … flow (task 6.1), since the specify CLI was not available; the scratch v1.2-layout fixture covers it instead.

🤖 Generated with Claude Code

ixjosemi and others added 7 commits October 9, 2026 11:03
Upstream archived its own OpenCode V2 migration; this fork-only plan is obsolete.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Projects choose their spec tool with `features.specs: openspec|speckit|false`;
`true` is rejected. Spec Kit features under `specs/NNN-slug/` act as changes:
active while tasks are pending, attached with the constitution as the run
contract, exposed to steps through SPECIFY_FEATURE_DIRECTORY when exactly one
is selected. Readers, spin, close, propose and publish follow the selected
tool's descriptor; archive is refused under Spec Kit.

Implements OpenSpec change add-speckit-backend.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
/speckit.plan may write contracts as OpenAPI, JSON Schema, GraphQL or
protobuf instead of Markdown. The bundle, the board inventory and the specs
reader now include every text file under a feature's contracts/, still
skipping binary, hidden and symlinked files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant