@dzhechkov/p-replicator 1.5.18 → 1.9.0

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.
Files changed (89) hide show
  1. package/.dz-manifest.json +173 -57
  2. package/CHANGELOG.md +262 -0
  3. package/MULTIPLATFORM_ROADMAP.md +1 -1
  4. package/README/eng/01_quickstart.md +2 -2
  5. package/README/eng/02_user_guide.md +1 -1
  6. package/README/eng/03_admin_guide.md +2 -2
  7. package/README/eng/05_architecture.md +6 -2
  8. package/README/eng/README.md +1 -1
  9. package/README/ru/01_quickstart.md +2 -2
  10. package/README/ru/02_user_guide.md +1 -1
  11. package/README/ru/03_admin_guide.md +2 -2
  12. package/README/ru/05_architecture.md +1 -1
  13. package/README/ru/README.md +1 -1
  14. package/README/ru/html/index.html +7 -7
  15. package/README.md +139 -16
  16. package/bin/cli.js +0 -0
  17. package/package.json +11 -10
  18. package/sbom.json +346 -56
  19. package/src/utils.js +4 -0
  20. package/templates/.claude/agents/doc-validator.md +2 -1
  21. package/templates/.claude/agents/product-discoverer.md +1 -1
  22. package/templates/.claude/commands/next.md +16 -0
  23. package/templates/.claude/commands/replicate.md +183 -9
  24. package/templates/.claude/commands/start.md +19 -1
  25. package/templates/.claude/hooks/autocommit-insights.cjs +95 -10
  26. package/templates/.claude/hooks/autocommit-plans.cjs +95 -10
  27. package/templates/.claude/hooks/autocommit-roadmap.cjs +96 -13
  28. package/templates/.claude/hooks/check-docs-complete.cjs +174 -0
  29. package/templates/.claude/hooks/check-growth-trace.cjs +191 -0
  30. package/templates/.claude/hooks/check-ports.cjs +232 -0
  31. package/templates/.claude/hooks/session-insights.cjs +13 -1
  32. package/templates/.claude/hooks/state-update.cjs +13 -1
  33. package/templates/.claude/hooks/statusline.cjs +145 -18
  34. package/templates/.claude/rules/docker-ports.md +123 -0
  35. package/templates/.claude/rules/replicate-pipeline.md +19 -6
  36. package/templates/.claude/rules/skill-interface-protocol.md +9 -0
  37. package/templates/.claude/settings.json +5 -5
  38. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/01-detect-parse.md +57 -14
  39. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/02-analyze-map.md +9 -7
  40. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/03-generate-p0.md +6 -4
  41. package/templates/.claude/skills/cc-toolkit-generator-enhanced/modules/08-skill-composition.md +2 -2
  42. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/enhanced-recommendations.md +6 -4
  43. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/extended-mapping.md +2 -2
  44. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-agents.md +2 -2
  45. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/ddd-skills.md +1 -1
  46. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/enhanced-claude-md.md +2 -2
  47. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-lifecycle.md +2 -2
  48. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/feature-suggestions.md +11 -2
  49. package/templates/.claude/skills/cc-toolkit-generator-enhanced/references/templates/start-command.md +1 -1
  50. package/templates/.claude/skills/requirements-validator/SKILL.md +59 -0
  51. package/templates/.claude/skills/requirements-validator/references/scoring-system.md +28 -0
  52. package/templates/.claude/skills/reverse-engineering-unicorn/modules/01-intelligence.md +4 -4
  53. package/templates/.claude/skills/reverse-engineering-unicorn/modules/02-product-customers.md +2 -2
  54. package/templates/.claude/skills/reverse-engineering-unicorn/modules/025-cjm-prototype.md +9 -1
  55. package/templates/.claude/skills/reverse-engineering-unicorn/modules/03-market-competition.md +3 -3
  56. package/templates/.claude/skills/reverse-engineering-unicorn/modules/04-business-finance.md +3 -3
  57. package/templates/.claude/skills/reverse-engineering-unicorn/modules/05-growth-engine.md +132 -12
  58. package/templates/.claude/skills/reverse-engineering-unicorn/modules/06-playbook-synthesis.md +1 -1
  59. package/templates/.claude/skills/sparc-prd-mini/SKILL.md +152 -10
  60. package/tests/e2e/lifecycle.test.js +21 -10
  61. package/tests/snapshot/baseline.json +42 -38
  62. package/tests/snapshot/update-baseline.js +2 -1
  63. package/tests/unit/adr-decision-coverage.test.js +137 -0
  64. package/tests/unit/adr-scanner-contract.test.js +108 -0
  65. package/tests/unit/autocommit-deletion.test.js +242 -0
  66. package/tests/unit/check-docs-complete.test.js +249 -0
  67. package/tests/unit/check-growth-trace.test.js +188 -0
  68. package/tests/unit/check-ports.test.js +184 -0
  69. package/tests/unit/db-port-rule.test.js +216 -0
  70. package/tests/unit/detect-parse-anchor.test.js +109 -0
  71. package/tests/unit/external-dependency-check.test.js +209 -0
  72. package/tests/unit/growth-axes-and-compliance.test.js +169 -0
  73. package/tests/unit/growth-gate-conditional.test.js +122 -0
  74. package/tests/unit/growth-module-b2b-gate.test.js +122 -0
  75. package/tests/unit/growth-requirements-bridge.test.js +127 -0
  76. package/tests/unit/hooks-project-anchored.test.js +223 -0
  77. package/tests/unit/hooks-report-failures.test.js +207 -0
  78. package/tests/unit/module-copy-identity.test.js +76 -0
  79. package/tests/unit/pipeline-file-ownership.test.js +95 -0
  80. package/tests/unit/roadmap-one-schema.test.js +179 -0
  81. package/tests/unit/skill-paths-prebaked.test.js +174 -0
  82. package/tests/unit/sparc-reconciliation.test.js +117 -0
  83. package/tests/unit/spec-pseudocode-traceability.test.js +146 -0
  84. package/tests/unit/statusline-honest-labels.test.js +178 -0
  85. package/tests/unit/statusline-two-roots.test.js +237 -0
  86. package/tests/unit/sync-templates-guard.test.js +209 -0
  87. package/tests/unit/utils.test.js +2 -2
  88. package/tests/unit/validation-gate-teeth.test.js +158 -0
  89. package/LICENSE +0 -21
