@lannguyensi/harness 0.40.0 → 0.42.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 +68 -0
- package/README.md +9 -0
- package/dist/cli/adopt/derive.d.ts +15 -0
- package/dist/cli/adopt/derive.js +34 -7
- package/dist/cli/adopt/derive.js.map +1 -1
- package/dist/cli/adopt/index.d.ts +30 -0
- package/dist/cli/adopt/index.js +23 -3
- package/dist/cli/adopt/index.js.map +1 -1
- package/dist/cli/apply/generate-settings.d.ts +14 -1
- package/dist/cli/apply/generate-settings.js +7 -3
- package/dist/cli/apply/generate-settings.js.map +1 -1
- package/dist/cli/approve/stdin-report.js +2 -0
- package/dist/cli/approve/stdin-report.js.map +1 -1
- package/dist/cli/approve/understanding.js +28 -0
- package/dist/cli/approve/understanding.js.map +1 -1
- package/dist/cli/doctor/claude-mcp.d.ts +50 -0
- package/dist/cli/doctor/claude-mcp.js +170 -0
- package/dist/cli/doctor/claude-mcp.js.map +1 -0
- package/dist/cli/doctor/codex.d.ts +8 -0
- package/dist/cli/doctor/codex.js +8 -1
- package/dist/cli/doctor/codex.js.map +1 -1
- package/dist/cli/doctor/format.js +60 -11
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/index.d.ts +46 -0
- package/dist/cli/doctor/index.js +155 -29
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/npm-bin-path.js +42 -0
- package/dist/cli/doctor/npm-bin-path.js.map +1 -1
- package/dist/cli/doctor/types.d.ts +37 -0
- package/dist/cli/doctor/types.js.map +1 -1
- package/dist/cli/dry-run.js +5 -0
- package/dist/cli/dry-run.js.map +1 -1
- package/dist/cli/explain.js +16 -3
- package/dist/cli/explain.js.map +1 -1
- package/dist/cli/index.js +328 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/agent-tasks-auth.js +32 -0
- package/dist/cli/init/agent-tasks-auth.js.map +1 -1
- package/dist/cli/init/composer.js +13 -40
- package/dist/cli/init/composer.js.map +1 -1
- package/dist/cli/init/dependencies.js +21 -0
- package/dist/cli/init/dependencies.js.map +1 -1
- package/dist/cli/init/detect.d.ts +20 -3
- package/dist/cli/init/detect.js +34 -36
- package/dist/cli/init/detect.js.map +1 -1
- package/dist/cli/init/index.d.ts +18 -0
- package/dist/cli/init/index.js +28 -2
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/interactive.d.ts +41 -0
- package/dist/cli/init/interactive.js +421 -6
- package/dist/cli/init/interactive.js.map +1 -1
- package/dist/cli/init/profiles.d.ts +2 -2
- package/dist/cli/init/profiles.js +10 -1
- package/dist/cli/init/profiles.js.map +1 -1
- package/dist/cli/init/templates.d.ts +1 -1
- package/dist/cli/init/templates.js +217 -8
- package/dist/cli/init/templates.js.map +1 -1
- package/dist/cli/list.js +3 -1
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/main.js +10 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/pack/hook-bootstrap.d.ts +24 -0
- package/dist/cli/pack/hook-bootstrap.js +47 -1
- package/dist/cli/pack/hook-bootstrap.js.map +1 -1
- package/dist/cli/pack/hook-branch-protection.js +9 -1
- package/dist/cli/pack/hook-branch-protection.js.map +1 -1
- package/dist/cli/pack/hook-codex-post-tool-use.d.ts +25 -0
- package/dist/cli/pack/hook-codex-post-tool-use.js +160 -0
- package/dist/cli/pack/hook-codex-post-tool-use.js.map +1 -0
- package/dist/cli/pack/hook-codex-pre-tool-use.d.ts +1 -0
- package/dist/cli/pack/hook-codex-pre-tool-use.js +43 -10
- package/dist/cli/pack/hook-codex-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-codex-stop.js +1 -8
- package/dist/cli/pack/hook-codex-stop.js.map +1 -1
- package/dist/cli/pack/hook-post-merge-gate-record.d.ts +30 -0
- package/dist/cli/pack/hook-post-merge-gate-record.js +153 -0
- package/dist/cli/pack/hook-post-merge-gate-record.js.map +1 -0
- package/dist/cli/pack/hook-post-merge-gate.d.ts +28 -0
- package/dist/cli/pack/hook-post-merge-gate.js +244 -0
- package/dist/cli/pack/hook-post-merge-gate.js.map +1 -0
- package/dist/cli/pack/hook-post-tool-use.js +16 -131
- package/dist/cli/pack/hook-post-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-pre-tool-use.js +54 -2
- package/dist/cli/pack/hook-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-solution-acceptance-writeguard.js +148 -2
- package/dist/cli/pack/hook-solution-acceptance-writeguard.js.map +1 -1
- package/dist/cli/pack/hook-stay-in-scope.js +63 -20
- package/dist/cli/pack/hook-stay-in-scope.js.map +1 -1
- package/dist/cli/pack/hook-track-active-claim.js +33 -9
- package/dist/cli/pack/hook-track-active-claim.js.map +1 -1
- package/dist/cli/pack/index.d.ts +2 -1
- package/dist/cli/pack/index.js +2 -1
- package/dist/cli/pack/index.js.map +1 -1
- package/dist/cli/pack/mutate.d.ts +19 -0
- package/dist/cli/pack/mutate.js +38 -0
- package/dist/cli/pack/mutate.js.map +1 -1
- package/dist/cli/pack/reseed.d.ts +19 -0
- package/dist/cli/pack/reseed.js +118 -0
- package/dist/cli/pack/reseed.js.map +1 -0
- package/dist/cli/pack/understanding-report-schema-hint.js +1 -1
- package/dist/cli/pack/understanding-report-schema-hint.js.map +1 -1
- package/dist/cli/pause/index.js +12 -3
- package/dist/cli/pause/index.js.map +1 -1
- package/dist/cli/record/index.d.ts +64 -0
- package/dist/cli/record/index.js +211 -0
- package/dist/cli/record/index.js.map +1 -0
- package/dist/cli/session-start/index.d.ts +21 -0
- package/dist/cli/session-start/index.js +160 -25
- package/dist/cli/session-start/index.js.map +1 -1
- package/dist/cli/session-start/toolchain-parity.d.ts +149 -0
- package/dist/cli/session-start/toolchain-parity.js +618 -0
- package/dist/cli/session-start/toolchain-parity.js.map +1 -0
- package/dist/cli/uninstall/index.d.ts +73 -1
- package/dist/cli/uninstall/index.js +134 -2
- package/dist/cli/uninstall/index.js.map +1 -1
- package/dist/cli/validate/checks.js +8 -0
- package/dist/cli/validate/checks.js.map +1 -1
- package/dist/io/claude-mcp.d.ts +258 -0
- package/dist/io/claude-mcp.js +544 -0
- package/dist/io/claude-mcp.js.map +1 -0
- package/dist/policies/ledger-client.d.ts +34 -1
- package/dist/policies/ledger-client.js +21 -16
- package/dist/policies/ledger-client.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection-runtime.d.ts +4 -2
- package/dist/policy-packs/builtin/branch-protection-runtime.js +4 -2
- package/dist/policy-packs/builtin/branch-protection-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection.d.ts +10 -1
- package/dist/policy-packs/builtin/branch-protection.js +17 -0
- package/dist/policy-packs/builtin/branch-protection.js.map +1 -1
- package/dist/policy-packs/builtin/post-merge-gate-runtime.d.ts +195 -0
- package/dist/policy-packs/builtin/post-merge-gate-runtime.js +290 -0
- package/dist/policy-packs/builtin/post-merge-gate-runtime.js.map +1 -0
- package/dist/policy-packs/builtin/post-merge-gate.d.ts +56 -0
- package/dist/policy-packs/builtin/post-merge-gate.js +291 -0
- package/dist/policy-packs/builtin/post-merge-gate.js.map +1 -0
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js +28 -13
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +197 -24
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +342 -40
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution.d.ts +26 -1
- package/dist/policy-packs/builtin/understanding-before-execution.js +302 -17
- package/dist/policy-packs/builtin/understanding-before-execution.js.map +1 -1
- package/dist/policy-packs/registry.d.ts +23 -2
- package/dist/policy-packs/registry.js +31 -2
- package/dist/policy-packs/registry.js.map +1 -1
- package/dist/policy-packs/ux-compare.d.ts +14 -0
- package/dist/policy-packs/ux-compare.js +58 -0
- package/dist/policy-packs/ux-compare.js.map +1 -0
- package/dist/policy-packs/ux-drift-check.d.ts +27 -0
- package/dist/policy-packs/ux-drift-check.js +78 -0
- package/dist/policy-packs/ux-drift-check.js.map +1 -0
- package/dist/probes/mcp.d.ts +13 -0
- package/dist/probes/mcp.js +57 -0
- package/dist/probes/mcp.js.map +1 -1
- package/dist/runtime/approval-signing.d.ts +82 -0
- package/dist/runtime/approval-signing.js +275 -0
- package/dist/runtime/approval-signing.js.map +1 -0
- package/dist/runtime/git-context.d.ts +50 -0
- package/dist/runtime/git-context.js +108 -1
- package/dist/runtime/git-context.js.map +1 -1
- package/dist/runtime/hermetic-spawn-guard.d.ts +25 -0
- package/dist/runtime/hermetic-spawn-guard.js +136 -0
- package/dist/runtime/hermetic-spawn-guard.js.map +1 -0
- package/dist/runtime/intercept.js +62 -5
- package/dist/runtime/intercept.js.map +1 -1
- package/dist/runtime/ledger-writer.d.ts +27 -0
- package/dist/runtime/ledger-writer.js +46 -0
- package/dist/runtime/ledger-writer.js.map +1 -0
- package/dist/runtime/pause-sentinel.js +14 -3
- package/dist/runtime/pause-sentinel.js.map +1 -1
- package/dist/runtime/read-only-bash.js +118 -0
- package/dist/runtime/read-only-bash.js.map +1 -1
- package/dist/runtime/recovery-git-commit.d.ts +22 -0
- package/dist/runtime/recovery-git-commit.js +284 -0
- package/dist/runtime/recovery-git-commit.js.map +1 -0
- package/dist/runtime/tool-name-aliases.d.ts +1 -0
- package/dist/runtime/tool-name-aliases.js +7 -1
- package/dist/runtime/tool-name-aliases.js.map +1 -1
- package/dist/schema/index.d.ts +94 -42
- package/dist/schema/index.js +5 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/policies.d.ts +56 -44
- package/dist/schema/policies.js +79 -9
- package/dist/schema/policies.js.map +1 -1
- package/dist/schema/toolchain-parity.d.ts +18 -0
- package/dist/schema/toolchain-parity.js +35 -0
- package/dist/schema/toolchain-parity.js.map +1 -0
- package/package.json +4 -2
|
@@ -17,6 +17,40 @@
|
|
|
17
17
|
// (covers `echo >`, `$SOLUTION_VERDICT_DIR` spellings, `tee`, `mv`/`cp`/
|
|
18
18
|
// `ln`/`install`, `python3 -c '...path...'`, and `chmod`/`chattr` that
|
|
19
19
|
// would loosen perms) — or whose shell cwd is inside the dir.
|
|
20
|
+
// - Bash `cd` whose RESOLVED target is inside the verdict dir. `cd` itself
|
|
21
|
+
// is provably read-only (task fb67b402 added it to the shared
|
|
22
|
+
// read-only-bash floor: it mutates only the invoking shell's own cwd,
|
|
23
|
+
// never the filesystem), so it no longer reaches the "not read-only"
|
|
24
|
+
// checks below. But stepping into the dir is the setup half of a
|
|
25
|
+
// two-call forge (`cd <dir>` then, in a LATER un-chained Bash call,
|
|
26
|
+
// a bare relative write): this pre-check keeps that first step blocked
|
|
27
|
+
// as defense-in-depth, ahead of (not instead of) the cwd-inside check
|
|
28
|
+
// below, which is what actually closes the later relative-write call
|
|
29
|
+
// once cwd has genuinely moved. A `cd` target that `path.resolve`
|
|
30
|
+
// cannot literally evaluate does NOT get `cd`'s read-only fast path
|
|
31
|
+
// either: it falls through to the same reference-based checks as any
|
|
32
|
+
// other non-read-only Bash. `CD_TARGET_UNRESOLVABLE_CHARS` documents
|
|
33
|
+
// exactly WHICH expansions this enumerates (quoting, `$`/env-var,
|
|
34
|
+
// `~`, glob, and `{...}` brace expansion) — that list is what this
|
|
35
|
+
// check catches, not a claim that every shell-expansion class is
|
|
36
|
+
// closed. Known-open residual, pre-existing (not introduced by this
|
|
37
|
+
// branch, since it applies to `bashReferencesVerdictDir`'s textual
|
|
38
|
+
// match on ANY Bash command, not just `cd`): a backslash-escaped
|
|
39
|
+
// spelling of the leaf, e.g. `cd <parent>/solution\-verdicts`, still
|
|
40
|
+
// navigates into the dir under bash (verified against bash 3.2.57)
|
|
41
|
+
// while `bashReferencesVerdictDir` returns false — the backslash
|
|
42
|
+
// breaks the literal-leaf substring match and no metacharacter here
|
|
43
|
+
// triggers the glob/brace fallback either. Closing it needs
|
|
44
|
+
// shell-unescaping in the textual check itself, which is more than
|
|
45
|
+
// this task absorbs; do not assume the class is closed.
|
|
46
|
+
// A SECOND residual of the same class, and on a macOS operator
|
|
47
|
+
// machine the more reachable of the two: case variance.
|
|
48
|
+
// `cd <parent>/SOLUTION-VERDICTS` navigates into the dir on a
|
|
49
|
+
// case-insensitive APFS volume, but `isInsideDir` compares with a
|
|
50
|
+
// case-sensitive `path.relative` and the textual check uses a
|
|
51
|
+
// case-sensitive `includes`, so both return false. Also allowed:
|
|
52
|
+
// a trailing backslash, `cd <DIR>\`. Both pre-existing; closing
|
|
53
|
+
// them needs case-folding in the textual check.
|
|
20
54
|
//
|
|
21
55
|
// Pure reads (`cat <dir>/x.json`) are allowed so the guard is not over-broad.
|
|
22
56
|
//
|
|
@@ -30,7 +64,10 @@
|
|
|
30
64
|
// write paths above. A path constructed at runtime inside an interpreter
|
|
31
65
|
// with no textual reference is NOT caught; marker signing (a cross-repo
|
|
32
66
|
// follow-up) closes content-authenticity against an unguarded write
|
|
33
|
-
// primitive.
|
|
67
|
+
// primitive. The `cd`-target check added later (task fb67b402) has its own
|
|
68
|
+
// enumerated, not exhaustive, expansion list — see the bullet above and
|
|
69
|
+
// `CD_TARGET_UNRESOLVABLE_CHARS`'s docstring for the backslash-escaping
|
|
70
|
+
// residual specifically.
|
|
34
71
|
import { bashReferencesVerdictDir, isInsideDir, PACK_NAME, verdictDir as resolveVerdictDir, } from "../../policy-packs/builtin/solution-acceptance-runtime.js";
|
|
35
72
|
import { isReadOnlyBashCommand } from "../../runtime/read-only-bash.js";
|
|
36
73
|
import { checkHookPause, readStdin } from "./hook-bootstrap.js";
|
|
@@ -60,6 +97,94 @@ function bashCommandOf(toolInput) {
|
|
|
60
97
|
const cmd = toolInput["command"];
|
|
61
98
|
return typeof cmd === "string" ? cmd : "";
|
|
62
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Extract `cd`'s destination argument from a Bash command string, or null
|
|
102
|
+
* when the command is not a `cd` invocation or has no statically resolvable
|
|
103
|
+
* destination. Whitespace-tokenized, same as `read-only-bash.ts`'s own
|
|
104
|
+
* classifier (this hook does not shell-parse either).
|
|
105
|
+
*
|
|
106
|
+
* Deliberately narrow:
|
|
107
|
+
* - Only fires when the FIRST token is exactly `cd`. `env cd x` or a
|
|
108
|
+
* chained `foo && cd x` do not match here (tokens[0] would be `env` /
|
|
109
|
+
* `foo`); those are unaffected by this pre-check and are still governed
|
|
110
|
+
* by the existing not-read-only + `bashReferencesVerdictDir` checks
|
|
111
|
+
* below, which already close the `cd <parent> && write <relative>`
|
|
112
|
+
* descent via the leaf-segment match.
|
|
113
|
+
* - `cd`'s own flags (`-L`, `-P`, `-e`, `-@`, and combinations) are
|
|
114
|
+
* skipped to find the first positional path argument.
|
|
115
|
+
* - `cd -` (switch to `$OLDPWD`) and a bare `cd` (goes to `$HOME`) have no
|
|
116
|
+
* destination this function can resolve without ambient shell state;
|
|
117
|
+
* both return null (not flagged), the same conservative stance as the
|
|
118
|
+
* rest of this module's enumerated-path checks.
|
|
119
|
+
* - A single layer of surrounding quotes (`"..."` or `'...'`) is stripped
|
|
120
|
+
* from the returned token before the caller does anything with it, so
|
|
121
|
+
* `cd "<path>"` and `cd <path>` are treated identically (both the
|
|
122
|
+
* resolved-path inside-dir check AND the unresolvable-chars check see
|
|
123
|
+
* the same unquoted value). Without this, a quoted literal that merely
|
|
124
|
+
* shares a text prefix with the verdict dir (`cd "<dir>-decoy"`) would
|
|
125
|
+
* route to the textual leaf match and be wrongly blocked, while the
|
|
126
|
+
* unquoted `cd <dir>-decoy` correctly passes via the resolved-path
|
|
127
|
+
* check — spelling-dependent behavior for what is the same destination.
|
|
128
|
+
*/
|
|
129
|
+
function cdTargetArgument(command) {
|
|
130
|
+
const tokens = command.trim().split(/\s+/);
|
|
131
|
+
if (tokens[0] !== "cd")
|
|
132
|
+
return null;
|
|
133
|
+
for (let i = 1; i < tokens.length; i += 1) {
|
|
134
|
+
const t = tokens[i];
|
|
135
|
+
if (t === undefined)
|
|
136
|
+
break;
|
|
137
|
+
if (t === "-")
|
|
138
|
+
return null;
|
|
139
|
+
if (t.startsWith("-"))
|
|
140
|
+
continue;
|
|
141
|
+
return stripSurroundingQuotes(t);
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Strip one layer of surrounding double or single quotes from `token`, or
|
|
147
|
+
* return it unchanged if it is not fully wrapped in a matching pair. Does
|
|
148
|
+
* NOT attempt any other shell-quoting semantics (no backslash-escape
|
|
149
|
+
* handling, no nested-quote handling) — this is a narrow normalization so a
|
|
150
|
+
* simple quoted literal reads the same as its unquoted form, not a shell
|
|
151
|
+
* parser.
|
|
152
|
+
*/
|
|
153
|
+
function stripSurroundingQuotes(token) {
|
|
154
|
+
if (token.length >= 2 &&
|
|
155
|
+
((token.startsWith('"') && token.endsWith('"')) ||
|
|
156
|
+
(token.startsWith("'") && token.endsWith("'")))) {
|
|
157
|
+
return token.slice(1, -1);
|
|
158
|
+
}
|
|
159
|
+
return token;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Characters/sequences that make a `cd` destination token something
|
|
163
|
+
* `path.resolve` cannot literally evaluate: quoting (`"`, `'` — the residual
|
|
164
|
+
* case after `stripSurroundingQuotes` has already removed a clean single
|
|
165
|
+
* layer, e.g. an unbalanced or embedded quote), env-var expansion (`$`),
|
|
166
|
+
* home-directory expansion (`~`), shell globbing (`*`, `?`, `[`), and brace
|
|
167
|
+
* expansion (`{`, `}`, `,`). `path.resolve` treats the raw token as a
|
|
168
|
+
* literal path segment, so `cd "$SOLUTION_VERDICT_DIR"`, `cd
|
|
169
|
+
* ~/.../solution-verdicts`, or `cd <parent>/{solution-verdicts,x}` all
|
|
170
|
+
* resolve to a nonsense path that is never "inside" the dir even though a
|
|
171
|
+
* real shell would expand each of them TO (or, for the brace form, INTO)
|
|
172
|
+
* the dir. A `cd` target containing any of these must therefore NOT take
|
|
173
|
+
* the read-only fast path in `evaluateWriteGuard`: control must fall
|
|
174
|
+
* through to the same `bashReferencesVerdictDir` text-reference check any
|
|
175
|
+
* other non-read-only Bash command goes through, which DOES recognize
|
|
176
|
+
* these spellings (the env-var token, the `agent-grounding/solution-verdicts`
|
|
177
|
+
* tail, and — after the matching widening in
|
|
178
|
+
* `solution-acceptance-runtime.ts`'s glob-metacharacter test — glob- and
|
|
179
|
+
* brace-obscured leaf words).
|
|
180
|
+
*
|
|
181
|
+
* This list is enumerated, not exhaustive: it is exactly the expansion
|
|
182
|
+
* classes this check has been reasoned about, not a claim that every way a
|
|
183
|
+
* shell can rewrite a `cd` argument is covered. A known-open residual
|
|
184
|
+
* (pre-existing, not introduced by this check) is backslash escaping — see
|
|
185
|
+
* the module header's "Known-open residual" note.
|
|
186
|
+
*/
|
|
187
|
+
const CD_TARGET_UNRESOLVABLE_CHARS = /[$~*?[{},"']/;
|
|
63
188
|
/**
|
|
64
189
|
* Pure write-guard decision for a tool event. Exported for direct unit
|
|
65
190
|
* testing of the full forge-attempt matrix without spinning up the CLI.
|
|
@@ -100,7 +225,28 @@ export function evaluateWriteGuard(toolName, toolInput, dir, cwd) {
|
|
|
100
225
|
const command = bashCommandOf(toolInput);
|
|
101
226
|
if (command === "")
|
|
102
227
|
return { blocked: false, reason: "empty Bash command" };
|
|
103
|
-
|
|
228
|
+
// Defense-in-depth, ahead of the read-only fast path below: `cd` itself
|
|
229
|
+
// cannot write, but `cd`ing into the verdict dir is the setup half of a
|
|
230
|
+
// two-call forge (see the module header). Only a RESOLVED-path check
|
|
231
|
+
// (via the shared `isInsideDir`, not a substring match) so a sibling
|
|
232
|
+
// that merely shares a text prefix with the dir (`solution-verdicts-decoy`,
|
|
233
|
+
// or a parent directory of it) is not wrongly flagged.
|
|
234
|
+
const cdTarget = cdTargetArgument(command);
|
|
235
|
+
if (cdTarget !== null && isInsideDir(cdTarget, dir, cwd)) {
|
|
236
|
+
return {
|
|
237
|
+
blocked: true,
|
|
238
|
+
reason: `cd targets the harness-protected solution-verdict dir (${dir}); stepping into it would set up a later un-chained relative write to forge the verdict marker`,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
// A `cd` target containing one of the enumerated unresolvable
|
|
242
|
+
// expansions (see `CD_TARGET_UNRESOLVABLE_CHARS`'s docstring for the
|
|
243
|
+
// exact list and its non-exhaustive scope) must not take `cd`'s
|
|
244
|
+
// read-only fast path below: without this, `cd "$SOLUTION_VERDICT_DIR"`
|
|
245
|
+
// etc. would be waved through by `isReadOnlyBashCommand` (true for ANY
|
|
246
|
+
// `cd`, per the shared read-only-bash floor) before ever reaching the
|
|
247
|
+
// reference check that recognizes these exact spellings.
|
|
248
|
+
const cdTargetUnresolvable = cdTarget !== null && CD_TARGET_UNRESOLVABLE_CHARS.test(cdTarget);
|
|
249
|
+
if (!cdTargetUnresolvable && isReadOnlyBashCommand(command)) {
|
|
104
250
|
return { blocked: false, reason: "read-only Bash command" };
|
|
105
251
|
}
|
|
106
252
|
if (isInsideDir(".", dir, cwd)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-solution-acceptance-writeguard.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-solution-acceptance-writeguard.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,sEAAsE;AACtE,EAAE;AACF,0EAA0E;AAC1E,iEAAiE;AACjE,yEAAyE;AACzE,8EAA8E;AAC9E,2EAA2E;AAC3E,yEAAyE;AACzE,0EAA0E;AAC1E,EAAE;AACF,0CAA0C;AAC1C,yEAAyE;AACzE,8BAA8B;AAC9B,uEAAuE;AACvE,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,kEAAkE;AAClE,EAAE;AACF,8EAA8E;AAC9E,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,6EAA6E;AAC7E,8EAA8E;AAC9E,yCAAyC;AACzC,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,oEAAoE;AACpE,
|
|
1
|
+
{"version":3,"file":"hook-solution-acceptance-writeguard.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-solution-acceptance-writeguard.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,10 +43,40 @@
|
|
|
43
43
|
// Disable knob: `STAY_IN_SCOPE_DISABLED=1` short-circuits to no-op AFTER
|
|
44
44
|
// pause-sentinel evaluation, so an operator who pauses harness still
|
|
45
45
|
// sees the standard pause notice instead of stay-in-scope's silence.
|
|
46
|
+
//
|
|
47
|
+
// Codex parity (task cf4cdc93): this hook is now also wired on the
|
|
48
|
+
// Codex adapter (`understanding-before-execution.ts`, `runtime ===
|
|
49
|
+
// "codex"` branch), reusing this exact command — no Codex-specific CLI
|
|
50
|
+
// verb is needed. The tool-name watch-list check is alias-aware
|
|
51
|
+
// (`toolNameMatchesAny`, not a raw `.includes`): a Codex session can
|
|
52
|
+
// emit an MCP tool name in a variant form for the identical tool
|
|
53
|
+
// (server hyphen/underscore swap, the `mcp__server__.tool` dotted
|
|
54
|
+
// form), and the emitted Codex matcher is alias-EXPANDED at
|
|
55
|
+
// `harness apply` time (`expandCodexHookMatchPattern`) so the
|
|
56
|
+
// dispatcher DOES invoke this hook for a variant — a raw membership
|
|
57
|
+
// check here would then silently miss it, the exact bug class task
|
|
58
|
+
// a1348c89 fixed once already for the marker-expiry PostToolUse hook.
|
|
59
|
+
//
|
|
60
|
+
// Review finding on task cf4cdc93 (empirically confirmed, MEDIUM): the
|
|
61
|
+
// event envelope's field NAMES also vary across the tolerated Codex
|
|
62
|
+
// synonyms — `tool` as well as `tool_name`, `raw_input` as well as
|
|
63
|
+
// `tool_input` (`hook-codex-post-tool-use.ts`'s own doc comment and
|
|
64
|
+
// `docs/policy-packs/understanding-before-execution.md`'s wire-format
|
|
65
|
+
// block both document this). A payload shaped `{ tool, raw_input }`
|
|
66
|
+
// used to silently no-op here. Now mirrored via the same shared
|
|
67
|
+
// helpers (`hook-bootstrap.ts`'s `pickString` / `resolveToolInput`) the
|
|
68
|
+
// sibling `codex-post-tool-use` hook already used. This does NOT touch
|
|
69
|
+
// the `tool_response` taskId fallback below (a Claude-side convenience
|
|
70
|
+
// for the create-call shape where the task UUID is only known after
|
|
71
|
+
// the server roundtrip) — the Codex envelope may not carry
|
|
72
|
+
// `tool_response` at all, and that fallback correctly stays a no-op in
|
|
73
|
+
// that case rather than being folded into the tool_input/raw_input
|
|
74
|
+
// resolution.
|
|
46
75
|
import * as fs from "node:fs";
|
|
47
76
|
import * as path from "node:path";
|
|
48
77
|
import { resolveHomeDir } from "../../runtime/home-dir.js";
|
|
49
|
-
import {
|
|
78
|
+
import { toolNameMatchesAny } from "../../policy-packs/builtin/understanding-before-execution-runtime.js";
|
|
79
|
+
import { checkHookPause, pickString, readStdin, resolveToolInput, } from "./hook-bootstrap.js";
|
|
50
80
|
export const TOOL_NAME_TASK_CREATE = "mcp__agent-tasks__task_create";
|
|
51
81
|
export const TOOL_NAME_TASKS_CREATE = "mcp__agent-tasks__tasks_create";
|
|
52
82
|
export const TOOL_NAME_TASKS_UPDATE = "mcp__agent-tasks__tasks_update";
|
|
@@ -123,28 +153,40 @@ function extractTitle(toolInput) {
|
|
|
123
153
|
const t = toolInput["title"];
|
|
124
154
|
return typeof t === "string" && t.length > 0 ? t : null;
|
|
125
155
|
}
|
|
126
|
-
// Pull a taskId out of either the
|
|
127
|
-
//
|
|
128
|
-
//
|
|
129
|
-
//
|
|
130
|
-
|
|
156
|
+
// Pull a taskId out of either the (resolved) tool input — tool_input,
|
|
157
|
+
// with the raw_input Codex-shim fallback already applied by the caller
|
|
158
|
+
// — for tasks_update, or the tool_response (the typical create-call
|
|
159
|
+
// shape, where the task UUID is only known after the server
|
|
160
|
+
// roundtrip). Returns null when neither surface carries one.
|
|
161
|
+
//
|
|
162
|
+
// `toolResponse` is read as-is, NOT resolved through the tool_input/
|
|
163
|
+
// raw_input fallback: `tool_response` is a Claude Code convention (the
|
|
164
|
+
// MCP call's return value) that the Codex PostToolUse envelope may not
|
|
165
|
+
// carry at all (see `docs/policy-packs/understanding-before-execution.md`
|
|
166
|
+
// "Adapter notes / Codex" — the documented Codex envelope names
|
|
167
|
+
// `tool_response` nowhere). Folding it into the same resolution as the
|
|
168
|
+
// tool_input/raw_input synonym pair would be wrong: a Codex event
|
|
169
|
+
// simply has no equivalent field, so this half of the fallback
|
|
170
|
+
// correctly stays a no-op there rather than being widened to "resolve
|
|
171
|
+
// from something else".
|
|
172
|
+
function extractTaskId(toolInput, toolResponse) {
|
|
131
173
|
const fromInput = (() => {
|
|
132
|
-
if (typeof
|
|
133
|
-
|
|
134
|
-
Array.isArray(
|
|
174
|
+
if (typeof toolInput !== "object" ||
|
|
175
|
+
toolInput === null ||
|
|
176
|
+
Array.isArray(toolInput)) {
|
|
135
177
|
return null;
|
|
136
178
|
}
|
|
137
|
-
const tid =
|
|
179
|
+
const tid = toolInput["taskId"];
|
|
138
180
|
return typeof tid === "string" && tid.length > 0 ? tid : null;
|
|
139
181
|
})();
|
|
140
182
|
if (fromInput !== null)
|
|
141
183
|
return fromInput;
|
|
142
|
-
if (typeof
|
|
143
|
-
|
|
144
|
-
Array.isArray(
|
|
184
|
+
if (typeof toolResponse !== "object" ||
|
|
185
|
+
toolResponse === null ||
|
|
186
|
+
Array.isArray(toolResponse)) {
|
|
145
187
|
return null;
|
|
146
188
|
}
|
|
147
|
-
const respObj =
|
|
189
|
+
const respObj = toolResponse;
|
|
148
190
|
// The server response wraps the task under `task` for task_create and
|
|
149
191
|
// task_finish, but at the top level for some bulk verbs. Probe both
|
|
150
192
|
// shapes; fall back to null on miss.
|
|
@@ -226,18 +268,19 @@ export async function runPackHookStayInScopeCli(opts = {}) {
|
|
|
226
268
|
if (env[STAY_IN_SCOPE_DISABLED_ENV] === "1") {
|
|
227
269
|
return noop(`harness pack hook stay-in-scope: ${STAY_IN_SCOPE_DISABLED_ENV}=1, skipping`, stderr);
|
|
228
270
|
}
|
|
229
|
-
const toolName =
|
|
230
|
-
if (toolName === "" || !
|
|
271
|
+
const toolName = pickString(event.tool_name, event.tool) ?? "";
|
|
272
|
+
if (toolName === "" || !toolNameMatchesAny(toolName, STAY_IN_SCOPE_TOOLS)) {
|
|
231
273
|
return noop(`harness pack hook stay-in-scope: tool ${toolName || "(missing)"} not in watch list, skipping`, stderr);
|
|
232
274
|
}
|
|
233
|
-
const
|
|
234
|
-
const
|
|
275
|
+
const toolInput = resolveToolInput(event);
|
|
276
|
+
const labels = extractLabels(toolInput);
|
|
277
|
+
const description = extractDescription(toolInput);
|
|
235
278
|
const evaluation = evaluateMatch(labels, description);
|
|
236
279
|
if (!evaluation.matched) {
|
|
237
280
|
return noop(`harness pack hook stay-in-scope: ${toolName} payload carries no review-shaped label or description marker, skipping`, stderr);
|
|
238
281
|
}
|
|
239
|
-
const taskId = extractTaskId(event);
|
|
240
|
-
const title = extractTitle(
|
|
282
|
+
const taskId = extractTaskId(toolInput, event.tool_response);
|
|
283
|
+
const title = extractTitle(toolInput);
|
|
241
284
|
const now = (opts.now ?? new Date()).toISOString();
|
|
242
285
|
const record = {
|
|
243
286
|
ts: now,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-stay-in-scope.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-stay-in-scope.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,YAAY;AACZ,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,0EAA0E;AAC1E,yEAAyE;AACzE,+BAA+B;AAC/B,EAAE;AACF,4CAA4C;AAC5C,uEAAuE;AACvE,uEAAuE;AACvE,+DAA+D;AAC/D,sEAAsE;AACtE,wEAAwE;AACxE,wEAAwE;AACxE,uEAAuE;AACvE,mEAAmE;AACnE,kEAAkE;AAClE,EAAE;AACF,0CAA0C;AAC1C,qDAAqD;AACrD,iEAAiE;AACjE,mEAAmE;AACnE,4DAA4D;AAC5D,sEAAsE;AACtE,eAAe;AACf,EAAE;AACF,gEAAgE;AAChE,sEAAsE;AACtE,kEAAkE;AAClE,gEAAgE;AAChE,gEAAgE;AAChE,iEAAiE;AACjE,kEAAkE;AAClE,uDAAuD;AACvD,EAAE;AACF,uEAAuE;AACvE,mEAAmE;AACnE,oEAAoE;AACpE,8DAA8D;AAC9D,EAAE;AACF,yEAAyE;AACzE,qEAAqE;AACrE,qEAAqE;
|
|
1
|
+
{"version":3,"file":"hook-stay-in-scope.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-stay-in-scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,9 +30,33 @@
|
|
|
30
30
|
// specific. Operators on Linear / JIRA can ignore this hook (the
|
|
31
31
|
// matcher will never fire for them); a config-driven extension can
|
|
32
32
|
// land later if a second tasking system asks for it.
|
|
33
|
-
|
|
33
|
+
//
|
|
34
|
+
// Codex parity (task cf4cdc93): this hook is now also wired on the
|
|
35
|
+
// Codex adapter (`understanding-before-execution.ts`, `runtime ===
|
|
36
|
+
// "codex"` branch), reusing this exact command — no Codex-specific
|
|
37
|
+
// CLI verb needed. The tool-name comparisons below are alias-aware
|
|
38
|
+
// (`toolNameMatchesAny`, not raw `===`): a Codex session can emit an
|
|
39
|
+
// MCP tool name in a variant form for the identical tool (server
|
|
40
|
+
// hyphen/underscore swap, the `mcp__server__.tool` dotted form), and
|
|
41
|
+
// the emitted Codex matcher is alias-EXPANDED at `harness apply` time
|
|
42
|
+
// (`expandCodexHookMatchPattern`) so the dispatcher DOES invoke this
|
|
43
|
+
// hook for a variant — a raw `===` here would then silently miss it,
|
|
44
|
+
// the exact bug class task a1348c89 fixed once already for the
|
|
45
|
+
// marker-expiry PostToolUse hook.
|
|
46
|
+
//
|
|
47
|
+
// Review finding on task cf4cdc93 (empirically confirmed, MEDIUM): the
|
|
48
|
+
// event envelope's field NAMES also vary across the tolerated Codex
|
|
49
|
+
// synonyms — `tool` as well as `tool_name`, `raw_input` as well as
|
|
50
|
+
// `tool_input` (`hook-codex-post-tool-use.ts`'s own doc comment and
|
|
51
|
+
// `docs/policy-packs/understanding-before-execution.md`'s wire-format
|
|
52
|
+
// block both document this). A payload shaped `{ tool, raw_input }`
|
|
53
|
+
// (or any mix) used to silently no-op here while the sibling
|
|
54
|
+
// `codex-post-tool-use` hook already handled it via its own
|
|
55
|
+
// `pickString(event.tool_name, event.tool)` / `resolveToolInput`. Now
|
|
56
|
+
// mirrored via the same shared helpers (`hook-bootstrap.ts`).
|
|
57
|
+
import { clearActiveClaim, toolNameMatchesAny, writeActiveClaim, } from "../../policy-packs/builtin/understanding-before-execution-runtime.js";
|
|
34
58
|
import { resolveGeneratedDir } from "../../runtime/pending-approval.js";
|
|
35
|
-
import { checkHookPause, loadManifestOrInjected, readStdin, } from "./hook-bootstrap.js";
|
|
59
|
+
import { checkHookPause, loadManifestOrInjected, pickString, readStdin, resolveToolInput, } from "./hook-bootstrap.js";
|
|
36
60
|
const PACK_NAME = "understanding-before-execution";
|
|
37
61
|
export const TOOL_NAME_TASK_START = "mcp__agent-tasks__task_start";
|
|
38
62
|
export const TOOL_NAME_TASK_FINISH = "mcp__agent-tasks__task_finish";
|
|
@@ -97,7 +121,7 @@ export async function runPackHookTrackActiveClaimCli(opts = {}) {
|
|
|
97
121
|
if (checkHookPause("track-active-claim", stderr, opts, opts.generatedDir).paused) {
|
|
98
122
|
return noop("harness paused; track-active-claim skipping without evaluating.", stderr);
|
|
99
123
|
}
|
|
100
|
-
const toolName =
|
|
124
|
+
const toolName = pickString(event.tool_name, event.tool) ?? "";
|
|
101
125
|
if (toolName === "") {
|
|
102
126
|
return noop("harness pack hook track-active-claim: missing tool_name, skipping", stderr);
|
|
103
127
|
}
|
|
@@ -129,8 +153,9 @@ export async function runPackHookTrackActiveClaimCli(opts = {}) {
|
|
|
129
153
|
if (generatedDir === undefined) {
|
|
130
154
|
return noop("harness pack hook track-active-claim: generatedDir unresolvable, skipping", stderr);
|
|
131
155
|
}
|
|
132
|
-
const
|
|
133
|
-
|
|
156
|
+
const toolInput = resolveToolInput(event);
|
|
157
|
+
const taskId = extractTaskId(toolInput);
|
|
158
|
+
if (toolNameMatchesAny(toolName, [TOOL_NAME_TASK_START])) {
|
|
134
159
|
if (taskId === "") {
|
|
135
160
|
return noop(`harness pack hook track-active-claim: task_start without tool_input.taskId, skipping`, stderr);
|
|
136
161
|
}
|
|
@@ -150,8 +175,7 @@ export async function runPackHookTrackActiveClaimCli(opts = {}) {
|
|
|
150
175
|
diagnostic,
|
|
151
176
|
};
|
|
152
177
|
}
|
|
153
|
-
if (toolName
|
|
154
|
-
toolName === TOOL_NAME_TASK_ABANDON) {
|
|
178
|
+
if (toolNameMatchesAny(toolName, [TOOL_NAME_TASK_FINISH, TOOL_NAME_TASK_ABANDON])) {
|
|
155
179
|
clearActiveClaim(generatedDir);
|
|
156
180
|
const diagnostic = `harness pack hook track-active-claim: cleared active-claim after ${toolName}`;
|
|
157
181
|
stderr.write(`${diagnostic}\n`);
|
|
@@ -163,8 +187,8 @@ export async function runPackHookTrackActiveClaimCli(opts = {}) {
|
|
|
163
187
|
diagnostic,
|
|
164
188
|
};
|
|
165
189
|
}
|
|
166
|
-
if (toolName
|
|
167
|
-
const status = extractStatus(
|
|
190
|
+
if (toolNameMatchesAny(toolName, [TOOL_NAME_TASKS_TRANSITION])) {
|
|
191
|
+
const status = extractStatus(toolInput);
|
|
168
192
|
if (!TASKS_TRANSITION_CLEAR_STATUSES.has(status)) {
|
|
169
193
|
// open / in_progress / review keep the work claim per v2 semantics
|
|
170
194
|
// (see task_finish docs). Malformed / missing status also falls
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-track-active-claim.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-track-active-claim.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,+DAA+D;AAC/D,gDAAgD;AAChD,iEAAiE;AACjE,qEAAqE;AACrE,kEAAkE;AAClE,4DAA4D;AAC5D,EAAE;AACF,kBAAkB;AAClB,sEAAsE;AACtE,yCAAyC;AACzC,yEAAyE;AACzE,sCAAsC;AACtC,EAAE;AACF,uEAAuE;AACvE,kEAAkE;AAClE,qEAAqE;AACrE,qEAAqE;AACrE,qEAAqE;AACrE,oEAAoE;AACpE,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,mEAAmE;AACnE,mEAAmE;AACnE,mDAAmD;AACnD,EAAE;AACF,mEAAmE;AACnE,iEAAiE;AACjE,mEAAmE;AACnE,qDAAqD;
|
|
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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"}
|
package/dist/cli/pack/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { packAdd, type PackAddOptions, type PackAddResult } from "./add.js";
|
|
2
2
|
export { packRemove, type PackRemoveOptions, type PackRemoveResult } from "./remove.js";
|
|
3
3
|
export { packList, type PackListOptions, type PackListResult } from "./list.js";
|
|
4
|
-
export {
|
|
4
|
+
export { packReseed, type PackReseedField, type PackReseedOptions, type PackReseedResult, } from "./reseed.js";
|
|
5
|
+
export { applyPackAdd, applyPackRemove, applyPackReseedUx, planPackRemove, type PackAddEntry, type PackReseedFields, type PackRemovePlan, } from "./mutate.js";
|
package/dist/cli/pack/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { packAdd } from "./add.js";
|
|
2
2
|
export { packRemove } from "./remove.js";
|
|
3
3
|
export { packList } from "./list.js";
|
|
4
|
-
export {
|
|
4
|
+
export { packReseed, } from "./reseed.js";
|
|
5
|
+
export { applyPackAdd, applyPackRemove, applyPackReseedUx, planPackRemove, } from "./mutate.js";
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/pack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2C,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAiD,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,QAAQ,EAA6C,MAAM,WAAW,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,eAAe,EACf,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/pack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2C,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAiD,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,QAAQ,EAA6C,MAAM,WAAW,CAAC;AAChF,OAAO,EACL,UAAU,GAIX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,cAAc,GAIf,MAAM,aAAa,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PolicyUx, Producer } from "../../schema/index.js";
|
|
1
2
|
export interface PackAddEntry {
|
|
2
3
|
name: string;
|
|
3
4
|
source?: string;
|
|
@@ -11,4 +12,22 @@ export interface PackRemovePlan {
|
|
|
11
12
|
}
|
|
12
13
|
export declare function applyPackAdd(yamlText: string, entry: PackAddEntry): string;
|
|
13
14
|
export declare function planPackRemove(yamlText: string, name: string): PackRemovePlan;
|
|
15
|
+
export interface PackReseedFields {
|
|
16
|
+
/** Present when the pack has a canonical shipped `config.ux`. */
|
|
17
|
+
ux?: PolicyUx;
|
|
18
|
+
/** Present when the pack has a canonical shipped `config.producers`. */
|
|
19
|
+
producers?: Producer[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Overwrite `policy_packs[<name>].config.ux` (and `.config.producers`,
|
|
23
|
+
* when supplied) with the given shipped-template values, leaving every
|
|
24
|
+
* other key in the entry — including sibling `config:` keys like `mode`
|
|
25
|
+
* or `approval_lifecycle` — untouched. Used by `harness pack reseed`
|
|
26
|
+
* (task 68b9ad9c) to pull a wording fix into an already-installed
|
|
27
|
+
* manifest without clobbering the operator's other customisations.
|
|
28
|
+
* `doc.setIn` creates the intermediate `config:` map when the entry
|
|
29
|
+
* doesn't have one yet (verified: an entry with no `config:` key at all
|
|
30
|
+
* round-trips to a freshly-created `config: { ux: ... }` block).
|
|
31
|
+
*/
|
|
32
|
+
export declare function applyPackReseedUx(yamlText: string, name: string, fields: PackReseedFields): string;
|
|
14
33
|
export declare function applyPackRemove(yamlText: string, name: string): string;
|
package/dist/cli/pack/mutate.js
CHANGED
|
@@ -53,6 +53,44 @@ export function planPackRemove(yamlText, name) {
|
|
|
53
53
|
}
|
|
54
54
|
return { found, availableNames: names };
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Overwrite `policy_packs[<name>].config.ux` (and `.config.producers`,
|
|
58
|
+
* when supplied) with the given shipped-template values, leaving every
|
|
59
|
+
* other key in the entry — including sibling `config:` keys like `mode`
|
|
60
|
+
* or `approval_lifecycle` — untouched. Used by `harness pack reseed`
|
|
61
|
+
* (task 68b9ad9c) to pull a wording fix into an already-installed
|
|
62
|
+
* manifest without clobbering the operator's other customisations.
|
|
63
|
+
* `doc.setIn` creates the intermediate `config:` map when the entry
|
|
64
|
+
* doesn't have one yet (verified: an entry with no `config:` key at all
|
|
65
|
+
* round-trips to a freshly-created `config: { ux: ... }` block).
|
|
66
|
+
*/
|
|
67
|
+
export function applyPackReseedUx(yamlText, name, fields) {
|
|
68
|
+
const doc = parseDocument(yamlText);
|
|
69
|
+
const node = doc.getIn(["policy_packs"]);
|
|
70
|
+
if (!isSeq(node)) {
|
|
71
|
+
throw new Error(`expected a YAML sequence at policy_packs, got ${typeof node}`);
|
|
72
|
+
}
|
|
73
|
+
let index = -1;
|
|
74
|
+
for (let i = 0; i < node.items.length; i++) {
|
|
75
|
+
const item = node.items[i];
|
|
76
|
+
if (!isMap(item))
|
|
77
|
+
continue;
|
|
78
|
+
if (item.get("name") === name) {
|
|
79
|
+
index = i;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (index === -1) {
|
|
84
|
+
throw new Error(`policy_packs entry ${JSON.stringify(name)} not found`);
|
|
85
|
+
}
|
|
86
|
+
if (fields.ux !== undefined) {
|
|
87
|
+
doc.setIn(["policy_packs", index, "config", "ux"], fields.ux);
|
|
88
|
+
}
|
|
89
|
+
if (fields.producers !== undefined) {
|
|
90
|
+
doc.setIn(["policy_packs", index, "config", "producers"], fields.producers);
|
|
91
|
+
}
|
|
92
|
+
return doc.toString({ flowCollectionPadding: false, lineWidth: 0 });
|
|
93
|
+
}
|
|
56
94
|
export function applyPackRemove(yamlText, name) {
|
|
57
95
|
const doc = parseDocument(yamlText);
|
|
58
96
|
const node = doc.getIn(["policy_packs"]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutate.js","sourceRoot":"","sources":["../../../src/cli/pack/mutate.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,uEAAuE;AACvE,4BAA4B;AAE5B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"mutate.js","sourceRoot":"","sources":["../../../src/cli/pack/mutate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface PackReseedOptions {
|
|
2
|
+
configPath?: string;
|
|
3
|
+
homeDir?: string;
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export type PackReseedField = "ux" | "producers";
|
|
7
|
+
export interface PackReseedResult {
|
|
8
|
+
path: string;
|
|
9
|
+
name: string;
|
|
10
|
+
diff: string;
|
|
11
|
+
applied: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Fields the reseed changed (or would change, on `--dry-run`):
|
|
14
|
+
* "ux", "producers", both, or an empty array when the pack already
|
|
15
|
+
* matched the shipped template (no-op, nothing written).
|
|
16
|
+
*/
|
|
17
|
+
fieldsChanged: PackReseedField[];
|
|
18
|
+
}
|
|
19
|
+
export declare function packReseed(name: string, opts?: PackReseedOptions): Promise<PackReseedResult>;
|