@benjaminthomas/spec-driven-dev 1.16.1 → 1.16.3
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
|
@@ -787,7 +787,7 @@ skips that step rather than failing.
|
|
|
787
787
|
|
|
788
788
|
| Skill | Stage | SKILL.md lines | Words | Supporting files |
|
|
789
789
|
|---|---|---:|---:|---:|
|
|
790
|
-
| `spec-setup` | 0 · configure |
|
|
790
|
+
| `spec-setup` | 0 · configure | 308 | 3,333 | 4 |
|
|
791
791
|
| `spec-investigate` | 1 · understand | 387 | 3,391 | 1 |
|
|
792
792
|
| `spec-create` | 2 · plan | 198 | 1,806 | 6 |
|
|
793
793
|
| `spec-implement` | 3 · build | 327 | 2,777 | 3 |
|
|
@@ -796,7 +796,7 @@ skips that step rather than failing.
|
|
|
796
796
|
| `spec-checkpoint` | 6 · commit | 140 | 1,168 | 0 |
|
|
797
797
|
| `spec-ship` | 7 · PR | 230 | 1,412 | 0 |
|
|
798
798
|
| `generative-seo` | standalone | 255 | 2,209 | 7 |
|
|
799
|
-
| **Total** | | **2,
|
|
799
|
+
| **Total** | | **2,145** | **18,995** | **23** |
|
|
800
800
|
|
|
801
801
|
- **8** skills: **1** setup + **6** workflow stages + **1** standalone
|
|
802
802
|
- **4** tools supported natively (Claude Code, Codex CLI, Cursor, Antigravity), plus an MCP fallback
|
package/bin/cli.mjs
CHANGED
|
@@ -987,11 +987,12 @@ function teamInit() {
|
|
|
987
987
|
const { team, personal: mine } = splitConfig(personal);
|
|
988
988
|
fs.mkdirSync(path.dirname(tf), { recursive: true });
|
|
989
989
|
fs.writeFileSync(tf, TEAM_HEADER + dumpYaml(team));
|
|
990
|
-
|
|
990
|
+
// --fresh: spec-setup wrote this file moments ago in the same run, so a backup would only be clutter.
|
|
991
|
+
const saved = flag("fresh") ? null : backup(file);
|
|
991
992
|
fs.writeFileSync(file, PERSONAL_HEADER(path.relative(path.dirname(file), tf)) + dumpYaml(mine));
|
|
992
993
|
step(1, "Team rules shared", ink.cyan);
|
|
993
994
|
console.log(`✓ Wrote ${tf} (tracker, git conventions, commands, models, GitRisk, sharing)
|
|
994
|
-
✓ ${file} now keeps only your local settings (the old file is saved as ${path.basename(saved)})
|
|
995
|
+
✓ ${file} now keeps only your local settings${saved ? ` (the old file is saved as ${path.basename(saved)})` : ""}
|
|
995
996
|
Next: commit team.yml in the specs repo. Colleagues who clone it run: spec-driven-dev setup --join=<path to the specs repo>
|
|
996
997
|
or say "run spec-setup" in their AI tool, which finds it and offers to join.`);
|
|
997
998
|
}
|
package/bin/team.mjs
CHANGED
|
@@ -49,7 +49,7 @@ export function dumpYaml(obj, indent = "") {
|
|
|
49
49
|
const scalar = (v) => (typeof v === "string" ? (/^[\w./@~-]+$/.test(v) && !/^(on|off|yes|no|true|false|null|\d.*)$/i.test(v) ? v : JSON.stringify(v)) : String(v));
|
|
50
50
|
let out = "";
|
|
51
51
|
for (const [k, v] of Object.entries(obj)) {
|
|
52
|
-
if (v === undefined || v === null || (isObj(v) && !Object.keys(v).length)) continue;
|
|
52
|
+
if (v === undefined || v === null || v === "" || (isObj(v) && !Object.keys(v).length)) continue; // "" means unset
|
|
53
53
|
if (Array.isArray(v)) {
|
|
54
54
|
out += `${indent}${k}:\n`;
|
|
55
55
|
for (const item of v) {
|
|
@@ -57,7 +57,7 @@ export function dumpYaml(obj, indent = "") {
|
|
|
57
57
|
const body = dumpYaml(item, `${indent} `).replace(/^\s+/, "");
|
|
58
58
|
out += `${indent} - ${body}`;
|
|
59
59
|
}
|
|
60
|
-
} else if (isObj(v)) out += `${indent}${k}:\n${
|
|
60
|
+
} else if (isObj(v)) { const body = dumpYaml(v, `${indent} `); if (body) out += `${indent}${k}:\n${body}`; }
|
|
61
61
|
else out += `${indent}${k}: ${scalar(v)}\n`;
|
|
62
62
|
}
|
|
63
63
|
return out;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@benjaminthomas/spec-driven-dev",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.3",
|
|
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.
|
|
3
|
+
"version": "1.16.3",
|
|
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",
|
|
@@ -51,7 +51,8 @@ names (a path, or a git URL to clone). If you find one, say so with what it is,
|
|
|
51
51
|
mark the ones not cloned here and offer their `git clone` command, cloning only on a yes), then run
|
|
52
52
|
`spec-driven-dev setup --join=<specs repo> --repos=<chosen>` (or `npx -y @benjaminthomas/spec-driven-dev …`).
|
|
53
53
|
Don't audit, don't ask about conventions, and never change the team's files: `CONTEXT.md`,
|
|
54
|
-
`team.yml` and `team-repos.yml` are shared. Then run `doctor
|
|
54
|
+
`team.yml` and `team-repos.yml` are shared. Then run `doctor`. If any of their repos lack the
|
|
55
|
+
pointer line (Step 4, item 5), offer to add it there. Finish with "You've joined. Say
|
|
55
56
|
*investigate STP-123* to start." Only `team-repos.yml` and no `team.yml` (an older setup): join
|
|
56
57
|
anyway, and tell the user the team's rules aren't shared yet, so the person who set it up should
|
|
57
58
|
run `spec-driven-dev team init`.
|
|
@@ -223,8 +224,9 @@ for the rest.
|
|
|
223
224
|
under `repos:` where they differ from the top level.
|
|
224
225
|
2. If it's inside a repo, tell the user it's meant to be committed (so teammates get the same
|
|
225
226
|
rules) — don't commit it yourself.
|
|
226
|
-
**Multi-repo with specs in a repo:** run `spec-driven-dev team init` right after writing
|
|
227
|
-
file
|
|
227
|
+
**Multi-repo with specs in a repo:** run `spec-driven-dev team init --fresh` right after writing
|
|
228
|
+
the file (`--fresh` skips the backup, since you wrote the file this run; leave it off when
|
|
229
|
+
splitting a config that existed before). It moves the team's rules (tracker, git conventions, commands, models, GitRisk, sharing)
|
|
228
230
|
into `{specs_dir}/team.yml`, which is committed with the specs, and leaves only local paths in
|
|
229
231
|
`.spec-driven.yml`. Tell the user to commit `team.yml`, and that colleagues then just say
|
|
230
232
|
"run spec-setup" and choose *Join*.
|
|
@@ -250,10 +252,18 @@ Skip if `{specs_dir}/CONTEXT.md` already exists (offer a refresh instead, see `r
|
|
|
250
252
|
`npx -y @benjaminthomas/spec-driven-dev risk`) to write `{specs_dir}/context/risk.md`. It uses
|
|
251
253
|
git only, no model, and adds `risk.md` to `.gitignore` because it's regenerated on every run. Skip it for a new project with no history. Mention the hotspot count in the
|
|
252
254
|
report. Set `risk.enabled: off` only if the user doesn't want it.
|
|
253
|
-
5. **Offer, don't do:** ask whether to add
|
|
254
|
-
|
|
255
|
-
`For spec work, read specs/CONTEXT.md first, then the "Resume here" block of any unfinished spec.`
|
|
256
|
-
|
|
255
|
+
5. **Offer, don't do:** ask whether to add one pointer line to `CLAUDE.md` / `AGENTS.md` (whichever
|
|
256
|
+
each repo uses), so hosts reload the project memory after compaction and in every new session.
|
|
257
|
+
- Single repo or monorepo: `For spec work, read specs/CONTEXT.md first, then the "Resume here" block of any unfinished spec.`
|
|
258
|
+
- Multi-repo: offer it for **every repo in this person's workspace** in one question, not just
|
|
259
|
+
the current one. Name the specs repo rather than assuming a layout:
|
|
260
|
+
`For spec work, read CONTEXT.md in the <specs repo name> repo first (usually ../<specs repo name>/CONTEXT.md), then the "Resume here" block of any unfinished spec.`
|
|
261
|
+
- Skip repos that already have a line mentioning `CONTEXT.md`. It's committed with each repo, so
|
|
262
|
+
teammates get it when they pull, and nobody adds it twice.
|
|
263
|
+
Add it only on a yes, and never commit. Each repo is its own commit; list them in the report, in
|
|
264
|
+
that repo's commit style and onto its base branch (e.g. `git -C reverb-backend commit -m "STP-123:
|
|
265
|
+
point AI tools to the project memory" AGENTS.md`). If a repo is on a feature branch, say the edit
|
|
266
|
+
is there and suggest committing it on its own so it doesn't ride along in that PR.
|
|
257
267
|
6. Re-run `npx -y @benjaminthomas/spec-driven-dev doctor` if available. It checks the size limits
|
|
258
268
|
and flags context lines that point to files which no longer exist.
|
|
259
269
|
|
|
@@ -40,7 +40,10 @@ never ask again.
|
|
|
40
40
|
|
|
41
41
|
## 3. Discovery questions (one round)
|
|
42
42
|
|
|
43
|
-
Show the draft map first
|
|
43
|
+
Show the draft map first. Give it a **Source** column and fill it on every line: **detected**
|
|
44
|
+
with the file or command it came from (`AGENTS.md:12`, `git log`), or **guess**. One note for the
|
|
45
|
+
whole table isn't enough. Count anything you report (spec folders, repos, files) with a command,
|
|
46
|
+
never by eye. Then
|
|
44
47
|
ask only what the code can't answer, as **plain text in one message**, after the setup choices have
|
|
45
48
|
been answered. These are open questions, so
|
|
46
49
|
never put them in a menu or multiple-choice tool (a menu needs two or more real options, and these
|