package/README.md CHANGED
@@ -101,7 +101,7 @@
101
101
 
102
102
  ## 📖 What is p-replicator?
103
103
 
104
- `@dzhechkov/p-replicator` installs a ready-made `.claude/` toolkit into any project: **11 slash commands**, **10 skills**, **4 agents**, **5 rules**, **6 hook scripts**, and a `settings.json` with pre-configured hooks and a multi-line statusline dashboard.
104
+ `@dzhechkov/p-replicator` installs a ready-made `.claude/` toolkit into any project: **11 slash commands**, **10 skills**, **4 agents**, **6 rules**, **9 hook scripts**, and a `settings.json` with pre-configured hooks and a multi-line statusline dashboard.
105
105
 
106
106
  The flagship `/replicate` command takes a project through a **5-phase pipeline**:
107
107
 
@@ -289,8 +289,8 @@ This creates:
289
289
  | **Skills** | 10 | 92 files (880K+ chars — MEASURED via `wc -c` over `templates/.claude/skills`: 880,679). Modular architecture: foundation → composite → master orchestrator |
290
290
  | **Commands** | 11 | `/replicate`, `/harvest`, `/start`, `/plan`, `/feature`, `/go`, `/run`, `/next`, `/myinsights`, `/docs`, `/deploy` |
291
291
  | **Agents** | 4 | `replicate-coordinator`, `product-discoverer`, `doc-validator`, `harvest-coordinator` |
292
- | **Rules** | 5 | `replicate-pipeline`, `skill-interface-protocol`, `git-workflow`, `insights-capture`, `feature-lifecycle` |
293
- | **Hooks** | 6 | `session-insights`, `autocommit-{roadmap,insights,plans}`, `statusline`, `state-update` (cross-platform Node) |
292
+ | **Rules** | 6 | `replicate-pipeline`, `skill-interface-protocol`, `git-workflow`, `insights-capture`, `feature-lifecycle`, `docker-ports` |
293
+ | **Hooks** | 9 | `session-insights`, `autocommit-{roadmap,insights,plans}`, `statusline`, `state-update`, `check-ports`, `check-growth-trace`, `check-docs-complete` (cross-platform Node) |
294
294
  | **Settings** | 1 | `settings.json` with statusLine + SessionStart + Stop hooks pre-configured |
295
295
 
296
296
  After running `/replicate`, the toolkit also generates **project-specific** artifacts:
@@ -306,6 +306,108 @@ After running `/replicate`, the toolkit also generates **project-specific** arti
306
306
 
