@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
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Console Reporter Plugin Tests
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { describe, test, expect, beforeEach, afterEach } from "bun:test";
|
|
6
|
-
import type {
|
|
7
|
-
RunStartEvent,
|
|
8
|
-
StoryCompleteEvent,
|
|
9
|
-
RunEndEvent,
|
|
10
|
-
} from "../../../src/plugins/types";
|
|
11
|
-
import { validatePlugin } from "../../../src/plugins/validator";
|
|
12
|
-
import consoleReporterPlugin from "./index";
|
|
13
|
-
|
|
14
|
-
describe("Console Reporter Plugin", () => {
|
|
15
|
-
let consoleOutput: string[] = [];
|
|
16
|
-
const originalLog = console.log;
|
|
17
|
-
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
consoleOutput = [];
|
|
20
|
-
console.log = (...args: unknown[]) => {
|
|
21
|
-
consoleOutput.push(args.map(String).join(" "));
|
|
22
|
-
};
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
afterEach(() => {
|
|
26
|
-
console.log = originalLog;
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("plugin structure passes validation", () => {
|
|
30
|
-
const validated = validatePlugin(consoleReporterPlugin);
|
|
31
|
-
expect(validated).not.toBeNull();
|
|
32
|
-
expect(validated?.name).toBe("console-reporter");
|
|
33
|
-
expect(validated?.version).toBe("1.0.0");
|
|
34
|
-
expect(validated?.provides).toEqual(["reporter"]);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test("plugin has required fields", () => {
|
|
38
|
-
expect(consoleReporterPlugin.name).toBe("console-reporter");
|
|
39
|
-
expect(consoleReporterPlugin.version).toBe("1.0.0");
|
|
40
|
-
expect(consoleReporterPlugin.provides).toContain("reporter");
|
|
41
|
-
expect(consoleReporterPlugin.setup).toBeDefined();
|
|
42
|
-
expect(consoleReporterPlugin.teardown).toBeDefined();
|
|
43
|
-
expect(consoleReporterPlugin.extensions.reporter).toBeDefined();
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test("setup() reads config.verbose", async () => {
|
|
47
|
-
await consoleReporterPlugin.setup?.({ verbose: true });
|
|
48
|
-
expect(consoleOutput.some(line => line.includes("verbose mode enabled"))).toBe(true);
|
|
49
|
-
|
|
50
|
-
consoleOutput = [];
|
|
51
|
-
await consoleReporterPlugin.setup?.({ verbose: false });
|
|
52
|
-
expect(consoleOutput.some(line => line.includes("verbose mode enabled"))).toBe(false);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test("setup() defaults verbose to false", async () => {
|
|
56
|
-
await consoleReporterPlugin.setup?.({});
|
|
57
|
-
expect(consoleOutput.some(line => line.includes("verbose mode enabled"))).toBe(false);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test("onRunStart prints banner with run details", async () => {
|
|
61
|
-
const event: RunStartEvent = {
|
|
62
|
-
runId: "run-123",
|
|
63
|
-
feature: "test-feature",
|
|
64
|
-
totalStories: 5,
|
|
65
|
-
startTime: "2026-02-27T10:00:00Z",
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const reporter = consoleReporterPlugin.extensions.reporter;
|
|
69
|
-
await reporter?.onRunStart?.(event);
|
|
70
|
-
|
|
71
|
-
const output = consoleOutput.join("\n");
|
|
72
|
-
expect(output).toContain("Starting Run: test-feature");
|
|
73
|
-
expect(output).toContain("Run ID: run-123");
|
|
74
|
-
expect(output).toContain("Total Stories: 5");
|
|
75
|
-
expect(output).toContain("Start Time: 2026-02-27T10:00:00Z");
|
|
76
|
-
expect(output).toContain("=".repeat(60));
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test("onStoryComplete prints status line with ✓ for completed", async () => {
|
|
80
|
-
const event: StoryCompleteEvent = {
|
|
81
|
-
runId: "run-123",
|
|
82
|
-
storyId: "US-001",
|
|
83
|
-
status: "completed",
|
|
84
|
-
durationMs: 1500,
|
|
85
|
-
cost: 0.0123,
|
|
86
|
-
tier: "balanced",
|
|
87
|
-
testStrategy: "three-session-tdd",
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
const reporter = consoleReporterPlugin.extensions.reporter;
|
|
91
|
-
await reporter?.onStoryComplete?.(event);
|
|
92
|
-
|
|
93
|
-
const output = consoleOutput.join("\n");
|
|
94
|
-
expect(output).toContain("✓");
|
|
95
|
-
expect(output).toContain("US-001");
|
|
96
|
-
expect(output).toContain("Tier: balanced");
|
|
97
|
-
expect(output).toContain("Strategy: three-session-tdd");
|
|
98
|
-
expect(output).toContain("Duration: 1500ms");
|
|
99
|
-
expect(output).toContain("Cost: $0.0123");
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test("onStoryComplete prints status line with ✗ for failed", async () => {
|
|
103
|
-
const event: StoryCompleteEvent = {
|
|
104
|
-
runId: "run-123",
|
|
105
|
-
storyId: "US-002",
|
|
106
|
-
status: "failed",
|
|
107
|
-
durationMs: 2500,
|
|
108
|
-
cost: 0.0456,
|
|
109
|
-
tier: "powerful",
|
|
110
|
-
testStrategy: "three-session-tdd-lite",
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
const reporter = consoleReporterPlugin.extensions.reporter;
|
|
114
|
-
await reporter?.onStoryComplete?.(event);
|
|
115
|
-
|
|
116
|
-
const output = consoleOutput.join("\n");
|
|
117
|
-
expect(output).toContain("✗");
|
|
118
|
-
expect(output).toContain("US-002");
|
|
119
|
-
expect(output).toContain("Tier: powerful");
|
|
120
|
-
expect(output).toContain("Strategy: three-session-tdd-lite");
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test("onRunEnd prints summary table", async () => {
|
|
124
|
-
const event: RunEndEvent = {
|
|
125
|
-
runId: "run-123",
|
|
126
|
-
totalDurationMs: 5000,
|
|
127
|
-
totalCost: 0.0789,
|
|
128
|
-
storySummary: {
|
|
129
|
-
completed: 3,
|
|
130
|
-
failed: 1,
|
|
131
|
-
skipped: 0,
|
|
132
|
-
paused: 1,
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
const reporter = consoleReporterPlugin.extensions.reporter;
|
|
137
|
-
await reporter?.onRunEnd?.(event);
|
|
138
|
-
|
|
139
|
-
const output = consoleOutput.join("\n");
|
|
140
|
-
expect(output).toContain("Run Summary");
|
|
141
|
-
expect(output).toContain("Run ID: run-123");
|
|
142
|
-
expect(output).toContain("Completed: 3/5");
|
|
143
|
-
expect(output).toContain("Failed: 1/5");
|
|
144
|
-
expect(output).toContain("Skipped: 0/5");
|
|
145
|
-
expect(output).toContain("Paused: 1/5");
|
|
146
|
-
expect(output).toContain("Total Duration: 5.00s");
|
|
147
|
-
expect(output).toContain("Total Cost: $0.0789");
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test("verbose mode adds extra output in onStoryComplete", async () => {
|
|
151
|
-
await consoleReporterPlugin.setup?.({ verbose: true });
|
|
152
|
-
consoleOutput = [];
|
|
153
|
-
|
|
154
|
-
const event: StoryCompleteEvent = {
|
|
155
|
-
runId: "run-123",
|
|
156
|
-
storyId: "US-001",
|
|
157
|
-
status: "completed",
|
|
158
|
-
durationMs: 1500,
|
|
159
|
-
cost: 0.0123,
|
|
160
|
-
tier: "balanced",
|
|
161
|
-
testStrategy: "three-session-tdd",
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
const reporter = consoleReporterPlugin.extensions.reporter;
|
|
165
|
-
await reporter?.onStoryComplete?.(event);
|
|
166
|
-
|
|
167
|
-
const output = consoleOutput.join("\n");
|
|
168
|
-
expect(output).toContain("[verbose]");
|
|
169
|
-
expect(output).toContain("Run ID: run-123");
|
|
170
|
-
expect(output).toContain("Status: completed");
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
test("verbose mode adds extra output in onRunEnd", async () => {
|
|
174
|
-
await consoleReporterPlugin.setup?.({ verbose: true });
|
|
175
|
-
consoleOutput = [];
|
|
176
|
-
|
|
177
|
-
const event: RunEndEvent = {
|
|
178
|
-
runId: "run-123",
|
|
179
|
-
totalDurationMs: 5000,
|
|
180
|
-
totalCost: 0.0789,
|
|
181
|
-
storySummary: {
|
|
182
|
-
completed: 3,
|
|
183
|
-
failed: 1,
|
|
184
|
-
skipped: 0,
|
|
185
|
-
paused: 1,
|
|
186
|
-
},
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
const reporter = consoleReporterPlugin.extensions.reporter;
|
|
190
|
-
await reporter?.onRunEnd?.(event);
|
|
191
|
-
|
|
192
|
-
const output = consoleOutput.join("\n");
|
|
193
|
-
expect(output).toContain("Run completed in verbose mode");
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
test("reporter has required methods", () => {
|
|
197
|
-
const reporter = consoleReporterPlugin.extensions.reporter;
|
|
198
|
-
expect(reporter?.name).toBe("console-reporter");
|
|
199
|
-
expect(typeof reporter?.onRunStart).toBe("function");
|
|
200
|
-
expect(typeof reporter?.onStoryComplete).toBe("function");
|
|
201
|
-
expect(typeof reporter?.onRunEnd).toBe("function");
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
test("teardown completes without errors", async () => {
|
|
205
|
-
await expect(consoleReporterPlugin.teardown?.()).resolves.toBeUndefined();
|
|
206
|
-
});
|
|
207
|
-
});
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Console Reporter Plugin
|
|
3
|
-
*
|
|
4
|
-
* Sample reporter plugin that demonstrates the plugin API.
|
|
5
|
-
* Prints formatted output to the console for run lifecycle events.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type {
|
|
9
|
-
NaxPlugin,
|
|
10
|
-
IReporter,
|
|
11
|
-
RunStartEvent,
|
|
12
|
-
StoryCompleteEvent,
|
|
13
|
-
RunEndEvent,
|
|
14
|
-
} from "../../../src/plugins/types";
|
|
15
|
-
|
|
16
|
-
interface ConsoleReporterConfig {
|
|
17
|
-
verbose?: boolean;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
let verboseMode = false;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Console reporter implementation.
|
|
24
|
-
*/
|
|
25
|
-
const reporter: IReporter = {
|
|
26
|
-
name: "console-reporter",
|
|
27
|
-
|
|
28
|
-
async onRunStart(event: RunStartEvent): Promise<void> {
|
|
29
|
-
console.log("\n" + "=".repeat(60));
|
|
30
|
-
console.log(`🚀 Starting Run: ${event.feature}`);
|
|
31
|
-
console.log(` Run ID: ${event.runId}`);
|
|
32
|
-
console.log(` Total Stories: ${event.totalStories}`);
|
|
33
|
-
console.log(` Start Time: ${event.startTime}`);
|
|
34
|
-
console.log("=".repeat(60) + "\n");
|
|
35
|
-
|
|
36
|
-
if (verboseMode) {
|
|
37
|
-
console.log("[console-reporter] Verbose mode enabled");
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
|
|
41
|
-
async onStoryComplete(event: StoryCompleteEvent): Promise<void> {
|
|
42
|
-
const statusIcon = event.status === "completed" ? "✓" : "✗";
|
|
43
|
-
const statusColor = event.status === "completed" ? "\x1b[32m" : "\x1b[31m";
|
|
44
|
-
const resetColor = "\x1b[0m";
|
|
45
|
-
|
|
46
|
-
console.log(
|
|
47
|
-
`${statusColor}${statusIcon}${resetColor} ${event.storyId} | ` +
|
|
48
|
-
`Tier: ${event.tier} | ` +
|
|
49
|
-
`Strategy: ${event.testStrategy} | ` +
|
|
50
|
-
`Duration: ${event.durationMs}ms | ` +
|
|
51
|
-
`Cost: $${event.cost.toFixed(4)}`
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
if (verboseMode) {
|
|
55
|
-
console.log(` [verbose] Run ID: ${event.runId}, Status: ${event.status}`);
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
async onRunEnd(event: RunEndEvent): Promise<void> {
|
|
60
|
-
console.log("\n" + "=".repeat(60));
|
|
61
|
-
console.log("📊 Run Summary");
|
|
62
|
-
console.log("=".repeat(60));
|
|
63
|
-
|
|
64
|
-
const { storySummary } = event;
|
|
65
|
-
const total = storySummary.completed + storySummary.failed + storySummary.skipped + storySummary.paused;
|
|
66
|
-
|
|
67
|
-
console.log(`Run ID: ${event.runId}`);
|
|
68
|
-
console.log(`\nStory Results:`);
|
|
69
|
-
console.log(` ✓ Completed: ${storySummary.completed}/${total}`);
|
|
70
|
-
console.log(` ✗ Failed: ${storySummary.failed}/${total}`);
|
|
71
|
-
console.log(` ⊘ Skipped: ${storySummary.skipped}/${total}`);
|
|
72
|
-
console.log(` ⏸ Paused: ${storySummary.paused}/${total}`);
|
|
73
|
-
console.log(`\nMetrics:`);
|
|
74
|
-
console.log(` Total Duration: ${(event.totalDurationMs / 1000).toFixed(2)}s`);
|
|
75
|
-
console.log(` Total Cost: $${event.totalCost.toFixed(4)}`);
|
|
76
|
-
console.log("=".repeat(60) + "\n");
|
|
77
|
-
|
|
78
|
-
if (verboseMode) {
|
|
79
|
-
console.log("[console-reporter] Run completed in verbose mode");
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Console reporter plugin export.
|
|
86
|
-
*/
|
|
87
|
-
const consoleReporterPlugin: NaxPlugin = {
|
|
88
|
-
name: "console-reporter",
|
|
89
|
-
version: "1.0.0",
|
|
90
|
-
provides: ["reporter"],
|
|
91
|
-
|
|
92
|
-
async setup(config: Record<string, unknown>): Promise<void> {
|
|
93
|
-
const reporterConfig = config as ConsoleReporterConfig;
|
|
94
|
-
verboseMode = reporterConfig.verbose ?? false;
|
|
95
|
-
|
|
96
|
-
if (verboseMode) {
|
|
97
|
-
console.log("[console-reporter] Plugin initialized with verbose mode enabled");
|
|
98
|
-
}
|
|
99
|
-
},
|
|
100
|
-
|
|
101
|
-
async teardown(): Promise<void> {
|
|
102
|
-
// No cleanup needed for console output
|
|
103
|
-
},
|
|
104
|
-
|
|
105
|
-
extensions: {
|
|
106
|
-
reporter,
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
export default consoleReporterPlugin;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# FEAT-010 — baseRef Tracking Design Decision
|
|
2
|
-
|
|
3
|
-
## Decision
|
|
4
|
-
Capture `baseRef = current HEAD` **in-memory at each attempt start** (not stored in PRD).
|
|
5
|
-
Use `git diff <baseRef>..HEAD` in smart-runner instead of `HEAD~1`.
|
|
6
|
-
|
|
7
|
-
## Why per-attempt, not per-story
|
|
8
|
-
- Story may retry after other stories have committed
|
|
9
|
-
- Storing in PRD: retry would use stale baseRef from first attempt → includes other stories' files ❌
|
|
10
|
-
- Capturing fresh per attempt: retry anchors to HEAD at that moment → only sees its own commits ✅
|
|
11
|
-
|
|
12
|
-
## Why no cross-story pollution
|
|
13
|
-
- Story 1 retry baseRef = HEAD after stories 2+3 committed
|
|
14
|
-
- diff <baseRef>..HEAD = only story 1 retry's own commits
|
|
15
|
-
- Other stories' commits are BEFORE baseRef → excluded automatically
|
|
16
|
-
|
|
17
|
-
## Flow
|
|
18
|
-
```
|
|
19
|
-
attempt start → captureGitRef() → baseRef (in-memory)
|
|
20
|
-
agent runs → makes N commits
|
|
21
|
-
verify → getChangedSourceFiles(workdir, baseRef)
|
|
22
|
-
→ git diff <baseRef>..HEAD
|
|
23
|
-
→ only this attempt's changed files ✅
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Edge Cases
|
|
27
|
-
- Agent makes 0 commits → diff = empty → fallback to full suite (existing behavior)
|
|
28
|
-
- Partial commits on failure → next attempt captures new baseRef → clean isolation
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# FEAT-013 — Deprecate test-after from auto routing
|
|
2
|
-
|
|
3
|
-
## Decision
|
|
4
|
-
Remove `test-after` as the default fallback in `auto` mode.
|
|
5
|
-
Change simple/medium stories to route to `three-session-tdd-lite` instead.
|
|
6
|
-
|
|
7
|
-
## Why
|
|
8
|
-
- `test-after` has high test failure rate — tests rubber-stamp implementation rather than driving design
|
|
9
|
-
- Failed test-after stories escalate to powerful tier anyway → costs more in the end
|
|
10
|
-
- `three-session-tdd-lite` = better quality at moderate cost increase
|
|
11
|
-
|
|
12
|
-
## New auto routing decision tree
|
|
13
|
-
```
|
|
14
|
-
security/public-api keywords → three-session-tdd
|
|
15
|
-
complex/expert complexity → three-session-tdd (or lite if ui/cli tags)
|
|
16
|
-
simple/medium (default) → three-session-tdd-lite ← was test-after
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Backward compatibility
|
|
20
|
-
- `tddStrategy: "off"` in config still routes to `test-after` (explicit opt-in)
|
|
21
|
-
- `tddStrategy: "strict"` → three-session-tdd (unchanged)
|
|
22
|
-
- `tddStrategy: "lite"` → three-session-tdd-lite (unchanged)
|
package/nax/config.json
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 1,
|
|
3
|
-
"models": {
|
|
4
|
-
"fast": {
|
|
5
|
-
"provider": "anthropic",
|
|
6
|
-
"model": "haiku"
|
|
7
|
-
},
|
|
8
|
-
"balanced": {
|
|
9
|
-
"provider": "anthropic",
|
|
10
|
-
"model": "sonnet"
|
|
11
|
-
},
|
|
12
|
-
"powerful": {
|
|
13
|
-
"provider": "anthropic",
|
|
14
|
-
"model": "sonnet"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"autoMode": {
|
|
18
|
-
"enabled": true,
|
|
19
|
-
"defaultAgent": "claude",
|
|
20
|
-
"fallbackOrder": [
|
|
21
|
-
"claude"
|
|
22
|
-
],
|
|
23
|
-
"complexityRouting": {
|
|
24
|
-
"simple": "fast",
|
|
25
|
-
"medium": "balanced",
|
|
26
|
-
"complex": "balanced",
|
|
27
|
-
"expert": "powerful"
|
|
28
|
-
},
|
|
29
|
-
"escalation": {
|
|
30
|
-
"enabled": true,
|
|
31
|
-
"tierOrder": [
|
|
32
|
-
{
|
|
33
|
-
"tier": "fast",
|
|
34
|
-
"attempts": 3
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"tier": "balanced",
|
|
38
|
-
"attempts": 2
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"tier": "powerful",
|
|
42
|
-
"attempts": 1
|
|
43
|
-
}
|
|
44
|
-
],
|
|
45
|
-
"escalateEntireBatch": false
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
"routing": {
|
|
49
|
-
"strategy": "llm",
|
|
50
|
-
"llm": {
|
|
51
|
-
"model": "fast",
|
|
52
|
-
"fallbackToKeywords": true,
|
|
53
|
-
"cacheDecisions": true,
|
|
54
|
-
"mode": "hybrid",
|
|
55
|
-
"timeoutMs": 60000
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
"execution": {
|
|
59
|
-
"maxIterations": 6,
|
|
60
|
-
"iterationDelayMs": 2000,
|
|
61
|
-
"costLimit": 8.0,
|
|
62
|
-
"sessionTimeoutSeconds": 7200,
|
|
63
|
-
"verificationTimeoutSeconds": 600,
|
|
64
|
-
"maxStoriesPerFeature": 15,
|
|
65
|
-
"rectification": {
|
|
66
|
-
"enabled": true,
|
|
67
|
-
"maxRetries": 2,
|
|
68
|
-
"fullSuiteTimeoutSeconds": 600,
|
|
69
|
-
"maxFailureSummaryChars": 2000,
|
|
70
|
-
"abortOnIncreasingFailures": true
|
|
71
|
-
},
|
|
72
|
-
"regressionGate": {
|
|
73
|
-
"enabled": true,
|
|
74
|
-
"mode": "deferred",
|
|
75
|
-
"timeoutSeconds": 600,
|
|
76
|
-
"acceptOnTimeout": true,
|
|
77
|
-
"maxRectificationAttempts": 2
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
"quality": {
|
|
81
|
-
"requireTypecheck": true,
|
|
82
|
-
"requireLint": true,
|
|
83
|
-
"requireTests": true,
|
|
84
|
-
"commands": {
|
|
85
|
-
"test": "bun run test",
|
|
86
|
-
"typecheck": "bun run typecheck",
|
|
87
|
-
"lint": "bun run lint",
|
|
88
|
-
"testScoped": "bun test --timeout=60000 {{files}}"
|
|
89
|
-
},
|
|
90
|
-
"forceExit": false,
|
|
91
|
-
"detectOpenHandles": true,
|
|
92
|
-
"detectOpenHandlesRetries": 1,
|
|
93
|
-
"gracePeriodMs": 5000,
|
|
94
|
-
"drainTimeoutMs": 2000,
|
|
95
|
-
"shell": "/bin/sh",
|
|
96
|
-
"stripEnvVars": [
|
|
97
|
-
"CLAUDECODE",
|
|
98
|
-
"REPL_ID",
|
|
99
|
-
"AGENT"
|
|
100
|
-
],
|
|
101
|
-
"environmentalEscalationDivisor": 2
|
|
102
|
-
},
|
|
103
|
-
"tdd": {
|
|
104
|
-
"maxRetries": 2,
|
|
105
|
-
"autoVerifyIsolation": true,
|
|
106
|
-
"autoApproveVerifier": true,
|
|
107
|
-
"strategy": "lite",
|
|
108
|
-
"sessionTiers": {
|
|
109
|
-
"testWriter": "balanced",
|
|
110
|
-
"verifier": "fast"
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
"constitution": {
|
|
114
|
-
"enabled": true,
|
|
115
|
-
"path": "constitution.md",
|
|
116
|
-
"maxTokens": 2000
|
|
117
|
-
},
|
|
118
|
-
"analyze": {
|
|
119
|
-
"llmEnhanced": false,
|
|
120
|
-
"model": "balanced",
|
|
121
|
-
"fallbackToKeywords": true,
|
|
122
|
-
"maxCodebaseSummaryTokens": 5000
|
|
123
|
-
},
|
|
124
|
-
"review": {
|
|
125
|
-
"enabled": true,
|
|
126
|
-
"checks": [
|
|
127
|
-
"typecheck",
|
|
128
|
-
"lint"
|
|
129
|
-
],
|
|
130
|
-
"commands": {
|
|
131
|
-
"typecheck": "bun run typecheck",
|
|
132
|
-
"lint": "bun run lint"
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
"plan": {
|
|
136
|
-
"model": "balanced",
|
|
137
|
-
"outputPath": "spec.md"
|
|
138
|
-
},
|
|
139
|
-
"acceptance": {
|
|
140
|
-
"enabled": false,
|
|
141
|
-
"maxRetries": 2,
|
|
142
|
-
"generateTests": false,
|
|
143
|
-
"testPath": "acceptance.test.ts"
|
|
144
|
-
},
|
|
145
|
-
"context": {
|
|
146
|
-
"testCoverage": {
|
|
147
|
-
"enabled": true,
|
|
148
|
-
"detail": "names-and-counts",
|
|
149
|
-
"maxTokens": 500,
|
|
150
|
-
"testPattern": "**/*.test.{ts,js}",
|
|
151
|
-
"scopeToStory": true
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "nax",
|
|
3
|
-
"feature": "bug-039-medium",
|
|
4
|
-
"branchName": "fix/bug-039-process-cleanup-medium",
|
|
5
|
-
"createdAt": "2026-03-06T04:51:00.000Z",
|
|
6
|
-
"updatedAt": "2026-03-06T04:51:00.000Z",
|
|
7
|
-
"userStories": [
|
|
8
|
-
{
|
|
9
|
-
"id": "US-001",
|
|
10
|
-
"title": "runOnce() SIGKILL follow-up after grace period",
|
|
11
|
-
"description": "In src/agents/claude.ts:runOnce(), the timeout handler only sends SIGTERM but never follows up with SIGKILL. Claude may ignore SIGTERM and run indefinitely. Add a SIGKILL after a 5-second grace period, mirroring the pattern in src/verification/executor.ts:executeWithTimeout(). Also move pidRegistry.unregister(processPid) into a finally block so it is always called even if the timeout path throws an exception.",
|
|
12
|
-
"acceptanceCriteria": [
|
|
13
|
-
"When runOnce() times out, SIGTERM is sent first",
|
|
14
|
-
"After 5 seconds grace period, SIGKILL is sent to ensure the process is dead",
|
|
15
|
-
"pidRegistry.unregister(processPid) is called in a finally block — always runs regardless of success or exception path",
|
|
16
|
-
"Existing runOnce() tests still pass",
|
|
17
|
-
"New test: timeout path always unregisters PID even if SIGTERM/SIGKILL throws"
|
|
18
|
-
],
|
|
19
|
-
"tags": ["bug", "process", "cleanup"],
|
|
20
|
-
"dependencies": [],
|
|
21
|
-
"status": "pending",
|
|
22
|
-
"passes": false,
|
|
23
|
-
"escalations": [],
|
|
24
|
-
"attempts": 0
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"id": "US-002",
|
|
28
|
-
"title": "LLM routing stream drain fix on timeout",
|
|
29
|
-
"description": "In src/routing/strategies/llm.ts:callLlmOnce(), when the timeout fires, proc.kill() is called but the stdout/stderr ReadableStreams from the Bun.spawn() are never cancelled or drained. This can cause proc.exited to hang indefinitely because Bun's piped streams may block exit. Fix: before calling proc.kill(), cancel both streams with proc.stdout.cancel() and proc.stderr.cancel() wrapped in try/catch. This ensures proc.exited resolves promptly after kill.",
|
|
30
|
-
"acceptanceCriteria": [
|
|
31
|
-
"On LLM timeout, proc.stdout and proc.stderr are cancelled before proc.kill()",
|
|
32
|
-
"proc.exited resolves promptly after timeout kill (does not hang)",
|
|
33
|
-
"clearTimeout(timeoutId) still called in both success and error paths",
|
|
34
|
-
"Existing LLM routing tests still pass",
|
|
35
|
-
"New test: timeout path resolves without hanging (use fake timers or short timeout)"
|
|
36
|
-
],
|
|
37
|
-
"tags": ["bug", "process", "cleanup", "llm"],
|
|
38
|
-
"dependencies": [],
|
|
39
|
-
"status": "pending",
|
|
40
|
-
"passes": false,
|
|
41
|
-
"escalations": [],
|
|
42
|
-
"attempts": 0
|
|
43
|
-
}
|
|
44
|
-
]
|
|
45
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "nax",
|
|
3
|
-
"branchName": "feat/v0.17.x-bugfixes",
|
|
4
|
-
"feature": "bugfix-v0171",
|
|
5
|
-
"userStories": [
|
|
6
|
-
{
|
|
7
|
-
"id": "BF-001",
|
|
8
|
-
"title": "Emit run.complete on SIGTERM shutdown (BUG-017)",
|
|
9
|
-
"description": "When nax receives SIGTERM, the crash-recovery handler shuts down cleanly but never emits the final run.complete JSONL event. This means the run log has no aggregate cost/duration summary when nax is killed externally.\n\nFind where SIGTERM is caught in src/execution/ and ensure a run.complete event is emitted before exit with: totalCost (sum of agent.complete costs), totalIterations, exitReason='sigterm', duration.\n\nAcceptance criteria:\n1. When nax is killed with SIGTERM mid-run, JSONL ends with run.complete event containing totalCost, totalIterations, exitReason='sigterm', duration\n2. Existing tests pass\n3. Add a unit test simulating SIGTERM that verifies run.complete is written",
|
|
10
|
-
"complexity": "simple",
|
|
11
|
-
"status": "pending",
|
|
12
|
-
"attempts": 0,
|
|
13
|
-
"priorErrors": [
|
|
14
|
-
"Attempt 1 failed with model tier: fast"
|
|
15
|
-
],
|
|
16
|
-
"escalations": [],
|
|
17
|
-
"dependencies": [],
|
|
18
|
-
"tags": [],
|
|
19
|
-
"acceptanceCriteria": [],
|
|
20
|
-
"storyPoints": 1,
|
|
21
|
-
"routing": {
|
|
22
|
-
"complexity": "simple",
|
|
23
|
-
"modelTier": "balanced",
|
|
24
|
-
"testStrategy": "three-session-tdd-lite",
|
|
25
|
-
"reasoning": "three-session-tdd-lite: public-api, strategy:lite"
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"id": "BF-002",
|
|
30
|
-
"title": "Add storyId to all JSONL events (BUG-020)",
|
|
31
|
-
"description": "Many JSONL events have empty or missing storyId. Audit and fix these event emitters to include storyId when a story is active:\n- src/pipeline/stages/verify.ts (verify info/debug events)\n- src/pipeline/stages/execution.ts (execution events)\n- src/tdd/orchestrator.ts (tdd session events)\n- src/execution/pipeline-result-handler.ts (escalation events)\n\nAcceptance criteria:\n1. Events at stages agent.start, agent.complete, verify, tdd, execution, escalation include storyId in data when a story is active\n2. Existing tests pass\n3. Add tests verifying storyId presence on key events",
|
|
32
|
-
"complexity": "simple",
|
|
33
|
-
"status": "pending",
|
|
34
|
-
"attempts": 0,
|
|
35
|
-
"priorErrors": [
|
|
36
|
-
"Attempt 1 failed with model tier: fast"
|
|
37
|
-
],
|
|
38
|
-
"escalations": [],
|
|
39
|
-
"dependencies": [],
|
|
40
|
-
"tags": [],
|
|
41
|
-
"acceptanceCriteria": [],
|
|
42
|
-
"storyPoints": 1,
|
|
43
|
-
"routing": {
|
|
44
|
-
"complexity": "simple",
|
|
45
|
-
"modelTier": "balanced",
|
|
46
|
-
"testStrategy": "three-session-tdd-lite",
|
|
47
|
-
"reasoning": "three-session-tdd-lite: strategy:lite"
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
],
|
|
51
|
-
"updatedAt": "2026-03-02T08:59:51.238Z"
|
|
52
|
-
}
|