@post-print/agent-harness 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 +18 -0
- package/dist/adapters/index.d.ts +15 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +65 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/replay.d.ts +7 -0
- package/dist/adapters/replay.d.ts.map +1 -0
- package/dist/adapters/replay.js +61 -0
- package/dist/adapters/replay.js.map +1 -0
- package/dist/capture.d.ts +69 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +352 -0
- package/dist/capture.js.map +1 -0
- package/dist/context.d.ts +11 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +93 -0
- package/dist/context.js.map +1 -0
- package/dist/cursor-run.d.ts +44 -0
- package/dist/cursor-run.d.ts.map +1 -0
- package/dist/cursor-run.js +159 -0
- package/dist/cursor-run.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/judge.d.ts +35 -0
- package/dist/judge.d.ts.map +1 -0
- package/dist/judge.js +222 -0
- package/dist/judge.js.map +1 -0
- package/dist/routing-contract.d.ts +4 -0
- package/dist/routing-contract.d.ts.map +1 -0
- package/dist/routing-contract.js +22 -0
- package/dist/routing-contract.js.map +1 -0
- package/dist/skills-context.d.ts +25 -0
- package/dist/skills-context.d.ts.map +1 -0
- package/dist/skills-context.js +120 -0
- package/dist/skills-context.js.map +1 -0
- package/dist/types.d.ts +72 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/working-tree-guard.d.ts +6 -0
- package/dist/working-tree-guard.d.ts.map +1 -0
- package/dist/working-tree-guard.js +20 -0
- package/dist/working-tree-guard.js.map +1 -0
- package/dist/worktree.d.ts +10 -0
- package/dist/worktree.d.ts.map +1 -0
- package/dist/worktree.js +58 -0
- package/dist/worktree.js.map +1 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# @post-print/agent-harness
|
|
2
|
+
|
|
3
|
+
Host-agnostic agent runtime for capture, replay, and judging.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { runAgent, loadContext, judgeTrace, createScenarioWorktree } from "@post-print/agent-harness";
|
|
7
|
+
|
|
8
|
+
const context = await loadContext({ cwd: process.cwd(), profile: "cursor" });
|
|
9
|
+
const session = await runAgent({
|
|
10
|
+
host: "replay",
|
|
11
|
+
cwd: context.cwd,
|
|
12
|
+
context,
|
|
13
|
+
prompt: "…",
|
|
14
|
+
replayTracePath: "agent-suites/example/fixtures/replays/trace.json",
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Consumer: `@post-print/agent-test`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AgentSession, HostAdapter, RunAgentOptions } from "../types";
|
|
2
|
+
import { ReplayAdapter } from "./replay";
|
|
3
|
+
/** Cursor SDK adapter — requires optional @cursor/sdk peer + CURSOR_API_KEY. */
|
|
4
|
+
export declare class CursorAdapter implements HostAdapter {
|
|
5
|
+
readonly host: "cursor";
|
|
6
|
+
run(options: RunAgentOptions): Promise<AgentSession>;
|
|
7
|
+
}
|
|
8
|
+
/** Claude Code CLI adapter — stub until structured headless output is wired. */
|
|
9
|
+
export declare class ClaudeAdapter implements HostAdapter {
|
|
10
|
+
readonly host: "claude";
|
|
11
|
+
run(_options: RunAgentOptions): Promise<AgentSession>;
|
|
12
|
+
}
|
|
13
|
+
export declare function createAdapter(host: RunAgentOptions["host"]): HostAdapter;
|
|
14
|
+
export { ReplayAdapter };
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAYzC,gFAAgF;AAChF,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CAkC1D;AAED,gFAAgF;AAChF,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CAM3D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,WAAW,CASxE;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { captureGitDiff, enrichTrace } from "../capture";
|
|
2
|
+
import { runCursorAgent } from "../cursor-run";
|
|
3
|
+
import { buildRoutingContract } from "../routing-contract";
|
|
4
|
+
import { ReplayAdapter } from "./replay";
|
|
5
|
+
function emptyFailed(host, error) {
|
|
6
|
+
return {
|
|
7
|
+
host,
|
|
8
|
+
status: "skipped",
|
|
9
|
+
trace: { messages: [], toolCalls: [], shellCommands: [], artifacts: {} },
|
|
10
|
+
durationMs: 0,
|
|
11
|
+
error,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** Cursor SDK adapter — requires optional @cursor/sdk peer + CURSOR_API_KEY. */
|
|
15
|
+
export class CursorAdapter {
|
|
16
|
+
host = "cursor";
|
|
17
|
+
async run(options) {
|
|
18
|
+
if (!process.env.CURSOR_API_KEY) {
|
|
19
|
+
return emptyFailed(this.host, "CURSOR_API_KEY not set — use host replay or set API key for live runs");
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const started = performance.now();
|
|
23
|
+
const contract = options.outputContract
|
|
24
|
+
? `\n\n${buildRoutingContract(options.outputContract)}\n`
|
|
25
|
+
: "";
|
|
26
|
+
const prompt = `${options.context.preamble}\n\n---\n${contract}Task:\n${options.prompt}`;
|
|
27
|
+
const { trace: streamedTrace, status } = await runCursorAgent({
|
|
28
|
+
cwd: options.cwd,
|
|
29
|
+
prompt,
|
|
30
|
+
});
|
|
31
|
+
const gitDiff = await captureGitDiff(options.cwd);
|
|
32
|
+
const trace = enrichTrace({ ...streamedTrace, gitDiff });
|
|
33
|
+
return {
|
|
34
|
+
host: this.host,
|
|
35
|
+
status: status === "completed" ? "completed" : "failed",
|
|
36
|
+
trace,
|
|
37
|
+
durationMs: Math.round(performance.now() - started),
|
|
38
|
+
error: status !== "completed" ? `cursor run status: ${status}` : undefined,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const message = error instanceof Error ? error.message : "Failed to load or run @cursor/sdk";
|
|
43
|
+
return emptyFailed(this.host, message);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Claude Code CLI adapter — stub until structured headless output is wired. */
|
|
48
|
+
export class ClaudeAdapter {
|
|
49
|
+
host = "claude";
|
|
50
|
+
async run(_options) {
|
|
51
|
+
return emptyFailed(this.host, "Claude Code adapter not implemented — use host replay or export session to trace JSON");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export function createAdapter(host) {
|
|
55
|
+
switch (host) {
|
|
56
|
+
case "cursor":
|
|
57
|
+
return new CursorAdapter();
|
|
58
|
+
case "claude":
|
|
59
|
+
return new ClaudeAdapter();
|
|
60
|
+
default:
|
|
61
|
+
return new ReplayAdapter();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export { ReplayAdapter };
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentSession, HostAdapter, RunAgentOptions } from "../types";
|
|
2
|
+
/** Replay a committed trace JSON — host-agnostic scoring path. */
|
|
3
|
+
export declare class ReplayAdapter implements HostAdapter {
|
|
4
|
+
readonly host: "replay";
|
|
5
|
+
run(options: RunAgentOptions): Promise<AgentSession>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=replay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/adapters/replay.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAc,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAoCvF,kEAAkE;AAClE,qBAAa,aAAc,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAE5B,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CA8B1D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
function emptyTrace() {
|
|
4
|
+
return {
|
|
5
|
+
messages: [],
|
|
6
|
+
toolCalls: [],
|
|
7
|
+
shellCommands: [],
|
|
8
|
+
artifacts: {},
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function isAgentTrace(value) {
|
|
12
|
+
if (typeof value !== "object" || value === null) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const trace = value;
|
|
16
|
+
return (Array.isArray(trace.messages) &&
|
|
17
|
+
Array.isArray(trace.toolCalls) &&
|
|
18
|
+
Array.isArray(trace.shellCommands) &&
|
|
19
|
+
typeof trace.artifacts === "object" &&
|
|
20
|
+
trace.artifacts !== null &&
|
|
21
|
+
!Array.isArray(trace.artifacts));
|
|
22
|
+
}
|
|
23
|
+
function failedReplay(started, error) {
|
|
24
|
+
return {
|
|
25
|
+
host: "replay",
|
|
26
|
+
status: "failed",
|
|
27
|
+
trace: emptyTrace(),
|
|
28
|
+
durationMs: Math.round(performance.now() - started),
|
|
29
|
+
error,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Replay a committed trace JSON — host-agnostic scoring path. */
|
|
33
|
+
export class ReplayAdapter {
|
|
34
|
+
host = "replay";
|
|
35
|
+
async run(options) {
|
|
36
|
+
const started = performance.now();
|
|
37
|
+
if (!options.replayTracePath) {
|
|
38
|
+
return failedReplay(started, "replay host requires replayTracePath");
|
|
39
|
+
}
|
|
40
|
+
const path = resolve(options.cwd, options.replayTracePath);
|
|
41
|
+
let parsed;
|
|
42
|
+
try {
|
|
43
|
+
const raw = await readFile(path, "utf8");
|
|
44
|
+
parsed = JSON.parse(raw);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : "failed to read replay trace";
|
|
48
|
+
return failedReplay(started, `invalid replay trace: ${message}`);
|
|
49
|
+
}
|
|
50
|
+
if (!isAgentTrace(parsed)) {
|
|
51
|
+
return failedReplay(started, "invalid replay trace: expected messages, toolCalls, shellCommands, and artifacts");
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
host: this.host,
|
|
55
|
+
status: "completed",
|
|
56
|
+
trace: { ...parsed, raw: parsed },
|
|
57
|
+
durationMs: Math.round(performance.now() - started),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/adapters/replay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,SAAS,UAAU;IAClB,OAAO;QACN,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,EAAE;KACb,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,KAAmB,CAAC;IAClC,OAAO,CACN,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAC9B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;QAClC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,KAAK,CAAC,SAAS,KAAK,IAAI;QACxB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAC/B,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,KAAa;IACnD,OAAO;QACN,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,UAAU,EAAE;QACnB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QACnD,KAAK;KACL,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,OAAO,aAAa;IAChB,IAAI,GAAG,QAAiB,CAAC;IAElC,KAAK,CAAC,GAAG,CAAC,OAAwB;QACjC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC,OAAO,EAAE,sCAAsC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QAC3D,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;YACvF,OAAO,YAAY,CAAC,OAAO,EAAE,yBAAyB,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,YAAY,CAClB,OAAO,EACP,kFAAkF,CAClF,CAAC;QACH,CAAC;QAED,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;YACjC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;SACnD,CAAC;IACH,CAAC;CACD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { AgentMessage, AgentToolCall, AgentTrace } from "./types";
|
|
2
|
+
/** Collect git diff after a live agent run. */
|
|
3
|
+
export declare function captureGitDiff(cwd: string): Promise<string | undefined>;
|
|
4
|
+
/** Extract shell commands from structured tool call args (Cursor SDK shell tools). */
|
|
5
|
+
export declare function extractShellCommandsFromToolCalls(toolCalls: AgentToolCall[]): string[];
|
|
6
|
+
/** Collapse whitespace so SDK token-chunked assistant prose still matches rubric patterns. */
|
|
7
|
+
export declare function collapseTraceWhitespace(text: string): string;
|
|
8
|
+
/** Infer skill folder names from Read tool paths in tool calls. */
|
|
9
|
+
export declare function extractSkillsInvokedFromToolCalls(toolCalls: AgentToolCall[]): string[];
|
|
10
|
+
/** Infer skill reads referenced in assistant prose. */
|
|
11
|
+
export declare function extractSkillsInvokedFromText(...chunks: string[]): string[];
|
|
12
|
+
/** Infer explicit skill sessions when SKILL.md is already in preamble (full catalog mode). */
|
|
13
|
+
export declare function extractSkillsAppliedFromText(...chunks: string[]): string[];
|
|
14
|
+
/** Infer code-review depth from synthesis status line (`Review · staged · Standard`). */
|
|
15
|
+
export declare function inferReviewDepthFromText(text: string): "quick" | "standard" | "thorough" | "full" | undefined;
|
|
16
|
+
export declare function mergeSkillsInvoked(...lists: Array<string[] | undefined>): string[];
|
|
17
|
+
/** Pull shell-like commands from assistant prose and tool output. */
|
|
18
|
+
export declare function extractShellCommands(...chunks: string[]): string[];
|
|
19
|
+
/** Infer routing metadata from live agent prose when not structured. */
|
|
20
|
+
/** Assistant prose before the first tool call (SDK order, or replay messages[]). */
|
|
21
|
+
export declare function assistantPrefixBeforeTools(trace: AgentTrace): string;
|
|
22
|
+
export declare function inferRoutingFromText(text: string): AgentTrace["routing"] | undefined;
|
|
23
|
+
export declare function inferPrBodyFromText(text: string): string | undefined;
|
|
24
|
+
/** Hands-off: ## Routing block appears in assistant text before the first tool call. */
|
|
25
|
+
export declare function routingBlockBeforeTools(trace: AgentTrace): boolean;
|
|
26
|
+
/** Hands-on: tier announce appears in assistant text before the first tool call. */
|
|
27
|
+
export declare function handsOnTierBeforeTools(trace: AgentTrace, tier: NonNullable<AgentTrace["routing"]>["tier"]): boolean;
|
|
28
|
+
export interface SdkTextBlock {
|
|
29
|
+
type: string;
|
|
30
|
+
text?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface SdkToolPayload {
|
|
33
|
+
name?: string;
|
|
34
|
+
input?: unknown;
|
|
35
|
+
output?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface SdkMessage {
|
|
38
|
+
type?: string;
|
|
39
|
+
/** Cursor SDK tool_call — tool name at event root (read, shell, edit, …). */
|
|
40
|
+
name?: string;
|
|
41
|
+
args?: Record<string, unknown>;
|
|
42
|
+
message?: {
|
|
43
|
+
role?: string;
|
|
44
|
+
content?: SdkTextBlock[];
|
|
45
|
+
};
|
|
46
|
+
tool?: SdkToolPayload;
|
|
47
|
+
}
|
|
48
|
+
export interface TraceAccumulator {
|
|
49
|
+
agentMessages: AgentMessage[];
|
|
50
|
+
inferenceChunks: string[];
|
|
51
|
+
textChunks: string[];
|
|
52
|
+
toolOutputChunks: string[];
|
|
53
|
+
toolCalls: AgentToolCall[];
|
|
54
|
+
preToolAssistantChunks: string[];
|
|
55
|
+
hasSeenTool: boolean;
|
|
56
|
+
}
|
|
57
|
+
export declare function createTraceAccumulator(): TraceAccumulator;
|
|
58
|
+
/** Fold one SDK stream event into trace fields without retaining the raw event. */
|
|
59
|
+
export declare function accumulateSdkEvent(acc: TraceAccumulator, event: SdkMessage): void;
|
|
60
|
+
export declare function finalizeTraceAccumulator(acc: TraceAccumulator, options?: {
|
|
61
|
+
gitDiff?: string;
|
|
62
|
+
}): AgentTrace;
|
|
63
|
+
/** Normalize Cursor SDK messages into AgentTrace fields. */
|
|
64
|
+
export declare function buildTraceFromSdkMessages(messages: SdkMessage[], options?: {
|
|
65
|
+
gitDiff?: string;
|
|
66
|
+
}): AgentTrace;
|
|
67
|
+
/** Fill routing / PR body from transcript when live runs omit structured fields. */
|
|
68
|
+
export declare function enrichTrace(trace: AgentTrace): AgentTrace;
|
|
69
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
|
package/dist/capture.js
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { textBlocksFromSdkMessage } from "./cursor-run";
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
const SHELL_COMMAND_PATTERN = /\b(bun run [\w:./-]+|validate:changed[\w ./:-]*|bunx [\w ./:-]+)/gi;
|
|
6
|
+
const TIER_PATTERN = /\*\*Tier:\*\*\s*(low|medium|high)\b/i;
|
|
7
|
+
const TIER_INLINE_PATTERN = /\bTier:\s*(low|medium|high)\b/i;
|
|
8
|
+
/** Hands-on one-line announce: "Medium — fuzzy intent" (em/en dash only, not hyphenated words) */
|
|
9
|
+
const TIER_LEADING_WORD_PATTERN = /\b(Low|Medium|High)\s*[—–]/i;
|
|
10
|
+
/** Hands-on inline: "**Routing:** Medium", "Routing: Medium", "Routing: **Low**" */
|
|
11
|
+
const ROUTING_LABEL_TIER_PATTERN = /\*\*Routing:\*\*\s*(?:\*\*)?(Low|Medium|High)\b|\bRouting:\s*(?:\*\*)?(Low|Medium|High)\b/i;
|
|
12
|
+
const HANDS_ON_TIER_PATTERNS = [
|
|
13
|
+
TIER_PATTERN,
|
|
14
|
+
TIER_INLINE_PATTERN,
|
|
15
|
+
TIER_LEADING_WORD_PATTERN,
|
|
16
|
+
ROUTING_LABEL_TIER_PATTERN,
|
|
17
|
+
];
|
|
18
|
+
function tierFromMatch(match) {
|
|
19
|
+
const raw = match[1] ?? match[2];
|
|
20
|
+
const tier = raw?.toLowerCase();
|
|
21
|
+
if (tier === "low" || tier === "medium" || tier === "high") {
|
|
22
|
+
return tier;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
/** Collect git diff after a live agent run. */
|
|
27
|
+
export async function captureGitDiff(cwd) {
|
|
28
|
+
try {
|
|
29
|
+
const { stdout } = await execFileAsync("git", ["diff", "HEAD"], { cwd, maxBuffer: 10_000_000 });
|
|
30
|
+
const trimmed = stdout.trim();
|
|
31
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Extract shell commands from structured tool call args (Cursor SDK shell tools). */
|
|
38
|
+
export function extractShellCommandsFromToolCalls(toolCalls) {
|
|
39
|
+
const commands = new Set();
|
|
40
|
+
for (const call of toolCalls) {
|
|
41
|
+
if (!call.args) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const candidates = [call.args.command, call.args.cmd, call.args.script, call.args.input];
|
|
45
|
+
for (const raw of candidates) {
|
|
46
|
+
if (typeof raw !== "string") {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
for (const cmd of extractShellCommands(raw)) {
|
|
50
|
+
commands.add(cmd);
|
|
51
|
+
}
|
|
52
|
+
if (raw.includes("validate:changed") || raw.startsWith("bun run")) {
|
|
53
|
+
commands.add(raw.trim());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return [...commands];
|
|
58
|
+
}
|
|
59
|
+
const SKILL_WORKFLOW_PATH_PATTERN = /\.claude\/skills\/([^/]+)\/(?:SKILL\.md|references\/)/i;
|
|
60
|
+
const APPLIED_SKILL_GENERIC_PATTERNS = [
|
|
61
|
+
/\b(?:invok(?:e|ing)|following|using|per|walk(?:ing)?)\s+(?:the\s+)?([a-z][a-z0-9-]*)\s+(?:skill|protocol|design tree)\b/gi,
|
|
62
|
+
/\*\*([a-z][a-z0-9-]*)\*\*\s*(?:skill|protocol)?/gi,
|
|
63
|
+
];
|
|
64
|
+
const APPLIED_SKILL_MARKERS = [
|
|
65
|
+
{ skill: "grill", pattern: /\bgrill\s+before\s+implement/i },
|
|
66
|
+
{ skill: "grill", pattern: /\b(?:invok(?:e|ing)|applied)\s+grill\b/i },
|
|
67
|
+
{ skill: "grill", pattern: /\bgrill\b/i },
|
|
68
|
+
{ skill: "grill", pattern: /\bpressure-test(?:ing)?\b/i },
|
|
69
|
+
{ skill: "grill", pattern: /(?:^|\n)\s*\d+\.\s+.+(?:\n\s*\d+\.\s+.+)+/m },
|
|
70
|
+
{ skill: "grill", pattern: /\b\d+\.\s+\S+(?:\s+\d+\.\s+\S+)+\b/ },
|
|
71
|
+
{ skill: "crystallize", pattern: /\b(?:invok(?:e|ing)|applied)\s+crystallize\b/i },
|
|
72
|
+
{ skill: "crystallize", pattern: /\bcrystalliz(?:e|ing|ation)\b/i },
|
|
73
|
+
{ skill: "crystallize", pattern: /\bhalf-formed\b/i },
|
|
74
|
+
{ skill: "crystallize", pattern: /\bfuzzy\s+intent\b/i },
|
|
75
|
+
{ skill: "crystallize", pattern: /\bmirror(?:ed|ing)?\s+(?:the\s+)?(?:fuzzy\s+)?intent\b/i },
|
|
76
|
+
{ skill: "crystallize", pattern: /\bmight be assuming\b/i },
|
|
77
|
+
{ skill: "code-review", pattern: /\b(?:invok(?:e|ing)|applied)\s+code-review\b/i },
|
|
78
|
+
{
|
|
79
|
+
skill: "code-review",
|
|
80
|
+
pattern: /\bReview\s·\s*[^·]+\s·\s*(?:Quick|Standard|Thorough|Full)\b/i,
|
|
81
|
+
},
|
|
82
|
+
{ skill: "code-review", pattern: /## Review synthesis/i },
|
|
83
|
+
];
|
|
84
|
+
const REVIEW_HEADER_DEPTH_PATTERN = /\bReview\s·\s*[^·]+\s·\s*(Quick|Standard|Thorough|Full)\b/i;
|
|
85
|
+
const REVIEW_DEPTH_LABEL_PATTERN = /\*\*Depth:\*\*\s*(quick|standard|thorough|full)\b/i;
|
|
86
|
+
/** Collapse whitespace so SDK token-chunked assistant prose still matches rubric patterns. */
|
|
87
|
+
export function collapseTraceWhitespace(text) {
|
|
88
|
+
return text.replace(/\s+/g, " ");
|
|
89
|
+
}
|
|
90
|
+
function pathsFromToolArgs(args) {
|
|
91
|
+
const paths = [];
|
|
92
|
+
for (const key of ["path", "file_path", "filePath", "target_file", "uri"]) {
|
|
93
|
+
const value = args[key];
|
|
94
|
+
if (typeof value === "string") {
|
|
95
|
+
paths.push(value);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return paths;
|
|
99
|
+
}
|
|
100
|
+
function skillNameFromPath(path) {
|
|
101
|
+
const match = path.match(SKILL_WORKFLOW_PATH_PATTERN);
|
|
102
|
+
return match?.[1]?.toLowerCase();
|
|
103
|
+
}
|
|
104
|
+
/** Infer skill folder names from Read tool paths in tool calls. */
|
|
105
|
+
export function extractSkillsInvokedFromToolCalls(toolCalls) {
|
|
106
|
+
const skills = new Set();
|
|
107
|
+
for (const call of toolCalls) {
|
|
108
|
+
if (!call.args) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
for (const path of pathsFromToolArgs(call.args)) {
|
|
112
|
+
const name = skillNameFromPath(path);
|
|
113
|
+
if (name) {
|
|
114
|
+
skills.add(name);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const serialized = JSON.stringify(call.args);
|
|
118
|
+
for (const match of serialized.matchAll(/\.claude\/skills\/([^/]+)\/SKILL\.md/gi)) {
|
|
119
|
+
const name = match[1]?.toLowerCase();
|
|
120
|
+
if (name) {
|
|
121
|
+
skills.add(name);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return [...skills];
|
|
126
|
+
}
|
|
127
|
+
/** Infer skill reads referenced in assistant prose. */
|
|
128
|
+
export function extractSkillsInvokedFromText(...chunks) {
|
|
129
|
+
const skills = new Set();
|
|
130
|
+
for (const chunk of chunks) {
|
|
131
|
+
for (const match of chunk.matchAll(/\.claude\/skills\/([^/]+)\/SKILL\.md/gi)) {
|
|
132
|
+
const name = match[1]?.toLowerCase();
|
|
133
|
+
if (name) {
|
|
134
|
+
skills.add(name);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return [...skills];
|
|
139
|
+
}
|
|
140
|
+
/** Infer explicit skill sessions when SKILL.md is already in preamble (full catalog mode). */
|
|
141
|
+
export function extractSkillsAppliedFromText(...chunks) {
|
|
142
|
+
const skills = new Set();
|
|
143
|
+
const combined = collapseTraceWhitespace(chunks.join("\n"));
|
|
144
|
+
const genericPatterns = APPLIED_SKILL_GENERIC_PATTERNS;
|
|
145
|
+
for (const pattern of genericPatterns) {
|
|
146
|
+
for (const match of combined.matchAll(pattern)) {
|
|
147
|
+
const name = match[1]?.toLowerCase();
|
|
148
|
+
if (name) {
|
|
149
|
+
skills.add(name);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
for (const { skill, pattern } of APPLIED_SKILL_MARKERS) {
|
|
154
|
+
if (pattern.test(combined)) {
|
|
155
|
+
skills.add(skill);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return [...skills];
|
|
159
|
+
}
|
|
160
|
+
/** Infer code-review depth from synthesis status line (`Review · staged · Standard`). */
|
|
161
|
+
export function inferReviewDepthFromText(text) {
|
|
162
|
+
const collapsed = collapseTraceWhitespace(text);
|
|
163
|
+
const headerMatch = collapsed.match(REVIEW_HEADER_DEPTH_PATTERN);
|
|
164
|
+
if (headerMatch?.[1]) {
|
|
165
|
+
return headerMatch[1].toLowerCase();
|
|
166
|
+
}
|
|
167
|
+
const depthMatch = collapsed.match(REVIEW_DEPTH_LABEL_PATTERN);
|
|
168
|
+
return depthMatch?.[1]?.toLowerCase();
|
|
169
|
+
}
|
|
170
|
+
export function mergeSkillsInvoked(...lists) {
|
|
171
|
+
return [...new Set(lists.flatMap((list) => list ?? []))];
|
|
172
|
+
}
|
|
173
|
+
/** Pull shell-like commands from assistant prose and tool output. */
|
|
174
|
+
export function extractShellCommands(...chunks) {
|
|
175
|
+
const commands = new Set();
|
|
176
|
+
for (const chunk of chunks) {
|
|
177
|
+
for (const match of chunk.matchAll(SHELL_COMMAND_PATTERN)) {
|
|
178
|
+
const cmd = match[0]?.trim();
|
|
179
|
+
if (cmd) {
|
|
180
|
+
commands.add(cmd);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return [...commands];
|
|
185
|
+
}
|
|
186
|
+
/** Infer routing metadata from live agent prose when not structured. */
|
|
187
|
+
/** Assistant prose before the first tool call (SDK order, or replay messages[]). */
|
|
188
|
+
export function assistantPrefixBeforeTools(trace) {
|
|
189
|
+
if (trace.assistantTextBeforeTools !== undefined) {
|
|
190
|
+
return trace.assistantTextBeforeTools;
|
|
191
|
+
}
|
|
192
|
+
return trace.messages
|
|
193
|
+
.filter((message) => message.role === "assistant")
|
|
194
|
+
.map((message) => message.content)
|
|
195
|
+
.join("");
|
|
196
|
+
}
|
|
197
|
+
export function inferRoutingFromText(text) {
|
|
198
|
+
const collapsed = collapseTraceWhitespace(text);
|
|
199
|
+
for (const pattern of HANDS_ON_TIER_PATTERNS) {
|
|
200
|
+
const tierMatch = collapsed.match(pattern);
|
|
201
|
+
if (!tierMatch) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const tier = tierFromMatch(tierMatch);
|
|
205
|
+
if (tier) {
|
|
206
|
+
return { tier, signals: ["inferred from live transcript"] };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
export function inferPrBodyFromText(text) {
|
|
212
|
+
const routingIndex = text.indexOf("## Routing");
|
|
213
|
+
if (routingIndex === -1) {
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
return text.slice(routingIndex).trim();
|
|
217
|
+
}
|
|
218
|
+
const ROUTING_HEADING_BEFORE_TOOLS = /(?:^|\n)#+\s*Routing\b/m;
|
|
219
|
+
const ROUTING_BOLD_PATTERN = /\*\*Routing\*\*/;
|
|
220
|
+
/** Hands-off: ## Routing block appears in assistant text before the first tool call. */
|
|
221
|
+
export function routingBlockBeforeTools(trace) {
|
|
222
|
+
const prefix = assistantPrefixBeforeTools(trace);
|
|
223
|
+
if (trace.toolCalls.length === 0) {
|
|
224
|
+
return toIncludeRoutingBlockText(`${prefix}\n${trace.prBody ?? ""}`);
|
|
225
|
+
}
|
|
226
|
+
return toIncludeRoutingBlockText(prefix);
|
|
227
|
+
}
|
|
228
|
+
function toIncludeRoutingBlockText(text) {
|
|
229
|
+
const collapsed = collapseTraceWhitespace(text);
|
|
230
|
+
return (text.includes("## Routing") ||
|
|
231
|
+
ROUTING_HEADING_BEFORE_TOOLS.test(text) ||
|
|
232
|
+
ROUTING_BOLD_PATTERN.test(collapsed));
|
|
233
|
+
}
|
|
234
|
+
/** Hands-on: tier announce appears in assistant text before the first tool call. */
|
|
235
|
+
export function handsOnTierBeforeTools(trace, tier) {
|
|
236
|
+
return inferRoutingFromText(assistantPrefixBeforeTools(trace))?.tier === tier;
|
|
237
|
+
}
|
|
238
|
+
function isToolRelatedEvent(event) {
|
|
239
|
+
const type = event.type ?? "";
|
|
240
|
+
return type.includes("tool") || Boolean(event.tool);
|
|
241
|
+
}
|
|
242
|
+
function toolCallFromEvent(event) {
|
|
243
|
+
if (event.type === "tool_call" && event.name) {
|
|
244
|
+
return { name: event.name, args: event.args };
|
|
245
|
+
}
|
|
246
|
+
const name = event.tool?.name ?? (event.type?.includes("tool") ? event.type : undefined);
|
|
247
|
+
if (!name) {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
let args;
|
|
251
|
+
if (event.tool?.input !== undefined && typeof event.tool.input === "object") {
|
|
252
|
+
args = event.tool.input;
|
|
253
|
+
}
|
|
254
|
+
else if (typeof event.tool?.input === "string") {
|
|
255
|
+
try {
|
|
256
|
+
const parsed = JSON.parse(event.tool.input);
|
|
257
|
+
if (parsed && typeof parsed === "object") {
|
|
258
|
+
args = parsed;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
args = { command: event.tool.input };
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return { name, args };
|
|
266
|
+
}
|
|
267
|
+
export function createTraceAccumulator() {
|
|
268
|
+
return {
|
|
269
|
+
agentMessages: [],
|
|
270
|
+
inferenceChunks: [],
|
|
271
|
+
textChunks: [],
|
|
272
|
+
toolOutputChunks: [],
|
|
273
|
+
toolCalls: [],
|
|
274
|
+
preToolAssistantChunks: [],
|
|
275
|
+
hasSeenTool: false,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
/** Fold one SDK stream event into trace fields without retaining the raw event. */
|
|
279
|
+
export function accumulateSdkEvent(acc, event) {
|
|
280
|
+
const text = textBlocksFromSdkMessage(event);
|
|
281
|
+
if (text) {
|
|
282
|
+
acc.inferenceChunks.push(text);
|
|
283
|
+
}
|
|
284
|
+
if (event.type === "assistant" || event.message?.role === "assistant") {
|
|
285
|
+
if (text) {
|
|
286
|
+
acc.agentMessages.push({ role: "assistant", content: text });
|
|
287
|
+
acc.textChunks.push(text);
|
|
288
|
+
if (!acc.hasSeenTool) {
|
|
289
|
+
acc.preToolAssistantChunks.push(text);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (isToolRelatedEvent(event)) {
|
|
295
|
+
if (text) {
|
|
296
|
+
acc.toolOutputChunks.push(text);
|
|
297
|
+
}
|
|
298
|
+
const toolCall = toolCallFromEvent(event);
|
|
299
|
+
if (toolCall) {
|
|
300
|
+
acc.hasSeenTool = true;
|
|
301
|
+
acc.toolCalls.push(toolCall);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
export function finalizeTraceAccumulator(acc, options) {
|
|
306
|
+
const combined = [
|
|
307
|
+
...new Set([...acc.inferenceChunks, ...acc.textChunks, ...acc.toolOutputChunks]),
|
|
308
|
+
].join("\n");
|
|
309
|
+
const routing = inferRoutingFromText(combined);
|
|
310
|
+
const prBody = inferPrBodyFromText(combined);
|
|
311
|
+
const shellFromText = extractShellCommands(combined, ...acc.toolOutputChunks);
|
|
312
|
+
const shellFromTools = extractShellCommandsFromToolCalls(acc.toolCalls);
|
|
313
|
+
const skillsInvoked = mergeSkillsInvoked(extractSkillsInvokedFromToolCalls(acc.toolCalls), extractSkillsInvokedFromText(combined), extractSkillsAppliedFromText(combined));
|
|
314
|
+
return {
|
|
315
|
+
messages: acc.agentMessages,
|
|
316
|
+
toolCalls: acc.toolCalls,
|
|
317
|
+
shellCommands: [...new Set([...shellFromText, ...shellFromTools])],
|
|
318
|
+
skillsInvoked,
|
|
319
|
+
gitDiff: options?.gitDiff,
|
|
320
|
+
prBody,
|
|
321
|
+
artifacts: {},
|
|
322
|
+
routing,
|
|
323
|
+
assistantTextBeforeTools: acc.preToolAssistantChunks.join(""),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/** Normalize Cursor SDK messages into AgentTrace fields. */
|
|
327
|
+
export function buildTraceFromSdkMessages(messages, options) {
|
|
328
|
+
const acc = createTraceAccumulator();
|
|
329
|
+
for (const event of messages) {
|
|
330
|
+
accumulateSdkEvent(acc, event);
|
|
331
|
+
}
|
|
332
|
+
return finalizeTraceAccumulator(acc, options);
|
|
333
|
+
}
|
|
334
|
+
/** Fill routing / PR body from transcript when live runs omit structured fields. */
|
|
335
|
+
export function enrichTrace(trace) {
|
|
336
|
+
const combined = [...trace.messages.map((m) => m.content), trace.prBody ?? ""].join("\n");
|
|
337
|
+
return {
|
|
338
|
+
...trace,
|
|
339
|
+
routing: trace.routing ?? inferRoutingFromText(combined),
|
|
340
|
+
prBody: trace.prBody ?? inferPrBodyFromText(combined),
|
|
341
|
+
skillsInvoked: mergeSkillsInvoked(trace.skillsInvoked, extractSkillsInvokedFromToolCalls(trace.toolCalls), extractSkillsInvokedFromText(combined), extractSkillsAppliedFromText(combined)),
|
|
342
|
+
shellCommands: trace.shellCommands.length > 0
|
|
343
|
+
? trace.shellCommands
|
|
344
|
+
: [
|
|
345
|
+
...new Set([
|
|
346
|
+
...extractShellCommands(combined, trace.gitDiff ?? ""),
|
|
347
|
+
...extractShellCommandsFromToolCalls(trace.toolCalls),
|
|
348
|
+
]),
|
|
349
|
+
],
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type SkillContextSetting } from "./skills-context";
|
|
2
|
+
import type { ContextProfile, LoadedContext } from "./types";
|
|
3
|
+
export interface LoadContextOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
profile?: ContextProfile;
|
|
6
|
+
/** none | catalog (index) | full (catalog + all SKILL.md bodies). */
|
|
7
|
+
skills?: SkillContextSetting;
|
|
8
|
+
}
|
|
9
|
+
/** Load canonical agent context files from the repo. */
|
|
10
|
+
export declare function loadContext(options: LoadContextOptions): Promise<LoadedContext>;
|
|
11
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAmD7D,MAAM,WAAW,kBAAkB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,qEAAqE;IACrE,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,wDAAwD;AACxD,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAgDrF"}
|