@post-print/agent-test 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +194 -0
- package/dist/cli.js.map +1 -0
- package/dist/discover-suites.d.ts +2 -0
- package/dist/discover-suites.d.ts.map +1 -0
- package/dist/discover-suites.js +19 -0
- package/dist/discover-suites.js.map +1 -0
- package/dist/expect.d.ts +35 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +265 -0
- package/dist/expect.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/live-isolation.d.ts +19 -0
- package/dist/live-isolation.d.ts.map +1 -0
- package/dist/live-isolation.js +69 -0
- package/dist/live-isolation.js.map +1 -0
- package/dist/load-suite.d.ts +3 -0
- package/dist/load-suite.d.ts.map +1 -0
- package/dist/load-suite.js +29 -0
- package/dist/load-suite.js.map +1 -0
- package/dist/preflight.d.ts +3 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +17 -0
- package/dist/preflight.js.map +1 -0
- package/dist/progress.d.ts +10 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +39 -0
- package/dist/progress.js.map +1 -0
- package/dist/record-trace.d.ts +27 -0
- package/dist/record-trace.d.ts.map +1 -0
- package/dist/record-trace.js +97 -0
- package/dist/record-trace.js.map +1 -0
- package/dist/run-suite.d.ts +40 -0
- package/dist/run-suite.d.ts.map +1 -0
- package/dist/run-suite.js +344 -0
- package/dist/run-suite.js.map +1 -0
- package/dist/scenario-seed.d.ts +3 -0
- package/dist/scenario-seed.d.ts.map +1 -0
- package/dist/scenario-seed.js +38 -0
- package/dist/scenario-seed.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# @post-print/agent-test
|
|
2
|
+
|
|
3
|
+
Jest-shaped agent scenario runner built on `@post-print/agent-harness`.
|
|
4
|
+
|
|
5
|
+
## CLI
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bunx agent-test --suites-dir agent-suites
|
|
9
|
+
bunx agent-test --suite ambient-routing
|
|
10
|
+
bunx agent-test --live --suite ambient-routing # CURSOR_API_KEY required
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Default suites root: `agent-suites/`.
|
|
14
|
+
|
|
15
|
+
## Live dogfood
|
|
16
|
+
|
|
17
|
+
Live runs need `CURSOR_API_KEY` and a suites directory. Preflight fails when `--suites-dir` is missing.
|
|
18
|
+
|
|
19
|
+
Passing live runs write staging traces under `$TMPDIR/agent-spec/sessions/<pid>-<timestamp>/` (removed on exit unless `--keep-recordings`). Use `--record-fixtures` to overwrite each scenario's committed `replayTrace` path. `--no-worktree` requires `AGENT_TEST_ALLOW_IN_PLACE=1`.
|
|
20
|
+
|
|
21
|
+
## Library
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { runAllSuites, expectTrace } from "@post-print/agent-test";
|
|
25
|
+
```
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { cleanupStaleScenarioWorktrees } from "@post-print/agent-harness";
|
|
5
|
+
import { assertLiveDogfoodPreflight } from "./preflight";
|
|
6
|
+
import { cleanupLegacyRepoRecordings, cleanupStagingSession, createLiveStagingSessionId, getLiveStagingSessionRoot, } from "./record-trace";
|
|
7
|
+
import { registerLiveRunHandlers, runAllSuites } from "./run-suite";
|
|
8
|
+
function parseArgs(argv) {
|
|
9
|
+
const cwd = process.cwd();
|
|
10
|
+
let suitesDir = "agent-suites";
|
|
11
|
+
let host;
|
|
12
|
+
let filter;
|
|
13
|
+
let scenarioFilter;
|
|
14
|
+
let stagingSessionId;
|
|
15
|
+
let record = false;
|
|
16
|
+
let recordFixtures = false;
|
|
17
|
+
let live = false;
|
|
18
|
+
let judge;
|
|
19
|
+
let worktree;
|
|
20
|
+
let keepRecordings = false;
|
|
21
|
+
for (let i = 2; i < argv.length; i++) {
|
|
22
|
+
const token = argv[i];
|
|
23
|
+
if (token === "--host" && argv[i + 1]) {
|
|
24
|
+
host = argv[++i];
|
|
25
|
+
}
|
|
26
|
+
else if (token === "--suites-dir" && argv[i + 1]) {
|
|
27
|
+
suitesDir = argv[++i];
|
|
28
|
+
}
|
|
29
|
+
else if (token === "--suite" && argv[i + 1]) {
|
|
30
|
+
filter = argv[++i];
|
|
31
|
+
}
|
|
32
|
+
else if (token === "--scenario" && argv[i + 1]) {
|
|
33
|
+
scenarioFilter = argv[++i];
|
|
34
|
+
}
|
|
35
|
+
else if (token === "--staging-session-id" && argv[i + 1]) {
|
|
36
|
+
stagingSessionId = argv[++i];
|
|
37
|
+
}
|
|
38
|
+
else if (token === "--record") {
|
|
39
|
+
record = true;
|
|
40
|
+
}
|
|
41
|
+
else if (token === "--record-fixtures") {
|
|
42
|
+
record = true;
|
|
43
|
+
recordFixtures = true;
|
|
44
|
+
}
|
|
45
|
+
else if (token === "--live") {
|
|
46
|
+
live = true;
|
|
47
|
+
}
|
|
48
|
+
else if (token === "--keep-recordings") {
|
|
49
|
+
keepRecordings = true;
|
|
50
|
+
}
|
|
51
|
+
else if (token === "--judge") {
|
|
52
|
+
judge = true;
|
|
53
|
+
}
|
|
54
|
+
else if (token === "--no-judge") {
|
|
55
|
+
judge = false;
|
|
56
|
+
}
|
|
57
|
+
else if (token === "--no-worktree") {
|
|
58
|
+
worktree = false;
|
|
59
|
+
}
|
|
60
|
+
else if (token && !token.startsWith("-")) {
|
|
61
|
+
filter = token;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (live) {
|
|
65
|
+
host = host ?? "cursor";
|
|
66
|
+
record = true;
|
|
67
|
+
judge = judge ?? true;
|
|
68
|
+
worktree = worktree ?? true;
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
cwd,
|
|
72
|
+
suitesDir,
|
|
73
|
+
host,
|
|
74
|
+
filter,
|
|
75
|
+
scenarioFilter,
|
|
76
|
+
stagingSessionId,
|
|
77
|
+
record,
|
|
78
|
+
recordFixtures,
|
|
79
|
+
live,
|
|
80
|
+
judge,
|
|
81
|
+
worktree,
|
|
82
|
+
keepRecordings,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async function cleanupLiveRunArtifacts(cwd, stagingSessionRoot, keepRecordings) {
|
|
86
|
+
if (keepRecordings) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (stagingSessionRoot) {
|
|
90
|
+
try {
|
|
91
|
+
await cleanupStagingSession(stagingSessionRoot);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// best-effort
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const legacyRemoved = await cleanupLegacyRepoRecordings(cwd);
|
|
98
|
+
if (legacyRemoved.length > 0) {
|
|
99
|
+
console.log(`Removed legacy in-repo recording dir(s):\n ${legacyRemoved.join("\n ")}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async function main() {
|
|
103
|
+
const args = parseArgs(process.argv);
|
|
104
|
+
const isChild = process.env.AGENT_TEST_CHILD === "1";
|
|
105
|
+
const stagingSessionId = args.stagingSessionId?.trim() ||
|
|
106
|
+
process.env.AGENT_TEST_STAGING_SESSION_ID?.trim() ||
|
|
107
|
+
(args.live || (args.record && !args.recordFixtures) ? createLiveStagingSessionId() : undefined);
|
|
108
|
+
const stagingSessionRoot = stagingSessionId
|
|
109
|
+
? getLiveStagingSessionRoot(stagingSessionId)
|
|
110
|
+
: undefined;
|
|
111
|
+
try {
|
|
112
|
+
if (args.live && !process.env.CURSOR_API_KEY) {
|
|
113
|
+
console.error("CURSOR_API_KEY required for --live (Cursor SDK runs)");
|
|
114
|
+
return 1;
|
|
115
|
+
}
|
|
116
|
+
if (args.live) {
|
|
117
|
+
try {
|
|
118
|
+
await assertLiveDogfoodPreflight(args.cwd, args.suitesDir);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error(error instanceof Error ? error.message : error);
|
|
122
|
+
return 1;
|
|
123
|
+
}
|
|
124
|
+
const inPlaceAllowed = process.env.AGENT_TEST_ALLOW_IN_PLACE === "1";
|
|
125
|
+
const worktreeDisabled = args.worktree === false ||
|
|
126
|
+
process.env.AGENT_TEST_NO_WORKTREE === "1" ||
|
|
127
|
+
process.env.AGENT_TEST_NO_WORKTREE === "true";
|
|
128
|
+
if (worktreeDisabled && !inPlaceAllowed) {
|
|
129
|
+
console.error("Live dogfood requires git worktree isolation. Set AGENT_TEST_ALLOW_IN_PLACE=1 to run in repo cwd (--no-worktree leaks agent edits into your working tree).");
|
|
130
|
+
return 1;
|
|
131
|
+
}
|
|
132
|
+
if (!isChild) {
|
|
133
|
+
registerLiveRunHandlers();
|
|
134
|
+
const removed = await cleanupStaleScenarioWorktrees(args.cwd);
|
|
135
|
+
if (removed.length > 0) {
|
|
136
|
+
console.log(`Cleaned ${removed.length} stale agent-test worktree(s) from a prior crash`);
|
|
137
|
+
}
|
|
138
|
+
console.log("Live dogfood: cursor SDK → worktree → rubric → judge → $TMPDIR staging (use --record-fixtures to overwrite replay JSON)");
|
|
139
|
+
if (stagingSessionRoot) {
|
|
140
|
+
console.log(`Live staging session: ${stagingSessionRoot}`);
|
|
141
|
+
if (!args.keepRecordings) {
|
|
142
|
+
console.log("Staging traces are removed on exit unless --keep-recordings");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (worktreeDisabled) {
|
|
146
|
+
console.warn("Warning: running in repo cwd — agent file edits will persist in your working tree");
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log("Tip: exit 137 (Killed) is usually macOS OOM — live runs isolate each scenario in a subprocess by default; set AGENT_TEST_NO_ISOLATE=1 to disable");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const reports = await runAllSuites({
|
|
154
|
+
...args,
|
|
155
|
+
stagingSessionId,
|
|
156
|
+
});
|
|
157
|
+
let exitCode = 0;
|
|
158
|
+
for (const report of reports) {
|
|
159
|
+
const failed = report.results.filter((result) => !result.passed && !result.skipped);
|
|
160
|
+
if (failed.length > 0) {
|
|
161
|
+
exitCode = 1;
|
|
162
|
+
console.log(`\n${report.suite} — failure details`);
|
|
163
|
+
for (const result of failed) {
|
|
164
|
+
console.log(` ✗ ${result.scenario}`);
|
|
165
|
+
for (const failure of result.failures) {
|
|
166
|
+
console.log(` ${failure.matcher}: ${failure.message}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
console.log(`${report.suite}: ${report.passed} passed, ${report.failed} failed, ${report.skipped} skipped`);
|
|
171
|
+
}
|
|
172
|
+
if (reports.length === 0) {
|
|
173
|
+
console.log(`No suites found under ${args.suitesDir}`);
|
|
174
|
+
return 1;
|
|
175
|
+
}
|
|
176
|
+
return exitCode;
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
if (stagingSessionId && !isChild) {
|
|
180
|
+
await cleanupLiveRunArtifacts(args.cwd, stagingSessionRoot, args.keepRecordings);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const entry = fileURLToPath(import.meta.url);
|
|
185
|
+
const isMain = process.argv[1] !== undefined && resolve(process.argv[1]) === resolve(entry);
|
|
186
|
+
if (isMain) {
|
|
187
|
+
void main()
|
|
188
|
+
.then((code) => process.exit(code))
|
|
189
|
+
.catch((error) => {
|
|
190
|
+
console.error(error instanceof Error ? error.message : error);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-suites.d.ts","sourceRoot":"","sources":["../src/discover-suites.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAczE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { access, readdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export async function discoverSuites(suitesDir) {
|
|
4
|
+
const entries = await readdir(suitesDir, { withFileTypes: true });
|
|
5
|
+
const paths = [];
|
|
6
|
+
for (const entry of entries) {
|
|
7
|
+
if (!entry.isDirectory()) {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
const scenarioPath = join(suitesDir, entry.name, "scenarios.json");
|
|
11
|
+
try {
|
|
12
|
+
await access(scenarioPath);
|
|
13
|
+
paths.push(scenarioPath);
|
|
14
|
+
}
|
|
15
|
+
catch { }
|
|
16
|
+
}
|
|
17
|
+
return paths;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=discover-suites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-suites.js","sourceRoot":"","sources":["../src/discover-suites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB;IACrD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1B,SAAS;QACV,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QACnE,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
|
package/dist/expect.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type AgentTrace, type SkillContextMode } from "@post-print/agent-harness";
|
|
2
|
+
import type { AssertionFailure, ScenarioRubric } from "./types";
|
|
3
|
+
export interface RubricAssertOptions {
|
|
4
|
+
/** How skills were loaded for this run — affects mustInvokeSkill strictness. */
|
|
5
|
+
skillsMode?: SkillContextMode;
|
|
6
|
+
}
|
|
7
|
+
export declare class TraceAssertion {
|
|
8
|
+
private readonly trace;
|
|
9
|
+
private readonly options;
|
|
10
|
+
private failures;
|
|
11
|
+
constructor(trace: AgentTrace, options?: RubricAssertOptions);
|
|
12
|
+
get ok(): boolean;
|
|
13
|
+
get errors(): AssertionFailure[];
|
|
14
|
+
private messageText;
|
|
15
|
+
private assertionHaystack;
|
|
16
|
+
private patternHaystack;
|
|
17
|
+
toHaveTier(tier: ScenarioRubric["tier"]): this;
|
|
18
|
+
/** Hands-on chat: tier from structured routing or one-line announce in transcript. */
|
|
19
|
+
toHaveHandsOnTier(tier: ScenarioRubric["tier"]): this;
|
|
20
|
+
toHaveReviewDepth(depth: ScenarioRubric["reviewDepth"]): this;
|
|
21
|
+
toHaveRunCommand(fragment: string): this;
|
|
22
|
+
toIncludeRoutingBlock(): this;
|
|
23
|
+
/** Hands-off PR: ## Routing must appear before the first tool call. */
|
|
24
|
+
toHaveRoutingBlockBeforeTools(): this;
|
|
25
|
+
/** Hands-on chat: tier announce must appear before the first tool call. */
|
|
26
|
+
toHaveHandsOnTierBeforeTools(tier: ScenarioRubric["tier"]): this;
|
|
27
|
+
toHaveInvokedSkill(skillName: string): this;
|
|
28
|
+
private skillWasInvoked;
|
|
29
|
+
toHaveNotInvokedSkill(skillName: string): this;
|
|
30
|
+
mustInclude(text: string): this;
|
|
31
|
+
mustNotInclude(text: string): this;
|
|
32
|
+
}
|
|
33
|
+
export declare function expectTrace(trace: AgentTrace, options?: RubricAssertOptions): TraceAssertion;
|
|
34
|
+
export declare function assertRubric(trace: AgentTrace, rubric: ScenarioRubric, options?: RubricAssertOptions): AssertionFailure[];
|
|
35
|
+
//# sourceMappingURL=expect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,UAAU,EAKf,KAAK,gBAAgB,EACrB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IACnC,gFAAgF;IAChF,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AA8BD,qBAAa,cAAc;IAIzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJzB,OAAO,CAAC,QAAQ,CAA0B;gBAGxB,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,mBAAwB;IAGnD,IAAI,EAAE,IAAI,OAAO,CAEhB;IAED,IAAI,MAAM,IAAI,gBAAgB,EAAE,CAE/B;IAED,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,eAAe;IAIvB,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI;IAc9C,sFAAsF;IACtF,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI;IAerD,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,aAAa,CAAC,GAAG,IAAI;IAc7D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAWxC,qBAAqB,IAAI,IAAI;IAgB7B,uEAAuE;IACvE,6BAA6B,IAAI,IAAI;IAWrC,2EAA2E;IAC3E,4BAA4B,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI;IAahE,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAc3C,OAAO,CAAC,eAAe;IAqCvB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAW9C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAW/B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAUlC;AAYD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CAE5F;AAED,wBAAgB,YAAY,CAC3B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,gBAAgB,EAAE,CAiCpB"}
|
package/dist/expect.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { collapseTraceWhitespace, handsOnTierBeforeTools, inferRoutingFromText, routingBlockBeforeTools, } from "@post-print/agent-harness";
|
|
2
|
+
const REVIEW_DEPTH_PATTERNS = {
|
|
3
|
+
quick: /\*\*Depth:\*\*\s*quick\b|\bReview\s·\s*[^·]+\s·\s*Quick\b/i,
|
|
4
|
+
standard: /\*\*Depth:\*\*\s*standard\b|\bReview\s·\s*[^·]+\s·\s*Standard\b/i,
|
|
5
|
+
thorough: /\*\*Depth:\*\*\s*thorough\b|\bReview\s·\s*[^·]+\s·\s*Thorough\b/i,
|
|
6
|
+
full: /\*\*Depth:\*\*\s*full\b|\bReview\s·\s*[^·]+\s·\s*Full\b/i,
|
|
7
|
+
};
|
|
8
|
+
const FULL_MODE_CODE_REVIEW_PATTERNS = [
|
|
9
|
+
/\bReview\s·\s*[^·]+\s·\s*(?:Quick|Standard|Thorough|Full)\b/i,
|
|
10
|
+
/## Review synthesis/i,
|
|
11
|
+
];
|
|
12
|
+
const FULL_MODE_GRILL_PATTERNS = [
|
|
13
|
+
/\bBranch\s+\d+\s*[—–-]/i,
|
|
14
|
+
/\bgrill\b/i,
|
|
15
|
+
/\bpressure-test(?:ing)?\b/i,
|
|
16
|
+
/(?:^|\n)\s*\d+\.\s+.+(?:\n\s*\d+\.\s+.+)+/m,
|
|
17
|
+
/\b\d+\.\s+\S+(?:\s+\d+\.\s+\S+)+\b/,
|
|
18
|
+
];
|
|
19
|
+
const FULL_MODE_CRYSTALLIZE_PATTERNS = [
|
|
20
|
+
/\bcrystalliz(?:e|ing|ation)\b/i,
|
|
21
|
+
/\bhalf-formed\b/i,
|
|
22
|
+
/\bfuzzy\s+intent\b/i,
|
|
23
|
+
/\bmirror(?:ed|ing)?\s+(?:the\s+)?(?:fuzzy\s+)?intent\b/i,
|
|
24
|
+
/\bmight be assuming\b/i,
|
|
25
|
+
];
|
|
26
|
+
const ROUTING_HEADING_PATTERN = /(?:^|\n)#+\s*Routing\b/m;
|
|
27
|
+
const ROUTING_BOLD_PATTERN = /\*\*Routing\*\*/;
|
|
28
|
+
export class TraceAssertion {
|
|
29
|
+
trace;
|
|
30
|
+
options;
|
|
31
|
+
failures = [];
|
|
32
|
+
constructor(trace, options = {}) {
|
|
33
|
+
this.trace = trace;
|
|
34
|
+
this.options = options;
|
|
35
|
+
}
|
|
36
|
+
get ok() {
|
|
37
|
+
return this.failures.length === 0;
|
|
38
|
+
}
|
|
39
|
+
get errors() {
|
|
40
|
+
return [...this.failures];
|
|
41
|
+
}
|
|
42
|
+
messageText() {
|
|
43
|
+
return this.trace.messages.map((m) => m.content).join("");
|
|
44
|
+
}
|
|
45
|
+
assertionHaystack() {
|
|
46
|
+
return [
|
|
47
|
+
this.messageText(),
|
|
48
|
+
this.trace.prBody ?? "",
|
|
49
|
+
this.trace.gitDiff ?? "",
|
|
50
|
+
...this.trace.shellCommands,
|
|
51
|
+
...Object.values(this.trace.artifacts),
|
|
52
|
+
].join("\n");
|
|
53
|
+
}
|
|
54
|
+
patternHaystack() {
|
|
55
|
+
return collapseTraceWhitespace(this.assertionHaystack());
|
|
56
|
+
}
|
|
57
|
+
toHaveTier(tier) {
|
|
58
|
+
if (!tier) {
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
const actual = this.trace.routing?.tier;
|
|
62
|
+
if (actual !== tier) {
|
|
63
|
+
this.failures.push({
|
|
64
|
+
matcher: "toHaveTier",
|
|
65
|
+
message: `expected tier ${tier}, got ${actual ?? "undefined"}`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
/** Hands-on chat: tier from structured routing or one-line announce in transcript. */
|
|
71
|
+
toHaveHandsOnTier(tier) {
|
|
72
|
+
if (!tier) {
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
const haystack = this.assertionHaystack();
|
|
76
|
+
const actual = this.trace.routing?.tier ?? inferRoutingFromText(haystack)?.tier;
|
|
77
|
+
if (actual !== tier) {
|
|
78
|
+
this.failures.push({
|
|
79
|
+
matcher: "toHaveHandsOnTier",
|
|
80
|
+
message: `expected hands-on tier ${tier}, got ${actual ?? "undefined"}`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
toHaveReviewDepth(depth) {
|
|
86
|
+
if (!depth) {
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
const pattern = REVIEW_DEPTH_PATTERNS[depth];
|
|
90
|
+
if (!pattern.test(this.patternHaystack())) {
|
|
91
|
+
this.failures.push({
|
|
92
|
+
matcher: "toHaveReviewDepth",
|
|
93
|
+
message: `expected review depth ${depth}, not found in trace output`,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
toHaveRunCommand(fragment) {
|
|
99
|
+
const hit = this.trace.shellCommands.some((cmd) => cmd.includes(fragment));
|
|
100
|
+
if (!hit) {
|
|
101
|
+
this.failures.push({
|
|
102
|
+
matcher: "toHaveRunCommand",
|
|
103
|
+
message: `expected shell command containing "${fragment}"`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
toIncludeRoutingBlock() {
|
|
109
|
+
const haystack = this.assertionHaystack();
|
|
110
|
+
const collapsed = collapseTraceWhitespace(haystack);
|
|
111
|
+
if (!haystack.includes("## Routing") &&
|
|
112
|
+
!ROUTING_HEADING_PATTERN.test(haystack) &&
|
|
113
|
+
!ROUTING_BOLD_PATTERN.test(collapsed)) {
|
|
114
|
+
this.failures.push({
|
|
115
|
+
matcher: "toIncludeRoutingBlock",
|
|
116
|
+
message: "expected trace to include ## Routing section",
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
/** Hands-off PR: ## Routing must appear before the first tool call. */
|
|
122
|
+
toHaveRoutingBlockBeforeTools() {
|
|
123
|
+
if (!routingBlockBeforeTools(this.trace)) {
|
|
124
|
+
this.failures.push({
|
|
125
|
+
matcher: "toHaveRoutingBlockBeforeTools",
|
|
126
|
+
message: "expected ## Routing block in assistant output before the first tool call (agent-routing.md hands-off)",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
/** Hands-on chat: tier announce must appear before the first tool call. */
|
|
132
|
+
toHaveHandsOnTierBeforeTools(tier) {
|
|
133
|
+
if (!tier) {
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
if (!handsOnTierBeforeTools(this.trace, tier)) {
|
|
137
|
+
this.failures.push({
|
|
138
|
+
matcher: "toHaveHandsOnTierBeforeTools",
|
|
139
|
+
message: `expected hands-on tier ${tier} announced before the first tool call`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return this;
|
|
143
|
+
}
|
|
144
|
+
toHaveInvokedSkill(skillName) {
|
|
145
|
+
if (this.skillWasInvoked(skillName)) {
|
|
146
|
+
return this;
|
|
147
|
+
}
|
|
148
|
+
this.failures.push({
|
|
149
|
+
matcher: "toHaveInvokedSkill",
|
|
150
|
+
message: this.options.skillsMode === "full"
|
|
151
|
+
? `expected agent to apply ${skillName} skill (read SKILL.md or follow skill session in transcript)`
|
|
152
|
+
: `expected agent to read ${skillName} skill (SKILL.md)`,
|
|
153
|
+
});
|
|
154
|
+
return this;
|
|
155
|
+
}
|
|
156
|
+
skillWasInvoked(skillName) {
|
|
157
|
+
const normalized = skillName.toLowerCase();
|
|
158
|
+
const invoked = this.trace.skillsInvoked ?? [];
|
|
159
|
+
if (invoked.some((name) => name.toLowerCase() === normalized)) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
const haystack = this.patternHaystack();
|
|
163
|
+
if (haystack.toLowerCase().includes(`.claude/skills/${normalized}/skill.md`) ||
|
|
164
|
+
haystack.toLowerCase().includes(`.claude/skills/${normalized}/references/`)) {
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
if (this.options.skillsMode !== "full") {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
const fullModePatterns = [
|
|
171
|
+
new RegExp(`\\b(?:invok(?:e|ing)|following|using|per|applied)\\s+(?:the\\s+)?${normalized}\\b`, "i"),
|
|
172
|
+
new RegExp(`\\*\\*${normalized}\\*\\*`, "i"),
|
|
173
|
+
new RegExp(`\\b${normalized}\\s+(?:skill|protocol|design tree)\\b`, "i"),
|
|
174
|
+
new RegExp(`\\b${normalized}\\s+before implement\\b`, "i"),
|
|
175
|
+
];
|
|
176
|
+
if (normalized === "code-review") {
|
|
177
|
+
fullModePatterns.push(...FULL_MODE_CODE_REVIEW_PATTERNS);
|
|
178
|
+
}
|
|
179
|
+
if (normalized === "grill") {
|
|
180
|
+
fullModePatterns.push(...FULL_MODE_GRILL_PATTERNS);
|
|
181
|
+
}
|
|
182
|
+
if (normalized === "crystallize") {
|
|
183
|
+
fullModePatterns.push(...FULL_MODE_CRYSTALLIZE_PATTERNS);
|
|
184
|
+
}
|
|
185
|
+
return fullModePatterns.some((pattern) => pattern.test(haystack));
|
|
186
|
+
}
|
|
187
|
+
toHaveNotInvokedSkill(skillName) {
|
|
188
|
+
if (!this.skillWasInvoked(skillName)) {
|
|
189
|
+
return this;
|
|
190
|
+
}
|
|
191
|
+
this.failures.push({
|
|
192
|
+
matcher: "toHaveNotInvokedSkill",
|
|
193
|
+
message: `expected agent not to invoke ${skillName} skill`,
|
|
194
|
+
});
|
|
195
|
+
return this;
|
|
196
|
+
}
|
|
197
|
+
mustInclude(text) {
|
|
198
|
+
const haystack = this.assertionHaystack();
|
|
199
|
+
if (!haystack.toLowerCase().includes(text.toLowerCase())) {
|
|
200
|
+
this.failures.push({
|
|
201
|
+
matcher: "mustInclude",
|
|
202
|
+
message: `expected text not found: "${text}"`,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return this;
|
|
206
|
+
}
|
|
207
|
+
mustNotInclude(text) {
|
|
208
|
+
const haystack = this.assertionHaystack();
|
|
209
|
+
if (containsForbiddenPhrase(haystack, text)) {
|
|
210
|
+
this.failures.push({
|
|
211
|
+
matcher: "mustNotInclude",
|
|
212
|
+
message: `forbidden text present: "${text}"`,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return this;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function containsForbiddenPhrase(haystack, phrase) {
|
|
219
|
+
const lowerHaystack = haystack.toLowerCase();
|
|
220
|
+
const lowerPhrase = phrase.toLowerCase();
|
|
221
|
+
if (lowerPhrase.includes(" ")) {
|
|
222
|
+
return lowerHaystack.includes(lowerPhrase);
|
|
223
|
+
}
|
|
224
|
+
const pattern = new RegExp(`\\b${lowerPhrase.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i");
|
|
225
|
+
return pattern.test(haystack);
|
|
226
|
+
}
|
|
227
|
+
export function expectTrace(trace, options) {
|
|
228
|
+
return new TraceAssertion(trace, options);
|
|
229
|
+
}
|
|
230
|
+
export function assertRubric(trace, rubric, options) {
|
|
231
|
+
const assertion = expectTrace(trace, options);
|
|
232
|
+
if (rubric.tier) {
|
|
233
|
+
if (rubric.handsOnRouting) {
|
|
234
|
+
assertion.toHaveHandsOnTier(rubric.tier);
|
|
235
|
+
assertion.toHaveHandsOnTierBeforeTools(rubric.tier);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
assertion.toHaveTier(rubric.tier);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (rubric.reviewDepth) {
|
|
242
|
+
assertion.toHaveReviewDepth(rubric.reviewDepth);
|
|
243
|
+
}
|
|
244
|
+
if (rubric.routingBlock) {
|
|
245
|
+
assertion.toIncludeRoutingBlock();
|
|
246
|
+
assertion.toHaveRoutingBlockBeforeTools();
|
|
247
|
+
}
|
|
248
|
+
for (const skill of rubric.mustInvokeSkill ?? []) {
|
|
249
|
+
assertion.toHaveInvokedSkill(skill);
|
|
250
|
+
}
|
|
251
|
+
for (const skill of rubric.mustNotInvokeSkill ?? []) {
|
|
252
|
+
assertion.toHaveNotInvokedSkill(skill);
|
|
253
|
+
}
|
|
254
|
+
for (const cmd of rubric.mustRun ?? []) {
|
|
255
|
+
assertion.toHaveRunCommand(cmd);
|
|
256
|
+
}
|
|
257
|
+
for (const required of rubric.must ?? []) {
|
|
258
|
+
assertion.mustInclude(required);
|
|
259
|
+
}
|
|
260
|
+
for (const forbidden of rubric.mustNot ?? []) {
|
|
261
|
+
assertion.mustNotInclude(forbidden);
|
|
262
|
+
}
|
|
263
|
+
return assertion.errors;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=expect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.js","sourceRoot":"","sources":["../src/expect.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { assertRubric, expectTrace, TraceAssertion } from "./expect";
|
|
2
|
+
export { loadSuiteFile } from "./load-suite";
|
|
3
|
+
export { assertLiveDogfoodPreflight } from "./preflight";
|
|
4
|
+
export { cleanupLegacyRepoRecordings, cleanupStagingSession, createLiveStagingSessionId, getLiveStagingRoot, getLiveStagingSessionRoot, type RecordingPathKind, type ResolvedRecordingPath, recordTrace, resolveRecordingPath, } from "./record-trace";
|
|
5
|
+
export { discoverSuites, type RunSuiteOptions, runAllSuites, runSuite } from "./run-suite";
|
|
6
|
+
export type { AgentScenario, AgentSuiteFile, AssertionFailure, JudgeRubricItem, ScenarioResult, ScenarioRubric, SuiteRunReport, } from "./types";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACN,2BAA2B,EAC3B,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,EACzB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,WAAW,EACX,oBAAoB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,GACd,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { assertRubric, expectTrace, TraceAssertion } from "./expect";
|
|
2
|
+
export { loadSuiteFile } from "./load-suite";
|
|
3
|
+
export { assertLiveDogfoodPreflight } from "./preflight";
|
|
4
|
+
export { cleanupLegacyRepoRecordings, cleanupStagingSession, createLiveStagingSessionId, getLiveStagingRoot, getLiveStagingSessionRoot, recordTrace, resolveRecordingPath, } from "./record-trace";
|
|
5
|
+
export { discoverSuites, runAllSuites, runSuite } from "./run-suite";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAErE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACN,2BAA2B,EAC3B,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,EAGzB,WAAW,EACX,oBAAoB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAwB,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Child process per live scenario (default) — avoids macOS OOM (exit 137) across council runs. */
|
|
2
|
+
export declare function liveScenarioIsolationEnabled(): boolean;
|
|
3
|
+
export declare function scenarioSettleMs(): number;
|
|
4
|
+
export interface SpawnLiveScenarioOptions {
|
|
5
|
+
cwd: string;
|
|
6
|
+
suiteName: string;
|
|
7
|
+
scenarioName: string;
|
|
8
|
+
suitesDir: string;
|
|
9
|
+
suiteFilter?: string;
|
|
10
|
+
stagingSessionId?: string;
|
|
11
|
+
keepRecordings?: boolean;
|
|
12
|
+
recordFixtures?: boolean;
|
|
13
|
+
worktree?: boolean;
|
|
14
|
+
judge?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Run one live scenario in a fresh bun subprocess; inherit stdio for live progress. */
|
|
17
|
+
export declare function spawnLiveScenario(options: SpawnLiveScenarioOptions): Promise<number>;
|
|
18
|
+
export declare function subprocessFailureMessage(exitCode: number): string;
|
|
19
|
+
//# sourceMappingURL=live-isolation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-isolation.d.ts","sourceRoot":"","sources":["../src/live-isolation.ts"],"names":[],"mappings":"AAKA,mGAAmG;AACnG,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,MAAM,WAAW,wBAAwB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAQD,wFAAwF;AACxF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8C1F;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKjE"}
|