@post-print/agent-harness 0.3.3 → 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 (92) hide show
  1. package/README.md +64 -19
  2. package/dist/adapters/index.d.ts +11 -7
  3. package/dist/adapters/index.d.ts.map +1 -1
  4. package/dist/adapters/index.js +97 -12
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/auth-mode.d.ts +22 -0
  7. package/dist/auth-mode.d.ts.map +1 -0
  8. package/dist/auth-mode.js +36 -0
  9. package/dist/auth-mode.js.map +1 -0
  10. package/dist/capture.d.ts +1 -3
  11. package/dist/capture.d.ts.map +1 -1
  12. package/dist/capture.js +13 -67
  13. package/dist/capture.js.map +1 -1
  14. package/dist/classifier.d.ts +13 -0
  15. package/dist/classifier.d.ts.map +1 -0
  16. package/dist/classifier.js +91 -0
  17. package/dist/classifier.js.map +1 -0
  18. package/dist/claude-run.d.ts +15 -1
  19. package/dist/claude-run.d.ts.map +1 -1
  20. package/dist/claude-run.js +54 -8
  21. package/dist/claude-run.js.map +1 -1
  22. package/dist/context.d.ts +3 -2
  23. package/dist/context.d.ts.map +1 -1
  24. package/dist/context.js +27 -9
  25. package/dist/context.js.map +1 -1
  26. package/dist/conversation.d.ts +28 -0
  27. package/dist/conversation.d.ts.map +1 -0
  28. package/dist/conversation.js +191 -0
  29. package/dist/conversation.js.map +1 -0
  30. package/dist/cursor-run.d.ts +17 -1
  31. package/dist/cursor-run.d.ts.map +1 -1
  32. package/dist/cursor-run.js +152 -101
  33. package/dist/cursor-run.js.map +1 -1
  34. package/dist/host-registry.d.ts +12 -0
  35. package/dist/host-registry.d.ts.map +1 -0
  36. package/dist/host-registry.js +39 -0
  37. package/dist/host-registry.js.map +1 -0
  38. package/dist/index.d.ts +19 -7
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +28 -7
  41. package/dist/index.js.map +1 -1
  42. package/dist/judge.d.ts +30 -1
  43. package/dist/judge.d.ts.map +1 -1
  44. package/dist/judge.js +137 -17
  45. package/dist/judge.js.map +1 -1
  46. package/dist/live-agent-event.d.ts +17 -0
  47. package/dist/live-agent-event.d.ts.map +1 -0
  48. package/dist/live-agent-event.js +31 -0
  49. package/dist/live-agent-event.js.map +1 -0
  50. package/dist/main.d.ts +1 -1
  51. package/dist/main.d.ts.map +1 -1
  52. package/dist/main.js +1 -1
  53. package/dist/main.js.map +1 -1
  54. package/dist/openai-capture.d.ts +43 -0
  55. package/dist/openai-capture.d.ts.map +1 -0
  56. package/dist/openai-capture.js +164 -0
  57. package/dist/openai-capture.js.map +1 -0
  58. package/dist/openai-run.d.ts +70 -0
  59. package/dist/openai-run.d.ts.map +1 -0
  60. package/dist/openai-run.js +373 -0
  61. package/dist/openai-run.js.map +1 -0
  62. package/dist/run-guards.js +1 -1
  63. package/dist/run-guards.js.map +1 -1
  64. package/dist/sealed-workspace.d.ts +37 -0
  65. package/dist/sealed-workspace.d.ts.map +1 -0
  66. package/dist/sealed-workspace.js +170 -0
  67. package/dist/sealed-workspace.js.map +1 -0
  68. package/dist/skills-context.d.ts +26 -7
  69. package/dist/skills-context.d.ts.map +1 -1
  70. package/dist/skills-context.js +105 -40
  71. package/dist/skills-context.js.map +1 -1
  72. package/dist/types.d.ts +50 -10
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/types.js +13 -1
  75. package/dist/types.js.map +1 -1
  76. package/dist/user-simulator.d.ts +10 -0
  77. package/dist/user-simulator.d.ts.map +1 -0
  78. package/dist/user-simulator.js +47 -0
  79. package/dist/user-simulator.js.map +1 -0
  80. package/dist/user-skills.d.ts +17 -0
  81. package/dist/user-skills.d.ts.map +1 -0
  82. package/dist/user-skills.js +32 -0
  83. package/dist/user-skills.js.map +1 -0
  84. package/dist/working-tree-guard.d.ts +5 -0
  85. package/dist/working-tree-guard.d.ts.map +1 -1
  86. package/dist/working-tree-guard.js +27 -3
  87. package/dist/working-tree-guard.js.map +1 -1
  88. package/package.json +3 -3
  89. package/dist/adapters/replay.d.ts +0 -7
  90. package/dist/adapters/replay.d.ts.map +0 -1
  91. package/dist/adapters/replay.js +0 -61
  92. package/dist/adapters/replay.js.map +0 -1
