@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,355 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* loadOverride unit tests — PB-003
|
|
3
|
-
*
|
|
4
|
-
* Tests are expected to FAIL until src/prompts/loader.ts is implemented.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
8
|
-
import { chmodSync, mkdirSync, mkdtempSync, rmdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
9
|
-
import { tmpdir } from "node:os";
|
|
10
|
-
import { dirname, join } from "node:path";
|
|
11
|
-
import type { NaxConfig } from "../../../src/config/types";
|
|
12
|
-
import { loadOverride } from "../../../src/prompts/loader";
|
|
13
|
-
import type { PromptRole } from "../../../src/prompts/types";
|
|
14
|
-
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// Helpers
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
|
|
19
|
-
/** Minimal NaxConfig with only required fields (omit optional ones) */
|
|
20
|
-
function makeConfig(overrides: Partial<NaxConfig> = {}): NaxConfig {
|
|
21
|
-
return {
|
|
22
|
-
version: 1,
|
|
23
|
-
models: {
|
|
24
|
-
fast: { provider: "anthropic", model: "haiku" },
|
|
25
|
-
balanced: { provider: "anthropic", model: "sonnet" },
|
|
26
|
-
powerful: { provider: "anthropic", model: "opus" },
|
|
27
|
-
},
|
|
28
|
-
autoMode: {
|
|
29
|
-
enabled: true,
|
|
30
|
-
defaultAgent: "claude",
|
|
31
|
-
fallbackOrder: ["claude"],
|
|
32
|
-
complexityRouting: { simple: "fast", medium: "balanced", complex: "powerful", expert: "powerful" },
|
|
33
|
-
escalation: { enabled: true, tierOrder: [{ tier: "fast", attempts: 3 }] },
|
|
34
|
-
},
|
|
35
|
-
routing: { strategy: "keyword" },
|
|
36
|
-
execution: {
|
|
37
|
-
maxIterations: 10,
|
|
38
|
-
iterationDelayMs: 2000,
|
|
39
|
-
costLimit: 5,
|
|
40
|
-
sessionTimeoutSeconds: 600,
|
|
41
|
-
verificationTimeoutSeconds: 300,
|
|
42
|
-
maxStoriesPerFeature: 500,
|
|
43
|
-
rectification: {
|
|
44
|
-
enabled: true,
|
|
45
|
-
maxRetries: 2,
|
|
46
|
-
fullSuiteTimeoutSeconds: 120,
|
|
47
|
-
maxFailureSummaryChars: 2000,
|
|
48
|
-
abortOnIncreasingFailures: true,
|
|
49
|
-
},
|
|
50
|
-
regressionGate: { enabled: true, timeoutSeconds: 120 },
|
|
51
|
-
contextProviderTokenBudget: 2000,
|
|
52
|
-
},
|
|
53
|
-
quality: {
|
|
54
|
-
requireTypecheck: true,
|
|
55
|
-
requireLint: true,
|
|
56
|
-
requireTests: true,
|
|
57
|
-
commands: {},
|
|
58
|
-
forceExit: false,
|
|
59
|
-
detectOpenHandles: true,
|
|
60
|
-
detectOpenHandlesRetries: 1,
|
|
61
|
-
gracePeriodMs: 5000,
|
|
62
|
-
dangerouslySkipPermissions: true,
|
|
63
|
-
drainTimeoutMs: 2000,
|
|
64
|
-
shell: "/bin/sh",
|
|
65
|
-
stripEnvVars: [],
|
|
66
|
-
environmentalEscalationDivisor: 2,
|
|
67
|
-
},
|
|
68
|
-
tdd: {
|
|
69
|
-
maxRetries: 2,
|
|
70
|
-
autoVerifyIsolation: true,
|
|
71
|
-
strategy: "auto",
|
|
72
|
-
autoApproveVerifier: true,
|
|
73
|
-
},
|
|
74
|
-
constitution: { enabled: false, path: "constitution.md", maxTokens: 2000 },
|
|
75
|
-
analyze: { llmEnhanced: false, model: "balanced", fallbackToKeywords: true, maxCodebaseSummaryTokens: 5000 },
|
|
76
|
-
review: { enabled: false, checks: [], commands: {} },
|
|
77
|
-
plan: { model: "balanced", outputPath: "spec.md" },
|
|
78
|
-
acceptance: { enabled: false, maxRetries: 2, generateTests: false, testPath: "acceptance.test.ts" },
|
|
79
|
-
context: {
|
|
80
|
-
testCoverage: {
|
|
81
|
-
enabled: false,
|
|
82
|
-
detail: "names-only",
|
|
83
|
-
maxTokens: 500,
|
|
84
|
-
testPattern: "**/*.test.ts",
|
|
85
|
-
scopeToStory: false,
|
|
86
|
-
},
|
|
87
|
-
autoDetect: { enabled: false, maxFiles: 5, traceImports: false },
|
|
88
|
-
},
|
|
89
|
-
...overrides,
|
|
90
|
-
} as NaxConfig;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
// Fixtures
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
|
-
|
|
97
|
-
let tmpDir: string;
|
|
98
|
-
let createdFiles: string[] = [];
|
|
99
|
-
|
|
100
|
-
beforeEach(() => {
|
|
101
|
-
tmpDir = mkdtempSync(join(tmpdir(), "nax-loader-test-"));
|
|
102
|
-
createdFiles = [];
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
afterEach(() => {
|
|
106
|
-
// Clean up any chmod'd files by restoring permissions first
|
|
107
|
-
for (const f of createdFiles) {
|
|
108
|
-
try {
|
|
109
|
-
chmodSync(f, 0o644);
|
|
110
|
-
unlinkSync(f);
|
|
111
|
-
} catch {
|
|
112
|
-
// best-effort
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
try {
|
|
116
|
-
rmdirSync(tmpDir, { recursive: true });
|
|
117
|
-
} catch {
|
|
118
|
-
// best-effort
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
function writeOverrideFile(relPath: string, content: string): string {
|
|
123
|
-
const abs = join(tmpDir, relPath);
|
|
124
|
-
mkdirSync(dirname(abs), { recursive: true });
|
|
125
|
-
writeFileSync(abs, content, "utf8");
|
|
126
|
-
createdFiles.push(abs);
|
|
127
|
-
return relPath; // return relative path for use in config
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// 1. Returns null when config.prompts is undefined
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
|
|
134
|
-
describe("loadOverride — config.prompts absent", () => {
|
|
135
|
-
test("returns null when config has no prompts block", async () => {
|
|
136
|
-
const config = makeConfig(); // no prompts field
|
|
137
|
-
const result = await loadOverride("test-writer", tmpDir, config);
|
|
138
|
-
expect(result).toBeNull();
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
test("returns null for every role when config.prompts is absent", async () => {
|
|
142
|
-
const config = makeConfig();
|
|
143
|
-
const roles: PromptRole[] = ["test-writer", "implementer", "verifier", "single-session"];
|
|
144
|
-
for (const role of roles) {
|
|
145
|
-
const result = await loadOverride(role, tmpDir, config);
|
|
146
|
-
expect(result).toBeNull();
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
// ---------------------------------------------------------------------------
|
|
152
|
-
// 2. Returns null when prompts.overrides has no key for the role
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
|
|
155
|
-
describe("loadOverride — role key absent in overrides", () => {
|
|
156
|
-
test("returns null when overrides map is empty", async () => {
|
|
157
|
-
const config = makeConfig({ prompts: { overrides: {} } });
|
|
158
|
-
const result = await loadOverride("implementer", tmpDir, config);
|
|
159
|
-
expect(result).toBeNull();
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
test("returns null when only other roles are configured", async () => {
|
|
163
|
-
const relPath = writeOverrideFile(".nax/prompts/implementer.md", "# Implementer");
|
|
164
|
-
const config = makeConfig({
|
|
165
|
-
prompts: { overrides: { implementer: relPath } },
|
|
166
|
-
});
|
|
167
|
-
// ask for test-writer — not configured
|
|
168
|
-
const result = await loadOverride("test-writer", tmpDir, config);
|
|
169
|
-
expect(result).toBeNull();
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
// ---------------------------------------------------------------------------
|
|
174
|
-
// 3. Returns null when file path is set but file does not exist
|
|
175
|
-
// ---------------------------------------------------------------------------
|
|
176
|
-
|
|
177
|
-
describe("loadOverride — file missing", () => {
|
|
178
|
-
test("returns null when file at configured path does not exist", async () => {
|
|
179
|
-
const config = makeConfig({
|
|
180
|
-
prompts: { overrides: { "test-writer": ".nax/prompts/missing.md" } },
|
|
181
|
-
});
|
|
182
|
-
const result = await loadOverride("test-writer", tmpDir, config);
|
|
183
|
-
expect(result).toBeNull();
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
test("returns null for a deeply nested nonexistent path", async () => {
|
|
187
|
-
const config = makeConfig({
|
|
188
|
-
prompts: { overrides: { verifier: "deeply/nested/nonexistent/path/verifier.md" } },
|
|
189
|
-
});
|
|
190
|
-
const result = await loadOverride("verifier", tmpDir, config);
|
|
191
|
-
expect(result).toBeNull();
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
// ---------------------------------------------------------------------------
|
|
196
|
-
// 4. Returns file content when file exists
|
|
197
|
-
// ---------------------------------------------------------------------------
|
|
198
|
-
|
|
199
|
-
describe("loadOverride — file exists", () => {
|
|
200
|
-
test("returns file content for test-writer", async () => {
|
|
201
|
-
const content = "# Test Writer Override\nWrite tests first.";
|
|
202
|
-
const relPath = writeOverrideFile(".nax/prompts/test-writer.md", content);
|
|
203
|
-
const config = makeConfig({ prompts: { overrides: { "test-writer": relPath } } });
|
|
204
|
-
|
|
205
|
-
const result = await loadOverride("test-writer", tmpDir, config);
|
|
206
|
-
expect(result).toBe(content);
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
test("returns file content for implementer", async () => {
|
|
210
|
-
const content = "# Implementer Override\nImplement the feature.";
|
|
211
|
-
const relPath = writeOverrideFile(".nax/prompts/implementer.md", content);
|
|
212
|
-
const config = makeConfig({ prompts: { overrides: { implementer: relPath } } });
|
|
213
|
-
|
|
214
|
-
const result = await loadOverride("implementer", tmpDir, config);
|
|
215
|
-
expect(result).toBe(content);
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
test("returns file content for verifier", async () => {
|
|
219
|
-
const content = "# Verifier Override\nVerify correctness.";
|
|
220
|
-
const relPath = writeOverrideFile(".nax/prompts/verifier.md", content);
|
|
221
|
-
const config = makeConfig({ prompts: { overrides: { verifier: relPath } } });
|
|
222
|
-
|
|
223
|
-
const result = await loadOverride("verifier", tmpDir, config);
|
|
224
|
-
expect(result).toBe(content);
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
test("returns file content for single-session", async () => {
|
|
228
|
-
const content = "# Single Session Override\nDo everything in one session.";
|
|
229
|
-
const relPath = writeOverrideFile(".nax/prompts/single-session.md", content);
|
|
230
|
-
const config = makeConfig({ prompts: { overrides: { "single-session": relPath } } });
|
|
231
|
-
|
|
232
|
-
const result = await loadOverride("single-session", tmpDir, config);
|
|
233
|
-
expect(result).toBe(content);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
test("resolves path relative to workdir, not process.cwd()", async () => {
|
|
237
|
-
const content = "RELATIVE_PATH_CONTENT";
|
|
238
|
-
const relPath = writeOverrideFile("custom-override.md", content);
|
|
239
|
-
const config = makeConfig({ prompts: { overrides: { implementer: relPath } } });
|
|
240
|
-
|
|
241
|
-
// tmpDir is the workdir — file lives at join(tmpDir, relPath)
|
|
242
|
-
const result = await loadOverride("implementer", tmpDir, config);
|
|
243
|
-
expect(result).toBe(content);
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
test("reads multiline markdown correctly", async () => {
|
|
247
|
-
const content = "# Title\n\n## Section\n\nSome content here.\n\n- item 1\n- item 2\n";
|
|
248
|
-
const relPath = writeOverrideFile("multiline.md", content);
|
|
249
|
-
const config = makeConfig({ prompts: { overrides: { verifier: relPath } } });
|
|
250
|
-
|
|
251
|
-
const result = await loadOverride("verifier", tmpDir, config);
|
|
252
|
-
expect(result).toBe(content);
|
|
253
|
-
});
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
// ---------------------------------------------------------------------------
|
|
257
|
-
// 5. Throws on unreadable file (permissions error)
|
|
258
|
-
// ---------------------------------------------------------------------------
|
|
259
|
-
|
|
260
|
-
describe("loadOverride — permission error", () => {
|
|
261
|
-
const skipOnCI = process.env.CI ? test.skip : test;
|
|
262
|
-
|
|
263
|
-
skipOnCI("throws a descriptive error when file is not readable", async () => {
|
|
264
|
-
const content = "SECRET";
|
|
265
|
-
const relPath = writeOverrideFile(".nax/prompts/locked.md", content);
|
|
266
|
-
const absPath = join(tmpDir, relPath);
|
|
267
|
-
|
|
268
|
-
// Remove read permission
|
|
269
|
-
chmodSync(absPath, 0o000);
|
|
270
|
-
|
|
271
|
-
const config = makeConfig({ prompts: { overrides: { "test-writer": relPath } } });
|
|
272
|
-
|
|
273
|
-
await expect(loadOverride("test-writer", tmpDir, config)).rejects.toThrow();
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
skipOnCI("error message mentions the role or path when unreadable", async () => {
|
|
277
|
-
const content = "SECRET";
|
|
278
|
-
const relPath = writeOverrideFile(".nax/prompts/locked2.md", content);
|
|
279
|
-
const absPath = join(tmpDir, relPath);
|
|
280
|
-
|
|
281
|
-
chmodSync(absPath, 0o000);
|
|
282
|
-
|
|
283
|
-
const config = makeConfig({ prompts: { overrides: { implementer: relPath } } });
|
|
284
|
-
|
|
285
|
-
let errorMessage = "";
|
|
286
|
-
try {
|
|
287
|
-
await loadOverride("implementer", tmpDir, config);
|
|
288
|
-
} catch (err) {
|
|
289
|
-
errorMessage = err instanceof Error ? err.message : String(err);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Error should mention something meaningful (path or role)
|
|
293
|
-
expect(errorMessage.length).toBeGreaterThan(0);
|
|
294
|
-
const lowerMsg = errorMessage.toLowerCase();
|
|
295
|
-
const mentionsSomethingUseful =
|
|
296
|
-
lowerMsg.includes("locked2") ||
|
|
297
|
-
lowerMsg.includes("implementer") ||
|
|
298
|
-
lowerMsg.includes("unreadable") ||
|
|
299
|
-
lowerMsg.includes("permission") ||
|
|
300
|
-
lowerMsg.includes("cannot read") ||
|
|
301
|
-
lowerMsg.includes("eacces");
|
|
302
|
-
expect(mentionsSomethingUseful).toBe(true);
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
// ---------------------------------------------------------------------------
|
|
307
|
-
// 6. Template stubs export defaultTemplate
|
|
308
|
-
// ---------------------------------------------------------------------------
|
|
309
|
-
|
|
310
|
-
describe("src/prompts/templates — default exports exist", () => {
|
|
311
|
-
test("test-writer template exports a string", async () => {
|
|
312
|
-
const mod = await import("../../../src/prompts/templates/test-writer");
|
|
313
|
-
expect(typeof mod.defaultTemplate).toBe("string");
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
test("implementer template exports a string", async () => {
|
|
317
|
-
const mod = await import("../../../src/prompts/templates/implementer");
|
|
318
|
-
expect(typeof mod.defaultTemplate).toBe("string");
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
test("verifier template exports a string", async () => {
|
|
322
|
-
const mod = await import("../../../src/prompts/templates/verifier");
|
|
323
|
-
expect(typeof mod.defaultTemplate).toBe("string");
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
test("single-session template exports a string", async () => {
|
|
327
|
-
const mod = await import("../../../src/prompts/templates/single-session");
|
|
328
|
-
expect(typeof mod.defaultTemplate).toBe("string");
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
// ---------------------------------------------------------------------------
|
|
333
|
-
// 7. NaxConfig accepts prompts field
|
|
334
|
-
// ---------------------------------------------------------------------------
|
|
335
|
-
|
|
336
|
-
describe("NaxConfig.prompts type shape", () => {
|
|
337
|
-
test("config with prompts.overrides is accepted by makeConfig", () => {
|
|
338
|
-
// If TypeScript compiles this without error, the type is correct
|
|
339
|
-
const config = makeConfig({
|
|
340
|
-
prompts: {
|
|
341
|
-
overrides: {
|
|
342
|
-
"test-writer": ".nax/prompts/tw.md",
|
|
343
|
-
implementer: ".nax/prompts/impl.md",
|
|
344
|
-
},
|
|
345
|
-
},
|
|
346
|
-
});
|
|
347
|
-
expect(config.prompts?.overrides?.["test-writer"]).toBe(".nax/prompts/tw.md");
|
|
348
|
-
expect(config.prompts?.overrides?.implementer).toBe(".nax/prompts/impl.md");
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
test("config without prompts block compiles fine", () => {
|
|
352
|
-
const config = makeConfig();
|
|
353
|
-
expect(config.prompts).toBeUndefined();
|
|
354
|
-
});
|
|
355
|
-
});
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { buildConventionsSection } from "../../../../src/prompts/sections/conventions";
|
|
3
|
-
|
|
4
|
-
describe("buildConventionsSection", () => {
|
|
5
|
-
test("includes bun test scoping warning", () => {
|
|
6
|
-
const result = buildConventionsSection();
|
|
7
|
-
expect(result).toContain("bun test");
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
test("includes commit message instruction", () => {
|
|
11
|
-
const result = buildConventionsSection();
|
|
12
|
-
expect(result).toContain("commit");
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test("includes context about test filtering", () => {
|
|
16
|
-
const result = buildConventionsSection();
|
|
17
|
-
expect(result).toContain("specific");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
test("returns non-empty string", () => {
|
|
21
|
-
const result = buildConventionsSection();
|
|
22
|
-
expect(result.length).toBeGreaterThan(0);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test("is a pure function", () => {
|
|
26
|
-
const result1 = buildConventionsSection();
|
|
27
|
-
const result2 = buildConventionsSection();
|
|
28
|
-
expect(result1).toEqual(result2);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { buildIsolationSection } from "../../../../src/prompts/sections/isolation";
|
|
3
|
-
|
|
4
|
-
describe("buildIsolationSection", () => {
|
|
5
|
-
test("strict mode forbids src/ modification", () => {
|
|
6
|
-
const result = buildIsolationSection("strict");
|
|
7
|
-
expect(result).toContain("Do NOT modify");
|
|
8
|
-
expect(result).toContain("src/");
|
|
9
|
-
expect(result).not.toContain("MAY read src/");
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
test("lite mode allows reading src/", () => {
|
|
13
|
-
const result = buildIsolationSection("lite");
|
|
14
|
-
expect(result).toContain("MAY read src/");
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
test("lite mode mentions stubs", () => {
|
|
18
|
-
const result = buildIsolationSection("lite");
|
|
19
|
-
expect(result).toContain("stub");
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test("both modes include test filtering rule", () => {
|
|
23
|
-
const strictResult = buildIsolationSection("strict");
|
|
24
|
-
const liteResult = buildIsolationSection("lite");
|
|
25
|
-
expect(strictResult).toContain("bun test");
|
|
26
|
-
expect(liteResult).toContain("bun test");
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("returns non-empty string", () => {
|
|
30
|
-
const strict = buildIsolationSection("strict");
|
|
31
|
-
const lite = buildIsolationSection("lite");
|
|
32
|
-
expect(strict.length).toBeGreaterThan(0);
|
|
33
|
-
expect(lite.length).toBeGreaterThan(0);
|
|
34
|
-
});
|
|
35
|
-
});
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { buildRoleTaskSection } from "../../../../src/prompts/sections/role-task";
|
|
3
|
-
|
|
4
|
-
describe("buildRoleTaskSection", () => {
|
|
5
|
-
test("standard variant says 'make failing tests pass'", () => {
|
|
6
|
-
const result = buildRoleTaskSection("standard");
|
|
7
|
-
expect(result).toContain("make failing tests pass");
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
test("standard variant says 'Do NOT modify test files'", () => {
|
|
11
|
-
const result = buildRoleTaskSection("standard");
|
|
12
|
-
expect(result).toContain("Do NOT modify test files");
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test("lite variant says 'Write tests first'", () => {
|
|
16
|
-
const result = buildRoleTaskSection("lite");
|
|
17
|
-
expect(result).toContain("Write tests first");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
test("lite variant says 'implement'", () => {
|
|
21
|
-
const result = buildRoleTaskSection("lite");
|
|
22
|
-
expect(result).toContain("implement");
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
test("returns non-empty string for standard", () => {
|
|
26
|
-
const result = buildRoleTaskSection("standard");
|
|
27
|
-
expect(result.length).toBeGreaterThan(0);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test("returns non-empty string for lite", () => {
|
|
31
|
-
const result = buildRoleTaskSection("lite");
|
|
32
|
-
expect(result.length).toBeGreaterThan(0);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
test("standard and lite have different content", () => {
|
|
36
|
-
const standard = buildRoleTaskSection("standard");
|
|
37
|
-
const lite = buildRoleTaskSection("lite");
|
|
38
|
-
expect(standard).not.toEqual(lite);
|
|
39
|
-
});
|
|
40
|
-
});
|