@benjaminthomas/spec-driven-dev 1.16.3 → 1.17.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/README.md +21 -7
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/skills/spec-implement/SKILL.md +3 -0
- package/plugin/skills/spec-investigate/SKILL.md +5 -0
- package/plugin/skills/spec-review/SKILL.md +43 -1
- package/plugin/skills/spec-setup/SKILL.md +5 -2
- package/plugin/skills/spec-setup/references/config-template.yml +2 -0
- package/plugin/skills/spec-setup/references/tracker-updates.md +60 -0
- package/plugin/skills/spec-ship/SKILL.md +8 -0
- package/plugin/skills/spec-verify/SKILL.md +3 -0
package/README.md
CHANGED
|
@@ -190,6 +190,20 @@ changes. From a terminal: `spec-driven-dev setup --join=../soreto-specs`. Changi
|
|
|
190
190
|
edit to `team.yml` and a commit, and anything set in your own file overrides it for you only (`doctor`
|
|
191
191
|
lists those overrides). An existing setup can be converted with `spec-driven-dev team init`.
|
|
192
192
|
|
|
193
|
+
**After the PR is reviewed.** When reviewers leave comments, say "address the PR comments". Each
|
|
194
|
+
comment is checked against the code and sorted (fix, scope change, question, disagree, nit), and you
|
|
195
|
+
choose which to act on. The changes then go through the stages again (implement → verify → review →
|
|
196
|
+
checkpoint → ship) onto the same PR, never as a quick push. A comment that changes the requirements
|
|
197
|
+
updates the spec and waits for your approval first. Replies go on each thread once you've seen them.
|
|
198
|
+
|
|
199
|
+
**The ticket keeps up with the work.** When your AI tool can reach the tracker (a Jira/Atlassian,
|
|
200
|
+
GitHub or Linear MCP server, or `gh`/`acli`), the pipeline updates the ticket: investigate comments
|
|
201
|
+
with the summary, implement moves it to *In Progress*, verify comments with each acceptance criterion
|
|
202
|
+
and its pass/fail, review with the blocker count, and ship moves it to *In Review* with the PR link.
|
|
203
|
+
Status names come from your project's real workflow (asked once, saved in `team.yml`); it never closes
|
|
204
|
+
a ticket. It asks before the first update on each ticket; say "update Jira without asking" or "stop
|
|
205
|
+
updating Jira" to change that (`tracker.updates: on | ask | off`).
|
|
206
|
+
|
|
193
207
|
**For scripts and CI** there's `spec-driven-dev setup` with flags (it asks nothing):
|
|
194
208
|
`--yes`, `--layout=multi-repo --repos=~/Projects/frontend,~/Work/backend --workspace=~/Projects`,
|
|
195
209
|
`--layout=monorepo --packages=apps/web,packages/ui`, `--specs-dir=<path>`, `--share=all|memory|none`,
|
|
@@ -787,16 +801,16 @@ skips that step rather than failing.
|
|
|
787
801
|
|
|
788
802
|
| Skill | Stage | SKILL.md lines | Words | Supporting files |
|
|
789
803
|
|---|---|---:|---:|---:|
|
|
790
|
-
| `spec-setup` | 0 · configure |
|
|
791
|
-
| `spec-investigate` | 1 · understand |
|
|
804
|
+
| `spec-setup` | 0 · configure | 311 | 3,468 | 5 |
|
|
805
|
+
| `spec-investigate` | 1 · understand | 392 | 3,429 | 1 |
|
|
792
806
|
| `spec-create` | 2 · plan | 198 | 1,806 | 6 |
|
|
793
|
-
| `spec-implement` | 3 · build |
|
|
794
|
-
| `spec-verify` | 4 · prove |
|
|
795
|
-
| `spec-review` | 5 · review |
|
|
807
|
+
| `spec-implement` | 3 · build | 330 | 2,813 | 3 |
|
|
808
|
+
| `spec-verify` | 4 · prove | 166 | 1,610 | 1 |
|
|
809
|
+
| `spec-review` | 5 · review | 179 | 1,817 | 1 |
|
|
796
810
|
| `spec-checkpoint` | 6 · commit | 140 | 1,168 | 0 |
|
|
797
|
-
| `spec-ship` | 7 · PR |
|
|
811
|
+
| `spec-ship` | 7 · PR | 238 | 1,494 | 0 |
|
|
798
812
|
| `generative-seo` | standalone | 255 | 2,209 | 7 |
|
|
799
|
-
| **Total** | | **2,
|
|
813
|
+
| **Total** | | **2,209** | **19,814** | **24** |
|
|
800
814
|
|
|
801
815
|
- **8** skills: **1** setup + **6** workflow stages + **1** standalone
|
|
802
816
|
- **4** tools supported natively (Claude Code, Codex CLI, Cursor, Antigravity), plus an MCP fallback
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@benjaminthomas/spec-driven-dev",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"description": "Spec-driven AI development workflow (investigate → spec → implement → verify → review → ship) as Agent Skills for Claude Code, Cursor, Codex CLI and Antigravity.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ticket-to-pr",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"description": "Parallel-batch spec-driven feature workflow (spec-setup, spec-investigate, spec-create, spec-implement, spec-verify, spec-review, spec-checkpoint, spec-ship) plus a portable SEO/GEO operations skill (generative-seo) for any codebase.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Benjamin Thomas",
|
|
@@ -86,6 +86,9 @@ This structure is produced by the `spec-create` skill. If the user doesn't have
|
|
|
86
86
|
4. Determine the **current batch**: the first batch that has any incomplete tasks
|
|
87
87
|
5. If all tasks in all batches are complete, report "All tasks complete!" and stop
|
|
88
88
|
|
|
89
|
+
6. **Tracker update** (first batch only, when it came from a ticket and `tracker.updates` isn't
|
|
90
|
+
`off`): follow `tracker-updates.md` in the installed `spec-setup` skill's references folder and move the ticket to its `start` status. No comment here.
|
|
91
|
+
|
|
89
92
|
This makes the skill **resumable** — if invoked on a partially completed spec, it picks up exactly where it left off.
|
|
90
93
|
|
|
91
94
|
### Step 2: Process Each Batch
|
|
@@ -355,6 +355,11 @@ evidence points to — reusing existing patterns the investigation actually foun
|
|
|
355
355
|
architecture invented on the spot. It is not permission to start building; flag any business
|
|
356
356
|
decision it depends on.
|
|
357
357
|
|
|
358
|
+
## Step 9b — Tracker update
|
|
359
|
+
|
|
360
|
+
If the work came from a ticket and `tracker.updates` isn't `off`, follow `tracker-updates.md` in the installed `spec-setup` skill's references folder: post the
|
|
361
|
+
investigation summary as a comment. Don't change the status here.
|
|
362
|
+
|
|
358
363
|
## Step 10 — Stop, hand off, don't bleed into the next stage
|
|
359
364
|
|
|
360
365
|
Report completion plainly:
|
|
@@ -8,7 +8,10 @@ description: >
|
|
|
8
8
|
blockers. Use after spec-verify, when the user says "review this", "code review", "review the
|
|
9
9
|
branch", "review PR #42", "is this ready to merge", or "/spec-review". Also works with no spec
|
|
10
10
|
folder, on any branch, diff, or pull request, including a teammate's. Reports findings and offers
|
|
11
|
-
fixes; it changes code only after the user says yes, through spec-implement's fix loop.
|
|
11
|
+
fixes; it changes code only after the user says yes, through spec-implement's fix loop. Also
|
|
12
|
+
handles the reviewers' comments once the PR is open ("address the PR comments", "the PR got
|
|
13
|
+
review feedback", "changes requested on PR #42"): triages them, then runs the changes back
|
|
14
|
+
through implement → verify → review → checkpoint → ship on the same PR.
|
|
12
15
|
license: MIT
|
|
13
16
|
---
|
|
14
17
|
|
|
@@ -99,6 +102,9 @@ Write `{specs_dir}/{feature}/review.md` using `references/report-template.md`. W
|
|
|
99
102
|
| **nit** | small and optional | listed once, never blocks |
|
|
100
103
|
| **question** | needs the author's intent to judge | asked, never blocks |
|
|
101
104
|
|
|
105
|
+
**Tracker update.** If the work came from a ticket and `tracker.updates` isn't `off`,
|
|
106
|
+
follow `tracker-updates.md` in the installed `spec-setup` skill's references folder: post the severity counts and each blocker as a comment.
|
|
107
|
+
|
|
102
108
|
Then append one line to `log.md` (counts per severity) and overwrite the README's **Resume here**:
|
|
103
109
|
`Stage: reviewed (B blockers, S should-fix)`, `Next: fix blockers` or `Next: spec-checkpoint`.
|
|
104
110
|
|
|
@@ -119,6 +125,42 @@ Fix the blockers and should-fix items now? (y / pick numbers / n)
|
|
|
119
125
|
- **Someone else's PR:** never push to their branch. Offer to post the findings as PR review
|
|
120
126
|
comments (`gh pr review`), and do it only after the user says yes and has seen the text.
|
|
121
127
|
|
|
128
|
+
## PR feedback (after the PR is open)
|
|
129
|
+
|
|
130
|
+
When reviewers comment on the PR ("address the PR comments", "changes requested on #42"), the
|
|
131
|
+
changes go through the pipeline again, on the same branch and the same PR. Never push a quick fix
|
|
132
|
+
straight to the PR.
|
|
133
|
+
|
|
134
|
+
1. **Collect.** `gh pr view <n> --json number,url,reviewDecision,reviews,comments` plus the inline
|
|
135
|
+
threads (`gh api graphql` for `reviewThreads` with `isResolved`, `path`, `line`, `comments`).
|
|
136
|
+
Keep only unresolved threads and review bodies after the last push.
|
|
137
|
+
2. **Triage each one, checked against the code** (same rule as the passes above):
|
|
138
|
+
- **fix**: a real problem in what was built. Becomes a fix item.
|
|
139
|
+
- **scope change**: asks for something the spec didn't cover, or changes a requirement.
|
|
140
|
+
Add it to `requirements.md` as a new R-id marked `(from PR review, <reviewer>)`, update the
|
|
141
|
+
affected task files, and **stop for the user's approval of the spec**, as after spec-create.
|
|
142
|
+
- **question**: answer it from the code and the spec; no change.
|
|
143
|
+
- **disagree**: you think the current code is right. Say why with evidence; the user decides.
|
|
144
|
+
- **nit**: small and optional.
|
|
145
|
+
Show the list numbered, with the reviewer and `path:line`, and ask which to act on. Never
|
|
146
|
+
dismiss a reviewer's comment silently.
|
|
147
|
+
3. **Run the stages again** for the chosen items:
|
|
148
|
+
`spec-implement` (fix loop, one round, grouped by task) → `spec-verify` (the criteria the
|
|
149
|
+
changes touch, plus lint, typecheck and tests) → this skill on the changed lines only →
|
|
150
|
+
`spec-checkpoint` → `spec-ship`, which pushes to the existing PR instead of opening a new one.
|
|
151
|
+
In stop mode, pause after each stage as usual. A blocker found on the way stops it.
|
|
152
|
+
4. **Reply on the PR** after the push, only on a yes and after the user has seen the text: one
|
|
153
|
+
reply per thread saying what changed and the commit (`fixed in abc1234: …`), or the answer.
|
|
154
|
+
Don't resolve threads; that's the reviewer's call. Then ask the reviewers again
|
|
155
|
+
(`gh pr edit <n> --add-reviewer …`) if the user wants.
|
|
156
|
+
5. **Record.** Add a `## PR feedback, round N` section to `review.md` (each comment, its triage,
|
|
157
|
+
the outcome). Append one line to `log.md`, and overwrite **Resume here**:
|
|
158
|
+
`Stage: PR feedback round N (F fixes, S scope changes)`, `Next: <the stage it's at>`.
|
|
159
|
+
6. **Tracker update** (`tracker.updates` not `off`): follow `tracker-updates.md` in the installed
|
|
160
|
+
`spec-setup` skill's references folder. Comment "review feedback round N addressed: …"
|
|
161
|
+
with the counts and the commit. If people moved the ticket back (e.g. to *In Progress*),
|
|
162
|
+
spec-ship moves it to `review` again when it pushes.
|
|
163
|
+
|
|
122
164
|
## Run-through
|
|
123
165
|
|
|
124
166
|
In run-through mode (see `spec-implement`), this runs after verify passes. **Any blocker stops the
|
|
@@ -204,7 +204,8 @@ evidence in the description, then the common alternatives:
|
|
|
204
204
|
`Jira, key STP (Recommended)`: "STP-123 in recent branches", `GitHub Issues`, `Linear`, `None`), then
|
|
205
205
|
sharing (if specs are inside a repo), after approval (stop / run straight through), and any command
|
|
206
206
|
that's a guess (e.g. typecheck). At most 4; a guessed command that doesn't fit goes in the summary as
|
|
207
|
-
"I'll use X, say if that's wrong".
|
|
207
|
+
"I'll use X, say if that's wrong". Don't ask about tracker updates: they default to `ask`, so the
|
|
208
|
+
first update on each ticket is confirmed then. Mention it in one line of the summary.
|
|
208
209
|
|
|
209
210
|
Then the open questions, as plain text (see How to ask).
|
|
210
211
|
|
|
@@ -284,7 +285,9 @@ keep every other line and comment, and confirm in one sentence. Don't re-run dis
|
|
|
284
285
|
| "run straight through after I approve", "fewer stops" | `pipeline.after_approval: run-through` |
|
|
285
286
|
| "stop after each stage" | `pipeline.after_approval: stop` |
|
|
286
287
|
| "change our branch rules", "use main for PRs" (when `team.yml` exists) | edit `team.yml`, since it's a team rule, and remind them to commit it; only change `.spec-driven.yml` if they say it's just for them |
|
|
287
|
-
| "
|
|
288
|
+
| "stop updating Jira", "don't comment on tickets", "update Jira without asking" | `tracker.updates: off` / `on` (default `ask`), in `team.yml` when it exists; see `references/tracker-updates.md` |
|
|
289
|
+
| "our statuses are To Do / Doing / Code Review" | `tracker.statuses.start` / `.review`, from the project's real transitions |
|
|
290
|
+
| "add reverb-react to the workspace", "I also work on X" | check each named repo first and say what you found, per repo: **already in the workspace** (change nothing for it), **in `team-repos.yml` but not cloned here** (offer the `git clone`), **not found** (ask for its path), or **new**. For new ones: add under `repos:` and to `team-repos.yml` if new to the team, audit only that repo and add its areas to `CONTEXT.md` (Step 4), re-run `spec-driven-dev risk`, offer the pointer line for it (Step 4, item 5), then `doctor` |
|
|
288
291
|
| "share the specs with the team", "keep specs local", "share only the project memory" | `context.share: all / none / memory`: show the `.gitignore` change, then run `spec-driven-dev settings --share=…` on a yes |
|
|
289
292
|
|
|
290
293
|
Reply with what changed and what it means, for example: "GitRisk is now off. Investigations, plans
|
|
@@ -26,6 +26,8 @@ tracker:
|
|
|
26
26
|
type: jira # jira | github | linear | none
|
|
27
27
|
key: STP # ticket key prefix (jira/linear); omit for github/none
|
|
28
28
|
url: https://example.atlassian.net # site/org/repo URL, if any
|
|
29
|
+
updates: ask # move the ticket and post stage comments when a tracker tool is connected: ask | on | off
|
|
30
|
+
# statuses: { start: In Progress, review: In Review } # filled from the project's real workflow on first use
|
|
29
31
|
|
|
30
32
|
git:
|
|
31
33
|
remote: origin
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Tracker updates (status and comments)
|
|
2
|
+
|
|
3
|
+
When a tracker tool is connected (a Jira/Atlassian, GitHub or Linear MCP server, or the `gh`, `acli`
|
|
4
|
+
or `jira` CLI), the pipeline keeps the ticket in step with the work, so the team can see in the
|
|
5
|
+
tracker that it was investigated, verified and reviewed. Every pipeline skill follows these rules.
|
|
6
|
+
|
|
7
|
+
## Settings (`tracker.updates` in team.yml or .spec-driven.yml)
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
tracker:
|
|
11
|
+
updates: ask # ask (default) | on | off
|
|
12
|
+
statuses: # this project's real status names; leave a stage out to never move it
|
|
13
|
+
start: In Progress # when implementation starts
|
|
14
|
+
review: In Review # when the PR is open
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- `off`: never write to the tracker. `ask`: confirm the first write for each ticket, then go on
|
|
18
|
+
for the rest of that ticket. `on`: write without asking.
|
|
19
|
+
- Never post anything when there's no ticket (no tracker, or the work started from a doc or a
|
|
20
|
+
description).
|
|
21
|
+
|
|
22
|
+
## Statuses: read, never guess
|
|
23
|
+
|
|
24
|
+
Workflows differ in every team. The first time a move is needed and `tracker.statuses` is unset,
|
|
25
|
+
read the ticket's real transitions (Jira: `getTransitionsForJiraIssue`; Linear: the team's states;
|
|
26
|
+
GitHub: labels or a Projects status field, if the team uses one), propose a mapping for `start`
|
|
27
|
+
and `review`, and save it to `team.yml` (shared) on a yes. Move a ticket only along a transition
|
|
28
|
+
it offers right now. Never move it backwards, never close it or mark it Done (that's for
|
|
29
|
+
people, after merge), and never move a ticket assigned to someone else without asking.
|
|
30
|
+
|
|
31
|
+
## When to write
|
|
32
|
+
|
|
33
|
+
| Stage | Status | Comment |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| spec-investigate done | — | summary: root cause or approach, repos affected, top risks, open questions |
|
|
36
|
+
| spec-implement starts | `start` | — |
|
|
37
|
+
| spec-verify done | — | each acceptance criterion with pass/fail and one line of evidence; overall N of M pass |
|
|
38
|
+
| spec-review done | — | blocker / should-fix / nit counts, and each blocker in one line |
|
|
39
|
+
| spec-ship done | `review` | PR link, plus "verified N/M, review: no blockers" |
|
|
40
|
+
| PR feedback round done | `review` (only if people moved it back) | "review feedback round N addressed": fixes, scope changes, commit |
|
|
41
|
+
|
|
42
|
+
One comment per stage. A rerun replaces nothing: it posts a new, shorter comment saying what
|
|
43
|
+
changed ("re-verified after fix: 12/12 pass").
|
|
44
|
+
|
|
45
|
+
## What a comment looks like
|
|
46
|
+
|
|
47
|
+
Short, factual, readable by someone who never saw the spec. Start with the stage and the result,
|
|
48
|
+
then at most 8 lines. Name file paths, never paste code, secrets, tokens, customer data or env
|
|
49
|
+
values. Example:
|
|
50
|
+
|
|
51
|
+
> **Verified (spec-driven-dev)**: 11 of 12 acceptance criteria pass.
|
|
52
|
+
> - ✓ R1 discount applies at checkout (dev store, order #1043)
|
|
53
|
+
> - ✗ R4 email copy: still shows the old text (screenshot in verification-report.md)
|
|
54
|
+
> Spec: `soreto-specs/STP-123/`
|
|
55
|
+
|
|
56
|
+
## Failure and fallback
|
|
57
|
+
|
|
58
|
+
- No tracker tool connected, or a write fails: don't retry in a loop and don't block the stage.
|
|
59
|
+
Print the comment text so the user can paste it, and say which status change didn't happen.
|
|
60
|
+
- Record each write in `log.md` (`tracker: moved to In Progress`, `tracker: posted verify comment`).
|
|
@@ -199,10 +199,18 @@ EOF
|
|
|
199
199
|
)"
|
|
200
200
|
```
|
|
201
201
|
|
|
202
|
+
After the report, tell the user the next step: when reviewers leave comments, say "address the PR
|
|
203
|
+
comments", which runs them back through the pipeline (spec-review's **PR feedback**). A push for
|
|
204
|
+
a feedback round goes to the existing PR (Step 6).
|
|
205
|
+
|
|
202
206
|
If this branch belongs to a spec, overwrite its README's **Resume here** (`Stage: PR open`,
|
|
203
207
|
`Next: review`, the PR URL) and append one line to `log.md`. Commit that only if the user
|
|
204
208
|
agrees; otherwise leave it for the next checkpoint.
|
|
205
209
|
|
|
210
|
+
**Tracker update.** If the branch came from a ticket and `tracker.updates` isn't `off`,
|
|
211
|
+
follow `tracker-updates.md` in the installed `spec-setup` skill's references folder: move the ticket to its `review` status and comment with the PR link and the verify and
|
|
212
|
+
review results.
|
|
213
|
+
|
|
206
214
|
### Step 8: Report
|
|
207
215
|
|
|
208
216
|
Display the result clearly:
|
|
@@ -147,6 +147,9 @@ exact structure (a summary line, then a table of criterion → source → verdic
|
|
|
147
147
|
Update `specs/{feature}/README.md` with a short **Verification** section linking to the report
|
|
148
148
|
and stating the overall status (all pass / N of M pass).
|
|
149
149
|
|
|
150
|
+
**Tracker update.** If the spec came from a ticket and `tracker.updates` isn't `off`,
|
|
151
|
+
follow `tracker-updates.md` in the installed `spec-setup` skill's references folder: post the per-criterion result as a comment.
|
|
152
|
+
|
|
150
153
|
Then tell the user directly:
|
|
151
154
|
|
|
152
155
|
```
|