@nathapp/nax 0.18.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.
Files changed (459) hide show
  1. package/.gitlab-ci.yml +96 -0
  2. package/BRIEF.md +140 -0
  3. package/CHANGELOG.md +60 -0
  4. package/CLAUDE.md +159 -0
  5. package/README.md +373 -0
  6. package/US-007-IMPLEMENTATION.md +139 -0
  7. package/bin/nax.ts +930 -0
  8. package/biome.json +14 -0
  9. package/bun.lock +168 -0
  10. package/bunfig.toml +11 -0
  11. package/docs/20260216-fix-plan-context-review.md +56 -0
  12. package/docs/20260216-relentless-vs-ngent-comparison.md +208 -0
  13. package/docs/20260216-v02-plan.md +136 -0
  14. package/docs/20260216-v02-review.md +685 -0
  15. package/docs/20260217-dogfood-findings.md +56 -0
  16. package/docs/20260217-p2-plus-plan.md +117 -0
  17. package/docs/20260217-partial-fixes-plan.md +62 -0
  18. package/docs/20260217-plan-analyze-spec.md +117 -0
  19. package/docs/20260217-post-impl-review.md +1137 -0
  20. package/docs/20260217-quick-wins-plan.md +66 -0
  21. package/docs/20260217-split-runner-plan.md +75 -0
  22. package/docs/20260217-v03-impl-plan.md +80 -0
  23. package/docs/20260217-v03-post-impl-review.md +589 -0
  24. package/docs/20260217-v04-impl-plan.md +86 -0
  25. package/docs/20260217-v05-post-impl-review.md +850 -0
  26. package/docs/20260217-v06-post-impl-review.md +817 -0
  27. package/docs/20260218-adr003-port-plan.md +151 -0
  28. package/docs/20260218-review-adr003-verification.md +175 -0
  29. package/docs/20260219-fix-plan-bug16-19.md +79 -0
  30. package/docs/20260219-fix-plan-bug20-22.md +114 -0
  31. package/docs/20260219-plan-llm-routing.md +116 -0
  32. package/docs/20260219-review-bug20-22-fixes.md +135 -0
  33. package/docs/20260219-routing-baseline-keyword.md +63 -0
  34. package/docs/20260220-plan-structured-logging-p1.md +80 -0
  35. package/docs/20260220-plan-structured-logging-p2.md +37 -0
  36. package/docs/20260220-review-llm-routing.md +180 -0
  37. package/docs/20260220-review-post-fix-llm-routing.md +70 -0
  38. package/docs/20260221-fix-plan-relevantfiles-split.md +101 -0
  39. package/docs/20260221-fix-plan-routing-mode.md +125 -0
  40. package/docs/20260221-review-v0.9-implementation.md +379 -0
  41. package/docs/20260222-fix-plan-v091-routing-isolation.md +197 -0
  42. package/docs/20260223-fix-plan-prompt-audit.md +62 -0
  43. package/docs/20260224-nax-roadmap-phases.md +189 -0
  44. package/docs/20260225-phase2-llm-service-layer.md +401 -0
  45. package/docs/20260225-review-v0.10.1.md +187 -0
  46. package/docs/20260303-v010-implementation-plan.md +165 -0
  47. package/docs/CLAUDE.md.bak +191 -0
  48. package/docs/ROADMAP.md +165 -0
  49. package/docs/SPEC-rectification.md +0 -0
  50. package/docs/SPEC.md +324 -0
  51. package/docs/US-001-plugin-loading-verification.md +152 -0
  52. package/docs/architecture-analysis.md +1076 -0
  53. package/docs/bugs/BUG-21-escalation-null-attempts.md +48 -0
  54. package/docs/bugs-from-dogfood-run-c.md +243 -0
  55. package/docs/code-review-20260228.md +612 -0
  56. package/docs/code-review-v0.15.0.md +629 -0
  57. package/docs/hook-lifecycle-test-plan.md +149 -0
  58. package/docs/releases/v0.11.0-and-earlier.md +20 -0
  59. package/docs/releases/v0.12.0.md +15 -0
  60. package/docs/releases/v0.13.0.md +14 -0
  61. package/docs/releases/v0.14.0.md +20 -0
  62. package/docs/releases/v0.14.1.md +36 -0
  63. package/docs/releases/v0.14.2.md +51 -0
  64. package/docs/releases/v0.14.3.md +174 -0
  65. package/docs/releases/v0.14.4.md +94 -0
  66. package/docs/releases/v0.15.0.md +502 -0
  67. package/docs/releases/v0.15.1.md +170 -0
  68. package/docs/releases/v0.15.3.md +193 -0
  69. package/docs/specs/status-file-v0.10.1.md +812 -0
  70. package/docs/v0.10-global-config.md +206 -0
  71. package/docs/v0.10-plugin-system.md +415 -0
  72. package/docs/v0.10-prompt-optimizer.md +234 -0
  73. package/docs/v0.3-spec.md +244 -0
  74. package/docs/v0.4-spec.md +140 -0
  75. package/docs/v0.5-spec.md +237 -0
  76. package/docs/v0.6-spec.md +371 -0
  77. package/docs/v0.7-spec.md +177 -0
  78. package/docs/v0.8-llm-routing.md +206 -0
  79. package/docs/v0.8-structured-logging.md +132 -0
  80. package/docs/v0.9.3-prompt-audit.md +112 -0
  81. package/examples/plugins/console-reporter/index.test.ts +207 -0
  82. package/examples/plugins/console-reporter/index.ts +110 -0
  83. package/nax/config.json +147 -0
  84. package/nax/features/bugfix-v0171/prd.json +52 -0
  85. package/nax/features/config-management/prd.json +108 -0
  86. package/nax/features/config-management/progress.txt +5 -0
  87. package/nax/features/diagnose/acceptance.test.ts +412 -0
  88. package/nax/features/diagnose/prd.json +41 -0
  89. package/nax/features/orchestration-fixes/prd.json +89 -0
  90. package/nax/features/orchestration-fixes/progress.txt +1 -0
  91. package/nax/features/plugin-integration/US-007-VERIFICATION.md +259 -0
  92. package/nax/features/plugin-integration/prd.json +208 -0
  93. package/nax/features/plugin-integration/progress.txt +5 -0
  94. package/nax/features/precheck/prd.json +205 -0
  95. package/nax/features/precheck/progress.txt +15 -0
  96. package/nax/features/structured-logging/prd.json +199 -0
  97. package/nax/features/unlock/prd.json +36 -0
  98. package/package.json +47 -0
  99. package/src/acceptance/fix-generator.ts +348 -0
  100. package/src/acceptance/generator.ts +282 -0
  101. package/src/acceptance/index.ts +30 -0
  102. package/src/acceptance/types.ts +79 -0
  103. package/src/agents/claude-decompose.ts +169 -0
  104. package/src/agents/claude-plan.ts +139 -0
  105. package/src/agents/claude.ts +324 -0
  106. package/src/agents/cost.ts +268 -0
  107. package/src/agents/index.ts +13 -0
  108. package/src/agents/registry.ts +48 -0
  109. package/src/agents/types-extended.ts +133 -0
  110. package/src/agents/types.ts +113 -0
  111. package/src/agents/validation.ts +69 -0
  112. package/src/analyze/classifier.ts +305 -0
  113. package/src/analyze/index.ts +16 -0
  114. package/src/analyze/scanner.ts +175 -0
  115. package/src/analyze/types.ts +51 -0
  116. package/src/cli/accept.ts +108 -0
  117. package/src/cli/analyze-parser.ts +284 -0
  118. package/src/cli/analyze.ts +207 -0
  119. package/src/cli/config.ts +561 -0
  120. package/src/cli/constitution.ts +109 -0
  121. package/src/cli/diagnose-analysis.ts +159 -0
  122. package/src/cli/diagnose-formatter.ts +87 -0
  123. package/src/cli/diagnose.ts +203 -0
  124. package/src/cli/generate.ts +127 -0
  125. package/src/cli/index.ts +37 -0
  126. package/src/cli/init.ts +188 -0
  127. package/src/cli/interact.ts +295 -0
  128. package/src/cli/plan.ts +198 -0
  129. package/src/cli/plugins.ts +111 -0
  130. package/src/cli/prompts.ts +295 -0
  131. package/src/cli/runs.ts +174 -0
  132. package/src/cli/status-cost.ts +151 -0
  133. package/src/cli/status-features.ts +338 -0
  134. package/src/cli/status.ts +13 -0
  135. package/src/commands/common.ts +171 -0
  136. package/src/commands/diagnose.ts +17 -0
  137. package/src/commands/index.ts +8 -0
  138. package/src/commands/logs.ts +384 -0
  139. package/src/commands/precheck.ts +86 -0
  140. package/src/commands/unlock.ts +96 -0
  141. package/src/config/defaults.ts +160 -0
  142. package/src/config/index.ts +22 -0
  143. package/src/config/loader.ts +121 -0
  144. package/src/config/merger.ts +147 -0
  145. package/src/config/path-security.ts +121 -0
  146. package/src/config/paths.ts +27 -0
  147. package/src/config/schema.ts +56 -0
  148. package/src/config/schemas.ts +286 -0
  149. package/src/config/types.ts +423 -0
  150. package/src/config/validate.ts +103 -0
  151. package/src/constitution/generator.ts +191 -0
  152. package/src/constitution/generators/aider.ts +41 -0
  153. package/src/constitution/generators/claude.ts +35 -0
  154. package/src/constitution/generators/cursor.ts +36 -0
  155. package/src/constitution/generators/opencode.ts +38 -0
  156. package/src/constitution/generators/types.ts +33 -0
  157. package/src/constitution/generators/windsurf.ts +36 -0
  158. package/src/constitution/index.ts +10 -0
  159. package/src/constitution/loader.ts +133 -0
  160. package/src/constitution/types.ts +31 -0
  161. package/src/context/auto-detect.ts +227 -0
  162. package/src/context/builder.ts +246 -0
  163. package/src/context/elements.ts +83 -0
  164. package/src/context/formatter.ts +107 -0
  165. package/src/context/generator.ts +129 -0
  166. package/src/context/generators/aider.ts +34 -0
  167. package/src/context/generators/claude.ts +28 -0
  168. package/src/context/generators/cursor.ts +28 -0
  169. package/src/context/generators/opencode.ts +30 -0
  170. package/src/context/generators/windsurf.ts +28 -0
  171. package/src/context/greenfield.ts +114 -0
  172. package/src/context/index.ts +33 -0
  173. package/src/context/injector.ts +279 -0
  174. package/src/context/test-scanner.ts +370 -0
  175. package/src/context/types.ts +98 -0
  176. package/src/errors.ts +67 -0
  177. package/src/execution/batching.ts +157 -0
  178. package/src/execution/crash-recovery.ts +373 -0
  179. package/src/execution/escalation/escalation.ts +44 -0
  180. package/src/execution/escalation/index.ts +13 -0
  181. package/src/execution/escalation/tier-escalation.ts +295 -0
  182. package/src/execution/escalation/tier-outcome.ts +158 -0
  183. package/src/execution/helpers.ts +38 -0
  184. package/src/execution/index.ts +45 -0
  185. package/src/execution/lifecycle/acceptance-loop.ts +272 -0
  186. package/src/execution/lifecycle/headless-formatter.ts +85 -0
  187. package/src/execution/lifecycle/index.ts +12 -0
  188. package/src/execution/lifecycle/parallel-lifecycle.ts +101 -0
  189. package/src/execution/lifecycle/precheck-runner.ts +140 -0
  190. package/src/execution/lifecycle/run-cleanup.ts +81 -0
  191. package/src/execution/lifecycle/run-completion.ts +129 -0
  192. package/src/execution/lifecycle/run-initialization.ts +141 -0
  193. package/src/execution/lifecycle/run-lifecycle.ts +312 -0
  194. package/src/execution/lifecycle/run-setup.ts +204 -0
  195. package/src/execution/lifecycle/story-hooks.ts +38 -0
  196. package/src/execution/lifecycle/story-size-prompts.ts +123 -0
  197. package/src/execution/lock.ts +115 -0
  198. package/src/execution/parallel-executor.ts +216 -0
  199. package/src/execution/parallel.ts +400 -0
  200. package/src/execution/pid-registry.ts +280 -0
  201. package/src/execution/pipeline-result-handler.ts +388 -0
  202. package/src/execution/post-verify-rectification.ts +188 -0
  203. package/src/execution/post-verify.ts +274 -0
  204. package/src/execution/progress.ts +25 -0
  205. package/src/execution/prompts.ts +127 -0
  206. package/src/execution/queue-handler.ts +109 -0
  207. package/src/execution/rectification.ts +13 -0
  208. package/src/execution/runner.ts +377 -0
  209. package/src/execution/sequential-executor.ts +388 -0
  210. package/src/execution/status-file.ts +264 -0
  211. package/src/execution/status-writer.ts +139 -0
  212. package/src/execution/story-context.ts +229 -0
  213. package/src/execution/test-output-parser.ts +14 -0
  214. package/src/execution/verification.ts +72 -0
  215. package/src/hooks/index.ts +2 -0
  216. package/src/hooks/runner.ts +286 -0
  217. package/src/hooks/types.ts +67 -0
  218. package/src/interaction/chain.ts +154 -0
  219. package/src/interaction/index.ts +60 -0
  220. package/src/interaction/init.ts +83 -0
  221. package/src/interaction/plugins/auto.ts +217 -0
  222. package/src/interaction/plugins/cli.ts +300 -0
  223. package/src/interaction/plugins/telegram.ts +384 -0
  224. package/src/interaction/plugins/webhook.ts +258 -0
  225. package/src/interaction/state.ts +171 -0
  226. package/src/interaction/triggers.ts +229 -0
  227. package/src/interaction/types.ts +163 -0
  228. package/src/logger/formatters.ts +84 -0
  229. package/src/logger/index.ts +16 -0
  230. package/src/logger/logger.ts +298 -0
  231. package/src/logger/types.ts +48 -0
  232. package/src/logging/formatter.ts +355 -0
  233. package/src/logging/index.ts +22 -0
  234. package/src/logging/types.ts +93 -0
  235. package/src/metrics/aggregator.ts +190 -0
  236. package/src/metrics/index.ts +14 -0
  237. package/src/metrics/tracker.ts +200 -0
  238. package/src/metrics/types.ts +109 -0
  239. package/src/optimizer/index.ts +62 -0
  240. package/src/optimizer/noop.optimizer.ts +24 -0
  241. package/src/optimizer/rule-based.optimizer.ts +248 -0
  242. package/src/optimizer/types.ts +53 -0
  243. package/src/pipeline/events.ts +130 -0
  244. package/src/pipeline/index.ts +19 -0
  245. package/src/pipeline/runner.ts +161 -0
  246. package/src/pipeline/stages/acceptance.ts +197 -0
  247. package/src/pipeline/stages/completion.ts +99 -0
  248. package/src/pipeline/stages/constitution.ts +63 -0
  249. package/src/pipeline/stages/context.ts +117 -0
  250. package/src/pipeline/stages/execution.ts +194 -0
  251. package/src/pipeline/stages/index.ts +62 -0
  252. package/src/pipeline/stages/optimizer.ts +74 -0
  253. package/src/pipeline/stages/prompt.ts +57 -0
  254. package/src/pipeline/stages/queue-check.ts +103 -0
  255. package/src/pipeline/stages/review.ts +181 -0
  256. package/src/pipeline/stages/routing.ts +81 -0
  257. package/src/pipeline/stages/verify.ts +100 -0
  258. package/src/pipeline/types.ts +167 -0
  259. package/src/plugins/index.ts +31 -0
  260. package/src/plugins/loader.ts +287 -0
  261. package/src/plugins/registry.ts +168 -0
  262. package/src/plugins/types.ts +327 -0
  263. package/src/plugins/validator.ts +352 -0
  264. package/src/prd/index.ts +172 -0
  265. package/src/prd/types.ts +202 -0
  266. package/src/precheck/checks-blockers.ts +391 -0
  267. package/src/precheck/checks-warnings.ts +142 -0
  268. package/src/precheck/checks.ts +30 -0
  269. package/src/precheck/index.ts +247 -0
  270. package/src/precheck/story-size-gate.ts +144 -0
  271. package/src/precheck/types.ts +31 -0
  272. package/src/queue/index.ts +2 -0
  273. package/src/queue/manager.ts +254 -0
  274. package/src/queue/types.ts +54 -0
  275. package/src/review/index.ts +8 -0
  276. package/src/review/runner.ts +172 -0
  277. package/src/review/types.ts +66 -0
  278. package/src/routing/builder.ts +81 -0
  279. package/src/routing/chain.ts +74 -0
  280. package/src/routing/index.ts +16 -0
  281. package/src/routing/loader.ts +58 -0
  282. package/src/routing/router.ts +303 -0
  283. package/src/routing/strategies/adaptive.ts +215 -0
  284. package/src/routing/strategies/index.ts +8 -0
  285. package/src/routing/strategies/keyword.ts +163 -0
  286. package/src/routing/strategies/llm-prompts.ts +209 -0
  287. package/src/routing/strategies/llm.ts +235 -0
  288. package/src/routing/strategies/manual.ts +50 -0
  289. package/src/routing/strategy.ts +99 -0
  290. package/src/tdd/cleanup.ts +111 -0
  291. package/src/tdd/index.ts +23 -0
  292. package/src/tdd/isolation.ts +123 -0
  293. package/src/tdd/orchestrator.ts +383 -0
  294. package/src/tdd/prompts.ts +270 -0
  295. package/src/tdd/rectification-gate.ts +183 -0
  296. package/src/tdd/session-runner.ts +179 -0
  297. package/src/tdd/types.ts +81 -0
  298. package/src/tdd/verdict.ts +271 -0
  299. package/src/tui/App.tsx +265 -0
  300. package/src/tui/components/AgentPanel.tsx +75 -0
  301. package/src/tui/components/CostOverlay.tsx +118 -0
  302. package/src/tui/components/HelpOverlay.tsx +107 -0
  303. package/src/tui/components/StatusBar.tsx +63 -0
  304. package/src/tui/components/StoriesPanel.tsx +177 -0
  305. package/src/tui/hooks/useKeyboard.ts +142 -0
  306. package/src/tui/hooks/useLayout.ts +137 -0
  307. package/src/tui/hooks/usePipelineEvents.ts +183 -0
  308. package/src/tui/hooks/usePty.ts +194 -0
  309. package/src/tui/index.tsx +38 -0
  310. package/src/tui/types.ts +76 -0
  311. package/src/utils/git.ts +83 -0
  312. package/src/utils/queue-writer.ts +54 -0
  313. package/src/verification/executor.ts +235 -0
  314. package/src/verification/gate.ts +207 -0
  315. package/src/verification/index.ts +12 -0
  316. package/src/verification/parser.ts +230 -0
  317. package/src/verification/rectification.ts +108 -0
  318. package/src/verification/types.ts +113 -0
  319. package/src/worktree/dispatcher.ts +65 -0
  320. package/src/worktree/index.ts +2 -0
  321. package/src/worktree/manager.ts +187 -0
  322. package/src/worktree/merge.ts +301 -0
  323. package/src/worktree/types.ts +4 -0
  324. package/test/TEST_COVERAGE_US001.md +217 -0
  325. package/test/TEST_COVERAGE_US003.md +84 -0
  326. package/test/TEST_COVERAGE_US005.md +86 -0
  327. package/test/US-002-orchestrator.test.ts +246 -0
  328. package/test/acceptance/cm-003-default-view.test.ts +194 -0
  329. package/test/execution/pid-registry.test.ts +240 -0
  330. package/test/execution/post-verify.test.ts +224 -0
  331. package/test/helpers/timeout.ts +42 -0
  332. package/test/integration/US-002-TEST-SUMMARY.md +107 -0
  333. package/test/integration/US-003-TEST-SUMMARY.md +149 -0
  334. package/test/integration/US-004-TEST-SUMMARY.md +106 -0
  335. package/test/integration/US-005-TEST-SUMMARY.md +138 -0
  336. package/test/integration/US-007-TEST-SUMMARY.md +100 -0
  337. package/test/integration/agent-validation.test.ts +439 -0
  338. package/test/integration/analyze-integration.test.ts +261 -0
  339. package/test/integration/analyze-scanner.test.ts +131 -0
  340. package/test/integration/cli-config-default-edge-cases.test.ts +222 -0
  341. package/test/integration/cli-config-default-view.test.ts +229 -0
  342. package/test/integration/cli-config-diff.test.ts +460 -0
  343. package/test/integration/cli-config.test.ts +736 -0
  344. package/test/integration/cli-diagnose.test.ts +592 -0
  345. package/test/integration/cli-logs.test.ts +314 -0
  346. package/test/integration/cli-plugins.test.ts +678 -0
  347. package/test/integration/cli-precheck.test.ts +371 -0
  348. package/test/integration/cli-run-headless.test.ts +173 -0
  349. package/test/integration/cli.test.ts +75 -0
  350. package/test/integration/config/merger.test.ts +465 -0
  351. package/test/integration/config/paths.test.ts +51 -0
  352. package/test/integration/config-loader.test.ts +265 -0
  353. package/test/integration/config.test.ts +444 -0
  354. package/test/integration/context-integration.test.ts +702 -0
  355. package/test/integration/context-provider-injection.test.ts +506 -0
  356. package/test/integration/context-verification-integration.test.ts +295 -0
  357. package/test/integration/e2e.test.ts +896 -0
  358. package/test/integration/execution.test.ts +625 -0
  359. package/test/integration/helpers.test.ts +295 -0
  360. package/test/integration/hooks.test.ts +361 -0
  361. package/test/integration/interaction-chain-pipeline.test.ts +464 -0
  362. package/test/integration/isolation.test.ts +143 -0
  363. package/test/integration/logger.test.ts +461 -0
  364. package/test/integration/parallel.test.ts +250 -0
  365. package/test/integration/path-security.test.ts +173 -0
  366. package/test/integration/pipeline-acceptance.test.ts +302 -0
  367. package/test/integration/pipeline-events.test.ts +475 -0
  368. package/test/integration/pipeline.test.ts +658 -0
  369. package/test/integration/plan.test.ts +157 -0
  370. package/test/integration/plugin-routing.test.ts +921 -0
  371. package/test/integration/plugins/config-integration.test.ts +172 -0
  372. package/test/integration/plugins/config-resolution.test.ts +522 -0
  373. package/test/integration/plugins/loader.test.ts +641 -0
  374. package/test/integration/plugins/registry.test.ts +746 -0
  375. package/test/integration/plugins/validator.test.ts +563 -0
  376. package/test/integration/prd-pause.test.ts +205 -0
  377. package/test/integration/prd-resolvers.test.ts +185 -0
  378. package/test/integration/precheck-integration.test.ts +468 -0
  379. package/test/integration/precheck.test.ts +805 -0
  380. package/test/integration/progress.test.ts +34 -0
  381. package/test/integration/rectification-flow.test.ts +512 -0
  382. package/test/integration/reporter-lifecycle.test.ts +860 -0
  383. package/test/integration/review-config-commands.test.ts +319 -0
  384. package/test/integration/review-config-schema.test.ts +116 -0
  385. package/test/integration/review-plugin-integration.test.ts +722 -0
  386. package/test/integration/review.test.ts +149 -0
  387. package/test/integration/routing-stage-bug-021.test.ts +274 -0
  388. package/test/integration/routing-stage-greenfield.test.ts +286 -0
  389. package/test/integration/runner-config-plugins.test.ts +461 -0
  390. package/test/integration/runner-fixes.test.ts +399 -0
  391. package/test/integration/runner-plugin-integration.test.ts +543 -0
  392. package/test/integration/runner.test.ts +1679 -0
  393. package/test/integration/s5-greenfield-fallback.test.ts +297 -0
  394. package/test/integration/status-file-integration.test.ts +325 -0
  395. package/test/integration/status-file.test.ts +379 -0
  396. package/test/integration/status-writer.test.ts +345 -0
  397. package/test/integration/story-id-in-events.test.ts +273 -0
  398. package/test/integration/tdd-cleanup.test.ts +246 -0
  399. package/test/integration/tdd-orchestrator.test.ts +1762 -0
  400. package/test/integration/test-scanner.test.ts +403 -0
  401. package/test/integration/verification-asset-check.test.ts +142 -0
  402. package/test/integration/verify-stage.test.ts +275 -0
  403. package/test/integration/worktree/manager.test.ts +218 -0
  404. package/test/integration/worktree/merge.test.ts +341 -0
  405. package/test/manual/logging-formatter-demo.ts +158 -0
  406. package/test/ui/tui-agent-panel.test.tsx +99 -0
  407. package/test/ui/tui-controls.test.ts +334 -0
  408. package/test/ui/tui-cost-and-pty.test.ts +189 -0
  409. package/test/ui/tui-layout.test.ts +378 -0
  410. package/test/ui/tui-pty-integration.test.tsx +159 -0
  411. package/test/ui/tui-stories.test.ts +332 -0
  412. package/test/unit/acceptance.test.ts +186 -0
  413. package/test/unit/agent-stderr-capture.test.ts +146 -0
  414. package/test/unit/analyze-classifier.test.ts +215 -0
  415. package/test/unit/analyze.test.ts +224 -0
  416. package/test/unit/auto-detect.test.ts +249 -0
  417. package/test/unit/cli-status.test.ts +417 -0
  418. package/test/unit/commands/common.test.ts +320 -0
  419. package/test/unit/commands/logs.test.ts +416 -0
  420. package/test/unit/commands/unlock.test.ts +319 -0
  421. package/test/unit/constitution-generators.test.ts +160 -0
  422. package/test/unit/constitution.test.ts +209 -0
  423. package/test/unit/context.test.ts +1722 -0
  424. package/test/unit/cost.test.ts +231 -0
  425. package/test/unit/crash-recovery.test.ts +308 -0
  426. package/test/unit/escalation.test.ts +126 -0
  427. package/test/unit/execution-logging-stderr.test.ts +156 -0
  428. package/test/unit/execution-stage.test.ts +122 -0
  429. package/test/unit/fix-generator.test.ts +275 -0
  430. package/test/unit/formatters.test.ts +469 -0
  431. package/test/unit/greenfield.test.ts +179 -0
  432. package/test/unit/helpers.test.ts +317 -0
  433. package/test/unit/interaction/human-review-trigger.test.ts +164 -0
  434. package/test/unit/interaction-network-failures.test.ts +389 -0
  435. package/test/unit/interaction-plugins.test.ts +164 -0
  436. package/test/unit/isolation.test.ts +134 -0
  437. package/test/unit/logging/formatter.test.ts +455 -0
  438. package/test/unit/merge.test.ts +268 -0
  439. package/test/unit/metrics.test.ts +276 -0
  440. package/test/unit/optimizer/noop.optimizer.test.ts +125 -0
  441. package/test/unit/optimizer/rule-based.optimizer.test.ts +358 -0
  442. package/test/unit/prd-auto-default.test.ts +290 -0
  443. package/test/unit/prd-failure-category.test.ts +176 -0
  444. package/test/unit/prd-get-next-story.test.ts +186 -0
  445. package/test/unit/precheck-checks.test.ts +840 -0
  446. package/test/unit/precheck-story-size-gate.test.ts +287 -0
  447. package/test/unit/precheck-types.test.ts +142 -0
  448. package/test/unit/prompts.test.ts +475 -0
  449. package/test/unit/queue.test.ts +237 -0
  450. package/test/unit/rectification.test.ts +284 -0
  451. package/test/unit/registry.test.ts +287 -0
  452. package/test/unit/routing.test.ts +937 -0
  453. package/test/unit/run-lifecycle.test.ts +140 -0
  454. package/test/unit/storyid-events.test.ts +224 -0
  455. package/test/unit/tdd-verdict.test.ts +492 -0
  456. package/test/unit/test-output-parser.test.ts +377 -0
  457. package/test/unit/verdict.test.ts +324 -0
  458. package/test/unit/worktree-manager.test.ts +158 -0
  459. package/tsconfig.json +27 -0
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Console Reporter Plugin Tests
3
+ */
4
+
5
+ import { describe, test, expect, beforeEach, afterEach } from "bun:test";
6
+ import type {
7
+ RunStartEvent,
8
+ StoryCompleteEvent,
9
+ RunEndEvent,
10
+ } from "../../../src/plugins/types";
11
+ import { validatePlugin } from "../../../src/plugins/validator";
12
+ import consoleReporterPlugin from "./index";
13
+
14
+ describe("Console Reporter Plugin", () => {
15
+ let consoleOutput: string[] = [];
16
+ const originalLog = console.log;
17
+
18
+ beforeEach(() => {
19
+ consoleOutput = [];
20
+ console.log = (...args: unknown[]) => {
21
+ consoleOutput.push(args.map(String).join(" "));
22
+ };
23
+ });
24
+
25
+ afterEach(() => {
26
+ console.log = originalLog;
27
+ });
28
+
29
+ test("plugin structure passes validation", () => {
30
+ const validated = validatePlugin(consoleReporterPlugin);
31
+ expect(validated).not.toBeNull();
32
+ expect(validated?.name).toBe("console-reporter");
33
+ expect(validated?.version).toBe("1.0.0");
34
+ expect(validated?.provides).toEqual(["reporter"]);
35
+ });
36
+
37
+ test("plugin has required fields", () => {
38
+ expect(consoleReporterPlugin.name).toBe("console-reporter");
39
+ expect(consoleReporterPlugin.version).toBe("1.0.0");
40
+ expect(consoleReporterPlugin.provides).toContain("reporter");
41
+ expect(consoleReporterPlugin.setup).toBeDefined();
42
+ expect(consoleReporterPlugin.teardown).toBeDefined();
43
+ expect(consoleReporterPlugin.extensions.reporter).toBeDefined();
44
+ });
45
+
46
+ test("setup() reads config.verbose", async () => {
47
+ await consoleReporterPlugin.setup?.({ verbose: true });
48
+ expect(consoleOutput.some(line => line.includes("verbose mode enabled"))).toBe(true);
49
+
50
+ consoleOutput = [];
51
+ await consoleReporterPlugin.setup?.({ verbose: false });
52
+ expect(consoleOutput.some(line => line.includes("verbose mode enabled"))).toBe(false);
53
+ });
54
+
55
+ test("setup() defaults verbose to false", async () => {
56
+ await consoleReporterPlugin.setup?.({});
57
+ expect(consoleOutput.some(line => line.includes("verbose mode enabled"))).toBe(false);
58
+ });
59
+
60
+ test("onRunStart prints banner with run details", async () => {
61
+ const event: RunStartEvent = {
62
+ runId: "run-123",
63
+ feature: "test-feature",
64
+ totalStories: 5,
65
+ startTime: "2026-02-27T10:00:00Z",
66
+ };
67
+
68
+ const reporter = consoleReporterPlugin.extensions.reporter;
69
+ await reporter?.onRunStart?.(event);
70
+
71
+ const output = consoleOutput.join("\n");
72
+ expect(output).toContain("Starting Run: test-feature");
73
+ expect(output).toContain("Run ID: run-123");
74
+ expect(output).toContain("Total Stories: 5");
75
+ expect(output).toContain("Start Time: 2026-02-27T10:00:00Z");
76
+ expect(output).toContain("=".repeat(60));
77
+ });
78
+
79
+ test("onStoryComplete prints status line with ✓ for completed", async () => {
80
+ const event: StoryCompleteEvent = {
81
+ runId: "run-123",
82
+ storyId: "US-001",
83
+ status: "completed",
84
+ durationMs: 1500,
85
+ cost: 0.0123,
86
+ tier: "balanced",
87
+ testStrategy: "three-session-tdd",
88
+ };
89
+
90
+ const reporter = consoleReporterPlugin.extensions.reporter;
91
+ await reporter?.onStoryComplete?.(event);
92
+
93
+ const output = consoleOutput.join("\n");
94
+ expect(output).toContain("✓");
95
+ expect(output).toContain("US-001");
96
+ expect(output).toContain("Tier: balanced");
97
+ expect(output).toContain("Strategy: three-session-tdd");
98
+ expect(output).toContain("Duration: 1500ms");
99
+ expect(output).toContain("Cost: $0.0123");
100
+ });
101
+
102
+ test("onStoryComplete prints status line with ✗ for failed", async () => {
103
+ const event: StoryCompleteEvent = {
104
+ runId: "run-123",
105
+ storyId: "US-002",
106
+ status: "failed",
107
+ durationMs: 2500,
108
+ cost: 0.0456,
109
+ tier: "powerful",
110
+ testStrategy: "three-session-tdd-lite",
111
+ };
112
+
113
+ const reporter = consoleReporterPlugin.extensions.reporter;
114
+ await reporter?.onStoryComplete?.(event);
115
+
116
+ const output = consoleOutput.join("\n");
117
+ expect(output).toContain("✗");
118
+ expect(output).toContain("US-002");
119
+ expect(output).toContain("Tier: powerful");
120
+ expect(output).toContain("Strategy: three-session-tdd-lite");
121
+ });
122
+
123
+ test("onRunEnd prints summary table", async () => {
124
+ const event: RunEndEvent = {
125
+ runId: "run-123",
126
+ totalDurationMs: 5000,
127
+ totalCost: 0.0789,
128
+ storySummary: {
129
+ completed: 3,
130
+ failed: 1,
131
+ skipped: 0,
132
+ paused: 1,
133
+ },
134
+ };
135
+
136
+ const reporter = consoleReporterPlugin.extensions.reporter;
137
+ await reporter?.onRunEnd?.(event);
138
+
139
+ const output = consoleOutput.join("\n");
140
+ expect(output).toContain("Run Summary");
141
+ expect(output).toContain("Run ID: run-123");
142
+ expect(output).toContain("Completed: 3/5");
143
+ expect(output).toContain("Failed: 1/5");
144
+ expect(output).toContain("Skipped: 0/5");
145
+ expect(output).toContain("Paused: 1/5");
146
+ expect(output).toContain("Total Duration: 5.00s");
147
+ expect(output).toContain("Total Cost: $0.0789");
148
+ });
149
+
150
+ test("verbose mode adds extra output in onStoryComplete", async () => {
151
+ await consoleReporterPlugin.setup?.({ verbose: true });
152
+ consoleOutput = [];
153
+
154
+ const event: StoryCompleteEvent = {
155
+ runId: "run-123",
156
+ storyId: "US-001",
157
+ status: "completed",
158
+ durationMs: 1500,
159
+ cost: 0.0123,
160
+ tier: "balanced",
161
+ testStrategy: "three-session-tdd",
162
+ };
163
+
164
+ const reporter = consoleReporterPlugin.extensions.reporter;
165
+ await reporter?.onStoryComplete?.(event);
166
+
167
+ const output = consoleOutput.join("\n");
168
+ expect(output).toContain("[verbose]");
169
+ expect(output).toContain("Run ID: run-123");
170
+ expect(output).toContain("Status: completed");
171
+ });
172
+
173
+ test("verbose mode adds extra output in onRunEnd", async () => {
174
+ await consoleReporterPlugin.setup?.({ verbose: true });
175
+ consoleOutput = [];
176
+
177
+ const event: RunEndEvent = {
178
+ runId: "run-123",
179
+ totalDurationMs: 5000,
180
+ totalCost: 0.0789,
181
+ storySummary: {
182
+ completed: 3,
183
+ failed: 1,
184
+ skipped: 0,
185
+ paused: 1,
186
+ },
187
+ };
188
+
189
+ const reporter = consoleReporterPlugin.extensions.reporter;
190
+ await reporter?.onRunEnd?.(event);
191
+
192
+ const output = consoleOutput.join("\n");
193
+ expect(output).toContain("Run completed in verbose mode");
194
+ });
195
+
196
+ test("reporter has required methods", () => {
197
+ const reporter = consoleReporterPlugin.extensions.reporter;
198
+ expect(reporter?.name).toBe("console-reporter");
199
+ expect(typeof reporter?.onRunStart).toBe("function");
200
+ expect(typeof reporter?.onStoryComplete).toBe("function");
201
+ expect(typeof reporter?.onRunEnd).toBe("function");
202
+ });
203
+
204
+ test("teardown completes without errors", async () => {
205
+ await expect(consoleReporterPlugin.teardown?.()).resolves.toBeUndefined();
206
+ });
207
+ });
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Console Reporter Plugin
3
+ *
4
+ * Sample reporter plugin that demonstrates the plugin API.
5
+ * Prints formatted output to the console for run lifecycle events.
6
+ */
7
+
8
+ import type {
9
+ NaxPlugin,
10
+ IReporter,
11
+ RunStartEvent,
12
+ StoryCompleteEvent,
13
+ RunEndEvent,
14
+ } from "../../../src/plugins/types";
15
+
16
+ interface ConsoleReporterConfig {
17
+ verbose?: boolean;
18
+ }
19
+
20
+ let verboseMode = false;
21
+
22
+ /**
23
+ * Console reporter implementation.
24
+ */
25
+ const reporter: IReporter = {
26
+ name: "console-reporter",
27
+
28
+ async onRunStart(event: RunStartEvent): Promise<void> {
29
+ console.log("\n" + "=".repeat(60));
30
+ console.log(`🚀 Starting Run: ${event.feature}`);
31
+ console.log(` Run ID: ${event.runId}`);
32
+ console.log(` Total Stories: ${event.totalStories}`);
33
+ console.log(` Start Time: ${event.startTime}`);
34
+ console.log("=".repeat(60) + "\n");
35
+
36
+ if (verboseMode) {
37
+ console.log("[console-reporter] Verbose mode enabled");
38
+ }
39
+ },
40
+
41
+ async onStoryComplete(event: StoryCompleteEvent): Promise<void> {
42
+ const statusIcon = event.status === "completed" ? "✓" : "✗";
43
+ const statusColor = event.status === "completed" ? "\x1b[32m" : "\x1b[31m";
44
+ const resetColor = "\x1b[0m";
45
+
46
+ console.log(
47
+ `${statusColor}${statusIcon}${resetColor} ${event.storyId} | ` +
48
+ `Tier: ${event.tier} | ` +
49
+ `Strategy: ${event.testStrategy} | ` +
50
+ `Duration: ${event.durationMs}ms | ` +
51
+ `Cost: $${event.cost.toFixed(4)}`
52
+ );
53
+
54
+ if (verboseMode) {
55
+ console.log(` [verbose] Run ID: ${event.runId}, Status: ${event.status}`);
56
+ }
57
+ },
58
+
59
+ async onRunEnd(event: RunEndEvent): Promise<void> {
60
+ console.log("\n" + "=".repeat(60));
61
+ console.log("📊 Run Summary");
62
+ console.log("=".repeat(60));
63
+
64
+ const { storySummary } = event;
65
+ const total = storySummary.completed + storySummary.failed + storySummary.skipped + storySummary.paused;
66
+
67
+ console.log(`Run ID: ${event.runId}`);
68
+ console.log(`\nStory Results:`);
69
+ console.log(` ✓ Completed: ${storySummary.completed}/${total}`);
70
+ console.log(` ✗ Failed: ${storySummary.failed}/${total}`);
71
+ console.log(` ⊘ Skipped: ${storySummary.skipped}/${total}`);
72
+ console.log(` ⏸ Paused: ${storySummary.paused}/${total}`);
73
+ console.log(`\nMetrics:`);
74
+ console.log(` Total Duration: ${(event.totalDurationMs / 1000).toFixed(2)}s`);
75
+ console.log(` Total Cost: $${event.totalCost.toFixed(4)}`);
76
+ console.log("=".repeat(60) + "\n");
77
+
78
+ if (verboseMode) {
79
+ console.log("[console-reporter] Run completed in verbose mode");
80
+ }
81
+ },
82
+ };
83
+
84
+ /**
85
+ * Console reporter plugin export.
86
+ */
87
+ const consoleReporterPlugin: NaxPlugin = {
88
+ name: "console-reporter",
89
+ version: "1.0.0",
90
+ provides: ["reporter"],
91
+
92
+ async setup(config: Record<string, unknown>): Promise<void> {
93
+ const reporterConfig = config as ConsoleReporterConfig;
94
+ verboseMode = reporterConfig.verbose ?? false;
95
+
96
+ if (verboseMode) {
97
+ console.log("[console-reporter] Plugin initialized with verbose mode enabled");
98
+ }
99
+ },
100
+
101
+ async teardown(): Promise<void> {
102
+ // No cleanup needed for console output
103
+ },
104
+
105
+ extensions: {
106
+ reporter,
107
+ },
108
+ };
109
+
110
+ export default consoleReporterPlugin;
@@ -0,0 +1,147 @@
1
+ {
2
+ "version": 1,
3
+ "models": {
4
+ "fast": {
5
+ "provider": "anthropic",
6
+ "model": "haiku"
7
+ },
8
+ "balanced": {
9
+ "provider": "anthropic",
10
+ "model": "sonnet"
11
+ },
12
+ "powerful": {
13
+ "provider": "anthropic",
14
+ "model": "sonnet"
15
+ }
16
+ },
17
+ "autoMode": {
18
+ "enabled": true,
19
+ "defaultAgent": "claude",
20
+ "fallbackOrder": [
21
+ "claude"
22
+ ],
23
+ "complexityRouting": {
24
+ "simple": "fast",
25
+ "medium": "balanced",
26
+ "complex": "balanced",
27
+ "expert": "powerful"
28
+ },
29
+ "escalation": {
30
+ "enabled": true,
31
+ "tierOrder": [
32
+ {
33
+ "tier": "fast",
34
+ "attempts": 3
35
+ },
36
+ {
37
+ "tier": "balanced",
38
+ "attempts": 2
39
+ },
40
+ {
41
+ "tier": "powerful",
42
+ "attempts": 1
43
+ }
44
+ ],
45
+ "escalateEntireBatch": false
46
+ }
47
+ },
48
+ "routing": {
49
+ "strategy": "llm",
50
+ "llm": {
51
+ "model": "fast",
52
+ "fallbackToKeywords": true,
53
+ "cacheDecisions": true,
54
+ "mode": "hybrid",
55
+ "timeoutMs": 15000
56
+ }
57
+ },
58
+ "execution": {
59
+ "maxIterations": 6,
60
+ "iterationDelayMs": 2000,
61
+ "costLimit": 8.0,
62
+ "sessionTimeoutSeconds": 600,
63
+ "verificationTimeoutSeconds": 300,
64
+ "maxStoriesPerFeature": 15,
65
+ "rectification": {
66
+ "enabled": true,
67
+ "maxRetries": 2,
68
+ "fullSuiteTimeoutSeconds": 120,
69
+ "maxFailureSummaryChars": 2000,
70
+ "abortOnIncreasingFailures": true
71
+ }
72
+ },
73
+ "quality": {
74
+ "requireTypecheck": false,
75
+ "requireLint": true,
76
+ "requireTests": true,
77
+ "commands": {
78
+ "test": "bun test --no-coverage",
79
+ "typecheck": "bun x tsc --noEmit",
80
+ "lint": "bun x biome check src/ bin/"
81
+ },
82
+ "forceExit": false,
83
+ "detectOpenHandles": true,
84
+ "detectOpenHandlesRetries": 1,
85
+ "gracePeriodMs": 5000,
86
+ "drainTimeoutMs": 2000,
87
+ "shell": "/bin/sh",
88
+ "stripEnvVars": [
89
+ "CLAUDECODE",
90
+ "REPL_ID",
91
+ "AGENT"
92
+ ],
93
+ "environmentalEscalationDivisor": 2
94
+ },
95
+ "tdd": {
96
+ "maxRetries": 2,
97
+ "autoVerifyIsolation": true,
98
+ "autoApproveVerifier": true,
99
+ "strategy": "lite",
100
+ "sessionTiers": {
101
+ "testWriter": "balanced",
102
+ "verifier": "fast"
103
+ }
104
+ },
105
+ "constitution": {
106
+ "enabled": true,
107
+ "path": "constitution.md",
108
+ "maxTokens": 2000
109
+ },
110
+ "analyze": {
111
+ "llmEnhanced": false,
112
+ "model": "balanced",
113
+ "fallbackToKeywords": true,
114
+ "maxCodebaseSummaryTokens": 5000
115
+ },
116
+ "review": {
117
+ "enabled": true,
118
+ "checks": [
119
+ "test",
120
+ "lint"
121
+ ],
122
+ "commands": {
123
+ "test": "bun test --no-coverage",
124
+ "typecheck": "bun x tsc --noEmit",
125
+ "lint": "bun x biome check src/ bin/"
126
+ }
127
+ },
128
+ "plan": {
129
+ "model": "balanced",
130
+ "outputPath": "spec.md"
131
+ },
132
+ "acceptance": {
133
+ "enabled": false,
134
+ "maxRetries": 2,
135
+ "generateTests": false,
136
+ "testPath": "acceptance.test.ts"
137
+ },
138
+ "context": {
139
+ "testCoverage": {
140
+ "enabled": true,
141
+ "detail": "names-and-counts",
142
+ "maxTokens": 500,
143
+ "testPattern": "**/*.test.{ts,js}",
144
+ "scopeToStory": true
145
+ }
146
+ }
147
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "project": "nax",
3
+ "branchName": "feat/v0.17.x-bugfixes",
4
+ "feature": "bugfix-v0171",
5
+ "userStories": [
6
+ {
7
+ "id": "BF-001",
8
+ "title": "Emit run.complete on SIGTERM shutdown (BUG-017)",
9
+ "description": "When nax receives SIGTERM, the crash-recovery handler shuts down cleanly but never emits the final run.complete JSONL event. This means the run log has no aggregate cost/duration summary when nax is killed externally.\n\nFind where SIGTERM is caught in src/execution/ and ensure a run.complete event is emitted before exit with: totalCost (sum of agent.complete costs), totalIterations, exitReason='sigterm', duration.\n\nAcceptance criteria:\n1. When nax is killed with SIGTERM mid-run, JSONL ends with run.complete event containing totalCost, totalIterations, exitReason='sigterm', duration\n2. Existing tests pass\n3. Add a unit test simulating SIGTERM that verifies run.complete is written",
10
+ "complexity": "simple",
11
+ "status": "pending",
12
+ "attempts": 0,
13
+ "priorErrors": [
14
+ "Attempt 1 failed with model tier: fast"
15
+ ],
16
+ "escalations": [],
17
+ "dependencies": [],
18
+ "tags": [],
19
+ "acceptanceCriteria": [],
20
+ "storyPoints": 1,
21
+ "routing": {
22
+ "complexity": "simple",
23
+ "modelTier": "balanced",
24
+ "testStrategy": "three-session-tdd-lite",
25
+ "reasoning": "three-session-tdd-lite: public-api, strategy:lite"
26
+ }
27
+ },
28
+ {
29
+ "id": "BF-002",
30
+ "title": "Add storyId to all JSONL events (BUG-020)",
31
+ "description": "Many JSONL events have empty or missing storyId. Audit and fix these event emitters to include storyId when a story is active:\n- src/pipeline/stages/verify.ts (verify info/debug events)\n- src/pipeline/stages/execution.ts (execution events)\n- src/tdd/orchestrator.ts (tdd session events)\n- src/execution/pipeline-result-handler.ts (escalation events)\n\nAcceptance criteria:\n1. Events at stages agent.start, agent.complete, verify, tdd, execution, escalation include storyId in data when a story is active\n2. Existing tests pass\n3. Add tests verifying storyId presence on key events",
32
+ "complexity": "simple",
33
+ "status": "pending",
34
+ "attempts": 0,
35
+ "priorErrors": [
36
+ "Attempt 1 failed with model tier: fast"
37
+ ],
38
+ "escalations": [],
39
+ "dependencies": [],
40
+ "tags": [],
41
+ "acceptanceCriteria": [],
42
+ "storyPoints": 1,
43
+ "routing": {
44
+ "complexity": "simple",
45
+ "modelTier": "balanced",
46
+ "testStrategy": "three-session-tdd-lite",
47
+ "reasoning": "three-session-tdd-lite: strategy:lite"
48
+ }
49
+ }
50
+ ],
51
+ "updatedAt": "2026-03-02T08:59:51.238Z"
52
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "project": "nax",
3
+ "branchName": "feat/v0.17.0-config-management",
4
+ "feature": "config-management",
5
+ "userStories": [
6
+ {
7
+ "id": "CM-001",
8
+ "title": "nax config --explain",
9
+ "description": "Add `nax config` CLI command with `--explain` flag that dumps the effective merged config with inline comments. Resolution order: defaults \u2192 global (~/.nax/config.json) \u2192 project (nax/config.json) \u2192 CLI overrides. Each field gets a one-line human-readable description of what it does. Fields overridden by project config are annotated with '(project override)' vs '(global)' vs '(default)'. Output format: YAML-like with # comments. Must cover all sections: models, routing, execution, tdd, quality, review, context, constitution, analyze, plan, acceptance, interaction, autoMode. Implementation: add `src/cli/config.ts` with `configCommand()`. Read merged config from loader, annotate each field using a static descriptions map (Record<string, string>). Register in `src/cli/index.ts`.",
10
+ "complexity": "medium",
11
+ "status": "passed",
12
+ "attempts": 1,
13
+ "escalations": [],
14
+ "dependencies": [],
15
+ "tags": [
16
+ "cli",
17
+ "config",
18
+ "dx"
19
+ ],
20
+ "acceptanceCriteria": [
21
+ "Running `nax config --explain` outputs all config fields with descriptions",
22
+ "Each field shows its source: (default), (global), or (project override)",
23
+ "Output is human-readable, not raw JSON",
24
+ "Works from any directory (uses existing config loader)"
25
+ ],
26
+ "storyPoints": 1,
27
+ "priorErrors": [
28
+ "Attempt 1 failed with model tier: fast",
29
+ "Attempt 1 failed with model tier: balanced"
30
+ ],
31
+ "passes": true,
32
+ "routing": {
33
+ "complexity": "simple",
34
+ "modelTier": "powerful",
35
+ "testStrategy": "three-session-tdd-lite",
36
+ "reasoning": "three-session-tdd-lite: strategy:lite"
37
+ }
38
+ },
39
+ {
40
+ "id": "CM-002",
41
+ "title": "nax config --diff",
42
+ "description": "Add `--diff` flag to `nax config` that shows only fields where project config overrides the global config. Output format: table or structured list showing field path, project value, and global value. Skip fields that are identical or only set at one layer. If no project config exists, print 'No project config found \u2014 using global defaults'. Implementation: in `src/cli/config.ts`, load global and project configs separately (extend loader to expose both), deep-diff them, format as table. Use the same descriptions map from CM-001 to add context.",
43
+ "complexity": "medium",
44
+ "status": "passed",
45
+ "attempts": 1,
46
+ "escalations": [],
47
+ "dependencies": [
48
+ "CM-001"
49
+ ],
50
+ "tags": [
51
+ "cli",
52
+ "config",
53
+ "dx"
54
+ ],
55
+ "acceptanceCriteria": [
56
+ "Running `nax config --diff` shows only fields where project differs from global",
57
+ "Each differing field shows: field path, project value, global value",
58
+ "Shows 'No project config found' when no nax/config.json exists",
59
+ "Works alongside --explain (mutually exclusive flags)"
60
+ ],
61
+ "storyPoints": 1,
62
+ "priorErrors": [
63
+ "Attempt 1 failed with model tier: fast",
64
+ "Attempt 1 failed with model tier: balanced"
65
+ ],
66
+ "passes": false,
67
+ "routing": {
68
+ "complexity": "simple",
69
+ "modelTier": "powerful",
70
+ "testStrategy": "three-session-tdd-lite",
71
+ "reasoning": "three-session-tdd-lite: strategy:lite"
72
+ }
73
+ },
74
+ {
75
+ "id": "CM-003",
76
+ "title": "nax config (default view)",
77
+ "description": "When `nax config` is run without flags, print the effective merged config as formatted JSON with a header showing the config sources found (global path, project path if exists). This is the quick 'what am I actually running with?' view. Implementation: default action in `src/cli/config.ts`. Load merged config, pretty-print with JSON.stringify(config, null, 2). Add header lines showing which config files were found and loaded.",
78
+ "complexity": "simple",
79
+ "status": "passed",
80
+ "attempts": 1,
81
+ "escalations": [],
82
+ "dependencies": [],
83
+ "tags": [
84
+ "cli",
85
+ "config",
86
+ "dx"
87
+ ],
88
+ "acceptanceCriteria": [
89
+ "Running `nax config` prints the effective merged config as formatted JSON",
90
+ "Header shows paths of config files found (global, project)",
91
+ "Missing config files noted in header"
92
+ ],
93
+ "storyPoints": 1,
94
+ "priorErrors": [
95
+ "Attempt 1 failed with model tier: fast",
96
+ "Attempt 1 failed with model tier: balanced"
97
+ ],
98
+ "passes": true,
99
+ "routing": {
100
+ "complexity": "simple",
101
+ "modelTier": "powerful",
102
+ "testStrategy": "three-session-tdd-lite",
103
+ "reasoning": "three-session-tdd-lite: strategy:lite"
104
+ }
105
+ }
106
+ ],
107
+ "updatedAt": "2026-03-02T07:38:25.351Z"
108
+ }
@@ -0,0 +1,5 @@
1
+ [2026-03-02T06:07:47.434Z] CM-001 — FAILED — nax config --explain — Execution failed
2
+ [2026-03-02T08:15:00.000Z] CM-002 — PASSED — nax config --diff — All acceptance criteria met
3
+ [2026-03-02T07:12:34.595Z] CM-002 — FAILED — nax config --diff — Execution failed
4
+ [2026-03-02T09:30:00.000Z] CM-003 — PASSED — nax config (default view) — All acceptance criteria met
5
+ [2026-03-02T07:20:20.866Z] CM-003 — FAILED — nax config (default view) — Execution failed