307
307
  ---
308
308
 
309
+ ## 📈 Growth: from analysis to obligation
310
+
311
+ Phase 0's M5 module used to end as analysis — and the analysis had nowhere to go, because the Product
312
+ Discovery Brief was never written to disk at all. Since 1.7.0:
313
+
314
+ - Phase 0 writes `docs/product-discovery-brief.md`.
315
+ - M5 emits a **Growth Requirements Seed**: `FR-GROWTH-nnn` DRAFT obligations, each naming the
316
+ analysis block it came from and carrying that block's confidence verbatim.
317
+ - Growth type is **two independent choices** — a go-to-market MOTION and a growth LOOP. The old
318
+ single list forced one pick across both, which made "sales-led company running a referral loop"
319
+ unsayable. `No loop` is a real answer and skips the loop-only output.
320
+ - A **compliance checklist** runs before a technique becomes a requirement. It names the norm and
321
+ where to check it, never an amount or a statute — those go stale and are jurisdiction-specific.
322
+ A `no` answer blocks that requirement's promotion.
323
+ - Phase 2's validator gains a **conditional** `Growth Traceability` criterion: `+5` traced, `+0` not
324
+ applicable, `-10` applicable but dropped. It scores outside the 100-point table, and a project with
325
+ no acquisition objective — or one that never ran Phase 0 — scores `+0`, never a penalty.
326
+
327
+ What none of this proves: that anything was built, or that copying a competitor's move is lawful.
328
+
329
+ ## 🔎 The three deliberate checks
330
+
331
+ Six of the nine hook scripts run themselves. Three do not: they are utilities you invoke when you want
332
+ an answer, and they are wired to no event on purpose. A hook of this package is **non-blocking by
333
+ contract** — it can print, never refuse — so a check that must be able to say "no" cannot be one.
334
+
335
+ Both answer with **three** exit codes, and the third is the one that matters:
336
+
337
+ | Code | Meaning |
338
+ |:---:|---|
339
+ | `0` | the rule holds |
340
+ | `1` | the rule is violated — the offender is named |
341
+ | `2` | **the check did not run** — it could not look, and says so |
342
+
343
+ A checker that answers "clean" when it could not look turns an unknown into a reassurance. That is
344
+ why a missing config, a missing docker, or a missing brief is `2` and never `0`.
345
+
346
+ ### `check-ports.cjs` — no database faces the internet
347
+
348
+ ```bash
349
+ node .claude/hooks/check-ports.cjs .
350
+ ```
351
+
352
+ ```
353
+ ❌ Правило №0 нарушено (.claude/rules/docker-ports.md):
354
+ • db: порт 5432 → 5432 (без адреса — значит все интерфейсы) — хранилище опубликовано наружу.
355
+ Убрать ports: целиком, либо привязать к 127.0.0.1
356
+ ```
357
+
358
+ Reads the normalised config (`docker compose config`), so the short port form and `extends` are
359
+ already resolved. Catches `network_mode: host` and services published beside a reverse-proxy too.
360
+ A loopback bind (`127.0.0.1:` or `[::1]:`) is legal and passes — that exception is part of the rule.
361
+
362
+ **When to run it:** after writing or editing `docker-compose.yml`, and before any deploy.
363
+
364
+ ### `check-docs-complete.cjs` — the cheap question, before the swarm
365
+
366
+ ```bash
367
+ node .claude/hooks/check-docs-complete.cjs .
368
+ ```
369
+
370
+ ```
371
+ ❌ документы Фазы 1 не готовы к валидации (1):
372
+ • PRD.md: пуст или почти пуст (5 симв., порог 200)
373
+ Рой валидации запускать рано: он потратит агентов на то, что видно отсюда.
374
+ ```
375
+
376
+ Phase 2 launches a swarm of validation agents over whatever Phase 1 produced. Existence, emptiness
377
+ and unfilled placeholders are decidable by forty lines of code — this asks them first, so the swarm
378
+ is spent on testability and completeness rather than on discovering an empty file.
379
+
380
+ `docs/ADR.md` and `docs/C4_Diagrams.md` stay optional, as `/replicate` itself declares them. A
381
+ markdown link is not a placeholder.
382
+
383
+ **When to run it:** at the Phase 1 → Phase 2 boundary. `/replicate` now runs it there for you.
384
+
385
+ **What it does NOT prove:** that the documents are correct. That is what the swarm is for.
386
+
387
+ ### `check-growth-trace.cjs` — the growth analysis was not analysed and dropped
388
+
389
+ ```bash
390
+ node .claude/hooks/check-growth-trace.cjs .
391
+ ```
392
+
393
+ ```
394
+ ❌ часть требований по росту потеряна (1 из 2):
395
+ • FR-GROWTH-002
396
+ Каждое надо либо перенести в docs/Specification.md, либо отклонить С ПРИЧИНОЙ — молча уронить нельзя.
397
+ ```
398
+
399
+ Phase 0's M5 module emits a `Growth Requirements Seed` table of `FR-GROWTH-nnn` draft obligations
400
+ into `docs/product-discovery-brief.md`. This asks whether they survived into `docs/Specification.md`.
401
+ A conscious rejection **with a reason written down** passes; a silent drop does not.
402
+
403
+ `docs/product-discovery-brief.md` absent is `2`, not `0` — it means Phase 0 never ran (the
404
+ `--from-docs` entry skips it), which is not the same as having nothing to trace.
405
+
406
+ **When to run it:** at the Phase 1 → Phase 2 boundary, before the validation pass.
407
+
408
+ **What it does NOT prove:** that anything was built, or that copying a competitor's growth move is
409
+ lawful. It proves an obligation was carried forward, nothing more.
410
+
309
411
  ## ✅ Verify the install
