@sentry/warden 0.22.0 → 0.23.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/.oxlintrc.json +169 -0
- package/CHANGELOG.md +210 -0
- package/README.md +1 -1
- package/dist/cli/args.d.ts +6 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +175 -207
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +16 -5
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/build.d.ts +13 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +384 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +10 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/runs.d.ts.map +1 -1
- package/dist/cli/commands/runs.js +12 -6
- package/dist/cli/commands/runs.js.map +1 -1
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +4 -1
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +8 -1
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/files.d.ts.map +1 -1
- package/dist/cli/files.js +27 -9
- package/dist/cli/files.js.map +1 -1
- package/dist/cli/help.d.ts +4 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +448 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.js +2 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/input.d.ts +12 -0
- package/dist/cli/input.d.ts.map +1 -1
- package/dist/cli/input.js +60 -0
- package/dist/cli/input.js.map +1 -1
- package/dist/cli/main.d.ts +39 -2
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +264 -74
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output/box.js +1 -1
- package/dist/cli/output/formatters.d.ts +10 -2
- package/dist/cli/output/formatters.d.ts.map +1 -1
- package/dist/cli/output/formatters.js +32 -9
- package/dist/cli/output/formatters.js.map +1 -1
- package/dist/cli/output/index.d.ts +1 -1
- package/dist/cli/output/index.d.ts.map +1 -1
- package/dist/cli/output/index.js +1 -1
- package/dist/cli/output/index.js.map +1 -1
- package/dist/cli/output/ink-runner.d.ts +3 -1
- package/dist/cli/output/ink-runner.d.ts.map +1 -1
- package/dist/cli/output/ink-runner.js +64 -28
- package/dist/cli/output/ink-runner.js.map +1 -1
- package/dist/cli/output/jsonl.d.ts +37 -0
- package/dist/cli/output/jsonl.d.ts.map +1 -1
- package/dist/cli/output/jsonl.js +6 -0
- package/dist/cli/output/jsonl.js.map +1 -1
- package/dist/cli/output/live-status.d.ts +48 -0
- package/dist/cli/output/live-status.d.ts.map +1 -0
- package/dist/cli/output/live-status.js +173 -0
- package/dist/cli/output/live-status.js.map +1 -0
- package/dist/cli/output/reporter.d.ts +4 -0
- package/dist/cli/output/reporter.d.ts.map +1 -1
- package/dist/cli/output/reporter.js +20 -3
- package/dist/cli/output/reporter.js.map +1 -1
- package/dist/cli/output/tasks.d.ts +8 -5
- package/dist/cli/output/tasks.d.ts.map +1 -1
- package/dist/cli/output/tasks.js +113 -71
- package/dist/cli/output/tasks.js.map +1 -1
- package/dist/cli/signals.d.ts +15 -0
- package/dist/cli/signals.d.ts.map +1 -0
- package/dist/cli/signals.js +26 -0
- package/dist/cli/signals.js.map +1 -0
- package/dist/config/loader.d.ts +48 -7
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +228 -32
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +55 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +34 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/diff/context.d.ts +9 -2
- package/dist/diff/context.d.ts.map +1 -1
- package/dist/diff/context.js +65 -17
- package/dist/diff/context.js.map +1 -1
- package/dist/evals/runner.d.ts.map +1 -1
- package/dist/evals/runner.js +16 -0
- package/dist/evals/runner.js.map +1 -1
- package/dist/event/context.d.ts.map +1 -1
- package/dist/event/context.js +1 -0
- package/dist/event/context.js.map +1 -1
- package/dist/event/schedule-context.d.ts.map +1 -1
- package/dist/event/schedule-context.js +1 -0
- package/dist/event/schedule-context.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/output/dedup.d.ts +8 -11
- package/dist/output/dedup.d.ts.map +1 -1
- package/dist/output/dedup.js +39 -37
- package/dist/output/dedup.js.map +1 -1
- package/dist/output/github-checks.d.ts +1 -0
- package/dist/output/github-checks.d.ts.map +1 -1
- package/dist/output/github-checks.js +9 -7
- package/dist/output/github-checks.js.map +1 -1
- package/dist/sdk/analyze.d.ts.map +1 -1
- package/dist/sdk/analyze.js +147 -277
- package/dist/sdk/analyze.js.map +1 -1
- package/dist/sdk/circuit-breaker.d.ts +26 -0
- package/dist/sdk/circuit-breaker.d.ts.map +1 -0
- package/dist/sdk/circuit-breaker.js +53 -0
- package/dist/sdk/circuit-breaker.js.map +1 -0
- package/dist/sdk/errors.d.ts +5 -0
- package/dist/sdk/errors.d.ts.map +1 -1
- package/dist/sdk/errors.js +27 -0
- package/dist/sdk/errors.js.map +1 -1
- package/dist/sdk/extract.d.ts +18 -9
- package/dist/sdk/extract.d.ts.map +1 -1
- package/dist/sdk/extract.js +95 -87
- package/dist/sdk/extract.js.map +1 -1
- package/dist/sdk/fix-quality.d.ts +5 -0
- package/dist/sdk/fix-quality.d.ts.map +1 -1
- package/dist/sdk/fix-quality.js +42 -23
- package/dist/sdk/fix-quality.js.map +1 -1
- package/dist/sdk/haiku.d.ts +6 -0
- package/dist/sdk/haiku.d.ts.map +1 -1
- package/dist/sdk/haiku.js +75 -49
- package/dist/sdk/haiku.js.map +1 -1
- package/dist/sdk/json-output.d.ts +31 -0
- package/dist/sdk/json-output.d.ts.map +1 -0
- package/dist/sdk/json-output.js +98 -0
- package/dist/sdk/json-output.js.map +1 -0
- package/dist/sdk/model-pricing.json +56 -16
- package/dist/sdk/post-process.d.ts +29 -0
- package/dist/sdk/post-process.d.ts.map +1 -0
- package/dist/sdk/post-process.js +65 -0
- package/dist/sdk/post-process.js.map +1 -0
- package/dist/sdk/prepare.d.ts.map +1 -1
- package/dist/sdk/prepare.js +4 -1
- package/dist/sdk/prepare.js.map +1 -1
- package/dist/sdk/pricing.d.ts +18 -0
- package/dist/sdk/pricing.d.ts.map +1 -1
- package/dist/sdk/pricing.js +108 -3
- package/dist/sdk/pricing.js.map +1 -1
- package/dist/sdk/prompt-sections.d.ts +56 -0
- package/dist/sdk/prompt-sections.d.ts.map +1 -0
- package/dist/sdk/prompt-sections.js +118 -0
- package/dist/sdk/prompt-sections.js.map +1 -0
- package/dist/sdk/prompt.d.ts +2 -17
- package/dist/sdk/prompt.d.ts.map +1 -1
- package/dist/sdk/prompt.js +15 -37
- package/dist/sdk/prompt.js.map +1 -1
- package/dist/sdk/report-files.d.ts +15 -0
- package/dist/sdk/report-files.d.ts.map +1 -0
- package/dist/sdk/report-files.js +20 -0
- package/dist/sdk/report-files.js.map +1 -0
- package/dist/sdk/runner.d.ts +9 -1
- package/dist/sdk/runner.d.ts.map +1 -1
- package/dist/sdk/runner.js +6 -0
- package/dist/sdk/runner.js.map +1 -1
- package/dist/sdk/runtimes/claude.d.ts +3 -0
- package/dist/sdk/runtimes/claude.d.ts.map +1 -0
- package/dist/sdk/runtimes/claude.js +376 -0
- package/dist/sdk/runtimes/claude.js.map +1 -0
- package/dist/sdk/runtimes/index.d.ts +12 -0
- package/dist/sdk/runtimes/index.d.ts.map +1 -0
- package/dist/sdk/runtimes/index.js +22 -0
- package/dist/sdk/runtimes/index.js.map +1 -0
- package/dist/sdk/runtimes/types.d.ts +116 -0
- package/dist/sdk/runtimes/types.d.ts.map +1 -0
- package/dist/sdk/runtimes/types.js +17 -0
- package/dist/sdk/runtimes/types.js.map +1 -0
- package/dist/sdk/types.d.ts +23 -2
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/types.js.map +1 -1
- package/dist/sdk/usage.d.ts +21 -6
- package/dist/sdk/usage.d.ts.map +1 -1
- package/dist/sdk/usage.js +36 -23
- package/dist/sdk/usage.js.map +1 -1
- package/dist/sdk/verify.d.ts +25 -0
- package/dist/sdk/verify.d.ts.map +1 -0
- package/dist/sdk/verify.js +226 -0
- package/dist/sdk/verify.js.map +1 -0
- package/dist/skill-builder/agentic.d.ts +33 -0
- package/dist/skill-builder/agentic.d.ts.map +1 -0
- package/dist/skill-builder/agentic.js +240 -0
- package/dist/skill-builder/agentic.js.map +1 -0
- package/dist/skill-builder/authoring-provider.d.ts +5 -0
- package/dist/skill-builder/authoring-provider.d.ts.map +1 -0
- package/dist/skill-builder/authoring-provider.js +70 -0
- package/dist/skill-builder/authoring-provider.js.map +1 -0
- package/dist/skill-builder/definition.d.ts +46 -0
- package/dist/skill-builder/definition.d.ts.map +1 -0
- package/dist/skill-builder/definition.js +171 -0
- package/dist/skill-builder/definition.js.map +1 -0
- package/dist/skill-builder/outline-contract.d.ts +113 -0
- package/dist/skill-builder/outline-contract.d.ts.map +1 -0
- package/dist/skill-builder/outline-contract.js +73 -0
- package/dist/skill-builder/outline-contract.js.map +1 -0
- package/dist/skill-builder/outline-state.d.ts +158 -0
- package/dist/skill-builder/outline-state.d.ts.map +1 -0
- package/dist/skill-builder/outline-state.js +87 -0
- package/dist/skill-builder/outline-state.js.map +1 -0
- package/dist/skill-builder/outline.d.ts +36 -0
- package/dist/skill-builder/outline.d.ts.map +1 -0
- package/dist/skill-builder/outline.js +345 -0
- package/dist/skill-builder/outline.js.map +1 -0
- package/dist/skill-builder/skill-contract.d.ts +97 -0
- package/dist/skill-builder/skill-contract.d.ts.map +1 -0
- package/dist/skill-builder/skill-contract.js +58 -0
- package/dist/skill-builder/skill-contract.js.map +1 -0
- package/dist/skill-builder/skill-prompts.d.ts +61 -0
- package/dist/skill-builder/skill-prompts.d.ts.map +1 -0
- package/dist/skill-builder/skill-prompts.js +285 -0
- package/dist/skill-builder/skill-prompts.js.map +1 -0
- package/dist/skill-builder/skill.d.ts +23 -0
- package/dist/skill-builder/skill.d.ts.map +1 -0
- package/dist/skill-builder/skill.js +563 -0
- package/dist/skill-builder/skill.js.map +1 -0
- package/dist/skills/index.d.ts +2 -2
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -1
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/loader.d.ts +20 -6
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +88 -141
- package/dist/skills/loader.js.map +1 -1
- package/dist/skills/remote.d.ts +11 -7
- package/dist/skills/remote.d.ts.map +1 -1
- package/dist/skills/remote.js +62 -162
- package/dist/skills/remote.js.map +1 -1
- package/dist/triggers/matcher.d.ts.map +1 -1
- package/dist/triggers/matcher.js +28 -15
- package/dist/triggers/matcher.js.map +1 -1
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/path.d.ts +17 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +36 -0
- package/dist/utils/path.js.map +1 -0
- package/package.json +8 -8
- package/policies/README.md +22 -0
- package/policies/code-comments.md +20 -0
- package/policies/policy-template.md +14 -0
- package/skills/warden/SPEC.md +112 -0
- package/skills/warden/references/config-schema.md +29 -13
- package/skills/warden/references/configuration.md +20 -8
- package/skills/warden-sweep/SPEC.md +126 -0
- package/src/builtin-skills/security-review/SKILL.md +81 -0
- package/src/builtin-skills/security-review/SPEC.md +77 -0
- package/src/builtin-skills/security-review/references/github-workflows.md +186 -0
- package/src/builtin-skills/security-review/references/javascript-typescript.md +69 -0
- package/src/builtin-skills/security-review/references/python.md +70 -0
- package/src/internal-skills/skill-writer/EVAL.md +124 -0
- package/src/internal-skills/skill-writer/SKILL.md +159 -0
- package/src/internal-skills/skill-writer/SOURCES.md +94 -0
- package/src/internal-skills/skill-writer/SPEC.md +153 -0
- package/src/internal-skills/skill-writer/references/artifact-layouts/argument-driven-skill-layout.md +32 -0
- package/src/internal-skills/skill-writer/references/artifact-layouts/asset-template-skill-layout.md +30 -0
- package/src/internal-skills/skill-writer/references/artifact-layouts/inline-skill-layout.md +28 -0
- package/src/internal-skills/skill-writer/references/artifact-layouts/reference-backed-skill-layout.md +35 -0
- package/src/internal-skills/skill-writer/references/artifact-layouts/script-backed-skill-layout.md +31 -0
- package/src/internal-skills/skill-writer/references/authoring-path.md +91 -0
- package/src/internal-skills/skill-writer/references/claude-code/argument-substitutions.md +20 -0
- package/src/internal-skills/skill-writer/references/claude-code/dynamic-context.md +16 -0
- package/src/internal-skills/skill-writer/references/claude-code/frontmatter-and-invocation.md +33 -0
- package/src/internal-skills/skill-writer/references/claude-code/hook-backed-skills.md +28 -0
- package/src/internal-skills/skill-writer/references/claude-code/subagent-fork-skills.md +22 -0
- package/src/internal-skills/skill-writer/references/description-optimization.md +28 -0
- package/src/internal-skills/skill-writer/references/design-principles.md +74 -0
- package/src/internal-skills/skill-writer/references/evaluation-path.md +73 -0
- package/src/internal-skills/skill-writer/references/examples/documentation-skill.md +70 -0
- package/src/internal-skills/skill-writer/references/examples/evaluator-loop-skill.md +38 -0
- package/src/internal-skills/skill-writer/references/examples/hook-backed-skill.md +39 -0
- package/src/internal-skills/skill-writer/references/examples/router-skill.md +41 -0
- package/src/internal-skills/skill-writer/references/examples/security-review-skill.md +69 -0
- package/src/internal-skills/skill-writer/references/examples/subagent-fork-skill.md +39 -0
- package/src/internal-skills/skill-writer/references/examples/workflow-process-skill.md +65 -0
- package/src/internal-skills/skill-writer/references/execution-shapes.md +68 -0
- package/src/internal-skills/skill-writer/references/iteration-evidence.md +82 -0
- package/src/internal-skills/skill-writer/references/iteration-path.md +40 -0
- package/src/internal-skills/skill-writer/references/mode-selection.md +67 -0
- package/src/internal-skills/skill-writer/references/output-contracts.md +68 -0
- package/src/internal-skills/skill-writer/references/reference-architecture.md +71 -0
- package/src/internal-skills/skill-writer/references/registration-validation.md +67 -0
- package/src/internal-skills/skill-writer/references/source-discovery.md +60 -0
- package/src/internal-skills/skill-writer/references/spec-template.md +118 -0
- package/src/internal-skills/skill-writer/references/structure-troubleshooting.md +111 -0
- package/src/internal-skills/skill-writer/references/synthesis-path.md +119 -0
- package/src/internal-skills/skill-writer/references/workflow-mechanics/evaluator-loops.md +25 -0
- package/src/internal-skills/skill-writer/references/workflow-mechanics/orchestrator-workers.md +25 -0
- package/src/internal-skills/skill-writer/references/workflow-mechanics/parallel-workflows.md +21 -0
- package/src/internal-skills/skill-writer/references/workflow-mechanics/plan-validate-execute.md +26 -0
- package/src/internal-skills/skill-writer/references/workflow-mechanics/prompt-chaining.md +24 -0
- package/src/internal-skills/skill-writer/references/workflow-mechanics/routing-workflows.md +28 -0
- package/src/internal-skills/skill-writer/references/workflow-mechanics/validation-loops.md +26 -0
- package/src/internal-skills/skill-writer/scripts/quick_validate.py +158 -0
- package/src/internal-skills/skill-writer/scripts/quick_validate_test.py +79 -0
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/main.js
CHANGED
|
@@ -2,17 +2,18 @@ import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from
|
|
|
2
2
|
import { dirname, join, resolve } from 'node:path';
|
|
3
3
|
import { config as dotenvConfig } from 'dotenv';
|
|
4
4
|
import { Sentry, flushSentry, setGlobalAttributes, emitRunMetric, getTraceId } from '../sentry.js';
|
|
5
|
-
import { loadWardenConfig, resolveSkillConfigs } from '../config/loader.js';
|
|
5
|
+
import { emptyToUndefined, loadWardenConfig, resolveSkillConfigs } from '../config/loader.js';
|
|
6
6
|
import { verifyAuth } from '../sdk/runner.js';
|
|
7
7
|
import { mapExtractionErrorCode } from '../sdk/errors.js';
|
|
8
8
|
import { mergeAuxiliaryUsage } from '../sdk/usage.js';
|
|
9
|
-
import { resolveSkillAsync } from '../skills/loader.js';
|
|
9
|
+
import { resolveSkillAsync, SkillLoaderError } from '../skills/loader.js';
|
|
10
10
|
import { matchTrigger, filterContextByPaths, shouldFail, countFindingsAtOrAbove } from '../triggers/matcher.js';
|
|
11
11
|
import { filterFindings } from '../types/index.js';
|
|
12
12
|
import { DEFAULT_CONCURRENCY, getAnthropicApiKey } from '../utils/index.js';
|
|
13
|
-
import { parseCliArgs,
|
|
13
|
+
import { parseCliArgs, showVersion, classifyTargets } from './args.js';
|
|
14
|
+
import { showHelp } from './help.js';
|
|
14
15
|
import { buildLocalEventContext, buildFileEventContext } from './context.js';
|
|
15
|
-
import { getRepoRoot, getHeadSha, refExists,
|
|
16
|
+
import { getRepoRoot, getHeadSha, refExists, getDefaultBranch } from './git.js';
|
|
16
17
|
import { renderTerminalReport, filterReports } from './terminal.js';
|
|
17
18
|
import { Reporter, detectOutputMode, parseVerbosity, Verbosity, runSkillTasks, runSkillTasksWithInk, pluralize, MODEL_DEFAULT_SENTINEL, writeJsonlContent, renderJsonlString, renderJsonlChunkLine, renderJsonlChunkRecords, initJsonlFile, appendJsonlLine, getRepoLogPath, generateRunId, } from './output/index.js';
|
|
18
19
|
import { cleanupArtifacts } from './log-cleanup.js';
|
|
@@ -23,6 +24,8 @@ import { runAdd } from './commands/add.js';
|
|
|
23
24
|
import { runSetupApp } from './commands/setup-app.js';
|
|
24
25
|
import { runSync } from './commands/sync.js';
|
|
25
26
|
import { runRuns } from './commands/runs.js';
|
|
27
|
+
import { runBuild, runImprove } from './commands/build.js';
|
|
28
|
+
import { generatedSkillDefinitionRootExists, resolveGeneratedSkillTarget, } from '../skill-builder/definition.js';
|
|
26
29
|
/**
|
|
27
30
|
* Global abort controller for graceful shutdown on SIGINT.
|
|
28
31
|
* Used to cancel in-progress SDK queries.
|
|
@@ -54,22 +57,31 @@ function loadEnvFiles(dir) {
|
|
|
54
57
|
dotenvConfig({ path: envLocalPath, override: true, quiet: true });
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
|
-
/**
|
|
58
|
-
* Create a Reporter instance from CLI options.
|
|
59
|
-
*/
|
|
60
60
|
function createReporter(options) {
|
|
61
61
|
const detected = detectOutputMode(options.color);
|
|
62
62
|
const outputMode = options.log ? { ...detected, isTTY: false } : detected;
|
|
63
63
|
const verbosity = parseVerbosity(options.quiet, options.verbose, options.debug);
|
|
64
64
|
return new Reporter(outputMode, verbosity);
|
|
65
65
|
}
|
|
66
|
-
/**
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
/** Resolve the directory Warden should treat as the invocation root. */
|
|
67
|
+
export function resolveInvocationCwd(baseCwd, cliCwd) {
|
|
68
|
+
return cliCwd ? resolve(baseCwd, cliCwd) : baseCwd;
|
|
69
|
+
}
|
|
69
70
|
function resolveConfigPath(options, repoPath) {
|
|
70
71
|
const cwd = process.cwd();
|
|
71
72
|
return options.config ? resolve(cwd, options.config) : resolve(repoPath, 'warden.toml');
|
|
72
73
|
}
|
|
74
|
+
function resolveLocalReviewBase(configDefaultBranch, repoPath) {
|
|
75
|
+
const defaultBranch = configDefaultBranch ?? getDefaultBranch(repoPath);
|
|
76
|
+
if (defaultBranch.includes('/')) {
|
|
77
|
+
return { defaultBranch, base: defaultBranch };
|
|
78
|
+
}
|
|
79
|
+
const remoteTrackingRef = `origin/${defaultBranch}`;
|
|
80
|
+
return {
|
|
81
|
+
defaultBranch,
|
|
82
|
+
base: refExists(remoteTrackingRef, repoPath) ? remoteTrackingRef : defaultBranch,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
73
85
|
/**
|
|
74
86
|
* Emit a minimal JSONL log (summary-only, 0 findings) for early-exit paths.
|
|
75
87
|
*
|
|
@@ -376,6 +388,110 @@ function finalizeRunLog(log, reports, totalDurationMs, error) {
|
|
|
376
388
|
}
|
|
377
389
|
return wrote;
|
|
378
390
|
}
|
|
391
|
+
/** Apply per-skill runner overrides on top of the shared execution defaults. */
|
|
392
|
+
export function mergeSkillRunnerOptions(base, overrides) {
|
|
393
|
+
const merged = { ...base };
|
|
394
|
+
if (overrides.model !== undefined)
|
|
395
|
+
merged.model = overrides.model;
|
|
396
|
+
if (overrides.maxTurns !== undefined)
|
|
397
|
+
merged.maxTurns = overrides.maxTurns;
|
|
398
|
+
if (overrides.runtime !== undefined)
|
|
399
|
+
merged.runtime = overrides.runtime;
|
|
400
|
+
if (overrides.auxiliaryModel !== undefined)
|
|
401
|
+
merged.auxiliaryModel = overrides.auxiliaryModel;
|
|
402
|
+
if (overrides.synthesisModel !== undefined)
|
|
403
|
+
merged.synthesisModel = overrides.synthesisModel;
|
|
404
|
+
if (overrides.auxiliaryMaxRetries !== undefined) {
|
|
405
|
+
merged.auxiliaryMaxRetries = overrides.auxiliaryMaxRetries;
|
|
406
|
+
}
|
|
407
|
+
if (overrides.verifyFindings !== undefined)
|
|
408
|
+
merged.verifyFindings = overrides.verifyFindings;
|
|
409
|
+
return merged;
|
|
410
|
+
}
|
|
411
|
+
function renderSkillRunHeader(args) {
|
|
412
|
+
const { reporter, skill, repoPath, runtimeName, model } = args;
|
|
413
|
+
const source = skill.rootDir && repoPath && skill.rootDir.startsWith(repoPath)
|
|
414
|
+
? skill.rootDir.slice(repoPath.length + 1)
|
|
415
|
+
: skill.rootDir;
|
|
416
|
+
reporter.blank();
|
|
417
|
+
reporter.text(` Skill ${skill.name}`);
|
|
418
|
+
if (source) {
|
|
419
|
+
reporter.text(` Source ${source}`);
|
|
420
|
+
}
|
|
421
|
+
reporter.text(` Model ${model ?? 'default'} [${runtimeName}]`);
|
|
422
|
+
reporter.blank();
|
|
423
|
+
}
|
|
424
|
+
async function createDirectSkillTask(args) {
|
|
425
|
+
const { spec, repoPath, options, reporter, renderHeader } = args;
|
|
426
|
+
let skill;
|
|
427
|
+
try {
|
|
428
|
+
skill = await resolveSkillAsync(spec.skill, repoPath, {
|
|
429
|
+
remote: spec.remote,
|
|
430
|
+
offline: options.offline,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
catch (error) {
|
|
434
|
+
if (error instanceof SkillLoaderError &&
|
|
435
|
+
repoPath &&
|
|
436
|
+
generatedSkillDefinitionRootExists(resolveGeneratedSkillTarget(repoPath, spec.skill).rootDir)) {
|
|
437
|
+
throw new Error(`Generated skill ${spec.skill} is missing generated artifacts. Run "warden build ${spec.skill}" first.`);
|
|
438
|
+
}
|
|
439
|
+
throw error;
|
|
440
|
+
}
|
|
441
|
+
if (renderHeader && !options.json) {
|
|
442
|
+
renderSkillRunHeader({
|
|
443
|
+
reporter,
|
|
444
|
+
skill,
|
|
445
|
+
repoPath,
|
|
446
|
+
runtimeName: spec.runnerOptions.runtime ?? 'claude',
|
|
447
|
+
model: spec.runnerOptions.model,
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
name: spec.name,
|
|
452
|
+
displayName: spec.displayName,
|
|
453
|
+
failOn: spec.failOn,
|
|
454
|
+
minConfidence: spec.minConfidence,
|
|
455
|
+
resolveSkill: async () => skill,
|
|
456
|
+
context: spec.context,
|
|
457
|
+
runnerOptions: spec.runnerOptions,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
/** Expand configured skills into runnable direct tasks. */
|
|
461
|
+
export async function createSkillTasks(args) {
|
|
462
|
+
const tasks = [];
|
|
463
|
+
const singleDirectSkill = args.specs.length === 1;
|
|
464
|
+
for (const spec of args.specs) {
|
|
465
|
+
tasks.push(await createDirectSkillTask({
|
|
466
|
+
spec,
|
|
467
|
+
repoPath: args.repoPath,
|
|
468
|
+
options: args.options,
|
|
469
|
+
reporter: args.reporter,
|
|
470
|
+
renderHeader: singleDirectSkill,
|
|
471
|
+
}));
|
|
472
|
+
}
|
|
473
|
+
return tasks;
|
|
474
|
+
}
|
|
475
|
+
/** Resolve the default analysis model from config, CLI overrides, or environment. */
|
|
476
|
+
export function resolveCliDefaultModel(config, cliModel) {
|
|
477
|
+
return (emptyToUndefined(config?.defaults?.agent?.model) ??
|
|
478
|
+
emptyToUndefined(config?.defaults?.model) ??
|
|
479
|
+
emptyToUndefined(cliModel) ??
|
|
480
|
+
emptyToUndefined(process.env['WARDEN_MODEL']));
|
|
481
|
+
}
|
|
482
|
+
/** Resolve the default auxiliary model used for helper and repair passes. */
|
|
483
|
+
export function resolveCliDefaultAuxiliaryModel(config) {
|
|
484
|
+
return emptyToUndefined(config?.defaults?.auxiliary?.model);
|
|
485
|
+
}
|
|
486
|
+
/** Resolve the default synthesis model, falling back to the auxiliary lane when unset. */
|
|
487
|
+
export function resolveCliDefaultSynthesisModel(config) {
|
|
488
|
+
return (emptyToUndefined(config?.defaults?.synthesis?.model) ??
|
|
489
|
+
resolveCliDefaultAuxiliaryModel(config));
|
|
490
|
+
}
|
|
491
|
+
/** Resolve the model label recorded in JSONL output, including the default sentinel. */
|
|
492
|
+
export function resolveCliLogModel(config, cliModel) {
|
|
493
|
+
return resolveCliDefaultModel(config, cliModel) ?? MODEL_DEFAULT_SENTINEL;
|
|
494
|
+
}
|
|
379
495
|
/**
|
|
380
496
|
* Process skill task results into reports and check for failures.
|
|
381
497
|
* Exported for testing; callers inside main.ts use it directly.
|
|
@@ -408,9 +524,6 @@ export function processTaskResults(results, reportOn, minConfidence) {
|
|
|
408
524
|
const filteredReports = filterReports(reports, reportOn, minConfidence);
|
|
409
525
|
return { reports, filteredReports, hasFailure, failureReasons };
|
|
410
526
|
}
|
|
411
|
-
/**
|
|
412
|
-
* Output results and handle fixes. Returns exit code.
|
|
413
|
-
*/
|
|
414
527
|
async function outputResultsAndHandleFixes(processed, options, reporter, runLog, totalDuration, failFastAborted) {
|
|
415
528
|
const { reports, filteredReports, hasFailure, failureReasons } = processed;
|
|
416
529
|
const traceId = runLog.baseRun.traceId;
|
|
@@ -500,12 +613,8 @@ async function outputResultsAndHandleFixes(processed, options, reporter, runLog,
|
|
|
500
613
|
}
|
|
501
614
|
return 0;
|
|
502
615
|
}
|
|
503
|
-
/**
|
|
504
|
-
|
|
505
|
-
* If skillName is provided, runs only that skill.
|
|
506
|
-
* Otherwise, runs skills from matched triggers in warden.toml.
|
|
507
|
-
*/
|
|
508
|
-
async function runSkills(context, options, reporter) {
|
|
616
|
+
/** Run one or more skills against an already constructed review context. */
|
|
617
|
+
export async function runSkills(context, options, reporter) {
|
|
509
618
|
const cwd = process.cwd();
|
|
510
619
|
const startTime = Date.now();
|
|
511
620
|
// Get API key (optional - SDK can use Claude Code subscription auth)
|
|
@@ -547,6 +656,9 @@ async function runSkills(context, options, reporter) {
|
|
|
547
656
|
const config = configPath && existsSync(configPath)
|
|
548
657
|
? loadWardenConfig(dirname(configPath))
|
|
549
658
|
: null;
|
|
659
|
+
const defaultModel = resolveCliDefaultModel(config, options.model);
|
|
660
|
+
const defaultAuxiliaryModel = resolveCliDefaultAuxiliaryModel(config);
|
|
661
|
+
const defaultSynthesisModel = resolveCliDefaultSynthesisModel(config);
|
|
550
662
|
// Determine which triggers/skills to run
|
|
551
663
|
let skillsToRun;
|
|
552
664
|
if (options.skill) {
|
|
@@ -559,7 +671,20 @@ async function runSkills(context, options, reporter) {
|
|
|
559
671
|
const fallbackFilters = defaultIgnorePaths?.length
|
|
560
672
|
? { ignorePaths: defaultIgnorePaths }
|
|
561
673
|
: {};
|
|
562
|
-
skillsToRun = [{
|
|
674
|
+
skillsToRun = [{
|
|
675
|
+
skill: options.skill,
|
|
676
|
+
remote: match?.remote,
|
|
677
|
+
filters: match?.filters ?? fallbackFilters,
|
|
678
|
+
model: match?.model ?? defaultModel,
|
|
679
|
+
maxTurns: match?.maxTurns ?? config?.defaults?.agent?.maxTurns ?? config?.defaults?.maxTurns,
|
|
680
|
+
runtime: match?.runtime ?? config?.defaults?.runtime ?? 'claude',
|
|
681
|
+
auxiliaryModel: match?.auxiliaryModel ?? defaultAuxiliaryModel,
|
|
682
|
+
synthesisModel: match?.synthesisModel ?? defaultSynthesisModel,
|
|
683
|
+
auxiliaryMaxRetries: match?.auxiliaryMaxRetries ??
|
|
684
|
+
config?.defaults?.auxiliary?.maxRetries ??
|
|
685
|
+
config?.defaults?.auxiliaryMaxRetries,
|
|
686
|
+
verifyFindings: match?.verifyFindings ?? (config?.defaults?.verification?.enabled !== false),
|
|
687
|
+
}];
|
|
563
688
|
}
|
|
564
689
|
else if (config) {
|
|
565
690
|
// Get skills from matched triggers, preserving remote property and filters
|
|
@@ -574,7 +699,18 @@ async function runSkills(context, options, reporter) {
|
|
|
574
699
|
seen.add(t.skill);
|
|
575
700
|
return true;
|
|
576
701
|
})
|
|
577
|
-
.map((t) => ({
|
|
702
|
+
.map((t) => ({
|
|
703
|
+
skill: t.skill,
|
|
704
|
+
remote: t.remote,
|
|
705
|
+
filters: t.filters,
|
|
706
|
+
model: t.model,
|
|
707
|
+
maxTurns: t.maxTurns,
|
|
708
|
+
runtime: t.runtime,
|
|
709
|
+
auxiliaryModel: t.auxiliaryModel,
|
|
710
|
+
synthesisModel: t.synthesisModel,
|
|
711
|
+
auxiliaryMaxRetries: t.auxiliaryMaxRetries,
|
|
712
|
+
verifyFindings: t.verifyFindings,
|
|
713
|
+
}));
|
|
578
714
|
}
|
|
579
715
|
else {
|
|
580
716
|
skillsToRun = [];
|
|
@@ -592,30 +728,54 @@ async function runSkills(context, options, reporter) {
|
|
|
592
728
|
return 0;
|
|
593
729
|
}
|
|
594
730
|
// Build skill tasks
|
|
595
|
-
// Model precedence: defaults.model > CLI flag > WARDEN_MODEL env var > SDK default
|
|
731
|
+
// Model precedence: defaults.agent.model > defaults.model > CLI flag > WARDEN_MODEL env var > SDK default
|
|
596
732
|
// sdkModel is undefined when no model is explicitly configured (lets SDK use its default).
|
|
597
733
|
// logModel records what was used for JSONL logs (sentinel when no explicit model).
|
|
598
|
-
const sdkModel =
|
|
599
|
-
const logModel =
|
|
734
|
+
const sdkModel = defaultModel;
|
|
735
|
+
const logModel = resolveCliLogModel(config, options.model);
|
|
600
736
|
const runnerOptions = {
|
|
601
737
|
apiKey,
|
|
602
738
|
model: sdkModel,
|
|
739
|
+
runtime: config?.defaults?.runtime ?? 'claude',
|
|
740
|
+
auxiliaryModel: defaultAuxiliaryModel,
|
|
741
|
+
synthesisModel: defaultSynthesisModel,
|
|
603
742
|
abortController,
|
|
604
|
-
maxTurns: config?.defaults?.maxTurns,
|
|
743
|
+
maxTurns: config?.defaults?.agent?.maxTurns ?? config?.defaults?.maxTurns,
|
|
605
744
|
batchDelayMs: config?.defaults?.batchDelayMs,
|
|
606
745
|
maxContextFiles: config?.defaults?.chunking?.maxContextFiles,
|
|
607
|
-
auxiliaryMaxRetries: config?.defaults?.
|
|
746
|
+
auxiliaryMaxRetries: config?.defaults?.auxiliary?.maxRetries ??
|
|
747
|
+
config?.defaults?.auxiliaryMaxRetries,
|
|
748
|
+
verifyFindings: config?.defaults?.verification?.enabled !== false,
|
|
608
749
|
};
|
|
609
|
-
const
|
|
750
|
+
const specs = skillsToRun.map(({ skill, remote, filters, ...skillOptions }) => ({
|
|
610
751
|
name: skill,
|
|
752
|
+
skill,
|
|
753
|
+
remote,
|
|
611
754
|
failOn: options.failOn,
|
|
612
|
-
resolveSkill: () => resolveSkillAsync(skill, repoPath, {
|
|
613
|
-
remote,
|
|
614
|
-
offline: options.offline,
|
|
615
|
-
}),
|
|
616
755
|
context: filterContextByPaths(context, filters),
|
|
617
|
-
runnerOptions,
|
|
756
|
+
runnerOptions: mergeSkillRunnerOptions(runnerOptions, skillOptions),
|
|
618
757
|
}));
|
|
758
|
+
let tasks;
|
|
759
|
+
const concurrency = options.parallel ?? DEFAULT_CONCURRENCY;
|
|
760
|
+
try {
|
|
761
|
+
tasks = await createSkillTasks({
|
|
762
|
+
specs,
|
|
763
|
+
repoPath,
|
|
764
|
+
options,
|
|
765
|
+
parallel: concurrency,
|
|
766
|
+
reporter,
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
catch (error) {
|
|
770
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
771
|
+
reporter.error(message);
|
|
772
|
+
emitEmptyRunLog(repoPath ?? cwd, options, {
|
|
773
|
+
code: 'unknown',
|
|
774
|
+
message,
|
|
775
|
+
timestamp: new Date().toISOString(),
|
|
776
|
+
});
|
|
777
|
+
return 1;
|
|
778
|
+
}
|
|
619
779
|
// Open the run's JSONL log before launching skills so `warden runs
|
|
620
780
|
// follow <runId>` works from a second terminal while the run is live.
|
|
621
781
|
const runId = generateRunId();
|
|
@@ -640,7 +800,6 @@ async function runSkills(context, options, reporter) {
|
|
|
640
800
|
startTime,
|
|
641
801
|
});
|
|
642
802
|
// Run skills with Ink UI (TTY) or simple console output (non-TTY)
|
|
643
|
-
const concurrency = options.parallel ?? DEFAULT_CONCURRENCY;
|
|
644
803
|
failFastController = options.failFast ? new AbortController() : undefined;
|
|
645
804
|
const taskOptions = {
|
|
646
805
|
mode: reporter.mode,
|
|
@@ -659,9 +818,6 @@ async function runSkills(context, options, reporter) {
|
|
|
659
818
|
const processed = processTaskResults(results, options.reportOn, effectiveMinConfidence);
|
|
660
819
|
return outputResultsAndHandleFixes(processed, options, reporter, runLog, totalDuration, failFastController?.signal.aborted);
|
|
661
820
|
}
|
|
662
|
-
/**
|
|
663
|
-
* Run in file mode: analyze specific files.
|
|
664
|
-
*/
|
|
665
821
|
async function runFileMode(filePatterns, options, reporter) {
|
|
666
822
|
const cwd = process.cwd();
|
|
667
823
|
// Build context from files
|
|
@@ -704,9 +860,6 @@ function parseGitRef(ref) {
|
|
|
704
860
|
}
|
|
705
861
|
return { base: ref, head: 'HEAD' };
|
|
706
862
|
}
|
|
707
|
-
/**
|
|
708
|
-
* Run in git ref mode: analyze changes from a git ref.
|
|
709
|
-
*/
|
|
710
863
|
async function runGitRefMode(gitRef, options, reporter) {
|
|
711
864
|
const cwd = process.cwd();
|
|
712
865
|
let repoPath;
|
|
@@ -756,9 +909,6 @@ async function runGitRefMode(gitRef, options, reporter) {
|
|
|
756
909
|
reporter.contextFiles(pullRequest.files);
|
|
757
910
|
return runSkills(context, options, reporter);
|
|
758
911
|
}
|
|
759
|
-
/**
|
|
760
|
-
* Run in config mode: use warden.toml triggers.
|
|
761
|
-
*/
|
|
762
912
|
async function runConfigMode(options, reporter) {
|
|
763
913
|
const cwd = process.cwd();
|
|
764
914
|
let repoPath;
|
|
@@ -780,13 +930,18 @@ async function runConfigMode(options, reporter) {
|
|
|
780
930
|
}
|
|
781
931
|
// Load config
|
|
782
932
|
const config = loadWardenConfig(dirname(configPath));
|
|
783
|
-
// Build context from local git
|
|
784
|
-
|
|
933
|
+
// Build context from local git. By default, mirror PR-style analysis:
|
|
934
|
+
// compare the configured/default branch merge base to HEAD.
|
|
935
|
+
const localReviewBase = resolveLocalReviewBase(config.defaults?.defaultBranch, repoPath);
|
|
936
|
+
const statusMessage = options.staged
|
|
937
|
+
? 'Analyzing staged changes...'
|
|
938
|
+
: `Analyzing changes from ${localReviewBase.base} to HEAD...`;
|
|
785
939
|
reporter.startContext(statusMessage);
|
|
786
940
|
const context = buildLocalEventContext({
|
|
787
|
-
base: 'HEAD',
|
|
941
|
+
base: options.staged ? 'HEAD' : localReviewBase.base,
|
|
942
|
+
head: options.staged ? undefined : 'HEAD',
|
|
788
943
|
cwd: repoPath,
|
|
789
|
-
defaultBranch:
|
|
944
|
+
defaultBranch: localReviewBase.defaultBranch,
|
|
790
945
|
staged: options.staged,
|
|
791
946
|
});
|
|
792
947
|
const pullRequest = context.pullRequest;
|
|
@@ -801,10 +956,7 @@ async function runConfigMode(options, reporter) {
|
|
|
801
956
|
reporter.renderEmptyState('No staged changes found');
|
|
802
957
|
}
|
|
803
958
|
else {
|
|
804
|
-
|
|
805
|
-
? 'Specify a git ref: warden HEAD~3 --skill <name>'
|
|
806
|
-
: undefined;
|
|
807
|
-
reporter.renderEmptyState('No uncommitted changes found', tip);
|
|
959
|
+
reporter.renderEmptyState(`No changes found from ${pullRequest.baseBranch} to HEAD`, 'Use --staged to analyze staged changes');
|
|
808
960
|
}
|
|
809
961
|
reporter.blank();
|
|
810
962
|
}
|
|
@@ -850,7 +1002,6 @@ async function runConfigMode(options, reporter) {
|
|
|
850
1002
|
if (!apiKey) {
|
|
851
1003
|
reporter.debug('No API key found. Using Claude Code subscription auth.');
|
|
852
1004
|
}
|
|
853
|
-
// Pre-flight: verify auth will work before starting analysis
|
|
854
1005
|
try {
|
|
855
1006
|
verifyAuth({ apiKey });
|
|
856
1007
|
}
|
|
@@ -866,31 +1017,54 @@ async function runConfigMode(options, reporter) {
|
|
|
866
1017
|
}
|
|
867
1018
|
// Build trigger tasks
|
|
868
1019
|
const effectiveMinConfidence = options.minConfidence ?? config.defaults?.minConfidence ?? 'medium';
|
|
869
|
-
const
|
|
1020
|
+
const specs = triggersToRun.map((trigger) => ({
|
|
870
1021
|
name: trigger.name,
|
|
871
1022
|
displayName: trigger.skill,
|
|
1023
|
+
skill: trigger.skill,
|
|
1024
|
+
remote: trigger.remote,
|
|
872
1025
|
failOn: trigger.failOn ?? options.failOn,
|
|
873
1026
|
minConfidence: trigger.minConfidence ?? effectiveMinConfidence,
|
|
874
|
-
resolveSkill: () => resolveSkillAsync(trigger.skill, repoPath, {
|
|
875
|
-
remote: trigger.remote,
|
|
876
|
-
offline: options.offline,
|
|
877
|
-
}),
|
|
878
1027
|
context: filterContextByPaths(context, trigger.filters),
|
|
879
1028
|
runnerOptions: {
|
|
880
1029
|
apiKey,
|
|
881
1030
|
model: trigger.model,
|
|
1031
|
+
runtime: trigger.runtime,
|
|
1032
|
+
auxiliaryModel: trigger.auxiliaryModel,
|
|
1033
|
+
synthesisModel: trigger.synthesisModel,
|
|
882
1034
|
abortController,
|
|
883
1035
|
maxTurns: trigger.maxTurns,
|
|
884
1036
|
maxContextFiles: config.defaults?.chunking?.maxContextFiles,
|
|
885
|
-
auxiliaryMaxRetries:
|
|
1037
|
+
auxiliaryMaxRetries: trigger.auxiliaryMaxRetries,
|
|
1038
|
+
verifyFindings: trigger.verifyFindings,
|
|
886
1039
|
},
|
|
887
1040
|
}));
|
|
1041
|
+
let tasks;
|
|
1042
|
+
const concurrency = options.parallel ?? config.runner?.concurrency ?? DEFAULT_CONCURRENCY;
|
|
1043
|
+
try {
|
|
1044
|
+
tasks = await createSkillTasks({
|
|
1045
|
+
specs,
|
|
1046
|
+
repoPath,
|
|
1047
|
+
options,
|
|
1048
|
+
parallel: concurrency,
|
|
1049
|
+
reporter,
|
|
1050
|
+
});
|
|
1051
|
+
}
|
|
1052
|
+
catch (error) {
|
|
1053
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1054
|
+
reporter.error(message);
|
|
1055
|
+
emitEmptyRunLog(repoPath, options, {
|
|
1056
|
+
code: 'unknown',
|
|
1057
|
+
message,
|
|
1058
|
+
timestamp: new Date().toISOString(),
|
|
1059
|
+
});
|
|
1060
|
+
return 1;
|
|
1061
|
+
}
|
|
888
1062
|
// Initialize the run's JSONL log up front so a second terminal can
|
|
889
1063
|
// `warden runs follow <runId>` while skills are still running.
|
|
890
1064
|
// Skill records are appended on each completion; the trailing summary
|
|
891
1065
|
// is appended in `outputResultsAndHandleFixes`.
|
|
892
1066
|
// Run-level model is the default (ignoring per-trigger overrides); per-skill models are on each report.
|
|
893
|
-
const defaultModel = config
|
|
1067
|
+
const defaultModel = resolveCliLogModel(config, options.model);
|
|
894
1068
|
const runId = generateRunId();
|
|
895
1069
|
const timestamp = new Date();
|
|
896
1070
|
const traceId = getTraceId();
|
|
@@ -913,7 +1087,6 @@ async function runConfigMode(options, reporter) {
|
|
|
913
1087
|
startTime,
|
|
914
1088
|
});
|
|
915
1089
|
// Run triggers with Ink UI (TTY) or simple console output (non-TTY)
|
|
916
|
-
const concurrency = options.parallel ?? config.runner?.concurrency ?? DEFAULT_CONCURRENCY;
|
|
917
1090
|
failFastController = options.failFast ? new AbortController() : undefined;
|
|
918
1091
|
const taskOptions = {
|
|
919
1092
|
mode: reporter.mode,
|
|
@@ -931,10 +1104,6 @@ async function runConfigMode(options, reporter) {
|
|
|
931
1104
|
const processed = processTaskResults(results, options.reportOn, effectiveMinConfidence);
|
|
932
1105
|
return outputResultsAndHandleFixes(processed, options, reporter, runLog, totalDuration, failFastController?.signal.aborted);
|
|
933
1106
|
}
|
|
934
|
-
/**
|
|
935
|
-
* Run in direct skill mode: run a specific skill on uncommitted changes.
|
|
936
|
-
* Used when --skill is specified without targets.
|
|
937
|
-
*/
|
|
938
1107
|
async function runDirectSkillMode(options, reporter) {
|
|
939
1108
|
const cwd = process.cwd();
|
|
940
1109
|
let repoPath;
|
|
@@ -949,13 +1118,18 @@ async function runDirectSkillMode(options, reporter) {
|
|
|
949
1118
|
// Load config to get defaultBranch if available
|
|
950
1119
|
const configPath = resolveConfigPath(options, repoPath);
|
|
951
1120
|
const config = existsSync(configPath) ? loadWardenConfig(dirname(configPath)) : null;
|
|
952
|
-
// Build context from local git
|
|
953
|
-
|
|
1121
|
+
// Build context from local git. By default, mirror PR-style analysis:
|
|
1122
|
+
// compare the configured/default branch merge base to HEAD.
|
|
1123
|
+
const localReviewBase = resolveLocalReviewBase(config?.defaults?.defaultBranch, repoPath);
|
|
1124
|
+
const statusMessage = options.staged
|
|
1125
|
+
? 'Analyzing staged changes...'
|
|
1126
|
+
: `Analyzing changes from ${localReviewBase.base} to HEAD...`;
|
|
954
1127
|
reporter.startContext(statusMessage);
|
|
955
1128
|
const context = buildLocalEventContext({
|
|
956
|
-
base: 'HEAD',
|
|
1129
|
+
base: options.staged ? 'HEAD' : localReviewBase.base,
|
|
1130
|
+
head: options.staged ? undefined : 'HEAD',
|
|
957
1131
|
cwd: repoPath,
|
|
958
|
-
defaultBranch:
|
|
1132
|
+
defaultBranch: localReviewBase.defaultBranch,
|
|
959
1133
|
staged: options.staged,
|
|
960
1134
|
});
|
|
961
1135
|
const pullRequest = context.pullRequest;
|
|
@@ -970,8 +1144,7 @@ async function runDirectSkillMode(options, reporter) {
|
|
|
970
1144
|
reporter.renderEmptyState('No staged changes found');
|
|
971
1145
|
}
|
|
972
1146
|
else {
|
|
973
|
-
|
|
974
|
-
reporter.renderEmptyState('No uncommitted changes found', tip);
|
|
1147
|
+
reporter.renderEmptyState(`No changes found from ${pullRequest.baseBranch} to HEAD`, 'Use --staged to analyze staged changes');
|
|
975
1148
|
}
|
|
976
1149
|
reporter.blank();
|
|
977
1150
|
}
|
|
@@ -986,7 +1159,7 @@ async function runCommand(options, reporter) {
|
|
|
986
1159
|
if (options.staged && targets.length > 0) {
|
|
987
1160
|
reporter.warning('--staged is ignored when targets are specified');
|
|
988
1161
|
}
|
|
989
|
-
// No targets with --skill → run skill directly on
|
|
1162
|
+
// No targets with --skill → run skill directly on current branch changes
|
|
990
1163
|
if (targets.length === 0 && options.skill) {
|
|
991
1164
|
return runDirectSkillMode(options, reporter);
|
|
992
1165
|
}
|
|
@@ -1016,16 +1189,31 @@ async function runCommand(options, reporter) {
|
|
|
1016
1189
|
// File mode
|
|
1017
1190
|
return runFileMode(filePatterns, options, reporter);
|
|
1018
1191
|
}
|
|
1192
|
+
/** Parse CLI input, dispatch the selected command, and perform shutdown cleanup. */
|
|
1019
1193
|
export async function main() {
|
|
1020
|
-
const { command, options, setupAppOptions, runsOptions } = parseCliArgs();
|
|
1194
|
+
const { command, options, helpTarget, setupAppOptions, runsOptions } = parseCliArgs();
|
|
1021
1195
|
if (command === 'help') {
|
|
1022
|
-
showHelp();
|
|
1196
|
+
showHelp(helpTarget);
|
|
1023
1197
|
process.exit(0);
|
|
1024
1198
|
}
|
|
1025
1199
|
if (command === 'version') {
|
|
1026
1200
|
showVersion();
|
|
1027
1201
|
process.exit(0);
|
|
1028
1202
|
}
|
|
1203
|
+
const reporter = createReporter(options);
|
|
1204
|
+
const originalCwd = process.cwd();
|
|
1205
|
+
const invocationCwd = resolveInvocationCwd(originalCwd, options.cwd);
|
|
1206
|
+
if (invocationCwd !== originalCwd) {
|
|
1207
|
+
try {
|
|
1208
|
+
process.chdir(invocationCwd);
|
|
1209
|
+
}
|
|
1210
|
+
catch (error) {
|
|
1211
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1212
|
+
reporter.error(`Unable to change to ${invocationCwd}: ${message}`);
|
|
1213
|
+
process.exit(1);
|
|
1214
|
+
return;
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1029
1217
|
// Load environment variables from .env files at CLI entry point.
|
|
1030
1218
|
// Try repo root first, fall back to cwd if not in a git repo.
|
|
1031
1219
|
const cwd = process.cwd();
|
|
@@ -1037,8 +1225,6 @@ export async function main() {
|
|
|
1037
1225
|
// Not in a git repo - use cwd
|
|
1038
1226
|
}
|
|
1039
1227
|
loadEnvFiles(envDir);
|
|
1040
|
-
// Create reporter based on options
|
|
1041
|
-
const reporter = createReporter(options);
|
|
1042
1228
|
// Show header (unless JSON output or quiet)
|
|
1043
1229
|
if (!options.json) {
|
|
1044
1230
|
reporter.header();
|
|
@@ -1068,6 +1254,10 @@ export async function main() {
|
|
|
1068
1254
|
process.exit(1);
|
|
1069
1255
|
}
|
|
1070
1256
|
return runRuns(runsOptions, options, reporter);
|
|
1257
|
+
case 'build':
|
|
1258
|
+
return runBuild(options, reporter, { abortController, interrupted });
|
|
1259
|
+
case 'improve':
|
|
1260
|
+
return runImprove(options, reporter, { abortController, interrupted });
|
|
1071
1261
|
default:
|
|
1072
1262
|
return runCommand(options, reporter);
|
|
1073
1263
|
}
|