@vibe-agent-toolkit/cli 0.1.40-rc.2 → 0.1.41-rc.1
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/dist/bin.js +2 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/skill/test/configure.js +1 -1
- package/dist/commands/skill/test/configure.js.map +1 -1
- package/dist/commands/skill/test/run.d.ts +43 -3
- package/dist/commands/skill/test/run.d.ts.map +1 -1
- package/dist/commands/skill/test/run.js +207 -66
- package/dist/commands/skill/test/run.js.map +1 -1
- package/dist/commands/validate.d.ts +31 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +163 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +6 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/skill-resolution/index.d.ts +2 -2
- package/dist/skill-resolution/index.d.ts.map +1 -1
- package/dist/skill-resolution/index.js +1 -1
- package/dist/skill-resolution/index.js.map +1 -1
- package/dist/skill-resolution/resolve-skill-reference.d.ts +9 -1
- package/dist/skill-resolution/resolve-skill-reference.d.ts.map +1 -1
- package/dist/skill-resolution/resolve-skill-reference.js +56 -19
- package/dist/skill-resolution/resolve-skill-reference.js.map +1 -1
- package/dist/skill-resolution/types.d.ts +21 -0
- package/dist/skill-resolution/types.d.ts.map +1 -1
- package/docs/agent.md +1 -1
- package/package.json +16 -15
package/dist/bin.js
CHANGED
|
@@ -17,6 +17,7 @@ import { createRagCommand, showRagVerboseHelp } from './commands/rag/index.js';
|
|
|
17
17
|
import { createResourcesCommand, showResourcesVerboseHelp } from './commands/resources/index.js';
|
|
18
18
|
import { createSkillCommand } from './commands/skill/index.js';
|
|
19
19
|
import { createSkillsCommand } from './commands/skills/index.js';
|
|
20
|
+
import { createValidateTopLevelCommand } from './commands/validate.js';
|
|
20
21
|
import { createVerifyTopLevelCommand } from './commands/verify.js';
|
|
21
22
|
import { loadVerboseHelp } from './utils/help-loader.js';
|
|
22
23
|
import { createLogger } from './utils/logger.js';
|
|
@@ -120,6 +121,7 @@ program.addCommand(createSkillCommand());
|
|
|
120
121
|
program.addCommand(createClaudeCommand());
|
|
121
122
|
// Add top-level orchestration commands
|
|
122
123
|
program.addCommand(createBuildTopLevelCommand());
|
|
124
|
+
program.addCommand(createValidateTopLevelCommand());
|
|
123
125
|
program.addCommand(createVerifyTopLevelCommand());
|
|
124
126
|
// Add standalone commands
|
|
125
127
|
doctorCommand(program);
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -97,7 +97,7 @@ export function createSkillTestConfigureCommand() {
|
|
|
97
97
|
.description('Upsert the test block for a skill in vibe-agent-toolkit.config.yaml')
|
|
98
98
|
.argument('<skill>', 'Skill name (key under skills.config)')
|
|
99
99
|
.option('--auth <mode>', 'Auth mechanism: inherit | subscription | api-key | auto')
|
|
100
|
-
.option('--max-turns <n>', '
|
|
100
|
+
.option('--max-turns <n>', 'Per-spawn cap on executor/grader turns (positive integer)')
|
|
101
101
|
.option('--max-budget-usd <n>', 'Hard USD budget cap (positive number)')
|
|
102
102
|
.option('--timeout <s>', 'Wall-clock timeout in seconds (positive integer)')
|
|
103
103
|
.option('--stall <s>', 'Stall-watchdog seconds (positive integer)')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../../src/commands/skill/test/configure.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../../src/commands/skill/test/configure.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* print the §12 security warning, call runSkillTestHarness, map result/error to exit code.
|
|
6
6
|
* All domain logic lives in run-harness.ts (agent-skills package).
|
|
7
7
|
*/
|
|
8
|
-
import { runSkillTestHarness } from '@vibe-agent-toolkit/agent-skills';
|
|
8
|
+
import { runSkillTestHarness, type SkillPackagingConfig } from '@vibe-agent-toolkit/agent-skills';
|
|
9
9
|
import { Command } from 'commander';
|
|
10
10
|
export interface SkillTestRunOptions {
|
|
11
11
|
with?: string[];
|
|
@@ -21,20 +21,35 @@ export interface SkillTestRunOptions {
|
|
|
21
21
|
allowUnverifiedSkillSource?: boolean;
|
|
22
22
|
iUnderstandThisRunsSkillCode?: boolean;
|
|
23
23
|
model?: string;
|
|
24
|
+
/** Model for the fixed grader/judge (GLOBAL, independent of `model` — the model UNDER TEST). */
|
|
25
|
+
graderModel?: string;
|
|
24
26
|
maxTurns?: string;
|
|
25
27
|
maxBudgetUsd?: string;
|
|
26
28
|
timeout?: string;
|
|
27
29
|
stall?: string;
|
|
30
|
+
/** Max evals graded in parallel (GLOBAL — the executor→grader pipeline width). */
|
|
31
|
+
concurrency?: string;
|
|
28
32
|
debug?: boolean;
|
|
29
33
|
env?: string[];
|
|
30
34
|
passEnv?: string[];
|
|
31
35
|
/** Skip building a declared subject and stage its existing dist instead. */
|
|
32
36
|
noBuild?: boolean;
|
|
33
|
-
/**
|
|
34
|
-
|
|
37
|
+
/** Opt out of the fail-closed default: exit Ok (0) even when an eval fails. */
|
|
38
|
+
allowEvalFailure?: boolean;
|
|
35
39
|
}
|
|
36
40
|
type HarnessOpts = Parameters<typeof runSkillTestHarness>[0];
|
|
37
41
|
type SkillSourceSpec = NonNullable<HarnessOpts['withSources']>[string];
|
|
42
|
+
/** The declared-executable recognition aid the harness forwards to the WITH-arm grader. */
|
|
43
|
+
type DeclaredExecutable = NonNullable<HarnessOpts['declaredExecutables']>[number];
|
|
44
|
+
/**
|
|
45
|
+
* Map a resolved skill's packaging-config `executables` (SkillExecutableEntry[]) to
|
|
46
|
+
* the grader's recognition-aid shape (issue #145 Phase T): each entry's stable NAME
|
|
47
|
+
* is its `path` basename with the extension stripped (`scripts/dxa.py` → `dxa`),
|
|
48
|
+
* carried alongside its `howInvoked` + `kind`. Returns undefined for absent/empty
|
|
49
|
+
* input so the harness omits the aid entirely (the grader still matches tools by the
|
|
50
|
+
* commands in the transcript). Pure + unit-testable.
|
|
51
|
+
*/
|
|
52
|
+
export declare function deriveDeclaredExecutableNames(executables: SkillPackagingConfig['executables']): DeclaredExecutable[] | undefined;
|
|
38
53
|
/**
|
|
39
54
|
* Resolve one cost/runtime knob with flag > config > default precedence AND a
|
|
40
55
|
* built-in safety cap, enforcing an asymmetry between the two sources:
|
|
@@ -69,6 +84,19 @@ export interface ResolvedSubject {
|
|
|
69
84
|
* or when the subject is a plain source.
|
|
70
85
|
*/
|
|
71
86
|
dryRunStagedExistingDist?: boolean;
|
|
87
|
+
/**
|
|
88
|
+
* True when a PATH target mapped back to a declared skill (its `test:` config is
|
|
89
|
+
* honored and its scaffold dir points at the authored source). Gates the
|
|
90
|
+
* config-bypass warning: only a path with NO declared linkage is config-blind.
|
|
91
|
+
*/
|
|
92
|
+
linkedToDeclaredSkill?: boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Declared executables (name + kind + howInvoked) derived from the subject's
|
|
95
|
+
* packaging config, forwarded to the WITH-arm grader as a tool recognition aid
|
|
96
|
+
* (issue #145 Phase T). Populated ONLY for a `buildable` subject (which carries
|
|
97
|
+
* `packagingConfig`); a plain path/source subject leaves it undefined.
|
|
98
|
+
*/
|
|
99
|
+
declaredExecutables?: DeclaredExecutable[];
|
|
72
100
|
}
|
|
73
101
|
/**
|
|
74
102
|
* Project-aware subject resolution for `vat skill test run`. Resolves the subject
|
|
@@ -82,6 +110,18 @@ export declare function resolveSubjectForTest(ref: string, cwd: string, flags: {
|
|
|
82
110
|
acknowledged: boolean;
|
|
83
111
|
build?: string;
|
|
84
112
|
}): Promise<ResolvedSubject>;
|
|
113
|
+
/**
|
|
114
|
+
* True when the resolved subject is a CONFIG-BLIND path target: a `{ path }` source
|
|
115
|
+
* staged AS-IS (not built) that does NOT map back to a declared skill, so the project's
|
|
116
|
+
* `test:` config cannot be applied to it. A path that DOES map to a declared skill
|
|
117
|
+
* (`linkedToDeclaredSkill`) honors config and is NOT blind. A config-declared NAME
|
|
118
|
+
* target (`wouldBuild`) is never blind. Gates the #7 warning. Pure + exported for tests.
|
|
119
|
+
*/
|
|
120
|
+
export declare function isPathSourceTarget(subject: {
|
|
121
|
+
wouldBuild: boolean;
|
|
122
|
+
subjectSource: SkillSourceSpec;
|
|
123
|
+
linkedToDeclaredSkill?: boolean;
|
|
124
|
+
}): boolean;
|
|
85
125
|
/**
|
|
86
126
|
* The unit-testable action for `vat skill test run`. Exported so tests can
|
|
87
127
|
* call it directly without parsing CLI args. Calls process.exit on completion.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/commands/skill/test/run.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAOL,mBAAmB,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/commands/skill/test/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
* All domain logic lives in run-harness.ts (agent-skills package).
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync } from 'node:fs';
|
|
9
|
-
import { basename, dirname } from 'node:path';
|
|
9
|
+
import { basename, dirname, extname } from 'node:path';
|
|
10
10
|
import { BootstrapNeededError, isAcknowledged, mapErrorToExitCode, packageSkill, packagingConfigToPackageOptions, runPreStageBuild, runSkillTestHarness, SecurityAckError, SKILL_TEST_BUILTIN_CAPS, SkillBuildError, SkillTestExitCode, } from '@vibe-agent-toolkit/agent-skills';
|
|
11
11
|
import { findProjectRoot, safePath, toForwardSlash } from '@vibe-agent-toolkit/utils';
|
|
12
12
|
import { Command } from 'commander';
|
|
13
13
|
import { parseSourceSpec } from '../../../skill-resolution/classify.js';
|
|
14
|
-
import { resolveSkillReference } from '../../../skill-resolution/index.js';
|
|
15
|
-
import { loadConfig } from '../../../utils/config-loader.js';
|
|
14
|
+
import { findDeclaredSkillForPath, resolveSkillReference, } from '../../../skill-resolution/index.js';
|
|
15
|
+
import { ConfigLoadError, loadConfig } from '../../../utils/config-loader.js';
|
|
16
16
|
import { runClaudePluginBuild } from '../../claude/plugin/build.js';
|
|
17
17
|
import { assertValidAuth, assertValidRequireAuth } from './auth-flags.js';
|
|
18
18
|
/** Extract the trailing path segment (cross-platform) from a path-like string. */
|
|
@@ -25,8 +25,8 @@ function lastPathSegment(p) {
|
|
|
25
25
|
const SECURITY_WARNING = `
|
|
26
26
|
WARNING: 'vat skill test run' EXECUTES the skill's code on your machine.
|
|
27
27
|
|
|
28
|
-
It spawns
|
|
29
|
-
so the staged skill files
|
|
28
|
+
It spawns headless Claude sessions with --permission-mode bypassPermissions,
|
|
29
|
+
so the staged skill files run with YOUR user account's
|
|
30
30
|
full privileges: they can read and write your files (including credentials under
|
|
31
31
|
~/.claude, SSH keys, cloud configs), run shell commands, and make network
|
|
32
32
|
requests. The auth credential used to bill the run is reachable by that code.
|
|
@@ -75,8 +75,29 @@ function coerceKnobs(options) {
|
|
|
75
75
|
const stall = coercePositiveInt(options.stall, '--stall');
|
|
76
76
|
if (stall !== undefined)
|
|
77
77
|
result.stall = stall;
|
|
78
|
+
const concurrency = coercePositiveInt(options.concurrency, '--concurrency');
|
|
79
|
+
if (concurrency !== undefined)
|
|
80
|
+
result.concurrency = concurrency;
|
|
78
81
|
return result;
|
|
79
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Map a resolved skill's packaging-config `executables` (SkillExecutableEntry[]) to
|
|
85
|
+
* the grader's recognition-aid shape (issue #145 Phase T): each entry's stable NAME
|
|
86
|
+
* is its `path` basename with the extension stripped (`scripts/dxa.py` → `dxa`),
|
|
87
|
+
* carried alongside its `howInvoked` + `kind`. Returns undefined for absent/empty
|
|
88
|
+
* input so the harness omits the aid entirely (the grader still matches tools by the
|
|
89
|
+
* commands in the transcript). Pure + unit-testable.
|
|
90
|
+
*/
|
|
91
|
+
export function deriveDeclaredExecutableNames(executables) {
|
|
92
|
+
if (executables === undefined || executables.length === 0)
|
|
93
|
+
return undefined;
|
|
94
|
+
return executables.map((e) => {
|
|
95
|
+
const base = basename(toForwardSlash(e.path));
|
|
96
|
+
const ext = extname(base);
|
|
97
|
+
const name = ext === '' ? base : base.slice(0, -ext.length);
|
|
98
|
+
return { name, howInvoked: e.howInvoked, kind: e.kind };
|
|
99
|
+
});
|
|
100
|
+
}
|
|
80
101
|
/**
|
|
81
102
|
* Parse a single `name=src` pair into a [name, SkillSourceSpec] tuple. The
|
|
82
103
|
* source half uses a `kind:value` prefix:
|
|
@@ -133,25 +154,34 @@ function descriptorsToRecord(list) {
|
|
|
133
154
|
// Precedence resolution: flag > config > default
|
|
134
155
|
// ---------------------------------------------------------------------------
|
|
135
156
|
/**
|
|
136
|
-
* Load the persisted `skills.config.<skill>.test` block for the subject skill
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
157
|
+
* Load the persisted `skills.config.<skill>.test` block for the subject skill,
|
|
158
|
+
* PROJECT-AWARE (mirrors the resolver — not a parallel cwd+basename resolver).
|
|
159
|
+
*
|
|
160
|
+
* A PATH target (`./dist/skills/my-skill/`) is mapped back to its declared skill
|
|
161
|
+
* via {@link findDeclaredSkillForPath} (walks up from the path, config-first) and
|
|
162
|
+
* keyed by the DECLARED name against the GOVERNING config — so a path target honors
|
|
163
|
+
* the same model/evals/timeout as its name, regardless of cwd. A NAME target (or a
|
|
164
|
+
* path that maps to no declared skill) falls back to the cwd-anchored governing
|
|
165
|
+
* config keyed by basename. Missing config / missing file → undefined (defaults apply).
|
|
166
|
+
*
|
|
167
|
+
* A broken config throws {@link ConfigLoadError}; we let it propagate to the preflight
|
|
168
|
+
* guard in runSkillTestRun, which surfaces it as a clean exit-2 error rather than
|
|
169
|
+
* silently applying defaults against a config the author clearly intended.
|
|
140
170
|
*/
|
|
141
|
-
function loadTestConfig(skills) {
|
|
142
|
-
const
|
|
171
|
+
async function loadTestConfig(skills, cwd) {
|
|
172
|
+
const subject = skills[0] ?? '';
|
|
173
|
+
// Path target → resolve the declared skill it materializes, and read its test
|
|
174
|
+
// block from that skill's own governing config root (cwd-independent).
|
|
175
|
+
const link = await findDeclaredSkillForPath(subject, cwd);
|
|
176
|
+
if (link !== undefined) {
|
|
177
|
+
return loadConfig(link.configRoot)?.skills?.config?.[link.name]?.test;
|
|
178
|
+
}
|
|
179
|
+
const projectRoot = findProjectRoot(cwd);
|
|
143
180
|
if (projectRoot === null)
|
|
144
181
|
return undefined;
|
|
145
|
-
|
|
146
|
-
// config file is present but broken. We deliberately let that throw propagate:
|
|
147
|
-
// it is caught by the preflight guard in runSkillTestRun and surfaced as a
|
|
148
|
-
// clean exit-2 error, rather than silently applying defaults (and potentially
|
|
149
|
-
// staging the wrong subject) against a config the author clearly intended.
|
|
150
|
-
const config = loadConfig(projectRoot);
|
|
151
|
-
const perSkill = config?.skills?.config;
|
|
182
|
+
const perSkill = loadConfig(projectRoot)?.skills?.config;
|
|
152
183
|
if (perSkill === undefined)
|
|
153
184
|
return undefined;
|
|
154
|
-
const subject = skills[0] ?? '';
|
|
155
185
|
const base = lastPathSegment(subject) || subject;
|
|
156
186
|
return perSkill[subject]?.test ?? perSkill[base]?.test;
|
|
157
187
|
}
|
|
@@ -159,6 +189,24 @@ function loadTestConfig(skills) {
|
|
|
159
189
|
function resolveRepoRoot() {
|
|
160
190
|
return findProjectRoot(process.cwd()) ?? process.cwd();
|
|
161
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Load the persisted TOP-LEVEL `test:` config node (`graderModel`, `concurrency`)
|
|
194
|
+
* from the GOVERNING project config. Deliberately distinct from
|
|
195
|
+
* {@link loadTestConfig}, which reads the PER-SKILL `skills.config.<skill>.test`
|
|
196
|
+
* block: graderModel/concurrency are global judge/pipeline settings that apply
|
|
197
|
+
* across every skill's test run, not something a single skill's config should
|
|
198
|
+
* override (issue #145).
|
|
199
|
+
*
|
|
200
|
+
* Undefined when there's no project root or no `test:` node. A broken config
|
|
201
|
+
* throws {@link ConfigLoadError}, propagated the same way as loadTestConfig's
|
|
202
|
+
* errors (surfaced by the caller's preflight guard as a clean exit-2).
|
|
203
|
+
*/
|
|
204
|
+
function loadGlobalTestConfig(cwd) {
|
|
205
|
+
const projectRoot = findProjectRoot(cwd);
|
|
206
|
+
if (projectRoot === null)
|
|
207
|
+
return undefined;
|
|
208
|
+
return loadConfig(projectRoot)?.test;
|
|
209
|
+
}
|
|
162
210
|
/** Copy flag-only passthrough options (no config counterpart) onto opts. */
|
|
163
211
|
function applyFlagOnlyOptions(opts, options) {
|
|
164
212
|
if (options.refresh !== undefined)
|
|
@@ -175,8 +223,8 @@ function applyFlagOnlyOptions(opts, options) {
|
|
|
175
223
|
opts.allowUnverifiedSkillSource = options.allowUnverifiedSkillSource;
|
|
176
224
|
if (options.iUnderstandThisRunsSkillCode !== undefined)
|
|
177
225
|
opts.acknowledgedRunsSkillCode = options.iUnderstandThisRunsSkillCode;
|
|
178
|
-
if (options.
|
|
179
|
-
opts.
|
|
226
|
+
if (options.allowEvalFailure !== undefined)
|
|
227
|
+
opts.tolerateEvalFailure = options.allowEvalFailure;
|
|
180
228
|
}
|
|
181
229
|
/** Apply flag>config merges for scalar knobs (auth, model, baseline, eval/prompt). */
|
|
182
230
|
function applyScalarMerges(opts, options, config) {
|
|
@@ -194,8 +242,6 @@ function applyScalarMerges(opts, options, config) {
|
|
|
194
242
|
opts.model = model;
|
|
195
243
|
if (config?.evals !== undefined)
|
|
196
244
|
opts.evalsSubpath = config.evals;
|
|
197
|
-
if (config?.experimenterPrompt !== undefined)
|
|
198
|
-
opts.promptOverride = config.experimenterPrompt;
|
|
199
245
|
}
|
|
200
246
|
/**
|
|
201
247
|
* Resolve one cost/runtime knob with flag > config > default precedence AND a
|
|
@@ -291,12 +337,27 @@ function applyDepMerges(opts, options, config) {
|
|
|
291
337
|
if (withOptional !== undefined)
|
|
292
338
|
opts.withOptional = withOptional;
|
|
293
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* Apply flag>config merges for the GLOBAL grader/concurrency knobs — the
|
|
342
|
+
* top-level `test:` config node (see {@link loadGlobalTestConfig}), NOT the
|
|
343
|
+
* per-skill `skills.config.<skill>.test` block. Precedence: flag > top-level
|
|
344
|
+
* config > default(undefined) — left undefined here so the domain applies
|
|
345
|
+
* DEFAULT_GRADER_MODEL / DEFAULT_CONCURRENCY.
|
|
346
|
+
*/
|
|
347
|
+
function applyGraderMerges(opts, options, knobs, globalTest) {
|
|
348
|
+
const graderModel = options.graderModel ?? globalTest?.graderModel;
|
|
349
|
+
if (graderModel !== undefined)
|
|
350
|
+
opts.graderModel = graderModel;
|
|
351
|
+
const concurrency = knobs.concurrency ?? globalTest?.concurrency;
|
|
352
|
+
if (concurrency !== undefined)
|
|
353
|
+
opts.concurrency = concurrency;
|
|
354
|
+
}
|
|
294
355
|
/**
|
|
295
356
|
* Resolve CLI flags → RunHarnessOptions, applying flag > config > default
|
|
296
357
|
* precedence. CLI flags win; config (`skills.config.<skill>.test`) fills gaps;
|
|
297
358
|
* built-in defaults (inside the domain) are the final fallback.
|
|
298
359
|
*/
|
|
299
|
-
function buildHarnessOpts(skills, options, knobs, config) {
|
|
360
|
+
function buildHarnessOpts(skills, options, knobs, config, globalTest) {
|
|
300
361
|
const repoRoot = resolveRepoRoot();
|
|
301
362
|
const opts = { skills, repoRoot };
|
|
302
363
|
applyFlagOnlyOptions(opts, options);
|
|
@@ -304,8 +365,25 @@ function buildHarnessOpts(skills, options, knobs, config) {
|
|
|
304
365
|
applyKnobMerges(opts, knobs, config);
|
|
305
366
|
applyDepMerges(opts, options, config);
|
|
306
367
|
applyEnvMerges(opts, options, config);
|
|
368
|
+
applyGraderMerges(opts, options, knobs, globalTest);
|
|
307
369
|
return opts;
|
|
308
370
|
}
|
|
371
|
+
/**
|
|
372
|
+
* Scaffold-dir fields for a `source` subject. A path that maps back to a declared
|
|
373
|
+
* skill anchors at the AUTHORED source (dirname of its SKILL.md) so `config.evals`
|
|
374
|
+
* resolves + overlays from there — the built dist it points at does not carry the
|
|
375
|
+
* eval suite. An UNLINKED path anchors at the resolved path itself (legacy behavior;
|
|
376
|
+
* the path IS the skill dir). A nameless source (npm/url/vendored) has no scaffold dir.
|
|
377
|
+
*/
|
|
378
|
+
function sourceScaffoldFields(source, declaredSkill, cwd) {
|
|
379
|
+
if (declaredSkill !== undefined) {
|
|
380
|
+
return { subjectScaffoldDir: dirname(declaredSkill.sourcePath), linkedToDeclaredSkill: true };
|
|
381
|
+
}
|
|
382
|
+
if ('path' in source) {
|
|
383
|
+
return { subjectScaffoldDir: safePath.resolve(cwd, source.path) };
|
|
384
|
+
}
|
|
385
|
+
return {};
|
|
386
|
+
}
|
|
309
387
|
/**
|
|
310
388
|
* Project-aware subject resolution for `vat skill test run`. Resolves the subject
|
|
311
389
|
* reference; for a declared skill, builds it (real entry points) and returns the
|
|
@@ -320,19 +398,20 @@ export async function resolveSubjectForTest(ref, cwd, flags) {
|
|
|
320
398
|
subjectSource: resolved.source,
|
|
321
399
|
rebuilt: false,
|
|
322
400
|
wouldBuild: false,
|
|
323
|
-
|
|
324
|
-
// authored scaffold dir is the resolved path — not its parent. Mirrors the
|
|
325
|
-
// legacy positional-path behavior in resolveScaffoldEvalsPath.
|
|
326
|
-
...('path' in resolved.source
|
|
327
|
-
? { subjectScaffoldDir: safePath.resolve(cwd, resolved.source.path) }
|
|
328
|
-
: {}),
|
|
401
|
+
...sourceScaffoldFields(resolved.source, resolved.declaredSkill, cwd),
|
|
329
402
|
};
|
|
330
403
|
case 'name-miss':
|
|
331
404
|
throw new SkillBuildError(`no skill named '${resolved.name}' in ${resolved.configRoot}; known skills: ${resolved.knownSkills.join(', ') || '(none)'}. (For a directory, use './${resolved.name}'.)`);
|
|
332
405
|
case 'not-found':
|
|
333
406
|
throw new SkillBuildError(`no path '${resolved.ref}' and no governing config to resolve a name; pass a path or run inside a VAT project.`);
|
|
334
|
-
case 'buildable':
|
|
335
|
-
|
|
407
|
+
case 'buildable': {
|
|
408
|
+
// A buildable ref carries `packagingConfig` — the ONE cleanly-reachable place
|
|
409
|
+
// the subject's declared executables live — so attach the grader recognition
|
|
410
|
+
// aid here (a plain source has no packaging config and leaves it undefined).
|
|
411
|
+
const subject = await resolveBuildableSubject(resolved, flags);
|
|
412
|
+
const declaredExecutables = deriveDeclaredExecutableNames(resolved.packagingConfig.executables);
|
|
413
|
+
return declaredExecutables === undefined ? subject : { ...subject, declaredExecutables };
|
|
414
|
+
}
|
|
336
415
|
}
|
|
337
416
|
}
|
|
338
417
|
/**
|
|
@@ -403,6 +482,30 @@ async function resolveBuildableSubject(ref, flags) {
|
|
|
403
482
|
}
|
|
404
483
|
return { subjectSource: { path: ref.expectedDistDir }, subjectScaffoldDir: scaffoldDir, rebuilt: true, wouldBuild: true };
|
|
405
484
|
}
|
|
485
|
+
/**
|
|
486
|
+
* True when the resolved subject is a CONFIG-BLIND path target: a `{ path }` source
|
|
487
|
+
* staged AS-IS (not built) that does NOT map back to a declared skill, so the project's
|
|
488
|
+
* `test:` config cannot be applied to it. A path that DOES map to a declared skill
|
|
489
|
+
* (`linkedToDeclaredSkill`) honors config and is NOT blind. A config-declared NAME
|
|
490
|
+
* target (`wouldBuild`) is never blind. Gates the #7 warning. Pure + exported for tests.
|
|
491
|
+
*/
|
|
492
|
+
export function isPathSourceTarget(subject) {
|
|
493
|
+
return !subject.wouldBuild && 'path' in subject.subjectSource && subject.linkedToDeclaredSkill !== true;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Warn (stderr) when the subject is a CONFIG-BLIND path target: its `test:` config
|
|
497
|
+
* (model / evals / timeout) cannot be resolved because the path maps to no declared
|
|
498
|
+
* skill. A path pointing at a declared skill's built dist DOES honor config (mapped
|
|
499
|
+
* back by {@link findDeclaredSkillForPath}) and is silent — only a truly unmapped
|
|
500
|
+
* path is warned, pointing the user at the NAME form.
|
|
501
|
+
*/
|
|
502
|
+
function warnIfPathTargetBypassesConfig(subject) {
|
|
503
|
+
if (!isPathSourceTarget(subject))
|
|
504
|
+
return;
|
|
505
|
+
process.stderr.write('Note: this path maps to no declared skill, so the project\'s test: config ' +
|
|
506
|
+
'(model/evals/timeout) is not applied. Pass the skill NAME (or point at the skill\'s ' +
|
|
507
|
+
'built dist directory) to honor it.\n');
|
|
508
|
+
}
|
|
406
509
|
// ---------------------------------------------------------------------------
|
|
407
510
|
// Testable action
|
|
408
511
|
// ---------------------------------------------------------------------------
|
|
@@ -412,17 +515,40 @@ async function resolveBuildableSubject(ref, flags) {
|
|
|
412
515
|
* with a clean message + preflight code (2) instead of surfacing as an unhandled
|
|
413
516
|
* promise rejection (raw stack trace, exit 1).
|
|
414
517
|
*/
|
|
415
|
-
function preflightKnobsAndConfig(skills, options) {
|
|
518
|
+
async function preflightKnobsAndConfig(skills, options, cwd) {
|
|
416
519
|
try {
|
|
417
520
|
assertValidAuth(options.auth);
|
|
418
521
|
assertValidRequireAuth(options.requireAuth);
|
|
419
|
-
return {
|
|
522
|
+
return {
|
|
523
|
+
knobs: coerceKnobs(options),
|
|
524
|
+
config: await loadTestConfig(skills, cwd),
|
|
525
|
+
globalTest: loadGlobalTestConfig(cwd),
|
|
526
|
+
};
|
|
420
527
|
}
|
|
421
528
|
catch (err) {
|
|
422
529
|
process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
423
530
|
process.exit(SkillTestExitCode.Preflight);
|
|
424
531
|
}
|
|
425
532
|
}
|
|
533
|
+
/**
|
|
534
|
+
* Copy the resolved-subject fields onto the harness options. Optional fields are
|
|
535
|
+
* only assigned when present (exactOptionalPropertyTypes). Extracted so
|
|
536
|
+
* {@link runSkillTestRun} stays within its cognitive-complexity budget.
|
|
537
|
+
*/
|
|
538
|
+
function applyResolvedSubject(harnessOpts, subject) {
|
|
539
|
+
harnessOpts.subjectSource = subject.subjectSource;
|
|
540
|
+
harnessOpts.rebuilt = subject.rebuilt;
|
|
541
|
+
harnessOpts.wouldBuild = subject.wouldBuild;
|
|
542
|
+
if (subject.subjectScaffoldDir !== undefined) {
|
|
543
|
+
harnessOpts.subjectScaffoldDir = subject.subjectScaffoldDir;
|
|
544
|
+
}
|
|
545
|
+
if (subject.dryRunStagedExistingDist !== undefined) {
|
|
546
|
+
harnessOpts.dryRunStagedExistingDist = subject.dryRunStagedExistingDist;
|
|
547
|
+
}
|
|
548
|
+
if (subject.declaredExecutables !== undefined) {
|
|
549
|
+
harnessOpts.declaredExecutables = subject.declaredExecutables;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
426
552
|
/**
|
|
427
553
|
* The unit-testable action for `vat skill test run`. Exported so tests can
|
|
428
554
|
* call it directly without parsing CLI args. Calls process.exit on completion.
|
|
@@ -434,7 +560,7 @@ function preflightKnobsAndConfig(skills, options) {
|
|
|
434
560
|
*/
|
|
435
561
|
export async function runSkillTestRun(skills, options) {
|
|
436
562
|
printSecurityWarning();
|
|
437
|
-
const { knobs, config } = preflightKnobsAndConfig(skills, options);
|
|
563
|
+
const { knobs, config, globalTest } = await preflightKnobsAndConfig(skills, options, process.cwd());
|
|
438
564
|
// Commander stores the `--no-build` negatable flag under `build` (=== false when set);
|
|
439
565
|
// honor an explicit programmatic `noBuild` too.
|
|
440
566
|
const noBuild = options.noBuild === true || options.build === false;
|
|
@@ -454,21 +580,16 @@ export async function runSkillTestRun(skills, options) {
|
|
|
454
580
|
});
|
|
455
581
|
}
|
|
456
582
|
catch (err) {
|
|
457
|
-
|
|
583
|
+
// A broken governing config surfacing during subject resolution is a preflight
|
|
584
|
+
// problem the user must fix (exit 2), not an internal harness failure (exit 1).
|
|
585
|
+
const exitCode = err instanceof ConfigLoadError ? SkillTestExitCode.Preflight : mapErrorToExitCode(err);
|
|
458
586
|
process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
459
587
|
process.exit(exitCode);
|
|
460
588
|
return;
|
|
461
589
|
}
|
|
462
|
-
|
|
463
|
-
harnessOpts
|
|
464
|
-
harnessOpts
|
|
465
|
-
harnessOpts.wouldBuild = subject.wouldBuild;
|
|
466
|
-
if (subject.subjectScaffoldDir !== undefined) {
|
|
467
|
-
harnessOpts.subjectScaffoldDir = subject.subjectScaffoldDir;
|
|
468
|
-
}
|
|
469
|
-
if (subject.dryRunStagedExistingDist !== undefined) {
|
|
470
|
-
harnessOpts.dryRunStagedExistingDist = subject.dryRunStagedExistingDist;
|
|
471
|
-
}
|
|
590
|
+
warnIfPathTargetBypassesConfig(subject);
|
|
591
|
+
const harnessOpts = buildHarnessOpts(skills, options, knobs, config, globalTest);
|
|
592
|
+
applyResolvedSubject(harnessOpts, subject);
|
|
472
593
|
try {
|
|
473
594
|
const result = await runSkillTestHarness(harnessOpts);
|
|
474
595
|
process.stderr.write(`Harness: ${result.harnessPath}\n`);
|
|
@@ -500,8 +621,8 @@ export function createSkillTestRunCommand() {
|
|
|
500
621
|
.argument('<skill...>', 'Skill name(s) to test (primary subject set)')
|
|
501
622
|
.option('--with <pair...>', 'Inject a declared-dependency skill as name=<src>, where <src> is workspace:<pkg> | npm:<spec> | url:<u> | path:<dir> | vendored (e.g. mydep=npm:@scope/s@1.2.3)')
|
|
502
623
|
.option('--with-optional <pair...>', 'Inject an optional skill as name=<src> (same syntax as --with)')
|
|
503
|
-
.option('--env <pair...>', 'Inject an env var into the
|
|
504
|
-
.option('--pass-env <key...>', 'Forward a host env var by NAME to the
|
|
624
|
+
.option('--env <pair...>', 'Inject an env var into the executor spawn as KEY=VALUE (repeatable). Values support ${fixturesDir}, ${stagedSkillDir}, ${harnessRoot}, ${resultsDir}. CLI overrides config for the same key.')
|
|
625
|
+
.option('--pass-env <key...>', 'Forward a host env var by NAME to the executor spawn if present (repeatable). Protected names (PATH, auth, model) are ignored.')
|
|
505
626
|
.option('--refresh', 'Force a full re-stage (ignore existing staged content)')
|
|
506
627
|
.option('--no-build', 'Skip building a declared skill; stage its existing dist instead (errors if absent)')
|
|
507
628
|
.option('--workdir <dir>', 'Override the harness working directory')
|
|
@@ -511,14 +632,16 @@ export function createSkillTestRunCommand() {
|
|
|
511
632
|
.option('--auth <mode>', 'Auth mechanism: inherit | subscription | api-key | auto')
|
|
512
633
|
.option('--require-auth <mech>', 'Require a specific auth mechanism: subscription | api-key')
|
|
513
634
|
.option('--baseline', 'Enable A/B baseline run (with/without skill)')
|
|
514
|
-
.option('--
|
|
635
|
+
.option('--allow-eval-failure', 'Opt out of the fail-closed default: exit 0 even when an eval fails (for interactive use). By DEFAULT a failing eval exits 4, distinct from the harness-broke codes (1/2/3) so CI can gate on it.')
|
|
515
636
|
.option('--allow-unverified-skill-source', 'Skip the vendored manifest integrity check')
|
|
516
637
|
.option('--i-understand-this-runs-skill-code', 'Acknowledge this command executes skill code (required)')
|
|
517
|
-
.option('--model <id>', "Model ID passed VERBATIM to `claude --model <id>` (VAT does no mapping/validation
|
|
518
|
-
.option('--
|
|
638
|
+
.option('--model <id>', "Model ID passed VERBATIM to `claude --model <id>` for the model UNDER TEST (the executor). VAT does no mapping/validation (e.g. opus, sonnet, claude-opus-4-8). Omit to use claude's own default model. Independent of --grader-model.")
|
|
639
|
+
.option('--grader-model <id>', 'Model for the fixed grader/judge, passed VERBATIM to `claude --model` (default claude-sonnet-5). GLOBAL (top-level `test:` config), independent of --model (the model UNDER TEST).')
|
|
640
|
+
.option('--max-turns <n>', 'Per-spawn cap on executor/grader turns (positive integer)')
|
|
519
641
|
.option('--max-budget-usd <n>', 'Hard USD budget cap (positive number)')
|
|
520
642
|
.option('--timeout <s>', 'Wall-clock timeout in seconds (positive integer)')
|
|
521
643
|
.option('--stall <s>', 'Stall-watchdog in seconds (positive integer)')
|
|
644
|
+
.option('--concurrency <n>', 'Max evals graded in parallel (positive integer; default 4)')
|
|
522
645
|
.option('--debug', 'Enable debug logging')
|
|
523
646
|
.action(runSkillTestRun)
|
|
524
647
|
.addHelpText('after', `
|
|
@@ -526,9 +649,10 @@ Description:
|
|
|
526
649
|
Stages the named skill(s) into a fresh temp harness (context isolation: a
|
|
527
650
|
scrubbed env allowlist and no user/project settings -- NOT an OS security
|
|
528
651
|
sandbox), runs preflight checks (claude binary, auth, eval inputs, budget),
|
|
529
|
-
then
|
|
530
|
-
|
|
531
|
-
|
|
652
|
+
then runs a vat-owned executor->grader pipeline: per eval, a blind executor
|
|
653
|
+
Claude session performs the task and a separate grader session judges its
|
|
654
|
+
transcript against the skill's expectations. VAT merges the grader results and
|
|
655
|
+
writes grading.json.
|
|
532
656
|
|
|
533
657
|
IMPORTANT: This command EXECUTES the skill's code with your user account's
|
|
534
658
|
full privileges (filesystem, network, shell) and a reachable auth credential.
|
|
@@ -536,23 +660,40 @@ Description:
|
|
|
536
660
|
to acknowledge this and proceed.
|
|
537
661
|
|
|
538
662
|
Model:
|
|
539
|
-
--model <id>
|
|
540
|
-
\`claude --model <id>\` (verbatim -- VAT does not map or
|
|
541
|
-
--model, no flag is passed and claude picks its own
|
|
542
|
-
model is echoed to stderr ("Model: <id>") on every run,
|
|
543
|
-
output shows the model flag that would be passed (not the
|
|
544
|
-
turns, and permission flags are added at spawn time).
|
|
663
|
+
--model <id> selects the model UNDER TEST (the executor spawn): passed
|
|
664
|
+
straight through as \`claude --model <id>\` (verbatim -- VAT does not map or
|
|
665
|
+
validate it). With no --model, no flag is passed and claude picks its own
|
|
666
|
+
default. The selected model is echoed to stderr ("Model: <id>") on every run,
|
|
667
|
+
and the --dry-run output shows the model flag that would be passed (not the
|
|
668
|
+
full argv — budget, turns, and permission flags are added at spawn time).
|
|
669
|
+
|
|
670
|
+
--grader-model <id> is INDEPENDENT of --model: it selects the fixed judge
|
|
671
|
+
that grades every eval's transcript (default claude-sonnet-5), so grading
|
|
672
|
+
stays comparable across runs even as the model under test changes. This is a
|
|
673
|
+
GLOBAL setting (top-level \`test:\` config node), not per-skill. Precedence:
|
|
674
|
+
--grader-model flag > top-level config \`test.graderModel\` > built-in default.
|
|
675
|
+
--concurrency follows the same GLOBAL precedence for the executor->grader
|
|
676
|
+
pipeline width (default 4).
|
|
545
677
|
|
|
546
678
|
Exit Codes:
|
|
547
|
-
0 - Harness ran to completion and
|
|
548
|
-
1 - Internal error (
|
|
679
|
+
0 - Harness ran to completion and every eval passed (or --allow-eval-failure suppressed a failing verdict)
|
|
680
|
+
1 - Internal error (grader fragment absent/invalid, summary/expectations skew, executor/grader crash, stall/timeout)
|
|
549
681
|
2 - Preflight failed (missing binary, auth error, eval inputs absent, unsafe workdir, ack missing, skill build failed, or --no-build with no existing dist)
|
|
550
682
|
3 - Bootstrap needed: evals.json was absent, so VAT wrote a starter template next to the skill source. Fill it in and re-run.
|
|
551
|
-
4 - An eval FAILED
|
|
683
|
+
4 - An eval FAILED (the harness completed and produced a valid grading.json; expectations did not all pass). This is the fail-closed DEFAULT -- suppress with --allow-eval-failure.
|
|
684
|
+
|
|
685
|
+
The taxonomy is designed so a CI consumer can tolerate eval failures while
|
|
686
|
+
failing closed on every other (harness-broke) outcome:
|
|
687
|
+
|
|
688
|
+
vat skill test run my-skill --i-understand-this-runs-skill-code
|
|
689
|
+
case $? in
|
|
690
|
+
0) ;; # all evals passed
|
|
691
|
+
4) ;; # evals failed but the harness is healthy -- tolerate/warn
|
|
692
|
+
*) exit 1 ;; # 1/2/3/unknown -- harness broke, fail the build
|
|
693
|
+
esac
|
|
552
694
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
--fail-on-eval-failure to make a failing eval exit 4 (e.g. to gate CI).
|
|
695
|
+
Which specific evals failed lives in grading.json, never in the exit code.
|
|
696
|
+
For interactive iteration, --allow-eval-failure downgrades 4 to 0.
|
|
556
697
|
|
|
557
698
|
Example:
|
|
558
699
|
$ vat skill test run my-skill --i-understand-this-runs-skill-code
|