@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 +1 -1
- package/bin/cli.mjs +11 -3
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +1 -1
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.
|
|
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
|
-
|
|
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(
|
|
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))
|
|
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.
|
|
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.
|
|
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",
|