310
412
 
311
413
  After `/replicate`, run:
@@ -316,7 +418,7 @@ npx @dzhechkov/p-replicator verify
316
418
 
317
419
  The command checks:
318
420
 
319
- - **Pre-shipped contract** (must-have): 10 skills + 11 commands + 4 agents + 5 rules + settings.json + 6 hooks
421
+ - **Pre-shipped contract** (must-have): 10 skills + 11 commands + 4 agents + 6 rules + settings.json + 9 hooks
320
422
  - **Post-/replicate hints** (advisory): CLAUDE.md, project-specific agents, feature-roadmap.json, security rules, etc.
321
423
 
322
424
  **Exit codes:**
@@ -360,6 +462,14 @@ Generates 11 standardized documents in `docs/`:
360
462
  | `C4_Diagrams.md` | Context / container / component |
361
463
  | `ADR.md` | Architecture Decision Records |
362
464
 
465
+ > **ADR detection reads BOTH storage shapes.** `/replicate` writes every decision into one
466
+ > `docs/ADR.md`, while an idea2prd-manual project keeps a `docs/adr/*.md` directory. Since 1.5.19 the
467
+ > toolkit generator's scanner normalizes both into one decision list, so the ADR-driven parts of the
468
+ > generated toolkit (architect skill weighting, security boosts, tech-stack extraction, CLAUDE.md key
469
+ > decisions) work for `/replicate` projects too. Before 1.5.19 the scanner required a directory of
470
+ > more than five files, so for every `/replicate` project the flag was unreachable and those parts
471
+ > silently produced nothing.
472
+
363
473
  Skill: `sparc-prd-mini` (internally chains explore + research + solve sub-phases).
364
474
 
365
475
  ### Phase 2 — Validation (5-agent swarm)
@@ -664,7 +774,7 @@ P-Replicator V1.5.x ● user │ Sonnet 4.7
664
774
  🚀 Pipeline /<cmd> ▓▓▓░░░░ 50% │ Phase: VALIDATE (2/4) │ Last: /replicate
665
775
  🎯 Roadmap [●●●○○○○○] mvp 3/8 │ Done 5/12 │ ▶ auth-jwt │ Domain: banking
666
776
  📊 SPARC ●11/11 │ 🟢 78/100 │ Plans ●3 │ ADRs ●2 │ Harvest 2026-05-05
667
- 🛠️ Toolkit Skills ●10/10 │ Cmds ●11/11 │ Agents ●4+3 │ Rules ●5+2 │ Hooks ●6/6
777
+ 🛠️ Toolkit Skills ●10/10 │ Cmds ●11/11 │ Agents ●4+3 │ Rules ●6+2 │ Hooks ●7/7
668
778
  💡 Insights ●12 (2026-05-06) │ Tests 85/85 ✓ │ MCP ●1/1 │ Settings ✓ │ 🧬 Keysarium ✓
669
779
  ```
670
780
 
@@ -734,7 +844,7 @@ All 4 autocommit scripts use `execFileSync('git', [...])` (no shell pipes, no `2
734
844
  Updated via `state-update.cjs`:
