@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.
- package/CHANGELOG.md +13 -2
- package/dist/nax.js +72691 -0
- package/package.json +12 -4
- package/src/cli/config.ts +3 -1
- package/src/config/defaults.ts +1 -0
- package/src/config/schemas.ts +1 -0
- package/src/config/types.ts +1 -0
- package/src/context/builder.ts +10 -1
- package/src/prompts/sections/role-task.ts +4 -2
- package/src/review/runner.ts +6 -1
- package/src/version.ts +2 -1
- package/.claude/rules/01-project-conventions.md +0 -34
- package/.claude/rules/02-test-architecture.md +0 -39
- package/.claude/rules/03-test-writing.md +0 -58
- package/.claude/rules/04-forbidden-patterns.md +0 -29
- package/.claude/settings.json +0 -15
- package/.githooks/pre-commit +0 -16
- package/.gitlab-ci.yml +0 -103
- package/.mcp.json +0 -8
- package/BRIEF.md +0 -140
- package/CLAUDE.md +0 -143
- package/US-007-IMPLEMENTATION.md +0 -139
- package/biome.json +0 -14
- package/bun.lock +0 -163
- package/bunfig.toml +0 -12
- package/docker-compose.test.yml +0 -15
- package/docs/20260216-fix-plan-context-review.md +0 -56
- package/docs/20260216-relentless-vs-ngent-comparison.md +0 -208
- package/docs/20260216-v02-plan.md +0 -136
- package/docs/20260216-v02-review.md +0 -685
- package/docs/20260217-dogfood-findings.md +0 -56
- package/docs/20260217-p2-plus-plan.md +0 -117
- package/docs/20260217-partial-fixes-plan.md +0 -62
- package/docs/20260217-plan-analyze-spec.md +0 -117
- package/docs/20260217-post-impl-review.md +0 -1137
- package/docs/20260217-quick-wins-plan.md +0 -66
- package/docs/20260217-split-runner-plan.md +0 -75
- package/docs/20260217-v03-impl-plan.md +0 -80
- package/docs/20260217-v03-post-impl-review.md +0 -589
- package/docs/20260217-v04-impl-plan.md +0 -86
- package/docs/20260217-v05-post-impl-review.md +0 -850
- package/docs/20260217-v06-post-impl-review.md +0 -817
- package/docs/20260218-adr003-port-plan.md +0 -151
- package/docs/20260218-review-adr003-verification.md +0 -175
- package/docs/20260219-fix-plan-bug16-19.md +0 -79
- package/docs/20260219-fix-plan-bug20-22.md +0 -114
- package/docs/20260219-plan-llm-routing.md +0 -116
- package/docs/20260219-review-bug20-22-fixes.md +0 -135
- package/docs/20260219-routing-baseline-keyword.md +0 -63
- package/docs/20260220-plan-structured-logging-p1.md +0 -80
- package/docs/20260220-plan-structured-logging-p2.md +0 -37
- package/docs/20260220-review-llm-routing.md +0 -180
- package/docs/20260220-review-post-fix-llm-routing.md +0 -70
- package/docs/20260221-fix-plan-relevantfiles-split.md +0 -101
- package/docs/20260221-fix-plan-routing-mode.md +0 -125
- package/docs/20260221-review-v0.9-implementation.md +0 -379
- package/docs/20260222-fix-plan-v091-routing-isolation.md +0 -197
- package/docs/20260223-fix-plan-prompt-audit.md +0 -62
- package/docs/20260224-nax-roadmap-phases.md +0 -189
- package/docs/20260225-phase2-llm-service-layer.md +0 -401
- package/docs/20260225-review-v0.10.1.md +0 -187
- package/docs/20260303-v010-implementation-plan.md +0 -165
- package/docs/20260304-review-nax.md +0 -492
- package/docs/CLAUDE.md.bak +0 -191
- package/docs/ROADMAP.md +0 -390
- package/docs/SPEC-rectification.md +0 -0
- package/docs/SPEC.md +0 -324
- package/docs/US-001-plugin-loading-verification.md +0 -152
- package/docs/adr/ADR-005-implementation-plan.md +0 -655
- package/docs/adr/ADR-005-pipeline-re-architecture.md +0 -464
- package/docs/architecture-analysis.md +0 -1076
- package/docs/bugs/BUG-21-escalation-null-attempts.md +0 -48
- package/docs/bugs-from-dogfood-run-c.md +0 -243
- package/docs/code-review-20260228.md +0 -612
- package/docs/code-review-v0.15.0.md +0 -629
- package/docs/hook-lifecycle-test-plan.md +0 -149
- package/docs/releases/v0.11.0-and-earlier.md +0 -20
- package/docs/releases/v0.12.0.md +0 -15
- package/docs/releases/v0.13.0.md +0 -14
- package/docs/releases/v0.14.0.md +0 -20
- package/docs/releases/v0.14.1.md +0 -36
- package/docs/releases/v0.14.2.md +0 -51
- package/docs/releases/v0.14.3.md +0 -174
- package/docs/releases/v0.14.4.md +0 -94
- package/docs/releases/v0.15.0.md +0 -502
- package/docs/releases/v0.15.1.md +0 -170
- package/docs/releases/v0.15.3.md +0 -193
- package/docs/specs/bug-039-orphan-processes.md +0 -131
- package/docs/specs/bug-040-review-rectification.md +0 -82
- package/docs/specs/bug-041-cross-story-test-isolation.md +0 -88
- package/docs/specs/bug-042-verifier-failure-capture.md +0 -117
- package/docs/specs/bun-pty-migration.md +0 -171
- package/docs/specs/central-run-registry.md +0 -116
- package/docs/specs/feat-010-smart-runner-git-history.md +0 -96
- package/docs/specs/feat-011-file-context-strategy.md +0 -73
- package/docs/specs/feat-012-tdd-writer-tier.md +0 -79
- package/docs/specs/feat-013-test-after-review.md +0 -89
- package/docs/specs/feat-014-heartbeat-observability.md +0 -127
- package/docs/specs/status-file-consolidation.md +0 -93
- package/docs/specs/status-file-v0.10.1.md +0 -812
- package/docs/specs/trigger-completion.md +0 -145
- package/docs/specs/verification-architecture-v2.md +0 -343
- package/docs/tdd/strategies.md +0 -97
- package/docs/v0.10-global-config.md +0 -206
- package/docs/v0.10-plugin-system.md +0 -415
- package/docs/v0.10-prompt-optimizer.md +0 -234
- package/docs/v0.3-spec.md +0 -244
- package/docs/v0.4-spec.md +0 -140
- package/docs/v0.5-spec.md +0 -237
- package/docs/v0.6-spec.md +0 -371
- package/docs/v0.7-spec.md +0 -177
- package/docs/v0.8-llm-routing.md +0 -206
- package/docs/v0.8-structured-logging.md +0 -132
- package/docs/v0.9.3-prompt-audit.md +0 -112
- package/examples/plugins/console-reporter/index.test.ts +0 -207
- package/examples/plugins/console-reporter/index.ts +0 -110
- package/memory/topic/feat-010-baseref.md +0 -28
- package/memory/topic/feat-013-test-after-deprecation.md +0 -22
- package/nax/config.json +0 -154
- package/nax/features/bug-039-medium/prd.json +0 -45
- package/nax/features/bugfix-v0171/prd.json +0 -52
- package/nax/features/central-run-registry/prd.json +0 -105
- package/nax/features/config-management/prd.json +0 -108
- package/nax/features/config-management/progress.txt +0 -5
- package/nax/features/diagnose/acceptance.test.ts +0 -414
- package/nax/features/diagnose/prd.json +0 -41
- package/nax/features/nax-compliance/prd.json +0 -52
- package/nax/features/nax-compliance/progress.txt +0 -1
- package/nax/features/orchestration-fixes/prd.json +0 -89
- package/nax/features/orchestration-fixes/progress.txt +0 -1
- package/nax/features/plugin-integration/US-007-VERIFICATION.md +0 -259
- package/nax/features/plugin-integration/prd.json +0 -208
- package/nax/features/plugin-integration/progress.txt +0 -5
- package/nax/features/post-rearch-bugfix/prd.json +0 -137
- package/nax/features/precheck/prd.json +0 -205
- package/nax/features/precheck/progress.txt +0 -15
- package/nax/features/prompt-builder/prd.json +0 -152
- package/nax/features/prompt-builder/progress.txt +0 -3
- package/nax/features/review-quality/prd.json +0 -55
- package/nax/features/routing-persistence/prd.json +0 -104
- package/nax/features/routing-persistence/progress.txt +0 -1
- package/nax/features/smart-test-runner/plan.md +0 -7
- package/nax/features/smart-test-runner/prd.json +0 -203
- package/nax/features/smart-test-runner/progress.txt +0 -13
- package/nax/features/smart-test-runner/spec.md +0 -7
- package/nax/features/smart-test-runner/tasks.md +0 -8
- package/nax/features/status-file-consolidation/prd.json +0 -106
- package/nax/features/structured-logging/prd.json +0 -199
- package/nax/features/trigger-completion/prd.json +0 -150
- package/nax/features/trigger-completion/progress.txt +0 -7
- package/nax/features/unlock/prd.json +0 -36
- package/nax/features/v0.18.3-execution-reliability/prd.json +0 -80
- package/nax/features/v0.18.3-execution-reliability/progress.txt +0 -3
- package/nax/features/v0.19.0-hardening/plan.md +0 -7
- package/nax/features/v0.19.0-hardening/prd.json +0 -84
- package/nax/features/v0.19.0-hardening/progress.txt +0 -7
- package/nax/features/v0.19.0-hardening/spec.md +0 -18
- package/nax/features/v0.19.0-hardening/tasks.md +0 -8
- package/nax/features/verify-v2/prd.json +0 -79
- package/nax/features/verify-v2/progress.txt +0 -3
- package/nax/status.json +0 -36
- package/test/COVERAGE-GAPS.md +0 -333
- package/test/e2e/cm-003-default-view.test.ts +0 -195
- package/test/e2e/plan-analyze-run.test.ts +0 -902
- package/test/helpers/helpers.test.ts +0 -295
- package/test/helpers/timeout.ts +0 -42
- package/test/integration/US-002-TEST-SUMMARY.md +0 -107
- package/test/integration/US-003-TEST-SUMMARY.md +0 -149
- package/test/integration/US-004-TEST-SUMMARY.md +0 -106
- package/test/integration/US-005-TEST-SUMMARY.md +0 -138
- package/test/integration/US-007-TEST-SUMMARY.md +0 -100
- package/test/integration/cli/agent-validation.test.ts +0 -439
- package/test/integration/cli/cli-config-default-edge-cases.test.ts +0 -223
- package/test/integration/cli/cli-config-default-view.test.ts +0 -230
- package/test/integration/cli/cli-config-diff.test.ts +0 -461
- package/test/integration/cli/cli-config-prompts-explain.test.ts +0 -74
- package/test/integration/cli/cli-config.test.ts +0 -737
- package/test/integration/cli/cli-diagnose.test.ts +0 -595
- package/test/integration/cli/cli-logs.test.ts +0 -346
- package/test/integration/cli/cli-plugins.test.ts +0 -679
- package/test/integration/cli/cli-precheck.test.ts +0 -372
- package/test/integration/cli/cli-run-headless.test.ts +0 -174
- package/test/integration/cli/cli.test.ts +0 -76
- package/test/integration/cli/precheck-integration.test.ts +0 -476
- package/test/integration/cli/precheck-orchestrator.test.ts +0 -247
- package/test/integration/cli/precheck.test.ts +0 -806
- package/test/integration/config/config-loader.test.ts +0 -266
- package/test/integration/config/config.test.ts +0 -444
- package/test/integration/config/merger.test.ts +0 -466
- package/test/integration/config/paths.test.ts +0 -52
- package/test/integration/config/security-loader.test.ts +0 -83
- package/test/integration/context/context-integration.test.ts +0 -703
- package/test/integration/context/context-path-security.test.ts +0 -173
- package/test/integration/context/context-provider-injection.test.ts +0 -507
- package/test/integration/context/context-verification-integration.test.ts +0 -296
- package/test/integration/context/s5-greenfield-fallback.test.ts +0 -298
- package/test/integration/execution/execution-isolation.test.ts +0 -143
- package/test/integration/execution/execution.test.ts +0 -634
- package/test/integration/execution/feature-status-write.test.ts +0 -302
- package/test/integration/execution/parallel.test.ts +0 -251
- package/test/integration/execution/prd-pause.test.ts +0 -205
- package/test/integration/execution/prd-resolvers.test.ts +0 -186
- package/test/integration/execution/progress.test.ts +0 -34
- package/test/integration/execution/runner-batching.test.ts +0 -682
- package/test/integration/execution/runner-config-plugins.test.ts +0 -462
- package/test/integration/execution/runner-escalation.test.ts +0 -561
- package/test/integration/execution/runner-fixes.test.ts +0 -400
- package/test/integration/execution/runner-plugin-integration.test.ts +0 -544
- package/test/integration/execution/runner-queue-and-attempts.test.ts +0 -476
- package/test/integration/execution/status-file-integration.test.ts +0 -289
- package/test/integration/execution/status-file.test.ts +0 -380
- package/test/integration/execution/status-writer.test.ts +0 -447
- package/test/integration/execution/story-id-in-events.test.ts +0 -274
- package/test/integration/interaction/interaction-chain-pipeline.test.ts +0 -476
- package/test/integration/pipeline/hooks.test.ts +0 -363
- package/test/integration/pipeline/pipeline-acceptance.test.ts +0 -303
- package/test/integration/pipeline/pipeline-events.test.ts +0 -476
- package/test/integration/pipeline/pipeline.test.ts +0 -660
- package/test/integration/pipeline/reporter-lifecycle.test.ts +0 -862
- package/test/integration/pipeline/verify-stage.test.ts +0 -286
- package/test/integration/plan/analyze-integration.test.ts +0 -262
- package/test/integration/plan/analyze-scanner.test.ts +0 -132
- package/test/integration/plan/logger.test.ts +0 -461
- package/test/integration/plan/plan.test.ts +0 -157
- package/test/integration/plugins/config-integration.test.ts +0 -173
- package/test/integration/plugins/config-resolution.test.ts +0 -523
- package/test/integration/plugins/loader.test.ts +0 -644
- package/test/integration/plugins/plugins-registry.test.ts +0 -747
- package/test/integration/plugins/validator.test.ts +0 -564
- package/test/integration/prompts/pb-004-migration.test.ts +0 -523
- package/test/integration/review/review-config-commands.test.ts +0 -320
- package/test/integration/review/review-config-schema.test.ts +0 -117
- package/test/integration/review/review-plugin-integration.test.ts +0 -729
- package/test/integration/review/review.test.ts +0 -150
- package/test/integration/routing/plugin-routing-advanced.test.ts +0 -461
- package/test/integration/routing/plugin-routing-core.test.ts +0 -527
- package/test/integration/routing/routing-stage-bug-021.test.ts +0 -275
- package/test/integration/routing/routing-stage-greenfield.test.ts +0 -287
- package/test/integration/tdd/tdd-cleanup.test.ts +0 -246
- package/test/integration/tdd/tdd-orchestrator-core.test.ts +0 -565
- package/test/integration/tdd/tdd-orchestrator-failureCategory.test.ts +0 -355
- package/test/integration/tdd/tdd-orchestrator-fallback.test.ts +0 -311
- package/test/integration/tdd/tdd-orchestrator-lite.test.ts +0 -289
- package/test/integration/tdd/tdd-orchestrator-prompts.test.ts +0 -260
- package/test/integration/tdd/tdd-orchestrator-verdict.test.ts +0 -536
- package/test/integration/tmp/headless-test/test.jsonl +0 -30
- package/test/integration/verification/test-scanner.test.ts +0 -403
- package/test/integration/verification/verification-asset-check.test.ts +0 -143
- package/test/integration/worktree/manager.test.ts +0 -218
- package/test/integration/worktree/worktree-merge.test.ts +0 -341
- package/test/manual/logging-formatter-demo.ts +0 -158
- package/test/ui/tui-agent-panel.test.tsx +0 -99
- package/test/ui/tui-pty-integration.test.tsx +0 -146
- package/test/unit/acceptance.test.ts +0 -187
- package/test/unit/agent-stderr-capture.test.ts +0 -147
- package/test/unit/agents/claude.test.ts +0 -107
- package/test/unit/analyze-classifier.test.ts +0 -216
- package/test/unit/analyze.test.ts +0 -224
- package/test/unit/auto-detect.test.ts +0 -250
- package/test/unit/cli-status-project-level.test.ts +0 -283
- package/test/unit/cli-status.test.ts +0 -418
- package/test/unit/commands/common.test.ts +0 -321
- package/test/unit/commands/logs.test.ts +0 -458
- package/test/unit/commands/runs.test.ts +0 -303
- package/test/unit/commands/unlock.test.ts +0 -320
- package/test/unit/config/defaults.test.ts +0 -70
- package/test/unit/config/quality-commands-schema.test.ts +0 -72
- package/test/unit/config/regression-gate-schema.test.ts +0 -160
- package/test/unit/config/smart-runner-flag.test.ts +0 -250
- package/test/unit/constitution-generators.test.ts +0 -161
- package/test/unit/constitution.test.ts +0 -210
- package/test/unit/context/context-autodetect.test.ts +0 -297
- package/test/unit/context/context-build.test.ts +0 -575
- package/test/unit/context/context-coverage.test.ts +0 -236
- package/test/unit/context/context-error.test.ts +0 -93
- package/test/unit/context/context-estimate-tokens.test.ts +0 -201
- package/test/unit/context/context-format.test.ts +0 -302
- package/test/unit/context/context-isolation.test.ts +0 -267
- package/test/unit/context/context-sort.test.ts +0 -93
- package/test/unit/context/context-story.test.ts +0 -108
- package/test/unit/context/prior-failures.test.ts +0 -463
- package/test/unit/context.test.ts +0 -1726
- package/test/unit/cost.test.ts +0 -231
- package/test/unit/crash-recovery.test.ts +0 -309
- package/test/unit/escalation.test.ts +0 -127
- package/test/unit/execution/lifecycle/run-completion.test.ts +0 -240
- package/test/unit/execution/lifecycle/run-regression.test.ts +0 -420
- package/test/unit/execution/pid-registry.test.ts +0 -241
- package/test/unit/execution/sequential-executor.test.ts +0 -235
- package/test/unit/execution/sfc-004-dead-code-cleanup.test.ts +0 -89
- package/test/unit/execution/structured-failure.test.ts +0 -415
- package/test/unit/execution-logging-stderr.test.ts +0 -157
- package/test/unit/execution-stage.test.ts +0 -123
- package/test/unit/fix-generator.test.ts +0 -276
- package/test/unit/formatters.test.ts +0 -468
- package/test/unit/greenfield.test.ts +0 -180
- package/test/unit/hooks/shell-security.test.ts +0 -40
- package/test/unit/interaction/auto-plugin.test.ts +0 -162
- package/test/unit/interaction/human-review-trigger.test.ts +0 -165
- package/test/unit/interaction-network-failures.test.ts +0 -390
- package/test/unit/interaction-plugins.test.ts +0 -472
- package/test/unit/logging/formatter.test.ts +0 -456
- package/test/unit/merge.test.ts +0 -269
- package/test/unit/metrics/aggregator.test.ts +0 -164
- package/test/unit/metrics/tracker.test.ts +0 -186
- package/test/unit/metrics.test.ts +0 -276
- package/test/unit/optimizer/noop.optimizer.test.ts +0 -125
- package/test/unit/optimizer/rule-based.optimizer.test.ts +0 -358
- package/test/unit/pipeline/event-bus.test.ts +0 -105
- package/test/unit/pipeline/routing-partial-override.test.ts +0 -121
- package/test/unit/pipeline/runner-retry.test.ts +0 -89
- package/test/unit/pipeline/stages/autofix.test.ts +0 -97
- package/test/unit/pipeline/stages/completion-review-gate.test.ts +0 -218
- package/test/unit/pipeline/stages/execution-ambiguity.test.ts +0 -311
- package/test/unit/pipeline/stages/execution-merge-conflict.test.ts +0 -218
- package/test/unit/pipeline/stages/rectify.test.ts +0 -101
- package/test/unit/pipeline/stages/regression-stage.test.ts +0 -69
- package/test/unit/pipeline/stages/review.test.ts +0 -201
- package/test/unit/pipeline/stages/routing-idempotence.test.ts +0 -139
- package/test/unit/pipeline/stages/routing-initial-complexity.test.ts +0 -321
- package/test/unit/pipeline/stages/routing-persistence.test.ts +0 -380
- package/test/unit/pipeline/stages/verify.test.ts +0 -267
- package/test/unit/pipeline/subscribers/events-writer.test.ts +0 -227
- package/test/unit/pipeline/subscribers/hooks.test.ts +0 -84
- package/test/unit/pipeline/subscribers/interaction.test.ts +0 -313
- package/test/unit/pipeline/subscribers/registry.test.ts +0 -149
- package/test/unit/pipeline/subscribers/reporters.test.ts +0 -90
- package/test/unit/pipeline/verify-smart-runner.test.ts +0 -345
- package/test/unit/prd-auto-default.test.ts +0 -291
- package/test/unit/prd-failure-category.test.ts +0 -177
- package/test/unit/prd-get-next-story.test.ts +0 -215
- package/test/unit/precheck/checks-warnings.test.ts +0 -114
- package/test/unit/precheck-checks.test.ts +0 -841
- package/test/unit/precheck-story-size-gate.test.ts +0 -288
- package/test/unit/precheck-types.test.ts +0 -143
- package/test/unit/prompts/builder.test.ts +0 -258
- package/test/unit/prompts/loader.test.ts +0 -355
- package/test/unit/prompts/sections/conventions.test.ts +0 -30
- package/test/unit/prompts/sections/isolation.test.ts +0 -35
- package/test/unit/prompts/sections/role-task.test.ts +0 -40
- package/test/unit/prompts/sections/sections.test.ts +0 -238
- package/test/unit/prompts/sections/story.test.ts +0 -45
- package/test/unit/prompts/sections/verdict.test.ts +0 -58
- package/test/unit/prompts.test.ts +0 -476
- package/test/unit/queue.test.ts +0 -237
- package/test/unit/rectification.test.ts +0 -285
- package/test/unit/registry.test.ts +0 -288
- package/test/unit/review/runner.test.ts +0 -117
- package/test/unit/routing/content-hash.test.ts +0 -99
- package/test/unit/routing/routing-stability.test.ts +0 -208
- package/test/unit/routing/strategies/llm.test.ts +0 -306
- package/test/unit/routing-advanced.test.ts +0 -313
- package/test/unit/routing-core.test.ts +0 -341
- package/test/unit/routing-strategies.test.ts +0 -440
- package/test/unit/storyid-events.test.ts +0 -213
- package/test/unit/tdd-verdict.test.ts +0 -492
- package/test/unit/test-output-parser.test.ts +0 -377
- package/test/unit/ui/tui-controls.test.ts +0 -335
- package/test/unit/ui/tui-cost-and-pty.test.ts +0 -190
- package/test/unit/ui/tui-layout.test.ts +0 -379
- package/test/unit/ui/tui-stories.test.ts +0 -333
- package/test/unit/unit-isolation.test.ts +0 -135
- package/test/unit/utils/git.test.ts +0 -50
- package/test/unit/utils/path-security.test.ts +0 -47
- package/test/unit/utils-helpers.test.ts +0 -318
- package/test/unit/verdict.test.ts +0 -325
- package/test/unit/verification/orchestrator-types.test.ts +0 -54
- package/test/unit/verification/orchestrator.test.ts +0 -66
- package/test/unit/verification/smart-runner-config.test.ts +0 -163
- package/test/unit/verification/smart-runner-discovery.test.ts +0 -354
- package/test/unit/verification/smart-runner.test.ts +0 -262
- package/test/unit/verification/strategies/acceptance.test.ts +0 -33
- package/test/unit/verification/strategies/regression.test.ts +0 -87
- package/test/unit/verification/strategies/scoped.test.ts +0 -100
- package/test/unit/worktree-manager.test.ts +0 -159
- package/tsconfig.json +0 -27
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nathapp/nax",
|
|
3
|
-
"version": "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": "./
|
|
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
|
|
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}`);
|
package/src/config/defaults.ts
CHANGED
package/src/config/schemas.ts
CHANGED
|
@@ -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({
|
package/src/config/types.ts
CHANGED
|
@@ -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) */
|
package/src/context/builder.ts
CHANGED
|
@@ -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
|
-
"-
|
|
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
|
-
"-
|
|
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
|
}
|
package/src/review/runner.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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 |
|
package/.claude/settings.json
DELETED
package/.githooks/pre-commit
DELETED
|
@@ -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
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*
|