@benjaminthomas/spec-driven-dev 1.16.0 → 1.16.1

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
@@ -849,7 +849,7 @@ plugin/evals/ `claude plugin eval` cases
849
849
  1. Increase `version` in both `package.json` and `plugin/.claude-plugin/plugin.json` (the check fails if
850
850
  they differ).
851
851
  2. Add a `CHANGELOG.md` entry, then commit and push.
852
- 3. Tag the release and push the tag: `git tag v1.16.0 && git push origin v1.16.0`.
852
+ 3. Tag the release and push the tag: `git tag v1.16.1 && git push origin v1.16.1`.
853
853
  4. Watch the **publish** run in the repo's Actions tab. When it's green, the new version is on
854
854
  npm. Claude Code plugin users get it from the marketplace once the commit is on `main`.
855
855
 
package/bin/cli.mjs CHANGED
@@ -592,6 +592,14 @@ function configApplies(f, dir) {
592
592
  return here === real(base) || c.repos.some((r) => { const p = real(path.resolve(base, expandHome(String(r.path || "")))); return here === p || here.startsWith(p + path.sep); });
593
593
  }
594
594
 
595
+ // Back up a file without ever overwriting an older backup (that would lose the user's original).
596
+ function backup(file) {
597
+ let b = `${file}.bak`;
598
+ if (fs.existsSync(b)) b = `${file}.bak-${new Date().toISOString().replace(/[-:]/g, "").replace("T", "-").slice(0, 15)}`;
599
+ fs.copyFileSync(file, b);
600
+ return b;
601
+ }
602
+
595
603
  // The effective config: the team's rules (team.yml in the specs repo) with the personal file on top.
596
604
  function readConfig(file) {
597
605
  const personal = parseYaml(fs.readFileSync(file, "utf8"));
@@ -979,11 +987,11 @@ function teamInit() {
979
987
  const { team, personal: mine } = splitConfig(personal);
980
988
  fs.mkdirSync(path.dirname(tf), { recursive: true });
981
989
  fs.writeFileSync(tf, TEAM_HEADER + dumpYaml(team));
982
- fs.copyFileSync(file, `${file}.bak`);
990
+ const saved = backup(file);
983
991
  fs.writeFileSync(file, PERSONAL_HEADER(path.relative(path.dirname(file), tf)) + dumpYaml(mine));
984
992
  step(1, "Team rules shared", ink.cyan);
985
993
  console.log(`✓ Wrote ${tf} (tracker, git conventions, commands, models, GitRisk, sharing)
986
- ✓ ${file} now keeps only your local settings (the old file is ${path.basename(file)}.bak)
994
+ ✓ ${file} now keeps only your local settings (the old file is saved as ${path.basename(saved)})
987
995
  Next: commit team.yml in the specs repo. Colleagues who clone it run: spec-driven-dev setup --join=<path to the specs repo>
988
996
  or say "run spec-setup" in their AI tool, which finds it and offers to join.`);
989
997
  }
@@ -1007,7 +1015,7 @@ function join() {
1007
1015
  if (!have.length) throw new Error(`None of the team's repos (${known.map((r) => r.name).join(", ")}) are cloned in ${workspace}. Clone the ones you work on, then join again (or pass --workspace=<folder>).`);
1008
1016
  const file = path.join(workspace, ".spec-driven.yml");
1009
1017
  if (fs.existsSync(file) && !flag("force")) throw new Error(`${file} already exists. Add --force to replace it with the team's setup (it's backed up first).`);
1010
- if (fs.existsSync(file)) fs.copyFileSync(file, `${file}.bak`);
1018
+ if (fs.existsSync(file)) console.log(` Backed up your old settings to ${path.basename(backup(file))}`);
1011
1019
  const mine = { version: 1, layout: have.length > 1 ? "multi-repo" : "single", repos: have.map((n) => ({ path: n })), specs_dir: path.relative(workspace, specsDir) || ".", pipeline: { after_approval: opt("after-approval") || "stop" } };
1012
1020
  if (mine.layout === "single") { delete mine.repos; }
1013
1021
  fs.writeFileSync(file, PERSONAL_HEADER(path.relative(workspace, path.join(specsDir, "team.yml"))) + dumpYaml(mine));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@benjaminthomas/spec-driven-dev",
3
- "version": "1.16.0",
3
+ "version": "1.16.1",
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.0",
3
+ "version": "1.16.1",
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",