@benjaminthomas/spec-driven-dev 1.7.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +169 -70
- package/bin/cli.mjs +97 -22
- package/package.json +3 -3
- package/{skills → plugin/skills}/spec-checkpoint/SKILL.md +23 -0
- package/{skills → plugin/skills}/spec-create/SKILL.md +18 -1
- package/plugin/skills/spec-create/references/log-template.md +27 -0
- package/{skills → plugin/skills}/spec-create/references/readme-template.md +12 -0
- package/{skills → plugin/skills}/spec-create/references/requirements-template.md +12 -4
- package/{skills → plugin/skills}/spec-create/references/task-template.md +12 -0
- package/{skills → plugin/skills}/spec-implement/SKILL.md +40 -16
- package/{skills → plugin/skills}/spec-investigate/SKILL.md +29 -5
- package/{skills → plugin/skills}/spec-investigate/references/report-template.md +8 -1
- package/plugin/skills/spec-review/SKILL.md +131 -0
- package/plugin/skills/spec-review/references/report-template.md +44 -0
- package/{skills → plugin/skills}/spec-setup/SKILL.md +34 -9
- package/plugin/skills/spec-setup/references/audit.md +71 -0
- package/{skills → plugin/skills}/spec-setup/references/config-template.yml +25 -9
- package/plugin/skills/spec-setup/references/context-template.md +83 -0
- package/{skills → plugin/skills}/spec-ship/SKILL.md +10 -0
- package/{skills → plugin/skills}/spec-verify/SKILL.md +10 -2
- /package/{skills → plugin/skills}/generative-seo/SKILL.md +0 -0
- /package/{skills → plugin/skills}/generative-seo/assets/citation-log-template.md +0 -0
- /package/{skills → plugin/skills}/generative-seo/assets/competitor-analysis-template.md +0 -0
- /package/{skills → plugin/skills}/generative-seo/assets/content-plan-template.md +0 -0
- /package/{skills → plugin/skills}/generative-seo/assets/geo-config-template.md +0 -0
- /package/{skills → plugin/skills}/generative-seo/assets/geo-playbook-template.md +0 -0
- /package/{skills → plugin/skills}/generative-seo/assets/social-queue-template.md +0 -0
- /package/{skills → plugin/skills}/generative-seo/references/geo-methodology.md +0 -0
- /package/{skills → plugin/skills}/spec-create/references/action-required-template.md +0 -0
- /package/{skills → plugin/skills}/spec-create/references/complexity-rubric.md +0 -0
- /package/{skills → plugin/skills}/spec-implement/references/coder-prompt-template.md +0 -0
- /package/{skills → plugin/skills}/spec-implement/references/fix-prompt-template.md +0 -0
- /package/{skills → plugin/skills}/spec-implement/references/review-prompt-template.md +0 -0
- /package/{skills → plugin/skills}/spec-verify/references/report-template.md +0 -0
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ without guessing.** It first investigates the problem, then writes a plan you ap
|
|
|
9
9
|
in parallel with tests and review, then checks the real running app, and finally commits and opens
|
|
10
10
|
the PR.
|
|
11
11
|
|
|
12
|
-
It's a set of
|
|
12
|
+
It's a set of nine [Agent Skills](https://agentskills.io), plain Markdown instruction files that
|
|
13
13
|
AI coding tools load on demand. It works with Claude Code, Codex CLI, Cursor, and Google Antigravity,
|
|
14
14
|
in any language or framework, and in a single repo, a monorepo, or several repos that change
|
|
15
15
|
together, even when those repos live in different folders. To set it up, run
|
|
@@ -45,6 +45,8 @@ Asking an AI agent to "just build it" tends to fail in predictable ways:
|
|
|
45
45
|
| A big plan won't fit in the agent's context, or is too vague to act on | **`spec-create`** splits the work into small, self-contained task files, so each agent reads only its own |
|
|
46
46
|
| One agent working alone is slow | **`spec-implement`** runs several coder agents in parallel, each in its own copy of the repo |
|
|
47
47
|
| "It compiles" gets treated as "it works" | **`spec-verify`** drives the real running app and checks every acceptance criterion, with evidence |
|
|
48
|
+
| Problems slip through because nobody reviews the whole change | **`spec-review`** checks the finished branch against the spec, your conventions, and the code, and blocks shipping on real problems |
|
|
49
|
+
| A new session forgets what was decided last time | **Project memory**: a small `specs/CONTEXT.md`, plus a "Resume here" block and a log in every spec, kept short so reloading them is cheap |
|
|
48
50
|
| Broken code gets committed, or a PR is pushed by accident | **`spec-checkpoint`** commits only once lint, types, tests, and build all pass. **`spec-ship`** asks before it pushes |
|
|
49
51
|
|
|
50
52
|
Each stage writes its result to a file, so you can stop at any point, hand over to a teammate, or
|
|
@@ -89,6 +91,7 @@ words in quotes.
|
|
|
89
91
|
|
|
90
92
|
/spec-implement "implement the spec"
|
|
91
93
|
/spec-verify "does it actually work?"
|
|
94
|
+
/spec-review "review this"
|
|
92
95
|
/spec-checkpoint "checkpoint"
|
|
93
96
|
/spec-ship "ship it"
|
|
94
97
|
```
|
|
@@ -97,23 +100,35 @@ words in quotes.
|
|
|
97
100
|
**deep**, based on how much it touches and how risky it is (data, security, concurrency, public
|
|
98
101
|
contracts, unclear requirements). `spec-implement` then runs each task on the model for its tier:
|
|
99
102
|
|
|
100
|
-
| Tier | Typical task | Claude Code
|
|
101
|
-
|
|
102
|
-
| light | copy change, config value, small UI tweak following an existing pattern | `haiku` |
|
|
103
|
-
| standard | a normal feature slice: route + service + tests | `sonnet` |
|
|
104
|
-
| deep | migrations with backfills, auth/permissions, concurrency, cross-repo contracts | `opus` |
|
|
103
|
+
| Tier | Typical task | Claude Code | Codex CLI | Effort |
|
|
104
|
+
|---|---|---|---|---|
|
|
105
|
+
| light | copy change, config value, small UI tweak following an existing pattern | `haiku` | `gpt-6-luna` | low |
|
|
106
|
+
| standard | a normal feature slice: route + service + tests | `sonnet` | `gpt-6.1-sol` | medium |
|
|
107
|
+
| deep | migrations with backfills, auth/permissions, concurrency, cross-repo contracts | `opus` | `gpt-6.1-sol` | high |
|
|
108
|
+
| escalate | a deep task that still fails after a fix round | `fable` (asks first, as it may use usage credits) | (session model) | xhigh |
|
|
105
109
|
|
|
106
110
|
- **Reviews:** each batch's review runs on at least `standard`, and on the batch's highest tier.
|
|
107
|
-
- **Escalation:** a task that still fails after a fix round is retried one tier up.
|
|
111
|
+
- **Escalation:** a task that still fails after a fix round is retried one tier up. A deep task
|
|
112
|
+
that still fails goes to the `escalate` model.
|
|
113
|
+
- **Fallback:** if a model isn't available on your plan or provider, that task runs on your current
|
|
114
|
+
model and the report says so.
|
|
115
|
+
- **Where the defaults come from:** they were checked on 2026-11-06 against
|
|
116
|
+
[Claude Code's model docs](https://code.claude.com/docs/en/model-config) (on Bedrock, Google Cloud,
|
|
117
|
+
and Foundry, `sonnet`/`haiku` point to older versions),
|
|
118
|
+
[Anthropic's model overview](https://platform.claude.com/docs/en/about-claude/models/overview),
|
|
119
|
+
[Codex's config docs](https://developers.openai.com/codex/config-basic), and
|
|
120
|
+
[Cursor's model list](https://cursor.com/help/models-and-usage/available-models). Claude Code
|
|
121
|
+
uses family aliases, which always point to the newest model. Cursor's models depend on your plan,
|
|
122
|
+
so it uses your current model until you fill in the models you can see in its picker.
|
|
108
123
|
- **Tools that run one model per session** (Cursor, Codex) don't switch silently. Before a heavier
|
|
109
124
|
batch, they pause and tell you which model to switch to.
|
|
110
125
|
- **Changing the models:** edit the `models:` section of `.spec-driven.yml`, for example to use a
|
|
111
126
|
newer model for `deep`.
|
|
112
127
|
|
|
113
128
|
**Fewer stops:** after reviewing the spec, say **"approved, run it through"**. The workflow then
|
|
114
|
-
implements, verifies, and commits in one go. It stops at the first failure
|
|
115
|
-
before pushing or opening a PR. To make this the default after approval,
|
|
116
|
-
setup (`pipeline.after_approval` in `.spec-driven.yml`).
|
|
129
|
+
implements, verifies, reviews, and commits in one go. It stops at the first failure or review
|
|
130
|
+
blocker, and always asks before pushing or opening a PR. To make this the default after approval,
|
|
131
|
+
choose `run-through` during setup (`pipeline.after_approval` in `.spec-driven.yml`).
|
|
117
132
|
|
|
118
133
|
That's the whole workflow. Every stage can be used on its own as well: use `/spec-create` straight
|
|
119
134
|
from a planning chat, or `/spec-checkpoint` on any work in progress.
|
|
@@ -156,7 +171,7 @@ straight away, so you can fix it before moving on. Press Enter on an empty line
|
|
|
156
171
|
| Lint / typecheck / test / build / dev commands | `package.json` scripts and lockfile (per repo or package) | `pnpm run lint` |
|
|
157
172
|
| Where specs go | (you choose) | `specs/` |
|
|
158
173
|
| After you approve a spec | (you choose) | `stop` (wait at each stage) or `run-through` |
|
|
159
|
-
| Model per task tier | written with defaults
|
|
174
|
+
| Model and effort per task tier | written with the defaults above | edit `models:` / `effort:` later |
|
|
160
175
|
|
|
161
176
|
**Where the file lives, by layout:**
|
|
162
177
|
|
|
@@ -193,28 +208,63 @@ example, from inside `/Projects/frontend`:
|
|
|
193
208
|
Every question also has a flag, for scripts and CI:
|
|
194
209
|
`--layout=multi-repo --repos=~/Projects/frontend,~/Work/backend --workspace=~/Projects`,
|
|
195
210
|
`--layout=monorepo --packages=apps/web,packages/ui`, `--after-approval=run-through`,
|
|
196
|
-
`--tools=cursor,codex`, `--global`, `--yes` (accept everything detected), and `--version`.
|
|
211
|
+
`--project=new|existing`, `--tools=cursor,codex`, `--global`, `--yes` (accept everything detected), and `--version`.
|
|
197
212
|
|
|
198
213
|
To change the rules later, edit the file or run setup again, then run `spec-driven-dev doctor`
|
|
199
214
|
to confirm the file still matches your repos. Setup never overwrites the file without
|
|
200
|
-
asking. See [`config-template.yml`](skills/spec-setup/references/config-template.yml) for every field.
|
|
215
|
+
asking. See [`config-template.yml`](plugin/skills/spec-setup/references/config-template.yml) for every field.
|
|
216
|
+
|
|
217
|
+
### Project memory: so context isn't lost between sessions and features
|
|
218
|
+
|
|
219
|
+
Setup asks whether this is a **new or existing project** and detects the likely answer from the
|
|
220
|
+
commit and file counts. Then "run spec-setup" in your AI tool builds the project's memory:
|
|
221
|
+
|
|
222
|
+
- **Existing project:** a shallow audit using cheap commands (folder sizes, manifests, CI, busy areas
|
|
223
|
+
from git log, your README/CLAUDE.md/ADRs), then one round of questions the code can't answer
|
|
224
|
+
(what the product does, off-limits areas, fragile spots, where it's heading, unwritten rules).
|
|
225
|
+
- **New project:** it asks about the stack and conventions you want and saves them as the first
|
|
226
|
+
decisions.
|
|
227
|
+
|
|
228
|
+
Everything is kept small on purpose, because loading context costs tokens:
|
|
229
|
+
|
|
230
|
+
| File | Size limit | Loaded when |
|
|
231
|
+
|---|---|---|
|
|
232
|
+
| `specs/CONTEXT.md`, the index: product, area map, top conventions, decisions | 60 lines | once per stage, only during spec work |
|
|
233
|
+
| `specs/context/<area>.md`, details for one area | 150 lines | only when a task touches that area |
|
|
234
|
+
| `specs/context/archive.md`, superseded entries | none | never by default |
|
|
235
|
+
| `specs/<feature>/README.md`, its **Resume here** block | ~10 lines | first thing in a new or compacted session |
|
|
236
|
+
| `specs/<feature>/log.md`, decisions, deviations, review findings | append-only | rarely; read in full only once, at checkpoint |
|
|
237
|
+
|
|
238
|
+
Each stage passes on a digest instead of the files: the investigation keeps 10–20 relevant lines,
|
|
239
|
+
and each task file gets only the 3–5 conventions it needs, so parallel coders never load the
|
|
240
|
+
context. When a feature is finished, `spec-checkpoint` adds its lasting lessons to the right area
|
|
241
|
+
file. Requirements are numbered (R1, R2…) and traced from investigation to tasks to verification.
|
|
242
|
+
|
|
243
|
+
`spec-driven-dev context` prints the index, and `spec-driven-dev context --areas=billing,api`
|
|
244
|
+
prints just those areas, with no model involved. `doctor` checks the size limits and flags context
|
|
245
|
+
lines that point to files that no longer exist. If you install
|
|
246
|
+
[graphify](https://github.com/Graphify-Labs/graphify), the skills use it for cheaper code
|
|
247
|
+
navigation. It's optional (`context.graph: off` turns it off), and nothing is installed for you.
|
|
201
248
|
|
|
202
249
|
## How the workflow fits together
|
|
203
250
|
|
|
204
251
|
```
|
|
205
|
-
┌──────────────────┐ ┌─────────────┐ ┌──────────┐ ┌────────────────┐ ┌─────────────┐ ┌─────────────────┐ ┌───────────┐
|
|
206
|
-
│ spec-investigate │ → │ spec-create │ → │ YOU │ → │ spec-implement │ → │ spec-verify │ → │ spec-checkpoint │ → │ spec-ship │
|
|
207
|
-
│ understand │ │ plan │ │ approve │ │ build + test │ │ prove │ │ commit │ │ open PR │
|
|
208
|
-
└──────────────────┘ └─────────────┘ └──────────┘ └────────────────┘ └─────────────┘ └─────────────────┘ └───────────┘
|
|
209
|
-
investigation.md specs/<feature>/ code + tests, verification-
|
|
210
|
-
+ work branch task files one commit/batch report.md
|
|
252
|
+
┌──────────────────┐ ┌─────────────┐ ┌──────────┐ ┌────────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ ┌───────────┐
|
|
253
|
+
│ spec-investigate │ → │ spec-create │ → │ YOU │ → │ spec-implement │ → │ spec-verify │ → │ spec-review │ → │ spec-checkpoint │ → │ spec-ship │
|
|
254
|
+
│ understand │ │ plan │ │ approve │ │ build + test │ │ prove │ │ review │ │ commit │ │ open PR │
|
|
255
|
+
└──────────────────┘ └─────────────┘ └──────────┘ └────────────────┘ └─────────────┘ └─────────────┘ └─────────────────┘ └───────────┘
|
|
256
|
+
investigation.md specs/<feature>/ code + tests, verification- review.md local commit pushed branch
|
|
257
|
+
+ work branch task files one commit/batch report.md (blockers stop) + GitHub PR
|
|
211
258
|
```
|
|
212
259
|
|
|
213
260
|
- **The approval step is yours.** Nothing builds until you've read the spec and run `spec-implement`
|
|
214
261
|
yourself. `spec-investigate` never moves on to the next stage by itself.
|
|
215
262
|
- **Each stage reads the previous stage's files.** `spec-create` uses `investigation.md` as its
|
|
216
|
-
evidence, `spec-implement` works through the task files,
|
|
217
|
-
acceptance criteria
|
|
263
|
+
evidence, `spec-implement` works through the task files, `spec-verify` checks against their
|
|
264
|
+
acceptance criteria, and `spec-review` checks the whole diff against the requirements before
|
|
265
|
+
anything is committed for shipping.
|
|
266
|
+
- **Every stage leaves a way back in.** Each one updates the spec's **Resume here** block and adds
|
|
267
|
+
to its `log.md`, so a new or compacted session continues from about 10 lines, not the chat history.
|
|
218
268
|
- **Stages can be skipped.** For new projects with nothing to investigate, start at `spec-create`.
|
|
219
269
|
For a quick fix, use only `spec-checkpoint` and `spec-ship`.
|
|
220
270
|
|
|
@@ -224,10 +274,13 @@ asking. See [`config-template.yml`](skills/spec-setup/references/config-template
|
|
|
224
274
|
|
|
225
275
|
### 0. `spec-setup`: learn the project's rules
|
|
226
276
|
|
|
227
|
-
**Say:** "run spec-setup", "configure the pipeline", "
|
|
277
|
+
**Say:** "run spec-setup", "configure the pipeline", "audit this repo", "refresh the project context"
|
|
228
278
|
|
|
229
|
-
**What it does:** see [Project setup](#project-setup-your-teams-rules). It writes `.spec-driven.yml
|
|
230
|
-
|
|
279
|
+
**What it does:** see [Project setup](#project-setup-your-teams-rules). It writes `.spec-driven.yml`, then
|
|
280
|
+
builds the [project memory](#project-memory-so-context-isnt-lost-between-sessions-and-features): a
|
|
281
|
+
shallow audit and one round of questions for an existing repo, or your intended stack and conventions
|
|
282
|
+
for a new one, saved to `specs/CONTEXT.md`. It adds a one-line pointer to `CLAUDE.md`/`AGENTS.md`
|
|
283
|
+
only if you say yes. No branches, commits, or code.
|
|
231
284
|
|
|
232
285
|
### 1. `spec-investigate`: understand before planning
|
|
233
286
|
|
|
@@ -257,8 +310,13 @@ You can add `--context ./notes.md` to supply extra background, such as meeting n
|
|
|
257
310
|
4. Sorts the work into **required / supporting / optional / out of scope**, and lists risks, security
|
|
258
311
|
and performance concerns, and existing tests.
|
|
259
312
|
|
|
313
|
+
It starts from the project memory (`specs/CONTEXT.md` and only the area files the ticket touches),
|
|
314
|
+
treats it as a lead rather than evidence, and notes where the code contradicts it. If graphify is
|
|
315
|
+
installed, it uses it to map the code more cheaply.
|
|
316
|
+
|
|
260
317
|
**You get:** `specs/<feature>/investigation.md`, with every finding labelled **VERIFIED**,
|
|
261
|
-
**INFERRED**, **ASSUMPTION**, or **UNKNOWN
|
|
318
|
+
**INFERRED**, **ASSUMPTION**, or **UNKNOWN**, a short **Relevant Context** digest for the next
|
|
319
|
+
stages, and requirements numbered R1, R2… so they can be traced through to verification and review.
|
|
262
320
|
|
|
263
321
|
**It won't:** write code, write tests, or start `spec-create` without being asked.
|
|
264
322
|
|
|
@@ -273,7 +331,9 @@ each other and don't touch the same files, so they can be built at the same time
|
|
|
273
331
|
|
|
274
332
|
**You get:** a `specs/<feature>/` folder (see [What ends up in your repo](#what-ends-up-in-your-repo)).
|
|
275
333
|
Each task file is complete on its own: description, files to change, implementation steps, **tests
|
|
276
|
-
to write**, and
|
|
334
|
+
to write**, acceptance criteria, the requirements it **covers**, and the few **project conventions**
|
|
335
|
+
that apply to it. Every requirement must map to a task, and the spec isn't finished until it does.
|
|
336
|
+
It also starts the spec's `log.md` and **Resume here** block.
|
|
277
337
|
|
|
278
338
|
**Then:** read it, edit anything you disagree with, and only then run `spec-implement`.
|
|
279
339
|
|
|
@@ -290,10 +350,14 @@ to write**, and acceptance criteria.
|
|
|
290
350
|
4. A **separate reviewer agent** runs lint, typecheck, and tests and checks every acceptance
|
|
291
351
|
criterion. If anything fails, fix agents are sent in, for up to 3 rounds before it stops and
|
|
292
352
|
asks you.
|
|
293
|
-
5.
|
|
353
|
+
5. Logs decisions and deviations to `log.md`, updates **Resume here**, then commits the batch and
|
|
354
|
+
ticks it off in the spec's README.
|
|
294
355
|
|
|
295
|
-
|
|
296
|
-
|
|
356
|
+
Each coder gets only its task file, which already carries the 3–5 project conventions that task
|
|
357
|
+
needs, so parallel coders don't each load the project memory.
|
|
358
|
+
|
|
359
|
+
**It can resume:** if you stop halfway, or the conversation gets compacted, run it again. It reads
|
|
360
|
+
the spec's **Resume here** block and carries on from the first unfinished batch. If your tool can't run agents in parallel, it does the tasks one at a time instead.
|
|
297
361
|
|
|
298
362
|
### 4. `spec-verify`: prove it works
|
|
299
363
|
|
|
@@ -304,10 +368,24 @@ each one the way a user would: clicking through the UI, calling real API routes,
|
|
|
304
368
|
database only to confirm the result.
|
|
305
369
|
|
|
306
370
|
**You get:** `specs/<feature>/verification-report.md`, with pass or fail for each criterion and the
|
|
307
|
-
evidence (screenshots, responses, data). If there's no spec, it asks you what "working" means and
|
|
371
|
+
evidence (screenshots, responses, data), grouped by requirement number (R1…) where the spec has them. If there's no spec, it asks you what "working" means and
|
|
308
372
|
checks that instead.
|
|
309
373
|
|
|
310
|
-
### 5. `spec-
|
|
374
|
+
### 5. `spec-review`: review the whole change
|
|
375
|
+
|
|
376
|
+
**Say:** "review this", "code review", "review PR #42", "is this ready to merge?"
|
|
377
|
+
|
|
378
|
+
**What it does:** It reviews the finished branch against the spec (every requirement R1… delivered,
|
|
379
|
+
nothing out of scope), the project's recorded conventions, and the code itself: correctness,
|
|
380
|
+
security, error handling, tests, and hot-path performance. It checks each finding against the code
|
|
381
|
+
before reporting it, and reads the diff rather than the whole repo.
|
|
382
|
+
|
|
383
|
+
**You get:** `specs/<feature>/review.md`, with findings ranked blocker, should-fix, nit, or question,
|
|
384
|
+
each with `file:line` and a suggested fix. Blockers stop `spec-ship` and run-through. It then asks
|
|
385
|
+
whether to fix them, and fixes go through `spec-implement`'s fix loop only after you say yes. It also
|
|
386
|
+
reviews any branch or a teammate's PR, and posts PR comments only after you approve the text.
|
|
387
|
+
|
|
388
|
+
### 6. `spec-checkpoint`: commit safely
|
|
311
389
|
|
|
312
390
|
**Say:** "checkpoint", "commit everything", "save my progress"
|
|
313
391
|
|
|
@@ -316,9 +394,13 @@ finds them in `package.json`, `Makefile`, `pyproject.toml`, CI config, and so on
|
|
|
316
394
|
Then it stages everything and commits in your configured style (`feat: …` or `STP-123: …`). In a
|
|
317
395
|
multi-repo setup, it makes one commit in each repo that changed.
|
|
318
396
|
|
|
397
|
+
When a spec is finished, it also adds the feature's lasting lessons (decisions and why, conventions
|
|
398
|
+
found, pitfalls) to the right `specs/context/<area>.md`, and shows you those changes so you can
|
|
399
|
+
correct them. It follows any commit rules recorded in the project memory.
|
|
400
|
+
|
|
319
401
|
**It won't:** push. Committing is a local step.
|
|
320
402
|
|
|
321
|
-
###
|
|
403
|
+
### 7. `spec-ship`: open the PR
|
|
322
404
|
|
|
323
405
|
**Say:** "ship it", "push this", "open a PR"
|
|
324
406
|
|
|
@@ -328,6 +410,9 @@ against your configured PR target, with a written description. In a multi-repo s
|
|
|
328
410
|
PR per repo, each linking the others. If a PR already exists for the branch, it pushes the new commits to that PR
|
|
329
411
|
instead of opening another one.
|
|
330
412
|
|
|
413
|
+
It won't open a PR while `review.md` has an open blocker, unless you accept it. Any should-fix
|
|
414
|
+
items are listed in the PR description.
|
|
415
|
+
|
|
331
416
|
**Needs:** the [GitHub CLI](https://cli.github.com) (`gh`), logged in.
|
|
332
417
|
|
|
333
418
|
### Bonus: `generative-seo`, a separate skill for SEO
|
|
@@ -336,7 +421,7 @@ This one isn't part of the workflow. It runs SEO and **GEO** (Generative Engine
|
|
|
336
421
|
your content cited by ChatGPT, Perplexity, and Google AI Overviews) for any website codebase. It has
|
|
337
422
|
seven modes: `audit`, `content`, `optimize`, `competitors`, `citations`, `report`, and `social`. The
|
|
338
423
|
first time, it asks a few questions about your brand, domain, and framework, and remembers the
|
|
339
|
-
answers. See `skills/generative-seo/SKILL.md`.
|
|
424
|
+
answers. See `plugin/skills/generative-seo/SKILL.md`.
|
|
340
425
|
|
|
341
426
|
---
|
|
342
427
|
|
|
@@ -348,12 +433,16 @@ specs/
|
|
|
348
433
|
├── investigation.md ← spec-investigate: what's true today, with evidence
|
|
349
434
|
├── requirements.md ← spec-create: what we're building and why
|
|
350
435
|
├── action-required.md ← spec-create: things only a human can do (API keys, DNS, accounts)
|
|
351
|
-
├── README.md ← spec-create: batches, dependency graph, progress checkboxes
|
|
436
|
+
├── README.md ← spec-create: "Resume here", batches, dependency graph, progress checkboxes
|
|
437
|
+
├── log.md ← every stage: decisions, deviations, review findings (append-only)
|
|
352
438
|
├── tasks/
|
|
353
439
|
│ ├── task-01-fix-pagination.md
|
|
354
440
|
│ ├── task-02-add-export-test-fixtures.md
|
|
355
441
|
│ └── …
|
|
356
|
-
|
|
442
|
+
├── verification-report.md ← spec-verify: pass/fail per acceptance criterion
|
|
443
|
+
└── review.md ← spec-review: ranked findings; open blockers stop spec-ship
|
|
444
|
+
specs/CONTEXT.md ← spec-setup / spec-checkpoint: project memory index (≤60 lines)
|
|
445
|
+
specs/context/<area>.md ← details per area, loaded only when needed (≤150 lines)
|
|
357
446
|
```
|
|
358
447
|
|
|
359
448
|
These are plain Markdown files, so you can review them in a PR, edit them, or hand them to a
|
|
@@ -372,7 +461,13 @@ Built into the skills, not left to the agent's judgment:
|
|
|
372
461
|
- **No guessing.** Gaps are marked UNKNOWN, and missing tickets are asked for rather than made up.
|
|
373
462
|
- **Tests can't be cheated.** Coders may not delete, skip, or weaken a test to make it pass, and the
|
|
374
463
|
reviewer checks for this.
|
|
375
|
-
- **Pushing needs an explicit "yes".**
|
|
464
|
+
- **Pushing needs an explicit "yes".** `spec-ship` also refuses while `review.md` has an open
|
|
465
|
+
blocker, unless you accept it, and that is recorded.
|
|
466
|
+
- **Reviews are checked, not guessed.** `spec-review` confirms each finding against the code before
|
|
467
|
+
reporting it, never edits code without your yes, and never posts PR comments without your yes on
|
|
468
|
+
the exact text.
|
|
469
|
+
- **Context costs stay small.** Project memory has hard size limits, is loaded only for the areas a
|
|
470
|
+
task touches, and is passed between stages as short digests.
|
|
376
471
|
- **Investigation stays in scope.** Ideas that come up along the way go under "optional" or "out of
|
|
377
472
|
scope" instead of being folded into the work.
|
|
378
473
|
|
|
@@ -396,8 +491,8 @@ config sits outside any repo, so it stays on your machine.
|
|
|
396
491
|
Yes. No skill assumes a language or framework. Each one finds the repo's own commands.
|
|
397
492
|
|
|
398
493
|
**Do I have to start every stage myself?**
|
|
399
|
-
No. After you approve a spec, say "approved, run it through": implement, verify, and checkpoint then
|
|
400
|
-
run one after another, stopping at the first failure. Two steps always wait for you: approving the
|
|
494
|
+
No. After you approve a spec, say "approved, run it through": implement, verify, review, and checkpoint then
|
|
495
|
+
run one after another, stopping at the first failure or review blocker. Two steps always wait for you: approving the
|
|
401
496
|
spec, and pushing or opening the PR. You don't need slash commands either. Saying "investigate
|
|
402
497
|
STP-123" or "ship it" picks the right skill.
|
|
403
498
|
|
|
@@ -427,14 +522,14 @@ Yes. Progress is saved in the spec's `README.md` checkboxes and the commit for e
|
|
|
427
522
|
**How do I update?**
|
|
428
523
|
Run `npm install -g @benjaminthomas/spec-driven-dev@latest`, then `spec-driven-dev` in your project.
|
|
429
524
|
Claude Code plugin users run
|
|
430
|
-
`/plugin marketplace update spec-driven-dev` and then update the plugin. Your config is never
|
|
525
|
+
`/plugin marketplace update spec-driven-dev` and then update the `ticket-to-pr` plugin. Your config is never
|
|
431
526
|
touched by an update.
|
|
432
527
|
|
|
433
528
|
**Can I trust the npm package?**
|
|
434
529
|
Releases are published by this repo's GitHub Actions workflow, not from anyone's laptop, through
|
|
435
530
|
npm [trusted publishing](https://docs.npmjs.com/trusted-publishers). Each version's npm page shows
|
|
436
531
|
a provenance badge linking it to the exact commit and workflow run that built it. The package has
|
|
437
|
-
one small dependency (`prompts`, for the setup menus), and it contains only `bin/` and the `skills/`
|
|
532
|
+
one small dependency (`prompts`, for the setup menus), and it contains only `bin/` and the `plugin/skills/`
|
|
438
533
|
folder.
|
|
439
534
|
|
|
440
535
|
**Something isn't working. Where do I start?**
|
|
@@ -468,7 +563,8 @@ spec-driven-dev --tools=cursor,codex # pick tools without being ask
|
|
|
468
563
|
spec-driven-dev --skills=spec-create,spec-ship # install only some skills
|
|
469
564
|
spec-driven-dev --yes # accept every detected default (CI-friendly)
|
|
470
565
|
spec-driven-dev doctor # check .spec-driven.yml against the real repos
|
|
471
|
-
spec-driven-dev status # list specs
|
|
566
|
+
spec-driven-dev status # list unfinished specs and each one's next step
|
|
567
|
+
spec-driven-dev context --areas=billing # print the project memory (index, or chosen areas)
|
|
472
568
|
spec-driven-dev --help # show all of the above
|
|
473
569
|
```
|
|
474
570
|
|
|
@@ -493,25 +589,26 @@ try an unreleased commit on `main`.
|
|
|
493
589
|
installer has one small dependency, [`prompts`](https://www.npmjs.com/package/prompts), for its menus.
|
|
494
590
|
CI tests it on Node 14, 16, 18, 20, 22, and 24, and on Windows and macOS.
|
|
495
591
|
|
|
496
|
-
### Claude Code (plugin
|
|
592
|
+
### Claude Code (plugin `ticket-to-pr`, with automatic updates)
|
|
497
593
|
|
|
498
594
|
```
|
|
499
595
|
/plugin marketplace add https://github.com/benjaminthomas/spec-driven-dev.git
|
|
500
|
-
/plugin install
|
|
596
|
+
/plugin install ticket-to-pr@spec-driven-dev
|
|
501
597
|
```
|
|
502
598
|
|
|
503
599
|
To update, run `/plugin marketplace update spec-driven-dev`, then update the plugin from `/plugin`.
|
|
504
600
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
601
|
+
Installed it before 1.9.0? The plugin was called `spec-driven-dev` then. Uninstall that one and
|
|
602
|
+
install `ticket-to-pr@spec-driven-dev`; the old name no longer gets updates.
|
|
603
|
+
|
|
604
|
+
To see unfinished specs and their next step at any time, run `spec-driven-dev status`
|
|
605
|
+
(for example, `specs/stp-123: 3/5 tasks done → next: spec-implement`). If
|
|
509
606
|
you use the plugin, `spec-driven-dev` skips Claude Code so you don't get every skill twice. Run
|
|
510
607
|
`spec-driven-dev setup` for the project config.
|
|
511
608
|
|
|
512
609
|
### By hand
|
|
513
610
|
|
|
514
|
-
Copy the `skills/<name>/` folders you want. Each one is self-contained. Where each tool looks for
|
|
611
|
+
Copy the `plugin/skills/<name>/` folders you want. Each one is self-contained. Where each tool looks for
|
|
515
612
|
skills:
|
|
516
613
|
|
|
517
614
|
| Tool | This project | All projects |
|
|
@@ -525,8 +622,8 @@ Codex CLI and Antigravity share the project path, so installing for one covers b
|
|
|
525
622
|
|
|
526
623
|
### Fallback: MCP server (for tools without Agent Skills support)
|
|
527
624
|
|
|
528
|
-
If your tool supports MCP but not Agent Skills, `mcp-server/` serves the same
|
|
529
|
-
tools. It reads `skills/` directly, so there's nothing to keep in sync.
|
|
625
|
+
If your tool supports MCP but not Agent Skills, `mcp-server/` serves the same nine skills as MCP
|
|
626
|
+
tools. It reads `plugin/skills/` directly, so there's nothing to keep in sync.
|
|
530
627
|
|
|
531
628
|
```bash
|
|
532
629
|
cd mcp-server && npm install
|
|
@@ -547,6 +644,7 @@ Each skill becomes a tool that returns its instructions, and supporting files ar
|
|
|
547
644
|
| `spec-create` | ✅ | ✅ | ✅ | ✅ | Planning and writing files only |
|
|
548
645
|
| `spec-implement` | ✅ | ✅ | ✅ | ✅ | Parallel agents and worktrees where the tool supports them; otherwise one task at a time |
|
|
549
646
|
| `spec-verify` | ✅ | ⚠️ | ⚠️ | ⚠️ | UI checks need browser automation; API and database checks work everywhere |
|
|
647
|
+
| `spec-review` | ✅ | ✅ | ✅ | ✅ | git diff, or `gh` for pull requests |
|
|
550
648
|
| `spec-checkpoint` | ✅ | ✅ | ✅ | ✅ | Plain git plus your repo's own check commands |
|
|
551
649
|
| `spec-ship` | ✅ | ✅ | ✅ | ✅ | git plus the GitHub CLI (`gh`) |
|
|
552
650
|
| `generative-seo` | ✅ | ✅ | ✅ | ✅ | Web search and writing files |
|
|
@@ -560,20 +658,21 @@ skips that step rather than failing.
|
|
|
560
658
|
|
|
561
659
|
| Skill | Stage | SKILL.md lines | Words | Supporting files |
|
|
562
660
|
|---|---|---:|---:|---:|
|
|
563
|
-
| `spec-setup` | 0 · configure |
|
|
564
|
-
| `spec-investigate` | 1 · understand |
|
|
565
|
-
| `spec-create` | 2 · plan |
|
|
566
|
-
| `spec-implement` | 3 · build |
|
|
567
|
-
| `spec-verify` | 4 · prove |
|
|
568
|
-
| `spec-
|
|
569
|
-
| `spec-
|
|
661
|
+
| `spec-setup` | 0 · configure | 142 | 1,334 | 3 |
|
|
662
|
+
| `spec-investigate` | 1 · understand | 354 | 3,007 | 1 |
|
|
663
|
+
| `spec-create` | 2 · plan | 183 | 1,646 | 6 |
|
|
664
|
+
| `spec-implement` | 3 · build | 322 | 2,683 | 3 |
|
|
665
|
+
| `spec-verify` | 4 · prove | 163 | 1,557 | 1 |
|
|
666
|
+
| `spec-review` | 5 · review | 131 | 1,209 | 1 |
|
|
667
|
+
| `spec-checkpoint` | 6 · commit | 131 | 1,020 | 0 |
|
|
668
|
+
| `spec-ship` | 7 · PR | 230 | 1,388 | 0 |
|
|
570
669
|
| `generative-seo` | standalone | 255 | 2,209 | 7 |
|
|
571
|
-
| **Total** | | **1,
|
|
670
|
+
| **Total** | | **1,911** | **16,053** | **22** |
|
|
572
671
|
|
|
573
672
|
- **8** skills: **1** setup + **6** workflow stages + **1** standalone
|
|
574
673
|
- **4** tools supported natively (Claude Code, Codex CLI, Cursor, Antigravity), plus an MCP fallback
|
|
575
674
|
- **3** layouts: single repo, monorepo, multi-repo
|
|
576
|
-
- **1** npm package, `@benjaminthomas/spec-driven-dev`, plus the Claude Code plugin and an MCP fallback
|
|
675
|
+
- **1** npm package, `@benjaminthomas/spec-driven-dev`, plus the Claude Code plugin `ticket-to-pr` and an MCP fallback
|
|
577
676
|
- **0** stack assumptions: lint, typecheck, test, build, and dev commands come from your repo
|
|
578
677
|
|
|
579
678
|
_The table is generated by `python3 scripts/check.py --fix`; CI fails if it goes out of date._
|
|
@@ -583,29 +682,29 @@ _The table is generated by `python3 scripts/check.py --fix`; CI fails if it goes
|
|
|
583
682
|
## Working on this repo
|
|
584
683
|
|
|
585
684
|
```
|
|
586
|
-
skills/<name>/SKILL.md
|
|
587
|
-
skills/<name>/references/
|
|
588
|
-
.claude-plugin/ Claude Code
|
|
685
|
+
plugin/skills/<name>/SKILL.md the skill itself (frontmatter: name, description, license)
|
|
686
|
+
plugin/skills/<name>/references/ templates and prompts the skill loads when needed
|
|
687
|
+
.claude-plugin/ Claude Code marketplace manifest
|
|
688
|
+
plugin/ the Claude Code plugin (manifest + skills only, no scripts or hooks)
|
|
589
689
|
.agents/skills/ symlinks so Codex/Antigravity pick the skills up inside this repo
|
|
590
690
|
bin/spec-driven-dev.cjs launcher (runs on any Node, explains if it's too old)
|
|
591
|
-
bin/cli.mjs the `spec-driven-dev` CLI: installer, setup menus, doctor, status
|
|
592
|
-
package.json npm package (ships bin/ and skills/)
|
|
691
|
+
bin/cli.mjs the `spec-driven-dev` CLI: installer, setup menus, doctor, status, context
|
|
692
|
+
package.json npm package (ships bin/ and plugin/skills/)
|
|
593
693
|
mcp-server/ MCP fallback server
|
|
594
|
-
hooks/hooks.json Claude Code session-start hook (runs `cli.mjs status`)
|
|
595
694
|
CHANGELOG.md what changed in each version
|
|
596
695
|
scripts/check.py consistency checks + metrics generator
|
|
597
696
|
scripts/test-cli.mjs installer self-test (fake HOME, throwaway repos)
|
|
598
697
|
.github/workflows/check.yml CI: consistency checks + installer self-test on every push and PR
|
|
599
698
|
.github/workflows/publish.yml publishes to npm when a vX.Y.Z tag is pushed
|
|
600
|
-
evals/
|
|
699
|
+
plugin/evals/ `claude plugin eval` cases
|
|
601
700
|
```
|
|
602
701
|
|
|
603
|
-
- **Adding a skill:** create `skills/<name>/SKILL.md`, then add the name to the two manifests, a `.agents/skills/<name>` symlink, the `STAGES` map in
|
|
702
|
+
- **Adding a skill:** create `plugin/skills/<name>/SKILL.md`, then add the name to the two manifests, a `.agents/skills/<name>` symlink, the `STAGES` map in
|
|
604
703
|
`scripts/check.py`, and this README. `python3 scripts/check.py` lists anything you missed.
|
|
605
704
|
- **Before pushing:** run `python3 scripts/check.py --fix`, then `npm test` (which runs the checks
|
|
606
705
|
and the installer self-test). CI (`.github/workflows/check.yml`) runs
|
|
607
706
|
the same checks, the installer self-test, and a syntax check on the MCP server.
|
|
608
|
-
- **Evals:** `claude plugin eval
|
|
707
|
+
- **Evals:** `claude plugin eval plugin --runs 1` checks that skills trigger on their phrases and stay
|
|
609
708
|
within their own stage. These runs use your Claude credentials, so they aren't part of CI.
|
|
610
709
|
- **Skill rules** (from [Anthropic's skill authoring guide](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices),
|
|
611
710
|
enforced by `scripts/check.py`):
|
|
@@ -615,10 +714,10 @@ evals/ `claude plugin eval` cases
|
|
|
615
714
|
- `SKILL.md` stays under 500 lines, with detail in `references/` one link deep.
|
|
616
715
|
- Facts are read from the repo, not assumed.
|
|
617
716
|
- **Releasing:**
|
|
618
|
-
1. Increase `version` in both `package.json` and
|
|
717
|
+
1. Increase `version` in both `package.json` and `plugin/.claude-plugin/plugin.json` (the check fails if
|
|
619
718
|
they differ).
|
|
620
719
|
2. Add a `CHANGELOG.md` entry, then commit and push.
|
|
621
|
-
3. Tag the release and push the tag: `git tag v1.
|
|
720
|
+
3. Tag the release and push the tag: `git tag v1.10.0 && git push origin v1.10.0`.
|
|
622
721
|
4. Watch the **publish** run in the repo's Actions tab. When it's green, the new version is on
|
|
623
722
|
npm. Claude Code plugin users get it from the marketplace once the commit is on `main`.
|
|
624
723
|
|