@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,286 +0,0 @@
|
|
|
1
|
-
// RE-ARCH: rewrite
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Verify Stage Tests
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
8
|
-
import { mkdtempSync } from "node:fs";
|
|
9
|
-
import { tmpdir } from "node:os";
|
|
10
|
-
import { join } from "node:path";
|
|
11
|
-
import type { NaxConfig } from "../../../src/config/schema";
|
|
12
|
-
import { initLogger, resetLogger } from "../../../src/logger";
|
|
13
|
-
import { verifyStage } from "../../../src/pipeline/stages/verify";
|
|
14
|
-
import type { PipelineContext } from "../../../src/pipeline/types";
|
|
15
|
-
import type { PRD, UserStory } from "../../../src/prd/types";
|
|
16
|
-
|
|
17
|
-
/** Helper: Create minimal test context */
|
|
18
|
-
function createTestContext(overrides?: Partial<PipelineContext>): PipelineContext {
|
|
19
|
-
const story: UserStory = {
|
|
20
|
-
id: "US-001",
|
|
21
|
-
title: "Test Story",
|
|
22
|
-
description: "Test description",
|
|
23
|
-
acceptanceCriteria: ["Test passes"],
|
|
24
|
-
tags: [],
|
|
25
|
-
dependencies: [],
|
|
26
|
-
status: "pending",
|
|
27
|
-
passes: false,
|
|
28
|
-
escalations: [],
|
|
29
|
-
attempts: 0,
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
const prd: PRD = {
|
|
33
|
-
project: "test-project",
|
|
34
|
-
feature: "test-feature",
|
|
35
|
-
branchName: "test-branch",
|
|
36
|
-
createdAt: new Date().toISOString(),
|
|
37
|
-
updatedAt: new Date().toISOString(),
|
|
38
|
-
userStories: [story],
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const config: NaxConfig = {
|
|
42
|
-
version: 1,
|
|
43
|
-
models: {
|
|
44
|
-
fast: "claude-sonnet-4-5",
|
|
45
|
-
balanced: "claude-sonnet-4-5",
|
|
46
|
-
powerful: "claude-opus-4-6",
|
|
47
|
-
},
|
|
48
|
-
autoMode: {
|
|
49
|
-
enabled: true,
|
|
50
|
-
defaultAgent: "nax-agent-claude",
|
|
51
|
-
fallbackOrder: ["nax-agent-claude"],
|
|
52
|
-
complexityRouting: {
|
|
53
|
-
simple: "fast",
|
|
54
|
-
medium: "balanced",
|
|
55
|
-
complex: "powerful",
|
|
56
|
-
expert: "powerful",
|
|
57
|
-
},
|
|
58
|
-
escalation: {
|
|
59
|
-
enabled: true,
|
|
60
|
-
maxAttempts: 3,
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
execution: {
|
|
64
|
-
maxIterations: 100,
|
|
65
|
-
iterationDelayMs: 1000,
|
|
66
|
-
costLimit: 50,
|
|
67
|
-
sessionTimeoutSeconds: 600,
|
|
68
|
-
verificationTimeoutSeconds: 30,
|
|
69
|
-
maxStoriesPerFeature: 50,
|
|
70
|
-
},
|
|
71
|
-
quality: {
|
|
72
|
-
requireTypecheck: false,
|
|
73
|
-
requireLint: false,
|
|
74
|
-
requireTests: true,
|
|
75
|
-
commands: {},
|
|
76
|
-
},
|
|
77
|
-
tdd: {
|
|
78
|
-
maxRetries: 3,
|
|
79
|
-
autoVerifyIsolation: true,
|
|
80
|
-
autoApproveVerifier: true,
|
|
81
|
-
},
|
|
82
|
-
constitution: {
|
|
83
|
-
enabled: false,
|
|
84
|
-
path: "constitution.md",
|
|
85
|
-
maxTokens: 2000,
|
|
86
|
-
},
|
|
87
|
-
analyze: {
|
|
88
|
-
llmEnhanced: false,
|
|
89
|
-
model: "balanced",
|
|
90
|
-
fallbackToKeywords: true,
|
|
91
|
-
maxCodebaseSummaryTokens: 4000,
|
|
92
|
-
},
|
|
93
|
-
review: {
|
|
94
|
-
enabled: true,
|
|
95
|
-
checks: ["test"],
|
|
96
|
-
commands: {},
|
|
97
|
-
},
|
|
98
|
-
plan: {
|
|
99
|
-
model: "balanced",
|
|
100
|
-
outputPath: "features",
|
|
101
|
-
},
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
return {
|
|
105
|
-
config,
|
|
106
|
-
prd,
|
|
107
|
-
story,
|
|
108
|
-
stories: [story],
|
|
109
|
-
routing: {
|
|
110
|
-
complexity: "simple",
|
|
111
|
-
modelTier: "fast",
|
|
112
|
-
testStrategy: "test-after",
|
|
113
|
-
reasoning: "Test routing",
|
|
114
|
-
},
|
|
115
|
-
workdir: "/test/workdir",
|
|
116
|
-
hooks: { hooks: {} },
|
|
117
|
-
...overrides,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
describe("Verify Stage", () => {
|
|
122
|
-
beforeEach(() => {
|
|
123
|
-
initLogger({ level: "error", useChalk: false });
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
afterEach(() => {
|
|
127
|
-
resetLogger();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
test("verifyStage is always enabled", () => {
|
|
131
|
-
const ctx = createTestContext();
|
|
132
|
-
expect(verifyStage.enabled(ctx)).toBe(true);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
test("passes when tests succeed", async () => {
|
|
136
|
-
const tempDir = mkdtempSync(join(tmpdir(), "nax-verify-test-"));
|
|
137
|
-
|
|
138
|
-
const ctx = createTestContext({
|
|
139
|
-
workdir: tempDir,
|
|
140
|
-
config: {
|
|
141
|
-
...createTestContext().config,
|
|
142
|
-
review: {
|
|
143
|
-
enabled: true,
|
|
144
|
-
checks: ["test"],
|
|
145
|
-
commands: {
|
|
146
|
-
test: "echo 'Tests passed'",
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
const result = await verifyStage.execute(ctx);
|
|
153
|
-
|
|
154
|
-
expect(result.action).toBe("continue");
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
test("fails when tests fail", async () => {
|
|
158
|
-
const tempDir = mkdtempSync(join(tmpdir(), "nax-verify-test-"));
|
|
159
|
-
|
|
160
|
-
const ctx = createTestContext({
|
|
161
|
-
workdir: tempDir,
|
|
162
|
-
config: {
|
|
163
|
-
...createTestContext().config,
|
|
164
|
-
execution: {
|
|
165
|
-
...createTestContext().config.execution,
|
|
166
|
-
regressionGate: {
|
|
167
|
-
enabled: true,
|
|
168
|
-
timeoutSeconds: 30,
|
|
169
|
-
acceptOnTimeout: false,
|
|
170
|
-
mode: "per-story", // Override for this specific test
|
|
171
|
-
},
|
|
172
|
-
},
|
|
173
|
-
review: {
|
|
174
|
-
enabled: true,
|
|
175
|
-
checks: ["test"],
|
|
176
|
-
commands: {
|
|
177
|
-
test: "sh -c 'exit 1'",
|
|
178
|
-
},
|
|
179
|
-
},
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
const result = await verifyStage.execute(ctx);
|
|
184
|
-
|
|
185
|
-
expect(result.action).toBe("escalate");
|
|
186
|
-
if (result.action === "escalate") {
|
|
187
|
-
expect(result.reason).toContain("Tests failed");
|
|
188
|
-
// Exit code may vary by shell - just check it mentions exit code
|
|
189
|
-
expect(result.reason).toMatch(/exit code/);
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
test("uses default test command when not configured", async () => {
|
|
194
|
-
const tempDir = mkdtempSync(join(tmpdir(), "nax-verify-test-"));
|
|
195
|
-
|
|
196
|
-
// Create a simple package.json to make bun test work
|
|
197
|
-
await Bun.write(join(tempDir, "package.json"), JSON.stringify({ name: "test" }));
|
|
198
|
-
|
|
199
|
-
const ctx = createTestContext({
|
|
200
|
-
workdir: tempDir,
|
|
201
|
-
config: {
|
|
202
|
-
...createTestContext().config,
|
|
203
|
-
review: {
|
|
204
|
-
enabled: true,
|
|
205
|
-
checks: ["test"],
|
|
206
|
-
commands: {}, // No custom command
|
|
207
|
-
},
|
|
208
|
-
},
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
const result = await verifyStage.execute(ctx);
|
|
212
|
-
|
|
213
|
-
// No test command configured → stage skips (returns continue)
|
|
214
|
-
// This is correct behaviour: don't run tests if none configured
|
|
215
|
-
expect(result.action).toBe("continue");
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
test("uses custom test command from config", async () => {
|
|
219
|
-
const tempDir = mkdtempSync(join(tmpdir(), "nax-verify-test-"));
|
|
220
|
-
|
|
221
|
-
const ctx = createTestContext({
|
|
222
|
-
workdir: tempDir,
|
|
223
|
-
config: {
|
|
224
|
-
...createTestContext().config,
|
|
225
|
-
review: {
|
|
226
|
-
enabled: true,
|
|
227
|
-
checks: ["test"],
|
|
228
|
-
commands: {
|
|
229
|
-
test: "echo 'custom test command'",
|
|
230
|
-
},
|
|
231
|
-
},
|
|
232
|
-
},
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
const result = await verifyStage.execute(ctx);
|
|
236
|
-
|
|
237
|
-
expect(result.action).toBe("continue");
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
test("handles test command with arguments", async () => {
|
|
241
|
-
const tempDir = mkdtempSync(join(tmpdir(), "nax-verify-test-"));
|
|
242
|
-
|
|
243
|
-
const ctx = createTestContext({
|
|
244
|
-
workdir: tempDir,
|
|
245
|
-
config: {
|
|
246
|
-
...createTestContext().config,
|
|
247
|
-
review: {
|
|
248
|
-
enabled: true,
|
|
249
|
-
checks: ["test"],
|
|
250
|
-
commands: {
|
|
251
|
-
test: "echo 'test' && echo 'with args'",
|
|
252
|
-
},
|
|
253
|
-
},
|
|
254
|
-
},
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
const result = await verifyStage.execute(ctx);
|
|
258
|
-
|
|
259
|
-
expect(result.action).toBe("continue");
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
test.skip("handles test command that throws error — hangs on nonexistent-command (TODO: fix timeout handling)", async () => {
|
|
263
|
-
const tempDir = mkdtempSync(join(tmpdir(), "nax-verify-test-"));
|
|
264
|
-
|
|
265
|
-
const ctx = createTestContext({
|
|
266
|
-
workdir: tempDir,
|
|
267
|
-
config: {
|
|
268
|
-
...createTestContext().config,
|
|
269
|
-
review: {
|
|
270
|
-
enabled: true,
|
|
271
|
-
checks: ["test"],
|
|
272
|
-
commands: {
|
|
273
|
-
test: "nonexistent-command",
|
|
274
|
-
},
|
|
275
|
-
},
|
|
276
|
-
},
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
const result = await verifyStage.execute(ctx);
|
|
280
|
-
|
|
281
|
-
expect(result.action).toBe("escalate");
|
|
282
|
-
if (result.action === "fail") {
|
|
283
|
-
expect(result.reason).toContain("Tests failed");
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
});
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
// RE-ARCH: keep
|
|
2
|
-
/**
|
|
3
|
-
* Integration Tests for Analyze Command
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
|
7
|
-
import { existsSync, mkdirSync, rmSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { analyzeFeature } from "../../../src/cli/analyze";
|
|
10
|
-
import { DEFAULT_CONFIG } from "../../../src/config";
|
|
11
|
-
|
|
12
|
-
describe("analyzeFeature integration", () => {
|
|
13
|
-
const testDir = "/tmp/nax-analyze-test";
|
|
14
|
-
const featureDir = join(testDir, "nax/features/test-feature");
|
|
15
|
-
|
|
16
|
-
beforeAll(() => {
|
|
17
|
-
// Create test directory structure
|
|
18
|
-
if (existsSync(testDir)) {
|
|
19
|
-
rmSync(testDir, { recursive: true });
|
|
20
|
-
}
|
|
21
|
-
mkdirSync(featureDir, { recursive: true });
|
|
22
|
-
|
|
23
|
-
// Create test spec.md
|
|
24
|
-
const specContent = `# Test Feature
|
|
25
|
-
|
|
26
|
-
## US-001: Add user authentication
|
|
27
|
-
|
|
28
|
-
### Description
|
|
29
|
-
Implement JWT-based authentication with refresh tokens.
|
|
30
|
-
|
|
31
|
-
### Acceptance Criteria
|
|
32
|
-
- [ ] User can log in with email/password
|
|
33
|
-
- [ ] JWT token is generated and stored
|
|
34
|
-
- [ ] Refresh token logic works
|
|
35
|
-
- [ ] Token expiry is handled
|
|
36
|
-
|
|
37
|
-
Tags: security, auth
|
|
38
|
-
Dependencies: none
|
|
39
|
-
|
|
40
|
-
## US-002: Update homepage UI
|
|
41
|
-
|
|
42
|
-
### Description
|
|
43
|
-
Refresh the homepage design with new color scheme.
|
|
44
|
-
|
|
45
|
-
### Acceptance Criteria
|
|
46
|
-
- [ ] New colors applied
|
|
47
|
-
- [ ] Layout is responsive
|
|
48
|
-
|
|
49
|
-
Tags: ui
|
|
50
|
-
Dependencies: none
|
|
51
|
-
`;
|
|
52
|
-
|
|
53
|
-
Bun.write(join(featureDir, "spec.md"), specContent);
|
|
54
|
-
|
|
55
|
-
// Create mock src/ directory
|
|
56
|
-
mkdirSync(join(testDir, "src"), { recursive: true });
|
|
57
|
-
Bun.write(join(testDir, "src/index.ts"), "export {}");
|
|
58
|
-
|
|
59
|
-
// Create mock package.json
|
|
60
|
-
Bun.write(
|
|
61
|
-
join(testDir, "package.json"),
|
|
62
|
-
JSON.stringify({
|
|
63
|
-
name: "test-project",
|
|
64
|
-
dependencies: { zod: "^4.0.0" },
|
|
65
|
-
devDependencies: { typescript: "^5.0.0" },
|
|
66
|
-
}),
|
|
67
|
-
);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
afterAll(() => {
|
|
71
|
-
// Cleanup
|
|
72
|
-
if (existsSync(testDir)) {
|
|
73
|
-
rmSync(testDir, { recursive: true });
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
test("parses spec.md into PRD structure", async () => {
|
|
78
|
-
const config = {
|
|
79
|
-
...DEFAULT_CONFIG,
|
|
80
|
-
analyze: {
|
|
81
|
-
llmEnhanced: false, // Disable LLM for predictable tests
|
|
82
|
-
model: "fast" as const,
|
|
83
|
-
fallbackToKeywords: true,
|
|
84
|
-
maxCodebaseSummaryTokens: 5000,
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const prd = await analyzeFeature({
|
|
89
|
-
featureDir,
|
|
90
|
-
featureName: "test-feature",
|
|
91
|
-
branchName: "feat/test-feature",
|
|
92
|
-
config,
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
expect(prd.project).toBe("nax");
|
|
96
|
-
expect(prd.feature).toBe("test-feature");
|
|
97
|
-
expect(prd.branchName).toBe("feat/test-feature");
|
|
98
|
-
expect(prd.userStories).toHaveLength(2);
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
test("extracts story metadata correctly", async () => {
|
|
102
|
-
const config = {
|
|
103
|
-
...DEFAULT_CONFIG,
|
|
104
|
-
analyze: {
|
|
105
|
-
llmEnhanced: false,
|
|
106
|
-
model: "fast" as const,
|
|
107
|
-
fallbackToKeywords: true,
|
|
108
|
-
maxCodebaseSummaryTokens: 5000,
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
const prd = await analyzeFeature({
|
|
113
|
-
featureDir,
|
|
114
|
-
featureName: "test-feature",
|
|
115
|
-
branchName: "feat/test-feature",
|
|
116
|
-
config,
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
const story1 = prd.userStories[0];
|
|
120
|
-
expect(story1.id).toBe("US-001");
|
|
121
|
-
expect(story1.title).toBe("Add user authentication");
|
|
122
|
-
expect(story1.description).toContain("JWT-based authentication");
|
|
123
|
-
expect(story1.acceptanceCriteria).toHaveLength(4);
|
|
124
|
-
expect(story1.tags).toContain("security");
|
|
125
|
-
expect(story1.tags).toContain("auth");
|
|
126
|
-
expect(story1.status).toBe("pending");
|
|
127
|
-
expect(story1.passes).toBe(false);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
test("applies routing when LLM disabled (keyword fallback)", async () => {
|
|
131
|
-
const config = {
|
|
132
|
-
...DEFAULT_CONFIG,
|
|
133
|
-
analyze: {
|
|
134
|
-
llmEnhanced: false,
|
|
135
|
-
model: "fast" as const,
|
|
136
|
-
fallbackToKeywords: true,
|
|
137
|
-
maxCodebaseSummaryTokens: 5000,
|
|
138
|
-
},
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
const prd = await analyzeFeature({
|
|
142
|
-
featureDir,
|
|
143
|
-
featureName: "test-feature",
|
|
144
|
-
branchName: "feat/test-feature",
|
|
145
|
-
config,
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
// Routing should be applied with keyword classification
|
|
149
|
-
expect(prd.userStories[0].routing).toBeDefined();
|
|
150
|
-
expect(prd.userStories[1].routing).toBeDefined();
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
test.skip("scans codebase when LLM enabled", async () => {
|
|
154
|
-
// Skipped: This test would require a real agent installation and API key
|
|
155
|
-
// The LLM decompose flow is tested in unit tests with mocked agents
|
|
156
|
-
const config = {
|
|
157
|
-
...DEFAULT_CONFIG,
|
|
158
|
-
analyze: {
|
|
159
|
-
llmEnhanced: true,
|
|
160
|
-
model: "fast" as const,
|
|
161
|
-
fallbackToKeywords: true,
|
|
162
|
-
maxCodebaseSummaryTokens: 5000,
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
// This will trigger LLM decompose (will fall back due to no agent in test)
|
|
167
|
-
const prd = await analyzeFeature({
|
|
168
|
-
featureDir,
|
|
169
|
-
featureName: "test-feature",
|
|
170
|
-
branchName: "feat/test-feature",
|
|
171
|
-
config,
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
// Should have routing metadata from keyword fallback
|
|
175
|
-
expect(prd.userStories[0].routing).toBeDefined();
|
|
176
|
-
expect(prd.userStories[1].routing).toBeDefined();
|
|
177
|
-
|
|
178
|
-
// First story should be complex (security keywords)
|
|
179
|
-
expect(prd.userStories[0].routing?.complexity).toBe("complex");
|
|
180
|
-
|
|
181
|
-
// Second story should be simple
|
|
182
|
-
expect(prd.userStories[1].routing?.complexity).toBe("simple");
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
test("throws error when spec.md missing", async () => {
|
|
186
|
-
const emptyDir = "/tmp/nax-empty-test";
|
|
187
|
-
mkdirSync(emptyDir, { recursive: true });
|
|
188
|
-
|
|
189
|
-
try {
|
|
190
|
-
await expect(
|
|
191
|
-
analyzeFeature({
|
|
192
|
-
featureDir: emptyDir,
|
|
193
|
-
featureName: "empty",
|
|
194
|
-
branchName: "feat/empty",
|
|
195
|
-
}),
|
|
196
|
-
).rejects.toThrow("spec.md not found");
|
|
197
|
-
} finally {
|
|
198
|
-
rmSync(emptyDir, { recursive: true });
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
test("throws error when no stories found", async () => {
|
|
203
|
-
const noStoriesDir = "/tmp/nax-no-stories-test";
|
|
204
|
-
const featurePath = join(noStoriesDir, "nax/features/test");
|
|
205
|
-
mkdirSync(featurePath, { recursive: true });
|
|
206
|
-
|
|
207
|
-
// Create empty spec.md
|
|
208
|
-
await Bun.write(join(featurePath, "spec.md"), "# Empty\n\nNo stories here.");
|
|
209
|
-
|
|
210
|
-
try {
|
|
211
|
-
await expect(
|
|
212
|
-
analyzeFeature({
|
|
213
|
-
featureDir: featurePath,
|
|
214
|
-
featureName: "test",
|
|
215
|
-
branchName: "feat/test",
|
|
216
|
-
}),
|
|
217
|
-
).rejects.toThrow("No user stories found");
|
|
218
|
-
} finally {
|
|
219
|
-
rmSync(noStoriesDir, { recursive: true });
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
test("warns but succeeds when story count exceeds maxStoriesPerFeature limit", async () => {
|
|
224
|
-
const manyStoriesDir = "/tmp/nax-many-stories-test";
|
|
225
|
-
const featurePath = join(manyStoriesDir, "nax/features/test");
|
|
226
|
-
mkdirSync(featurePath, { recursive: true });
|
|
227
|
-
|
|
228
|
-
// Create spec.md with 6 stories (exceeds limit of 5)
|
|
229
|
-
let specContent = "# Many Stories\n\n";
|
|
230
|
-
for (let i = 1; i <= 6; i++) {
|
|
231
|
-
specContent += `## US-${String(i).padStart(3, "0")}: Story ${i}\n\n`;
|
|
232
|
-
specContent += `### Description\nStory ${i}\n\n`;
|
|
233
|
-
specContent += `### Acceptance Criteria\n- [ ] Done\n\n`;
|
|
234
|
-
}
|
|
235
|
-
await Bun.write(join(featurePath, "spec.md"), specContent);
|
|
236
|
-
|
|
237
|
-
const config = {
|
|
238
|
-
...DEFAULT_CONFIG,
|
|
239
|
-
execution: {
|
|
240
|
-
...DEFAULT_CONFIG.execution,
|
|
241
|
-
maxStoriesPerFeature: 5,
|
|
242
|
-
},
|
|
243
|
-
analyze: {
|
|
244
|
-
...DEFAULT_CONFIG.analyze,
|
|
245
|
-
llmEnhanced: false,
|
|
246
|
-
},
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
try {
|
|
250
|
-
// Should warn but not throw (changed from hard error to warning)
|
|
251
|
-
const prd = await analyzeFeature({
|
|
252
|
-
featureDir: featurePath,
|
|
253
|
-
featureName: "test",
|
|
254
|
-
branchName: "feat/test",
|
|
255
|
-
config,
|
|
256
|
-
});
|
|
257
|
-
expect(prd.userStories.length).toBe(6);
|
|
258
|
-
} finally {
|
|
259
|
-
rmSync(manyStoriesDir, { recursive: true });
|
|
260
|
-
}
|
|
261
|
-
});
|
|
262
|
-
});
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
// RE-ARCH: keep
|
|
2
|
-
/**
|
|
3
|
-
* Tests for Codebase Scanner
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { describe, expect, test } from "bun:test";
|
|
7
|
-
import { existsSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { scanCodebase } from "../../../src/analyze/scanner";
|
|
10
|
-
|
|
11
|
-
describe("scanCodebase", () => {
|
|
12
|
-
test("scans project codebase successfully", async () => {
|
|
13
|
-
// Use the nax project itself as test data
|
|
14
|
-
const workdir = join(import.meta.dir, "../..");
|
|
15
|
-
|
|
16
|
-
const scan = await scanCodebase(workdir);
|
|
17
|
-
|
|
18
|
-
// Should have file tree
|
|
19
|
-
expect(scan.fileTree).toBeTruthy();
|
|
20
|
-
expect(typeof scan.fileTree).toBe("string");
|
|
21
|
-
expect(scan.fileTree.length).toBeGreaterThan(0);
|
|
22
|
-
|
|
23
|
-
// Should have dependencies
|
|
24
|
-
expect(scan.dependencies).toBeDefined();
|
|
25
|
-
expect(typeof scan.dependencies).toBe("object");
|
|
26
|
-
|
|
27
|
-
// Should have dev dependencies
|
|
28
|
-
expect(scan.devDependencies).toBeDefined();
|
|
29
|
-
expect(typeof scan.devDependencies).toBe("object");
|
|
30
|
-
|
|
31
|
-
// Should detect test patterns
|
|
32
|
-
expect(scan.testPatterns).toBeDefined();
|
|
33
|
-
expect(Array.isArray(scan.testPatterns)).toBe(true);
|
|
34
|
-
expect(scan.testPatterns.length).toBeGreaterThan(0);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test("handles missing src directory", async () => {
|
|
38
|
-
const workdir = "/tmp/nax-test-no-src";
|
|
39
|
-
|
|
40
|
-
// Create temp dir without src/
|
|
41
|
-
await Bun.write(join(workdir, "package.json"), JSON.stringify({}));
|
|
42
|
-
|
|
43
|
-
const scan = await scanCodebase(workdir);
|
|
44
|
-
|
|
45
|
-
// Should return placeholder for missing src
|
|
46
|
-
expect(scan.fileTree).toBe("No src/ directory");
|
|
47
|
-
expect(scan.dependencies).toEqual({});
|
|
48
|
-
expect(scan.devDependencies).toEqual({});
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
test(
|
|
52
|
-
"extracts dependencies from package.json",
|
|
53
|
-
async () => {
|
|
54
|
-
const workdir = join(import.meta.dir, "../../..");
|
|
55
|
-
|
|
56
|
-
const scan = await scanCodebase(workdir);
|
|
57
|
-
|
|
58
|
-
// Should have zod dependency (from real package.json)
|
|
59
|
-
expect(scan.dependencies.zod).toBeTruthy();
|
|
60
|
-
expect(scan.dependencies.commander).toBeTruthy();
|
|
61
|
-
},
|
|
62
|
-
30000,
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
test(
|
|
66
|
-
"detects test framework",
|
|
67
|
-
async () => {
|
|
68
|
-
const workdir = join(import.meta.dir, "../../..");
|
|
69
|
-
|
|
70
|
-
const scan = await scanCodebase(workdir);
|
|
71
|
-
|
|
72
|
-
// Should detect bun:test (no framework in package.json)
|
|
73
|
-
const hasBunTest = scan.testPatterns.some((p) => p.includes("bun:test"));
|
|
74
|
-
expect(hasBunTest).toBe(true);
|
|
75
|
-
},
|
|
76
|
-
30000,
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
test(
|
|
80
|
-
"detects test directory",
|
|
81
|
-
async () => {
|
|
82
|
-
const workdir = join(import.meta.dir, "../../..");
|
|
83
|
-
|
|
84
|
-
const scan = await scanCodebase(workdir);
|
|
85
|
-
|
|
86
|
-
// Should detect test/ directory
|
|
87
|
-
const hasTestDir = scan.testPatterns.some((p) => p.includes("test/"));
|
|
88
|
-
expect(hasTestDir).toBe(true);
|
|
89
|
-
},
|
|
90
|
-
30000,
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
test(
|
|
94
|
-
"file tree respects max depth",
|
|
95
|
-
async () => {
|
|
96
|
-
const workdir = join(import.meta.dir, "../../..");
|
|
97
|
-
|
|
98
|
-
const scan = await scanCodebase(workdir);
|
|
99
|
-
|
|
100
|
-
// File tree should not be excessively deep (max depth 3)
|
|
101
|
-
const lines = scan.fileTree.split("\n");
|
|
102
|
-
const maxIndent = Math.max(
|
|
103
|
-
...lines.map((line) => {
|
|
104
|
-
const match = line.match(/^(│ {3}| {4})*/);
|
|
105
|
-
return match ? match[0].length / 4 : 0;
|
|
106
|
-
}),
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
// Max depth 3 means max indent of 2 (0-indexed)
|
|
110
|
-
expect(maxIndent).toBeLessThanOrEqual(3);
|
|
111
|
-
},
|
|
112
|
-
30000,
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
test(
|
|
116
|
-
"file tree includes directories and files",
|
|
117
|
-
async () => {
|
|
118
|
-
const workdir = join(import.meta.dir, "../../..");
|
|
119
|
-
|
|
120
|
-
const scan = await scanCodebase(workdir);
|
|
121
|
-
|
|
122
|
-
// Should contain directories (marked with trailing /)
|
|
123
|
-
const hasDirectories = scan.fileTree.includes("/");
|
|
124
|
-
expect(hasDirectories).toBe(true);
|
|
125
|
-
|
|
126
|
-
// Should contain some TypeScript files
|
|
127
|
-
const hasTsFiles = scan.fileTree.includes(".ts");
|
|
128
|
-
expect(hasTsFiles).toBe(true);
|
|
129
|
-
},
|
|
130
|
-
30000,
|
|
131
|
-
);
|
|
132
|
-
});
|