@nathapp/nax 0.27.1 → 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 +42 -1
- package/src/cli/prompts.ts +18 -6
- package/src/config/defaults.ts +2 -0
- package/src/config/schemas.ts +11 -0
- package/src/config/types.ts +8 -0
- package/src/context/builder.ts +10 -1
- package/src/pipeline/stages/execution.ts +5 -0
- package/src/pipeline/stages/prompt.ts +13 -4
- package/src/precheck/checks-warnings.ts +37 -0
- package/src/precheck/checks.ts +1 -0
- package/src/precheck/index.ts +14 -7
- package/src/prompts/builder.ts +178 -0
- package/src/prompts/index.ts +2 -0
- package/src/prompts/loader.ts +43 -0
- package/src/prompts/sections/conventions.ts +15 -0
- package/src/prompts/sections/index.ts +11 -0
- package/src/prompts/sections/isolation.ts +24 -0
- package/src/prompts/sections/role-task.ts +34 -0
- package/src/prompts/sections/story.ts +13 -0
- package/src/prompts/sections/verdict.ts +70 -0
- package/src/prompts/templates/implementer.ts +6 -0
- package/src/prompts/templates/single-session.ts +6 -0
- package/src/prompts/templates/test-writer.ts +6 -0
- package/src/prompts/templates/verifier.ts +6 -0
- package/src/prompts/types.ts +21 -0
- package/src/review/runner.ts +6 -1
- package/src/tdd/session-runner.ts +12 -12
- 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 -364
- 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/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.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/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.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.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
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# BUN-001: Bun PTY Migration
|
|
2
|
-
|
|
3
|
-
**Version:** v0.18.5
|
|
4
|
-
**Status:** Planned
|
|
5
|
-
**Author:** Nax Dev
|
|
6
|
-
**Date:** 2026-03-04
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Problem
|
|
11
|
-
|
|
12
|
-
nax uses `node-pty` (a native C++ addon) to spawn interactive Claude Code sessions and drive the TUI. This creates several pain points:
|
|
13
|
-
|
|
14
|
-
| Pain Point | Impact |
|
|
15
|
-
|:---|:---|
|
|
16
|
-
| Requires `python`, `make`, `g++` at build time | CI `before_script` must `apk add python3 make g++`; `--ignore-scripts` is a fragile workaround |
|
|
17
|
-
| Native build fails on Alpine if workaround is removed | Blocks moving to 1GB runners (CI-001) |
|
|
18
|
-
| Not Bun-native — `require("node-pty")` uses CJS | Inconsistent with Bun-first codebase |
|
|
19
|
-
| No type safety without `@types/node-pty` | Interface `IPty` lives in node-pty types |
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Solution
|
|
24
|
-
|
|
25
|
-
Replace `node-pty` with **`Bun.spawn`** configured with `stdin: "pipe"` and `stdout: "pipe"` for interactive mode, OR `Bun.Terminal` API if it provides PTY semantics in Bun 1.3.7+.
|
|
26
|
-
|
|
27
|
-
### Research Gate (first task)
|
|
28
|
-
|
|
29
|
-
Before writing any code, verify Bun PTY support:
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
# Check if Bun.Terminal exists
|
|
33
|
-
bun -e "console.log(typeof Bun.Terminal)"
|
|
34
|
-
|
|
35
|
-
# Check for any PTY-related Bun APIs
|
|
36
|
-
bun -e "console.log(Object.keys(Bun).filter(k => k.toLowerCase().includes('pty') || k.toLowerCase().includes('term')))"
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**If `Bun.Terminal` is available:** Use it directly for full PTY semantics.
|
|
40
|
-
**If not available:** Use `Bun.spawn` with piped stdio. Claude Code works headlessly — no raw TTY required for nax's use case.
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## Scope
|
|
45
|
-
|
|
46
|
-
### Files to change
|
|
47
|
-
|
|
48
|
-
| File | Change |
|
|
49
|
-
|:---|:---|
|
|
50
|
-
| `src/agents/claude.ts` | `runInteractive()` — replace `nodePty.spawn()` with Bun equivalent |
|
|
51
|
-
| `src/agents/types.ts` | `PtyHandle` interface — remove dependency on `IPty` |
|
|
52
|
-
| `src/tui/hooks/usePty.ts` | Replace `nodePty.spawn()` + `pty.IPty` state with Bun equivalent |
|
|
53
|
-
| `package.json` | Remove `node-pty` from `dependencies` |
|
|
54
|
-
| `.gitlab-ci.yml` | Remove `--ignore-scripts` from both `bun install` calls |
|
|
55
|
-
| `.gitlab-ci.yml` | Remove `python3 make g++` from `apk add` in `before_script` |
|
|
56
|
-
|
|
57
|
-
### Files NOT to change
|
|
58
|
-
|
|
59
|
-
- `src/agents/adapters/` — use `runInteractive()` via interface only
|
|
60
|
-
- `src/pipeline/` — no pty usage
|
|
61
|
-
- Test files — `_deps` pattern already covers mocking
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## Implementation Plan
|
|
66
|
-
|
|
67
|
-
### Phase 1 — Research
|
|
68
|
-
|
|
69
|
-
1. Run research gate on Mac01 (Bun 1.3.9) to confirm `Bun.Terminal` availability
|
|
70
|
-
2. Test `claude -p "hello"` with `Bun.spawn` piped stdio to confirm headless operation
|
|
71
|
-
3. Determine if `resize()` is actually called during nax runs (check execution logs)
|
|
72
|
-
|
|
73
|
-
### Phase 2 — `src/agents/claude.ts`
|
|
74
|
-
|
|
75
|
-
Replace `runInteractive()`:
|
|
76
|
-
|
|
77
|
-
```typescript
|
|
78
|
-
// BEFORE (node-pty)
|
|
79
|
-
const ptyProc = nodePty.spawn(cmd[0], cmd.slice(1), {
|
|
80
|
-
name: "xterm-256color", cols: 80, rows: 24,
|
|
81
|
-
cwd: options.workdir, env: this.buildAllowedEnv(options),
|
|
82
|
-
});
|
|
83
|
-
ptyProc.onData((data) => options.onOutput(Buffer.from(data)));
|
|
84
|
-
ptyProc.onExit((e) => options.onExit(e.exitCode));
|
|
85
|
-
|
|
86
|
-
// AFTER (Bun.spawn)
|
|
87
|
-
const proc = Bun.spawn(cmd, {
|
|
88
|
-
cwd: options.workdir,
|
|
89
|
-
env: { ...this.buildAllowedEnv(options), TERM: "xterm-256color" },
|
|
90
|
-
stdin: "pipe", stdout: "pipe", stderr: "pipe",
|
|
91
|
-
});
|
|
92
|
-
// Stream stdout chunks to onOutput
|
|
93
|
-
(async () => {
|
|
94
|
-
for await (const chunk of proc.stdout) {
|
|
95
|
-
options.onOutput(Buffer.from(chunk));
|
|
96
|
-
}
|
|
97
|
-
})();
|
|
98
|
-
proc.exited.then((code) => options.onExit(code ?? 1));
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
New `PtyHandle` mapping:
|
|
102
|
-
|
|
103
|
-
| `IPty` API | Bun equivalent |
|
|
104
|
-
|:---|:---|
|
|
105
|
-
| `ptyProc.write(data)` | `proc.stdin.write(data)` |
|
|
106
|
-
| `ptyProc.kill()` | `proc.kill()` |
|
|
107
|
-
| `ptyProc.pid` | `proc.pid` |
|
|
108
|
-
| `ptyProc.resize(c, r)` | no-op (or `Bun.Terminal.resize()` if available) |
|
|
109
|
-
|
|
110
|
-
### Phase 3 — `src/tui/hooks/usePty.ts`
|
|
111
|
-
|
|
112
|
-
Replace `pty.IPty` state with `Bun.Subprocess`:
|
|
113
|
-
|
|
114
|
-
```typescript
|
|
115
|
-
// Remove:
|
|
116
|
-
import type * as pty from "node-pty";
|
|
117
|
-
const [ptyProcess, setPtyProcess] = useState<pty.IPty | null>(null);
|
|
118
|
-
|
|
119
|
-
// Replace with:
|
|
120
|
-
const [proc, setProc] = useState<ReturnType<typeof Bun.spawn> | null>(null);
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
All `ptyProc.*` calls map directly to Bun subprocess equivalents.
|
|
124
|
-
|
|
125
|
-
### Phase 4 — CI cleanup
|
|
126
|
-
|
|
127
|
-
```yaml
|
|
128
|
-
# before_script: remove python3 make g++
|
|
129
|
-
- apk add --no-cache git
|
|
130
|
-
|
|
131
|
-
# bun install: remove --ignore-scripts
|
|
132
|
-
- bun install --frozen-lockfile
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### Phase 5 — package.json
|
|
136
|
-
|
|
137
|
-
Remove `"node-pty": "^1.1.0"` from `dependencies`.
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
## Acceptance Criteria
|
|
142
|
-
|
|
143
|
-
| # | Criteria |
|
|
144
|
-
|:---|:---|
|
|
145
|
-
| AC1 | `node-pty` removed — `bun install` completes without native build |
|
|
146
|
-
| AC2 | `bun run typecheck` passes — no `IPty` or `node-pty` references |
|
|
147
|
-
| AC3 | CI `before_script` no longer installs `python3 make g++` |
|
|
148
|
-
| AC4 | CI `bun install` runs without `--ignore-scripts` |
|
|
149
|
-
| AC5 | `runInteractive()` spawns Claude Code via `Bun.spawn` — sessions complete |
|
|
150
|
-
| AC6 | `usePty` hook — output streams and lifecycle work correctly |
|
|
151
|
-
| AC7 | All existing tests pass (2126 pass, 0 fail) |
|
|
152
|
-
| AC8 | `nax run` works end-to-end on Mac01 with a real story |
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## Risks
|
|
157
|
-
|
|
158
|
-
| Risk | Mitigation |
|
|
159
|
-
|:---|:---|
|
|
160
|
-
| `Bun.Terminal` not available/stable in 1.3.9 | Fall back to `Bun.spawn` pipe mode (test first) |
|
|
161
|
-
| Claude Code requires a real PTY | Test `claude -p "hello"` piped before committing |
|
|
162
|
-
| TUI rendering degrades without PTY | Acceptable — TUI is rarely used in headless nax runs |
|
|
163
|
-
| `resize()` breaks | nax doesn't actively call resize during agent sessions; safe no-op |
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## Out of Scope
|
|
168
|
-
|
|
169
|
-
- `Bun.Terminal` advanced features (if not stable)
|
|
170
|
-
- CI-001 memory sharding (separate item)
|
|
171
|
-
- Windows PTY support
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
# Central Run Registry — Spec
|
|
2
|
-
|
|
3
|
-
**Version:** v0.24.0
|
|
4
|
-
**Status:** Planned
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Problem
|
|
9
|
-
|
|
10
|
-
nax stores run state per-project at `<workdir>/nax/features/<feature>/status.json`. There is no global index — you must `cd` into each project to see its run history. There is no way to answer "what has nax run across all my projects recently?"
|
|
11
|
-
|
|
12
|
-
## Existing Layout (per-project)
|
|
13
|
-
|
|
14
|
-
```
|
|
15
|
-
<workdir>/nax/
|
|
16
|
-
config.json
|
|
17
|
-
features/
|
|
18
|
-
<feature>/
|
|
19
|
-
prd.json
|
|
20
|
-
status.json ← live run state (NaxStatusFile, written continuously)
|
|
21
|
-
runs/
|
|
22
|
-
<timestamp>.jsonl ← event log
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`status.json` already contains: runId, feature, status (running/completed/failed/crashed), progress counts, cost, current story, startedAt, etc. — everything needed for a global view.
|
|
26
|
-
|
|
27
|
-
## Goal
|
|
28
|
-
|
|
29
|
-
A global `~/.nax/runs/` registry that indexes every nax run via path references — no data duplication, no symlinks.
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Directory Structure
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
~/.nax/runs/
|
|
37
|
-
<project>-<feature>-<runId>/
|
|
38
|
-
meta.json ← pointer record only (paths + minimal identifiers)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### meta.json Schema
|
|
42
|
-
|
|
43
|
-
```json
|
|
44
|
-
{
|
|
45
|
-
"runId": "run-2026-03-07T05-30-00-000Z",
|
|
46
|
-
"project": "my-app",
|
|
47
|
-
"feature": "auth-system",
|
|
48
|
-
"workdir": "/Users/william/projects/my-app",
|
|
49
|
-
"statusPath": "/Users/william/projects/my-app/nax/features/auth-system/status.json",
|
|
50
|
-
"eventsDir": "/Users/william/projects/my-app/nax/features/auth-system/runs",
|
|
51
|
-
"registeredAt": "2026-03-07T05:30:00.000Z"
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
- Written **once** on run start — never updated (source of truth stays in `statusPath`)
|
|
56
|
-
- `nax runs` reads `meta.json` to locate `statusPath`, then reads live `status.json` for current state
|
|
57
|
-
- If `statusPath` doesn't exist (project deleted/moved) → show `[unavailable]` gracefully
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## Implementation
|
|
62
|
-
|
|
63
|
-
### CRR-000: Events File Writer (new subscriber)
|
|
64
|
-
|
|
65
|
-
- New module: `src/pipeline/subscribers/events-writer.ts` — `wireEventsWriter()`
|
|
66
|
-
- Writes to `~/.nax/events/<project>/events.jsonl` — one JSON line per lifecycle event
|
|
67
|
-
- Listens to event bus: `run:started`, `story:started`, `story:completed`, `story:failed`, `run:completed`
|
|
68
|
-
- Each line: `{"ts", "event", "runId", "feature", "project", "storyId?"}`
|
|
69
|
-
- `run:completed` emits an `on-complete` event — used by external tooling (watchdog) to distinguish clean exit from crash
|
|
70
|
-
- Best-effort: never throw/block the main run on write failure
|
|
71
|
-
- Directory created on first write
|
|
72
|
-
|
|
73
|
-
**Motivation:** External tools (nax-watchdog, CI integrations) need a reliable signal that nax exited gracefully. Currently nax writes no machine-readable completion event, causing false crash reports. This also provides the foundation for CRR — `meta.json` can reference the events file path.
|
|
74
|
-
|
|
75
|
-
### CRR-001: Registry Writer (new subscriber)
|
|
76
|
-
|
|
77
|
-
- New module: `src/execution/run-registry.ts` — `registerRun(meta)`, `getRunsDir()`
|
|
78
|
-
- On run start: create `~/.nax/runs/<project>-<feature>-<runId>/meta.json`
|
|
79
|
-
- Wire as **event bus subscriber** (`wireRegistry()` in `src/pipeline/subscribers/registry.ts`) — listens to `run:started`
|
|
80
|
-
- Best-effort: never throw/block the main run on registry failure (try/catch + warn log)
|
|
81
|
-
- `~/.nax/runs/` created on first call — no separate init step
|
|
82
|
-
|
|
83
|
-
### CRR-002: `nax runs` CLI Command
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
nax runs # All runs, newest first (default: last 20)
|
|
87
|
-
nax runs --project my-app # Filter by project name
|
|
88
|
-
nax runs --last 50 # Show last N runs
|
|
89
|
-
nax runs --status failed # Filter by status (running/completed/failed/crashed)
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**Output table:**
|
|
93
|
-
```
|
|
94
|
-
RUN ID PROJECT FEATURE STATUS STORIES DURATION DATE
|
|
95
|
-
run-2026-03-07T05-30-00-000Z my-app auth-system completed 5/5 45m 2026-03-07 13:30
|
|
96
|
-
run-2026-03-07T04-00-00-000Z nax re-arch failed 3/5 1h 2m 2026-03-07 12:00
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
- Reads all `~/.nax/runs/*/meta.json`, resolves live `status.json` from `statusPath`
|
|
100
|
-
- Sorts by `registeredAt` desc
|
|
101
|
-
- If `statusPath` missing → status shows `[unavailable]`
|
|
102
|
-
- New command: `src/commands/runs.ts`
|
|
103
|
-
|
|
104
|
-
### CRR-003: `nax logs` Enhancement
|
|
105
|
-
|
|
106
|
-
- `nax logs --run <runId>` — resolve run from global registry, locate `eventsDir`, stream logs
|
|
107
|
-
- No need to be in the project directory
|
|
108
|
-
- Falls back to current behaviour (local feature context) when `--run` not specified
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Out of Scope
|
|
113
|
-
|
|
114
|
-
- Registry cleanup/prune command (future)
|
|
115
|
-
- Remote sync (future)
|
|
116
|
-
- Search by story ID (future)
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# FEAT-010 — Smart Test Runner: Git-History Mode
|
|
2
|
-
|
|
3
|
-
**Status:** Proposal
|
|
4
|
-
**Target:** v0.21.0
|
|
5
|
-
**Author:** Nax Dev
|
|
6
|
-
**Date:** 2026-03-06
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 1. Problem with Current Approach
|
|
11
|
-
|
|
12
|
-
Smart Test Runner uses `git diff --name-only HEAD` (or `HEAD~1`) to find changed files. This breaks in several scenarios:
|
|
13
|
-
|
|
14
|
-
| Scenario | Problem |
|
|
15
|
-
|---|---|
|
|
16
|
-
| Agent makes 3 commits | `HEAD~1` only sees last commit; earlier changes missed |
|
|
17
|
-
| Agent uses `git commit --amend` | HEAD stays same; diff shows nothing |
|
|
18
|
-
| Uncommitted staged changes | Picks up unrelated staged changes |
|
|
19
|
-
| Story retried after partial commit | Baseline resets to wrong point |
|
|
20
|
-
|
|
21
|
-
Result: empty `[]` → full suite fallback (150s+) → deferred mode skips → no per-story tests.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## 2. Proposed Solution
|
|
26
|
-
|
|
27
|
-
Track a **baseCommitHash** per story at session start. On verify, diff `HEAD` vs `baseCommitHash` — exact files the agent touched regardless of commit count.
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
Story starts → capture git HEAD → store as story.baseRef
|
|
31
|
-
Agent runs → makes N commits (any pattern)
|
|
32
|
-
Verify runs → git diff --name-only story.baseRef HEAD → precise file list
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## 3. Implementation Details
|
|
38
|
-
|
|
39
|
-
**Capture baseRef** in `sequential-executor.ts` before agent launch:
|
|
40
|
-
```typescript
|
|
41
|
-
story.baseRef = await captureGitRef(workdir); // already exists in utils/git.ts
|
|
42
|
-
await savePrd(prd, prdPath);
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
**New mode branch** in `smart-runner.ts`:
|
|
46
|
-
```typescript
|
|
47
|
-
if (mode === "git-history" && story?.baseRef) {
|
|
48
|
-
return gitWithTimeout(["diff", "--name-only", story.baseRef, "HEAD"], workdir);
|
|
49
|
-
}
|
|
50
|
-
// fallback: existing git-diff logic
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## 4. Files Affected
|
|
56
|
-
|
|
57
|
-
| File | Change |
|
|
58
|
-
|---|---|
|
|
59
|
-
| `src/prd/types.ts` | Add `baseRef?: string` to `UserStory` |
|
|
60
|
-
| `src/execution/sequential-executor.ts` | Capture `baseRef` before agent, persist to PRD |
|
|
61
|
-
| `src/verification/smart-runner.ts` | Add `"git-history"` mode |
|
|
62
|
-
| `src/config/schemas.ts` | Add `smartTestRunner.mode: "git-diff" | "git-history"` |
|
|
63
|
-
| `src/config/types.ts` | Add `mode` to `SmartTestRunnerConfig` |
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## 5. Config Changes
|
|
68
|
-
|
|
69
|
-
```jsonc
|
|
70
|
-
{
|
|
71
|
-
"execution": {
|
|
72
|
-
"smartTestRunnerConfig": {
|
|
73
|
-
"mode": "git-history", // "git-diff" (default) | "git-history"
|
|
74
|
-
"enabled": true
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## 6. Migration / Compatibility
|
|
83
|
-
|
|
84
|
-
- Default: `"git-diff"` — no behavior change
|
|
85
|
-
- `"git-history"` opt-in
|
|
86
|
-
- Missing `story.baseRef` → falls back to `"git-diff"` (no crash)
|
|
87
|
-
- nax self-dev config should switch to `"git-history"` immediately
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## 7. Test Plan
|
|
92
|
-
|
|
93
|
-
- `baseRef` captured and persisted before agent runs
|
|
94
|
-
- Multi-commit session: all files detected (not just last commit's)
|
|
95
|
-
- Missing `baseRef` → graceful fallback to `"git-diff"`
|
|
96
|
-
- `captureGitRef()` failure → `baseRef` undefined, fallback used
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# FEAT-011 — File Context Strategy
|
|
2
|
-
|
|
3
|
-
**Status:** Proposal
|
|
4
|
-
**Target:** v0.21.0
|
|
5
|
-
**Author:** Nax Dev
|
|
6
|
-
**Date:** 2026-03-06
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 1. Problem
|
|
11
|
-
|
|
12
|
-
nax injects full file content into agent prompts for all relevant source files. For large files (500+ lines), this bloats the context window — increasing cost and reducing focus. The agent has tool access to read files directly, making full content injection for large files redundant.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## 2. Proposed Config
|
|
17
|
-
|
|
18
|
-
```jsonc
|
|
19
|
-
{
|
|
20
|
-
"context": {
|
|
21
|
-
"fileContext": {
|
|
22
|
-
"strategy": "auto", // "auto" | "full" | "path-only"
|
|
23
|
-
"maxInlineLines": 500, // threshold for "auto" mode
|
|
24
|
-
"previewLines": 20 // lines shown in path-only / large-file preview
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 3. Injection Logic
|
|
33
|
-
|
|
34
|
-
| Strategy | Condition | Agent receives |
|
|
35
|
-
|---|---|---|
|
|
36
|
-
| `"full"` | always | Complete file content |
|
|
37
|
-
| `"path-only"` | always | Relative path + line count only |
|
|
38
|
-
| `"auto"` | file ≤ `maxInlineLines` | Complete file content |
|
|
39
|
-
| `"auto"` | file > `maxInlineLines` | Path + line count + first `previewLines` lines |
|
|
40
|
-
|
|
41
|
-
**Large file preview format:**
|
|
42
|
-
```
|
|
43
|
-
// src/execution/sequential-executor.ts (847 lines — use Read tool for full content)
|
|
44
|
-
import { ... } from "...";
|
|
45
|
-
// first 20 lines...
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## 4. Files Affected
|
|
51
|
-
|
|
52
|
-
| File | Change |
|
|
53
|
-
|---|---|
|
|
54
|
-
| `src/config/schemas.ts` | Add `context.fileContext` schema |
|
|
55
|
-
| `src/config/types.ts` | Add `FileContextConfig` interface |
|
|
56
|
-
| `src/context/builder.ts` | Apply strategy when injecting file content |
|
|
57
|
-
| `src/context/providers/` | Update providers that inject raw file content |
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## 5. Cost Impact
|
|
62
|
-
|
|
63
|
-
Primary benefit is **quality** (more focused context), not raw cost savings. Rough estimate for a typical 5-story run: ~3000 tokens saved if avg file is 800 lines. At sonnet pricing: <$0.01 per run — marginal, but compounds.
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## 6. Test Plan
|
|
68
|
-
|
|
69
|
-
- `strategy: "full"` → always full content regardless of line count
|
|
70
|
-
- `strategy: "path-only"` → always path + count only
|
|
71
|
-
- `strategy: "auto"`, 300-line file → full content
|
|
72
|
-
- `strategy: "auto"`, 600-line file → path + 20-line preview
|
|
73
|
-
- Default: `"auto"` with `maxInlineLines: 500`
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
# FEAT-012 — TDD Test Writer Tier Validation
|
|
2
|
-
|
|
3
|
-
**Status:** Won't Fix — balanced tier is sufficient for test-writer; not worth the added complexity
|
|
4
|
-
**Target:** v0.21.0
|
|
5
|
-
**Author:** Nax Dev
|
|
6
|
-
**Date:** 2026-03-06
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 1. Problem
|
|
11
|
-
|
|
12
|
-
nax TDD runs two sessions: **testWriter** then **implementer**. The testWriter tier is configured separately (`tdd.sessionTiers.testWriter`, default `"balanced"`). The implementer uses the story's routed `modelTier`.
|
|
13
|
-
|
|
14
|
-
**Risk:** If testWriter runs `"fast"` and the implementer runs `"powerful"`, the tests written may be too shallow — they test happy paths but miss edge cases a powerful model's implementation handles. Result: powerful implementer writes sophisticated code, all tests pass (trivially), then the deferred regression gate catches real failures.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## 2. Tier Ordering
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
fast (1) < balanced (2) < powerful (3)
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
**Invariant:** `testWriterTier >= implementerTier`
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 3. Validation Logic
|
|
29
|
-
|
|
30
|
-
In `src/tdd/session-runner.ts` before launching testWriter:
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
const tierOrder = { fast: 1, balanced: 2, powerful: 3 };
|
|
34
|
-
const writerTier = config.tdd.sessionTiers?.testWriter ?? "balanced";
|
|
35
|
-
const implementerTier = story.routing.modelTier ?? "balanced";
|
|
36
|
-
|
|
37
|
-
if (tierOrder[writerTier] < tierOrder[implementerTier]) {
|
|
38
|
-
if (config.tdd.enforceWriterTierParity) {
|
|
39
|
-
effectiveWriterTier = implementerTier; // auto-elevate
|
|
40
|
-
logger.warn("tdd", `Auto-elevated testWriter tier ${writerTier} → ${implementerTier}`);
|
|
41
|
-
} else {
|
|
42
|
-
logger.warn("tdd", `testWriter tier (${writerTier}) < implementer tier (${implementerTier}) — tests may be shallow`);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## 4. Config Changes
|
|
50
|
-
|
|
51
|
-
```jsonc
|
|
52
|
-
{
|
|
53
|
-
"tdd": {
|
|
54
|
-
"sessionTiers": { "testWriter": "balanced", "verifier": "fast" },
|
|
55
|
-
"enforceWriterTierParity": false // NEW — auto-elevates testWriter when true
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
`nax config --explain`: *"testWriter tier should be ≥ implementer tier. Enable enforceWriterTierParity to auto-elevate."*
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## 5. Files Affected
|
|
65
|
-
|
|
66
|
-
| File | Change |
|
|
67
|
-
|---|---|
|
|
68
|
-
| `src/tdd/session-runner.ts` | Tier comparison + warn/elevate logic |
|
|
69
|
-
| `src/config/schemas.ts` | Add `tdd.enforceWriterTierParity` (boolean, default false) |
|
|
70
|
-
| `src/config/types.ts` | Add `enforceWriterTierParity` to `TddConfig` |
|
|
71
|
-
| `src/config/defaults.ts` | Default: `false` |
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## 6. Test Plan
|
|
76
|
-
|
|
77
|
-
- `writerTier < implementerTier`, `enforceWriterTierParity: false` → warning logged, tier unchanged
|
|
78
|
-
- `writerTier < implementerTier`, `enforceWriterTierParity: true` → tier elevated, warning logged
|
|
79
|
-
- `writerTier >= implementerTier` → no warning, no change
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
# FEAT-013 — Test-After Strategy Review & Deprecation Path
|
|
2
|
-
|
|
3
|
-
**Status:** Proposal
|
|
4
|
-
**Target:** v0.21.0
|
|
5
|
-
**Author:** Nax Dev
|
|
6
|
-
**Date:** 2026-03-06
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 1. Problem with `test-after`
|
|
11
|
-
|
|
12
|
-
`test-after` runs the agent in a single session: implement first, then write tests. Structural problem: **the agent writes tests to match its own (possibly broken) implementation.** Tests confirm buggy behavior rather than guarding against it.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## 2. Strategy Comparison
|
|
17
|
-
|
|
18
|
-
| Strategy | Order | Sessions | Quality | Risk |
|
|
19
|
-
|---|---|---|---|---|
|
|
20
|
-
| `tdd-lite` | Tests → Impl | 2 | ✅ High | Low |
|
|
21
|
-
| `three-session-tdd` | Tests → Impl → Verify | 3 | ✅✅ Highest | Very low |
|
|
22
|
-
| `test-after` | Impl → Tests | 1 | ⚠️ Variable | High — tests may confirm bugs |
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 3. Proposed Changes
|
|
27
|
-
|
|
28
|
-
### 3.1 Post-write isolation verify (opt-in fix)
|
|
29
|
-
|
|
30
|
-
After agent's session completes, run new test files against a clean stash of the implementation — tests should **fail** without the implementation (proving they actually test something):
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
1. Agent writes impl + tests
|
|
34
|
-
2. git stash (hide impl changes)
|
|
35
|
-
3. Run new test files → should FAIL (no impl)
|
|
36
|
-
4. git stash pop
|
|
37
|
-
5. If tests PASSED in step 3 → escalate ("trivially passing tests")
|
|
38
|
-
6. Normal verify (impl + tests together)
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Config: `tdd.testAfterIsolationVerify: true` (default: false)
|
|
42
|
-
|
|
43
|
-
### 3.2 Remove from auto-routing
|
|
44
|
-
|
|
45
|
-
LLM router and keyword router no longer auto-assign `test-after`. It only runs when:
|
|
46
|
-
- Explicitly set in PRD (`testStrategy: "test-after"`)
|
|
47
|
-
- OR `execution.allowTestAfter: true` and router returns it
|
|
48
|
-
|
|
49
|
-
### 3.3 Warning in `nax config --explain`
|
|
50
|
-
|
|
51
|
-
### 3.4 Config gate
|
|
52
|
-
|
|
53
|
-
```jsonc
|
|
54
|
-
{
|
|
55
|
-
"execution": { "allowTestAfter": true }, // NEW — false blocks test-after
|
|
56
|
-
"tdd": { "testAfterIsolationVerify": false } // NEW — opt-in isolation check
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## 4. Migration Path
|
|
63
|
-
|
|
64
|
-
| Version | Change |
|
|
65
|
-
|---|---|
|
|
66
|
-
| v0.21.0 | Warning in --explain. Remove from auto-routing. Add `allowTestAfter` config. |
|
|
67
|
-
| v0.22.0 | `allowTestAfter` default → `false`. Explicit opt-in required. |
|
|
68
|
-
| v0.23.0+ | Evaluate full removal. |
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## 5. Files Affected
|
|
73
|
-
|
|
74
|
-
| File | Change |
|
|
75
|
-
|---|---|
|
|
76
|
-
| `src/routing/strategies/llm.ts` | Remove `test-after` from auto-assignable set |
|
|
77
|
-
| `src/routing/strategies/keyword.ts` | Remove `test-after` from auto-assignable set |
|
|
78
|
-
| `src/tdd/session-runner.ts` | Add isolation verify step for `test-after` |
|
|
79
|
-
| `src/config/schemas.ts` | Add `execution.allowTestAfter`, `tdd.testAfterIsolationVerify` |
|
|
80
|
-
| `src/cli/config.ts` | Add warning in `--explain` for `test-after` |
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## 6. Test Plan
|
|
85
|
-
|
|
86
|
-
- `allowTestAfter: false` + router selects `test-after` → fallback to `tdd-lite` + warning
|
|
87
|
-
- `testAfterIsolationVerify: true` + tests pass on clean stash → escalate
|
|
88
|
-
- `testAfterIsolationVerify: true` + tests fail on clean stash → normal (tests are genuine)
|
|
89
|
-
- LLM router no longer returns `test-after` in auto-routing
|