@deftai/directive-runtime 0.129.4 → 0.129.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hook-dispatch.js +8 -3
- package/dist/pre-pr-run.d.ts +7 -1
- package/dist/pre-pr-run.js +25 -1
- package/dist/verify-ac.d.ts +7 -2
- package/dist/verify-ac.js +13 -5
- package/docs/scope-provenance.md +4 -0
- package/package.json +1 -1
- package/packs/skills/skills-pack-0.1.json +1 -1
- package/skills/deft-directive-release/SKILL.md +23 -0
- package/tasks/materialize.cjs +106 -5
- package/tasks/materialize.test.cjs +108 -0
- package/tasks/materialize.yml +14 -2
- package/vendor/directive-content/docs/scope-provenance.md +4 -0
- package/vendor/directive-content/packs/skills/skills-pack-0.1.json +1 -1
- package/vendor/directive-content/skills/deft-directive-release/SKILL.md +23 -0
- package/vendor/directive-content/tasks/materialize.cjs +106 -5
- package/vendor/directive-content/tasks/materialize.test.cjs +108 -0
- package/vendor/directive-content/tasks/materialize.yml +14 -2
- package/vendor/directive-core/dist/.tsbuildinfo +1 -1
- package/vendor/directive-core/dist/authz/classify.d.ts +6 -0
- package/vendor/directive-core/dist/authz/classify.d.ts.map +1 -1
- package/vendor/directive-core/dist/authz/classify.js +156 -2
- package/vendor/directive-core/dist/authz/classify.js.map +1 -1
- package/vendor/directive-core/dist/authz/evaluate.d.ts +5 -0
- package/vendor/directive-core/dist/authz/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/authz/evaluate.js +15 -5
- package/vendor/directive-core/dist/authz/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/check/cached-orchestrator.d.ts.map +1 -1
- package/vendor/directive-core/dist/check/cached-orchestrator.js +101 -2
- package/vendor/directive-core/dist/check/cached-orchestrator.js.map +1 -1
- package/vendor/directive-core/dist/check/context.d.ts +199 -0
- package/vendor/directive-core/dist/check/context.d.ts.map +1 -1
- package/vendor/directive-core/dist/check/context.js +417 -2
- package/vendor/directive-core/dist/check/context.js.map +1 -1
- package/vendor/directive-core/dist/check/gate-lists.d.ts +42 -0
- package/vendor/directive-core/dist/check/gate-lists.d.ts.map +1 -1
- package/vendor/directive-core/dist/check/gate-lists.js +226 -0
- package/vendor/directive-core/dist/check/gate-lists.js.map +1 -1
- package/vendor/directive-core/dist/check/index.d.ts +1 -0
- package/vendor/directive-core/dist/check/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/check/index.js +1 -0
- package/vendor/directive-core/dist/check/index.js.map +1 -1
- package/vendor/directive-core/dist/check/named-cause.d.ts.map +1 -1
- package/vendor/directive-core/dist/check/named-cause.js +1 -0
- package/vendor/directive-core/dist/check/named-cause.js.map +1 -1
- package/vendor/directive-core/dist/check/orchestrator.d.ts +1 -0
- package/vendor/directive-core/dist/check/orchestrator.d.ts.map +1 -1
- package/vendor/directive-core/dist/check/orchestrator.js +69 -4
- package/vendor/directive-core/dist/check/orchestrator.js.map +1 -1
- package/vendor/directive-core/dist/finish-loop/pr-finish-loop.d.ts +7 -0
- package/vendor/directive-core/dist/finish-loop/pr-finish-loop.d.ts.map +1 -1
- package/vendor/directive-core/dist/finish-loop/pr-finish-loop.js +42 -0
- package/vendor/directive-core/dist/finish-loop/pr-finish-loop.js.map +1 -1
- package/vendor/directive-core/dist/hooks/classify/host-session-identity.d.ts +15 -2
- package/vendor/directive-core/dist/hooks/classify/host-session-identity.d.ts.map +1 -1
- package/vendor/directive-core/dist/hooks/classify/host-session-identity.js +46 -5
- package/vendor/directive-core/dist/hooks/classify/host-session-identity.js.map +1 -1
- package/vendor/directive-core/dist/hooks/dispatcher.d.ts.map +1 -1
- package/vendor/directive-core/dist/hooks/dispatcher.js +61 -10
- package/vendor/directive-core/dist/hooks/dispatcher.js.map +1 -1
- package/vendor/directive-core/dist/hooks/scope.d.ts +38 -9
- package/vendor/directive-core/dist/hooks/scope.d.ts.map +1 -1
- package/vendor/directive-core/dist/hooks/scope.js +102 -16
- package/vendor/directive-core/dist/hooks/scope.js.map +1 -1
- package/vendor/directive-core/dist/install-health/cheap.d.ts +11 -0
- package/vendor/directive-core/dist/install-health/cheap.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-health/cheap.js +36 -2
- package/vendor/directive-core/dist/install-health/cheap.js.map +1 -1
- package/vendor/directive-core/dist/install-health/index.d.ts +1 -1
- package/vendor/directive-core/dist/install-health/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/install-health/index.js +1 -1
- package/vendor/directive-core/dist/install-health/index.js.map +1 -1
- package/vendor/directive-core/dist/policy/write-fence.d.ts +7 -0
- package/vendor/directive-core/dist/policy/write-fence.d.ts.map +1 -1
- package/vendor/directive-core/dist/policy/write-fence.js +81 -14
- package/vendor/directive-core/dist/policy/write-fence.js.map +1 -1
- package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts +19 -0
- package/vendor/directive-core/dist/pr-closing-keywords/main.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-closing-keywords/main.js +31 -16
- package/vendor/directive-core/dist/pr-closing-keywords/main.js.map +1 -1
- package/vendor/directive-core/dist/pr-merge-readiness/compute.d.ts +8 -0
- package/vendor/directive-core/dist/pr-merge-readiness/compute.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-merge-readiness/compute.js +54 -2
- package/vendor/directive-core/dist/pr-merge-readiness/compute.js.map +1 -1
- package/vendor/directive-core/dist/pr-merge-readiness/gh.d.ts +7 -0
- package/vendor/directive-core/dist/pr-merge-readiness/gh.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-merge-readiness/gh.js +180 -49
- package/vendor/directive-core/dist/pr-merge-readiness/gh.js.map +1 -1
- package/vendor/directive-core/dist/pr-merge-readiness/main.d.ts +2 -0
- package/vendor/directive-core/dist/pr-merge-readiness/main.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-merge-readiness/main.js +1 -0
- package/vendor/directive-core/dist/pr-merge-readiness/main.js.map +1 -1
- package/vendor/directive-core/dist/pr-monitor/monitor.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-monitor/monitor.js +1 -0
- package/vendor/directive-core/dist/pr-monitor/monitor.js.map +1 -1
- package/vendor/directive-core/dist/pr-monitor/readiness.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-monitor/readiness.js +1 -0
- package/vendor/directive-core/dist/pr-monitor/readiness.js.map +1 -1
- package/vendor/directive-core/dist/pr-monitor/types.d.ts +2 -0
- package/vendor/directive-core/dist/pr-monitor/types.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/cascade.d.ts +6 -0
- package/vendor/directive-core/dist/pr-wait-mergeable/cascade.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/cascade.js +27 -0
- package/vendor/directive-core/dist/pr-wait-mergeable/cascade.js.map +1 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/constants.d.ts +15 -0
- package/vendor/directive-core/dist/pr-wait-mergeable/constants.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/constants.js +18 -0
- package/vendor/directive-core/dist/pr-wait-mergeable/constants.js.map +1 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/index.d.ts +2 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/index.js +2 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/index.js.map +1 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/semantic-green.d.ts +81 -0
- package/vendor/directive-core/dist/pr-wait-mergeable/semantic-green.d.ts.map +1 -1
- package/vendor/directive-core/dist/pr-wait-mergeable/semantic-green.js +687 -3
- package/vendor/directive-core/dist/pr-wait-mergeable/semantic-green.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts +59 -1
- package/vendor/directive-core/dist/pre-pr-controller/controller.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/controller.js +155 -2
- package/vendor/directive-core/dist/pre-pr-controller/controller.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.d.ts +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.js +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/index.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts +7 -0
- package/vendor/directive-core/dist/pre-pr-controller/phases.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/phases.js +11 -0
- package/vendor/directive-core/dist/pre-pr-controller/phases.js.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/types.d.ts +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/types.d.ts.map +1 -1
- package/vendor/directive-core/dist/pre-pr-controller/types.js.map +1 -1
- package/vendor/directive-core/dist/preflight-gh/pre-push.d.ts.map +1 -1
- package/vendor/directive-core/dist/preflight-gh/pre-push.js +58 -2
- package/vendor/directive-core/dist/preflight-gh/pre-push.js.map +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.d.ts +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.d.ts.map +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.js +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/acceptance-resolver.js.map +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/index.d.ts +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/index.js +1 -1
- package/vendor/directive-core/dist/product-first-done-gate/index.js.map +1 -1
- package/vendor/directive-core/dist/release/pipeline.d.ts.map +1 -1
- package/vendor/directive-core/dist/release/pipeline.js +13 -1
- package/vendor/directive-core/dist/release/pipeline.js.map +1 -1
- package/vendor/directive-core/dist/release/preflight.d.ts +11 -0
- package/vendor/directive-core/dist/release/preflight.d.ts.map +1 -1
- package/vendor/directive-core/dist/release/preflight.js +65 -0
- package/vendor/directive-core/dist/release/preflight.js.map +1 -1
- package/vendor/directive-core/dist/release/types.d.ts +4 -0
- package/vendor/directive-core/dist/release/types.d.ts.map +1 -1
- package/vendor/directive-core/dist/scope/delivery-evidence.d.ts +37 -0
- package/vendor/directive-core/dist/scope/delivery-evidence.d.ts.map +1 -1
- package/vendor/directive-core/dist/scope/delivery-evidence.js +106 -6
- package/vendor/directive-core/dist/scope/delivery-evidence.js.map +1 -1
- package/vendor/directive-core/dist/scope/transition.d.ts +3 -1
- package/vendor/directive-core/dist/scope/transition.d.ts.map +1 -1
- package/vendor/directive-core/dist/scope/transition.js +4 -0
- package/vendor/directive-core/dist/scope/transition.js.map +1 -1
- package/vendor/directive-core/dist/verify-ac/evaluate.d.ts +52 -0
- package/vendor/directive-core/dist/verify-ac/evaluate.d.ts.map +1 -1
- package/vendor/directive-core/dist/verify-ac/evaluate.js +361 -1
- package/vendor/directive-core/dist/verify-ac/evaluate.js.map +1 -1
- package/vendor/directive-core/dist/verify-ac/index.d.ts +1 -1
- package/vendor/directive-core/dist/verify-ac/index.d.ts.map +1 -1
- package/vendor/directive-core/dist/verify-ac/index.js +1 -1
- package/vendor/directive-core/dist/verify-ac/index.js.map +1 -1
|
@@ -50,6 +50,12 @@ export declare function hasProtectedDestOfWriteUnknown(command: string): boolean
|
|
|
50
50
|
* realpath against an explicit payload root closes non-lexical symlink aliases.
|
|
51
51
|
*/
|
|
52
52
|
export declare function inactiveShellTargetsProtectedStore(command: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* First matched protected dest/token from the same classify/harvest routes that
|
|
55
|
+
* set protected_store (#5970 P3). Lexical dest-of-write first; #4188 realpath
|
|
56
|
+
* harvest when projectRoot is provided. Proven readers yield null.
|
|
57
|
+
*/
|
|
58
|
+
export declare function matchProtectedStoreShellDest(command: string, projectRoot?: string | null): string | null;
|
|
53
59
|
/** Re-export #2711 classifiers for composition docs/tests. */
|
|
54
60
|
export { classifyMcpTool, classifyShellCommand, listShellOps };
|
|
55
61
|
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/authz/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,YAAY,EAEb,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/authz/classify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,YAAY,EAEb,MAAM,gCAAgC,CAAC;AAKxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GACzB,cAAc,GACd,MAAM,GACN,UAAU,GACV,SAAS,GACT,iBAAiB,CAAC;AA2gGtB,+EAA+E;AAC/E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIpE;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA4BxE;AA+5CD,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAgH1E;AA+OD,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,GAAG,iBAAiB,EAAE,CAkDtB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAI9D;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAYvE;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3E;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,GAAG,IAAI,CAkEf;AAED,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { isShellTool } from "../hooks/tools.js";
|
|
15
15
|
import { classifyMcpTool, classifyShellCommand, listShellOps, } from "../policy/runtime-authority.js";
|
|
16
|
-
import { shellCommandHasPayloadRootProtectedDestAfterRealpath } from "./protected-dest-realpath.js";
|
|
16
|
+
import { resolvedDestIsPayloadRootProtected, shellCommandHasPayloadRootProtectedDestAfterRealpath, } from "./protected-dest-realpath.js";
|
|
17
17
|
/**
|
|
18
18
|
* Split on whitespace without nested quantifiers (O(n)).
|
|
19
19
|
* Newlines become `;` segment breaks so compound lists like
|
|
@@ -1488,6 +1488,49 @@ function zipShellWithoutLineContinuations(command) {
|
|
|
1488
1488
|
}
|
|
1489
1489
|
return result;
|
|
1490
1490
|
}
|
|
1491
|
+
/**
|
|
1492
|
+
* True for executable command substitution (`$(…)` / backticks) outside single
|
|
1493
|
+
* quotes. Arithmetic `$((…))` and plain `$VAR` / `${VAR}` do not qualify —
|
|
1494
|
+
* those cannot run a nested writer before the outer argv0 (#5970 P1).
|
|
1495
|
+
*/
|
|
1496
|
+
function zipShellWordHasCommandSubstitution(raw) {
|
|
1497
|
+
let quote = null;
|
|
1498
|
+
for (let i = 0; i < raw.length; i++) {
|
|
1499
|
+
const char = raw[i];
|
|
1500
|
+
if (char === "\\" && quote !== "'" && i + 1 < raw.length) {
|
|
1501
|
+
i++;
|
|
1502
|
+
continue;
|
|
1503
|
+
}
|
|
1504
|
+
if (quote === null && char === "$" && raw[i + 1] === "'") {
|
|
1505
|
+
quote = "$'";
|
|
1506
|
+
i++;
|
|
1507
|
+
continue;
|
|
1508
|
+
}
|
|
1509
|
+
if (char === "'" || char === '"') {
|
|
1510
|
+
if (quote === null)
|
|
1511
|
+
quote = char;
|
|
1512
|
+
else if (quote === "$'" && char === "'")
|
|
1513
|
+
quote = null;
|
|
1514
|
+
else if (quote === char)
|
|
1515
|
+
quote = null;
|
|
1516
|
+
continue;
|
|
1517
|
+
}
|
|
1518
|
+
if (quote === "'" || quote === "$'")
|
|
1519
|
+
continue;
|
|
1520
|
+
if (char === "`")
|
|
1521
|
+
return true;
|
|
1522
|
+
if (char === "$" && raw[i + 1] === "(" && raw[i + 2] !== "(")
|
|
1523
|
+
return true;
|
|
1524
|
+
}
|
|
1525
|
+
return false;
|
|
1526
|
+
}
|
|
1527
|
+
function argvHasCommandSubstitution(words, execIndex) {
|
|
1528
|
+
for (let i = execIndex + 1; i < words.length; i++) {
|
|
1529
|
+
if (zipShellWordHasCommandSubstitution(words[i]))
|
|
1530
|
+
return true;
|
|
1531
|
+
}
|
|
1532
|
+
return false;
|
|
1533
|
+
}
|
|
1491
1534
|
/** True for shell expansion syntax outside single quotes and not escaped. */
|
|
1492
1535
|
function zipShellWordHasExpansion(raw) {
|
|
1493
1536
|
let quote = null;
|
|
@@ -2194,6 +2237,22 @@ const READ_ONLY_PROOF_BINS = new Set([
|
|
|
2194
2237
|
"gawk",
|
|
2195
2238
|
"nawk",
|
|
2196
2239
|
]);
|
|
2240
|
+
/**
|
|
2241
|
+
* #5970 Approach1 existence probes. Sole classify carve for relative dest-of-write
|
|
2242
|
+
* and #4188 harvest (no second harvest-only skip list). test/[ ignore POSIX -o OR;
|
|
2243
|
+
* dir/Get-ChildItem still refuse sort/awk-style output-dest flags.
|
|
2244
|
+
*/
|
|
2245
|
+
const EXISTENCE_PROBE_READ_ONLY_BINS = new Set([
|
|
2246
|
+
"test-path",
|
|
2247
|
+
"test",
|
|
2248
|
+
"[",
|
|
2249
|
+
"get-item",
|
|
2250
|
+
"gi",
|
|
2251
|
+
"dir",
|
|
2252
|
+
"get-childitem",
|
|
2253
|
+
"gci",
|
|
2254
|
+
]);
|
|
2255
|
+
const EXISTENCE_PROBE_IGNORE_OUTPUT_DEST_FLAGS = new Set(["test", "["]);
|
|
2197
2256
|
const READ_ONLY_PROOF_OUTPUT_DEST_FLAGS = new Set(["-o", "--output", "--pretty-print"]);
|
|
2198
2257
|
function argvHasOutputDestFlag(words, execIndex) {
|
|
2199
2258
|
for (let i = execIndex + 1; i < words.length; i++) {
|
|
@@ -2281,6 +2340,9 @@ function isProvenReadOnlyArgv(words, execIndex) {
|
|
|
2281
2340
|
const literal = argv0Literal(words, execIndex);
|
|
2282
2341
|
if (literal === null || argv0IsPathQualified(literal))
|
|
2283
2342
|
return false;
|
|
2343
|
+
// Nested writers in argv (`$(mkfile …)` / backticks) void the reader proof (#5970 P1).
|
|
2344
|
+
if (argvHasCommandSubstitution(words, execIndex))
|
|
2345
|
+
return false;
|
|
2284
2346
|
const name = writeBinName(literal);
|
|
2285
2347
|
if (isArStyleArchiveBin(name)) {
|
|
2286
2348
|
const rawMode = words[execIndex + 1];
|
|
@@ -2290,6 +2352,14 @@ function isProvenReadOnlyArgv(words, execIndex) {
|
|
|
2290
2352
|
return (/^[abcdfilmnpqrstuvx]+$/.test(mode) &&
|
|
2291
2353
|
![...mode].some((letter) => ARCHIVE_WRITE_OPERATIONS.has(letter)));
|
|
2292
2354
|
}
|
|
2355
|
+
if (EXISTENCE_PROBE_READ_ONLY_BINS.has(name)) {
|
|
2356
|
+
// Visible refuse for nested writers (Greptile #5970 P1); also gated above.
|
|
2357
|
+
if (argvHasCommandSubstitution(words, execIndex))
|
|
2358
|
+
return false;
|
|
2359
|
+
if (EXISTENCE_PROBE_IGNORE_OUTPUT_DEST_FLAGS.has(name))
|
|
2360
|
+
return true;
|
|
2361
|
+
return !argvHasOutputDestFlag(words, execIndex);
|
|
2362
|
+
}
|
|
2293
2363
|
if (READ_ONLY_PROOF_BINS.has(name)) {
|
|
2294
2364
|
if (name === "sort" || name === "awk" || name === "gawk" || name === "nawk") {
|
|
2295
2365
|
return !argvHasOutputDestFlag(words, execIndex);
|
|
@@ -4729,7 +4799,11 @@ function isCargoArgv0(name) {
|
|
|
4729
4799
|
const EMPTY_OPS_DEST_ASSIGNMENT_KEYS = new Set(["of"]);
|
|
4730
4800
|
function emptyOpsSegmentIsReadShaped(tokens, index) {
|
|
4731
4801
|
const first = firstCommandBin(segmentSliceAround(tokens, index));
|
|
4732
|
-
|
|
4802
|
+
// #5970: POSIX test/[ use -f/-o as predicates, not EMPTY_OPS_DEST_FLAGS writers.
|
|
4803
|
+
// dir/Get-ChildItem stay off this carve so -o/--output dest plants still deny.
|
|
4804
|
+
return (READ_SHAPED_FILE_FLAG_BINS.has(first) ||
|
|
4805
|
+
DEST_ASSIGNMENT_NON_WRITER_FIRST_BINS.has(first) ||
|
|
4806
|
+
EXISTENCE_PROBE_IGNORE_OUTPUT_DEST_FLAGS.has(first));
|
|
4733
4807
|
}
|
|
4734
4808
|
function destFlagOperandIsProtectedSettings(tokens) {
|
|
4735
4809
|
for (let i = 0; i < tokens.length; i++) {
|
|
@@ -4892,6 +4966,86 @@ export function hasProtectedDestOfWriteUnknown(command) {
|
|
|
4892
4966
|
export function inactiveShellTargetsProtectedStore(command) {
|
|
4893
4967
|
return hasAuthzDirShellWrite(command) || hasProtectedDestOfWriteUnknown(command);
|
|
4894
4968
|
}
|
|
4969
|
+
/**
|
|
4970
|
+
* First matched protected dest/token from the same classify/harvest routes that
|
|
4971
|
+
* set protected_store (#5970 P3). Lexical dest-of-write first; #4188 realpath
|
|
4972
|
+
* harvest when projectRoot is provided. Proven readers yield null.
|
|
4973
|
+
*/
|
|
4974
|
+
export function matchProtectedStoreShellDest(command, projectRoot) {
|
|
4975
|
+
const cmd = command.trim();
|
|
4976
|
+
if (cmd.length === 0)
|
|
4977
|
+
return null;
|
|
4978
|
+
for (const segment of zipStyleCommandSegments(cmd)) {
|
|
4979
|
+
if (isProvenReadOnlyArgv(segment.words, segment.execIndex))
|
|
4980
|
+
continue;
|
|
4981
|
+
const jarDest = jarCreateArchiveDest(segment.words, segment.execIndex);
|
|
4982
|
+
if (jarDest !== null && isRelativePayloadProtectedDest(jarDest))
|
|
4983
|
+
return jarDest;
|
|
4984
|
+
const archiveDest = firstArchiveOperandDest(segment.words, segment.execIndex);
|
|
4985
|
+
if (archiveDest !== null && isRelativePayloadProtectedDest(archiveDest))
|
|
4986
|
+
return archiveDest;
|
|
4987
|
+
for (const doubleColonDest of doubleColonCreateArchiveDests(segment.words, segment.execIndex)) {
|
|
4988
|
+
if (isRelativePayloadProtectedDest(doubleColonDest))
|
|
4989
|
+
return doubleColonDest;
|
|
4990
|
+
}
|
|
4991
|
+
for (const dest of harvestInterpreterPayloadDests(segment.words, segment.execIndex)) {
|
|
4992
|
+
if (isRelativePayloadProtectedDest(dest))
|
|
4993
|
+
return dest;
|
|
4994
|
+
}
|
|
4995
|
+
const name = argv0BareName(segment.words, segment.execIndex);
|
|
4996
|
+
if (name !== null) {
|
|
4997
|
+
for (const dest of harvestUnknownDestFlagValues(segment.words, segment.execIndex, name)) {
|
|
4998
|
+
if (isRelativePayloadProtectedDest(dest))
|
|
4999
|
+
return dest;
|
|
5000
|
+
}
|
|
5001
|
+
}
|
|
5002
|
+
const last = lastDestOfWritePositional(segment.words, segment.execIndex);
|
|
5003
|
+
if (last !== null && isRelativePayloadProtectedDest(last)) {
|
|
5004
|
+
const lit = zipShellWordLiteral(last);
|
|
5005
|
+
return lit ?? last;
|
|
5006
|
+
}
|
|
5007
|
+
}
|
|
5008
|
+
const tokens = shellTokens(cmd);
|
|
5009
|
+
if (hasWriteShapedProtectedSettingsDest(cmd, tokens)) {
|
|
5010
|
+
// Prefer redirect destinations over earlier read operands (#5970 P2).
|
|
5011
|
+
for (let i = 0; i < cmd.length; i++) {
|
|
5012
|
+
if (cmd[i] !== ">")
|
|
5013
|
+
continue;
|
|
5014
|
+
const dest = redirectDestSlice(cmd.toLowerCase().replace(/\\/g, "/"), i).trim();
|
|
5015
|
+
if (dest.length > 0 && pathishIsProtectedMutationDest(dest))
|
|
5016
|
+
return dest;
|
|
5017
|
+
}
|
|
5018
|
+
for (const raw of tokens) {
|
|
5019
|
+
const pathish = pathishToken(raw);
|
|
5020
|
+
if (pathishIsProtectedMutationDest(pathish))
|
|
5021
|
+
return pathish;
|
|
5022
|
+
}
|
|
5023
|
+
}
|
|
5024
|
+
if (commandHasAuthzDirShellWrite(cmd, tokens)) {
|
|
5025
|
+
for (const raw of tokens) {
|
|
5026
|
+
const pathish = pathishToken(raw);
|
|
5027
|
+
if (pathishIsAuthzDir(pathish) || pathishIsApprovedScopeDir(pathish))
|
|
5028
|
+
return pathish;
|
|
5029
|
+
}
|
|
5030
|
+
}
|
|
5031
|
+
if (hasKillSwitchShellWrite(cmd, tokens)) {
|
|
5032
|
+
for (const raw of tokens) {
|
|
5033
|
+
const pathish = pathishToken(raw);
|
|
5034
|
+
if (pathishMentionsKillSwitch(pathish))
|
|
5035
|
+
return pathish;
|
|
5036
|
+
}
|
|
5037
|
+
}
|
|
5038
|
+
const harvestRoot = (projectRoot ?? "").trim();
|
|
5039
|
+
if (harvestRoot.length > 0) {
|
|
5040
|
+
for (const dest of harvestDestsOfWriteForRealpath(cmd)) {
|
|
5041
|
+
if (destLiteralIsRelativeProtected(dest))
|
|
5042
|
+
continue;
|
|
5043
|
+
if (resolvedDestIsPayloadRootProtected(harvestRoot, dest))
|
|
5044
|
+
return dest;
|
|
5045
|
+
}
|
|
5046
|
+
}
|
|
5047
|
+
return null;
|
|
5048
|
+
}
|
|
4895
5049
|
/** Re-export #2711 classifiers for composition docs/tests. */
|
|
4896
5050
|
export { classifyMcpTool, classifyShellCommand, listShellOps };
|
|
4897
5051
|
//# sourceMappingURL=classify.js.map
|