package/README.md CHANGED
@@ -1,47 +1,92 @@
1
1
  # @post-print/agent-harness
2
2
 
3
- **Source of truth for** agent-harness package.
3
+ <!-- source-of-truth: agent-harness package -->
4
4
 
5
- <!-- doc-meta: owner=eng | last-reviewed=2026-07-29 -->
5
+ <!-- doc-meta: owner=eng | last-reviewed=2026-09-13 -->
6
6
 
7
- Host-agnostic agent runtime for capture, replay, and judging.
7
+ <!-- review-deps: paths=packages/harness/src/*.ts,packages/harness/src/**/*.ts,packages/harness/package.json -->
8
+
9
+ Host-agnostic runtime for direct Cursor, Claude, and OpenAI Codex execution, capture, and judging.
8
10
 
9
11
  ```ts
10
12
  import {
11
13
  runAgent,
12
14
  loadContext,
13
15
  judgeTrace,
14
- createScenarioWorktree,
16
+ createSealedWorkspace,
15
17
  } from "@post-print/agent-harness";
16
18
 
17
- const context = await loadContext({ cwd: process.cwd(), profile: "cursor" });
19
+ const sealed = await createSealedWorkspace({ callerCwd: process.cwd() });
20
+ const context = await loadContext({ cwd: sealed.path, profile: "cursor" });
18
21
  const session = await runAgent({
19
- host: "replay",
20
- cwd: context.cwd,
22
+ host: "cursor",
23
+ cwd: sealed.path,
21
24
  context,
22
25
  prompt: "…",
23
- replayTracePath: "agent-suites/example/fixtures/replays/trace.json",
24
26
  });
25
27
  ```
26
28
 
27
- `runAgent` / `runCursorAgent` / `runClaudeAgent` accept optional `timeoutMs` (hard cap; cancels the Cursor SDK run or kills the Claude CLI process group on expiry) and `failOnUserInput` (default `true` — rejects AskQuestion / AskUserQuestion-style tools in headless runs).
29
+ Replay-based testing is deprecated and removed. `runAgent` always launches the selected agent host. Untyped calls with `host: "replay"` fail with migration guidance.
30
+
31
+ `runAgent` / `runCursorAgent` / `runClaudeAgent` / `runOpenaiAgent` accept optional `timeoutMs` and `failOnUserInput` (default `true`). Set `failOnUserInput: false` to start a user simulator that answers AskQuestion-style tools. The next host turn receives the original task plus the transcript.
32
+
33
+ ## Hosts
34
+
35
+ | Host | Binary / SDK | Auth |
36
+ | --- | --- | --- |
37
+ | `cursor` | `@cursor/sdk` | `CURSOR_API_KEY`, or `CURSOR_AUTH_MODE=subscription` after `Cursor.auth.login()` |
38
+ | `claude` | `claude` or `CLAUDE_CODE_BIN` | `CLAUDE_AUTH_MODE` plus `ANTHROPIC_API_KEY` or a Claude Code login |
39
+ | `openai` | `codex` or `CODEX_BIN` | `OPENAI_API_KEY` or `CODEX_API_KEY`, or `OPENAI_AUTH_MODE=subscription` after `codex login` |
40
+ | custom slug | your `HostAdapter` | `missingAuth()` on the adapter |
41
+
42
+ A consumer repo can add a host. Implement `HostAdapter` and call `registerHostAdapter`. Builtin ids stay reserved.
43
+
44
+ ```ts
45
+ import { registerHostAdapter, type HostAdapter, runAgent } from "@post-print/agent-harness";
46
+
47
+ const gemini: HostAdapter = {
48
+ host: "gemini",
49
+ missingAuth() {
50
+ return process.env.GEMINI_API_KEY ? undefined : "GEMINI_API_KEY not set";
51
+ },
52
+ classifierHost: "cursor",
53
+ async run(options) {
54
+ return {
55
+ host: "gemini",
56
+ status: "completed",
57
+ durationMs: 0,
58
+ trace: {
59
+ messages: [{ role: "assistant", content: options.prompt }],
60
+ toolCalls: [],
61
+ shellCommands: [],
62
+ artifacts: {},
63
+ },
64
+ };
65
+ },
66
+ };
67
+
68
+ registerHostAdapter(gemini);
69
+ await runAgent({ host: "gemini", cwd: process.cwd(), prompt: "…" });
70
+ ```
71
+
72
+ For `agent-test`, put adapters in `agent-test.config.mjs` or pass `--adapter ./hosts/gemini.mjs`. Isolated children load the same config.
73
+
74
+ Set `classifierHost` to `cursor`, `claude`, or `openai`, or implement `classify()`. A custom host without one cannot run the judge.
28
75
 
