@nathapp/nax 0.28.0 → 0.29.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 (376) hide show
  1. package/CHANGELOG.md +13 -2
  2. package/dist/nax.js +72691 -0
  3. package/package.json +12 -4
  4. package/src/cli/config.ts +3 -1
  5. package/src/config/defaults.ts +1 -0
  6. package/src/config/schemas.ts +1 -0
  7. package/src/config/types.ts +1 -0
  8. package/src/context/builder.ts +10 -1
  9. package/src/prompts/sections/role-task.ts +4 -2
  10. package/src/review/runner.ts +6 -1
  11. package/src/version.ts +2 -1
  12. package/.claude/rules/01-project-conventions.md +0 -34
  13. package/.claude/rules/02-test-architecture.md +0 -39
  14. package/.claude/rules/03-test-writing.md +0 -58
  15. package/.claude/rules/04-forbidden-patterns.md +0 -29
  16. package/.claude/settings.json +0 -15
  17. package/.githooks/pre-commit +0 -16
  18. package/.gitlab-ci.yml +0 -103
  19. package/.mcp.json +0 -8
  20. package/BRIEF.md +0 -140
  21. package/CLAUDE.md +0 -143
  22. package/US-007-IMPLEMENTATION.md +0 -139
  23. package/biome.json +0 -14
  24. package/bun.lock +0 -163
  25. package/bunfig.toml +0 -12
  26. package/docker-compose.test.yml +0 -15
  27. package/docs/20260216-fix-plan-context-review.md +0 -56
  28. package/docs/20260216-relentless-vs-ngent-comparison.md +0 -208
  29. package/docs/20260216-v02-plan.md +0 -136
  30. package/docs/20260216-v02-review.md +0 -685
  31. package/docs/20260217-dogfood-findings.md +0 -56
  32. package/docs/20260217-p2-plus-plan.md +0 -117
  33. package/docs/20260217-partial-fixes-plan.md +0 -62
  34. package/docs/20260217-plan-analyze-spec.md +0 -117
  35. package/docs/20260217-post-impl-review.md +0 -1137
  36. package/docs/20260217-quick-wins-plan.md +0 -66
  37. package/docs/20260217-split-runner-plan.md +0 -75
  38. package/docs/20260217-v03-impl-plan.md +0 -80
  39. package/docs/20260217-v03-post-impl-review.md +0 -589
  40. package/docs/20260217-v04-impl-plan.md +0 -86
  41. package/docs/20260217-v05-post-impl-review.md +0 -850
  42. package/docs/20260217-v06-post-impl-review.md +0 -817
  43. package/docs/20260218-adr003-port-plan.md +0 -151
  44. package/docs/20260218-review-adr003-verification.md +0 -175
  45. package/docs/20260219-fix-plan-bug16-19.md +0 -79
  46. package/docs/20260219-fix-plan-bug20-22.md +0 -114
  47. package/docs/20260219-plan-llm-routing.md +0 -116
  48. package/docs/20260219-review-bug20-22-fixes.md +0 -135
  49. package/docs/20260219-routing-baseline-keyword.md +0 -63
  50. package/docs/20260220-plan-structured-logging-p1.md +0 -80
  51. package/docs/20260220-plan-structured-logging-p2.md +0 -37
  52. package/docs/20260220-review-llm-routing.md +0 -180
  53. package/docs/20260220-review-post-fix-llm-routing.md +0 -70
  54. package/docs/20260221-fix-plan-relevantfiles-split.md +0 -101
  55. package/docs/20260221-fix-plan-routing-mode.md +0 -125
  56. package/docs/20260221-review-v0.9-implementation.md +0 -379
  57. package/docs/20260222-fix-plan-v091-routing-isolation.md +0 -197
  58. package/docs/20260223-fix-plan-prompt-audit.md +0 -62
  59. package/docs/20260224-nax-roadmap-phases.md +0 -189
  60. package/docs/20260225-phase2-llm-service-layer.md +0 -401
  61. package/docs/20260225-review-v0.10.1.md +0 -187
  62. package/docs/20260303-v010-implementation-plan.md +0 -165
  63. package/docs/20260304-review-nax.md +0 -492
  64. package/docs/CLAUDE.md.bak +0 -191
  65. package/docs/ROADMAP.md +0 -390
  66. package/docs/SPEC-rectification.md +0 -0
  67. package/docs/SPEC.md +0 -324
  68. package/docs/US-001-plugin-loading-verification.md +0 -152
  69. package/docs/adr/ADR-005-implementation-plan.md +0 -655
  70. package/docs/adr/ADR-005-pipeline-re-architecture.md +0 -464
  71. package/docs/architecture-analysis.md +0 -1076
  72. package/docs/bugs/BUG-21-escalation-null-attempts.md +0 -48
  73. package/docs/bugs-from-dogfood-run-c.md +0 -243
  74. package/docs/code-review-20260228.md +0 -612
  75. package/docs/code-review-v0.15.0.md +0 -629
  76. package/docs/hook-lifecycle-test-plan.md +0 -149
  77. package/docs/releases/v0.11.0-and-earlier.md +0 -20
  78. package/docs/releases/v0.12.0.md +0 -15
  79. package/docs/releases/v0.13.0.md +0 -14
  80. package/docs/releases/v0.14.0.md +0 -20
  81. package/docs/releases/v0.14.1.md +0 -36
  82. package/docs/releases/v0.14.2.md +0 -51
  83. package/docs/releases/v0.14.3.md +0 -174
  84. package/docs/releases/v0.14.4.md +0 -94
  85. package/docs/releases/v0.15.0.md +0 -502
  86. package/docs/releases/v0.15.1.md +0 -170
  87. package/docs/releases/v0.15.3.md +0 -193
  88. package/docs/specs/bug-039-orphan-processes.md +0 -131
  89. package/docs/specs/bug-040-review-rectification.md +0 -82
  90. package/docs/specs/bug-041-cross-story-test-isolation.md +0 -88
  91. package/docs/specs/bug-042-verifier-failure-capture.md +0 -117
  92. package/docs/specs/bun-pty-migration.md +0 -171
  93. package/docs/specs/central-run-registry.md +0 -116
  94. package/docs/specs/feat-010-smart-runner-git-history.md +0 -96
  95. package/docs/specs/feat-011-file-context-strategy.md +0 -73
  96. package/docs/specs/feat-012-tdd-writer-tier.md +0 -79
  97. package/docs/specs/feat-013-test-after-review.md +0 -89
  98. package/docs/specs/feat-014-heartbeat-observability.md +0 -127
  99. package/docs/specs/status-file-consolidation.md +0 -93
  100. package/docs/specs/status-file-v0.10.1.md +0 -812
  101. package/docs/specs/trigger-completion.md +0 -145
  102. package/docs/specs/verification-architecture-v2.md +0 -343
  103. package/docs/tdd/strategies.md +0 -97
  104. package/docs/v0.10-global-config.md +0 -206
  105. package/docs/v0.10-plugin-system.md +0 -415
  106. package/docs/v0.10-prompt-optimizer.md +0 -234
  107. package/docs/v0.3-spec.md +0 -244
  108. package/docs/v0.4-spec.md +0 -140
  109. package/docs/v0.5-spec.md +0 -237
  110. package/docs/v0.6-spec.md +0 -371
  111. package/docs/v0.7-spec.md +0 -177
  112. package/docs/v0.8-llm-routing.md +0 -206
  113. package/docs/v0.8-structured-logging.md +0 -132
  114. package/docs/v0.9.3-prompt-audit.md +0 -112
  115. package/examples/plugins/console-reporter/index.test.ts +0 -207
  116. package/examples/plugins/console-reporter/index.ts +0 -110
  117. package/memory/topic/feat-010-baseref.md +0 -28
  118. package/memory/topic/feat-013-test-after-deprecation.md +0 -22
  119. package/nax/config.json +0 -154
  120. package/nax/features/bug-039-medium/prd.json +0 -45
  121. package/nax/features/bugfix-v0171/prd.json +0 -52
  122. package/nax/features/central-run-registry/prd.json +0 -105
  123. package/nax/features/config-management/prd.json +0 -108
  124. package/nax/features/config-management/progress.txt +0 -5
  125. package/nax/features/diagnose/acceptance.test.ts +0 -414
  126. package/nax/features/diagnose/prd.json +0 -41
  127. package/nax/features/nax-compliance/prd.json +0 -52
  128. package/nax/features/nax-compliance/progress.txt +0 -1
  129. package/nax/features/orchestration-fixes/prd.json +0 -89
  130. package/nax/features/orchestration-fixes/progress.txt +0 -1
  131. package/nax/features/plugin-integration/US-007-VERIFICATION.md +0 -259
  132. package/nax/features/plugin-integration/prd.json +0 -208
  133. package/nax/features/plugin-integration/progress.txt +0 -5
  134. package/nax/features/post-rearch-bugfix/prd.json +0 -137
  135. package/nax/features/precheck/prd.json +0 -205
  136. package/nax/features/precheck/progress.txt +0 -15
  137. package/nax/features/prompt-builder/prd.json +0 -152
  138. package/nax/features/prompt-builder/progress.txt +0 -3
  139. package/nax/features/review-quality/prd.json +0 -55
  140. package/nax/features/routing-persistence/prd.json +0 -104
  141. package/nax/features/routing-persistence/progress.txt +0 -1
  142. package/nax/features/smart-test-runner/plan.md +0 -7
  143. package/nax/features/smart-test-runner/prd.json +0 -203
  144. package/nax/features/smart-test-runner/progress.txt +0 -13
  145. package/nax/features/smart-test-runner/spec.md +0 -7
  146. package/nax/features/smart-test-runner/tasks.md +0 -8
  147. package/nax/features/status-file-consolidation/prd.json +0 -106
  148. package/nax/features/structured-logging/prd.json +0 -199
  149. package/nax/features/trigger-completion/prd.json +0 -150
  150. package/nax/features/trigger-completion/progress.txt +0 -7
  151. package/nax/features/unlock/prd.json +0 -36
  152. package/nax/features/v0.18.3-execution-reliability/prd.json +0 -80
  153. package/nax/features/v0.18.3-execution-reliability/progress.txt +0 -3
  154. package/nax/features/v0.19.0-hardening/plan.md +0 -7
  155. package/nax/features/v0.19.0-hardening/prd.json +0 -84
  156. package/nax/features/v0.19.0-hardening/progress.txt +0 -7
  157. package/nax/features/v0.19.0-hardening/spec.md +0 -18
  158. package/nax/features/v0.19.0-hardening/tasks.md +0 -8
  159. package/nax/features/verify-v2/prd.json +0 -79
  160. package/nax/features/verify-v2/progress.txt +0 -3
  161. package/nax/status.json +0 -36
  162. package/test/COVERAGE-GAPS.md +0 -333
  163. package/test/e2e/cm-003-default-view.test.ts +0 -195
  164. package/test/e2e/plan-analyze-run.test.ts +0 -902
  165. package/test/helpers/helpers.test.ts +0 -295
  166. package/test/helpers/timeout.ts +0 -42
  167. package/test/integration/US-002-TEST-SUMMARY.md +0 -107
  168. package/test/integration/US-003-TEST-SUMMARY.md +0 -149
  169. package/test/integration/US-004-TEST-SUMMARY.md +0 -106
  170. package/test/integration/US-005-TEST-SUMMARY.md +0 -138
  171. package/test/integration/US-007-TEST-SUMMARY.md +0 -100
  172. package/test/integration/cli/agent-validation.test.ts +0 -439
  173. package/test/integration/cli/cli-config-default-edge-cases.test.ts +0 -223
  174. package/test/integration/cli/cli-config-default-view.test.ts +0 -230
  175. package/test/integration/cli/cli-config-diff.test.ts +0 -461
  176. package/test/integration/cli/cli-config-prompts-explain.test.ts +0 -74
  177. package/test/integration/cli/cli-config.test.ts +0 -737
  178. package/test/integration/cli/cli-diagnose.test.ts +0 -595
  179. package/test/integration/cli/cli-logs.test.ts +0 -346
  180. package/test/integration/cli/cli-plugins.test.ts +0 -679
  181. package/test/integration/cli/cli-precheck.test.ts +0 -372
  182. package/test/integration/cli/cli-run-headless.test.ts +0 -174
  183. package/test/integration/cli/cli.test.ts +0 -76
  184. package/test/integration/cli/precheck-integration.test.ts +0 -476
  185. package/test/integration/cli/precheck-orchestrator.test.ts +0 -247
  186. package/test/integration/cli/precheck.test.ts +0 -806
  187. package/test/integration/config/config-loader.test.ts +0 -266
  188. package/test/integration/config/config.test.ts +0 -444
  189. package/test/integration/config/merger.test.ts +0 -466
  190. package/test/integration/config/paths.test.ts +0 -52
  191. package/test/integration/config/security-loader.test.ts +0 -83
  192. package/test/integration/context/context-integration.test.ts +0 -703
  193. package/test/integration/context/context-path-security.test.ts +0 -173
  194. package/test/integration/context/context-provider-injection.test.ts +0 -507
  195. package/test/integration/context/context-verification-integration.test.ts +0 -296
  196. package/test/integration/context/s5-greenfield-fallback.test.ts +0 -298
  197. package/test/integration/execution/execution-isolation.test.ts +0 -143
  198. package/test/integration/execution/execution.test.ts +0 -634
  199. package/test/integration/execution/feature-status-write.test.ts +0 -302
  200. package/test/integration/execution/parallel.test.ts +0 -251
  201. package/test/integration/execution/prd-pause.test.ts +0 -205
  202. package/test/integration/execution/prd-resolvers.test.ts +0 -186
  203. package/test/integration/execution/progress.test.ts +0 -34
  204. package/test/integration/execution/runner-batching.test.ts +0 -682
  205. package/test/integration/execution/runner-config-plugins.test.ts +0 -462
  206. package/test/integration/execution/runner-escalation.test.ts +0 -561
  207. package/test/integration/execution/runner-fixes.test.ts +0 -400
  208. package/test/integration/execution/runner-plugin-integration.test.ts +0 -544
  209. package/test/integration/execution/runner-queue-and-attempts.test.ts +0 -476
  210. package/test/integration/execution/status-file-integration.test.ts +0 -289
  211. package/test/integration/execution/status-file.test.ts +0 -380
  212. package/test/integration/execution/status-writer.test.ts +0 -447
  213. package/test/integration/execution/story-id-in-events.test.ts +0 -274
  214. package/test/integration/interaction/interaction-chain-pipeline.test.ts +0 -476
  215. package/test/integration/pipeline/hooks.test.ts +0 -363
  216. package/test/integration/pipeline/pipeline-acceptance.test.ts +0 -303
  217. package/test/integration/pipeline/pipeline-events.test.ts +0 -476
  218. package/test/integration/pipeline/pipeline.test.ts +0 -660
  219. package/test/integration/pipeline/reporter-lifecycle.test.ts +0 -862
  220. package/test/integration/pipeline/verify-stage.test.ts +0 -286
  221. package/test/integration/plan/analyze-integration.test.ts +0 -262
  222. package/test/integration/plan/analyze-scanner.test.ts +0 -132
  223. package/test/integration/plan/logger.test.ts +0 -461
  224. package/test/integration/plan/plan.test.ts +0 -157
  225. package/test/integration/plugins/config-integration.test.ts +0 -173
  226. package/test/integration/plugins/config-resolution.test.ts +0 -523
  227. package/test/integration/plugins/loader.test.ts +0 -644
  228. package/test/integration/plugins/plugins-registry.test.ts +0 -747
  229. package/test/integration/plugins/validator.test.ts +0 -564
  230. package/test/integration/prompts/pb-004-migration.test.ts +0 -523
  231. package/test/integration/review/review-config-commands.test.ts +0 -320
  232. package/test/integration/review/review-config-schema.test.ts +0 -117
  233. package/test/integration/review/review-plugin-integration.test.ts +0 -729
  234. package/test/integration/review/review.test.ts +0 -150
  235. package/test/integration/routing/plugin-routing-advanced.test.ts +0 -461
  236. package/test/integration/routing/plugin-routing-core.test.ts +0 -527
  237. package/test/integration/routing/routing-stage-bug-021.test.ts +0 -275
  238. package/test/integration/routing/routing-stage-greenfield.test.ts +0 -287
  239. package/test/integration/tdd/tdd-cleanup.test.ts +0 -246
  240. package/test/integration/tdd/tdd-orchestrator-core.test.ts +0 -565
  241. package/test/integration/tdd/tdd-orchestrator-failureCategory.test.ts +0 -355
  242. package/test/integration/tdd/tdd-orchestrator-fallback.test.ts +0 -311
  243. package/test/integration/tdd/tdd-orchestrator-lite.test.ts +0 -289
  244. package/test/integration/tdd/tdd-orchestrator-prompts.test.ts +0 -260
  245. package/test/integration/tdd/tdd-orchestrator-verdict.test.ts +0 -536
  246. package/test/integration/tmp/headless-test/test.jsonl +0 -30
  247. package/test/integration/verification/test-scanner.test.ts +0 -403
  248. package/test/integration/verification/verification-asset-check.test.ts +0 -143
  249. package/test/integration/worktree/manager.test.ts +0 -218
  250. package/test/integration/worktree/worktree-merge.test.ts +0 -341
  251. package/test/manual/logging-formatter-demo.ts +0 -158
  252. package/test/ui/tui-agent-panel.test.tsx +0 -99
  253. package/test/ui/tui-pty-integration.test.tsx +0 -146
  254. package/test/unit/acceptance.test.ts +0 -187
  255. package/test/unit/agent-stderr-capture.test.ts +0 -147
  256. package/test/unit/agents/claude.test.ts +0 -107
  257. package/test/unit/analyze-classifier.test.ts +0 -216
  258. package/test/unit/analyze.test.ts +0 -224
  259. package/test/unit/auto-detect.test.ts +0 -250
  260. package/test/unit/cli-status-project-level.test.ts +0 -283
  261. package/test/unit/cli-status.test.ts +0 -418
  262. package/test/unit/commands/common.test.ts +0 -321
  263. package/test/unit/commands/logs.test.ts +0 -458
  264. package/test/unit/commands/runs.test.ts +0 -303
  265. package/test/unit/commands/unlock.test.ts +0 -320
  266. package/test/unit/config/defaults.test.ts +0 -70
  267. package/test/unit/config/quality-commands-schema.test.ts +0 -72
  268. package/test/unit/config/regression-gate-schema.test.ts +0 -160
  269. package/test/unit/config/smart-runner-flag.test.ts +0 -250
  270. package/test/unit/constitution-generators.test.ts +0 -161
  271. package/test/unit/constitution.test.ts +0 -210
  272. package/test/unit/context/context-autodetect.test.ts +0 -297
  273. package/test/unit/context/context-build.test.ts +0 -575
  274. package/test/unit/context/context-coverage.test.ts +0 -236
  275. package/test/unit/context/context-error.test.ts +0 -93
  276. package/test/unit/context/context-estimate-tokens.test.ts +0 -201
  277. package/test/unit/context/context-format.test.ts +0 -302
  278. package/test/unit/context/context-isolation.test.ts +0 -267
  279. package/test/unit/context/context-sort.test.ts +0 -93
  280. package/test/unit/context/context-story.test.ts +0 -108
  281. package/test/unit/context/prior-failures.test.ts +0 -463
  282. package/test/unit/context.test.ts +0 -1726
  283. package/test/unit/cost.test.ts +0 -231
  284. package/test/unit/crash-recovery.test.ts +0 -309
  285. package/test/unit/escalation.test.ts +0 -127
  286. package/test/unit/execution/lifecycle/run-completion.test.ts +0 -240
  287. package/test/unit/execution/lifecycle/run-regression.test.ts +0 -420
  288. package/test/unit/execution/pid-registry.test.ts +0 -241
  289. package/test/unit/execution/sequential-executor.test.ts +0 -235
  290. package/test/unit/execution/sfc-004-dead-code-cleanup.test.ts +0 -89
  291. package/test/unit/execution/structured-failure.test.ts +0 -415
  292. package/test/unit/execution-logging-stderr.test.ts +0 -157
  293. package/test/unit/execution-stage.test.ts +0 -123
  294. package/test/unit/fix-generator.test.ts +0 -276
  295. package/test/unit/formatters.test.ts +0 -468
  296. package/test/unit/greenfield.test.ts +0 -180
  297. package/test/unit/hooks/shell-security.test.ts +0 -40
  298. package/test/unit/interaction/auto-plugin.test.ts +0 -162
  299. package/test/unit/interaction/human-review-trigger.test.ts +0 -165
  300. package/test/unit/interaction-network-failures.test.ts +0 -390
  301. package/test/unit/interaction-plugins.test.ts +0 -472
  302. package/test/unit/logging/formatter.test.ts +0 -456
  303. package/test/unit/merge.test.ts +0 -269
  304. package/test/unit/metrics/aggregator.test.ts +0 -164
  305. package/test/unit/metrics/tracker.test.ts +0 -186
  306. package/test/unit/metrics.test.ts +0 -276
  307. package/test/unit/optimizer/noop.optimizer.test.ts +0 -125
  308. package/test/unit/optimizer/rule-based.optimizer.test.ts +0 -358
  309. package/test/unit/pipeline/event-bus.test.ts +0 -105
  310. package/test/unit/pipeline/routing-partial-override.test.ts +0 -121
  311. package/test/unit/pipeline/runner-retry.test.ts +0 -89
  312. package/test/unit/pipeline/stages/autofix.test.ts +0 -97
  313. package/test/unit/pipeline/stages/completion-review-gate.test.ts +0 -218
  314. package/test/unit/pipeline/stages/execution-ambiguity.test.ts +0 -311
  315. package/test/unit/pipeline/stages/execution-merge-conflict.test.ts +0 -218
  316. package/test/unit/pipeline/stages/rectify.test.ts +0 -101
  317. package/test/unit/pipeline/stages/regression-stage.test.ts +0 -69
  318. package/test/unit/pipeline/stages/review.test.ts +0 -201
  319. package/test/unit/pipeline/stages/routing-idempotence.test.ts +0 -139
  320. package/test/unit/pipeline/stages/routing-initial-complexity.test.ts +0 -321
  321. package/test/unit/pipeline/stages/routing-persistence.test.ts +0 -380
  322. package/test/unit/pipeline/stages/verify.test.ts +0 -267
  323. package/test/unit/pipeline/subscribers/events-writer.test.ts +0 -227
  324. package/test/unit/pipeline/subscribers/hooks.test.ts +0 -84
  325. package/test/unit/pipeline/subscribers/interaction.test.ts +0 -313
  326. package/test/unit/pipeline/subscribers/registry.test.ts +0 -149
  327. package/test/unit/pipeline/subscribers/reporters.test.ts +0 -90
  328. package/test/unit/pipeline/verify-smart-runner.test.ts +0 -345
  329. package/test/unit/prd-auto-default.test.ts +0 -291
  330. package/test/unit/prd-failure-category.test.ts +0 -177
  331. package/test/unit/prd-get-next-story.test.ts +0 -215
  332. package/test/unit/precheck/checks-warnings.test.ts +0 -114
  333. package/test/unit/precheck-checks.test.ts +0 -841
  334. package/test/unit/precheck-story-size-gate.test.ts +0 -288
  335. package/test/unit/precheck-types.test.ts +0 -143
  336. package/test/unit/prompts/builder.test.ts +0 -258
  337. package/test/unit/prompts/loader.test.ts +0 -355
  338. package/test/unit/prompts/sections/conventions.test.ts +0 -30
  339. package/test/unit/prompts/sections/isolation.test.ts +0 -35
  340. package/test/unit/prompts/sections/role-task.test.ts +0 -40
  341. package/test/unit/prompts/sections/sections.test.ts +0 -238
  342. package/test/unit/prompts/sections/story.test.ts +0 -45
  343. package/test/unit/prompts/sections/verdict.test.ts +0 -58
  344. package/test/unit/prompts.test.ts +0 -476
  345. package/test/unit/queue.test.ts +0 -237
  346. package/test/unit/rectification.test.ts +0 -285
  347. package/test/unit/registry.test.ts +0 -288
  348. package/test/unit/review/runner.test.ts +0 -117
  349. package/test/unit/routing/content-hash.test.ts +0 -99
  350. package/test/unit/routing/routing-stability.test.ts +0 -208
  351. package/test/unit/routing/strategies/llm.test.ts +0 -306
  352. package/test/unit/routing-advanced.test.ts +0 -313
  353. package/test/unit/routing-core.test.ts +0 -341
  354. package/test/unit/routing-strategies.test.ts +0 -440
  355. package/test/unit/storyid-events.test.ts +0 -213
  356. package/test/unit/tdd-verdict.test.ts +0 -492
  357. package/test/unit/test-output-parser.test.ts +0 -377
  358. package/test/unit/ui/tui-controls.test.ts +0 -335
  359. package/test/unit/ui/tui-cost-and-pty.test.ts +0 -190
  360. package/test/unit/ui/tui-layout.test.ts +0 -379
  361. package/test/unit/ui/tui-stories.test.ts +0 -333
  362. package/test/unit/unit-isolation.test.ts +0 -135
  363. package/test/unit/utils/git.test.ts +0 -50
  364. package/test/unit/utils/path-security.test.ts +0 -47
  365. package/test/unit/utils-helpers.test.ts +0 -318
  366. package/test/unit/verdict.test.ts +0 -325
  367. package/test/unit/verification/orchestrator-types.test.ts +0 -54
  368. package/test/unit/verification/orchestrator.test.ts +0 -66
  369. package/test/unit/verification/smart-runner-config.test.ts +0 -163
  370. package/test/unit/verification/smart-runner-discovery.test.ts +0 -354
  371. package/test/unit/verification/smart-runner.test.ts +0 -262
  372. package/test/unit/verification/strategies/acceptance.test.ts +0 -33
  373. package/test/unit/verification/strategies/regression.test.ts +0 -87
  374. package/test/unit/verification/strategies/scoped.test.ts +0 -100
  375. package/test/unit/worktree-manager.test.ts +0 -159
  376. package/tsconfig.json +0 -27
