@post-print/agent-test 0.3.4 → 0.3.5

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 +122 -43
  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 +33 -0
  11. package/dist/compare-scenario.d.ts.map +1 -0
  12. package/dist/compare-scenario.js +128 -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 +381 -318
  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 +551 -82
  76. package/dist/run-suite.js.map +1 -1
  77. package/dist/scenario-story.d.ts +41 -0
  78. package/dist/scenario-story.d.ts.map +1 -0
  79. package/dist/scenario-story.js +198 -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 +29 -5
  86. package/dist/theme.d.ts.map +1 -1
  87. package/dist/theme.js +204 -45
  88. package/dist/theme.js.map +1 -1
  89. package/dist/types.d.ts +97 -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 +258 -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
 
@@ -25,76 +27,153 @@ const result = await runAgentTest({
25
27
  });
26
28
  ```
27
29
 
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.
30
+ 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
31
 
30
32
  ## JSON suites and CLI
31
33
 
32
- JSON is an authoring adapter, not a stored answer. Consumer repositories can keep suites under `agent-suites/<suite>/scenarios.json`:
34
+ JSON is an authoring adapter, not a stored answer. This repository keeps host-agent suites under `agent-suites/<suite>/scenarios.json`. Consumer repositories can use the same layout.
33
35
 
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
- }
36
+ ```bash
37
+ npx agent-test --suites-dir agent-suites
38
+ npx agent-test --suites-dir agent-suites --host cursor
39
+ npx agent-test --suites-dir agent-suites --suite smoke
40
+ npx agent-test --suites-dir agent-suites --suite tools
41
+ npx agent-test --suites-dir agent-suites --suite mcp
42
+ npx agent-test --suites-dir agent-suites --suite judge
43
+ npx agent-test --suites-dir agent-suites --suite depth
44
+ npx agent-test --check --suites-dir agent-suites
46
45
  ```
47
46
 
48
- Run Cursor by default or select Claude explicitly:
47
+ In-repo suites list `hosts: ["cursor", "claude", "openai"]`. `npx agent-test --suites-dir agent-suites` and `bun run test` run every suite on each host. That is the consumer confidence gate. Pass `--host cursor` to pin one adapter.
49
48
 
50
- ```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
49
+ `smoke` is the short host proof. `tools` checks Read and Write. `mcp` checks echo invoke and a lookup read. `judge` starts a second host call that scores the reply. One judge scenario runs two workspace arms and scores both transcripts together. `depth` checks workspace roots, seed patches, injected context, mustRun, and skill invoke. `bun run test:smoke` stays on Cursor.
50
+
51
+ `scenario.host` pins that scenario to one host. A matrix run skips it on the other hosts.
52
+
53
+ ## Custom hosts
54
+
55
+ A consumer repo can register its own adapter.
56
+
57
+ ```js
58
+ // agent-test.config.mjs
59
+ import { defineConfig } from "@post-print/agent-test";
60
+
61
+ export default defineConfig({
62
+ adapters: [
63
+ {
64
+ host: "gemini",
65
+ missingAuth() {
66
+ return process.env.GEMINI_API_KEY ? undefined : "GEMINI_API_KEY not set";
67
+ },
68
+ classifierHost: "cursor",
69
+ async run(options) {
70
+ return {
71
+ host: "gemini",
72
+ status: "completed",
73
+ durationMs: 0,
74
+ trace: {
75
+ messages: [{ role: "assistant", content: options.prompt }],
76
+ toolCalls: [],
77
+ shellCommands: [],
78
+ artifacts: {},
79
+ },
80
+ };
81
+ },
82
+ },
83
+ ],
84
+ });
55
85
  ```
56
86
 
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`.
87
+ Then `--host gemini` and a suite `hosts` list can include `gemini`. You can also pass `--adapter ./hosts/gemini.mjs`. The module can export `{ adapters: [...] }` or call `registerHostAdapter` as a side effect.
88
+
89
+ Do not reuse `cursor`, `claude`, `openai`, `replay`, or `all` as the slug.
90
+
91
+ Direct runs need host auth. Cursor uses `CURSOR_API_KEY`, or `CURSOR_AUTH_MODE=subscription` after `Cursor.auth.login()`. The Cursor app login does not count. Claude uses `CLAUDE_AUTH_MODE` plus `ANTHROPIC_API_KEY` or a Claude Code login. OpenAI uses `OPENAI_API_KEY` or `CODEX_API_KEY`, or `OPENAI_AUTH_MODE=subscription` after `codex login`. The judge uses the same host family. It runs when a rubric has judge questions or `mustInvokeSkill`. A `compare` scenario runs two arms. `compare.faster` and `compare.cheaper` pick a metric winner. `rubric.judge` is optional and scores both transcripts. `--no-judge` turns the judge off. The CLI does not load `.env`.
58
92
 
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.
93
+ `--allow-user-input` starts a second classifier as the user. That user agent answers AskQuestion-style tools. The test agent then continues with the original task plus the transcript.
60
94
 
61
- ## Validation, rubrics, and comparison
95
+ ## Check, rubrics, and compare
62
96
 
63
- These commands inspect configuration or existing reports; they do not claim to execute an agent:
97
+ `--check` inspects the suite, seeds, package, and host. It does not launch an agent. A live run runs the same check first, then starts the host.
64
98
 
65
99
  ```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"
