@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.
Files changed (102) hide show
  1. package/README.md +17 -61
  2. package/dist/check.d.ts +38 -0
  3. package/dist/check.d.ts.map +1 -0
  4. package/dist/check.js +169 -0
  5. package/dist/check.js.map +1 -0
  6. package/dist/cli.d.ts +11 -7
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +327 -318
  9. package/dist/cli.js.map +1 -1
  10. package/dist/compare-scenario.d.ts +41 -0
  11. package/dist/compare-scenario.d.ts.map +1 -0
  12. package/dist/compare-scenario.js +194 -0
  13. package/dist/compare-scenario.js.map +1 -0
  14. package/dist/debug-bundle.d.ts +2 -1
  15. package/dist/debug-bundle.d.ts.map +1 -1
  16. package/dist/debug-bundle.js +12 -5
  17. package/dist/debug-bundle.js.map +1 -1
  18. package/dist/doctor.d.ts +6 -1
  19. package/dist/doctor.d.ts.map +1 -1
  20. package/dist/doctor.js +133 -11
  21. package/dist/doctor.js.map +1 -1
  22. package/dist/expect.d.ts +6 -5
  23. package/dist/expect.d.ts.map +1 -1
  24. package/dist/expect.js +67 -57
  25. package/dist/expect.js.map +1 -1
  26. package/dist/host-log.d.ts +17 -0
  27. package/dist/host-log.d.ts.map +1 -0
  28. package/dist/host-log.js +154 -0
  29. package/dist/host-log.js.map +1 -0
  30. package/dist/hosts.d.ts +22 -0
  31. package/dist/hosts.d.ts.map +1 -0
  32. package/dist/hosts.js +84 -0
  33. package/dist/hosts.js.map +1 -0
  34. package/dist/html-report.d.ts +0 -13
  35. package/dist/html-report.d.ts.map +1 -1
  36. package/dist/html-report.js +504 -323
  37. package/dist/html-report.js.map +1 -1
  38. package/dist/index.d.ts +14 -7
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +12 -6
  41. package/dist/index.js.map +1 -1
  42. package/dist/live-isolation.d.ts +11 -4
  43. package/dist/live-isolation.d.ts.map +1 -1
  44. package/dist/live-isolation.js +31 -10
  45. package/dist/live-isolation.js.map +1 -1
  46. package/dist/load-adapters.d.ts +13 -0
  47. package/dist/load-adapters.d.ts.map +1 -0
  48. package/dist/load-adapters.js +76 -0
  49. package/dist/load-adapters.js.map +1 -0
  50. package/dist/load-suite.d.ts.map +1 -1
  51. package/dist/load-suite.js +6 -2
  52. package/dist/load-suite.js.map +1 -1
  53. package/dist/mcp-config.d.ts +8 -0
  54. package/dist/mcp-config.d.ts.map +1 -1
  55. package/dist/mcp-config.js +46 -0
  56. package/dist/mcp-config.js.map +1 -1
  57. package/dist/progress.d.ts +7 -0
  58. package/dist/progress.d.ts.map +1 -1
  59. package/dist/progress.js +39 -9
  60. package/dist/progress.js.map +1 -1
  61. package/dist/record-trace.d.ts +9 -7
  62. package/dist/record-trace.d.ts.map +1 -1
  63. package/dist/record-trace.js +5 -16
  64. package/dist/record-trace.js.map +1 -1
  65. package/dist/report-preview-server.d.ts +2 -0
  66. package/dist/report-preview-server.d.ts.map +1 -0
  67. package/dist/report-preview-server.js +24 -0
  68. package/dist/report-preview-server.js.map +1 -0
  69. package/dist/report-preview.d.ts +11 -0
  70. package/dist/report-preview.d.ts.map +1 -0
  71. package/dist/report-preview.js +161 -0
  72. package/dist/report-preview.js.map +1 -0
  73. package/dist/run-suite.d.ts +34 -1
  74. package/dist/run-suite.d.ts.map +1 -1
  75. package/dist/run-suite.js +588 -82
  76. package/dist/run-suite.js.map +1 -1
  77. package/dist/scenario-story.d.ts +43 -0
  78. package/dist/scenario-story.d.ts.map +1 -0
  79. package/dist/scenario-story.js +215 -0
  80. package/dist/scenario-story.js.map +1 -0
  81. package/dist/suite-summary.d.ts +2 -0
  82. package/dist/suite-summary.d.ts.map +1 -1
  83. package/dist/suite-summary.js +70 -22
  84. package/dist/suite-summary.js.map +1 -1
  85. package/dist/theme.d.ts +30 -5
  86. package/dist/theme.d.ts.map +1 -1
  87. package/dist/theme.js +207 -45
  88. package/dist/theme.js.map +1 -1
  89. package/dist/types.d.ts +105 -11
  90. package/dist/types.d.ts.map +1 -1
  91. package/dist/validate-seeds.d.ts.map +1 -1
  92. package/dist/validate-seeds.js +21 -6
  93. package/dist/validate-seeds.js.map +1 -1
  94. package/dist/validate-suite.d.ts +3 -1
  95. package/dist/validate-suite.d.ts.map +1 -1
  96. package/dist/validate-suite.js +268 -23
  97. package/dist/validate-suite.js.map +1 -1
  98. package/package.json +4 -4
  99. package/dist/compare.d.ts +0 -79
  100. package/dist/compare.d.ts.map +0 -1
  101. package/dist/compare.js +0 -232
  102. package/dist/compare.js.map +0 -1
