@lannguyensi/harness 0.18.0 → 0.20.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/CHANGELOG.md +47 -0
- package/README.md +82 -208
- package/dist/cli/approve/understanding.d.ts +38 -0
- package/dist/cli/approve/understanding.js +45 -1
- package/dist/cli/approve/understanding.js.map +1 -1
- package/dist/cli/doctor/format.js +20 -2
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/index.d.ts +8 -0
- package/dist/cli/doctor/index.js +27 -1
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/npm-bin-path.d.ts +23 -0
- package/dist/cli/doctor/npm-bin-path.js +82 -0
- package/dist/cli/doctor/npm-bin-path.js.map +1 -0
- package/dist/cli/doctor/types.d.ts +20 -4
- package/dist/cli/doctor/types.js.map +1 -1
- package/dist/cli/index.js +32 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/agent-tasks-auth.d.ts +32 -0
- package/dist/cli/init/agent-tasks-auth.js +75 -0
- package/dist/cli/init/agent-tasks-auth.js.map +1 -0
- package/dist/cli/init/composer.js +3 -1
- package/dist/cli/init/composer.js.map +1 -1
- package/dist/cli/init/interactive.d.ts +5 -0
- package/dist/cli/init/interactive.js +162 -4
- package/dist/cli/init/interactive.js.map +1 -1
- package/dist/cli/init/profiles.d.ts +2 -2
- package/dist/cli/init/profiles.js +23 -15
- package/dist/cli/init/profiles.js.map +1 -1
- package/dist/cli/init/templates.d.ts +1 -1
- package/dist/cli/init/templates.js +113 -10
- package/dist/cli/init/templates.js.map +1 -1
- package/dist/cli/pack/hook-branch-protection.js +52 -5
- package/dist/cli/pack/hook-branch-protection.js.map +1 -1
- package/dist/cli/pack/hook-post-tool-use.d.ts +25 -1
- package/dist/cli/pack/hook-post-tool-use.js +103 -10
- package/dist/cli/pack/hook-post-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-pre-tool-use.js +25 -4
- package/dist/cli/pack/hook-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-track-active-claim.d.ts +25 -0
- package/dist/cli/pack/hook-track-active-claim.js +162 -0
- package/dist/cli/pack/hook-track-active-claim.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +76 -0
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +272 -1
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution.js +28 -2
- package/dist/policy-packs/builtin/understanding-before-execution.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-pre-tool-use.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-pre-tool-use.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hook-pre-tool-use.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-pre-tool-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Manifest } from "../../schema/index.js";
|
|
2
|
+
import { type LoaderOptions } from "../loader.js";
|
|
3
|
+
export declare const TOOL_NAME_TASK_START = "mcp__agent-tasks__task_start";
|
|
4
|
+
export declare const TOOL_NAME_TASK_FINISH = "mcp__agent-tasks__task_finish";
|
|
5
|
+
export declare const TOOL_NAME_TASK_ABANDON = "mcp__agent-tasks__task_abandon";
|
|
6
|
+
export declare const TRACK_ACTIVE_CLAIM_TOOLS: readonly string[];
|
|
7
|
+
export interface PackHookTrackActiveClaimOptions extends LoaderOptions {
|
|
8
|
+
pack?: string;
|
|
9
|
+
generatedDir?: string;
|
|
10
|
+
stdin?: NodeJS.ReadableStream;
|
|
11
|
+
stderr?: NodeJS.WritableStream;
|
|
12
|
+
manifest?: Manifest;
|
|
13
|
+
}
|
|
14
|
+
export interface PackHookTrackActiveClaimResult {
|
|
15
|
+
exitCode: number;
|
|
16
|
+
/** Was the active-claim file written (task_start path)? */
|
|
17
|
+
claimWritten: boolean;
|
|
18
|
+
/** Was the active-claim file cleared (task_finish / abandon path)? */
|
|
19
|
+
claimCleared: boolean;
|
|
20
|
+
/** The taskId acted on, or null when the event carried none. */
|
|
21
|
+
taskId: string | null;
|
|
22
|
+
/** Diagnostic line emitted to stderr. */
|
|
23
|
+
diagnostic: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function runPackHookTrackActiveClaimCli(opts?: PackHookTrackActiveClaimOptions): Promise<PackHookTrackActiveClaimResult>;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// `harness pack hook track-active-claim` — agent-tasks claim tracking.
|
|
2
|
+
//
|
|
3
|
+
// PostToolUse hook for the understanding-before-execution pack
|
|
4
|
+
// (harness/494fd1e5). Maintains a small file at
|
|
5
|
+
// `<generatedDir>/active-claim` that names the currently-claimed
|
|
6
|
+
// agent-tasks task id. The file lets `harness approve understanding`
|
|
7
|
+
// auto-resolve the task id when --task is absent, so the operator
|
|
8
|
+
// does not have to type the UUID by hand on every approval.
|
|
9
|
+
//
|
|
10
|
+
// File lifecycle:
|
|
11
|
+
// - `mcp__agent-tasks__task_start` with `tool_input.taskId` → write
|
|
12
|
+
// the taskId into the file (atomic).
|
|
13
|
+
// - `mcp__agent-tasks__task_finish` / `mcp__agent-tasks__task_abandon`
|
|
14
|
+
// → remove the file (idempotent).
|
|
15
|
+
//
|
|
16
|
+
// The hook is intentionally separate from `hook-post-tool-use` because
|
|
17
|
+
// the existing marker-expiry hook fires on a configurable list of
|
|
18
|
+
// task-boundary verbs (`expire_on_tool_match`) that does NOT include
|
|
19
|
+
// `task_start`. Folding task_start in there would either expand that
|
|
20
|
+
// matcher's semantics (now "boundary + start") or require a parallel
|
|
21
|
+
// config field. A dedicated hook keeps each surface single-purpose.
|
|
22
|
+
//
|
|
23
|
+
// Failure mode mirrors `hook-post-tool-use`: every error path resolves
|
|
24
|
+
// to no-op + stderr log. The active-claim file is an ergonomic shortcut,
|
|
25
|
+
// not a security-relevant signal — `harness approve understanding`
|
|
26
|
+
// still treats explicit --task as authoritative, and falls back to
|
|
27
|
+
// session-scoped marker when no claim is resolved.
|
|
28
|
+
//
|
|
29
|
+
// Hardcoded agent-tasks tool names: the v2 contract is agent-tasks
|
|
30
|
+
// specific. Operators on Linear / JIRA can ignore this hook (the
|
|
31
|
+
// matcher will never fire for them); a config-driven extension can
|
|
32
|
+
// land later if a second tasking system asks for it.
|
|
33
|
+
import { clearActiveClaim, writeActiveClaim, } from "../../policy-packs/builtin/understanding-before-execution-runtime.js";
|
|
34
|
+
import { resolveGeneratedDir } from "../../runtime/pending-approval.js";
|
|
35
|
+
import { loadManifest } from "../loader.js";
|
|
36
|
+
const PACK_NAME = "understanding-before-execution";
|
|
37
|
+
export const TOOL_NAME_TASK_START = "mcp__agent-tasks__task_start";
|
|
38
|
+
export const TOOL_NAME_TASK_FINISH = "mcp__agent-tasks__task_finish";
|
|
39
|
+
export const TOOL_NAME_TASK_ABANDON = "mcp__agent-tasks__task_abandon";
|
|
40
|
+
export const TRACK_ACTIVE_CLAIM_TOOLS = [
|
|
41
|
+
TOOL_NAME_TASK_START,
|
|
42
|
+
TOOL_NAME_TASK_FINISH,
|
|
43
|
+
TOOL_NAME_TASK_ABANDON,
|
|
44
|
+
];
|
|
45
|
+
async function readStdin(stream) {
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
let data = "";
|
|
48
|
+
stream.setEncoding("utf8");
|
|
49
|
+
stream.on("data", (chunk) => {
|
|
50
|
+
data += chunk;
|
|
51
|
+
});
|
|
52
|
+
stream.on("end", () => resolve(data));
|
|
53
|
+
stream.on("error", reject);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function extractTaskId(toolInput) {
|
|
57
|
+
if (typeof toolInput !== "object" ||
|
|
58
|
+
toolInput === null ||
|
|
59
|
+
Array.isArray(toolInput)) {
|
|
60
|
+
return "";
|
|
61
|
+
}
|
|
62
|
+
const tid = toolInput["taskId"];
|
|
63
|
+
return typeof tid === "string" ? tid : "";
|
|
64
|
+
}
|
|
65
|
+
function noop(diagnostic, stderr) {
|
|
66
|
+
stderr.write(`${diagnostic}\n`);
|
|
67
|
+
return {
|
|
68
|
+
exitCode: 0,
|
|
69
|
+
claimWritten: false,
|
|
70
|
+
claimCleared: false,
|
|
71
|
+
taskId: null,
|
|
72
|
+
diagnostic,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export async function runPackHookTrackActiveClaimCli(opts = {}) {
|
|
76
|
+
const stdin = opts.stdin ?? process.stdin;
|
|
77
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
78
|
+
const packName = opts.pack ?? PACK_NAME;
|
|
79
|
+
const raw = await readStdin(stdin);
|
|
80
|
+
let event = {};
|
|
81
|
+
try {
|
|
82
|
+
event = JSON.parse(raw.trim() || "{}");
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return noop("harness pack hook track-active-claim: malformed event JSON, skipping", stderr);
|
|
86
|
+
}
|
|
87
|
+
const toolName = typeof event.tool_name === "string" ? event.tool_name : "";
|
|
88
|
+
if (toolName === "") {
|
|
89
|
+
return noop("harness pack hook track-active-claim: missing tool_name, skipping", stderr);
|
|
90
|
+
}
|
|
91
|
+
// Loader gate: pack must exist and be enabled. Mirrors the same
|
|
92
|
+
// structure as hook-post-tool-use so a single disabled-pack opt-out
|
|
93
|
+
// suppresses BOTH hooks.
|
|
94
|
+
let manifest;
|
|
95
|
+
let manifestPath;
|
|
96
|
+
try {
|
|
97
|
+
if (opts.manifest) {
|
|
98
|
+
manifest = opts.manifest;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const loaded = loadManifest(opts);
|
|
102
|
+
manifest = loaded.manifest;
|
|
103
|
+
manifestPath = loaded.resolved.base;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
return noop(`harness pack hook track-active-claim: manifest load failed (${err.message}), skipping`, stderr);
|
|
108
|
+
}
|
|
109
|
+
const declared = manifest.policy_packs.find((p) => p.name === packName);
|
|
110
|
+
if (!declared) {
|
|
111
|
+
return noop(`harness pack hook track-active-claim: pack "${packName}" not declared in manifest, skipping`, stderr);
|
|
112
|
+
}
|
|
113
|
+
if (!declared.enabled) {
|
|
114
|
+
return noop(`harness pack hook track-active-claim: pack "${packName}" is enabled:false, skipping`, stderr);
|
|
115
|
+
}
|
|
116
|
+
const generatedDir = opts.generatedDir ??
|
|
117
|
+
(manifestPath !== undefined
|
|
118
|
+
? resolveGeneratedDir({
|
|
119
|
+
...(opts.homeDir !== undefined ? { homeDir: opts.homeDir } : {}),
|
|
120
|
+
manifestPath,
|
|
121
|
+
})
|
|
122
|
+
: undefined);
|
|
123
|
+
if (generatedDir === undefined) {
|
|
124
|
+
return noop("harness pack hook track-active-claim: generatedDir unresolvable, skipping", stderr);
|
|
125
|
+
}
|
|
126
|
+
const taskId = extractTaskId(event.tool_input);
|
|
127
|
+
if (toolName === TOOL_NAME_TASK_START) {
|
|
128
|
+
if (taskId === "") {
|
|
129
|
+
return noop(`harness pack hook track-active-claim: task_start without tool_input.taskId, skipping`, stderr);
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
writeActiveClaim(generatedDir, taskId);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
return noop(`harness pack hook track-active-claim: writeActiveClaim failed for ${taskId}: ${err.message}`, stderr);
|
|
136
|
+
}
|
|
137
|
+
const diagnostic = `harness pack hook track-active-claim: wrote active-claim for ${taskId}`;
|
|
138
|
+
stderr.write(`${diagnostic}\n`);
|
|
139
|
+
return {
|
|
140
|
+
exitCode: 0,
|
|
141
|
+
claimWritten: true,
|
|
142
|
+
claimCleared: false,
|
|
143
|
+
taskId,
|
|
144
|
+
diagnostic,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (toolName === TOOL_NAME_TASK_FINISH ||
|
|
148
|
+
toolName === TOOL_NAME_TASK_ABANDON) {
|
|
149
|
+
clearActiveClaim(generatedDir);
|
|
150
|
+
const diagnostic = `harness pack hook track-active-claim: cleared active-claim after ${toolName}`;
|
|
151
|
+
stderr.write(`${diagnostic}\n`);
|
|
152
|
+
return {
|
|
153
|
+
exitCode: 0,
|
|
154
|
+
claimWritten: false,
|
|
155
|
+
claimCleared: true,
|
|
156
|
+
taskId: taskId === "" ? null : taskId,
|
|
157
|
+
diagnostic,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return noop(`harness pack hook track-active-claim: tool ${toolName} not tracked, skipping`, stderr);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=hook-track-active-claim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-track-active-claim.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-track-active-claim.ts"],"names":[],"mappings":"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"}
|
|
@@ -145,6 +145,8 @@ export declare function checkApprovalMarker(generatedDir: string, sessionId: str
|
|
|
145
145
|
export interface ApprovalLifecycle {
|
|
146
146
|
/** Tool-name patterns whose successful PostToolUse expires the marker. */
|
|
147
147
|
expireOnToolMatch: string[];
|
|
148
|
+
/** Pre-compiled regex patterns matched against `Bash` tool_input.command. */
|
|
149
|
+
expireOnBashMatch: RegExp[];
|
|
148
150
|
/** Max marker age in milliseconds. Undefined means no TTL. */
|
|
149
151
|
maxAgeMs?: number;
|
|
150
152
|
/** Whether the operator explicitly opted out via `{ mode: "session" }`. */
|
|
@@ -160,6 +162,80 @@ export interface ApprovalLifecycle {
|
|
|
160
162
|
export declare function parseApprovalLifecycle(raw: unknown, stderr?: {
|
|
161
163
|
write: (s: string) => void;
|
|
162
164
|
} | null): ApprovalLifecycle;
|
|
165
|
+
/**
|
|
166
|
+
* Flip the latest matching persisted report's approvalStatus to
|
|
167
|
+
* `expired` so it no longer satisfies the gate's persisted-report
|
|
168
|
+
* fallback (harness/1ee26e77 follow-up: post-tool-use expiry was
|
|
169
|
+
* marker-only; the persisted report at .understanding-gate/reports/
|
|
170
|
+
* silently kept satisfying the gate even after task_finish deleted
|
|
171
|
+
* the marker).
|
|
172
|
+
*
|
|
173
|
+
* Atomic rewrite. Preserves the rest of the report body so the audit
|
|
174
|
+
* trail (the operator's actual Understanding text + previous approval
|
|
175
|
+
* timestamps) stays intact; only the status fields change.
|
|
176
|
+
*
|
|
177
|
+
* Returns `{ ok: true, filePath, previousStatus }` on success,
|
|
178
|
+
* `{ ok: false, reason }` when no matching report exists or rewrite
|
|
179
|
+
* failed. Non-throwing: caller (post-tool-use hook) uses this as a
|
|
180
|
+
* best-effort cleanup so a missing report dir or unrelated I/O issue
|
|
181
|
+
* does not escalate into a session-breaking hook failure.
|
|
182
|
+
*/
|
|
183
|
+
export declare function expirePersistedReport(reportsDir: string, sessionId: string, now?: Date): {
|
|
184
|
+
ok: true;
|
|
185
|
+
filePath: string;
|
|
186
|
+
previousStatus: string | null;
|
|
187
|
+
} | {
|
|
188
|
+
ok: false;
|
|
189
|
+
reason: string;
|
|
190
|
+
};
|
|
163
191
|
/** Clear the per-session marker (used by `harness approve --revoke` and tests). */
|
|
164
192
|
export declare function clearApprovalMarker(generatedDir: string, sessionId: string): void;
|
|
193
|
+
export declare const APPROVAL_MARKER_TASK_PREFIX = "task-";
|
|
194
|
+
/** Filesystem path of a per-task approval marker. */
|
|
195
|
+
export declare function taskApprovalMarkerPathFor(generatedDir: string, taskId: string): string;
|
|
196
|
+
/**
|
|
197
|
+
* Operator-side: write a task-scoped marker file. Atomic. Caller is
|
|
198
|
+
* `harness approve understanding --task <id>`. The session marker is
|
|
199
|
+
* written separately by the same caller for back-compat.
|
|
200
|
+
*/
|
|
201
|
+
export declare function writeTaskApprovalMarker(generatedDir: string, taskId: string, marker: ApprovalMarker): string;
|
|
202
|
+
/**
|
|
203
|
+
* Gate-side: scan the approvals directory for any task-scoped marker
|
|
204
|
+
* (`task-<id>`) that is present, readable, and (when `maxAgeMs` is set)
|
|
205
|
+
* fresh. Returns the first matching marker's path; null when none match.
|
|
206
|
+
*
|
|
207
|
+
* Two-tier filter mirrors `checkApprovalMarker`: existence is the
|
|
208
|
+
* operator's intent (a body-unreadable marker counts as approved), and
|
|
209
|
+
* symlinks are refused for safety. Stale markers (older than maxAgeMs)
|
|
210
|
+
* are skipped silently so a long-running session doesn't latch onto a
|
|
211
|
+
* marker from a previous day's task.
|
|
212
|
+
*/
|
|
213
|
+
export declare function checkAnyTaskApprovalMarker(generatedDir: string, opts?: CheckApprovalMarkerOptions): MarkerCheck;
|
|
214
|
+
/** Clear a specific task-scoped marker. Used by the post-tool-use hook. */
|
|
215
|
+
export declare function clearTaskApprovalMarker(generatedDir: string, taskId: string): void;
|
|
216
|
+
export declare const ACTIVE_CLAIM_FILENAME = "active-claim";
|
|
217
|
+
export declare function activeClaimPathFor(generatedDir: string): string;
|
|
218
|
+
/**
|
|
219
|
+
* Hook-side: write the active claim file. Atomic. Called from the
|
|
220
|
+
* track-active-claim PostToolUse hook on `task_start`. The body is
|
|
221
|
+
* just the taskId (no JSON) so an operator running
|
|
222
|
+
* `cat ~/.claude/harness.generated/active-claim` sees the id directly.
|
|
223
|
+
*/
|
|
224
|
+
export declare function writeActiveClaim(generatedDir: string, taskId: string): string;
|
|
225
|
+
/**
|
|
226
|
+
* Operator-side: read the active claim file. Returns the taskId or
|
|
227
|
+
* null when the file is absent / unreadable / empty. `harness approve
|
|
228
|
+
* understanding` calls this when --task is absent, then passes the
|
|
229
|
+
* resolved id to writeTaskApprovalMarker.
|
|
230
|
+
*
|
|
231
|
+
* Defense-in-depth: if the on-disk content fails the same
|
|
232
|
+
* path-traversal / newline check that gates writes, the read returns
|
|
233
|
+
* null instead of surfacing a poisoned id. The write side guards
|
|
234
|
+
* against a malformed taskId reaching the file in the first place,
|
|
235
|
+
* but a stale file authored before this guard (or hand-edited)
|
|
236
|
+
* shouldn't escalate into a forged task-marker write downstream.
|
|
237
|
+
*/
|
|
238
|
+
export declare function readActiveClaim(generatedDir: string): string | null;
|
|
239
|
+
/** Hook-side: remove the active claim file. Idempotent. */
|
|
240
|
+
export declare function clearActiveClaim(generatedDir: string): void;
|
|
165
241
|
export declare function checkPersistedReport(reportsDir: string, sessionId: string): PersistedReportApprovalCheck;
|
|
@@ -319,6 +319,7 @@ export function checkApprovalMarker(generatedDir, sessionId, opts = {}) {
|
|
|
319
319
|
}
|
|
320
320
|
const DEFAULT_LIFECYCLE = {
|
|
321
321
|
expireOnToolMatch: [],
|
|
322
|
+
expireOnBashMatch: [],
|
|
322
323
|
legacyMode: false,
|
|
323
324
|
};
|
|
324
325
|
/**
|
|
@@ -337,7 +338,7 @@ export function parseApprovalLifecycle(raw, stderr) {
|
|
|
337
338
|
}
|
|
338
339
|
const obj = raw;
|
|
339
340
|
if (obj["mode"] === "session") {
|
|
340
|
-
return { expireOnToolMatch: [], legacyMode: true };
|
|
341
|
+
return { expireOnToolMatch: [], expireOnBashMatch: [], legacyMode: true };
|
|
341
342
|
}
|
|
342
343
|
const expireOnToolMatch = [];
|
|
343
344
|
const list = obj["expire_on_tool_match"];
|
|
@@ -350,6 +351,23 @@ export function parseApprovalLifecycle(raw, stderr) {
|
|
|
350
351
|
else if (list !== undefined) {
|
|
351
352
|
stderr?.write(`harness pack hook: config.approval_lifecycle.expire_on_tool_match ignored (expected string[], got ${typeof list})\n`);
|
|
352
353
|
}
|
|
354
|
+
const expireOnBashMatch = [];
|
|
355
|
+
const bashList = obj["expire_on_bash_match"];
|
|
356
|
+
if (Array.isArray(bashList)) {
|
|
357
|
+
for (const v of bashList) {
|
|
358
|
+
if (typeof v !== "string" || v.length === 0)
|
|
359
|
+
continue;
|
|
360
|
+
try {
|
|
361
|
+
expireOnBashMatch.push(new RegExp(v));
|
|
362
|
+
}
|
|
363
|
+
catch (err) {
|
|
364
|
+
stderr?.write(`harness pack hook: config.approval_lifecycle.expire_on_bash_match entry ignored ("${v}"): ${err.message}\n`);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
else if (bashList !== undefined) {
|
|
369
|
+
stderr?.write(`harness pack hook: config.approval_lifecycle.expire_on_bash_match ignored (expected string[], got ${typeof bashList})\n`);
|
|
370
|
+
}
|
|
353
371
|
let maxAgeMs;
|
|
354
372
|
const maxAgeRaw = obj["max_age"];
|
|
355
373
|
if (typeof maxAgeRaw === "string" && maxAgeRaw.length > 0) {
|
|
@@ -366,10 +384,75 @@ export function parseApprovalLifecycle(raw, stderr) {
|
|
|
366
384
|
}
|
|
367
385
|
return {
|
|
368
386
|
expireOnToolMatch,
|
|
387
|
+
expireOnBashMatch,
|
|
369
388
|
...(maxAgeMs !== undefined && { maxAgeMs }),
|
|
370
389
|
legacyMode: false,
|
|
371
390
|
};
|
|
372
391
|
}
|
|
392
|
+
/**
|
|
393
|
+
* Flip the latest matching persisted report's approvalStatus to
|
|
394
|
+
* `expired` so it no longer satisfies the gate's persisted-report
|
|
395
|
+
* fallback (harness/1ee26e77 follow-up: post-tool-use expiry was
|
|
396
|
+
* marker-only; the persisted report at .understanding-gate/reports/
|
|
397
|
+
* silently kept satisfying the gate even after task_finish deleted
|
|
398
|
+
* the marker).
|
|
399
|
+
*
|
|
400
|
+
* Atomic rewrite. Preserves the rest of the report body so the audit
|
|
401
|
+
* trail (the operator's actual Understanding text + previous approval
|
|
402
|
+
* timestamps) stays intact; only the status fields change.
|
|
403
|
+
*
|
|
404
|
+
* Returns `{ ok: true, filePath, previousStatus }` on success,
|
|
405
|
+
* `{ ok: false, reason }` when no matching report exists or rewrite
|
|
406
|
+
* failed. Non-throwing: caller (post-tool-use hook) uses this as a
|
|
407
|
+
* best-effort cleanup so a missing report dir or unrelated I/O issue
|
|
408
|
+
* does not escalate into a session-breaking hook failure.
|
|
409
|
+
*/
|
|
410
|
+
export function expirePersistedReport(reportsDir, sessionId, now = new Date()) {
|
|
411
|
+
const reports = listPersistedReports(reportsDir);
|
|
412
|
+
if (reports.length === 0) {
|
|
413
|
+
return { ok: false, reason: `no reports under ${reportsDir}` };
|
|
414
|
+
}
|
|
415
|
+
const latest = findLatestReportForSession(reports, sessionId);
|
|
416
|
+
if (!latest) {
|
|
417
|
+
return {
|
|
418
|
+
ok: false,
|
|
419
|
+
reason: `no report matched session_id=${sessionId} (${reports.length} report(s) for other sessions)`,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
if (latest.approvalStatus !== "approved") {
|
|
423
|
+
return {
|
|
424
|
+
ok: false,
|
|
425
|
+
reason: `latest report ${path.basename(latest.filePath)} already has approvalStatus=${latest.approvalStatus ?? "<missing>"}, nothing to expire`,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
let raw;
|
|
429
|
+
try {
|
|
430
|
+
raw = fs.readFileSync(latest.filePath, "utf8");
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
return { ok: false, reason: `failed to read ${latest.filePath}: ${err.message}` };
|
|
434
|
+
}
|
|
435
|
+
let parsed;
|
|
436
|
+
try {
|
|
437
|
+
parsed = JSON.parse(raw);
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
return { ok: false, reason: `failed to parse ${latest.filePath}: ${err.message}` };
|
|
441
|
+
}
|
|
442
|
+
const previousStatus = typeof parsed["approvalStatus"] === "string" ? parsed["approvalStatus"] : null;
|
|
443
|
+
parsed["approvalStatus"] = "expired";
|
|
444
|
+
parsed["expiredAt"] = now.toISOString();
|
|
445
|
+
try {
|
|
446
|
+
atomicWriteFile(latest.filePath, `${JSON.stringify(parsed, null, 2)}\n`);
|
|
447
|
+
}
|
|
448
|
+
catch (err) {
|
|
449
|
+
return {
|
|
450
|
+
ok: false,
|
|
451
|
+
reason: `failed to rewrite ${latest.filePath}: ${err.message}`,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
return { ok: true, filePath: latest.filePath, previousStatus };
|
|
455
|
+
}
|
|
373
456
|
/** Clear the per-session marker (used by `harness approve --revoke` and tests). */
|
|
374
457
|
export function clearApprovalMarker(generatedDir, sessionId) {
|
|
375
458
|
try {
|
|
@@ -379,6 +462,194 @@ export function clearApprovalMarker(generatedDir, sessionId) {
|
|
|
379
462
|
/* already gone */
|
|
380
463
|
}
|
|
381
464
|
}
|
|
465
|
+
// Task-scoped approval markers (harness/1ee26e77). When the operator
|
|
466
|
+
// passes `--task <id>` to `harness approve understanding`, a second
|
|
467
|
+
// marker file is written next to the session marker, keyed by the
|
|
468
|
+
// agent-tasks task id and prefixed `task-` so a directory scan can
|
|
469
|
+
// distinguish them from session-keyed markers (UUIDs do not start with
|
|
470
|
+
// `task-`). Either marker satisfies the gate; the session marker
|
|
471
|
+
// remains for back-compat with operators who don't pass --task and for
|
|
472
|
+
// non-agent-tasks workflows.
|
|
473
|
+
//
|
|
474
|
+
// Why task-scope: a session can span many distinct tasks; the operator's
|
|
475
|
+
// Understanding Report for task A doesn't transfer trust to task B
|
|
476
|
+
// (different surface, different acceptance criteria). Without per-task
|
|
477
|
+
// markers a multi-task session re-uses the first task's approval for
|
|
478
|
+
// every subsequent task. The expire_on_tool_match PostToolUse hook
|
|
479
|
+
// already deletes the session marker on `task_finish`, but if delivery
|
|
480
|
+
// is unreliable (e.g. PostToolUse skipped for an MCP tool) the marker
|
|
481
|
+
// silently persists. A task-keyed marker side-steps that delivery
|
|
482
|
+
// concern because the next task's id is different even if the previous
|
|
483
|
+
// marker file outlives its scope.
|
|
484
|
+
export const APPROVAL_MARKER_TASK_PREFIX = "task-";
|
|
485
|
+
/**
|
|
486
|
+
* Reject taskIds that would escape the approvals/ namespace via path
|
|
487
|
+
* traversal or directory separators. The operator's --task flag value
|
|
488
|
+
* lands here verbatim; an accidental shell-expanded `..` or `/` would
|
|
489
|
+
* otherwise write to a sibling directory. This is defensive — the
|
|
490
|
+
* caller is the operator's own shell — but pins the trust boundary.
|
|
491
|
+
*/
|
|
492
|
+
function rejectMalformedTaskId(taskId) {
|
|
493
|
+
if (taskId.length === 0) {
|
|
494
|
+
throw new Error("taskId is empty");
|
|
495
|
+
}
|
|
496
|
+
if (taskId.includes("/") || taskId.includes("\\") || taskId.includes("..")) {
|
|
497
|
+
throw new Error(`taskId contains path-separator or traversal characters: ${JSON.stringify(taskId)}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
/** Filesystem path of a per-task approval marker. */
|
|
501
|
+
export function taskApprovalMarkerPathFor(generatedDir, taskId) {
|
|
502
|
+
rejectMalformedTaskId(taskId);
|
|
503
|
+
return path.join(generatedDir, APPROVAL_MARKER_DIRNAME, `${APPROVAL_MARKER_TASK_PREFIX}${taskId}`);
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Operator-side: write a task-scoped marker file. Atomic. Caller is
|
|
507
|
+
* `harness approve understanding --task <id>`. The session marker is
|
|
508
|
+
* written separately by the same caller for back-compat.
|
|
509
|
+
*/
|
|
510
|
+
export function writeTaskApprovalMarker(generatedDir, taskId, marker) {
|
|
511
|
+
const filePath = taskApprovalMarkerPathFor(generatedDir, taskId);
|
|
512
|
+
atomicWriteFile(filePath, `${JSON.stringify(marker, null, 2)}\n`);
|
|
513
|
+
return filePath;
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Gate-side: scan the approvals directory for any task-scoped marker
|
|
517
|
+
* (`task-<id>`) that is present, readable, and (when `maxAgeMs` is set)
|
|
518
|
+
* fresh. Returns the first matching marker's path; null when none match.
|
|
519
|
+
*
|
|
520
|
+
* Two-tier filter mirrors `checkApprovalMarker`: existence is the
|
|
521
|
+
* operator's intent (a body-unreadable marker counts as approved), and
|
|
522
|
+
* symlinks are refused for safety. Stale markers (older than maxAgeMs)
|
|
523
|
+
* are skipped silently so a long-running session doesn't latch onto a
|
|
524
|
+
* marker from a previous day's task.
|
|
525
|
+
*/
|
|
526
|
+
export function checkAnyTaskApprovalMarker(generatedDir, opts = {}) {
|
|
527
|
+
const approvalsDir = path.join(generatedDir, APPROVAL_MARKER_DIRNAME);
|
|
528
|
+
let names;
|
|
529
|
+
try {
|
|
530
|
+
names = fs.readdirSync(approvalsDir);
|
|
531
|
+
}
|
|
532
|
+
catch {
|
|
533
|
+
return {
|
|
534
|
+
matched: false,
|
|
535
|
+
detail: `no approvals directory at ${approvalsDir}`,
|
|
536
|
+
marker: null,
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
const taskMarkerNames = names.filter((n) => n.startsWith(APPROVAL_MARKER_TASK_PREFIX));
|
|
540
|
+
if (taskMarkerNames.length === 0) {
|
|
541
|
+
return {
|
|
542
|
+
matched: false,
|
|
543
|
+
detail: `no task-scoped markers under ${approvalsDir}`,
|
|
544
|
+
marker: null,
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
for (const name of taskMarkerNames) {
|
|
548
|
+
const taskId = name.slice(APPROVAL_MARKER_TASK_PREFIX.length);
|
|
549
|
+
const check = checkApprovalMarker(generatedDir, name, opts);
|
|
550
|
+
if (check.matched) {
|
|
551
|
+
return {
|
|
552
|
+
matched: true,
|
|
553
|
+
detail: `task-scoped marker for task ${taskId}: ${check.detail}`,
|
|
554
|
+
marker: check.marker,
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return {
|
|
559
|
+
matched: false,
|
|
560
|
+
detail: `${taskMarkerNames.length} task-scoped marker(s) present but none fresh`,
|
|
561
|
+
marker: null,
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
/** Clear a specific task-scoped marker. Used by the post-tool-use hook. */
|
|
565
|
+
export function clearTaskApprovalMarker(generatedDir, taskId) {
|
|
566
|
+
try {
|
|
567
|
+
fs.rmSync(taskApprovalMarkerPathFor(generatedDir, taskId));
|
|
568
|
+
}
|
|
569
|
+
catch {
|
|
570
|
+
/* already gone */
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
// Active-claim tracking (harness/494fd1e5). When the agent calls
|
|
574
|
+
// `mcp__agent-tasks__task_start`, a PostToolUse hook writes the claimed
|
|
575
|
+
// task id to a stable file. `harness approve understanding` reads it
|
|
576
|
+
// when --task is absent and auto-supplies it as the task-scoped marker
|
|
577
|
+
// target. This closes the v1 ergonomics gap from PR #184 where the
|
|
578
|
+
// operator had to type the taskId by hand.
|
|
579
|
+
//
|
|
580
|
+
// File contract: a single line containing just the taskId. No JSON,
|
|
581
|
+
// no metadata. Operators can `cat` it to debug. The post-tool-use
|
|
582
|
+
// hook on task_finish / task_abandon removes the file.
|
|
583
|
+
export const ACTIVE_CLAIM_FILENAME = "active-claim";
|
|
584
|
+
export function activeClaimPathFor(generatedDir) {
|
|
585
|
+
return path.join(generatedDir, ACTIVE_CLAIM_FILENAME);
|
|
586
|
+
}
|
|
587
|
+
function rejectMalformedClaimId(taskId) {
|
|
588
|
+
if (taskId.length === 0) {
|
|
589
|
+
throw new Error("taskId is empty");
|
|
590
|
+
}
|
|
591
|
+
if (taskId.includes("\n") ||
|
|
592
|
+
taskId.includes("\r") ||
|
|
593
|
+
taskId.includes("/") ||
|
|
594
|
+
taskId.includes("\\") ||
|
|
595
|
+
taskId.includes("..")) {
|
|
596
|
+
throw new Error(`taskId contains forbidden characters (newline / path-separator / traversal): ${JSON.stringify(taskId)}`);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Hook-side: write the active claim file. Atomic. Called from the
|
|
601
|
+
* track-active-claim PostToolUse hook on `task_start`. The body is
|
|
602
|
+
* just the taskId (no JSON) so an operator running
|
|
603
|
+
* `cat ~/.claude/harness.generated/active-claim` sees the id directly.
|
|
604
|
+
*/
|
|
605
|
+
export function writeActiveClaim(generatedDir, taskId) {
|
|
606
|
+
rejectMalformedClaimId(taskId);
|
|
607
|
+
const filePath = activeClaimPathFor(generatedDir);
|
|
608
|
+
atomicWriteFile(filePath, `${taskId}\n`);
|
|
609
|
+
return filePath;
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Operator-side: read the active claim file. Returns the taskId or
|
|
613
|
+
* null when the file is absent / unreadable / empty. `harness approve
|
|
614
|
+
* understanding` calls this when --task is absent, then passes the
|
|
615
|
+
* resolved id to writeTaskApprovalMarker.
|
|
616
|
+
*
|
|
617
|
+
* Defense-in-depth: if the on-disk content fails the same
|
|
618
|
+
* path-traversal / newline check that gates writes, the read returns
|
|
619
|
+
* null instead of surfacing a poisoned id. The write side guards
|
|
620
|
+
* against a malformed taskId reaching the file in the first place,
|
|
621
|
+
* but a stale file authored before this guard (or hand-edited)
|
|
622
|
+
* shouldn't escalate into a forged task-marker write downstream.
|
|
623
|
+
*/
|
|
624
|
+
export function readActiveClaim(generatedDir) {
|
|
625
|
+
const filePath = activeClaimPathFor(generatedDir);
|
|
626
|
+
let raw;
|
|
627
|
+
try {
|
|
628
|
+
raw = fs.readFileSync(filePath, "utf8");
|
|
629
|
+
}
|
|
630
|
+
catch {
|
|
631
|
+
return null;
|
|
632
|
+
}
|
|
633
|
+
const trimmed = raw.trim();
|
|
634
|
+
if (trimmed.length === 0)
|
|
635
|
+
return null;
|
|
636
|
+
try {
|
|
637
|
+
rejectMalformedClaimId(trimmed);
|
|
638
|
+
}
|
|
639
|
+
catch {
|
|
640
|
+
return null;
|
|
641
|
+
}
|
|
642
|
+
return trimmed;
|
|
643
|
+
}
|
|
644
|
+
/** Hook-side: remove the active claim file. Idempotent. */
|
|
645
|
+
export function clearActiveClaim(generatedDir) {
|
|
646
|
+
try {
|
|
647
|
+
fs.rmSync(activeClaimPathFor(generatedDir));
|
|
648
|
+
}
|
|
649
|
+
catch {
|
|
650
|
+
/* already gone */
|
|
651
|
+
}
|
|
652
|
+
}
|
|
382
653
|
export function checkPersistedReport(reportsDir, sessionId) {
|
|
383
654
|
const reports = listPersistedReports(reportsDir);
|
|
384
655
|
if (reports.length === 0) {
|