@benjaminthomas/spec-driven-dev 1.16.1 → 1.16.2

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 | 298 | 3,141 | 4 |
790
+ | `spec-setup` | 0 · configure | 299 | 3,163 | 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,135** | **18,803** | **23** |
799
+ | **Total** | | **2,136** | **18,825** | **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
- const saved = backup(file);
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${dumpYaml(v, `${indent} `)}`;
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.1",
3
+ "version": "1.16.2",
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.1",
3
+ "version": "1.16.2",
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",
@@ -223,8 +223,9 @@ for the rest.
223
223
  under `repos:` where they differ from the top level.
224
224
  2. If it's inside a repo, tell the user it's meant to be committed (so teammates get the same
225
225
  rules) — don't commit it yourself.
226
- **Multi-repo with specs in a repo:** run `spec-driven-dev team init` right after writing the
227
- file. It moves the team's rules (tracker, git conventions, commands, models, GitRisk, sharing)
226
+ **Multi-repo with specs in a repo:** run `spec-driven-dev team init --fresh` right after writing
227
+ the file (`--fresh` skips the backup, since you wrote the file this run; leave it off when
228
+ splitting a config that existed before). It moves the team's rules (tracker, git conventions, commands, models, GitRisk, sharing)
228
229
  into `{specs_dir}/team.yml`, which is committed with the specs, and leaves only local paths in
229
230
  `.spec-driven.yml`. Tell the user to commit `team.yml`, and that colleagues then just say
230
231
  "run spec-setup" and choose *Join*.
@@ -40,7 +40,10 @@ never ask again.
40
40
 
41
41
  ## 3. Discovery questions (one round)
42
42
 
43
- Show the draft map first, with each line marked **detected** (with its source) or **guess**. Then
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