package/README.md CHANGED
@@ -1,12 +1,14 @@
1
1
  # @post-print/agent-test
2
2
 
3
- **Source of truth for** the direct-agent test package.
3
+ <!-- source-of-truth: the direct-agent test package -->
4
4
 
5
- <!-- doc-meta: owner=eng | last-reviewed=2026-09-02 -->
5
+ <!-- doc-meta: owner=eng | last-reviewed=2026-09-13 -->
6
6
 
7
- Scenario runner for real Cursor and Claude agents, built on `@post-print/agent-harness`.
7
+ <!-- review-deps: paths=packages/test/src/*.ts,packages/test/src/**/*.ts,packages/test/package.json -->
8
8
 
9
- > **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. Every scenario execution now launches Cursor or Claude and can incur provider usage.
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: "claude"`, `defaults.host`, or the top-level `host` option for Claude. The scenario host wins over the top-level override, which wins over suite defaults. The default suite name is `direct`; worktree isolation, judging, timeout enforcement, and announce-stop retry are enabled by default.
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. Consumer repositories can keep suites under `agent-suites/<suite>/scenarios.json`:
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 routing
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
- Direct runs require an exported `CURSOR_API_KEY` for Cursor or `ANTHROPIC_API_KEY` plus the Claude Code CLI for Claude. Judge criteria use `CURSOR_API_KEY` unless `--no-judge` is set. The CLI does not load `.env`.
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
- Cursor and Claude scenarios can attach inline stdio or HTTP/SSE MCP servers through suite defaults or scenario overrides. Scenario server names replace matching defaults. `${ENV_VAR}` placeholders resolve at run time. Ambient project/user MCP configuration is not loaded.
44
+ `--doctor`, `--validate-only`, `--validate-paths`, and `--validate-seeds` are aliases for `--check`.
89
45
 
90
46
  ## In-repo package checks
91
47
 
92
- The repository does not run paid agents in its default CI package-integrity checks:
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 --validate-only --suites-dir packages/test/fixtures --suite smoke
97
- node packages/test/dist/cli.js --doctor
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
- Credentialed acceptance requires one TypeScript `runAgentTest` call and one JSON-suite CLI run against a real host.
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.
@@ -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":";AAKA,OAAO,EACN,KAAK,SAAS,EAKd,MAAM,2BAA2B,CAAC;AAsBnC,OAAO,EACN,KAAK,UAAU,EAIf,MAAM,oBAAoB,CAAC;AAU5B,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,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,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;IACzB,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,CAmL1D;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"}
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"}