@benjaminthomas/spec-driven-dev 1.16.4 → 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 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 | 308 | 3,393 | 4 |
791
- | `spec-investigate` | 1 · understand | 387 | 3,391 | 1 |
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 | 327 | 2,777 | 3 |
794
- | `spec-verify` | 4 · prove | 163 | 1,581 | 1 |
795
- | `spec-review` | 5 · review | 137 | 1,318 | 1 |
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 | 230 | 1,412 | 0 |
811
+ | `spec-ship` | 7 · PR | 238 | 1,494 | 0 |
798
812
  | `generative-seo` | standalone | 255 | 2,209 | 7 |
799
- | **Total** | | **2,145** | **19,055** | **23** |
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.16.4",
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.16.4",
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,6 +285,8 @@ 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 |
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 |
287
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
 
@@ -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
  ```