100
+ npx agent-test --check --suites-dir agent-suites
70
101
  ```
71
102
 
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.
103
+ A compare scenario sets `compare.a` and `compare.b`. Each arm can override workspace, prompt, host, skills, or extra rubric checks. Arm rubric arrays append onto the scenario rubric. Do not put `judge` on an arm. `compare.faster` and `compare.cheaper` name the arm that must win on time or tokens. Add `rubric.judge` when you want a pairwise judge. Omit it for a metric-only compare. `--no-judge` skips the judge.
73
104
 
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.
105
+ ```json
106
+ {
107
+ "name": "cheaper prompt",
108
+ "prompt": "Read README.txt. Reply with one sentence.",
109
+ "compare": {
110
+ "a": { "label": "verbose", "prompt": "Read README.txt. Write a long summary." },
111
+ "b": { "label": "short" },
112
+ "cheaper": "b"
113
+ },
114
+ "rubric": { "mustReadPath": ["README.txt"] }
115
+ }
116
+ ```
117
+
118
+ Use two workspaces when one arm has a skill and the other does not. Put `mustInvokeSkill` on the skill arm only.
119
+
120
+ ```json
121
+ {
122
+ "name": "skill vs no skill",
123
+ "prompt": "Read every markdown file. Write a detailed shipping plan.",
124
+ "compare": {
125
+ "a": {
126
+ "label": "no skill",
127
+ "workspace": "workspaces/skill-off",
128
+ "rubric": { "mustNotInvokeSkill": ["brief-ship"] }
129
+ },
130
+ "b": {
131
+ "label": "with skill",
132
+ "workspace": "workspaces/skill-on",
133
+ "skills": [".agents/skills/brief-ship/SKILL.md"],
134
+ "rubric": { "mustInvokeSkill": ["brief-ship"] }
135
+ },
136
+ "cheaper": "b"
137
+ },
138
+ "rubric": {
139
+ "mustReadPath": ["note.md"],
140
+ "judge": ["Did the skill arm stay closer to the note?"]
141
+ }
142
+ }
143
+ ```
144
+
145
+ `--doctor`, `--validate-only`, `--validate-paths`, and `--validate-seeds` are aliases for `--check`.
146
+
147
+ `scenarios.json` can omit inline rubric keys when a sibling `rubrics.json` / `scenarios.rubric.json` or `--rubrics-dir` supplies them.
75
148
 
76
149
  ## Isolation and diagnostics
77
150
 
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.
151
+ In-repo suites set `workspace` on every scenario. The runner copies that folder into a temp repo. Omit `workspace`, or set `"."`, to copy HEAD plus caller context instead. The folder gets its own `.git`. The runner fails the scenario when tool paths leave that folder. A leftover caller-tree check still restores leaked caller edits.
152
+
153
+ Host-global user skills stay out of the run by default. Those trees live under `~/.cursor/skills`, `~/.claude/skills`, `~/.codex/skills`, and `~/.agents/skills`. A custom `workspace` is a fixture. Keep `allowUserSkills` false for that case. Set `allowUserSkills` to true on the scenario or suite defaults when the test needs the machine skill set. The `skills` field only overlays repo-relative folders into the sealed workspace.
154
+
155
+ `contextSources` and `skills` are relative to the workspace root when `workspace` is a subfolder. A bare `contextSources` name is a file in that root. `seedPatch` stays a caller-repo path. Its hunks are relative to that workspace.
156
+
157
+ `--debug` retains an evidence bundle under `$TMPDIR/agent-spec/sessions/<id>/` by default. Use `--debug-dir` to override the parent directory.
79
158
 
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.
159
+ Host SDK INFO lines stay hidden. Set `AGENT_TEST_HOST_LOGS=1` or `--debug` to print them.
81
160
 
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.
161
+ A TTY run prints `agent started`, then updates an `agent` clock every 0.1s. Tool names and a short reply preview print as the host streams them. The clock line stays one row so the terminal can overwrite it. The HTML report line is a localhost link. A click opens the browser. The preview exits after 30 minutes idle. Set `AGENT_TEST_NO_REPORT_PREVIEW=1` to skip the preview.
83
162
 
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.
163
+ `Ctrl+C` cancels active host work and deletes the temp folder. `--no-worktree` requires `AGENT_TEST_ALLOW_IN_PLACE=1` because agent edits will persist in the caller checkout.
85
164
 
86
165
  ## MCP servers
87
166
 
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.
167
+ Scenarios can attach inline stdio or HTTP/SSE MCP servers through suite defaults or scenario overrides. Ambient project/user MCP configuration is not loaded. When `workspace` is a subfolder, stdio MCP cwd is the caller repo. Script args stay caller-relative.
89
168
 
90
169
  ## In-repo package checks
91
170
 
92
- The repository does not run paid agents in its default CI package-integrity checks:
171
+ Default CI does not launch a paid agent:
93
172
 
94
173
  ```bash
95
174
  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
175
+ node packages/test/dist/cli.js --check --suites-dir packages/test/fixtures --suite smoke
176
+ node packages/test/dist/cli.js --check --suites-dir agent-suites --suite smoke
98
177
  ```
99
178
 
100
- Credentialed acceptance requires one TypeScript `runAgentTest` call and one JSON-suite CLI run against a real host.
179
+ 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"}