@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/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@nathapp/nax",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "description": "AI Coding Agent Orchestrator \u2014 loops until done",
5
5
  "type": "module",
6
6
  "bin": {
7
- "nax": "./bin/nax.ts"
7
+ "nax": "./dist/nax.js"
8
8
  },
9
9
  "scripts": {
10
10
  "prepare": "git config core.hooksPath .githooks",
@@ -16,7 +16,8 @@
16
16
  "test:watch": "bun test --watch",
17
17
  "test:unit": "bun test ./test/unit/ --timeout=60000",
18
18
  "test:integration": "bun test ./test/integration/ --timeout=60000",
19
- "test:ui": "bun test ./test/ui/ --timeout=60000"
19
+ "test:ui": "bun test ./test/ui/ --timeout=60000",
20
+ "prepublishOnly": "bun run build"
20
21
  },
21
22
  "dependencies": {
22
23
  "@anthropic-ai/sdk": "^0.74.0",
@@ -43,5 +44,12 @@
43
44
  "orchestrator",
44
45
  "tdd",
45
46
  "coding"
47
+ ],
48
+ "files": [
49
+ "dist/",
50
+ "src/",
51
+ "bin/",
52
+ "README.md",
53
+ "CHANGELOG.md"
46
54
  ]
47
- }
55
+ }
package/src/cli/config.ts CHANGED
@@ -143,6 +143,8 @@ const FIELD_DESCRIPTIONS: Record<string, string> = {
143
143
 
144
144
  // Context
145
145
  context: "Context injection configuration",
146
+ "context.fileInjection":
147
+ "Mode: 'disabled' (default, MCP-aware agents pull context on-demand) | 'keyword' (legacy git-grep injection for non-MCP agents). Set context.fileInjection in config.",
146
148
  "context.testCoverage": "Test coverage context settings",
147
149
  "context.testCoverage.enabled": "Enable test coverage context injection",
148
150
  "context.testCoverage.detail": "Detail level: names-only | names-and-counts | describe-blocks",
@@ -517,7 +519,7 @@ function displayConfigWithDescriptions(
517
519
 
518
520
  // Display description comment if available
519
521
  if (description) {
520
- // Include path only for prompts section (where tests expect "prompts.overrides" to appear)
522
+ // Include path for prompts section (where tests expect "prompts.overrides" to appear)
521
523
  const isPromptsSubSection = currentPathStr.startsWith("prompts.");
522
524
  const comment = isPromptsSubSection ? `${currentPathStr}: ${description}` : description;
523
525
  console.log(`${indentStr}# ${comment}`);
@@ -128,6 +128,7 @@ export const DEFAULT_CONFIG: NaxConfig = {
128
128
  testPath: "acceptance.test.ts",
129
129
  },
130
130
  context: {
131
+ fileInjection: "disabled",
131
132
  testCoverage: {
132
133
  enabled: true,
133
134
  detail: "names-and-counts",
@@ -202,6 +202,7 @@ const ContextAutoDetectConfigSchema = z.object({
202
202
  const ContextConfigSchema = z.object({
203
203
  testCoverage: TestCoverageConfigSchema,
204
204
  autoDetect: ContextAutoDetectConfigSchema,
205
+ fileInjection: z.enum(["keyword", "disabled"]).default("disabled"),
205
206
  });
206
207
 
207
208
  const AdaptiveRoutingConfigSchema = z.object({
@@ -339,6 +339,7 @@ export interface ContextAutoDetectConfig {
339
339
  export interface ContextConfig {
340
340
  testCoverage: TestCoverageConfig;
341
341
  autoDetect: ContextAutoDetectConfig;
342
+ fileInjection?: "keyword" | "disabled";
342
343
  }
343
344
 
344
345
  /** Story size gate thresholds (v0.16.0) */
@@ -23,6 +23,11 @@ import {
23
23
  import { generateTestCoverageSummary } from "./test-scanner";
24
24
  import type { BuiltContext, ContextBudget, ContextElement, StoryContext } from "./types";
25
25
 
26
+ // Dependency injection for testability
27
+ export const _deps = {
28
+ autoDetectContextFiles,
29
+ };
30
+
26
31
  // Re-export for backward compatibility
27
32
  export {
28
33
  estimateTokens,
@@ -188,6 +193,10 @@ async function addFileElements(
188
193
  const MAX_FILE_SIZE_BYTES = 10 * 1024;
189
194
  const MAX_FILES = 5;
190
195
 
196
+ // Skip all file injection when fileInjection is 'disabled' or undefined (treat missing as disabled)
197
+ const fileInjection = storyContext.config?.context?.fileInjection;
198
+ if (fileInjection !== "keyword") return;
199
+
191
200
  let contextFiles = getContextFiles(story);
192
201
 
193
202
  // Auto-detect contextFiles if empty and enabled (BUG-006)
@@ -198,7 +207,7 @@ async function addFileElements(
198
207
  ) {
199
208
  const autoDetectConfig = storyContext.config?.context?.autoDetect;
200
209
  try {
201
- const detected = await autoDetectContextFiles({
210
+ const detected = await _deps.autoDetectContextFiles({
202
211
  workdir: storyContext.workdir,
203
212
  storyTitle: story.title,
204
213
  maxFiles: autoDetectConfig?.maxFiles ?? 5,
@@ -15,7 +15,8 @@ export function buildRoleTaskSection(variant: "standard" | "lite"): string {
15
15
  "- Implement source code in src/ to make tests pass\n" +
16
16
  "- Do NOT modify test files\n" +
17
17
  "- Run tests frequently to track progress\n" +
18
- "- Goal: all tests green"
18
+ "- When all tests are green, stage and commit ALL changed files with git commit -m 'feat: <description>'\n" +
19
+ "- Goal: all tests green, all changes committed"
19
20
  );
20
21
  }
21
22
 
@@ -27,6 +28,7 @@ export function buildRoleTaskSection(variant: "standard" | "lite"): string {
27
28
  "- Write tests first (test/ directory), then implement (src/ directory)\n" +
28
29
  "- All tests must pass by the end\n" +
29
30
  "- Use Bun test (describe/test/expect)\n" +
30
- "- Goal: all tests green, all criteria met"
31
+ "- When all tests are green, stage and commit ALL changed files with git commit -m 'feat: <description>'\n" +
32
+ "- Goal: all tests green, all criteria met, all changes committed"
31
33
  );
32
34
  }
@@ -208,7 +208,12 @@ export async function runReview(
208
208
  let firstFailure: string | undefined;
209
209
 
210
210
  // RQ-001: Check for uncommitted tracked files before running checks
211
- const uncommittedFiles = await _deps.getUncommittedFiles(workdir);
211
+ const allUncommittedFiles = await _deps.getUncommittedFiles(workdir);
212
+ // Exclude nax runtime files — written by nax itself during the run, not by the agent
213
+ const NAX_RUNTIME_FILES = new Set(["nax/status.json", ".nax-verifier-verdict.json"]);
214
+ const uncommittedFiles = allUncommittedFiles.filter(
215
+ (f) => !NAX_RUNTIME_FILES.has(f) && !f.match(/^nax\/features\/.+\/prd\.json$/),
216
+ );
212
217
  if (uncommittedFiles.length > 0) {
213
218
  const fileList = uncommittedFiles.join(", ");
214
219
  logger?.warn("review", `Uncommitted changes detected before review: ${fileList}`);
package/src/version.ts CHANGED
@@ -36,4 +36,5 @@ export const NAX_COMMIT: string = (() => {
36
36
  return "dev";
37
37
  })();
38
38
 
39
- export const NAX_BUILD_INFO = `v${NAX_VERSION} (${NAX_COMMIT})`;
39
+ /** Human-readable build info string — omits commit when unavailable. */
40
+ export const NAX_BUILD_INFO: string = NAX_COMMIT === "dev" ? `v${NAX_VERSION}` : `v${NAX_VERSION} (${NAX_COMMIT})`;
@@ -1,34 +0,0 @@
1
- # Project Conventions
2
-
3
- ## Language & Runtime
4
-
5
- - **Bun-native only.** Use `Bun.file()`, `Bun.write()`, `Bun.spawn()`, `Bun.sleep()`. Never use Node.js equivalents (`fs.readFile`, `child_process.spawn`, `setTimeout` for delays).
6
- - TypeScript strict mode. No `any` unless unavoidable (document why).
7
- - Target: Bun 1.3.7+.
8
-
9
- ## File Size
10
-
11
- - **400-line hard limit** for all source and test files.
12
- - If a file approaches 400 lines, split it before adding more code.
13
- - Split by logical concern (one function/class per file when possible).
14
-
15
- ## Module Structure
16
-
17
- - Every directory with 2+ exports gets a barrel `index.ts`.
18
- - Types go in `types.ts` per module directory.
19
- - Import from barrels (`src/routing`), **never from internal paths** (`src/routing/router`). This prevents singleton fragmentation in Bun's module registry.
20
-
21
- ## Logging
22
-
23
- - Use the project logger (`src/logger`). Never use `console.log` / `console.error` in source code.
24
- - Log format: no emojis. Use `[OK]`, `[WARN]`, `[FAIL]`, `->`. Machine-parseable.
25
-
26
- ## Commits
27
-
28
- - Conventional commits: `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:`.
29
- - Atomic — one logical change per commit.
30
- - Never include `[run-release]` unless explicitly told to.
31
-
32
- ## Formatting
33
-
34
- - Biome handles formatting and linting. Run `bun run lint` before committing.
@@ -1,39 +0,0 @@
1
- # Test Architecture
2
-
3
- ## Directory Structure
4
-
5
- Tests **must** mirror the `src/` directory structure:
6
-
7
- ```
8
- src/routing/strategies/foo.ts → test/unit/routing/strategies/foo.test.ts
9
- src/execution/runner.ts → test/unit/execution/runner.test.ts
10
- src/pipeline/stages/verify.ts → test/unit/pipeline/stages/verify.test.ts
11
- src/verification/smart-runner.ts → test/unit/verification/smart-runner.test.ts
12
- ```
13
-
14
- ## Test Categories
15
-
16
- | Category | Location | Purpose |
17
- |:---|:---|:---|
18
- | Unit | `test/unit/<mirror-of-src>/` | Test individual functions/classes in isolation |
19
- | Integration | `test/integration/<feature>.test.ts` | Test multiple modules working together |
20
- | UI | `test/ui/` | TUI component tests |
21
-
22
- ## Placement Rules
23
-
24
- 1. **Never create test files in `test/` root.** Always place in the appropriate subdirectory.
25
- 2. **Never create standalone bug-fix test files** like `test/execution/post-verify-bug026.test.ts`. Add tests to the existing relevant test file instead. If the relevant file would exceed 400 lines, split the file by describe block — not by bug number.
26
- 3. **Never create `TEST_COVERAGE_*.md` or documentation files in `test/`.** Put docs in `docs/`.
27
- 4. **Unit test directories must exist under `test/unit/`**, mirroring `src/`. Do not create top-level test directories like `test/execution/` or `test/context/` — use `test/unit/execution/` and `test/unit/context/`.
28
-
29
- ## File Naming
30
-
31
- - Test files: `<source-file-name>.test.ts` — must match the source file name exactly.
32
- - One test file per source file (for unit tests).
33
- - If a test file needs splitting, split by describe block into `<module>-<concern>.test.ts`.
34
-
35
- ## Temp Files & Fixtures
36
-
37
- - Use `mkdtempSync(join(tmpdir(), "nax-test-"))` for temporary directories.
38
- - Clean up in `afterAll()` — never leave files in `test/tmp/`.
39
- - Integration tests needing git: always `git init` + `git add .` + `git commit` in the temp fixture before testing.
@@ -1,58 +0,0 @@
1
- # Test Writing Rules
2
-
3
- ## Mocking
4
-
5
- ### Never use `mock.module()`
6
-
7
- `mock.module()` in Bun 1.x is **globally scoped and leaks between test files**. It poisons the ESM module registry for the entire test run. `mock.restore()` does NOT undo `mock.module()` overrides.
8
-
9
- **Instead, use dependency injection:**
10
-
11
- ```typescript
12
- // In source file: export a swappable deps object
13
- export const _deps = {
14
- readConfig: () => loadConfig(),
15
- runCommand: (cmd: string) => Bun.spawn(cmd.split(" ")),
16
- };
17
-
18
- // In test file: override _deps directly
19
- import { _deps } from "src/mymodule";
20
-
21
- beforeEach(() => {
22
- _deps.readConfig = mock(() => fakeConfig);
23
- });
24
-
25
- afterEach(() => {
26
- mock.restore(); // restores mock() spies (NOT mock.module)
27
- _deps.readConfig = originalReadConfig;
28
- });
29
- ```
30
-
31
- ### General Mocking Rules
32
-
33
- - Always call `mock.restore()` in `afterEach()`.
34
- - Use `mock()` (function-level) freely — it's properly scoped.
35
- - Never rely on test file execution order. Each file must be independently runnable.
36
- - Store original function references before overriding `_deps` and restore in `afterEach`.
37
-
38
- ## CI Compatibility
39
-
40
- - Tests requiring the `claude` binary: guard with `const skipInCI = process.env.CI ? test.skip : test;`
41
- - Tests requiring specific OS features: guard with platform checks.
42
- - Never send real signals (`process.kill`) — mock `process.on()` instead.
43
-
44
- ## Spawning & Subprocesses
45
-
46
- - Never spawn full `nax` processes in tests — prechecks fail in temp dirs.
47
- - Wrap `Bun.spawn()` in try/catch — throws `ENOENT` for missing binaries (not a failed exit code).
48
-
49
- ## Test Structure
50
-
51
- - One `describe()` block per source function or class being tested.
52
- - Keep test files under 400 lines. Split by `describe()` block if needed.
53
- - Use `test/helpers/` for shared mock factories and fixtures. Don't copy-paste mocking setup between files.
54
-
55
- ## Imports
56
-
57
- - **Import from barrels** (`src/routing`), not internal paths (`src/routing/router`).
58
- - This matches the project convention and prevents Bun singleton fragmentation where the same module loaded via two different paths creates two separate instances.
@@ -1,29 +0,0 @@
1
- # Forbidden Patterns
2
-
3
- These patterns are **banned** from the nax codebase. Violations must be caught during implementation, not after.
4
-
5
- ## Source Code
6
-
7
- | ❌ Forbidden | ✅ Use Instead | Why |
8
- |:---|:---|:---|
9
- | `mock.module()` | Dependency injection (`_deps` pattern) | Leaks globally in Bun 1.x, poisons other test files |
10
- | `console.log` / `console.error` in src/ | Project logger (`src/logger`) | Unstructured output breaks test capture and log parsing |
11
- | `fs.readFileSync` / `fs.writeFileSync` | `Bun.file()` / `Bun.write()` | Bun-native project — no Node.js file APIs |
12
- | `child_process.spawn` / `child_process.exec` | `Bun.spawn()` / `Bun.spawnSync()` | Bun-native project — no Node.js process APIs |
13
- | `setTimeout` / `setInterval` for delays | `Bun.sleep()` | Bun-native equivalent |
14
- | Hardcoded timeouts in logic | Config values from schema | Hardcoded values can't be tuned per-environment |
15
- | `import from "src/module/internal-file"` | `import from "src/module"` (barrel) | Prevents singleton fragmentation (BUG-035) |
16
- | Files > 400 lines | Split by concern | Unmaintainable; violates project convention |
17
-
18
- ## Test Files
19
-
20
- | ❌ Forbidden | ✅ Use Instead | Why |
21
- |:---|:---|:---|
22
- | Test files in `test/` root | `test/unit/`, `test/integration/`, etc. | Orphaned files with no clear ownership |
23
- | Standalone bug-fix test files (`*-bug026.test.ts`) | Add to existing relevant test file | Fragments test coverage, creates ownership confusion |
24
- | `TEST_COVERAGE_*.md` in test/ | `docs/` directory | Test dir is for test code only |
25
- | `rm -rf` in test cleanup | `mkdtempSync` + OS temp dir | Accidental deletion risk |
26
- | Tests depending on alphabetical file execution order | Independent, self-contained test files | Cross-file coupling causes phantom failures |
27
- | Copy-pasted mock setup across files | `test/helpers/` shared factories | DRY; single place to update when interfaces change |
28
- | Spawning full `nax` process in tests | Mock the relevant module | Prechecks fail in temp dirs; slow; flaky |
29
- | Real signal sending (`process.kill`) | Mock `process.on()` | Can kill the test runner |
@@ -1,15 +0,0 @@
1
- {
2
- "hooks": {
3
- "PostToolUse": [
4
- {
5
- "matcher": "Edit|Write",
6
- "hooks": [
7
- {
8
- "type": "command",
9
- "command": "bun x biome lint --write src/ bin/"
10
- }
11
- ]
12
- }
13
- ]
14
- }
15
- }
@@ -1,16 +0,0 @@
1
- #!/usr/bin/env bash
2
- # nax pre-commit hook — runs typecheck + lint
3
- # Install: git config core.hooksPath .githooks
4
-
5
- set -e
6
-
7
- # Ensure bun is on PATH (git hooks run with minimal PATH)
8
- export PATH="$HOME/.bun/bin:$PATH"
9
-
10
- echo "[pre-commit] Running typecheck..."
11
- bun run typecheck
12
-
13
- echo "[pre-commit] Running lint..."
14
- bun run lint
15
-
16
- echo "[pre-commit] OK"
package/.gitlab-ci.yml DELETED
@@ -1,103 +0,0 @@
1
- # .gitlab-ci.yml - nax CI/CD
2
- # Bun-native, single package (no turbo/monorepo)
3
- #
4
- # Triggers:
5
- # - MR: test only (gate for merge)
6
- # - [run-release] on master: test + release + notify
7
- # - [run-prerelease] on non-master: test + canary release + notify
8
- # - release-by-bot commits and tags: skipped entirely
9
-
10
- stages:
11
- - test
12
- - release
13
- - notify
14
-
15
- # --- Stage: Test ---
16
- test:
17
- stage: test
18
- image:
19
- name: nathapp/node-bun:22.21.0-1.3.9-alpine
20
- pull_policy: always
21
- before_script:
22
- - apk add --no-cache git
23
- - git config --global safe.directory '*'
24
- - git config --global user.name "CI Runner"
25
- - git config --global user.email "ci@nathapp.io"
26
- cache:
27
- key:
28
- files:
29
- - bun.lock
30
- paths:
31
- - node_modules/
32
- policy: pull-push
33
- script:
34
- - bun install --frozen-lockfile
35
- - bun run typecheck
36
- - bun run lint
37
- - bun run test
38
- rules:
39
- - if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
40
- when: never
41
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
42
- - if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
43
- - if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
44
-
45
- # --- Stage: Release ---
46
- release:
47
- stage: release
48
- image:
49
- name: nathapp/node-bun:22.21.0-1.3.9-alpine
50
- pull_policy: always
51
- cache:
52
- key:
53
- files:
54
- - bun.lock
55
- paths:
56
- - node_modules/
57
- policy: pull
58
- variables:
59
- NPM_REGISTRY: "//registry.npmjs.org/"
60
- NPM_RELEASE_TOKEN: $NPM_TOKEN
61
- before_script:
62
- - apk add --no-cache git
63
- - git config --global safe.directory '*'
64
- - git config --global user.name "$GITLAB_USER_NAME"
65
- - git config --global user.email "$GITLAB_USER_EMAIL"
66
- script:
67
- - bun install --frozen-lockfile
68
- - VERSION=$(bun -e "console.log(require('./package.json').version)")
69
- - bun run build
70
- - echo "${NPM_REGISTRY}:_authToken=${NPM_RELEASE_TOKEN}" > .npmrc
71
- - npm publish --access public
72
- - git tag -a "v${VERSION}" -m "v${VERSION}"
73
- - git push "https://${GITLAB_USER_NAME}:${CI_GIT_TOKEN}@${CI_REPOSITORY_URL#*@}" --tags
74
- rules:
75
- - if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
76
- when: never
77
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
78
- when: never
79
- - if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
80
- variables:
81
- NPM_REGISTRY: "//npm.nathapp.io/"
82
- NPM_RELEASE_TOKEN: $NPM_PRIVATE_TOKEN
83
- - if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
84
-
85
- # --- Stage: Notify ---
86
- notify:
87
- stage: notify
88
- image:
89
- name: registry-intl.cn-hongkong.aliyuncs.com/gkci/node:22.14.0-alpine-ci
90
- pull_policy: always
91
- needs: [release]
92
- script:
93
- - VERSION=$(node -e "console.log(require('./package.json').version)")
94
- - 'curl -s -X POST -H "Content-Type: application/json" -d "{\"chat_id\": \"$TELEGRAM_CHAT_ID\", \"text\": \"nax v${VERSION} released\"}" https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage'
95
- rules:
96
- - if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
97
- when: never
98
- - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
99
- when: never
100
- - if: '$TELEGRAM_BOT_TOKEN == null || $TELEGRAM_BOT_TOKEN == ""'
101
- when: never
102
- - if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
103
- - if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
package/.mcp.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "mcpServers": {
3
- "code-graph": {
4
- "type": "http",
5
- "url": "http://192.168.1.142:3100/mcp"
6
- }
7
- }
8
- }
package/BRIEF.md DELETED
@@ -1,140 +0,0 @@
1
- # nax — Brief
2
-
3
- ## What
4
- AI coding agent orchestrator (CLI, Bun + TypeScript). Takes a feature spec, decomposes into user stories via LLM, routes each to the right model tier by complexity, and executes them with auto-escalation and retry. Supports three-session TDD for quality-critical work. Currently v0.10.1 on master. Published as `@nathapp/nax` (not yet on npm — local/global install only).
5
-
6
- ## Architecture
7
-
8
- ```
9
- spec.md + tasks.md
10
-
11
- nax analyze → prd.json (user stories with routing metadata)
12
-
13
- nax run → pipeline per story:
14
- routing → context → constitution → prompt → optimizer → execution → review → acceptance → completion
15
- ↑ ↑
16
- (v0.10 plugin) (v0.10 plugin)
17
- ↑ ↑
18
- plugin routers plugin context-providers
19
- ```
20
-
21
- **Key modules:**
22
-
23
- | Module | Purpose |
24
- |:-------|:--------|
25
- | `pipeline/` | Stage-based runner — each stage returns continue/skip/fail/escalate/pause |
26
- | `routing/` | Strategy chain: keyword → LLM → adaptive → manual → plugin |
27
- | `context/` | Builds per-story context from PRD + dependencies within token budget |
28
- | `tdd/` | Three-session orchestrator: test-writer → implementer → verifier with git-diff isolation |
29
- | `execution/` | Spawns `claude -p` via ClaudeCodeAdapter, handles timeouts and cost tracking |
30
- | `status-file/` | *(v0.10.1)* Atomic JSON status writer for external monitoring (dashboards/CI) |
31
- | `acceptance/` | LLM-generated acceptance tests, validates story output |
32
- | `agents/` | Adapter pattern — currently only Claude Code, designed for Codex/Gemini/OpenCode |
33
- | `hooks/` | Lifecycle events (on-start, on-complete, on-pause, on-error) via shell commands |
34
- | `config/` | Layered config: global (`~/.nax/`) → project (`nax/`) with Zod validation + deep merge |
35
- | `constitution/` | Injected rules/constraints prepended to every agent prompt |
36
- | `plugins/` | *(v0.10)* Plugin loader, registry, and extension point interfaces |
37
- | `optimizer/` | *(v0.10)* Prompt optimization stage (rule-based built-in + plugin support) |
38
-
39
- ## Key Decisions
40
-
41
- | Decision | Why | Date | Ref |
42
- |:---------|:----|:-----|:----|
43
- | Classify complexity upfront, not start-cheap | Avoids wasting cycles on wrong model; LLM routing is cheap (~$0.002/story) | 2026-02-16 | SPEC.md |
44
- | Three-session TDD (not two) | Session 3 (verifier) catches cases where implementer subtly modifies tests; git-diff isolation between all sessions | 2026-02-16 | SPEC.md |
45
- | LLM outputs testStrategy directly | Keyword matching caused false positives ("endpoint"→TDD). LLM handles nuance better | 2026-02-23 | #11, #12 |
46
- | Stage-based pipeline over monolithic runner | Composable, testable, each stage can skip/fail independently | 2026-02-17 | v0.3-spec |
47
- | Bun over Node | Faster test execution, native TypeScript, built-in file APIs | 2026-02-16 | — |
48
- | Token budget for context | Prevents context overflow (200k window); reserves 100k for agent reasoning | 2026-02-17 | context/builder.ts |
49
- | Constitution as separate file | Project-level rules (coding standards, forbidden patterns) injected into every prompt without modifying CLAUDE.md | 2026-02-18 | — |
50
- | Hooks over built-in integrations | Users wire their own notifications/CI via shell commands; nax stays standalone | 2026-02-16 | SPEC.md |
51
- | Dropped greenfield scaffolding (#13) | Chicken-and-egg: nax/ must exist inside project, but scaffolding creates the project. Manual US-000 works fine. Existing tools (na-cli, nest new) handle scaffolding better. | 2026-03-03 | #13 |
52
- | Test-writer allowed paths for barrel exports | `src/index.ts` re-exports are common TDD collateral; soft-warn instead of hard-block | 2026-02-22 | #9 |
53
- | Story pause doesn't block unrelated stories | Dependency graph determines which stories can proceed independently | 2026-02-22 | #10 |
54
- | Use actual BuiltContext tokens in frontmatter | Re-estimating tokens independently caused mismatches; element-level tracking is more accurate for audit | 2026-02-23 | #15 |
55
- | Shared TDD prompt module | Extracting TDD prompts from orchestrator ensures consistency between CLI and execution | 2026-02-23 | #15 |
56
- | Plugin system over ad-hoc extension | Unified registration/loading for all extension points (optimizer, router, agent, reviewer, context, reporter). Reuses existing interfaces. | 2026-03-03 | #8, #14 |
57
- | Deep merge for global+project config | More intuitive than section replace; users only override what they change. Hooks and constitution concatenate (global first). | 2026-03-03 | #14 |
58
- | No LLM optimizer built-in | Fast-tier LLM rewrite adds cost/complexity. Rule-based covers deterministic wins. External LLM optimizers (LLMLingua, etc.) can be added via plugins. | 2026-03-03 | #8 |
59
- | TDD-Lite over removing TDD | TDD is nax's differentiator; instead of dropping it, add a relaxed variant (lite) where only verifier stays isolated. Strict for TS libs, lite for UI/polyglot. | 2026-02-24 | #20 |
60
- | Fix nax over replacing with dev-orchestrator | dev-orchestrator lacks TDD pipeline, structured logging, PRD workflow. Porting those is more work than fixing nax's weaknesses. | 2026-02-24 | `docs/20260224-nax-roadmap-phases.md` |
61
- | Dry-run marks stories as passed | Previous dry-run never changed story status, causing infinite loop until maxIterations. Now marks passed + saves PRD for natural completion. | 2026-02-24 | `09996c8` |
62
- | Targeted git reset for TDD fallback | `git checkout .` was too aggressive; now resets only files touched by the failed session, preserving other local changes. | 2026-02-24 | `d1dc4b9` |
63
- | Atomic Status File (v0.10.1) | Machine-readable status tracking via JSON. Atomic write (write-then-rename) prevents partial reads during polling. | 2026-02-25 | `status-file-v0.10.1.md` |
64
- | Category-based TDD routing (v0.10.1) | Isolation violations trigger strategy downgrade (Lite) while mechanical failures trigger tier escalation. Reduces manual pause/resume cycles. | 2026-02-25 | `status-file-v0.10.1.md` |
65
-
66
- ## Config Reference
67
-
68
- Config loaded from `~/.nax/config.json` (global) deep-merged with `nax/config.json` (project). CLI flags override both.
69
-
70
- **Resolution order:** Built-in defaults → `~/.nax/config.json` → `nax/config.json` → CLI flags
71
-
72
- | Section | Key | Type | Default | Purpose |
73
- |:--------|:----|:-----|:--------|:--------|
74
- | models | fast/balanced/powerful | ModelDef \| string | haiku/sonnet/opus | Maps abstract tiers to actual models |
75
- | autoMode | complexityRouting | Record<Complexity, Tier> | simple→fast, medium→balanced, complex/expert→powerful | Which tier handles which complexity |
76
- | autoMode | escalation.tierOrder | TierConfig[] | fast×5, balanced×3, powerful×2 | Retry budget per tier before escalating |
77
- | routing | strategy | keyword\|llm\|manual\|adaptive\|custom | keyword | How stories get classified |
78
- | routing | llm.mode | one-shot\|per-story\|hybrid | hybrid | Batch-route upfront + re-route on retry |
79
- | execution | costLimit | number (USD) | 5.0 | Pause run when cost exceeds this |
80
- | execution | sessionTimeoutSeconds | number | 600 | Kill agent session after this |
81
- | execution | verificationTimeoutSeconds | number | 300 | Kill test/typecheck/lint subprocess |
82
- | quality | commands.test | string | (auto-detect) | Custom test command |
83
- | quality | forceExit | boolean | false | Append --forceExit to test command |
84
- | quality | stripEnvVars | string[] | CLAUDECODE, REPL_ID, AGENT | Env vars removed during verification |
85
- | tdd | sessionTiers | {testWriter, implementer, verifier} | balanced/story-tier/fast | Per-session model overrides |
86
- | tdd | testWriterAllowedPaths | string[] | src/index.ts, src/**/index.ts | Soft-allowed paths for test-writer |
87
- | constitution | path | string | constitution.md | Relative to config dir (~/.nax/ or nax/) |
88
- | constitution | skipGlobal | boolean | false | *(v0.10)* Skip global constitution for this project |
89
- | context | testCoverage.detail | names-only\|names-and-counts\|describe-blocks | names-and-counts | How much test info to inject |
90
- | context | testCoverage.maxTokens | number | 500 | Token budget for test coverage section |
91
- | context | testCoverage.scopeToStory | boolean | true | Filter test coverage to story-relevant files only |
92
- | acceptance | enabled | boolean | true | Run LLM acceptance validation |
93
- | analyze | llmEnhanced | boolean | true | Use LLM for story decomposition |
94
- | optimizer | enabled | boolean | false | *(v0.10)* Enable prompt optimization stage |
95
- | optimizer | strategy | noop\|rule-based | noop | *(v0.10)* Built-in optimizer strategy |
96
- | hooks | skipGlobal | boolean | false | *(v0.10)* Skip global hooks for this project |
97
- | plugins | (array) | PluginConfigEntry[] | [] | *(v0.10)* Explicit plugin modules + config |
98
-
99
- Full schema with Zod validation: `src/config/schema.ts`
100
-
101
- ## v0.10 Specs
102
-
103
- | Feature | Spec File | Stories | Summary |
104
- |:--------|:----------|:--------|:--------|
105
- | Plugin System | `docs/v0.10-plugin-system.md` | 9 | Loader, registry, 6 extension point interfaces (optimizer, router, agent, reviewer, context-provider, reporter) |
106
- | Prompt Optimizer | `docs/v0.10-prompt-optimizer.md` | 5 | NoopOptimizer (default), RuleBasedOptimizer (strip whitespace, compact criteria, dedup context), optimizer pipeline stage |
107
- | Global Config | `docs/v0.10-global-config.md` | 7 | `~/.nax/` directory, deep merge (project wins), hooks concatenate (global first), constitution concatenate, `nax init --global`, `skipGlobal` opt-out |
108
- | Status File & Smart Escalation | `docs/specs/status-file-v0.10.1.md` | 9 | Atomic JSON status tracking, failure categorization, retry-as-lite strategy downgrade |
109
-
110
- **Total: ~30 user stories** across 4 features.
111
-
112
- ## Version History
113
-
114
- | Version | What Changed | Issues |
115
- |:--------|:-------------|:-------|
116
- | v0.10.1 | Status file (machine-readable), Smart TDD escalation (retryAsLite), Verifier Verdicts | #16 |
117
- | v0.10.0 | Plugin system, Global config layering, Prompt optimizer stage | #8, #14 |
118
- | v0.9.3 | Prompt Audit CLI (`nax prompts`), context isolation unit tests, scoped test coverage scanner | #15 |
119
-
120
- ## Roadmap
121
-
122
- | Priority | Feature | Status | Ref |
123
- |:---------|:--------|:-------|:----|
124
- | **Done** | Phase 1: TDD-Lite strategy + zero-file fallback | ✅ Done | #20, `docs/20260224-nax-roadmap-phases.md` |
125
- | **Next** | Phase 2: LLM Service Layer — agent interface with pluggable backends | 📋 Planned | #3 |
126
- | **Next** | Phase 3: Worktree parallelism — N stories concurrent | 📋 Planned | — |
127
- | **Backlog** | CLI for paused stories (`nax stories`, `nax resume`) | 📋 Planned | #18 |
128
- | **Backlog** | Quality flags + review.checks unification | 📋 Planned | #19 |
129
-
130
- ### Phase Dependency Chain
131
- ```
132
- Phase 1: tdd-lite + fallback ← standalone, no blockers
133
-
134
- Phase 2: LLM Service Layer (#3) ← abstracts agent spawning (claude-cli, openclaw, api)
135
-
136
- Phase 3: Worktree parallelism ← needs Phase 2 for multi-agent coordination
137
- ```
138
-
139
- ---
140
- *Updated 2026-02-25*