@nathapp/nax 0.28.0 → 0.30.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 +23 -2
- package/bin/nax.ts +2 -3
- package/dist/nax.js +72753 -0
- package/package.json +11 -3
- package/src/cli/analyze.ts +2 -7
- 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/execution/lifecycle/headless-formatter.ts +2 -4
- package/src/prompts/builder.ts +12 -69
- package/src/prompts/sections/isolation.ts +38 -8
- package/src/prompts/sections/role-task.ts +79 -17
- 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/src/prompts/templates/implementer.ts +0 -6
- package/src/prompts/templates/single-session.ts +0 -6
- package/src/prompts/templates/test-writer.ts +0 -6
- package/src/prompts/templates/verifier.ts +0 -6
- 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,104 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "nax-routing-persistence",
|
|
3
|
-
"branchName": "feat/routing-persistence",
|
|
4
|
-
"feature": "routing-persistence",
|
|
5
|
-
"userStories": [
|
|
6
|
-
{
|
|
7
|
-
"id": "RRP-001",
|
|
8
|
-
"title": "Persist initial routing to prd.json on first classification",
|
|
9
|
-
"description": "Currently, when nax run classifies a story for the first time (no prior nax analyze, story.routing is undefined), the result lives only in ctx.routing (in-memory). If the run crashes and resumes, the routing stage re-classifies fresh — LLM may return different complexity/testStrategy, causing silent inconsistency mid-feature. Fix: after fresh classification in routing.ts, write the result back to prd.json via savePRD so story.routing is populated from the very first iteration.",
|
|
10
|
-
"acceptanceCriteria": [
|
|
11
|
-
"When story.routing is undefined before routing stage, after classification story.routing is written to prd.json",
|
|
12
|
-
"Subsequent iterations (or resume after crash) use the persisted story.routing — no re-classification",
|
|
13
|
-
"Escalation still overwrites modelTier and testStrategy as before — only initialComplexity is protected",
|
|
14
|
-
"savePRD is called once per story on first classification (not on every iteration if already persisted)",
|
|
15
|
-
"Unit tests verify prd.json is updated after first routing stage execution"
|
|
16
|
-
],
|
|
17
|
-
"complexity": "medium",
|
|
18
|
-
"status": "passed",
|
|
19
|
-
"tags": [],
|
|
20
|
-
"dependencies": [],
|
|
21
|
-
"escalations": [],
|
|
22
|
-
"attempts": 0,
|
|
23
|
-
"priorErrors": [],
|
|
24
|
-
"priorFailures": [],
|
|
25
|
-
"storyPoints": 1,
|
|
26
|
-
"passes": true
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"id": "RRP-002",
|
|
30
|
-
"title": "Add initialComplexity to StoryRouting and StoryMetrics for accurate reporting",
|
|
31
|
-
"description": "StoryMetrics.complexity currently captures ctx.routing.complexity at completion time — which may reflect a post-escalation re-classification, not the original prediction. Add story.routing.initialComplexity (written once at first classify, never overwritten) and StoryMetrics.initialComplexity. Update metrics/aggregator.ts complexityAccuracy to compare initialComplexity vs finalTier instead of current complexity vs finalTier.",
|
|
32
|
-
"acceptanceCriteria": [
|
|
33
|
-
"StoryRouting interface gains initialComplexity?: Complexity field",
|
|
34
|
-
"Routing stage writes initialComplexity when story.routing is first created (RRP-001 path)",
|
|
35
|
-
"Escalation path never overwrites initialComplexity — only modelTier and testStrategy change",
|
|
36
|
-
"StoryMetrics gains initialComplexity?: string field",
|
|
37
|
-
"collectStoryMetrics() reads initialComplexity from story.routing.initialComplexity (falls back to routing.complexity for backward compat)",
|
|
38
|
-
"metrics/aggregator.ts complexityAccuracy uses initialComplexity for predicted vs finalTier comparison",
|
|
39
|
-
"Unit tests verify initialComplexity is set on first classify and unchanged after escalation"
|
|
40
|
-
],
|
|
41
|
-
"complexity": "medium",
|
|
42
|
-
"status": "pending",
|
|
43
|
-
"tags": [],
|
|
44
|
-
"dependencies": [
|
|
45
|
-
"RRP-001"
|
|
46
|
-
],
|
|
47
|
-
"escalations": [],
|
|
48
|
-
"attempts": 0,
|
|
49
|
-
"priorErrors": [],
|
|
50
|
-
"priorFailures": [],
|
|
51
|
-
"storyPoints": 1
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"id": "RRP-003",
|
|
55
|
-
"title": "Add contentHash to StoryRouting for staleness detection (BUG-048)",
|
|
56
|
-
"description": "When nax analyze is run, it writes story.routing to prd.json. If the story is subsequently edited (more ACs, changed tags, updated description), nax run blindly trusts the existing routing — wrong complexity, wrong testStrategy. Fix: add story.routing.contentHash — a hash of title+description+acceptanceCriteria.join()+tags.join() written at classify time. Routing stage recomputes hash on each run; if mismatch, treat as cache miss and re-classify.",
|
|
57
|
-
"acceptanceCriteria": [
|
|
58
|
-
"StoryRouting interface gains contentHash?: string field",
|
|
59
|
-
"A helper function computeStoryContentHash(story: UserStory): string computes a hash of title+description+ACs+tags",
|
|
60
|
-
"Routing stage: if story.routing exists but contentHash is missing or mismatches current story content, re-classify (treat as cache miss)",
|
|
61
|
-
"Routing stage: after classification, write contentHash to story.routing",
|
|
62
|
-
"If story content unchanged, routing stage uses cached routing as before — no regression",
|
|
63
|
-
"Unit tests cover: hash match uses cache; hash mismatch re-classifies; missing hash re-classifies"
|
|
64
|
-
],
|
|
65
|
-
"complexity": "medium",
|
|
66
|
-
"status": "pending",
|
|
67
|
-
"tags": [],
|
|
68
|
-
"dependencies": [
|
|
69
|
-
"RRP-001"
|
|
70
|
-
],
|
|
71
|
-
"escalations": [],
|
|
72
|
-
"attempts": 0,
|
|
73
|
-
"priorErrors": [],
|
|
74
|
-
"priorFailures": [],
|
|
75
|
-
"storyPoints": 1
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"id": "RRP-004",
|
|
79
|
-
"title": "Integration tests: routing persistence across simulated crash-resume and staleness",
|
|
80
|
-
"description": "Write integration tests that verify routing persistence end-to-end: (1) first run classifies and persists story.routing to prd.json, (2) second run uses persisted routing without re-classifying, (3) escalation preserves initialComplexity, (4) story content change triggers re-classification via contentHash mismatch.",
|
|
81
|
-
"acceptanceCriteria": [
|
|
82
|
-
"Integration test: routing stage with story.routing=undefined writes story.routing to prd.json after classification",
|
|
83
|
-
"Integration test: routing stage re-run with same prd.json uses cached routing — no LLM call made",
|
|
84
|
-
"Integration test: escalation updates modelTier in prd.json but initialComplexity remains unchanged",
|
|
85
|
-
"Integration test: edit story content after routing — hash mismatch detected — routing stage re-classifies",
|
|
86
|
-
"Integration test: story.routing with matching contentHash — no re-classification (cache hit confirmed)"
|
|
87
|
-
],
|
|
88
|
-
"complexity": "medium",
|
|
89
|
-
"status": "pending",
|
|
90
|
-
"tags": [],
|
|
91
|
-
"dependencies": [
|
|
92
|
-
"RRP-001",
|
|
93
|
-
"RRP-002",
|
|
94
|
-
"RRP-003"
|
|
95
|
-
],
|
|
96
|
-
"escalations": [],
|
|
97
|
-
"attempts": 0,
|
|
98
|
-
"priorErrors": [],
|
|
99
|
-
"priorFailures": [],
|
|
100
|
-
"storyPoints": 1
|
|
101
|
-
}
|
|
102
|
-
],
|
|
103
|
-
"updatedAt": "2026-03-07T16:32:39.496Z"
|
|
104
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[2026-03-07T16:32:39.495Z] RRP-001 — PASSED — Persist initial routing to prd.json on first classification — Cost: $0.5223
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "nax",
|
|
3
|
-
"feature": "smart-test-runner",
|
|
4
|
-
"branchName": "feat/v0.18.2-smart-runner",
|
|
5
|
-
"userStories": [
|
|
6
|
-
{
|
|
7
|
-
"id": "FIX-001",
|
|
8
|
-
"title": "Fix partial routing override in routing stage",
|
|
9
|
-
"description": "In `src/pipeline/stages/routing.ts`, the code unconditionally overwrites complexity and testStrategy from story.routing, even if undefined. Fix: only override when the field is actually set. Change line 41 `routing.complexity = ctx.story.routing.complexity` to `if (ctx.story.routing?.complexity) routing.complexity = ctx.story.routing.complexity`. Same for testStrategy on the next line. This allows PRD authors to set just `\"routing\": { \"testStrategy\": \"test-after\" }` without needing complexity/modelTier. Add test in `test/unit/pipeline/routing-partial-override.test.ts` verifying: (1) partial override with only testStrategy works, (2) LLM-classified complexity is preserved when not overridden, (3) full override still works.",
|
|
10
|
-
"complexity": "simple",
|
|
11
|
-
"status": "passed",
|
|
12
|
-
"tags": [
|
|
13
|
-
"bugfix"
|
|
14
|
-
],
|
|
15
|
-
"acceptanceCriteria": [
|
|
16
|
-
"routing.complexity is only overridden when ctx.story.routing.complexity is defined",
|
|
17
|
-
"routing.testStrategy is only overridden when ctx.story.routing.testStrategy is defined",
|
|
18
|
-
"PRD with only routing.testStrategy set uses LLM for complexity",
|
|
19
|
-
"Test file test/unit/pipeline/routing-partial-override.test.ts exists with 3 passing tests"
|
|
20
|
-
],
|
|
21
|
-
"dependencies": [],
|
|
22
|
-
"escalations": [],
|
|
23
|
-
"attempts": 1,
|
|
24
|
-
"passes": true,
|
|
25
|
-
"routing": {
|
|
26
|
-
"testStrategy": "test-after"
|
|
27
|
-
},
|
|
28
|
-
"priorErrors": [],
|
|
29
|
-
"storyPoints": 1
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"id": "STR-001",
|
|
33
|
-
"title": "Git diff file detection",
|
|
34
|
-
"description": "Create module `src/verification/smart-runner.ts` with exported function `getChangedSourceFiles(workdir: string): Promise<string[]>`. Runs `git diff --name-only HEAD~1` in the workdir to get changed files. Filter to only `.ts` files that start with `src/`. Use Bun.spawn for the git command. Handle git errors gracefully (return empty array on failure).",
|
|
35
|
-
"complexity": "simple",
|
|
36
|
-
"status": "passed",
|
|
37
|
-
"tags": [
|
|
38
|
-
"core"
|
|
39
|
-
],
|
|
40
|
-
"acceptanceCriteria": [
|
|
41
|
-
"getChangedSourceFiles returns only .ts files under src/",
|
|
42
|
-
"Returns empty array when git command fails",
|
|
43
|
-
"Uses Bun.spawn (not child_process)"
|
|
44
|
-
],
|
|
45
|
-
"dependencies": [
|
|
46
|
-
"FIX-001"
|
|
47
|
-
],
|
|
48
|
-
"escalations": [],
|
|
49
|
-
"attempts": 0,
|
|
50
|
-
"passes": true,
|
|
51
|
-
"routing": {
|
|
52
|
-
"testStrategy": "test-after",
|
|
53
|
-
"modelTier": "powerful"
|
|
54
|
-
},
|
|
55
|
-
"priorErrors": [
|
|
56
|
-
"REGRESSION: full-suite regression detected",
|
|
57
|
-
"Attempt 2 failed with model tier: fast",
|
|
58
|
-
"Attempt 1 failed with model tier: balanced"
|
|
59
|
-
],
|
|
60
|
-
"storyPoints": 1
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"id": "STR-002",
|
|
64
|
-
"title": "Source-to-test file mapping",
|
|
65
|
-
"description": "Add `mapSourceToTests(sourceFiles: string[], workdir: string): Promise<string[]>` to `src/verification/smart-runner.ts`. Convention: `src/foo/bar.ts` → `test/unit/foo/bar.test.ts`. Also check `test/integration/foo/bar.test.ts`. Only return paths where the file actually exists on disk (use Bun.file(path).exists()). Return empty array if no test files map.",
|
|
66
|
-
"complexity": "simple",
|
|
67
|
-
"status": "passed",
|
|
68
|
-
"tags": [
|
|
69
|
-
"core"
|
|
70
|
-
],
|
|
71
|
-
"acceptanceCriteria": [
|
|
72
|
-
"Maps src/foo/bar.ts to test/unit/foo/bar.test.ts correctly",
|
|
73
|
-
"Also checks test/integration/ path",
|
|
74
|
-
"Only returns files that exist on disk",
|
|
75
|
-
"Returns empty array when no test files match"
|
|
76
|
-
],
|
|
77
|
-
"dependencies": [
|
|
78
|
-
"STR-001"
|
|
79
|
-
],
|
|
80
|
-
"escalations": [],
|
|
81
|
-
"attempts": 0,
|
|
82
|
-
"passes": true,
|
|
83
|
-
"routing": {
|
|
84
|
-
"testStrategy": "test-after"
|
|
85
|
-
},
|
|
86
|
-
"priorErrors": [],
|
|
87
|
-
"storyPoints": 1
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
"id": "STR-003",
|
|
91
|
-
"title": "Smart test command builder",
|
|
92
|
-
"description": "Add `buildSmartTestCommand(testFiles: string[], baseCommand: string): string` to `src/verification/smart-runner.ts`. When testFiles is non-empty: replace the last path argument in baseCommand with the specific test file paths joined by spaces. E.g., `bun test test/` with files `[test/unit/foo.test.ts]` → `bun test test/unit/foo.test.ts`. When testFiles is empty: return the original baseCommand unchanged (full suite fallback).",
|
|
93
|
-
"complexity": "simple",
|
|
94
|
-
"status": "passed",
|
|
95
|
-
"tags": [
|
|
96
|
-
"core"
|
|
97
|
-
],
|
|
98
|
-
"acceptanceCriteria": [
|
|
99
|
-
"Builds scoped command with specific test files",
|
|
100
|
-
"Returns original command when testFiles is empty",
|
|
101
|
-
"Works with bun test test/ base command"
|
|
102
|
-
],
|
|
103
|
-
"dependencies": [
|
|
104
|
-
"STR-002"
|
|
105
|
-
],
|
|
106
|
-
"escalations": [],
|
|
107
|
-
"attempts": 0,
|
|
108
|
-
"passes": true,
|
|
109
|
-
"routing": {
|
|
110
|
-
"testStrategy": "test-after"
|
|
111
|
-
},
|
|
112
|
-
"priorErrors": [],
|
|
113
|
-
"storyPoints": 1
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
"id": "STR-004",
|
|
117
|
-
"title": "Smart runner config flag",
|
|
118
|
-
"description": "Add `execution.smartTestRunner: boolean` (default: true) to the config in `src/config/types.ts` (ExecutionConfig interface) and the Zod schema in `src/config/loader.ts`. When false, the verify stage skips smart runner entirely and uses the full test suite command.",
|
|
119
|
-
"complexity": "simple",
|
|
120
|
-
"status": "passed",
|
|
121
|
-
"tags": [
|
|
122
|
-
"config"
|
|
123
|
-
],
|
|
124
|
-
"acceptanceCriteria": [
|
|
125
|
-
"execution.smartTestRunner field exists in ExecutionConfig interface",
|
|
126
|
-
"Zod schema accepts and defaults to true",
|
|
127
|
-
"Config loads correctly with and without the field"
|
|
128
|
-
],
|
|
129
|
-
"dependencies": [
|
|
130
|
-
"STR-003"
|
|
131
|
-
],
|
|
132
|
-
"escalations": [],
|
|
133
|
-
"attempts": 0,
|
|
134
|
-
"passes": true,
|
|
135
|
-
"routing": {
|
|
136
|
-
"testStrategy": "test-after"
|
|
137
|
-
},
|
|
138
|
-
"priorErrors": [],
|
|
139
|
-
"storyPoints": 1
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
"id": "STR-005",
|
|
143
|
-
"title": "Integrate smart runner into verify stage",
|
|
144
|
-
"description": "Modify `src/pipeline/stages/verify.ts` to use smart runner when `ctx.config.execution.smartTestRunner` is true (default). Before calling regression(): call getChangedSourceFiles(ctx.workdir) → mapSourceToTests(files, ctx.workdir) → buildSmartTestCommand(testFiles, testCommand). Use the result as the command for regression(). Log which mode was selected: `[smart-runner] Running N targeted test files` or `[smart-runner] No mapped tests — falling back to full suite`.",
|
|
145
|
-
"complexity": "medium",
|
|
146
|
-
"status": "passed",
|
|
147
|
-
"tags": [
|
|
148
|
-
"integration"
|
|
149
|
-
],
|
|
150
|
-
"acceptanceCriteria": [
|
|
151
|
-
"Verify stage uses scoped test command when smart runner finds test files",
|
|
152
|
-
"Falls back to full suite when no test files map",
|
|
153
|
-
"Skips smart runner entirely when config.execution.smartTestRunner is false",
|
|
154
|
-
"Logs the mode used"
|
|
155
|
-
],
|
|
156
|
-
"dependencies": [
|
|
157
|
-
"STR-004"
|
|
158
|
-
],
|
|
159
|
-
"escalations": [],
|
|
160
|
-
"attempts": 1,
|
|
161
|
-
"passes": true,
|
|
162
|
-
"routing": {
|
|
163
|
-
"testStrategy": "test-after",
|
|
164
|
-
"modelTier": "powerful"
|
|
165
|
-
},
|
|
166
|
-
"priorErrors": [
|
|
167
|
-
"Attempt 1 failed with model tier: fast",
|
|
168
|
-
"Attempt 1 failed with model tier: balanced"
|
|
169
|
-
],
|
|
170
|
-
"storyPoints": 1
|
|
171
|
-
},
|
|
172
|
-
{
|
|
173
|
-
"id": "STR-006",
|
|
174
|
-
"title": "Unit tests for smart runner module",
|
|
175
|
-
"description": "Write `test/unit/verification/smart-runner.test.ts` with tests: (1) getChangedSourceFiles filters to .ts src/ files only, (2) mapSourceToTests maps paths correctly and checks file existence, (3) mapSourceToTests returns empty when files don't exist, (4) buildSmartTestCommand builds scoped command with test files, (5) buildSmartTestCommand returns original command when testFiles is empty. Use temp dirs with Bun.write for file existence tests.",
|
|
176
|
-
"complexity": "medium",
|
|
177
|
-
"status": "failed",
|
|
178
|
-
"tags": [
|
|
179
|
-
"test"
|
|
180
|
-
],
|
|
181
|
-
"acceptanceCriteria": [
|
|
182
|
-
"5 test cases all pass",
|
|
183
|
-
"Uses temp dirs for file existence tests",
|
|
184
|
-
"No external process spawning in unit tests (mock Bun.spawn)"
|
|
185
|
-
],
|
|
186
|
-
"dependencies": [
|
|
187
|
-
"STR-005"
|
|
188
|
-
],
|
|
189
|
-
"escalations": [],
|
|
190
|
-
"attempts": 1,
|
|
191
|
-
"passes": false,
|
|
192
|
-
"routing": {
|
|
193
|
-
"testStrategy": "test-after",
|
|
194
|
-
"modelTier": "powerful"
|
|
195
|
-
},
|
|
196
|
-
"priorErrors": [
|
|
197
|
-
"Attempt 1 failed with model tier: balanced"
|
|
198
|
-
],
|
|
199
|
-
"storyPoints": 1
|
|
200
|
-
}
|
|
201
|
-
],
|
|
202
|
-
"updatedAt": "2026-03-03T14:17:09.852Z"
|
|
203
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Progress: smart-test-runner
|
|
2
|
-
|
|
3
|
-
Created: 2026-03-03T11:45:10.257Z
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
[2026-03-03T12:12:58.473Z] FIX-001 — FAILED — Fix partial routing override in routing stage — Review failed: test failed (exit code 132)
|
|
7
|
-
[2026-03-03T12:27:31.803Z] STR-001 — PASSED — Git diff file detection — Cost: $0.0994
|
|
8
|
-
[2026-03-03T12:29:37.971Z] STR-001 — FAILED — Git diff file detection -- REGRESSION: full-suite regression detected
|
|
9
|
-
[2026-03-03T12:52:43.615Z] STR-002 — PASSED — Source-to-test file mapping — Cost: $0.0889
|
|
10
|
-
[2026-03-03T12:59:34.497Z] STR-003 — PASSED — Smart test command builder — Cost: $0.0862
|
|
11
|
-
[2026-03-03T13:05:48.251Z] STR-004 — PASSED — Smart runner config flag — Cost: $0.1583
|
|
12
|
-
[2026-03-03T13:21:09.123Z] STR-005 — FAILED — Integrate smart runner into verify stage — Execution failed
|
|
13
|
-
[2026-03-03T14:17:09.853Z] STR-006 — FAILED — Unit tests for smart runner module — Execution failed
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "nax",
|
|
3
|
-
"branchName": "feat/status-file-consolidation",
|
|
4
|
-
"feature": "status-file-consolidation",
|
|
5
|
-
"version": "0.22.2",
|
|
6
|
-
"description": "Auto-write status.json to well-known paths (project-level + feature-level). Remove --status-file CLI flag. Align nax status and nax diagnose readers.",
|
|
7
|
-
"userStories": [
|
|
8
|
-
{
|
|
9
|
-
"id": "SFC-001",
|
|
10
|
-
"title": "Auto-write project-level status",
|
|
11
|
-
"description": "Remove --status-file CLI option. StatusWriter always writes to <workdir>/nax/status.json automatically. In bin/nax.ts, remove --status-file option and compute statusFile = join(workdir, 'nax', 'status.json'). In runner.ts, statusFile is no longer optional. In status-writer.ts, remove the if (!this.statusFile) guard in update().",
|
|
12
|
-
"complexity": "medium",
|
|
13
|
-
"status": "pending",
|
|
14
|
-
"acceptanceCriteria": [
|
|
15
|
-
"Running nax without --status-file flag writes nax/status.json automatically",
|
|
16
|
-
"nax/status.json contains valid NaxStatusFile schema with run.id, run.status, progress counts",
|
|
17
|
-
"--status-file CLI option no longer exists",
|
|
18
|
-
"StatusWriter.update() always writes (no no-op guard on missing statusFile)"
|
|
19
|
-
],
|
|
20
|
-
"attempts": 0,
|
|
21
|
-
"priorErrors": [
|
|
22
|
-
"Attempt 1 failed with model tier: fast: Review failed: test failed (exit code -1)"
|
|
23
|
-
],
|
|
24
|
-
"priorFailures": [
|
|
25
|
-
{
|
|
26
|
-
"attempt": 1,
|
|
27
|
-
"modelTier": "fast",
|
|
28
|
-
"stage": "escalation",
|
|
29
|
-
"summary": "Failed with tier fast, escalating to next tier",
|
|
30
|
-
"timestamp": "2026-03-07T06:22:18.122Z"
|
|
31
|
-
}
|
|
32
|
-
],
|
|
33
|
-
"escalations": [],
|
|
34
|
-
"dependencies": [],
|
|
35
|
-
"tags": [],
|
|
36
|
-
"storyPoints": 1,
|
|
37
|
-
"routing": {
|
|
38
|
-
"complexity": "medium",
|
|
39
|
-
"modelTier": "balanced",
|
|
40
|
-
"testStrategy": "test-after",
|
|
41
|
-
"reasoning": "Straightforward refactor: remove CLI option, hardcode path computation, remove null guard across 3 files"
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"id": "SFC-002",
|
|
46
|
-
"title": "Write feature-level status on run end",
|
|
47
|
-
"description": "On run complete/fail/crash, write the final status snapshot to <workdir>/nax/features/<feature>/status.json. Add writeFeatureStatus(featureDir) method to StatusWriter. Call it in runner.ts finally block and in crash-recovery.ts.",
|
|
48
|
-
"complexity": "medium",
|
|
49
|
-
"status": "pending",
|
|
50
|
-
"acceptanceCriteria": [
|
|
51
|
-
"After a completed run, nax/features/<feature>/status.json exists with status 'completed'",
|
|
52
|
-
"After a failed run, nax/features/<feature>/status.json exists with status 'failed'",
|
|
53
|
-
"After a crash, nax/features/<feature>/status.json exists with status 'crashed'",
|
|
54
|
-
"Feature status.json uses the same NaxStatusFile schema as project-level"
|
|
55
|
-
],
|
|
56
|
-
"attempts": 0,
|
|
57
|
-
"priorErrors": [],
|
|
58
|
-
"priorFailures": [],
|
|
59
|
-
"escalations": [],
|
|
60
|
-
"dependencies": [],
|
|
61
|
-
"tags": [],
|
|
62
|
-
"storyPoints": 1
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
"id": "SFC-003",
|
|
66
|
-
"title": "Align status readers",
|
|
67
|
-
"description": "Make nax status read project-level status from nax/status.json for currently running info. Make nax diagnose read from nax/status.json instead of .nax-status.json. status-features.ts loadStatusFile() already reads <featureDir>/status.json which SFC-002 now writes — no change needed for feature-level reads.",
|
|
68
|
-
"complexity": "simple",
|
|
69
|
-
"status": "pending",
|
|
70
|
-
"acceptanceCriteria": [
|
|
71
|
-
"nax status shows current run info from nax/status.json at the top",
|
|
72
|
-
"nax status shows per-feature historical status from nax/features/<feature>/status.json",
|
|
73
|
-
"nax diagnose reads from nax/status.json (not .nax-status.json)",
|
|
74
|
-
"No references to .nax-status.json remain in codebase"
|
|
75
|
-
],
|
|
76
|
-
"attempts": 0,
|
|
77
|
-
"priorErrors": [],
|
|
78
|
-
"priorFailures": [],
|
|
79
|
-
"escalations": [],
|
|
80
|
-
"dependencies": [],
|
|
81
|
-
"tags": [],
|
|
82
|
-
"storyPoints": 1
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
"id": "SFC-004",
|
|
86
|
-
"title": "Clean up dead code",
|
|
87
|
-
"description": "Remove --status-file option definition from bin/nax.ts. Remove .nax-status.json path from diagnose.ts. Remove statusFile optional from RunOptions type (now required, auto-computed). Verify no stale references remain.",
|
|
88
|
-
"complexity": "simple",
|
|
89
|
-
"status": "pending",
|
|
90
|
-
"acceptanceCriteria": [
|
|
91
|
-
"No references to --status-file CLI option in codebase",
|
|
92
|
-
"No references to .nax-status.json in codebase",
|
|
93
|
-
"RunOptions.statusFile is required (not optional)",
|
|
94
|
-
"All existing tests pass"
|
|
95
|
-
],
|
|
96
|
-
"attempts": 0,
|
|
97
|
-
"priorErrors": [],
|
|
98
|
-
"priorFailures": [],
|
|
99
|
-
"escalations": [],
|
|
100
|
-
"dependencies": [],
|
|
101
|
-
"tags": [],
|
|
102
|
-
"storyPoints": 1
|
|
103
|
-
}
|
|
104
|
-
],
|
|
105
|
-
"updatedAt": "2026-03-07T06:22:18.122Z"
|
|
106
|
-
}
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"project": "nax",
|
|
3
|
-
"feature": "structured-logging",
|
|
4
|
-
"branchName": "feat/structured-logging",
|
|
5
|
-
"createdAt": "2026-02-27T05:50:00Z",
|
|
6
|
-
"updatedAt": "2026-02-27T08:42:37.832Z",
|
|
7
|
-
"userStories": [
|
|
8
|
-
{
|
|
9
|
-
"id": "US-001",
|
|
10
|
-
"title": "Project resolver with CWD and -d flag support",
|
|
11
|
-
"description": "Create src/commands/common.ts with resolveProject(options) function. Resolution order: 1) -d flag path, 2) CWD if it contains nax/ directory, 3) Error with helpful message. Validate: nax/ exists, nax/config.json exists. If -f flag given, validate nax/features/<name>/ exists. Return resolved {projectDir, configPath, featureDir?}. This is shared by status, logs, and future CLI commands.",
|
|
12
|
-
"acceptanceCriteria": [
|
|
13
|
-
"resolveProject() returns projectDir when CWD has nax/ directory",
|
|
14
|
-
"resolveProject({dir:\"/path\"}) uses explicit directory",
|
|
15
|
-
"Throws descriptive error when no nax/ directory found",
|
|
16
|
-
"Validates nax/config.json exists in resolved directory",
|
|
17
|
-
"When feature specified, validates nax/features/<name>/ exists",
|
|
18
|
-
"Error message lists available features when feature not found",
|
|
19
|
-
"Works with both relative and absolute -d paths"
|
|
20
|
-
],
|
|
21
|
-
"dependencies": [],
|
|
22
|
-
"tags": [
|
|
23
|
-
"cli",
|
|
24
|
-
"resolver"
|
|
25
|
-
],
|
|
26
|
-
"status": "passed",
|
|
27
|
-
"attempts": 2,
|
|
28
|
-
"priorErrors": [
|
|
29
|
-
"Attempt 1 failed with model tier: balanced",
|
|
30
|
-
"Attempt 2 failed with model tier: balanced"
|
|
31
|
-
],
|
|
32
|
-
"escalations": []
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"id": "US-002",
|
|
36
|
-
"title": "Human-friendly logging formatter with verbosity levels",
|
|
37
|
-
"description": "Create src/logging/formatter.ts and src/logging/types.ts. Transform JSONL entries into human-readable output with emoji indicators. Support 4 modes: quiet, normal, verbose, json. Include run header, story progress with tree-style output, stage results with emoji, retry indicators, run summary footer.",
|
|
38
|
-
"acceptanceCriteria": [
|
|
39
|
-
"formatLogEntry renders story start with title, complexity, tier",
|
|
40
|
-
"formatLogEntry renders stage results with appropriate emoji",
|
|
41
|
-
"formatRunSummary renders pass/fail/duration/cost stats",
|
|
42
|
-
"quiet mode only shows pass/fail + summary",
|
|
43
|
-
"verbose mode includes routing, tokens, context files",
|
|
44
|
-
"json mode passes through raw JSONL",
|
|
45
|
-
"Timestamps formatted in local timezone HH:MM:SS"
|
|
46
|
-
],
|
|
47
|
-
"dependencies": [],
|
|
48
|
-
"tags": [
|
|
49
|
-
"logging",
|
|
50
|
-
"formatter"
|
|
51
|
-
],
|
|
52
|
-
"status": "passed",
|
|
53
|
-
"attempts": 0,
|
|
54
|
-
"priorErrors": [],
|
|
55
|
-
"escalations": []
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"id": "US-003",
|
|
59
|
-
"title": "status.json writer for live run state",
|
|
60
|
-
"description": "Create src/logging/status-writer.ts. Maintain status.json at nax/features/<feature>/status.json during runs. Write on: run start (runId, feature, totalStories, pid), story start (currentStory), story complete (status/duration/cost/commit), run end (completed/failed + totals). Atomic writes via tmp+rename.",
|
|
61
|
-
"acceptanceCriteria": [
|
|
62
|
-
"status.json created at run start with runId, feature, startedAt, pid, status=running",
|
|
63
|
-
"Updates currentStory on story begin",
|
|
64
|
-
"Updates story entry on completion",
|
|
65
|
-
"Updates totals after each story",
|
|
66
|
-
"Status changes to completed/failed at run end",
|
|
67
|
-
"Atomic writes prevent corruption",
|
|
68
|
-
"PID included for crash detection"
|
|
69
|
-
],
|
|
70
|
-
"dependencies": [],
|
|
71
|
-
"tags": [
|
|
72
|
-
"logging",
|
|
73
|
-
"state"
|
|
74
|
-
],
|
|
75
|
-
"status": "passed",
|
|
76
|
-
"attempts": 1,
|
|
77
|
-
"priorErrors": [
|
|
78
|
-
"Attempt 1 failed with model tier: balanced"
|
|
79
|
-
],
|
|
80
|
-
"escalations": [],
|
|
81
|
-
"passes": true
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
"id": "US-004",
|
|
85
|
-
"title": "nax status command with active run detection",
|
|
86
|
-
"description": "Create src/commands/status.ts, register in CLI. Uses resolveProject(). Show feature table (done/failed/pending, last run, cost). Detect active run via status.json+PID. Detect crash via status.json+dead PID. Support -f for single feature.",
|
|
87
|
-
"acceptanceCriteria": [
|
|
88
|
-
"Shows table of all features with counts and last run",
|
|
89
|
-
"Detailed single-feature view with story table",
|
|
90
|
-
"Active run detected via PID alive check",
|
|
91
|
-
"Crashed run shows warning with recovery hints",
|
|
92
|
-
"No status.json shows No runs yet",
|
|
93
|
-
"Uses resolveProject() for resolution",
|
|
94
|
-
"Registered as CLI subcommand"
|
|
95
|
-
],
|
|
96
|
-
"dependencies": [
|
|
97
|
-
"US-001",
|
|
98
|
-
"US-003"
|
|
99
|
-
],
|
|
100
|
-
"tags": [
|
|
101
|
-
"cli",
|
|
102
|
-
"status"
|
|
103
|
-
],
|
|
104
|
-
"status": "passed",
|
|
105
|
-
"attempts": 0,
|
|
106
|
-
"priorErrors": [],
|
|
107
|
-
"escalations": [],
|
|
108
|
-
"passes": true
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"id": "US-005",
|
|
112
|
-
"title": "nax logs command with filtering and follow mode",
|
|
113
|
-
"description": "Create src/commands/logs.ts, register in CLI. Uses resolveProject(). Supports: default (latest run formatted), --follow (tail -f), --story (filter), --level (filter), --list (run table), --run (specific run), --json (raw). Uses formatter from US-002.",
|
|
114
|
-
"acceptanceCriteria": [
|
|
115
|
-
"Shows latest run logs formatted",
|
|
116
|
-
"--follow streams new entries real-time",
|
|
117
|
-
"--story filters to one story",
|
|
118
|
-
"--level filters by severity",
|
|
119
|
-
"--list shows runs table",
|
|
120
|
-
"--run selects specific run",
|
|
121
|
-
"--json outputs raw JSONL",
|
|
122
|
-
"Filters combinable",
|
|
123
|
-
"Uses resolveProject()"
|
|
124
|
-
],
|
|
125
|
-
"dependencies": [
|
|
126
|
-
"US-001",
|
|
127
|
-
"US-002"
|
|
128
|
-
],
|
|
129
|
-
"tags": [
|
|
130
|
-
"cli",
|
|
131
|
-
"logs"
|
|
132
|
-
],
|
|
133
|
-
"status": "passed",
|
|
134
|
-
"attempts": 1,
|
|
135
|
-
"priorErrors": [],
|
|
136
|
-
"escalations": [],
|
|
137
|
-
"passes": true
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
"id": "US-006",
|
|
141
|
-
"title": "Integrate formatter into headless runner",
|
|
142
|
-
"description": "Modify src/execution/runner.ts to use formatter for headless stdout instead of raw JSONL. Default=normal. Add --quiet/--verbose/--json flags to nax run. Wire status-writer into run loop. JSONL still written to disk. Integrate status.json updates at lifecycle points.",
|
|
143
|
-
"acceptanceCriteria": [
|
|
144
|
-
"Headless stdout shows formatted output by default",
|
|
145
|
-
"JSONL still written to disk (unchanged)",
|
|
146
|
-
"--json flag restores raw JSONL stdout",
|
|
147
|
-
"--quiet and --verbose flags work",
|
|
148
|
-
"status.json written throughout lifecycle",
|
|
149
|
-
"Run header with version, feature, count, path",
|
|
150
|
-
"Run footer with summary stats"
|
|
151
|
-
],
|
|
152
|
-
"dependencies": [
|
|
153
|
-
"US-002",
|
|
154
|
-
"US-003"
|
|
155
|
-
],
|
|
156
|
-
"tags": [
|
|
157
|
-
"runner",
|
|
158
|
-
"integration"
|
|
159
|
-
],
|
|
160
|
-
"status": "passed",
|
|
161
|
-
"attempts": 0,
|
|
162
|
-
"priorErrors": [],
|
|
163
|
-
"escalations": [],
|
|
164
|
-
"passes": true
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
"id": "US-007",
|
|
168
|
-
"title": "Crash recovery with signal handlers heartbeat and exit summary",
|
|
169
|
-
"description": "Add SIGTERM/SIGINT/SIGHUP handlers and uncaught exception handlers. On signal: write fatal JSONL + update status.json to crashed + exit. During agent execution: heartbeat every 60s. On normal exit: write exit summary entry.",
|
|
170
|
-
"acceptanceCriteria": [
|
|
171
|
-
"Signal handlers write fatal log with signal name",
|
|
172
|
-
"Signal handlers update status.json to crashed",
|
|
173
|
-
"Uncaught exceptions write fatal log with stack",
|
|
174
|
-
"Heartbeat every 60s during agent execution",
|
|
175
|
-
"Normal exit writes summary entry",
|
|
176
|
-
"Signal handlers exit cleanly",
|
|
177
|
-
"Heartbeat timer cleaned up on story completion"
|
|
178
|
-
],
|
|
179
|
-
"dependencies": [
|
|
180
|
-
"US-003"
|
|
181
|
-
],
|
|
182
|
-
"tags": [
|
|
183
|
-
"crash-recovery",
|
|
184
|
-
"signals"
|
|
185
|
-
],
|
|
186
|
-
"status": "passed",
|
|
187
|
-
"attempts": 1,
|
|
188
|
-
"priorErrors": [
|
|
189
|
-
"Attempt 1 failed with model tier: balanced"
|
|
190
|
-
],
|
|
191
|
-
"escalations": [],
|
|
192
|
-
"passes": true
|
|
193
|
-
}
|
|
194
|
-
],
|
|
195
|
-
"analyzeConfig": {
|
|
196
|
-
"maxStories": 15,
|
|
197
|
-
"granularity": "medium"
|
|
198
|
-
}
|
|
199
|
-
}
|