29
- Live Cursor runs use `@cursor/sdk` + `CURSOR_API_KEY`. Live Claude runs use the Claude Code CLI (binary via `CLAUDE_CODE_BIN` or `claude` on `PATH`) and require an explicit `CLAUDE_AUTH_MODE` — no default, no fallback:
76
+ Claude `api-key` mode uses `--bare`. Subscription mode uses `--strict-mcp-config`. OpenAI agent runs use `codex exec --json --sandbox workspace-write --cd <sealed> --ignore-user-config -c approval_policy=never`. Suite MCP servers pass to Codex as `-c mcp_servers.<name>=…`. A user `~/.codex/config.toml` model pin does not apply.
30
77
 
31
- - `api-key`: `ANTHROPIC_API_KEY` (metered API billing). Runs `claude -p --bare --output-format stream-json`; `--bare` skips ambient CLAUDE.md / skills discovery, and the harness injects context via the `loadContext` preamble instead.
32
- - `subscription`: the CLI's own login (keychain OAuth, or `CLAUDE_CODE_OAUTH_TOKEN` from `claude setup-token`). `--bare` never reads OAuth, so this mode drops it and uses `--strict-mcp-config`; the host's own hooks, plugins and CLAUDE.md are then in play, so it is less hermetic. `ANTHROPIC_API_KEY` is stripped from the child env so a stale key cannot silently bill the API.
33
- Claude tool names are Claude-native (`Bash`, `Read`, `Edit`, …).
78
+ ## Skills
34
79
 
35
- Live Cursor/Claude runs capture optional `trace.usage` (`inputTokens` / `outputTokens` / `totalTokens`, plus provider cache/reasoning fields when present).
80
+ The sealed workspace is a git repo. Hosts load project skills from `.agents/skills`, `.cursor/skills`, `.codex/skills`, and `.claude/skills` inside that folder. Optional `skills` paths only overlay extra folders that are not already in that repo. Host-global user skills stay out unless `allowUserSkills` is true. The deny path uses Cursor `settingSources: ["project"]`, Claude `--setting-sources project` or `--bare`, and Codex `--ignore-user-config`. The judge scores any criterion against the full transcript, including tool names, args, and results. A tool result is an outcome.
36
81
 
37
- Context profiles: `shared` | `cursor` | `claude` | `skeleton`. `skeleton` loads `.skeleton/registry.md`, a short `.skeleton/config.yaml` summary, and optional `customize.alwaysInclude` basenames under `.skeleton/customize/`. Additive paths via `loadContext({ contextSources })` work on any profile; default `shared`/`cursor`/`claude` profiles stay unchanged for toolbox compatibility.
82
+ ## Isolation
38
83
 
39
- Live runs accept inline `mcpServers` (stdio or HTTP/SSE). Cursor passes them to `Agent.create`; Claude writes a temp `--mcp-config` JSON. Replay ignores them and scores committed `toolCalls` only. Ambient MCP via `local.settingSources` is not enabled.
84
+ `createSealedWorkspace` copies `git archive HEAD` plus caller context (rules, skill trees, `AGENTS.md`, `skeleton.toml`) into a temp folder. Pass `workspace` to copy a caller-relative folder instead. It then runs `git init` in that folder so git does not walk to the caller repo. The test runner fails the scenario when tool paths leave that folder.
40
85
 
41
- When `outputContract` is set, `buildRoutingContract` injects hands-on / hands-off routing announce rules and requires continuing the task after the announce (do not end the turn at Routing alone).
86
+ ## Judge
42
87
 
43
- Judge classifiers remain Cursor SDK–backed (`CURSOR_API_KEY`) for all hosts.
88
+ `judgeTrace` uses the same host family as the test agent. Cursor judge calls use `CURSOR_API_KEY` or the SDK login store. Claude and OpenAI judges use their own host credentials.
44
89
 
45
- `createScenarioWorktree` isolates **file edits** in a detached checkout. It does not prevent hosts from loading caller context or (for Cursor local) Shell/Read against the IDE-open root — see `@post-print/agent-test` README § Isolation model.
90
+ The Cursor app login does not feed the SDK. Run `Cursor.auth.login()` once, or set `CURSOR_API_KEY`. `OPENAI_AUTH_MODE=subscription` uses the Codex CLI login and strips stale API keys from the child env.
46
91
 
47
92
  Consumer: `@post-print/agent-test`.
@@ -1,20 +1,24 @@
1
1
  import type { AgentSession, HostAdapter, RunAgentOptions } from "../types.js";
2
- import { ReplayAdapter } from "./replay.js";
3
- /** Cursor SDK adapter — requires optional @cursor/sdk peer + CURSOR_API_KEY. */
2
+ /** Cursor SDK adapter — requires optional @cursor/sdk peer + key or SDK login. */
4
3
  export declare class CursorAdapter implements HostAdapter {
5
4
  readonly host: "cursor";
6
5
  run(options: RunAgentOptions): Promise<AgentSession>;
7
6
  }
