@warnyin/sdlc 0.14.1 → 0.14.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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.14.2 (2026-09-19)
4
+
5
+ - **Fix (init)**: `init` no longer disowns the tools it did not install that run. It rebuilt the
6
+ ownership manifest from scratch and wrote it wholesale, so running `init` a second time for a
7
+ different tool dropped every entry belonging to the first — the files stayed on disk, but
8
+ `update` could no longer recognise them. The damage showed up later: such a file was **never
9
+ refreshed again** (refresh needs the recorded hash to match what is on disk) and was reported
10
+ as `kept (user-modified)`, blaming you for an edit you never made. `init` now carries forward
11
+ every entry it does not rewrite. It still never prunes — only `update --tool <list>` removes
12
+ a tool, and now that a tool installed by its own `init` run is properly owned, deselecting it
13
+ there prunes its files as it always should have.
14
+ - **If a project already hit this**, the fix cannot recover a hash nothing recorded. A disowned
15
+ file that still matches the current payload is re-claimed silently on your next `update`; one
16
+ that has already drifted stays frozen and keeps reporting `kept (user-modified)`. To recover
17
+ it, delete that file and run `update` — it is rewritten from the payload and owned again.
18
+
3
19
  ## 0.14.1 (2026-09-19)
4
20
 
5
21
  - **Fix (init)**: adding a tool to a project that already has `sdlc/` no longer loses it on the
package/bin/cli.mjs CHANGED
@@ -373,7 +373,16 @@ export async function cmdInit(projectRoot, args) {
373
373
  };
374
374
  scaffoldSdlc(projectRoot, tools, ctx);
375
375
  installToolAdapters(projectRoot, tools, ctx);
376
- writeManifestFile(projectRoot, ctx.manifest);
376
+ // Carry forward every entry this run did not rewrite. `init` installs only the tools it was
377
+ // given, so writing `ctx.manifest` alone would disown the files of every OTHER tool already
378
+ // installed here — they stay on disk, but `update` then sees files it has no record of,
379
+ // refuses to refresh them (its refresh branch needs disk hash === recorded hash), freezes
380
+ // them at their old payload version and reports them as user-modified. Same failure
381
+ // `installFile` documents fixing per-file, reached instead by never visiting the entry.
382
+ // The merge happens HERE, not by seeding `ctx.manifest`: that Map is also what the install
383
+ // summary counts, and it must keep describing only what this run installed. `cmdUpdate`
384
+ // deliberately does NOT do this — its wholesale replace is what tells prune a tool is gone.
385
+ writeManifestFile(projectRoot, new Map([...ctx.oldManifest, ...ctx.manifest]));
377
386
  ensureGitignore(projectRoot);
378
387
  for (const w of ctx.warnings) console.warn(` ${style.yellow(symbols.warn)} ${w}`);
379
388
  printInitSummary(tools, ctx, style, symbols, { configExisted, toolsAdded });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warnyin/sdlc",
3
- "version": "0.14.1",
3
+ "version": "0.14.2",
4
4
  "description": "Spec-driven, AI-driven SDLC framework — token-lean specs, contract-first changes, autonomous pipeline with managed hooks. Operationalizes the Day-1 'New SDLC with Vibe Coding' work process.",
5
5
  "type": "module",
6
6
  "bin": {