coopcli specplan

Plan the roadmap. Generate the specs.

A React Flow canvas that models your project as a DAG of specs and user stories — dependencies stay acyclic, uncovered work surfaces in a backlog, and every spec card generates its own OpenSpec change into your openspec/ tree without ever overwriting a hand-edited file.

specplan
$ npx @coopcli/specplan ./openspec
coopcli specplan
  plan root: ./openspec
  open:      http://127.0.0.1:8789

Local-only by design: the server binds to 127.0.0.1, chat and generation run with your own Anthropic credentials, and nothing leaves your machine except the model call.

What you get

A DAG, not a list

Specs depend on specs (kept acyclic — cycles are rejected with the exact path named), and specs contain the user stories they cover. Every card carries a lifecycle chip: draft / active / done / deferred.

Backlog of unlinked work

Anything not yet linked into the plan sits in the backlog — stories clear when a spec contains them, specs when any link touches them. Creation starts here too: name a spec and give it a generation prompt.

Non-destructive chat

A Claude-backed assistant creates, links, contains, and reorders plan items with tools. There is no delete tool, so it structurally cannot destroy your plan.

Hand-edit-safe generation

Each spec card generates a full OpenSpec change — every contained story becomes a scenario — and output must pass openspec validate --strict. Hand-edited bodies are detected by content hash and never overwritten.

The plan, at a glance

Specs are cards; solid arrows are dependencies (kept acyclic), dashed lines are containment — the stories a spec covers. Status chips track each spec's lifecycle.

SPEC OPENSPEC ✓ ACTIVE auth-floor Clerk identity into the User DO SPEC DRAFT teams-floor Teams own sessions + quotas USER STORY As a user, I want to log in so that my data is mine. USER STORY As an admin, I want to invite teammates so that we plan together. USER STORY · BACKLOG As a planner, I want billing alerts so that costs never surprise me. dependency (acyclic) containment (coverage)

The unlinked story sits in the backlog until a spec contains it. Hitting Generate OpenSpec on auth-floor turns its contained stories into #### Scenario: blocks in a strict-validated change.

Works with OpenSpec

OpenSpec is a spec-driven workflow: each change lives in its own directory (openspec/changes/<change-id>/) as a proposal, design, task list, and capability specs — written before the code. specplan adds the layer OpenSpec doesn't have: dependencies and ordering across the whole roadmap. The plan persists as plain YAML (openspec/specplan.yaml plus one specplan.yaml per change), and hand edits — comments included — survive round trips.

Get started

1

Set up Anthropic auth

export ANTHROPIC_API_KEY=sk-ant-... or ant auth login. Planning works without either; chat and generation need one.

2

Launch

npx @coopcli/specplan ./openspec — the plan autosaves to specplan.yaml, and change directories you already have land on the canvas automatically as draft cards.

3

Plan

Create specs and stories from the backlog (a spec's description is its generation prompt — @file pulls code into context), drag links on the canvas, set status chips — or just ask the chat. Cycles are rejected, stories must follow the formula, and nothing can be deleted by the assistant.

4

Generate

Hit Generate OpenSpec on a card (or npx @coopcli/specplan generate <specId>). Every contained story becomes a scenario, output must pass openspec validate --strict, and hand-edited changes are never overwritten. specplan validate keeps the plan honest in CI.

Read the docs @coopcli/specplan on npm

Sibling product: specsketch — draw one change's architecture and generate its spec. specplan plans the roadmap those changes live on.