8
7
  /**
9
- * Claude Code CLI adapter — requires `claude` on PATH (or CLAUDE_CODE_BIN) and
10
- * an explicit CLAUDE_AUTH_MODE: `api-key` (ANTHROPIC_API_KEY) or
11
- * `subscription` (the CLI's own login — keychain OAuth or
12
- * CLAUDE_CODE_OAUTH_TOKEN). There is no default and no fallback between them.
8
+ * Claude Code CLI adapter — requires `claude` on PATH (or CLAUDE_CODE_BIN)
9
+ * and an explicit auth mode.
13
10
  */
14
11
  export declare class ClaudeAdapter implements HostAdapter {
15
12
  readonly host: "claude";
16
13
  run(options: RunAgentOptions): Promise<AgentSession>;
17
14
  }
15
+ /**
16
+ * OpenAI Codex CLI adapter — requires `codex` on PATH (or CODEX_BIN)
17
+ * and an API key or OPENAI_AUTH_MODE=subscription after `codex login`.
18
+ */
19
+ export declare class OpenaiAdapter implements HostAdapter {
20
+ readonly host: "openai";
21
+ run(options: RunAgentOptions): Promise<AgentSession>;
22
+ }
18
23
  export declare function createAdapter(host: RunAgentOptions["host"]): HostAdapter;
19
- export { ReplayAdapter };
20
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAc,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA2B5C,gFAAgF;AAChF,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA+EzD;CACD;AAED;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAsEzD;CACD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,WAAW,CASxE;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEX,YAAY,EAEZ,WAAW,EACX,eAAe,EACf,MAAM,aAAa,CAAC;AA8BrB,kFAAkF;AAClF,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA0EzD;CACD;AAED;;;GAGG;AACH,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CA4EzD;CACD;AAED;;;GAGG;AACH,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAwEzD;CACD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,WAAW,CAqBxE"}
@@ -1,9 +1,11 @@
1
1
  import { captureGitDiff, enrichTrace } from "../capture.js";
2
2
  import { formatClaudeRunFailure, runClaudeAgent, takeLastClaudeRunTrace } from "../claude-run.js";
3
3
  import { formatCursorRunFailure, runCursorAgent, takeLastCursorRunTrace } from "../cursor-run.js";
4
+ import { getRegisteredAdapter } from "../host-registry.js";
5
+ import { formatOpenaiRunFailure, runOpenaiAgent, takeLastOpenaiRunTrace } from "../openai-run.js";
4
6
  import { buildRoutingContract } from "../routing-contract.js";
5
7
  import { getPartialTrace } from "../run-guards.js";