package/docs/v0.7-spec.md DELETED
@@ -1,177 +0,0 @@
1
- # nax v0.7 Specification
2
- **Date:** 2026-02-17
3
- **Status:** Draft
4
-
5
- ## Theme: Test Context Injection
6
-
7
- v0.7 addresses test redundancy caused by isolated story sessions. Each agent session currently writes tests without knowing what prior stories already covered, leading to duplicate coverage.
8
-
9
- ## Problem
10
-
11
- During dogfooding (bun-kv-store, 8 stories), we observed:
12
- - 6 tests for "name is required" (missing, empty, whitespace, not string, null, undefined)
13
- - Each story independently writes "comprehensive tests" for its area
14
- - Validation stories re-test what CRUD stories already covered
15
- - **Root cause:** Each session's prompt has zero visibility into existing test files
16
-
17
- ## Solution: Test Context Injection
18
-
19
- Inject a summary of existing test files into each story's prompt so the agent knows what's already covered and avoids duplication.
20
-
21
- ### How It Works
22
-
23
- Before the **prompt stage**, scan the project's test directory and generate a concise summary:
24
-
25
- ```
26
- ## Existing Test Coverage
27
-
28
- ### test/store.test.ts (45 tests)
29
- - CRUD operations: create, read, update, delete
30
- - Error handling: missing key, invalid value
31
- - Batch operations: getMany, setMany
32
-
33
- ### test/validation.test.ts (12 tests)
34
- - Input validation: name required, type checking
35
- - Size limits: max key length, max value size
36
- ```
37
-
38
- This summary is injected into the prompt alongside the story context, constitution, and other context elements.
39
-
40
- ### Context Element
41
-
42
- ```typescript
43
- interface TestCoverageContext {
44
- type: 'test-coverage';
45
- priority: 85; // Below constitution (95), above file context (50)
46
- content: string; // Formatted test summary
47
- tokens: number;
48
- source: string; // e.g., "test/*.test.ts"
49
- }
50
- ```
51
-
52
- ### Summary Generation
53
-
54
- ```typescript
55
- interface TestSummaryOptions {
56
- /** Test directory to scan (default: auto-detect from config or common patterns) */
57
- testDir?: string;
58
- /** Glob pattern for test files (default: "**/*.test.{ts,js,tsx,jsx}") */
59
- testPattern?: string;
60
- /** Max tokens for the summary (default: 500) */
61
- maxTokens?: number;
62
- /** Summary detail level */
63
- detail: 'names-only' | 'names-and-counts' | 'describe-blocks';
64
- }
65
- ```
66
-
67
- **Detail levels:**
68
- - `names-only` — Just file names and test count: `test/store.test.ts (45 tests)`
69
- - `names-and-counts` — File names + top-level describe blocks with counts
70
- - `describe-blocks` — File names + describe blocks + test names (most expensive but most useful)
71
-
72
- **Default:** `names-and-counts` (good balance of info vs tokens)
73
-
74
- ### Scanning Approach
75
-
76
- 1. Find test files matching pattern
77
- 2. For each file, extract `describe()` and `test()`/`it()` block names via regex (no AST parsing needed)
78
- 3. Format as markdown summary
79
- 4. Truncate to token budget
80
-
81
- ### Prompt Injection
82
-
83
- Add to the story prompt:
84
-
85
- ```
86
- ## Existing Test Coverage
87
-
88
- The following tests already exist. DO NOT duplicate this coverage.
89
- Focus only on testing NEW behavior introduced by this story.
90
-
91
- ### test/store.test.ts (45 tests)
92
- - CRUD operations (12 tests): create, read, update, delete, upsert
93
- - Validation (8 tests): required fields, type checks, size limits
94
- - Error handling (6 tests): not found, duplicate key, connection error
95
- ...
96
-
97
- ## Your Story
98
-
99
- US-007: Add input sanitization
100
- ...
101
- ```
102
-
103
- ### Config
104
-
105
- ```json
106
- {
107
- "context": {
108
- "testCoverage": {
109
- "enabled": true,
110
- "detail": "names-and-counts",
111
- "maxTokens": 500,
112
- "testDir": "test",
113
- "testPattern": "**/*.test.{ts,js}"
114
- }
115
- }
116
- }
117
- ```
118
-
119
- ## Acceptance Criteria
120
-
121
- - [ ] Test files scanned and summarized before each story prompt
122
- - [ ] Summary injected into prompt at priority 85
123
- - [ ] `describe()` and `test()` names extracted via regex
124
- - [ ] Summary respects maxTokens budget
125
- - [ ] Config allows enabling/disabling and adjusting detail level
126
- - [ ] Summary updates between stories (reflects tests added by prior stories)
127
- - [ ] No performance regression (scanning should be <100ms for typical projects)
128
-
129
- ## Implementation Plan
130
-
131
- ### Phase 1: Test Scanner
132
- **Files:** `src/context/test-scanner.ts`
133
- - Scan test directory for test files
134
- - Extract describe/test block names via regex
135
- - Format as markdown summary
136
- - Respect token budget
137
-
138
- **Commit:** `feat(context): add test file scanner for coverage summary`
139
-
140
- ### Phase 2: Context Integration
141
- **Files:** `src/context/builder.ts`, `src/pipeline/stages/context.ts`, `src/config/schema.ts`
142
- - Add TestCoverageContext element type
143
- - Wire scanner into context stage (runs before prompt assembly)
144
- - Add config schema for testCoverage settings
145
- - Summary refreshes between stories
146
-
147
- **Commit:** `feat(context): inject test coverage summary into story prompts`
148
-
149
- ### Phase 3: Prompt Guidance
150
- **Files:** `src/execution/prompts.ts`
151
- - Add "DO NOT duplicate" instruction in prompt template
152
- - Reference existing coverage summary
153
- - Reinforce constitution test guidance
154
-
155
- **Commit:** `feat(prompts): add test dedup guidance referencing coverage summary`
156
-
157
- ## Test Strategy
158
- - Mode: test-after
159
- - Unit tests: scanner regex extraction, summary formatting, token truncation
160
- - Integration: context builder includes test coverage element
161
- - Run `bun test && bun run typecheck` after each phase
162
-
163
- ## Estimated Effort
164
- ~300-400 LOC across 3 phases.
165
-
166
- ## Measurement
167
-
168
- Compare v0.5.0 (no dedup) vs v0.7.0 (context injection) on the same dogfood project:
169
-
170
- | Metric | v0.5.0 | v0.7.0 |
171
- |:---|:---|:---|
172
- | Total tests generated | ? | ? |
173
- | Redundant tests | ? | ? |
174
- | Code quality grade | ? | ? |
175
- | Acceptance rate | ? | ? |
176
- | Total cost | ? | ? |
177
- | Total time | ? | ? |
@@ -1,206 +0,0 @@
1
- # v0.8 — LLM-Enhanced Routing
2
-
3
- > Priority: **HIGH** — keyword routing causes costly misroutes (e.g., US-008 simple barrel exports → powerful + TDD due to "public api" keyword match).
4
-
5
- ## Problem
6
-
7
- Keyword-based routing is brittle and expensive:
8
- 1. **False positives**: "public api" in title → three-session-tdd even for simple barrel exports ($1.25 wasted)
9
- 2. **False negatives**: Complex integration work without magic keywords → test-after on fast tier
10
- 3. **No semantic understanding**: Can't assess *actual* implementation effort from acceptance criteria
11
- 4. **Keyword overlap**: Security keywords fire on simple "add auth header to request" stories
12
-
13
- Evidence from dogfood runs:
14
- - Run D2: US-008 ("Export public API and create barrel exports") — simple task, keyword matched "public api" → powerful + three-session-tdd. Cost: $1.25. Should have been: fast + test-after (~$0.10).
15
-
16
- ## Design
17
-
18
- ### Config
19
-
20
- ```json
21
- {
22
- "routing": {
23
- "strategy": "llm",
24
- "llm": {
25
- "model": "fast",
26
- "fallbackToKeywords": true,
27
- "maxInputTokens": 2000,
28
- "cacheDecisions": true
29
- }
30
- }
31
- }
32
- ```
33
-
34
- - `model`: Tier used for the routing LLM call itself (default: `fast` — routing should be cheap)
35
- - `fallbackToKeywords`: If LLM call fails (timeout, parse error), fall back to keyword strategy (default: `true`)
36
- - `maxInputTokens`: Token budget for story context sent to LLM (default: `2000`)
37
- - `cacheDecisions`: Cache routing decisions per story ID within a run (default: `true`)
38
-
39
- ### LLM Prompt
40
-
41
- The LLM receives a structured prompt with the story and must return a JSON decision:
42
-
43
- ```
44
- You are a code task router. Given a user story, classify its complexity and select the appropriate execution strategy.
45
-
46
- ## Story
47
- Title: {title}
48
- Description: {description}
49
- Acceptance Criteria:
50
- {acceptanceCriteria as numbered list}
51
- Tags: {tags}
52
-
53
- ## Available Tiers
54
- - fast: Simple changes, typos, config updates, boilerplate. <30 min of coding.
55
- - balanced: Standard features, moderate logic, straightforward tests. 30-90 min.
56
- - powerful: Complex architecture, security-critical, multi-file refactors, novel algorithms. >90 min.
57
-
58
- ## Available Test Strategies
59
- - test-after: Write implementation first, add tests after. For straightforward work.
60
- - three-session-tdd: Separate test-writer → implementer → verifier sessions. For complex/critical work where test design matters.
61
-
62
- ## Rules
63
- - Default to the CHEAPEST option that will succeed.
64
- - three-session-tdd ONLY when: (a) security/auth logic, (b) complex algorithms, (c) public API contracts that consumers depend on.
65
- - Simple barrel exports, re-exports, or index files are ALWAYS test-after + fast, regardless of keywords.
66
- - A story touching many files doesn't automatically mean complex — copy-paste refactors are simple.
67
-
68
- Respond with ONLY this JSON (no markdown, no explanation):
69
- {"complexity":"simple|medium|complex|expert","modelTier":"fast|balanced|powerful","testStrategy":"test-after|three-session-tdd","reasoning":"<one line>"}
70
- ```
71
-
72
- ### Implementation
73
-
74
- Modify `src/routing/strategies/llm.ts`:
75
-
76
- ```typescript
77
- export const llmStrategy: RoutingStrategy = {
78
- name: "llm",
79
-
80
- async route(story: UserStory, context: RoutingContext): Promise<RoutingDecision | null> {
81
- const config = context.config;
82
- const llmConfig = config.routing.llm;
83
- if (!llmConfig) return null;
84
-
85
- // Check cache
86
- if (llmConfig.cacheDecisions && cachedDecisions.has(story.id)) {
87
- return cachedDecisions.get(story.id)!;
88
- }
89
-
90
- try {
91
- const prompt = buildRoutingPrompt(story, config);
92
- const modelId = config.models[llmConfig.model ?? "fast"];
93
-
94
- const result = await callLlm(modelId, prompt, {
95
- maxTokens: 200,
96
- timeout: 15_000, // 15s hard limit — routing shouldn't block
97
- });
98
-
99
- const decision = parseRoutingResponse(result, story, config);
100
-
101
- if (llmConfig.cacheDecisions) {
102
- cachedDecisions.set(story.id, decision);
103
- }
104
-
105
- return decision;
106
- } catch (err) {
107
- logger.warn(`LLM routing failed for ${story.id}: ${err.message}`);
108
- return null; // Falls through to keyword strategy
109
- }
110
- },
111
- };
112
- ```
113
-
114
- ### LLM Call Mechanism
115
-
116
- nax already spawns Claude Code via `Bun.spawn`. For the routing LLM call, we need a **lightweight** approach:
117
-
118
- **Option A — Claude Code one-shot**: `claude -p "..." --model <model>` with 15s timeout.
119
- - Pro: Reuses existing infra, model aliases work.
120
- - Con: ~3-5s startup overhead per call. For 9 stories = 27-45s total.
121
-
122
- **Option B — Direct API call**: HTTP request to provider API (Anthropic/OpenAI/Google).
123
- - Pro: <1s per call, batch-friendly.
124
- - Con: Needs API key handling, provider-specific code.
125
-
126
- **Recommendation: Option A** for v0.8 (simplicity), with config option to batch all stories in one call:
127
-
128
- ```
129
- // Single LLM call for all pending stories (batch mode)
130
- "Route these 9 stories:\n1. US-001: ...\n2. US-002: ...\n\nRespond with JSON array: [{id, complexity, modelTier, testStrategy, reasoning}]"
131
- ```
132
-
133
- Batch mode cuts 9 calls → 1 call. ~5s total routing overhead.
134
-
135
- ### Strategy Interface Change
136
-
137
- The current `RoutingStrategy.route()` is synchronous. LLM routing needs async:
138
-
139
- ```typescript
140
- export interface RoutingStrategy {
141
- readonly name: string;
142
- route(story: UserStory, context: RoutingContext): RoutingDecision | null | Promise<RoutingDecision | null>;
143
- }
144
- ```
145
-
146
- `StrategyChain.route()` becomes async (already called with `await` in `routeStory()`).
147
-
148
- ### Error Handling
149
-
150
- | Failure | Behavior |
151
- |:---|:---|
152
- | LLM timeout (>15s) | Return null → keyword fallback |
153
- | JSON parse error | Return null → keyword fallback |
154
- | Invalid field values | Return null → keyword fallback |
155
- | LLM returns unknown complexity | Clamp to nearest valid value |
156
- | All failures logged | `logger.warn()` with story ID |
157
-
158
- ### Logging
159
-
160
- ```
161
- [routing] LLM classified US-008 as simple/fast/test-after: "Barrel export file, no logic to test"
162
- [routing] LLM routing failed for US-003: timeout after 15000ms, falling back to keyword
163
- ```
164
-
165
- ## Cost Analysis
166
-
167
- | Scenario | Keyword Cost | LLM Routing Cost | Savings |
168
- |:---|:---|:---|:---|
169
- | US-008 (barrel exports) | $1.25 (powerful+TDD) | $0.10 (fast+test-after) + $0.01 routing | **$1.14 saved** |
170
- | 9-story run (batch) | Variable | ~$0.02 routing overhead | Net positive if prevents 1+ misroute |
171
-
172
- LLM routing call: ~500 input tokens + 100 output tokens per story = ~$0.001 on Flash.
173
- Batch mode (9 stories): ~2000 input + 400 output = ~$0.003 total.
174
-
175
- **ROI: One prevented misroute pays for ~400 routing calls.**
176
-
177
- ## Acceptance Criteria
178
-
179
- 1. `config.routing.strategy = "llm"` activates LLM routing
180
- 2. LLM strategy returns structured `RoutingDecision` with reasoning
181
- 3. Falls back to keyword strategy on any LLM failure
182
- 4. Batch mode: single LLM call routes all pending stories
183
- 5. Routing decisions cached per story ID within a run
184
- 6. Strategy chain async support (non-breaking — keyword still sync)
185
- 7. Routing overhead < 10s for batch of 10 stories
186
- 8. Logging: every LLM routing decision logged with reasoning
187
-
188
- ## Files to Modify
189
-
190
- - `src/routing/strategies/llm.ts` — Main implementation
191
- - `src/routing/strategy.ts` — Make interface async-compatible
192
- - `src/routing/chain.ts` — `route()` becomes async
193
- - `src/config/schema.ts` — Add `LlmRoutingConfig` type
194
- - `src/config/defaults.ts` — Add LLM routing defaults
195
- - `test/routing/llm-strategy.test.ts` — Unit tests
196
- - `test/routing/chain.test.ts` — Update for async
197
-
198
- ## Non-Goals (v0.8)
199
-
200
- - Direct API calls (Option B) — defer to v0.9+
201
- - Adaptive routing (learning from historical data) — existing stub, separate feature
202
- - Custom routing prompts — hardcoded prompt is fine for now
203
-
204
- ---
205
-
206
- *Created 2026-02-19*
@@ -1,132 +0,0 @@
1
- # Feature: Structured Logging for nax v0.8
2
-
3
- ## Problem
4
-
5
- nax currently uses raw `console.log` with chalk formatting throughout the codebase. Developers running `nax run` in headless mode have no way to:
6
- - Control verbosity (only see errors vs full debug output)
7
- - Get timing data per story/stage for performance analysis
8
- - Review token counts and API costs per story
9
- - Debug failures with full prompt/response dumps
10
- - Parse logs programmatically for CI/CD integration
11
-
12
- ## Requirements
13
-
14
- **REQ-1: Log Levels**
15
- - Support 4 levels: `error`, `warn`, `info`, `debug`
16
- - Default level: `info`
17
- - CLI flags: `--verbose` (debug), `--quiet` (error+warn only), `--silent` (error only)
18
- - Environment variable override: `NAX_LOG_LEVEL=debug`
19
-
20
- **REQ-2: Structured Log Format**
21
- - Each log entry includes: `timestamp`, `level`, `stage`, `storyId`, `message`
22
- - Console output: human-readable with chalk (current style, but level-gated)
23
- - File output: JSON Lines (`.jsonl`) for machine parsing
24
- - File location: `nax/features/<name>/runs/<run-id>.jsonl`
25
-
26
- **REQ-3: Stage Lifecycle Events**
27
- - Emit structured events at each stage transition:
28
- - `run.start` — feature name, story count, config
29
- - `iteration.start` — iteration number, story id, complexity
30
- - `context.built` — file count, token estimate
31
- - `agent.start` — model, prompt size (chars/tokens), TDD strategy
32
- - `agent.complete` — exit code, duration, stdout size, cost estimate
33
- - `test.start` — test command
34
- - `test.complete` — pass/fail, test count, duration
35
- - `verification.start` — verification strategy
36
- - `verification.complete` — pass/fail, issues found
37
- - `story.complete` — story id, status, attempts, duration, cost
38
- - `iteration.complete` — stories done this iteration
39
- - `run.complete` — total stories, passed, failed, cost, duration
40
-
41
- **REQ-4: Per-Story Metrics**
42
- - Track and report per story: duration, API cost, token count (in/out), attempts, test count
43
- - Include in `prd.json` story metadata after run completes
44
- - Summary table at end of run (visible at `info` level)
45
-
46
- **REQ-5: Debug Mode**
47
- - `--debug` or `NAX_LOG_LEVEL=debug` enables:
48
- - Full prompt text logged to file (not console)
49
- - Full agent response logged to file
50
- - Claude CLI command logged
51
- - Environment variables passed to agent (sanitized — mask tokens)
52
-
53
- **REQ-6: Run History**
54
- - Each `nax run` creates a unique run ID (ISO timestamp or UUID)
55
- - Log file persisted at `nax/features/<name>/runs/<run-id>.jsonl`
56
- - Latest run symlinked as `nax/features/<name>/runs/latest.jsonl`
57
- - `nax runs list -f <feature>` lists past runs with summary
58
- - `nax runs show <run-id> -f <feature>` shows detailed run report
59
-
60
- **REQ-7: Logger API (Internal)**
61
- - Singleton logger instance, configured once at CLI entry
62
- - API: `logger.info(stage, storyId, message, data?)`, `logger.debug(...)`, etc.
63
- - Replace all `console.log` calls with logger calls
64
- - Logger writes to both console (filtered by level) and file (all levels)
65
-
66
- ## Acceptance Criteria
67
-
68
- **AC-1:** `nax run -f foo --headless` shows same output as today at `info` level
69
- **AC-2:** `nax run -f foo --verbose` shows agent timing, token counts, and prompt sizes
70
- **AC-3:** `nax run -f foo --quiet` shows only warnings, errors, and final summary
71
- **AC-4:** After a run, `nax/features/foo/runs/latest.jsonl` contains structured events
72
- **AC-5:** Each JSONL line is valid JSON with `timestamp`, `level`, `stage`, `storyId` fields
73
- **AC-6:** `nax runs list -f foo` shows past runs with date, stories, cost, status
74
- **AC-7:** Per-story metrics (duration, cost, attempts) appear in the run summary table
75
- **AC-8:** Debug mode logs full prompts to file without printing to console
76
- **AC-9:** No `console.log` calls remain in src/ (all replaced with logger)
77
-
78
- ## Technical Notes
79
-
80
- ### Logger Implementation
81
- ```typescript
82
- // src/logger.ts
83
- export type LogLevel = "error" | "warn" | "info" | "debug";
84
-
85
- export interface LogEntry {
86
- timestamp: string;
87
- level: LogLevel;
88
- stage: string;
89
- storyId?: string;
90
- message: string;
91
- data?: Record<string, unknown>;
92
- }
93
-
94
- export class Logger {
95
- constructor(options: { level: LogLevel; filePath?: string });
96
- error(stage: string, message: string, data?: Record<string, unknown>): void;
97
- warn(stage: string, message: string, data?: Record<string, unknown>): void;
98
- info(stage: string, message: string, data?: Record<string, unknown>): void;
99
- debug(stage: string, message: string, data?: Record<string, unknown>): void;
100
- withStory(storyId: string): StoryLogger; // scoped logger
101
- }
102
- ```
103
-
104
- ### Migration Strategy
105
- 1. Create `src/logger.ts` with Logger class
106
- 2. Add `--verbose`, `--quiet`, `--silent` flags to `bin/nax.ts`
107
- 3. Replace `console.log` calls one module at a time
108
- 4. Add stage events to orchestrator loop
109
- 5. Add run history commands
110
-
111
- ### Dependencies
112
- - None (use Bun built-in fs for file writing)
113
- - chalk remains for console formatting
114
-
115
- ### File Structure
116
- ```
117
- nax/features/<name>/runs/
118
- ├── 2026-02-19T10-30-00Z.jsonl
119
- ├── 2026-02-20T14-15-00Z.jsonl
120
- └── latest.jsonl -> 2026-02-20T14-15-00Z.jsonl
121
- ```
122
-
123
- ## Out of Scope
124
- - Remote log shipping (Datadog, Sentry, etc.)
125
- - Log rotation or cleanup policies
126
- - Real-time log streaming via WebSocket
127
- - Custom log formatters or plugins
128
- - Metrics dashboard or visualization
129
-
130
- ---
131
-
132
- *Spec created 2026-02-19 for nax v0.8*
@@ -1,112 +0,0 @@
1
- # v0.9.3 — Prompt Audit & Context Isolation
2
-
3
- **Status:** Draft
4
- **Author:** Subrina
5
- **Date:** 2026-02-23
6
- **Base:** v0.9.2
7
-
8
- ## Overview
9
-
10
- Add tooling to inspect and verify story-scoped prompt isolation. Ensures each story's agent prompt contains only context relevant to that story — no cross-story leakage.
11
-
12
- ## Motivation
13
-
14
- - No way to inspect what prompts agents actually receive without running a full `nax run`
15
- - `generateTestCoverageSummary` scans the entire repo's test files, leaking context from other stories into unrelated story prompts
16
- - No automated test verifying that `buildContext()` properly isolates per-story context
17
- - Prompt inspection is critical for debugging routing, context, and the upcoming v0.10 prompt optimizer
18
-
19
- ## Deliverables
20
-
21
- ### 1. `nax prompts` CLI Command
22
-
23
- New subcommand that assembles prompts for all stories in a feature without executing agents.
24
-
25
- ```bash
26
- # Dump all story prompts to stdout
27
- nax prompts -f core
28
-
29
- # Write to directory
30
- nax prompts -f core --out ./prompt-dump/
31
-
32
- # Single story
33
- nax prompts -f core --story US-003
34
- ```
35
-
36
- **Pipeline stages executed:** routing → context → constitution → prompt (stops before execution).
37
-
38
- **Output per story:**
39
- ```
40
- prompt-dump/
41
- US-001.prompt.md # Final assembled prompt
42
- US-001.context.md # Context markdown only (for isolation audit)
43
- US-002.prompt.md
44
- US-002.context.md
45
- ...
46
- ```
47
-
48
- Each file includes a YAML frontmatter header:
49
- ```yaml
50
- ---
51
- storyId: US-003
52
- title: "Create health indicator interface"
53
- testStrategy: test-after
54
- modelTier: balanced
55
- contextTokens: 2450
56
- promptTokens: 3800
57
- dependencies: [US-001]
58
- contextElements:
59
- - type: progress, tokens: 45
60
- - type: story, storyId: US-003, tokens: 890
61
- - type: dependency, storyId: US-001, tokens: 720
62
- - type: test-coverage, tokens: 795
63
- ---
64
- ```
65
-
66
- **For three-session-tdd stories:** outputs `US-001.test-writer.md`, `US-001.implementer.md`, `US-001.verifier.md`.
67
-
68
- ### 2. `buildContext` Isolation Unit Tests
69
-
70
- Test that `buildContext()` for a given story only includes:
71
- - The current story
72
- - Declared dependency stories
73
- - Progress summary (counts only, no story details)
74
- - Test coverage (to be scoped — see #3)
75
- - Error context from current story only
76
- - File context from current story's `contextFiles` only
77
-
78
- **Negative assertions:**
79
- - No story IDs from non-dependency stories appear in output
80
- - No acceptance criteria from unrelated stories leak through
81
- - Progress summary contains only aggregate counts, not story titles
82
-
83
- ### 3. Scoped Test Coverage Scanner
84
-
85
- Fix `generateTestCoverageSummary` to scope results to story-relevant files:
86
-
87
- **Current behavior:** Scans all test files in `testDir` → agent sees coverage from every story.
88
-
89
- **New behavior:**
90
- 1. If story has `contextFiles` → derive test file patterns from source paths (e.g., `src/health.service.ts` → `test/health.service.spec.ts`)
91
- 2. If no `contextFiles` → fall back to full scan (current behavior) with a warning logged
92
- 3. Add `context.testCoverage.scopeToStory` config option (default: `true`)
93
-
94
- ## User Stories
95
-
96
- | # | Title | Complexity | Test Strategy | Dependencies |
97
- |:--|:------|:-----------|:--------------|:-------------|
98
- | US-001 | `nax prompts` CLI command with file output | medium | test-after | — |
99
- | US-002 | `buildContext` isolation unit tests | simple | test-after | — |
100
- | US-003 | Scope test coverage scanner to story-relevant files | medium | test-after | — |
101
-
102
- ## Non-Goals
103
-
104
- - No changes to prompt assembly logic (that's v0.10 optimizer territory)
105
- - No `--optimized` flag yet (depends on v0.10)
106
- - No changes to TDD orchestrator prompt builders (just audit them)
107
-
108
- ## Compatibility
109
-
110
- - `nax prompts` is additive — new CLI command, no existing behavior changed
111
- - Test coverage scoping is behind config flag with backward-compatible default
112
- - No breaking changes