@post-print/agent-test 0.3.4 → 0.3.6
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/README.md +17 -61
- package/dist/check.d.ts +38 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +169 -0
- package/dist/check.js.map +1 -0
- package/dist/cli.d.ts +11 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +327 -318
- package/dist/cli.js.map +1 -1
- package/dist/compare-scenario.d.ts +41 -0
- package/dist/compare-scenario.d.ts.map +1 -0
- package/dist/compare-scenario.js +194 -0
- package/dist/compare-scenario.js.map +1 -0
- package/dist/debug-bundle.d.ts +2 -1
- package/dist/debug-bundle.d.ts.map +1 -1
- package/dist/debug-bundle.js +12 -5
- package/dist/debug-bundle.js.map +1 -1
- package/dist/doctor.d.ts +6 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +133 -11
- package/dist/doctor.js.map +1 -1
- package/dist/expect.d.ts +6 -5
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +67 -57
- package/dist/expect.js.map +1 -1
- package/dist/host-log.d.ts +17 -0
- package/dist/host-log.d.ts.map +1 -0
- package/dist/host-log.js +154 -0
- package/dist/host-log.js.map +1 -0
- package/dist/hosts.d.ts +22 -0
- package/dist/hosts.d.ts.map +1 -0
- package/dist/hosts.js +84 -0
- package/dist/hosts.js.map +1 -0
- package/dist/html-report.d.ts +0 -13
- package/dist/html-report.d.ts.map +1 -1
- package/dist/html-report.js +504 -323
- package/dist/html-report.js.map +1 -1
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/live-isolation.d.ts +11 -4
- package/dist/live-isolation.d.ts.map +1 -1
- package/dist/live-isolation.js +31 -10
- package/dist/live-isolation.js.map +1 -1
- package/dist/load-adapters.d.ts +13 -0
- package/dist/load-adapters.d.ts.map +1 -0
- package/dist/load-adapters.js +76 -0
- package/dist/load-adapters.js.map +1 -0
- package/dist/load-suite.d.ts.map +1 -1
- package/dist/load-suite.js +6 -2
- package/dist/load-suite.js.map +1 -1
- package/dist/mcp-config.d.ts +8 -0
- package/dist/mcp-config.d.ts.map +1 -1
- package/dist/mcp-config.js +46 -0
- package/dist/mcp-config.js.map +1 -1
- package/dist/progress.d.ts +7 -0
- package/dist/progress.d.ts.map +1 -1
- package/dist/progress.js +39 -9
- package/dist/progress.js.map +1 -1
- package/dist/record-trace.d.ts +9 -7
- package/dist/record-trace.d.ts.map +1 -1
- package/dist/record-trace.js +5 -16
- package/dist/record-trace.js.map +1 -1
- package/dist/report-preview-server.d.ts +2 -0
- package/dist/report-preview-server.d.ts.map +1 -0
- package/dist/report-preview-server.js +24 -0
- package/dist/report-preview-server.js.map +1 -0
- package/dist/report-preview.d.ts +11 -0
- package/dist/report-preview.d.ts.map +1 -0
- package/dist/report-preview.js +161 -0
- package/dist/report-preview.js.map +1 -0
- package/dist/run-suite.d.ts +34 -1
- package/dist/run-suite.d.ts.map +1 -1
- package/dist/run-suite.js +588 -82
- package/dist/run-suite.js.map +1 -1
- package/dist/scenario-story.d.ts +43 -0
- package/dist/scenario-story.d.ts.map +1 -0
- package/dist/scenario-story.js +215 -0
- package/dist/scenario-story.js.map +1 -0
- package/dist/suite-summary.d.ts +2 -0
- package/dist/suite-summary.d.ts.map +1 -1
- package/dist/suite-summary.js +70 -22
- package/dist/suite-summary.js.map +1 -1
- package/dist/theme.d.ts +30 -5
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +207 -45
- package/dist/theme.js.map +1 -1
- package/dist/types.d.ts +105 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/validate-seeds.d.ts.map +1 -1
- package/dist/validate-seeds.js +21 -6
- package/dist/validate-seeds.js.map +1 -1
- package/dist/validate-suite.d.ts +3 -1
- package/dist/validate-suite.d.ts.map +1 -1
- package/dist/validate-suite.js +268 -23
- package/dist/validate-suite.js.map +1 -1
- package/package.json +4 -4
- package/dist/compare.d.ts +0 -79
- package/dist/compare.d.ts.map +0 -1
- package/dist/compare.js +0 -232
- package/dist/compare.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# @post-print/agent-test
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<!-- source-of-truth: the direct-agent test package -->
|
|
4
4
|
|
|
5
|
-
<!-- doc-meta: owner=eng | last-reviewed=2026-09-
|
|
5
|
+
<!-- doc-meta: owner=eng | last-reviewed=2026-09-13 -->
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
<!-- review-deps: paths=packages/test/src/*.ts,packages/test/src/**/*.ts,packages/test/package.json -->
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Scenario runner for real Cursor, Claude, and OpenAI Codex agents, built on `@post-print/agent-harness`.
|
|
10
|
+
|
|
11
|
+
> **Deprecated and removed:** stored-trace replay is not an agent test. `host: "replay"`, `replayTrace`, `--record-fixtures`, and the old `--live` mode flag are rejected with migration guidance.
|
|
10
12
|
|
|
11
13
|
## Direct TypeScript API
|
|
12
14
|
|
|
@@ -19,82 +21,36 @@ const result = await runAgentTest({
|
|
|
19
21
|
cwd: process.cwd(),
|
|
20
22
|
scenario: {
|
|
21
23
|
name: "uses the project instructions",
|
|
24
|
+
description: "Checks that the agent reads AGENTS.md.",
|
|
22
25
|
prompt: "Review the current change.",
|
|
23
26
|
rubric: { mustReadPath: ["AGENTS.md"] },
|
|
24
27
|
},
|
|
25
28
|
});
|
|
26
29
|
```
|
|
27
30
|
|
|
28
|
-
The default host is Cursor. Set `scenario.host
|
|
31
|
+
The default host is Cursor. Set `scenario.host`, `defaults.host`, or the top-level `host` option to `claude` or `openai`. The scenario host wins over the top-level override, which wins over suite defaults. The default suite name is `direct`. Sealed-workspace isolation, judging, timeout enforcement, and announce-stop retry are enabled by default.
|
|
29
32
|
|
|
30
33
|
## JSON suites and CLI
|
|
31
34
|
|
|
32
|
-
JSON is an authoring adapter, not a stored answer.
|
|
33
|
-
|
|
34
|
-
```json
|
|
35
|
-
{
|
|
36
|
-
"name": "routing",
|
|
37
|
-
"defaults": { "host": "cursor", "profile": "cursor" },
|
|
38
|
-
"scenarios": [
|
|
39
|
-
{
|
|
40
|
-
"name": "reads instructions",
|
|
41
|
-
"prompt": "Review the current change.",
|
|
42
|
-
"rubric": { "mustReadPath": ["AGENTS.md"] }
|
|
43
|
-
}
|
|
44
|
-
]
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Run Cursor by default or select Claude explicitly:
|
|
35
|
+
JSON is an authoring adapter, not a stored answer. This repository keeps host-agent suites under `agent-suites/<suite>/scenarios.json`.
|
|
49
36
|
|
|
50
37
|
```bash
|
|
51
|
-
npx agent-test --suites-dir agent-suites
|
|
52
|
-
npx agent-test --suites-dir agent-suites --suite
|
|
53
|
-
npx agent-test --suites-dir agent-suites --host claude
|
|
54
|
-
npx agent-test --doctor
|
|
38
|
+
npx agent-test --check --suites-dir agent-suites
|
|
39
|
+
npx agent-test --suites-dir agent-suites --host cursor --suite smoke
|
|
55
40
|
```
|
|
56
41
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
The old `--live` flag is removed because direct execution is now the only execution mode. Direct runs capture transient traces automatically; use `--keep-recordings` or `--debug` to retain diagnostics.
|
|
60
|
-
|
|
61
|
-
## Validation, rubrics, and comparison
|
|
62
|
-
|
|
63
|
-
These commands inspect configuration or existing reports; they do not claim to execute an agent:
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
npx agent-test --validate-only --validate-paths --suites-dir agent-suites
|
|
67
|
-
npx agent-test --validate-seeds --suites-dir agent-suites
|
|
68
|
-
npx agent-test --compare-pairs clean:changed --out-dir "$TMPDIR/compare"
|
|
69
|
-
npx agent-test compare --a clean.suite-report.json --b changed.suite-report.json --out-dir "$TMPDIR/compare"
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
`scenarios.json` may omit inline rubric keys when they are supplied by sibling `rubrics.json` / `scenarios.rubric.json`, or by `--rubrics-dir <path>` at `<path>/<suite>/rubrics.json`. External rubric entries replace the inline rubric for the same scenario.
|
|
73
|
-
|
|
74
|
-
Reports pair scenarios by `compareId` when present, otherwise by normalized scenario name. JSON, Markdown, and HTML reports include outcomes, token usage, duration, tools, and grounding signals.
|
|
75
|
-
|
|
76
|
-
## Isolation and diagnostics
|
|
77
|
-
|
|
78
|
-
Each scenario uses a detached git worktree by default. This isolates edits, but it does not prevent a local host from reading the IDE-open caller checkout. Keep answer keys outside agent-visible roots when that distinction matters.
|
|
79
|
-
|
|
80
|
-
`--debug` retains an evidence bundle under `$TMPDIR/agent-spec/sessions/<id>/` by default. It includes the transcript, scenario, result, trace, failures, environment metadata, judge details, and an exact direct-run rerun command. Use `--debug-dir` to override the parent directory.
|
|
81
|
-
|
|
82
|
-
`Ctrl+C` cancels active Cursor/Claude work and cleans worktrees. `--no-worktree` requires `AGENT_TEST_ALLOW_IN_PLACE=1` because agent edits will persist in the caller checkout.
|
|
83
|
-
|
|
84
|
-
Dialogue-first skills must be tested with a one-shot prompt or an intentional `--allow-user-input` run. Do not weaken the production skill to make a headless test pass.
|
|
85
|
-
|
|
86
|
-
## MCP servers
|
|
42
|
+
First run: [docs/getting-started.md](../../docs/getting-started.md). Flags: [docs/cli.md](../../docs/cli.md). Suite fields, rubric, compare, and MCP: [docs/suites.md](../../docs/suites.md). Auth and adapters: [docs/hosts.md](../../docs/hosts.md). Sealed workspace and debug: [docs/isolation.md](../../docs/isolation.md).
|
|
87
43
|
|
|
88
|
-
|
|
44
|
+
`--doctor`, `--validate-only`, `--validate-paths`, and `--validate-seeds` are aliases for `--check`.
|
|
89
45
|
|
|
90
46
|
## In-repo package checks
|
|
91
47
|
|
|
92
|
-
|
|
48
|
+
Default CI does not launch a paid agent:
|
|
93
49
|
|
|
94
50
|
```bash
|
|
95
51
|
bun run build
|
|
96
|
-
node packages/test/dist/cli.js --
|
|
97
|
-
node packages/test/dist/cli.js --
|
|
52
|
+
node packages/test/dist/cli.js --check --suites-dir packages/test/fixtures --suite smoke
|
|
53
|
+
node packages/test/dist/cli.js --check --suites-dir agent-suites --suite smoke
|
|
98
54
|
```
|
|
99
55
|
|
|
100
|
-
|
|
56
|
+
Host-agent acceptance is `bun run test`. That command runs smoke, tools, mcp, judge, and depth on Cursor, Claude, and Codex. `bun run test:smoke`, `bun run test:tools`, `bun run test:mcp`, `bun run test:judge`, and `bun run test:depth` stay on Cursor. A key-gated GitHub Actions job runs the same suites on Cursor when `CURSOR_API_KEY` is present.
|
package/dist/check.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type AgentHost } from "@post-print/agent-harness";
|
|
2
|
+
export interface CheckOptions {
|
|
3
|
+
cwd: string;
|
|
4
|
+
suitesDir: string;
|
|
5
|
+
filter?: string;
|
|
6
|
+
rubricsDir?: string;
|
|
7
|
+
/** CLI host override. Wins over suite defaults when set. */
|
|
8
|
+
host?: AgentHost;
|
|
9
|
+
/** CLI host matrix. Wins over `host` when more than one name is listed. */
|
|
10
|
+
hosts?: readonly AgentHost[];
|
|
11
|
+
cliPath?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CheckReport {
|
|
14
|
+
/** Package, suite, and seed checks passed. Host readiness is separate. */
|
|
15
|
+
ok: boolean;
|
|
16
|
+
packageOk: boolean;
|
|
17
|
+
suiteOk: boolean;
|
|
18
|
+
seedsOk: boolean;
|
|
19
|
+
hostReady: boolean;
|
|
20
|
+
hosts: AgentHost[];
|
|
21
|
+
messages: string[];
|
|
22
|
+
}
|
|
23
|
+
/** Hosts a live run will launch after suite defaults and an optional CLI override. */
|
|
24
|
+
export declare function collectSuiteHosts(options: {
|
|
25
|
+
cwd: string;
|
|
26
|
+
suitesDir: string;
|
|
27
|
+
filter?: string;
|
|
28
|
+
rubricsDir?: string;
|
|
29
|
+
host?: AgentHost;
|
|
30
|
+
hosts?: readonly AgentHost[];
|
|
31
|
+
}): Promise<AgentHost[]>;
|
|
32
|
+
/** Missing auth for every host this run will launch. Undefined when all hosts are ready. */
|
|
33
|
+
export declare function missingHostsAuth(hosts: readonly AgentHost[]): string | undefined;
|
|
34
|
+
/** Suite, seed, package, and host checks. Does not launch an agent. */
|
|
35
|
+
export declare function runCheck(options: CheckOptions): Promise<CheckReport>;
|
|
36
|
+
export declare function formatCheckReport(report: CheckReport): string;
|
|
37
|
+
export declare function formatCheckSummary(report: CheckReport): string;
|
|
38
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,2BAA2B,CAAC;AAS7E,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC3B,0EAA0E;IAC1E,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAoBD,sFAAsF;AACtF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7B,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAmDvB;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,GAAG,SAAS,CAMhF;AAED,uEAAuE;AACvE,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAsE1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAO9D"}
|
package/dist/check.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { isKnownAgentHost } from "@post-print/agent-harness";
|
|
4
|
+
import { discoverSuites } from "./discover-suites.js";
|
|
5
|
+
import { missingAgentAuth, runDoctor } from "./doctor.js";
|
|
6
|
+
import { resolveSuiteHosts, uniqueHosts } from "./hosts.js";
|
|
7
|
+
import { loadSuiteFile } from "./load-suite.js";
|
|
8
|
+
import { formatSeedValidationReport, validateSeedPatches } from "./validate-seeds.js";
|
|
9
|
+
import { formatValidationReport, validateSuitePaths } from "./validate-suite.js";
|
|
10
|
+
function filterSuitePaths(suitePaths, filter) {
|
|
11
|
+
if (!filter) {
|
|
12
|
+
return suitePaths;
|
|
13
|
+
}
|
|
14
|
+
return suitePaths.filter((path) => path.includes(`/${filter}/`) || path.endsWith(`/${filter}/scenarios.json`));
|
|
15
|
+
}
|
|
16
|
+
async function suitesDirExists(cwd, suitesDir) {
|
|
17
|
+
try {
|
|
18
|
+
await access(resolve(cwd, suitesDir));
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Hosts a live run will launch after suite defaults and an optional CLI override. */
|
|
26
|
+
export async function collectSuiteHosts(options) {
|
|
27
|
+
const cliHosts = uniqueHosts(options.hosts ?? (options.host ? [options.host] : undefined));
|
|
28
|
+
if (cliHosts?.length === 1) {
|
|
29
|
+
return cliHosts;
|
|
30
|
+
}
|
|
31
|
+
const root = resolve(options.cwd, options.suitesDir);
|
|
32
|
+
let suitePaths = [];
|
|
33
|
+
try {
|
|
34
|
+
suitePaths = filterSuitePaths(await discoverSuites(root), options.filter);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return cliHosts ?? ["cursor"];
|
|
38
|
+
}
|
|
39
|
+
if (suitePaths.length === 0) {
|
|
40
|
+
return cliHosts ?? ["cursor"];
|
|
41
|
+
}
|
|
42
|
+
const hosts = new Set();
|
|
43
|
+
for (const suitePath of suitePaths) {
|
|
44
|
+
try {
|
|
45
|
+
const suite = await loadSuiteFile(suitePath, { rubricsDir: options.rubricsDir });
|
|
46
|
+
const resolved = resolveSuiteHosts({
|
|
47
|
+
cliHosts,
|
|
48
|
+
suiteHosts: suite.hosts,
|
|
49
|
+
defaultHost: suite.defaults?.host,
|
|
50
|
+
});
|
|
51
|
+
if (resolved.length > 1 || (suite.hosts !== undefined && suite.hosts.length > 0)) {
|
|
52
|
+
for (const host of resolved) {
|
|
53
|
+
hosts.add(host);
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const fallback = suite.defaults?.host ?? "cursor";
|
|
58
|
+
for (const scenario of suite.scenarios) {
|
|
59
|
+
if (scenario.skip) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const host = scenario.host ?? fallback;
|
|
63
|
+
if (isKnownAgentHost(host)) {
|
|
64
|
+
hosts.add(host);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (suite.scenarios.length === 0 && isKnownAgentHost(fallback)) {
|
|
68
|
+
hosts.add(fallback);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Invalid files are reported by suite validation.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (hosts.size === 0) {
|
|
76
|
+
return cliHosts ?? ["cursor"];
|
|
77
|
+
}
|
|
78
|
+
return [...hosts];
|
|
79
|
+
}
|
|
80
|
+
/** Missing auth for every host this run will launch. Undefined when all hosts are ready. */
|
|
81
|
+
export function missingHostsAuth(hosts) {
|
|
82
|
+
const missing = hosts.map((host) => missingAgentAuth(host)).filter((message) => message);
|
|
83
|
+
if (missing.length === 0) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
return missing.join("\n");
|
|
87
|
+
}
|
|
88
|
+
/** Suite, seed, package, and host checks. Does not launch an agent. */
|
|
89
|
+
export async function runCheck(options) {
|
|
90
|
+
const messages = [];
|
|
91
|
+
const doctor = runDoctor({ cliPath: options.cliPath });
|
|
92
|
+
messages.push("package");
|
|
93
|
+
for (const message of doctor.messages) {
|
|
94
|
+
messages.push(` ${message}`);
|
|
95
|
+
}
|
|
96
|
+
const hosts = await collectSuiteHosts(options);
|
|
97
|
+
const hostError = missingHostsAuth(hosts);
|
|
98
|
+
const hostReady = hostError === undefined;
|
|
99
|
+
messages.push("host");
|
|
100
|
+
messages.push(` ${hosts.join(", ")}: ${hostReady ? "ready" : (hostError ?? "not ready")}`);
|
|
101
|
+
let suiteOk = false;
|
|
102
|
+
const suitesRoot = resolve(options.cwd, options.suitesDir);
|
|
103
|
+
if (!(await suitesDirExists(options.cwd, options.suitesDir))) {
|
|
104
|
+
messages.push("suite");
|
|
105
|
+
messages.push(` missing ${suitesRoot}`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const suitePaths = filterSuitePaths(await discoverSuites(suitesRoot), options.filter);
|
|
109
|
+
if (suitePaths.length === 0) {
|
|
110
|
+
messages.push("suite");
|
|
111
|
+
messages.push(` No suites found under ${options.suitesDir}`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const suiteReport = await validateSuitePaths(suitePaths, {
|
|
115
|
+
validatePaths: true,
|
|
116
|
+
repoRoot: options.cwd,
|
|
117
|
+
rubricsDir: options.rubricsDir,
|
|
118
|
+
});
|
|
119
|
+
suiteOk = suiteReport.ok;
|
|
120
|
+
messages.push("suite");
|
|
121
|
+
for (const line of formatValidationReport(suiteReport).split("\n")) {
|
|
122
|
+
messages.push(` ${line}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const seedReport = await validateSeedPatches({
|
|
127
|
+
cwd: options.cwd,
|
|
128
|
+
suitesDir: options.suitesDir,
|
|
129
|
+
rubricsDir: options.rubricsDir,
|
|
130
|
+
filter: options.filter,
|
|
131
|
+
}).catch((error) => ({
|
|
132
|
+
ok: false,
|
|
133
|
+
issues: [
|
|
134
|
+
{
|
|
135
|
+
suite: options.suitesDir,
|
|
136
|
+
scenario: "*",
|
|
137
|
+
seedPatch: "",
|
|
138
|
+
message: error instanceof Error ? error.message : String(error),
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
checked: 0,
|
|
142
|
+
}));
|
|
143
|
+
const seedsOk = seedReport.ok;
|
|
144
|
+
messages.push("seeds");
|
|
145
|
+
for (const line of formatSeedValidationReport(seedReport).split("\n")) {
|
|
146
|
+
messages.push(` ${line}`);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
ok: doctor.ok && suiteOk && seedsOk,
|
|
150
|
+
packageOk: doctor.ok,
|
|
151
|
+
suiteOk,
|
|
152
|
+
seedsOk,
|
|
153
|
+
hostReady,
|
|
154
|
+
hosts,
|
|
155
|
+
messages,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export function formatCheckReport(report) {
|
|
159
|
+
return ["agent-test check", ...report.messages].join("\n");
|
|
160
|
+
}
|
|
161
|
+
export function formatCheckSummary(report) {
|
|
162
|
+
const suite = report.suiteOk ? "suite ok" : "suite failed";
|
|
163
|
+
const pkg = report.packageOk ? "package ok" : "package failed";
|
|
164
|
+
const host = report.hostReady
|
|
165
|
+
? `host ${report.hosts.join(",")} ready`
|
|
166
|
+
: `host ${report.hosts.join(",")} not ready`;
|
|
167
|
+
return `check ${pkg} · ${suite} · ${host}`;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -7,6 +7,12 @@ export interface ParsedCliArgs {
|
|
|
7
7
|
/** Prefer `<rubricsDir>/<suite>/rubrics.json` (harness-only answer keys). */
|
|
8
8
|
rubricsDir?: string;
|
|
9
9
|
host?: AgentHost;
|
|
10
|
+
/** Host matrix when `--host` lists more than one adapter. */
|
|
11
|
+
hosts?: AgentHost[];
|
|
12
|
+
/** True when `--host` included `all`. Re-expand after adapters load. */
|
|
13
|
+
hostAll?: boolean;
|
|
14
|
+
/** Consumer adapter modules (`--adapter`). */
|
|
15
|
+
adapterModules?: string[];
|
|
10
16
|
filter?: string;
|
|
11
17
|
scenarioFilter?: string;
|
|
12
18
|
stagingSessionId?: string;
|
|
@@ -16,6 +22,9 @@ export interface ParsedCliArgs {
|
|
|
16
22
|
timeoutMs?: number;
|
|
17
23
|
noTimeout: boolean;
|
|
18
24
|
allowUserInput: boolean;
|
|
25
|
+
/** Check the suite and host. Do not launch an agent. */
|
|
26
|
+
check: boolean;
|
|
27
|
+
help: boolean;
|
|
19
28
|
doctor: boolean;
|
|
20
29
|
htmlReport: boolean;
|
|
21
30
|
/** Explicit HTML report path (ends in .html) or output directory for all report content. */
|
|
@@ -28,14 +37,9 @@ export interface ParsedCliArgs {
|
|
|
28
37
|
failOn: FailOnMode;
|
|
29
38
|
/** Live announce-stop retries (overrides AGENT_TEST_SCENARIO_RETRIES). */
|
|
30
39
|
scenarioRetries?: number;
|
|
31
|
-
/** Offline compare subcommand (`agent-test compare --a … --b …`). */
|
|
32
|
-
compareMode: boolean;
|
|
33
|
-
compareA?: string;
|
|
34
|
-
compareB?: string;
|
|
35
|
-
/** Direct-run A:B suite dirs or report JSON paths. */
|
|
36
|
-
comparePairs?: string;
|
|
37
|
-
compareOutDir?: string;
|
|
38
40
|
}
|
|
41
|
+
/** Usage text for `--help`. */
|
|
42
|
+
export declare function formatHelp(): string;
|
|
39
43
|
/** Parse agent-test CLI argv (exported for unit tests). */
|
|
40
44
|
export declare function parseCliArgs(argv: string[]): ParsedCliArgs;
|
|
41
45
|
/** Resolve an explicit report target into the HTML path and optional artifact directory. */
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAIA,OAAO,EACN,KAAK,SAAS,EAKd,MAAM,2BAA2B,CAAC;AAmBnC,OAAO,EACN,KAAK,UAAU,EAIf,MAAM,oBAAoB,CAAC;AAO5B,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AA+CD,+BAA+B;AAC/B,wBAAgB,UAAU,IAAI,MAAM,CA8BnC;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,CAkP1D;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ9F"}
|