@nathapp/nax 0.50.3 → 0.51.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 +30 -0
- package/dist/nax.js +393 -197
- package/package.json +1 -3
- package/bin/nax.ts +0 -1195
- package/src/acceptance/fix-generator.ts +0 -322
- package/src/acceptance/generator.ts +0 -415
- package/src/acceptance/index.ts +0 -42
- package/src/acceptance/refinement.ts +0 -224
- package/src/acceptance/templates/cli.ts +0 -47
- package/src/acceptance/templates/component.ts +0 -78
- package/src/acceptance/templates/e2e.ts +0 -43
- package/src/acceptance/templates/index.ts +0 -21
- package/src/acceptance/templates/snapshot.ts +0 -50
- package/src/acceptance/templates/unit.ts +0 -48
- package/src/acceptance/types.ts +0 -138
- package/src/agents/acp/adapter.ts +0 -888
- package/src/agents/acp/cost.ts +0 -9
- package/src/agents/acp/index.ts +0 -7
- package/src/agents/acp/interaction-bridge.ts +0 -126
- package/src/agents/acp/parser.ts +0 -119
- package/src/agents/acp/spawn-client.ts +0 -373
- package/src/agents/acp/types.ts +0 -22
- package/src/agents/aider/adapter.ts +0 -135
- package/src/agents/claude/adapter.ts +0 -258
- package/src/agents/claude/complete.ts +0 -80
- package/src/agents/claude/cost.ts +0 -16
- package/src/agents/claude/execution.ts +0 -215
- package/src/agents/claude/index.ts +0 -3
- package/src/agents/claude/interactive.ts +0 -77
- package/src/agents/claude/plan.ts +0 -179
- package/src/agents/codex/adapter.ts +0 -153
- package/src/agents/cost/calculate.ts +0 -154
- package/src/agents/cost/index.ts +0 -10
- package/src/agents/cost/parse.ts +0 -97
- package/src/agents/cost/pricing.ts +0 -59
- package/src/agents/cost/types.ts +0 -45
- package/src/agents/gemini/adapter.ts +0 -177
- package/src/agents/index.ts +0 -18
- package/src/agents/opencode/adapter.ts +0 -106
- package/src/agents/registry.ts +0 -136
- package/src/agents/shared/decompose.ts +0 -154
- package/src/agents/shared/model-resolution.ts +0 -43
- package/src/agents/shared/types-extended.ts +0 -164
- package/src/agents/shared/validation.ts +0 -69
- package/src/agents/shared/version-detection.ts +0 -109
- package/src/agents/types.ts +0 -205
- package/src/analyze/classifier.ts +0 -282
- package/src/analyze/index.ts +0 -16
- package/src/analyze/scanner.ts +0 -171
- package/src/analyze/types.ts +0 -51
- package/src/cli/accept.ts +0 -108
- package/src/cli/agents.ts +0 -87
- package/src/cli/analyze-parser.ts +0 -291
- package/src/cli/analyze.ts +0 -352
- package/src/cli/config-descriptions.ts +0 -219
- package/src/cli/config-diff.ts +0 -103
- package/src/cli/config-display.ts +0 -285
- package/src/cli/config-get.ts +0 -55
- package/src/cli/config.ts +0 -14
- package/src/cli/constitution.ts +0 -17
- package/src/cli/diagnose-analysis.ts +0 -159
- package/src/cli/diagnose-formatter.ts +0 -87
- package/src/cli/diagnose.ts +0 -203
- package/src/cli/generate.ts +0 -250
- package/src/cli/index.ts +0 -42
- package/src/cli/init-context.ts +0 -405
- package/src/cli/init-detect.ts +0 -303
- package/src/cli/init.ts +0 -296
- package/src/cli/interact.ts +0 -295
- package/src/cli/plan.ts +0 -509
- package/src/cli/plugins.ts +0 -122
- package/src/cli/prompts-export.ts +0 -58
- package/src/cli/prompts-init.ts +0 -200
- package/src/cli/prompts-main.ts +0 -183
- package/src/cli/prompts-shared.ts +0 -70
- package/src/cli/prompts-tdd.ts +0 -88
- package/src/cli/prompts.ts +0 -17
- package/src/cli/runs.ts +0 -174
- package/src/cli/status-cost.ts +0 -151
- package/src/cli/status-features.ts +0 -405
- package/src/cli/status.ts +0 -13
- package/src/commands/common.ts +0 -171
- package/src/commands/diagnose.ts +0 -17
- package/src/commands/index.ts +0 -9
- package/src/commands/logs-formatter.ts +0 -201
- package/src/commands/logs-reader.ts +0 -171
- package/src/commands/logs.ts +0 -103
- package/src/commands/precheck.ts +0 -86
- package/src/commands/runs.ts +0 -220
- package/src/commands/unlock.ts +0 -96
- package/src/config/defaults.ts +0 -218
- package/src/config/index.ts +0 -22
- package/src/config/loader.ts +0 -143
- package/src/config/merge.ts +0 -106
- package/src/config/merger.ts +0 -147
- package/src/config/path-security.ts +0 -121
- package/src/config/paths.ts +0 -27
- package/src/config/permissions.ts +0 -63
- package/src/config/runtime-types.ts +0 -522
- package/src/config/schema-types.ts +0 -53
- package/src/config/schema.ts +0 -60
- package/src/config/schemas.ts +0 -426
- package/src/config/test-strategy.ts +0 -71
- package/src/config/types.ts +0 -57
- package/src/config/validate.ts +0 -103
- package/src/constitution/generator.ts +0 -158
- package/src/constitution/generators/aider.ts +0 -41
- package/src/constitution/generators/claude.ts +0 -35
- package/src/constitution/generators/cursor.ts +0 -36
- package/src/constitution/generators/opencode.ts +0 -38
- package/src/constitution/generators/types.ts +0 -33
- package/src/constitution/generators/windsurf.ts +0 -36
- package/src/constitution/index.ts +0 -11
- package/src/constitution/loader.ts +0 -121
- package/src/constitution/types.ts +0 -31
- package/src/context/auto-detect.ts +0 -228
- package/src/context/builder.ts +0 -299
- package/src/context/elements.ts +0 -122
- package/src/context/formatter.ts +0 -107
- package/src/context/generator.ts +0 -343
- package/src/context/generators/aider.ts +0 -34
- package/src/context/generators/claude.ts +0 -28
- package/src/context/generators/codex.ts +0 -28
- package/src/context/generators/cursor.ts +0 -28
- package/src/context/generators/gemini.ts +0 -28
- package/src/context/generators/opencode.ts +0 -30
- package/src/context/generators/windsurf.ts +0 -28
- package/src/context/greenfield.ts +0 -114
- package/src/context/index.ts +0 -34
- package/src/context/injector.ts +0 -279
- package/src/context/parent-context.ts +0 -39
- package/src/context/test-scanner.ts +0 -370
- package/src/context/types.ts +0 -98
- package/src/decompose/apply.ts +0 -50
- package/src/decompose/builder.ts +0 -181
- package/src/decompose/index.ts +0 -8
- package/src/decompose/sections/codebase.ts +0 -26
- package/src/decompose/sections/constraints.ts +0 -32
- package/src/decompose/sections/index.ts +0 -4
- package/src/decompose/sections/sibling-stories.ts +0 -25
- package/src/decompose/sections/target-story.ts +0 -31
- package/src/decompose/types.ts +0 -55
- package/src/decompose/validators/complexity.ts +0 -45
- package/src/decompose/validators/coverage.ts +0 -134
- package/src/decompose/validators/dependency.ts +0 -91
- package/src/decompose/validators/index.ts +0 -35
- package/src/decompose/validators/overlap.ts +0 -128
- package/src/errors.ts +0 -67
- package/src/execution/batching.ts +0 -157
- package/src/execution/crash-heartbeat.ts +0 -77
- package/src/execution/crash-recovery.ts +0 -79
- package/src/execution/crash-signals.ts +0 -165
- package/src/execution/crash-writer.ts +0 -154
- package/src/execution/deferred-review.ts +0 -105
- package/src/execution/dry-run.ts +0 -81
- package/src/execution/escalation/escalation.ts +0 -46
- package/src/execution/escalation/index.ts +0 -13
- package/src/execution/escalation/tier-escalation.ts +0 -346
- package/src/execution/escalation/tier-outcome.ts +0 -143
- package/src/execution/executor-types.ts +0 -73
- package/src/execution/helpers.ts +0 -38
- package/src/execution/index.ts +0 -27
- package/src/execution/iteration-runner.ts +0 -160
- package/src/execution/lifecycle/acceptance-loop.ts +0 -309
- package/src/execution/lifecycle/headless-formatter.ts +0 -83
- package/src/execution/lifecycle/index.ts +0 -11
- package/src/execution/lifecycle/parallel-lifecycle.ts +0 -101
- package/src/execution/lifecycle/precheck-runner.ts +0 -140
- package/src/execution/lifecycle/run-cleanup.ts +0 -81
- package/src/execution/lifecycle/run-completion.ts +0 -247
- package/src/execution/lifecycle/run-initialization.ts +0 -187
- package/src/execution/lifecycle/run-regression.ts +0 -305
- package/src/execution/lifecycle/run-setup.ts +0 -240
- package/src/execution/lifecycle/story-size-prompts.ts +0 -123
- package/src/execution/lock.ts +0 -129
- package/src/execution/parallel-coordinator.ts +0 -281
- package/src/execution/parallel-executor-rectification-pass.ts +0 -117
- package/src/execution/parallel-executor-rectify.ts +0 -136
- package/src/execution/parallel-executor.ts +0 -330
- package/src/execution/parallel-worker.ts +0 -149
- package/src/execution/parallel.ts +0 -13
- package/src/execution/pid-registry.ts +0 -275
- package/src/execution/pipeline-result-handler.ts +0 -221
- package/src/execution/progress.ts +0 -27
- package/src/execution/queue-handler.ts +0 -109
- package/src/execution/runner-completion.ts +0 -171
- package/src/execution/runner-execution.ts +0 -243
- package/src/execution/runner-setup.ts +0 -86
- package/src/execution/runner.ts +0 -265
- package/src/execution/sequential-executor.ts +0 -219
- package/src/execution/status-file.ts +0 -264
- package/src/execution/status-writer.ts +0 -181
- package/src/execution/story-context.ts +0 -266
- package/src/execution/story-selector.ts +0 -76
- package/src/execution/test-output-parser.ts +0 -14
- package/src/execution/timeout-handler.ts +0 -100
- package/src/hooks/index.ts +0 -2
- package/src/hooks/runner.ts +0 -280
- package/src/hooks/types.ts +0 -79
- package/src/interaction/chain.ts +0 -170
- package/src/interaction/index.ts +0 -61
- package/src/interaction/init.ts +0 -84
- package/src/interaction/plugins/auto.ts +0 -243
- package/src/interaction/plugins/cli.ts +0 -300
- package/src/interaction/plugins/telegram.ts +0 -384
- package/src/interaction/plugins/webhook.ts +0 -286
- package/src/interaction/state.ts +0 -171
- package/src/interaction/triggers.ts +0 -250
- package/src/interaction/types.ts +0 -170
- package/src/logger/formatters.ts +0 -84
- package/src/logger/index.ts +0 -16
- package/src/logger/logger.ts +0 -296
- package/src/logger/types.ts +0 -48
- package/src/logging/formatter.ts +0 -355
- package/src/logging/index.ts +0 -22
- package/src/logging/types.ts +0 -93
- package/src/metrics/aggregator.ts +0 -191
- package/src/metrics/index.ts +0 -14
- package/src/metrics/tracker.ts +0 -200
- package/src/metrics/types.ts +0 -115
- package/src/optimizer/index.ts +0 -63
- package/src/optimizer/noop.optimizer.ts +0 -24
- package/src/optimizer/rule-based.optimizer.ts +0 -248
- package/src/optimizer/types.ts +0 -53
- package/src/pipeline/event-bus.ts +0 -297
- package/src/pipeline/events.ts +0 -130
- package/src/pipeline/index.ts +0 -19
- package/src/pipeline/runner.ts +0 -149
- package/src/pipeline/stages/acceptance-setup.ts +0 -144
- package/src/pipeline/stages/acceptance.ts +0 -215
- package/src/pipeline/stages/autofix.ts +0 -262
- package/src/pipeline/stages/completion.ts +0 -110
- package/src/pipeline/stages/constitution.ts +0 -63
- package/src/pipeline/stages/context.ts +0 -122
- package/src/pipeline/stages/execution.ts +0 -359
- package/src/pipeline/stages/index.ts +0 -86
- package/src/pipeline/stages/optimizer.ts +0 -74
- package/src/pipeline/stages/prompt.ts +0 -79
- package/src/pipeline/stages/queue-check.ts +0 -103
- package/src/pipeline/stages/rectify.ts +0 -101
- package/src/pipeline/stages/regression.ts +0 -99
- package/src/pipeline/stages/review.ts +0 -94
- package/src/pipeline/stages/routing.ts +0 -276
- package/src/pipeline/stages/verify.ts +0 -286
- package/src/pipeline/subscribers/events-writer.ts +0 -135
- package/src/pipeline/subscribers/hooks.ts +0 -179
- package/src/pipeline/subscribers/interaction.ts +0 -103
- package/src/pipeline/subscribers/registry.ts +0 -73
- package/src/pipeline/subscribers/reporters.ts +0 -174
- package/src/pipeline/types.ts +0 -220
- package/src/plugins/extensions.ts +0 -225
- package/src/plugins/index.ts +0 -33
- package/src/plugins/loader.ts +0 -352
- package/src/plugins/plugin-logger.ts +0 -41
- package/src/plugins/registry.ts +0 -168
- package/src/plugins/types.ts +0 -206
- package/src/plugins/validator.ts +0 -352
- package/src/prd/index.ts +0 -220
- package/src/prd/schema.ts +0 -268
- package/src/prd/types.ts +0 -273
- package/src/prd/validate.ts +0 -41
- package/src/precheck/checks-agents.ts +0 -63
- package/src/precheck/checks-blockers.ts +0 -23
- package/src/precheck/checks-cli.ts +0 -68
- package/src/precheck/checks-config.ts +0 -102
- package/src/precheck/checks-git.ts +0 -117
- package/src/precheck/checks-system.ts +0 -101
- package/src/precheck/checks-warnings.ts +0 -221
- package/src/precheck/checks.ts +0 -36
- package/src/precheck/index.ts +0 -374
- package/src/precheck/story-size-gate.ts +0 -144
- package/src/precheck/types.ts +0 -31
- package/src/prompts/builder.ts +0 -166
- package/src/prompts/index.ts +0 -2
- package/src/prompts/loader.ts +0 -43
- package/src/prompts/sections/conventions.ts +0 -19
- package/src/prompts/sections/hermetic.ts +0 -41
- package/src/prompts/sections/index.ts +0 -12
- package/src/prompts/sections/isolation.ts +0 -70
- package/src/prompts/sections/role-task.ts +0 -182
- package/src/prompts/sections/story.ts +0 -55
- package/src/prompts/sections/verdict.ts +0 -70
- package/src/prompts/types.ts +0 -21
- package/src/queue/index.ts +0 -2
- package/src/queue/manager.ts +0 -254
- package/src/queue/types.ts +0 -54
- package/src/review/index.ts +0 -8
- package/src/review/orchestrator.ts +0 -154
- package/src/review/runner.ts +0 -303
- package/src/review/types.ts +0 -70
- package/src/routing/batch-route.ts +0 -35
- package/src/routing/builder.ts +0 -81
- package/src/routing/chain.ts +0 -75
- package/src/routing/content-hash.ts +0 -25
- package/src/routing/index.ts +0 -20
- package/src/routing/loader.ts +0 -62
- package/src/routing/router.ts +0 -305
- package/src/routing/strategies/adaptive.ts +0 -215
- package/src/routing/strategies/index.ts +0 -8
- package/src/routing/strategies/keyword.ts +0 -180
- package/src/routing/strategies/llm-prompts.ts +0 -224
- package/src/routing/strategies/llm.ts +0 -320
- package/src/routing/strategies/manual.ts +0 -50
- package/src/routing/strategy.ts +0 -102
- package/src/tdd/cleanup.ts +0 -120
- package/src/tdd/index.ts +0 -22
- package/src/tdd/isolation.ts +0 -117
- package/src/tdd/orchestrator.ts +0 -406
- package/src/tdd/prompts.ts +0 -40
- package/src/tdd/rectification-gate.ts +0 -274
- package/src/tdd/session-runner.ts +0 -263
- package/src/tdd/types.ts +0 -84
- package/src/tdd/verdict-reader.ts +0 -266
- package/src/tdd/verdict.ts +0 -152
- package/src/tui/App.tsx +0 -265
- package/src/tui/components/AgentPanel.tsx +0 -75
- package/src/tui/components/CostOverlay.tsx +0 -118
- package/src/tui/components/HelpOverlay.tsx +0 -107
- package/src/tui/components/StatusBar.tsx +0 -63
- package/src/tui/components/StoriesPanel.tsx +0 -177
- package/src/tui/hooks/useKeyboard.ts +0 -142
- package/src/tui/hooks/useLayout.ts +0 -137
- package/src/tui/hooks/usePipelineEvents.ts +0 -183
- package/src/tui/hooks/usePty.ts +0 -189
- package/src/tui/index.tsx +0 -38
- package/src/tui/types.ts +0 -76
- package/src/utils/errors.ts +0 -12
- package/src/utils/git.ts +0 -245
- package/src/utils/json-file.ts +0 -72
- package/src/utils/log-test-output.ts +0 -25
- package/src/utils/path-security.ts +0 -73
- package/src/utils/queue-writer.ts +0 -54
- package/src/verification/crash-detector.ts +0 -34
- package/src/verification/executor.ts +0 -250
- package/src/verification/index.ts +0 -12
- package/src/verification/orchestrator-types.ts +0 -154
- package/src/verification/orchestrator.ts +0 -76
- package/src/verification/parser.ts +0 -220
- package/src/verification/rectification-loop.ts +0 -172
- package/src/verification/rectification.ts +0 -108
- package/src/verification/runners.ts +0 -129
- package/src/verification/smart-runner.ts +0 -307
- package/src/verification/strategies/acceptance.ts +0 -136
- package/src/verification/strategies/regression.ts +0 -90
- package/src/verification/strategies/scoped.ts +0 -154
- package/src/verification/types.ts +0 -117
- package/src/version.ts +0 -40
- package/src/worktree/dispatcher.ts +0 -6
- package/src/worktree/index.ts +0 -2
- package/src/worktree/manager.ts +0 -193
- package/src/worktree/merge.ts +0 -302
- package/src/worktree/types.ts +0 -4
package/src/config/schemas.ts
DELETED
|
@@ -1,426 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zod Schema Definitions
|
|
3
|
-
*
|
|
4
|
-
* Runtime validation schemas for nax configuration.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
|
|
9
|
-
/** Zod schema for runtime validation */
|
|
10
|
-
const TokenPricingSchema = z.object({
|
|
11
|
-
inputPer1M: z.number().min(0),
|
|
12
|
-
outputPer1M: z.number().min(0),
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
const ModelDefSchema = z.object({
|
|
16
|
-
provider: z.string().min(1, "Provider must be non-empty"),
|
|
17
|
-
model: z.string().min(1, "Model must be non-empty"),
|
|
18
|
-
pricing: TokenPricingSchema.optional(),
|
|
19
|
-
env: z.record(z.string(), z.string()).optional(),
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
const ModelEntrySchema = z.union([z.string().min(1, "Model identifier must be non-empty"), ModelDefSchema]);
|
|
23
|
-
|
|
24
|
-
const ModelMapSchema = z.object({
|
|
25
|
-
fast: ModelEntrySchema,
|
|
26
|
-
balanced: ModelEntrySchema,
|
|
27
|
-
powerful: ModelEntrySchema,
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const ModelTierSchema = z.string().min(1, "Tier name must be non-empty");
|
|
31
|
-
|
|
32
|
-
const TierConfigSchema = z.object({
|
|
33
|
-
tier: z.string().min(1, "Tier name must be non-empty"),
|
|
34
|
-
attempts: z.number().int().min(1).max(20, { message: "attempts must be 1-20" }),
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
const AutoModeConfigSchema = z.object({
|
|
38
|
-
enabled: z.boolean(),
|
|
39
|
-
defaultAgent: z.string().trim().min(1, "defaultAgent must be non-empty"),
|
|
40
|
-
fallbackOrder: z.array(z.string()),
|
|
41
|
-
complexityRouting: z.object({
|
|
42
|
-
simple: ModelTierSchema,
|
|
43
|
-
medium: ModelTierSchema,
|
|
44
|
-
complex: ModelTierSchema,
|
|
45
|
-
expert: ModelTierSchema,
|
|
46
|
-
}),
|
|
47
|
-
escalation: z.object({
|
|
48
|
-
enabled: z.boolean(),
|
|
49
|
-
tierOrder: z.array(TierConfigSchema).min(1, { message: "tierOrder must have at least one tier" }),
|
|
50
|
-
escalateEntireBatch: z.boolean().optional(),
|
|
51
|
-
}),
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const RectificationConfigSchema = z.object({
|
|
55
|
-
enabled: z.boolean().default(true),
|
|
56
|
-
maxRetries: z.number().int().min(0).max(10).default(2),
|
|
57
|
-
fullSuiteTimeoutSeconds: z.number().int().min(10).max(600).default(120),
|
|
58
|
-
maxFailureSummaryChars: z.number().int().min(500).max(10000).default(2000),
|
|
59
|
-
abortOnIncreasingFailures: z.boolean().default(true),
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const RegressionGateConfigSchema = z.object({
|
|
63
|
-
enabled: z.boolean().default(true),
|
|
64
|
-
timeoutSeconds: z.number().int().min(10).max(600).default(120),
|
|
65
|
-
acceptOnTimeout: z.boolean().default(true),
|
|
66
|
-
mode: z.enum(["deferred", "per-story", "disabled"]).default("deferred"),
|
|
67
|
-
maxRectificationAttempts: z.number().int().min(1).default(2),
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
const SmartTestRunnerConfigSchema = z.object({
|
|
71
|
-
enabled: z.boolean().default(true),
|
|
72
|
-
testFilePatterns: z.array(z.string()).default(["test/**/*.test.ts"]),
|
|
73
|
-
fallback: z.enum(["import-grep", "full-suite"]).default("import-grep"),
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
const SMART_TEST_RUNNER_DEFAULT = {
|
|
77
|
-
enabled: true,
|
|
78
|
-
testFilePatterns: ["test/**/*.test.ts"],
|
|
79
|
-
fallback: "import-grep" as const,
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
/** Coerces boolean → SmartTestRunnerConfig for backward compat */
|
|
83
|
-
const smartTestRunnerFieldSchema = z
|
|
84
|
-
.preprocess((val) => {
|
|
85
|
-
if (typeof val === "boolean") {
|
|
86
|
-
return { enabled: val, testFilePatterns: ["test/**/*.test.ts"], fallback: "import-grep" };
|
|
87
|
-
}
|
|
88
|
-
return val;
|
|
89
|
-
}, SmartTestRunnerConfigSchema)
|
|
90
|
-
.default(SMART_TEST_RUNNER_DEFAULT);
|
|
91
|
-
|
|
92
|
-
const ExecutionConfigSchema = z.object({
|
|
93
|
-
maxIterations: z.number().int().positive({ message: "maxIterations must be > 0" }),
|
|
94
|
-
iterationDelayMs: z.number().int().nonnegative(),
|
|
95
|
-
costLimit: z.number().positive({ message: "costLimit must be > 0" }),
|
|
96
|
-
sessionTimeoutSeconds: z.number().int().positive({ message: "sessionTimeoutSeconds must be > 0" }),
|
|
97
|
-
verificationTimeoutSeconds: z.number().int().min(1).max(3600).default(300),
|
|
98
|
-
maxStoriesPerFeature: z.number().int().positive(),
|
|
99
|
-
rectification: RectificationConfigSchema,
|
|
100
|
-
regressionGate: RegressionGateConfigSchema,
|
|
101
|
-
contextProviderTokenBudget: z
|
|
102
|
-
.number()
|
|
103
|
-
.int()
|
|
104
|
-
.positive({ message: "contextProviderTokenBudget must be > 0" })
|
|
105
|
-
.default(2000),
|
|
106
|
-
lintCommand: z.string().nullable().optional(),
|
|
107
|
-
typecheckCommand: z.string().nullable().optional(),
|
|
108
|
-
// DEPRECATED — use permissionProfile instead. Kept for backward compat.
|
|
109
|
-
dangerouslySkipPermissions: z.boolean().default(true),
|
|
110
|
-
// NEW — takes precedence over dangerouslySkipPermissions
|
|
111
|
-
permissionProfile: z.enum(["unrestricted", "safe", "scoped"]).optional(),
|
|
112
|
-
// Phase 2: per-stage permission overrides (only read when profile = "scoped")
|
|
113
|
-
permissions: z
|
|
114
|
-
.record(
|
|
115
|
-
z.string(),
|
|
116
|
-
z.object({
|
|
117
|
-
mode: z.enum(["approve-all", "approve-reads", "scoped"]),
|
|
118
|
-
allowedTools: z.array(z.string()).optional(),
|
|
119
|
-
inherit: z.string().optional(),
|
|
120
|
-
}),
|
|
121
|
-
)
|
|
122
|
-
.optional(),
|
|
123
|
-
smartTestRunner: smartTestRunnerFieldSchema,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
const QualityConfigSchema = z.object({
|
|
127
|
-
requireTypecheck: z.boolean(),
|
|
128
|
-
requireLint: z.boolean(),
|
|
129
|
-
requireTests: z.boolean(),
|
|
130
|
-
commands: z.object({
|
|
131
|
-
typecheck: z.string().optional(),
|
|
132
|
-
lint: z.string().optional(),
|
|
133
|
-
test: z.string().optional(),
|
|
134
|
-
testScoped: z.string().optional(),
|
|
135
|
-
lintFix: z.string().optional(),
|
|
136
|
-
formatFix: z.string().optional(),
|
|
137
|
-
}),
|
|
138
|
-
forceExit: z.boolean().default(false),
|
|
139
|
-
detectOpenHandles: z.boolean().default(true),
|
|
140
|
-
detectOpenHandlesRetries: z.number().int().min(0).max(5).default(1),
|
|
141
|
-
gracePeriodMs: z.number().int().min(500).max(30000).default(5000),
|
|
142
|
-
drainTimeoutMs: z.number().int().min(0).max(10000).default(2000),
|
|
143
|
-
shell: z.string().default("/bin/sh"),
|
|
144
|
-
stripEnvVars: z
|
|
145
|
-
.array(z.string())
|
|
146
|
-
.default([
|
|
147
|
-
"CLAUDECODE",
|
|
148
|
-
"REPL_ID",
|
|
149
|
-
"AGENT",
|
|
150
|
-
"GITLAB_ACCESS_TOKEN",
|
|
151
|
-
"GITHUB_TOKEN",
|
|
152
|
-
"GITHUB_ACCESS_TOKEN",
|
|
153
|
-
"GH_TOKEN",
|
|
154
|
-
"CI_GIT_TOKEN",
|
|
155
|
-
"CI_JOB_TOKEN",
|
|
156
|
-
"BITBUCKET_ACCESS_TOKEN",
|
|
157
|
-
"NPM_TOKEN",
|
|
158
|
-
"NPM_AUTH_TOKEN",
|
|
159
|
-
"YARN_NPM_AUTH_TOKEN",
|
|
160
|
-
"ANTHROPIC_API_KEY",
|
|
161
|
-
"OPENAI_API_KEY",
|
|
162
|
-
"GEMINI_API_KEY",
|
|
163
|
-
"COHERE_API_KEY",
|
|
164
|
-
"AWS_ACCESS_KEY_ID",
|
|
165
|
-
"AWS_SECRET_ACCESS_KEY",
|
|
166
|
-
"AWS_SESSION_TOKEN",
|
|
167
|
-
"GOOGLE_APPLICATION_CREDENTIALS",
|
|
168
|
-
"GCLOUD_SERVICE_KEY",
|
|
169
|
-
"AZURE_CLIENT_SECRET",
|
|
170
|
-
"AZURE_TENANT_ID",
|
|
171
|
-
"TELEGRAM_BOT_TOKEN",
|
|
172
|
-
"SLACK_TOKEN",
|
|
173
|
-
"SLACK_WEBHOOK_URL",
|
|
174
|
-
"SENTRY_AUTH_TOKEN",
|
|
175
|
-
"DATADOG_API_KEY",
|
|
176
|
-
]),
|
|
177
|
-
environmentalEscalationDivisor: z.number().min(1).max(10).default(2),
|
|
178
|
-
testing: z
|
|
179
|
-
.object({
|
|
180
|
-
/**
|
|
181
|
-
* When true (default), nax injects a hermetic test requirement into all code-writing prompts.
|
|
182
|
-
* Instructs the AI to mock all I/O boundaries (HTTP, CLI spawning, databases, etc.)
|
|
183
|
-
* and never invoke real external processes or services during test execution.
|
|
184
|
-
* Set to false only if your project requires real integration calls in tests.
|
|
185
|
-
*/
|
|
186
|
-
hermetic: z.boolean().default(true),
|
|
187
|
-
/**
|
|
188
|
-
* Project-specific external boundaries the AI should watch for and mock.
|
|
189
|
-
* E.g. ["claude", "acpx", "redis", "grpc"] — any CLI tools, clients, or services
|
|
190
|
-
* the project uses that should never be called from tests.
|
|
191
|
-
*/
|
|
192
|
-
externalBoundaries: z.array(z.string()).optional(),
|
|
193
|
-
/**
|
|
194
|
-
* Project-specific guidance on how to mock external dependencies.
|
|
195
|
-
* Injected verbatim into the hermetic requirement section of the prompt.
|
|
196
|
-
* E.g. "Use injectable deps for CLI spawning, ioredis-mock for Redis"
|
|
197
|
-
*/
|
|
198
|
-
mockGuidance: z.string().optional(),
|
|
199
|
-
})
|
|
200
|
-
.optional(),
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
const TddConfigSchema = z.object({
|
|
204
|
-
maxRetries: z.number().int().nonnegative(),
|
|
205
|
-
autoVerifyIsolation: z.boolean(),
|
|
206
|
-
autoApproveVerifier: z.boolean(),
|
|
207
|
-
strategy: z.enum(["auto", "strict", "lite", "off"]).default("auto"),
|
|
208
|
-
sessionTiers: z
|
|
209
|
-
.object({
|
|
210
|
-
testWriter: z.string().optional(),
|
|
211
|
-
implementer: z.string().optional(),
|
|
212
|
-
verifier: z.string().optional(),
|
|
213
|
-
})
|
|
214
|
-
.optional(),
|
|
215
|
-
testWriterAllowedPaths: z.array(z.string()).optional(),
|
|
216
|
-
rollbackOnFailure: z.boolean().optional(),
|
|
217
|
-
greenfieldDetection: z.boolean().optional(),
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
const ConstitutionConfigSchema = z.object({
|
|
221
|
-
enabled: z.boolean(),
|
|
222
|
-
path: z.string().min(1, "constitution.path must be non-empty"),
|
|
223
|
-
maxTokens: z.number().int().positive({ message: "constitution.maxTokens must be > 0" }),
|
|
224
|
-
skipGlobal: z.boolean().optional(),
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
const AnalyzeConfigSchema = z.object({
|
|
228
|
-
llmEnhanced: z.boolean(),
|
|
229
|
-
model: ModelTierSchema,
|
|
230
|
-
fallbackToKeywords: z.boolean(),
|
|
231
|
-
maxCodebaseSummaryTokens: z.number().int().positive(),
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
const ReviewConfigSchema = z.object({
|
|
235
|
-
enabled: z.boolean(),
|
|
236
|
-
checks: z.array(z.enum(["typecheck", "lint", "test"])),
|
|
237
|
-
commands: z.object({
|
|
238
|
-
typecheck: z.string().optional(),
|
|
239
|
-
lint: z.string().optional(),
|
|
240
|
-
test: z.string().optional(),
|
|
241
|
-
}),
|
|
242
|
-
pluginMode: z.enum(["per-story", "deferred"]).default("per-story"),
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
const PlanConfigSchema = z.object({
|
|
246
|
-
model: ModelTierSchema,
|
|
247
|
-
outputPath: z.string().min(1, "plan.outputPath must be non-empty"),
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
export const AcceptanceConfigSchema = z.object({
|
|
251
|
-
enabled: z.boolean(),
|
|
252
|
-
maxRetries: z.number().int().nonnegative(),
|
|
253
|
-
generateTests: z.boolean(),
|
|
254
|
-
testPath: z.string().min(1, "acceptance.testPath must be non-empty"),
|
|
255
|
-
model: z.enum(["fast", "balanced", "powerful"]).default("fast"),
|
|
256
|
-
refinement: z.boolean().default(true),
|
|
257
|
-
redGate: z.boolean().default(true),
|
|
258
|
-
testStrategy: z.enum(["unit", "component", "cli", "e2e", "snapshot"]).optional(),
|
|
259
|
-
testFramework: z.string().min(1, "acceptance.testFramework must be non-empty").optional(),
|
|
260
|
-
timeoutMs: z.number().int().min(30000).max(3600000).default(1800000),
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
const TestCoverageConfigSchema = z.object({
|
|
264
|
-
enabled: z.boolean().default(true),
|
|
265
|
-
detail: z.enum(["names-only", "names-and-counts", "describe-blocks"]).default("names-and-counts"),
|
|
266
|
-
maxTokens: z.number().int().min(50).max(5000).default(500),
|
|
267
|
-
testDir: z.string().optional(),
|
|
268
|
-
testPattern: z.string().default("**/*.test.{ts,js,tsx,jsx}"),
|
|
269
|
-
scopeToStory: z.boolean().default(true),
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
const ContextAutoDetectConfigSchema = z.object({
|
|
273
|
-
enabled: z.boolean().default(true),
|
|
274
|
-
maxFiles: z.number().int().min(1).max(20).default(5),
|
|
275
|
-
traceImports: z.boolean().default(false),
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
const ContextConfigSchema = z.object({
|
|
279
|
-
testCoverage: TestCoverageConfigSchema,
|
|
280
|
-
autoDetect: ContextAutoDetectConfigSchema,
|
|
281
|
-
fileInjection: z.enum(["keyword", "disabled"]).default("disabled"),
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
const AdaptiveRoutingConfigSchema = z.object({
|
|
285
|
-
minSamples: z.number().int().positive({ message: "adaptive.minSamples must be > 0" }),
|
|
286
|
-
costThreshold: z.number().min(0).max(1, { message: "adaptive.costThreshold must be 0-1" }),
|
|
287
|
-
fallbackStrategy: z.enum(["keyword", "llm", "manual"]),
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
const LlmRoutingConfigSchema = z.object({
|
|
291
|
-
model: z.string().optional(),
|
|
292
|
-
fallbackToKeywords: z.boolean().optional(),
|
|
293
|
-
cacheDecisions: z.boolean().optional(),
|
|
294
|
-
mode: z.enum(["one-shot", "per-story", "hybrid"]).optional(),
|
|
295
|
-
batchMode: z.boolean().optional(), // deprecated, for backward compat
|
|
296
|
-
timeoutMs: z.number().int().positive({ message: "llm.timeoutMs must be > 0" }).optional(),
|
|
297
|
-
retries: z.number().int().min(0, { message: "llm.retries must be >= 0" }).optional(),
|
|
298
|
-
retryDelayMs: z.number().int().min(0, { message: "llm.retryDelayMs must be >= 0" }).optional(),
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
const RoutingConfigSchema = z
|
|
302
|
-
.object({
|
|
303
|
-
strategy: z.enum(["keyword", "llm", "manual", "adaptive", "custom"]),
|
|
304
|
-
customStrategyPath: z.string().optional(),
|
|
305
|
-
adaptive: AdaptiveRoutingConfigSchema.optional(),
|
|
306
|
-
llm: LlmRoutingConfigSchema.optional(),
|
|
307
|
-
})
|
|
308
|
-
.refine(
|
|
309
|
-
(data) => {
|
|
310
|
-
// If strategy is "custom", customStrategyPath is required
|
|
311
|
-
if (data.strategy === "custom" && !data.customStrategyPath) {
|
|
312
|
-
return false;
|
|
313
|
-
}
|
|
314
|
-
return true;
|
|
315
|
-
},
|
|
316
|
-
{
|
|
317
|
-
message: "routing.customStrategyPath is required when strategy is 'custom'",
|
|
318
|
-
path: ["customStrategyPath"],
|
|
319
|
-
},
|
|
320
|
-
);
|
|
321
|
-
|
|
322
|
-
const OptimizerConfigSchema = z.object({
|
|
323
|
-
enabled: z.boolean(),
|
|
324
|
-
strategy: z.enum(["rule-based", "llm", "noop"]).optional(),
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
const PluginConfigEntrySchema = z.object({
|
|
328
|
-
module: z.string().min(1, "plugin.module must be non-empty"),
|
|
329
|
-
config: z.record(z.string(), z.unknown()).optional(),
|
|
330
|
-
enabled: z.boolean().default(true),
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
const HooksConfigSchema = z.object({
|
|
334
|
-
skipGlobal: z.boolean().optional(),
|
|
335
|
-
hooks: z.record(z.string(), z.unknown()),
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
const InteractionConfigSchema = z.object({
|
|
339
|
-
plugin: z.string().default("cli"),
|
|
340
|
-
config: z.record(z.string(), z.unknown()).optional(),
|
|
341
|
-
defaults: z.object({
|
|
342
|
-
timeout: z.number().int().min(1000).max(3600000).default(600000),
|
|
343
|
-
fallback: z.enum(["continue", "skip", "escalate", "abort"]).default("escalate"),
|
|
344
|
-
}),
|
|
345
|
-
triggers: z
|
|
346
|
-
.record(
|
|
347
|
-
z.string(),
|
|
348
|
-
z.union([
|
|
349
|
-
z.boolean(),
|
|
350
|
-
z.object({
|
|
351
|
-
enabled: z.boolean(),
|
|
352
|
-
fallback: z.string().optional(),
|
|
353
|
-
timeout: z.number().optional(),
|
|
354
|
-
}),
|
|
355
|
-
]),
|
|
356
|
-
)
|
|
357
|
-
.default({}),
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
const StorySizeGateConfigSchema = z.object({
|
|
361
|
-
enabled: z.boolean().default(true),
|
|
362
|
-
maxAcCount: z.number().int().min(1).max(50).default(6),
|
|
363
|
-
maxDescriptionLength: z.number().int().min(100).max(10000).default(2000),
|
|
364
|
-
maxBulletPoints: z.number().int().min(1).max(100).default(8),
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
const AgentConfigSchema = z.object({
|
|
368
|
-
protocol: z.enum(["acp", "cli"]).default("acp"),
|
|
369
|
-
maxInteractionTurns: z.number().int().min(1).max(100).default(10),
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
const PrecheckConfigSchema = z.object({
|
|
373
|
-
storySizeGate: StorySizeGateConfigSchema,
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
export const PromptsConfigSchema = z.object({
|
|
377
|
-
overrides: z
|
|
378
|
-
.record(
|
|
379
|
-
z
|
|
380
|
-
.string()
|
|
381
|
-
.refine((key) => ["test-writer", "implementer", "verifier", "single-session", "tdd-simple"].includes(key), {
|
|
382
|
-
message: "Role must be one of: test-writer, implementer, verifier, single-session, tdd-simple",
|
|
383
|
-
}),
|
|
384
|
-
z.string().min(1, "Override path must be non-empty"),
|
|
385
|
-
)
|
|
386
|
-
.optional(),
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
const DecomposeConfigSchema = z.object({
|
|
390
|
-
trigger: z.enum(["auto", "confirm", "disabled"]).default("auto"),
|
|
391
|
-
maxAcceptanceCriteria: z.number().int().min(1).default(6),
|
|
392
|
-
maxSubstories: z.number().int().min(1).default(5),
|
|
393
|
-
maxSubstoryComplexity: z.enum(["simple", "medium", "complex", "expert"]).default("medium"),
|
|
394
|
-
maxRetries: z.number().int().min(0).default(2),
|
|
395
|
-
model: z.string().min(1).default("balanced"),
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
export const NaxConfigSchema = z
|
|
399
|
-
.object({
|
|
400
|
-
version: z.number(),
|
|
401
|
-
models: ModelMapSchema,
|
|
402
|
-
autoMode: AutoModeConfigSchema,
|
|
403
|
-
routing: RoutingConfigSchema,
|
|
404
|
-
execution: ExecutionConfigSchema,
|
|
405
|
-
quality: QualityConfigSchema,
|
|
406
|
-
tdd: TddConfigSchema,
|
|
407
|
-
constitution: ConstitutionConfigSchema,
|
|
408
|
-
analyze: AnalyzeConfigSchema,
|
|
409
|
-
review: ReviewConfigSchema,
|
|
410
|
-
plan: PlanConfigSchema,
|
|
411
|
-
acceptance: AcceptanceConfigSchema,
|
|
412
|
-
context: ContextConfigSchema,
|
|
413
|
-
optimizer: OptimizerConfigSchema.optional(),
|
|
414
|
-
plugins: z.array(PluginConfigEntrySchema).optional(),
|
|
415
|
-
disabledPlugins: z.array(z.string()).optional(),
|
|
416
|
-
hooks: HooksConfigSchema.optional(),
|
|
417
|
-
interaction: InteractionConfigSchema.optional(),
|
|
418
|
-
agent: AgentConfigSchema.optional(),
|
|
419
|
-
precheck: PrecheckConfigSchema.optional(),
|
|
420
|
-
prompts: PromptsConfigSchema.optional(),
|
|
421
|
-
decompose: DecomposeConfigSchema.optional(),
|
|
422
|
-
})
|
|
423
|
-
.refine((data) => data.version === 1, {
|
|
424
|
-
message: "Invalid version: expected 1",
|
|
425
|
-
path: ["version"],
|
|
426
|
-
});
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test Strategy — Single Source of Truth
|
|
3
|
-
*
|
|
4
|
-
* Defines all valid test strategies, the normalizer, and shared prompt
|
|
5
|
-
* fragments used by plan.ts and claude-decompose.ts.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { TestStrategy } from "./schema-types";
|
|
9
|
-
|
|
10
|
-
// ─── Re-export type ───────────────────────────────────────────────────────────
|
|
11
|
-
|
|
12
|
-
export type { TestStrategy };
|
|
13
|
-
|
|
14
|
-
// ─── Valid values ─────────────────────────────────────────────────────────────
|
|
15
|
-
|
|
16
|
-
export const VALID_TEST_STRATEGIES: readonly TestStrategy[] = [
|
|
17
|
-
"test-after",
|
|
18
|
-
"tdd-simple",
|
|
19
|
-
"three-session-tdd",
|
|
20
|
-
"three-session-tdd-lite",
|
|
21
|
-
];
|
|
22
|
-
|
|
23
|
-
// ─── Resolver ────────────────────────────────────────────────────────────────
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Validate and normalize a test strategy string.
|
|
27
|
-
* Returns a valid TestStrategy or falls back to "test-after".
|
|
28
|
-
*/
|
|
29
|
-
export function resolveTestStrategy(raw: string | undefined): TestStrategy {
|
|
30
|
-
if (!raw) return "test-after";
|
|
31
|
-
if (VALID_TEST_STRATEGIES.includes(raw as TestStrategy)) return raw as TestStrategy;
|
|
32
|
-
// Map legacy/typo values
|
|
33
|
-
if (raw === "tdd") return "tdd-simple";
|
|
34
|
-
if (raw === "three-session") return "three-session-tdd";
|
|
35
|
-
if (raw === "tdd-lite") return "three-session-tdd-lite";
|
|
36
|
-
return "test-after"; // safe fallback
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ─── Prompt fragments (shared by plan.ts and claude-decompose.ts) ────────────
|
|
40
|
-
|
|
41
|
-
export const COMPLEXITY_GUIDE = `## Complexity Classification Guide
|
|
42
|
-
|
|
43
|
-
- simple: ≤50 LOC, single-file change, purely additive, no new dependencies → tdd-simple
|
|
44
|
-
- medium: 50–200 LOC, 2–5 files, standard patterns, clear requirements → three-session-tdd-lite
|
|
45
|
-
- complex: 200–500 LOC, multiple modules, new abstractions or integrations → three-session-tdd
|
|
46
|
-
- expert: 500+ LOC, architectural changes, cross-cutting concerns, high risk → three-session-tdd
|
|
47
|
-
|
|
48
|
-
### Security Override
|
|
49
|
-
|
|
50
|
-
Security-critical functions (authentication, cryptography, tokens, sessions, credentials,
|
|
51
|
-
password hashing, access control) must use three-session-tdd regardless of complexity.`;
|
|
52
|
-
|
|
53
|
-
export const TEST_STRATEGY_GUIDE = `## Test Strategy Guide
|
|
54
|
-
|
|
55
|
-
- tdd-simple: Simple stories (≤50 LOC). Write failing tests first, then implement to pass them — all in one session.
|
|
56
|
-
- three-session-tdd-lite: Medium stories, or complex stories involving UI/CLI/integration. 3 sessions: (1) test-writer writes failing tests and may create minimal src/ stubs for imports, (2) implementer makes tests pass and may replace stubs, (3) verifier confirms correctness.
|
|
57
|
-
- three-session-tdd: Complex/expert stories or security-critical code. 3 sessions with strict isolation: (1) test-writer writes failing tests — no src/ changes allowed, (2) implementer makes them pass without modifying test files, (3) verifier confirms correctness.
|
|
58
|
-
- test-after: Only when explicitly configured (tddStrategy: "off"). Write tests after implementation. Not auto-assigned.`;
|
|
59
|
-
|
|
60
|
-
export const GROUPING_RULES = `## Story Rules
|
|
61
|
-
|
|
62
|
-
- Every story must produce code changes verifiable by tests or review.
|
|
63
|
-
- NEVER create stories for analysis, planning, documentation, or migration plans.
|
|
64
|
-
Your analysis belongs in the "analysis" field, not in a story.
|
|
65
|
-
- NEVER create stories whose primary purpose is writing tests, achieving coverage
|
|
66
|
-
targets, or running validation/regression suites. Each story's testStrategy
|
|
67
|
-
handles test creation as part of implementation. Testing is a built-in pipeline
|
|
68
|
-
stage, not a user story. No exceptions.
|
|
69
|
-
- Combine small, related tasks into a single "simple" or "medium" story.
|
|
70
|
-
Do NOT create separate stories for every single file or function unless complex.
|
|
71
|
-
- Aim for coherent units of value. Maximum recommended stories: 10-15 per feature.`;
|
package/src/config/types.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration Type Definitions (Hub)
|
|
3
|
-
*
|
|
4
|
-
* Re-exports all TypeScript interfaces, type aliases, and utility functions
|
|
5
|
-
* for the nax configuration system.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
// Schema types
|
|
9
|
-
export type {
|
|
10
|
-
Complexity,
|
|
11
|
-
LlmRoutingMode,
|
|
12
|
-
ModelDef,
|
|
13
|
-
ModelEntry,
|
|
14
|
-
ModelMap,
|
|
15
|
-
ModelTier,
|
|
16
|
-
RoutingStrategyName,
|
|
17
|
-
TddStrategy,
|
|
18
|
-
TestStrategy,
|
|
19
|
-
TierConfig,
|
|
20
|
-
TokenPricing,
|
|
21
|
-
} from "./schema-types";
|
|
22
|
-
export { resolveModel } from "./schema-types";
|
|
23
|
-
|
|
24
|
-
// Runtime types
|
|
25
|
-
export type {
|
|
26
|
-
AcceptanceConfig,
|
|
27
|
-
AcceptanceTestStrategy,
|
|
28
|
-
AnalyzeConfig,
|
|
29
|
-
AutoModeConfig,
|
|
30
|
-
ConstitutionConfig,
|
|
31
|
-
ContextAutoDetectConfig,
|
|
32
|
-
ContextConfig,
|
|
33
|
-
DecomposeConfig,
|
|
34
|
-
EscalationEntry,
|
|
35
|
-
ExecutionConfig,
|
|
36
|
-
HooksConfig,
|
|
37
|
-
InteractionConfig,
|
|
38
|
-
LlmRoutingConfig,
|
|
39
|
-
NaxConfig,
|
|
40
|
-
OptimizerConfig,
|
|
41
|
-
PlanConfig,
|
|
42
|
-
PluginConfigEntry,
|
|
43
|
-
PrecheckConfig,
|
|
44
|
-
PromptsConfig,
|
|
45
|
-
QualityConfig,
|
|
46
|
-
RectificationConfig,
|
|
47
|
-
RegressionGateConfig,
|
|
48
|
-
ReviewConfig,
|
|
49
|
-
RoutingConfig,
|
|
50
|
-
SmartTestRunnerConfig,
|
|
51
|
-
StorySizeGateConfig,
|
|
52
|
-
TddConfig,
|
|
53
|
-
TestCoverageConfig,
|
|
54
|
-
TestingConfig,
|
|
55
|
-
AdaptiveRoutingConfig,
|
|
56
|
-
AgentConfig,
|
|
57
|
-
} from "./runtime-types";
|
package/src/config/validate.ts
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration Validation
|
|
3
|
-
*
|
|
4
|
-
* @deprecated Use NaxConfigSchema.safeParse() from schema.ts instead.
|
|
5
|
-
* This module is kept for backward compatibility only.
|
|
6
|
-
*
|
|
7
|
-
* Validates NaxConfig structure and constraints.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { NaxConfig } from "./schema";
|
|
11
|
-
|
|
12
|
-
/** Validation result */
|
|
13
|
-
export interface ValidationResult {
|
|
14
|
-
valid: boolean;
|
|
15
|
-
errors: string[];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Validate NaxConfig
|
|
20
|
-
*
|
|
21
|
-
* Checks:
|
|
22
|
-
* - version === 1
|
|
23
|
-
* - maxIterations > 0
|
|
24
|
-
* - costLimit > 0
|
|
25
|
-
* - sessionTimeoutSeconds > 0
|
|
26
|
-
* - defaultAgent is non-empty
|
|
27
|
-
* - escalation.tierOrder has at least one tier with valid attempts
|
|
28
|
-
*/
|
|
29
|
-
export function validateConfig(config: NaxConfig): ValidationResult {
|
|
30
|
-
const errors: string[] = [];
|
|
31
|
-
|
|
32
|
-
// Version check
|
|
33
|
-
if (config.version !== 1) {
|
|
34
|
-
errors.push(`Invalid version: expected 1, got ${config.version}`);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Models mapping
|
|
38
|
-
const requiredTiers = ["fast", "balanced", "powerful"] as const;
|
|
39
|
-
if (!config.models) {
|
|
40
|
-
errors.push("models mapping is required");
|
|
41
|
-
} else {
|
|
42
|
-
for (const tier of requiredTiers) {
|
|
43
|
-
const entry = config.models[tier];
|
|
44
|
-
if (!entry) {
|
|
45
|
-
errors.push(`models.${tier} is required`);
|
|
46
|
-
} else if (typeof entry === "string") {
|
|
47
|
-
if (entry.trim() === "") {
|
|
48
|
-
errors.push(`models.${tier} must be a non-empty model identifier`);
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
51
|
-
if (!entry.provider || entry.provider.trim() === "") {
|
|
52
|
-
errors.push(`models.${tier}.provider must be non-empty`);
|
|
53
|
-
}
|
|
54
|
-
if (!entry.model || entry.model.trim() === "") {
|
|
55
|
-
errors.push(`models.${tier}.model must be non-empty`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Execution limits
|
|
62
|
-
if (config.execution.maxIterations <= 0) {
|
|
63
|
-
errors.push(`maxIterations must be > 0, got ${config.execution.maxIterations}`);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (config.execution.costLimit <= 0) {
|
|
67
|
-
errors.push(`costLimit must be > 0, got ${config.execution.costLimit}`);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (config.execution.sessionTimeoutSeconds <= 0) {
|
|
71
|
-
errors.push(`sessionTimeoutSeconds must be > 0, got ${config.execution.sessionTimeoutSeconds}`);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Auto mode config
|
|
75
|
-
if (!config.autoMode.defaultAgent || config.autoMode.defaultAgent.trim() === "") {
|
|
76
|
-
errors.push("defaultAgent must be non-empty");
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (!config.autoMode.escalation.tierOrder || config.autoMode.escalation.tierOrder.length === 0) {
|
|
80
|
-
errors.push("escalation.tierOrder must have at least one tier");
|
|
81
|
-
} else {
|
|
82
|
-
for (const tc of config.autoMode.escalation.tierOrder) {
|
|
83
|
-
if (tc.attempts < 1 || tc.attempts > 20) {
|
|
84
|
-
errors.push(`escalation.tierOrder: tier "${tc.tier}" attempts must be 1-20, got ${tc.attempts}`);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Validate complexityRouting values reference tiers that exist in models config
|
|
90
|
-
const configuredTiers = Object.keys(config.models);
|
|
91
|
-
const complexities = ["simple", "medium", "complex", "expert"] as const;
|
|
92
|
-
for (const complexity of complexities) {
|
|
93
|
-
const tier = config.autoMode.complexityRouting[complexity];
|
|
94
|
-
if (!configuredTiers.includes(tier)) {
|
|
95
|
-
errors.push(`complexityRouting.${complexity} must be one of: ${configuredTiers.join(", ")} (got '${tier}')`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return {
|
|
100
|
-
valid: errors.length === 0,
|
|
101
|
-
errors,
|
|
102
|
-
};
|
|
103
|
-
}
|