6
- import { ReplayAdapter } from "./replay.js";
8
+ const REPLAY_DEPRECATION = "Replay-based testing is deprecated and no longer supported; use the cursor or claude host.";
7
9
  function emptyFailed(host, error) {
8
10
  return {
9
11
  host,
@@ -22,13 +24,10 @@ function sessionFromTrace(host, trace, error, durationMs) {
22
24
  error,
23
25
  };
24
26
  }
25
- /** Cursor SDK adapter — requires optional @cursor/sdk peer + CURSOR_API_KEY. */
27
+ /** Cursor SDK adapter — requires optional @cursor/sdk peer + key or SDK login. */
26
28
  export class CursorAdapter {
27
29
  host = "cursor";
28
30
  async run(options) {
29
- if (!process.env.CURSOR_API_KEY) {
30
- return emptyFailed(this.host, "CURSOR_API_KEY not set — use host replay or set API key for live runs");
31
- }
32
31
  const started = performance.now();
33
32
  try {
34
33
  const contract = options.outputContract
@@ -42,6 +41,8 @@ export class CursorAdapter {
42
41
  timeoutMs: options.timeoutMs,
43
42
  failOnUserInput: options.failOnUserInput,
44
43
  onDeadlineStart: options.onDeadlineStart,
44
+ onAgentEvent: options.onAgentEvent,
45
+ allowUserSkills: options.allowUserSkills === true,
45
46
  });
46
47
  const gitDiffResult = await captureGitDiff(options.cwd);
47
48
  const trace = enrichTrace({
@@ -90,10 +91,8 @@ export class CursorAdapter {
90
91
  }
91
92
  }
92
93
  /**
93
- * Claude Code CLI adapter — requires `claude` on PATH (or CLAUDE_CODE_BIN) and
94
- * an explicit CLAUDE_AUTH_MODE: `api-key` (ANTHROPIC_API_KEY) or
95
- * `subscription` (the CLI's own login — keychain OAuth or
96
- * CLAUDE_CODE_OAUTH_TOKEN). There is no default and no fallback between them.
94
+ * Claude Code CLI adapter — requires `claude` on PATH (or CLAUDE_CODE_BIN)
95
+ * and an explicit auth mode.
97
96
  */
98
97
  export class ClaudeAdapter {
99
98
  host = "claude";
@@ -111,6 +110,8 @@ export class ClaudeAdapter {
111
110
  timeoutMs: options.timeoutMs,
112
111
  failOnUserInput: options.failOnUserInput,
113
112
  onDeadlineStart: options.onDeadlineStart,
113
+ onAgentEvent: options.onAgentEvent,
114
+ allowUserSkills: options.allowUserSkills === true,
114
115
  });
115
116
  const gitDiffResult = await captureGitDiff(options.cwd);
116
117
  const resultError = streamedTrace.artifacts.claudeResultError;
@@ -152,8 +153,83 @@ export class ClaudeAdapter {
152
153
  }
153
154
  catch (error) {
154
155
  const message = error instanceof Error ? error.message : "Failed to run Claude Code CLI";
156
+ const enrichedMessage = message.includes("CLAUDE_AUTH_MODE not set") && !process.env.ANTHROPIC_API_KEY?.trim()
157
+ ? `${message}; ANTHROPIC_API_KEY is required for api-key mode`
158
+ : message;
155
159
  const durationMs = Math.round(performance.now() - started);
156
160
  const partial = getPartialTrace(error) ?? takeLastClaudeRunTrace();
161
+ if (partial && (partial.messages.length > 0 || partial.toolCalls.length > 0)) {
162
+ return sessionFromTrace(this.host, partial, enrichedMessage, durationMs);
163
+ }
164
+ return emptyFailed(this.host, enrichedMessage);
165
+ }
166
+ }
167
+ }
168
+ /**
169
+ * OpenAI Codex CLI adapter — requires `codex` on PATH (or CODEX_BIN)
170
+ * and an API key or OPENAI_AUTH_MODE=subscription after `codex login`.
171
+ */
172
+ export class OpenaiAdapter {
173
+ host = "openai";
174
+ async run(options) {
175
+ const started = performance.now();
176
+ try {
177
+ const contract = options.outputContract
178
+ ? `\n\n${buildRoutingContract(options.outputContract)}\n`
179
+ : "";
180
+ const prompt = `${options.context.preamble}\n\n---\n${contract}Task:\n${options.prompt}`;
181
+ const { trace: streamedTrace, status, rawStatus, exitCode, stderr, } = await runOpenaiAgent({
182
+ cwd: options.cwd,
183
+ prompt,
184
+ mcpServers: options.mcpServers,
185
+ timeoutMs: options.timeoutMs,
186
+ failOnUserInput: options.failOnUserInput,
187
+ onDeadlineStart: options.onDeadlineStart,
188
+ onAgentEvent: options.onAgentEvent,
189
+ allowUserSkills: options.allowUserSkills === true,
190
+ });
191
+ const gitDiffResult = await captureGitDiff(options.cwd);
192
+ const resultError = streamedTrace.artifacts.openaiResultError;
193
+ const trace = enrichTrace({
194
+ ...streamedTrace,
195
+ gitDiff: gitDiffResult.diff,
196
+ artifacts: {
197
+ ...streamedTrace.artifacts,
198
+ ...(gitDiffResult.truncated ? { gitDiffTruncated: "true" } : {}),
199
+ ...(exitCode !== undefined && exitCode !== null
200
+ ? { openaiExitCode: String(exitCode) }
201
+ : {}),
202
+ },
203
+ });
204
+ const durationMs = Math.round(performance.now() - started);
205
+ if (status === "completed") {
206
+ return {
207
+ host: this.host,
208
+ status: "completed",
209
+ trace,
210
+ durationMs,
211
+ usage: trace.usage,
212
+ };
213
+ }
214
+ return {
215
+ host: this.host,
216
+ status: "failed",
217
+ trace,
218
+ durationMs,
219
+ usage: trace.usage,
220
+ error: formatOpenaiRunFailure({
221
+ status,
222
+ rawStatus,
223
+ exitCode,
224
+ stderr,
225
+ resultError,
226
+ }),
227
+ };
228
+ }
229
+ catch (error) {
230
+ const message = error instanceof Error ? error.message : "Failed to run OpenAI Codex CLI";
231
+ const durationMs = Math.round(performance.now() - started);
232
+ const partial = getPartialTrace(error) ?? takeLastOpenaiRunTrace();
157
233
  if (partial && (partial.messages.length > 0 || partial.toolCalls.length > 0)) {
158
234
  return sessionFromTrace(this.host, partial, message, durationMs);
159
235
  }
@@ -162,14 +238,23 @@ export class ClaudeAdapter {
162
238
  }
163
239
  }
164
240
  export function createAdapter(host) {
241
+ if (host === "replay") {
242
+ throw new Error(REPLAY_DEPRECATION);
243
+ }
165
244
  switch (host) {
166
245
  case "cursor":
167
246
  return new CursorAdapter();
168
247
  case "claude":
169
248
  return new ClaudeAdapter();
170
- default:
171
- return new ReplayAdapter();
249
+ case "openai":
250
+ return new OpenaiAdapter();
251
+ default: {
252
+ const custom = getRegisteredAdapter(host);
253
+ if (custom) {
254
+ return custom;
255
+ }
256
+ throw new Error(`Unknown agent host: ${String(host)}. Register it with registerHostAdapter() or --adapter.`);
257
+ }
172
258
  }
173
259
  }
174
- export { ReplayAdapter };
175
260
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** How a host bills a run. The two modes charge different accounts. */
2
+ export type HostAuthMode = "api-key" | "subscription";
3
+ export declare const HOST_AUTH_MODES: HostAuthMode[];
4
+ /**
5
+ * Parse an explicit auth-mode value. Throws on a misspelled value.
6
+ * Returns undefined when the variable is unset so a host can keep a key-only default.
7
+ */
8
+ export declare function parseOptionalAuthMode(envName: string, raw: string | undefined): HostAuthMode | undefined;
9
+ /**
10
+ * Cursor and OpenAI auth.
11
+ *
12
+ * An explicit mode always wins. When the mode is unset, a present API key
13
+ * keeps the current api-key default. When both are unset, the error names
14
+ * the key and the login mode. Subscription mode ignores a stale key.
15
+ */
16
+ export declare function resolveKeyOrLoginAuthMode(options: {
17
+ envName: string;
18
+ raw: string | undefined;
19
+ hasApiKey: boolean;
20
+ missingKeyMessage: string;
21
+ }): HostAuthMode;
22
+ //# sourceMappingURL=auth-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-mode.d.ts","sourceRoot":"","sources":["../src/auth-mode.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,CAAC;AAEtD,eAAO,MAAM,eAAe,EAAE,YAAY,EAAgC,CAAC;AAE3E;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GAAG,SAAS,GACrB,YAAY,GAAG,SAAS,CAS1B;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC1B,GAAG,YAAY,CAYf"}
@@ -0,0 +1,36 @@
1
+ export const HOST_AUTH_MODES = ["api-key", "subscription"];
2
+ /**
3
+ * Parse an explicit auth-mode value. Throws on a misspelled value.
4
+ * Returns undefined when the variable is unset so a host can keep a key-only default.
5
+ */
6
+ export function parseOptionalAuthMode(envName, raw) {
7
+ const value = raw?.trim();
8
+ if (!value) {
9
+ return undefined;
10
+ }
11
+ if (!HOST_AUTH_MODES.includes(value)) {
12
+ throw new Error(`${envName}="${value}" is invalid — choose ${HOST_AUTH_MODES.join(" or ")}`);
13
+ }
14
+ return value;
15
+ }
16
+ /**
17
+ * Cursor and OpenAI auth.
18
+ *
19
+ * An explicit mode always wins. When the mode is unset, a present API key
20
+ * keeps the current api-key default. When both are unset, the error names
21
+ * the key and the login mode. Subscription mode ignores a stale key.
22
+ */
23
+ export function resolveKeyOrLoginAuthMode(options) {
24
+ const mode = parseOptionalAuthMode(options.envName, options.raw);
25
+ if (mode === "subscription") {
26
+ return "subscription";
27
+ }
28
+ if (mode === "api-key" || options.hasApiKey) {
29
+ if (!options.hasApiKey) {
30
+ throw new Error(options.missingKeyMessage);
31
+ }
32
+ return "api-key";
33
+ }
34
+ throw new Error(options.missingKeyMessage);
35
+ }
36
+ //# sourceMappingURL=auth-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-mode.js","sourceRoot":"","sources":["../src/auth-mode.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,eAAe,GAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AAE3E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACpC,OAAe,EACf,GAAuB;IAEvB,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAE,eAA4B,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,KAAK,KAAK,yBAAyB,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,KAAqB,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAKzC;IACA,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC7B,OAAO,cAAc,CAAC;IACvB,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC5C,CAAC"}
package/dist/capture.d.ts CHANGED
@@ -12,15 +12,13 @@ export declare function collapseTraceWhitespace(text: string): string;
12
12
  export declare function extractSkillsInvokedFromToolCalls(toolCalls: AgentToolCall[]): string[];
13
13
  /** Infer skill reads referenced in assistant prose. */
14
14
  export declare function extractSkillsInvokedFromText(...chunks: string[]): string[];
15
- /** Infer explicit skill sessions when SKILL.md is already in preamble (full catalog mode). */
16
- export declare function extractSkillsAppliedFromText(...chunks: string[]): string[];
17
15
  /** Infer code-review depth from synthesis status line (`Review · staged · Standard`). */
18
16
  export declare function inferReviewDepthFromText(text: string): "quick" | "standard" | "thorough" | "full" | undefined;
19
17
  export declare function mergeSkillsInvoked(...lists: Array<string[] | undefined>): string[];
20
18
  /** Pull shell-like commands from assistant prose and tool output. */
21
19
  export declare function extractShellCommands(...chunks: string[]): string[];
22
20
  /** Infer routing metadata from live agent prose when not structured. */
23
- /** Assistant prose before the first tool call (SDK order, or replay messages[]). */
21
+ /** Assistant prose before the first tool call when chronological event order is available. */
24
22
  export declare function assistantPrefixBeforeTools(trace: AgentTrace): string;
25
23
  export declare function inferRoutingFromText(text: string): AgentTrace["routing"] | undefined;
26
24
  export declare function inferPrBodyFromText(text: string): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
package/dist/capture.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
3
  import { textBlocksFromSdkMessage } from "./cursor-run.js";
4
+ import { skillNameFromWorkflowPath } from "./skills-context.js";
4
5
  const execFileAsync = promisify(execFile);
5
6
  const SHELL_COMMAND_PATTERN = /\b(bun run [\w:./-]+|validate:changed[\w ./:-]*|bunx [\w ./:-]+)/gi;
6
7
  const TIER_PATTERN = /\*\*Tier:\*\*\s*(low|medium|high)\b/i;
@@ -53,48 +54,17 @@ export function extractShellCommandsFromToolCalls(toolCalls) {
53
54
  if (typeof raw !== "string") {
54
55
  continue;
55
56
  }
57
+ const trimmed = raw.trim();
58
+ if (trimmed.length > 0) {
59
+ commands.add(trimmed);
60
+ }
56
61
  for (const cmd of extractShellCommands(raw)) {
57
62
  commands.add(cmd);
58
63
  }
59
- if (raw.includes("validate:changed") || raw.startsWith("bun run")) {
60
- commands.add(raw.trim());
61
- }
62
64
  }
63
65
  }
64
66
  return [...commands];
65
67
  }
66
- const SKILL_WORKFLOW_PATH_PATTERN = /\.claude\/skills\/([^/]+)\/(?:SKILL\.md|references\/)/i;
67
- const APPLIED_SKILL_GENERIC_PATTERNS = [
68
- /\b(?:invok(?:e|ing)|following|using|per|walk(?:ing)?)\s+(?:the\s+)?([a-z][a-z0-9-]*)\s+(?:skill|protocol|design tree)\b/gi,
69
- /\*\*([a-z][a-z0-9-]*)\*\*\s*(?:skill|protocol)?/gi,
70
- ];
71
- const APPLIED_SKILL_MARKERS = [
72
- { skill: "grill", pattern: /\bgrill\s+before\s+implement/i },
73
- { skill: "grill", pattern: /\b(?:invok(?:e|ing)|applied)\s+grill\b/i },
74
- { skill: "grill", pattern: /\bgrill\b/i },
75
- { skill: "grill", pattern: /\bpressure-test(?:ing)?\b/i },
76
- {
77
- skill: "crystallize",
78
- pattern: /\b(?:invok(?:e|ing)|applied)\s+crystallize\b/i,
79
- },
80
- { skill: "crystallize", pattern: /\bcrystalliz(?:e|ing|ation)\b/i },
81
- { skill: "crystallize", pattern: /\bhalf-formed\b/i },
82
- { skill: "crystallize", pattern: /\bfuzzy\s+intent\b/i },
83
- {
84
- skill: "crystallize",
85
- pattern: /\bmirror(?:ed|ing)?\s+(?:the\s+)?(?:fuzzy\s+)?intent\b/i,
86
- },
87
- { skill: "crystallize", pattern: /\bmight be assuming\b/i },
88
- {
89
- skill: "code-review",
90
- pattern: /\b(?:invok(?:e|ing)|applied)\s+code-review\b/i,
91
- },
92
- {
93
- skill: "code-review",
94
- pattern: /\bReview\s·\s*[^·]+\s·\s*(?:Quick|Standard|Thorough|Full)\b/i,
95
- },
96
- { skill: "code-review", pattern: /## Review synthesis/i },
97
- ];
98
68
  const REVIEW_HEADER_DEPTH_PATTERN = /\bReview\s·\s*[^·]+\s·\s*(Quick|Standard|Thorough|Full)\b/i;
99
69
  const REVIEW_DEPTH_LABEL_PATTERN = /\*\*Depth:\*\*\s*(quick|standard|thorough|full)\b/i;
100
70
  const REVIEW_PASS_CLASS_DEPTH_PATTERNS = [
@@ -118,10 +88,6 @@ function pathsFromToolArgs(args) {
118
88
  }
119
89
  return paths;
120
90
  }
121
- function skillNameFromPath(path) {
122
- const match = path.match(SKILL_WORKFLOW_PATH_PATTERN);
123
- return match?.[1]?.toLowerCase();
124
- }
125
91
  /** Infer skill folder names from Read tool paths in tool calls. */
126
92
  export function extractSkillsInvokedFromToolCalls(toolCalls) {
127
93
  const skills = new Set();
@@ -130,14 +96,14 @@ export function extractSkillsInvokedFromToolCalls(toolCalls) {
130
96
  continue;
131
97
  }
132
98
  for (const path of pathsFromToolArgs(call.args)) {
133
- const name = skillNameFromPath(path);
99
+ const name = skillNameFromWorkflowPath(path);
134
100
  if (name) {
135
101
  skills.add(name);
136
102
  }
137
103
  }
138
104
  const serialized = JSON.stringify(call.args);
139
- for (const match of serialized.matchAll(/\.claude\/skills\/([^/]+)\/SKILL\.md/gi)) {
140
- const name = match[1]?.toLowerCase();
105
+ for (const path of serialized.matchAll(/(?:\.agents|\.cursor|\.codex|\.claude)[/\\]skills[/\\][^"\\]+/gi)) {
106
+ const name = skillNameFromWorkflowPath(path[0] ?? "");
141
107
  if (name) {
142
108
  skills.add(name);
143
109
  }
@@ -149,8 +115,8 @@ export function extractSkillsInvokedFromToolCalls(toolCalls) {
149
115
  export function extractSkillsInvokedFromText(...chunks) {
150
116
  const skills = new Set();
151
117
  for (const chunk of chunks) {
152
- for (const match of chunk.matchAll(/\.claude\/skills\/([^/]+)\/SKILL\.md/gi)) {
153
- const name = match[1]?.toLowerCase();
118
+ for (const match of chunk.matchAll(/(?:\.agents|\.cursor|\.codex|\.claude)[/\\]skills[/\\][^"'?\s]+/gi)) {
119
+ const name = skillNameFromWorkflowPath(match[0] ?? "");
154
120
  if (name) {
155
121
  skills.add(name);
156
122
  }
@@ -158,26 +124,6 @@ export function extractSkillsInvokedFromText(...chunks) {
158
124
  }
159
125
  return [...skills];
160
126
  }
161
- /** Infer explicit skill sessions when SKILL.md is already in preamble (full catalog mode). */
162
- export function extractSkillsAppliedFromText(...chunks) {
163
- const skills = new Set();
164
- const combined = collapseTraceWhitespace(chunks.join("\n"));
165
- const genericPatterns = APPLIED_SKILL_GENERIC_PATTERNS;
166
- for (const pattern of genericPatterns) {
167
- for (const match of combined.matchAll(pattern)) {
168
- const name = match[1]?.toLowerCase();
169
- if (name) {
170
- skills.add(name);
171
- }
172
- }
173
- }
174
- for (const { skill, pattern } of APPLIED_SKILL_MARKERS) {
175
- if (pattern.test(combined)) {
176
- skills.add(skill);
177
- }
178
- }
179
- return [...skills];
180
- }
181
127
  /** Infer code-review depth from synthesis status line (`Review · staged · Standard`). */
182
128
  export function inferReviewDepthFromText(text) {
183
129
  const collapsed = collapseTraceWhitespace(text);
@@ -213,7 +159,7 @@ export function extractShellCommands(...chunks) {
213
159
  return [...commands];
214
160
  }
215
161
  /** Infer routing metadata from live agent prose when not structured. */
216
- /** Assistant prose before the first tool call (SDK order, or replay messages[]). */
162
+ /** Assistant prose before the first tool call when chronological event order is available. */
217
163
  export function assistantPrefixBeforeTools(trace) {
218
164
  if (trace.assistantTextBeforeTools !== undefined) {
219
165
  return trace.assistantTextBeforeTools;
@@ -463,7 +409,7 @@ export function finalizeTraceAccumulator(acc, options) {
463
409
  const prBody = inferPrBodyFromText(combined);
464
410
  const shellFromText = extractShellCommands(proseCombined, toolCombined);
465
411
  const shellFromTools = extractShellCommandsFromToolCalls(acc.toolCalls);
466
- const skillsInvoked = mergeSkillsInvoked(extractSkillsInvokedFromToolCalls(acc.toolCalls), extractSkillsInvokedFromText(combined), extractSkillsAppliedFromText(combined));
412
+ const skillsInvoked = mergeSkillsInvoked(extractSkillsInvokedFromToolCalls(acc.toolCalls), extractSkillsInvokedFromText(combined));
467
413
  const artifacts = {};
468
414
  if (options?.gitDiffTruncated) {
469
415
  artifacts.gitDiffTruncated = "true";
@@ -497,7 +443,7 @@ export function enrichTrace(trace) {
497
443
  ...trace,
498
444
  routing: trace.routing ?? inferRoutingFromText(combined),
499
445
  prBody: trace.prBody ?? inferPrBodyFromText(combined),
500
- skillsInvoked: mergeSkillsInvoked(trace.skillsInvoked, extractSkillsInvokedFromToolCalls(trace.toolCalls), extractSkillsInvokedFromText(combined), extractSkillsAppliedFromText(combined)),
446
+ skillsInvoked: mergeSkillsInvoked(trace.skillsInvoked, extractSkillsInvokedFromToolCalls(trace.toolCalls), extractSkillsInvokedFromText(combined)),
501
447
  shellCommands: trace.shellCommands.length > 0
502
448
  ? trace.shellCommands
503
449
  : [