735
845
 
736
846
  ```bash
737
- node .claude/hooks/state-update.cjs \
847
+ node "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/state-update.cjs" \
738
848
  --command /feature \
739
849
  --phase VALIDATE \
740
850
  --index 2 \
@@ -880,14 +990,14 @@ Default structure after `init`:
880
990
  "_comment": "Default hooks + statusline shipped by @dzhechkov/p-replicator init.",
881
991
  "statusLine": {
882
992
  "type": "command",
883
- "command": "node .claude/hooks/statusline.cjs"
993
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/statusline.cjs\""
884
994
  },
885
995
  "hooks": {
886
996
  "SessionStart": [
887
997
  {
888
998
  "matcher": "*",
889
999
  "hooks": [
890
- { "type": "command", "command": "node .claude/hooks/session-insights.cjs", "timeout": 5 }
1000
+ { "type": "command", "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/session-insights.cjs\"", "timeout": 5 }
891
1001
  ]
892
1002
  }
893
1003
  ],
@@ -895,9 +1005,9 @@ Default structure after `init`:
895
1005
  {
896
1006
  "matcher": "*",
897
1007
  "hooks": [
898
- { "type": "command", "command": "node .claude/hooks/autocommit-roadmap.cjs", "timeout": 10 },
899
- { "type": "command", "command": "node .claude/hooks/autocommit-insights.cjs", "timeout": 10 },
900
- { "type": "command", "command": "node .claude/hooks/autocommit-plans.cjs", "timeout": 10 }
1008
+ { "type": "command", "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/autocommit-roadmap.cjs\"", "timeout": 10 },
1009
+ { "type": "command", "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/autocommit-insights.cjs\"", "timeout": 10 },
1010
+ { "type": "command", "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/autocommit-plans.cjs\"", "timeout": 10 }
901
1011
  ]
902
1012
  }
903
1013
  ]
@@ -905,6 +1015,19 @@ Default structure after `init`:
905
1015
  }
906
1016
  ```
907
1017
 
1018
+ **Why `${CLAUDE_PROJECT_DIR}` and not a relative path:** a relative path resolves against the process
1019
+ working directory, which drifts — one `cd` inside a tool call moves it for the rest of the session, and
1020
+ the hook then dies with `MODULE_NOT_FOUND`. Because hooks are non-blocking, the session continues and
1021
+ your roadmap silently stops being committed. Claude Code sets `CLAUDE_PROJECT_DIR` to the project root
1022
+ and rewrites this exact braced form for PowerShell, so it works on every platform.
1023
+
1024
+ The hook scripts anchor their DATA the same way, and fall back to their own location
1025
+ (`__dirname/../..`) when the variable is absent — so a hand-run works too. That fallback is why the
1026
+ shell examples elsewhere in this README use `${CLAUDE_PROJECT_DIR:-.}`: in a plain terminal the
1027
+ variable is unset, and `:-.` keeps the example working. Do **not** use the `:-.` form inside
1028
+ `settings.json` — Claude Code's PowerShell rewrite matches only the bare `${CLAUDE_PROJECT_DIR}`
1029
+ token, so `:-.` would leave a POSIX-only construct in a file that must work on every platform.
1030
+
908
1031
  **Customization:** add new hooks or event types — preserved on `init --force` or `update` thanks to merge logic.
909
1032
 
910
1033
  **Disable individual default hooks:** delete from `settings.json` after `init`. The deletion is preserved on next `update` (orphan detection only removes hooks **previously shipped** but absent in **new** template — your manual deletion is a user customization).
@@ -1012,13 +1135,13 @@ Checks:
1012
1135
  3. Script runs directly:
1013
1136
 
1014
1137
  ```bash
1015
- node .claude/hooks/statusline.cjs
1138
+ node "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/statusline.cjs"
1016
1139
  ```
1017
1140
 
1018
1141
  Should print 6 lines of ANSI output. If it errors:
1019
1142
 
1020
1143
  ```bash
1021
- node .claude/hooks/statusline.cjs 2>&1
1144
+ node "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/statusline.cjs" 2>&1
1022
1145
  ```
1023
1146
 
1024
1147
  Likely cause: corrupt JSON or missing `.p-replicator.json`.
@@ -1038,7 +1161,7 @@ git rev-parse --git-dir
1038
1161
  Debug a specific hook:
1039
1162
 
