@post-print/agent-harness 0.1.15 → 0.1.18
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 +2 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/routing-contract.d.ts.map +1 -1
- package/dist/routing-contract.js +2 -0
- package/dist/routing-contract.js.map +1 -1
- package/dist/working-tree-guard.d.ts +11 -0
- package/dist/working-tree-guard.d.ts.map +1 -1
- package/dist/working-tree-guard.js +65 -0
- package/dist/working-tree-guard.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,4 +28,6 @@ const session = await runAgent({
|
|
|
28
28
|
|
|
29
29
|
Live Cursor runs accept inline `mcpServers` (stdio or HTTP/SSE), passed through to `Agent.create`. Replay ignores them and scores committed `toolCalls` only. Ambient MCP via `local.settingSources` is not enabled.
|
|
30
30
|
|
|
31
|
+
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).
|
|
32
|
+
|
|
31
33
|
Consumer: `@post-print/agent-test`.
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export { buildRoutingContract } from "./routing-contract.js";
|
|
|
12
12
|
export { AgentRunTimeoutError, isUserInputTool, type RunTimeoutOptions, traceHasUserInputTool, UserInputRequiredError, withRunTimeout, } from "./run-guards.js";
|
|
13
13
|
export { loadSkillContext, normalizeSkillContext, type SkillCatalogEntry, } from "./skills-context.js";
|
|
14
14
|
export type { AgentHost, AgentMessage, AgentSession, AgentToolCall, AgentTrace, ContextProfile, HostAdapter, LoadedContext, McpServerConfig, RoutingContract, RunAgentOptions, RunStatus, SkillContextMode, SkillContextOptions, SkillContextSetting, } from "./types.js";
|
|
15
|
-
export { captureWorkingTreeStatus, findWorkingTreeLeak, formatWorkingTreeLeak, } from "./working-tree-guard.js";
|
|
15
|
+
export { captureWorkingTreeStatus, filterWorkingTreeLeaks, findWorkingTreeLeak, formatWorkingTreeLeak, isPathUnderRoot, porcelainPathFromStatusLine, resolveHarnessArtifactIgnoreRoots, } from "./working-tree-guard.js";
|
|
16
16
|
export { cleanupStaleScenarioWorktrees, createScenarioWorktree, SCENARIO_WORKTREE_DIR_PREFIX, type ScenarioWorktree, } from "./worktree.js";
|
|
17
17
|
export { type LoadContextOptions, loadContext };
|
|
18
18
|
export interface RunAgentInput extends Omit<RunAgentOptions, "context"> {
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,EACN,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,GACb,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACN,0BAA0B,EAC1B,yBAAyB,EACzB,cAAc,EACd,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,iCAAiC,EACjC,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,cAAc,EACd,kBAAkB,EAClB,wBAAwB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,UAAU,EACV,KAAK,eAAe,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACN,eAAe,EACf,iBAAiB,EACjB,KAAK,YAAY,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,iBAAiB,GACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,KAAK,iBAAiB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,iBAAiB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,EACN,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,GACb,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACN,0BAA0B,EAC1B,yBAAyB,EACzB,cAAc,EACd,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,iCAAiC,EACjC,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,cAAc,EACd,kBAAkB,EAClB,wBAAwB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,UAAU,EACV,KAAK,eAAe,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACN,eAAe,EACf,iBAAiB,EACjB,KAAK,YAAY,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,iBAAiB,GACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,KAAK,iBAAiB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,iBAAiB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,2BAA2B,EAC3B,iCAAiC,GACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,6BAA6B,EAC7B,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,gBAAgB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,CAAC;AAEhD,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;IACtE,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,0DAA0D;AAC1D,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAK1E"}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ export { expandEnvPlaceholders, mergeMcpServers, resolveMcpServers, } from "./mc
|
|
|
10
10
|
export { buildRoutingContract } from "./routing-contract.js";
|
|
11
11
|
export { AgentRunTimeoutError, isUserInputTool, traceHasUserInputTool, UserInputRequiredError, withRunTimeout, } from "./run-guards.js";
|
|
12
12
|
export { loadSkillContext, normalizeSkillContext, } from "./skills-context.js";
|
|
13
|
-
export { captureWorkingTreeStatus, findWorkingTreeLeak, formatWorkingTreeLeak, } from "./working-tree-guard.js";
|
|
13
|
+
export { captureWorkingTreeStatus, filterWorkingTreeLeaks, findWorkingTreeLeak, formatWorkingTreeLeak, isPathUnderRoot, porcelainPathFromStatusLine, resolveHarnessArtifactIgnoreRoots, } from "./working-tree-guard.js";
|
|
14
14
|
export { cleanupStaleScenarioWorktrees, createScenarioWorktree, SCENARIO_WORKTREE_DIR_PREFIX, } from "./worktree.js";
|
|
15
15
|
export { loadContext };
|
|
16
16
|
/** Run an agent session via the selected host adapter. */
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAA2B,WAAW,EAAE,MAAM,cAAc,CAAC;AAGpE,OAAO,EACN,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,0BAA0B,EAC1B,yBAAyB,EACzB,cAAc,EACd,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,iCAAiC,EACjC,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,4BAA4B,EAM5B,cAAc,EACd,kBAAkB,EAClB,wBAAwB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAKN,UAAU,EAEV,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAA8B,MAAM,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACN,eAAe,EACf,iBAAiB,GAEjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,iBAAiB,GACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACN,oBAAoB,EACpB,eAAe,EAEf,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,gBAAgB,EAChB,qBAAqB,GAErB,MAAM,qBAAqB,CAAC;AAkB7B,OAAO,EACN,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAA2B,WAAW,EAAE,MAAM,cAAc,CAAC;AAGpE,OAAO,EACN,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,0BAA0B,EAC1B,yBAAyB,EACzB,cAAc,EACd,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,iCAAiC,EACjC,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,4BAA4B,EAM5B,cAAc,EACd,kBAAkB,EAClB,wBAAwB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAKN,UAAU,EAEV,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAA8B,MAAM,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACN,eAAe,EACf,iBAAiB,GAEjB,MAAM,WAAW,CAAC;AACnB,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,iBAAiB,GACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACN,oBAAoB,EACpB,eAAe,EAEf,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,gBAAgB,EAChB,qBAAqB,GAErB,MAAM,qBAAqB,CAAC;AAkB7B,OAAO,EACN,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,2BAA2B,EAC3B,iCAAiC,GACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACN,6BAA6B,EAC7B,sBAAsB,EACtB,4BAA4B,GAE5B,MAAM,eAAe,CAAC;AACvB,OAAO,EAA2B,WAAW,EAAE,CAAC;AAOhD,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAoB;IAClD,MAAM,OAAO,GACZ,KAAK,CAAC,OAAO,IAAI,CAAC,MAAM,WAAW,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-contract.d.ts","sourceRoot":"","sources":["../src/routing-contract.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,CAAC;AAEvD,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"routing-contract.d.ts","sourceRoot":"","sources":["../src/routing-contract.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,CAAC;AAEvD,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAsBlE"}
|
package/dist/routing-contract.js
CHANGED
|
@@ -11,12 +11,14 @@ export function buildRoutingContract(mode) {
|
|
|
11
11
|
"- **Escalations:** none | …",
|
|
12
12
|
"- **Open questions:** none | …",
|
|
13
13
|
"Do not call tools or write planning text until this block is complete.",
|
|
14
|
+
"After the Routing block, continue the task with tools and the deliverable — do not end the turn at the announce.",
|
|
14
15
|
].join("\n");
|
|
15
16
|
}
|
|
16
17
|
return [
|
|
17
18
|
"Output contract (before any tools or edits):",
|
|
18
19
|
"Announce routing per agent-routing.md hands-on rule — one line with tier, e.g.:",
|
|
19
20
|
" Tier: low — … OR Medium — … OR Routing: Medium — …",
|
|
21
|
+
"After the announce line, continue the task with tools — do not end the turn at the announce.",
|
|
20
22
|
].join("\n");
|
|
21
23
|
}
|
|
22
24
|
//# sourceMappingURL=routing-contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-contract.js","sourceRoot":"","sources":["../src/routing-contract.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,MAAM,UAAU,oBAAoB,CAAC,IAAqB;IACzD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO;YACN,uFAAuF;YACvF,yEAAyE;YACzE,YAAY;YACZ,iCAAiC;YACjC,kBAAkB;YAClB,4BAA4B;YAC5B,6BAA6B;YAC7B,gCAAgC;YAChC,wEAAwE;
|
|
1
|
+
{"version":3,"file":"routing-contract.js","sourceRoot":"","sources":["../src/routing-contract.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,MAAM,UAAU,oBAAoB,CAAC,IAAqB;IACzD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAC1B,OAAO;YACN,uFAAuF;YACvF,yEAAyE;YACzE,YAAY;YACZ,iCAAiC;YACjC,kBAAkB;YAClB,4BAA4B;YAC5B,6BAA6B;YAC7B,gCAAgC;YAChC,wEAAwE;YACxE,kHAAkH;SAClH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAED,OAAO;QACN,8CAA8C;QAC9C,iFAAiF;QACjF,8DAA8D;QAC9D,8FAA8F;KAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -2,5 +2,16 @@
|
|
|
2
2
|
export declare function captureWorkingTreeStatus(repoRoot: string): Promise<string>;
|
|
3
3
|
/** Lines present after a scenario that were not in the before snapshot. */
|
|
4
4
|
export declare function findWorkingTreeLeak(before: string, after: string): string[];
|
|
5
|
+
/** Extract the path portion from a git status --porcelain line. */
|
|
6
|
+
export declare function porcelainPathFromStatusLine(line: string): string;
|
|
7
|
+
/** True when `target` is the same as or nested under `root`. */
|
|
8
|
+
export declare function isPathUnderRoot(target: string, root: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Staging/debug parent dirs under the caller repo that the harness writes during live runs.
|
|
11
|
+
* These are excluded from worktree leak detection (they are runner artifacts, not agent edits).
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveHarnessArtifactIgnoreRoots(repoRoot: string, debugDirOverride?: string): string[];
|
|
14
|
+
/** Drop leak lines whose porcelain path sits under ignored harness artifact roots. */
|
|
15
|
+
export declare function filterWorkingTreeLeaks(leaked: string[], ignoreRoots: string[], repoRoot: string): string[];
|
|
5
16
|
export declare function formatWorkingTreeLeak(lines: string[]): string;
|
|
6
17
|
//# sourceMappingURL=working-tree-guard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-tree-guard.d.ts","sourceRoot":"","sources":["../src/working-tree-guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"working-tree-guard.d.ts","sourceRoot":"","sources":["../src/working-tree-guard.ts"],"names":[],"mappings":"AAMA,oFAAoF;AACpF,wBAAsB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhF;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAM3E;AAED,mEAAmE;AACnE,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAShE;AAoBD,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKrE;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAChD,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,MAAM,GACvB,MAAM,EAAE,CASV;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,EAAE,MAAM,GACd,MAAM,EAAE,CAaV;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAE7D"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
|
+
import { resolve, sep } from "node:path";
|
|
2
3
|
import { promisify } from "node:util";
|
|
3
4
|
const execFileAsync = promisify(execFile);
|
|
4
5
|
/** Porcelain snapshot of the caller repo root — used to detect live-run leakage. */
|
|
@@ -14,6 +15,70 @@ export function findWorkingTreeLeak(before, after) {
|
|
|
14
15
|
.filter(Boolean)
|
|
15
16
|
.filter((line) => !beforeLines.has(line));
|
|
16
17
|
}
|
|
18
|
+
/** Extract the path portion from a git status --porcelain line. */
|
|
19
|
+
export function porcelainPathFromStatusLine(line) {
|
|
20
|
+
const payload = line.slice(3).trim();
|
|
21
|
+
if (!payload) {
|
|
22
|
+
return "";
|
|
23
|
+
}
|
|
24
|
+
const renameArrow = " -> ";
|
|
25
|
+
const arrowIndex = payload.indexOf(renameArrow);
|
|
26
|
+
const pathToken = arrowIndex === -1 ? payload : payload.slice(arrowIndex + renameArrow.length);
|
|
27
|
+
return unquoteGitPath(pathToken.trim());
|
|
28
|
+
}
|
|
29
|
+
function unquoteGitPath(token) {
|
|
30
|
+
if (token.startsWith('"') && token.endsWith('"')) {
|
|
31
|
+
return token.slice(1, -1).replace(/\\(["\\nrt])/g, (_match, ch) => {
|
|
32
|
+
switch (ch) {
|
|
33
|
+
case "n":
|
|
34
|
+
return "\n";
|
|
35
|
+
case "r":
|
|
36
|
+
return "\r";
|
|
37
|
+
case "t":
|
|
38
|
+
return "\t";
|
|
39
|
+
default:
|
|
40
|
+
return ch;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return token;
|
|
45
|
+
}
|
|
46
|
+
/** True when `target` is the same as or nested under `root`. */
|
|
47
|
+
export function isPathUnderRoot(target, root) {
|
|
48
|
+
const absTarget = resolve(target);
|
|
49
|
+
const absRoot = resolve(root);
|
|
50
|
+
const prefix = absRoot.endsWith(sep) ? absRoot : `${absRoot}${sep}`;
|
|
51
|
+
return absTarget === absRoot || absTarget.startsWith(prefix);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Staging/debug parent dirs under the caller repo that the harness writes during live runs.
|
|
55
|
+
* These are excluded from worktree leak detection (they are runner artifacts, not agent edits).
|
|
56
|
+
*/
|
|
57
|
+
export function resolveHarnessArtifactIgnoreRoots(repoRoot, debugDirOverride) {
|
|
58
|
+
if (!debugDirOverride?.trim()) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
const debugRoot = resolve(debugDirOverride);
|
|
62
|
+
if (!isPathUnderRoot(debugRoot, resolve(repoRoot))) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
return [debugRoot];
|
|
66
|
+
}
|
|
67
|
+
/** Drop leak lines whose porcelain path sits under ignored harness artifact roots. */
|
|
68
|
+
export function filterWorkingTreeLeaks(leaked, ignoreRoots, repoRoot) {
|
|
69
|
+
if (ignoreRoots.length === 0) {
|
|
70
|
+
return leaked;
|
|
71
|
+
}
|
|
72
|
+
const resolvedRoots = ignoreRoots.map((root) => resolve(repoRoot, root));
|
|
73
|
+
return leaked.filter((line) => {
|
|
74
|
+
const path = porcelainPathFromStatusLine(line);
|
|
75
|
+
if (!path) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
const absPath = resolve(repoRoot, path);
|
|
79
|
+
return !resolvedRoots.some((root) => isPathUnderRoot(absPath, root));
|
|
80
|
+
});
|
|
81
|
+
}
|
|
17
82
|
export function formatWorkingTreeLeak(lines) {
|
|
18
83
|
return lines.join("\n");
|
|
19
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-tree-guard.js","sourceRoot":"","sources":["../src/working-tree-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,QAAgB;IAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,KAAa;IAChE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,OAAO,KAAK;SACV,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
1
|
+
{"version":3,"file":"working-tree-guard.js","sourceRoot":"","sources":["../src/working-tree-guard.ts"],"names":[],"mappings":"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"}
|