1040
1163
  ```bash
1041
- node .claude/hooks/autocommit-roadmap.cjs
1164
+ node "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/autocommit-roadmap.cjs"
1042
1165
  echo "Exit: $?"
1043
1166
  git log -1 --format="%s"
1044
1167
  ```
@@ -1103,7 +1226,7 @@ Checks:
1103
1226
  1. `.claude/insights/index.md` exists with entries?
1104
1227
  2. Hook works:
1105
1228
  ```bash
1106
- node .claude/hooks/session-insights.cjs # should print recent insights
1229
+ node "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/session-insights.cjs" # should print recent insights
1107
1230
  ```
1108
1231
  3. SessionStart hook configured in `settings.json`?
1109
1232
 
@@ -1112,7 +1235,7 @@ If all 3 OK but still nothing — Claude Code may cache. Restart `claude`.
1112
1235
  ### Statusline lags on every command
1113
1236
 
1114
1237
  ```bash
1115
- time node .claude/hooks/statusline.cjs # how many seconds?
1238
+ time node "${CLAUDE_PROJECT_DIR:-.}/.claude/hooks/statusline.cjs" # how many seconds?
1116
1239
  ```
1117
1240
 
1118
1241
  Should be < 100ms. If > 1s, check `docs/` size:
package/bin/cli.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/p-replicator",
3
- "version": "1.5.18",
3
+ "version": "1.9.0",
4
4
  "description": "P-Replicator — Claude Code toolkit for AI-assisted product development (Vibe Coding). Full /replicate pipeline, 10 modular skills (880K+ chars), /harvest knowledge extraction, swarm agents, quality gates, security patterns, cross-project learning.",
5
5
  "main": "src/cli.js",
6
6
  "bin": {
@@ -18,6 +18,15 @@
18
18
  ".dz-manifest.json",
19
19
  "sbom.json"
20
20
  ],
21
+ "scripts": {
22
+ "prepublishOnly": "node --test tests/snapshot/templates.test.js && node ../../../scripts/prepublish-gate.mjs",
23
+ "test": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js tests/e2e/lifecycle.test.js tests/snapshot/templates.test.js",
24
+ "test:unit": "node --test tests/unit/utils.test.js tests/unit/adr-scanner-contract.test.js tests/unit/sparc-reconciliation.test.js tests/unit/pipeline-file-ownership.test.js tests/unit/validation-gate-teeth.test.js tests/unit/hooks-project-anchored.test.js tests/unit/statusline-two-roots.test.js tests/unit/external-dependency-check.test.js tests/unit/spec-pseudocode-traceability.test.js tests/unit/sync-templates-guard.test.js tests/unit/db-port-rule.test.js tests/unit/roadmap-one-schema.test.js tests/unit/hooks-report-failures.test.js tests/unit/growth-module-b2b-gate.test.js tests/unit/detect-parse-anchor.test.js tests/unit/statusline-honest-labels.test.js tests/unit/autocommit-deletion.test.js tests/unit/check-ports.test.js tests/unit/adr-decision-coverage.test.js tests/unit/growth-requirements-bridge.test.js tests/unit/check-growth-trace.test.js tests/unit/growth-gate-conditional.test.js tests/unit/module-copy-identity.test.js tests/unit/growth-axes-and-compliance.test.js tests/unit/skill-paths-prebaked.test.js tests/unit/check-docs-complete.test.js",
25
+ "test:e2e": "node --test tests/e2e/lifecycle.test.js",
26
+ "test:snapshot": "node --test tests/snapshot/templates.test.js",
27
+ "test:doctor": "node bin/cli.js doctor",
28
+ "snapshot:baseline": "node tests/snapshot/update-baseline.js"
29
+ },
21
30
  "keywords": [
22
31
  "claude",
23
32
  "claude-code",
@@ -70,13 +79,5 @@
70
79
  },
71
80
  "publishConfig": {
72
81
  "access": "public"
73
- },
74
- "scripts": {
75
- "test": "node --test tests/unit/utils.test.js tests/e2e/lifecycle.test.js tests/snapshot/templates.test.js",
76
- "test:unit": "node --test tests/unit/utils.test.js",
77
- "test:e2e": "node --test tests/e2e/lifecycle.test.js",
78
- "test:snapshot": "node --test tests/snapshot/templates.test.js",
79
- "test:doctor": "node bin/cli.js doctor",
80
- "snapshot:baseline": "node tests/snapshot/update-baseline.js"
81
82
  }
82
- }
83
+ }