@jeger-ai/opengantry 3.7.1 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/cli/commands/cage.d.ts +10 -1
- package/dist/cli/commands/cage.d.ts.map +1 -1
- package/dist/cli/commands/cage.js +44 -7
- package/dist/cli/commands/cage.js.map +1 -1
- package/dist/cli/lib/cage/cage-config.d.ts +29 -0
- package/dist/cli/lib/cage/cage-config.d.ts.map +1 -0
- package/dist/cli/lib/cage/cage-config.js +143 -0
- package/dist/cli/lib/cage/cage-config.js.map +1 -0
- package/dist/cli/lib/cage/cage-push-guard.d.ts +5 -2
- package/dist/cli/lib/cage/cage-push-guard.d.ts.map +1 -1
- package/dist/cli/lib/cage/cage-push-guard.js +16 -18
- package/dist/cli/lib/cage/cage-push-guard.js.map +1 -1
- package/dist/cli/lib/cage/cage-report.d.ts +19 -1
- package/dist/cli/lib/cage/cage-report.d.ts.map +1 -1
- package/dist/cli/lib/cage/cage-report.js +16 -1
- package/dist/cli/lib/cage/cage-report.js.map +1 -1
- package/dist/cli/lib/cage/cage-revert.d.ts +1 -1
- package/dist/cli/lib/cage/cage-rules.d.ts +49 -3
- package/dist/cli/lib/cage/cage-rules.d.ts.map +1 -1
- package/dist/cli/lib/cage/cage-rules.js +145 -7
- package/dist/cli/lib/cage/cage-rules.js.map +1 -1
- package/dist/cli/lib/cage/cage-run.d.ts +7 -0
- package/dist/cli/lib/cage/cage-run.d.ts.map +1 -1
- package/dist/cli/lib/cage/cage-run.js +19 -7
- package/dist/cli/lib/cage/cage-run.js.map +1 -1
- package/dist/cli/lib/cage/cage-snapshot.d.ts +11 -0
- package/dist/cli/lib/cage/cage-snapshot.d.ts.map +1 -1
- package/dist/cli/lib/cage/cage-snapshot.js +60 -18
- package/dist/cli/lib/cage/cage-snapshot.js.map +1 -1
- package/dist/cli/lib/cage/cage-suggest.d.ts +28 -0
- package/dist/cli/lib/cage/cage-suggest.d.ts.map +1 -0
- package/dist/cli/lib/cage/cage-suggest.js +164 -0
- package/dist/cli/lib/cage/cage-suggest.js.map +1 -0
- package/dist/cli/lib/version.gen.d.ts +1 -1
- package/dist/cli/lib/version.gen.js +1 -1
- package/dist/cli/program-cage.d.ts +9 -2
- package/dist/cli/program-cage.d.ts.map +1 -1
- package/dist/cli/program-cage.js +40 -6
- package/dist/cli/program-cage.js.map +1 -1
- package/package.json +1 -1
- package/templates/.gitagent/foreman/SUBSTRATE.version.json +1 -1
- package/templates/integrations/compatibility.json +1 -1
|
@@ -1,24 +1,70 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Zero-config protected set for `gantry cage`. Paths are matched without any
|
|
3
|
-
* manifest; manifest `forbidden_zones`
|
|
3
|
+
* manifest; manifest `forbidden_zones` and `.cage.yaml` `protect:` entries are
|
|
4
|
+
* unioned in when present. Nothing in the repo can remove a built-in rule.
|
|
4
5
|
*/
|
|
5
|
-
export type CageRuleId = "ci_config" | "secrets" | "git_control" | "lockfile" | "manifest_forbidden_zone";
|
|
6
|
+
export type CageRuleId = "ci_config" | "secrets" | "git_control" | "lockfile" | "cage_config" | "manifest_forbidden_zone" | "cage_protect";
|
|
7
|
+
/** Where a rule comes from: shipped with cage, the GXT manifest, or the project's `.cage.yaml`. */
|
|
8
|
+
export type CageRuleSource = "builtin" | "manifest" | "cage_yaml";
|
|
6
9
|
/** `revert`: restore baseline bytes and fail. `report`: list the change but keep it. */
|
|
7
10
|
export type CageRuleMode = "revert" | "report";
|
|
8
11
|
export declare const CAGE_RULE_MODES: Readonly<Record<CageRuleId, CageRuleMode>>;
|
|
12
|
+
export declare function cageRuleSource(rule: CageRuleId): CageRuleSource;
|
|
9
13
|
/** Directory names skipped by the whole-tree basename scan (dependency and VCS bulk). */
|
|
10
14
|
export declare const CAGE_SCAN_SKIP_DIRS: ReadonlySet<string>;
|
|
11
15
|
/** A file or directory tree protected by absolute path. */
|
|
12
16
|
export interface CageTarget {
|
|
13
17
|
abs: string;
|
|
14
18
|
rule: CageRuleId;
|
|
19
|
+
mode: CageRuleMode;
|
|
20
|
+
source: CageRuleSource;
|
|
21
|
+
}
|
|
22
|
+
/** A `.cage.yaml` glob, matched against root-relative POSIX paths found by the whole-tree scan. */
|
|
23
|
+
export interface CageGlobTarget {
|
|
24
|
+
pattern: string;
|
|
25
|
+
re: RegExp;
|
|
26
|
+
mode: CageRuleMode;
|
|
27
|
+
source: "cage_yaml";
|
|
15
28
|
}
|
|
16
29
|
export interface CagePlan {
|
|
17
30
|
root: string;
|
|
18
31
|
targets: CageTarget[];
|
|
32
|
+
globs: CageGlobTarget[];
|
|
33
|
+
/** Root-relative paths whose revert rules `--allow-override` downgraded to report. */
|
|
34
|
+
overrides: string[];
|
|
19
35
|
manifestZoneCount: number;
|
|
36
|
+
/** `committed` is null when there is no config or no git work tree. */
|
|
37
|
+
config: {
|
|
38
|
+
present: boolean;
|
|
39
|
+
entries: number;
|
|
40
|
+
committed: boolean | null;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** How one path is protected after overrides; null when no rule matches. */
|
|
44
|
+
export interface CagePathRule {
|
|
45
|
+
rule: CageRuleId;
|
|
46
|
+
mode: CageRuleMode;
|
|
47
|
+
overridden: boolean;
|
|
20
48
|
}
|
|
21
49
|
/** Rule for a file found by the whole-tree scan, keyed on its basename. */
|
|
22
50
|
export declare function cageBasenameRule(name: string): CageRuleId | null;
|
|
23
|
-
|
|
51
|
+
/**
|
|
52
|
+
* The strictest rule for a root-relative path (revert beats report), then `--allow-override`.
|
|
53
|
+
* Shared by the snapshot, override validation and the push guard so all three agree.
|
|
54
|
+
*/
|
|
55
|
+
export declare function classifyCagePath(plan: CagePlan, rel: string, opts?: {
|
|
56
|
+
overrides?: boolean;
|
|
57
|
+
}): CagePathRule | null;
|
|
58
|
+
/** Downgrade a revert rule to report when the path is overridden; harness rules never are. */
|
|
59
|
+
export declare function applyCageOverride(plan: Pick<CagePlan, "overrides">, rel: string, hit: CagePathRule | null, enabled?: boolean): CagePathRule | null;
|
|
60
|
+
/**
|
|
61
|
+
* Resolve the session's protected set. An invalid manifest, `.cage.yaml` or override throws, so cage
|
|
62
|
+
* fails closed before the wrapped command runs.
|
|
63
|
+
*/
|
|
64
|
+
export declare function buildCagePlan(root: string, opts?: {
|
|
65
|
+
overrides?: readonly string[];
|
|
66
|
+
}): CagePlan;
|
|
67
|
+
/** JSON form for the session push guard, so it checks the exact plan the session started with. */
|
|
68
|
+
export declare function serializeCagePlan(plan: CagePlan): string;
|
|
69
|
+
export declare function parseSerializedCagePlan(json: string): CagePlan;
|
|
24
70
|
//# sourceMappingURL=cage-rules.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cage-rules.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cage-rules.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-rules.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,SAAS,GACT,aAAa,GACb,UAAU,GACV,aAAa,GACb,yBAAyB,GACzB,cAAc,CAAC;AAEnB,mGAAmG;AACnG,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAElE,wFAAwF;AACxF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/C,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAUtE,CAAC;AAKF,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAI/D;AAqBD,yFAAyF;AACzF,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAMlD,CAAC;AAEH,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,sFAAsF;IACtF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;CAC1E;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAIhE;AA0DD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,YAAY,GAAG,IAAI,CAYrH;AAED,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EACjC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,GAAG,IAAI,EACxB,OAAO,UAAO,GACb,YAAY,GAAG,IAAI,CAGrB;AAmED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAAG,QAAQ,CAmBlG;AAWD,kGAAkG;AAClG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAGxD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAG9D"}
|
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { toPosixRel } from "../cli-io.js";
|
|
3
4
|
import { REL_MANIFEST } from "../constants.js";
|
|
4
5
|
import { gitRun } from "../git/git.js";
|
|
6
|
+
import { GantryUserError } from "../errors.js";
|
|
5
7
|
import { loadManifest } from "../manifest.js";
|
|
8
|
+
import { CAGE_CONFIG_FILE, cageConfigCommitted, cageGlobToRegExp, loadCageConfig, normalizeCageRelPath, } from "./cage-config.js";
|
|
6
9
|
export const CAGE_RULE_MODES = {
|
|
7
10
|
ci_config: "revert",
|
|
8
11
|
secrets: "revert",
|
|
9
12
|
git_control: "revert",
|
|
10
13
|
// Package managers legitimately rewrite lockfiles; surface the change, never undo it.
|
|
11
14
|
lockfile: "report",
|
|
15
|
+
cage_config: "revert",
|
|
12
16
|
manifest_forbidden_zone: "revert",
|
|
17
|
+
// Default only: each `.cage.yaml` entry carries its own mode.
|
|
18
|
+
cage_protect: "revert",
|
|
13
19
|
};
|
|
20
|
+
/** Rules `--allow-override` can never downgrade: they protect the harness itself. */
|
|
21
|
+
const NON_OVERRIDABLE_RULES = new Set(["git_control", "cage_config"]);
|
|
22
|
+
export function cageRuleSource(rule) {
|
|
23
|
+
if (rule === "manifest_forbidden_zone")
|
|
24
|
+
return "manifest";
|
|
25
|
+
if (rule === "cage_protect")
|
|
26
|
+
return "cage_yaml";
|
|
27
|
+
return "builtin";
|
|
28
|
+
}
|
|
14
29
|
/** Root-anchored CI paths (files or directory trees). */
|
|
15
30
|
const CI_CONFIG_PATHS = [".github/workflows", ".gitlab-ci.yml", ".circleci", "azure-pipelines.yml"];
|
|
16
31
|
const LOCKFILE_NAMES = new Set([
|
|
@@ -82,13 +97,136 @@ function manifestZoneTargets(root) {
|
|
|
82
97
|
}
|
|
83
98
|
return [...zones].sort().map((z) => rootJoin(root, z));
|
|
84
99
|
}
|
|
85
|
-
|
|
100
|
+
/** `rel` equals `base` or lies inside it. */
|
|
101
|
+
function underPath(rel, base) {
|
|
102
|
+
return rel === base || rel.startsWith(`${base}/`);
|
|
103
|
+
}
|
|
104
|
+
function targetRel(plan, t) {
|
|
105
|
+
const rel = toPosixRel(plan.root, t.abs);
|
|
106
|
+
return rel.startsWith("..") ? null : rel;
|
|
107
|
+
}
|
|
108
|
+
function stricter(a, b) {
|
|
109
|
+
return a && (a.mode === "revert" || b.mode === "report") ? a : b;
|
|
110
|
+
}
|
|
111
|
+
function isOverridden(plan, rel) {
|
|
112
|
+
return plan.overrides.some((o) => underPath(rel, o));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The strictest rule for a root-relative path (revert beats report), then `--allow-override`.
|
|
116
|
+
* Shared by the snapshot, override validation and the push guard so all three agree.
|
|
117
|
+
*/
|
|
118
|
+
export function classifyCagePath(plan, rel, opts = {}) {
|
|
119
|
+
let hit = null;
|
|
120
|
+
for (const t of plan.targets) {
|
|
121
|
+
const base = targetRel(plan, t);
|
|
122
|
+
if (base !== null && underPath(rel, base))
|
|
123
|
+
hit = stricter(hit, { rule: t.rule, mode: t.mode, overridden: false });
|
|
124
|
+
}
|
|
125
|
+
const byName = cageBasenameRule(path.posix.basename(rel));
|
|
126
|
+
if (byName)
|
|
127
|
+
hit = stricter(hit, { rule: byName, mode: CAGE_RULE_MODES[byName], overridden: false });
|
|
128
|
+
for (const g of plan.globs) {
|
|
129
|
+
if (g.re.test(rel))
|
|
130
|
+
hit = stricter(hit, { rule: "cage_protect", mode: g.mode, overridden: false });
|
|
131
|
+
}
|
|
132
|
+
return applyCageOverride(plan, rel, hit, opts.overrides !== false);
|
|
133
|
+
}
|
|
134
|
+
/** Downgrade a revert rule to report when the path is overridden; harness rules never are. */
|
|
135
|
+
export function applyCageOverride(plan, rel, hit, enabled = true) {
|
|
136
|
+
if (!enabled || !hit || hit.mode !== "revert" || NON_OVERRIDABLE_RULES.has(hit.rule))
|
|
137
|
+
return hit;
|
|
138
|
+
return isOverridden(plan, rel) ? { ...hit, mode: "report", overridden: true } : hit;
|
|
139
|
+
}
|
|
140
|
+
function overrideError(message) {
|
|
141
|
+
return new GantryUserError("GXT_CAGE_OVERRIDE_INVALID", `cage: --allow-override ${message}`, undefined, 2);
|
|
142
|
+
}
|
|
143
|
+
function overlaps(a, b) {
|
|
144
|
+
return underPath(a, b) || underPath(b, a);
|
|
145
|
+
}
|
|
146
|
+
/** Reject overrides that touch harness rules or that match no revert target; returns them normalized. */
|
|
147
|
+
function validateOverrides(plan, raw) {
|
|
148
|
+
const out = new Set();
|
|
149
|
+
for (const r of raw) {
|
|
150
|
+
const o = normalizeCageRelPath(r);
|
|
151
|
+
if (!o)
|
|
152
|
+
throw overrideError(`${r}: expected a root-relative path without ".." or a leading "/"`);
|
|
153
|
+
const harness = plan.targets.find((t) => {
|
|
154
|
+
const base = targetRel(plan, t);
|
|
155
|
+
return NON_OVERRIDABLE_RULES.has(t.rule) && base !== null && overlaps(o, base);
|
|
156
|
+
});
|
|
157
|
+
if (harness)
|
|
158
|
+
throw overrideError(`${o}: ${harness.rule} rules cannot be overridden`);
|
|
159
|
+
const direct = classifyCagePath(plan, o, { overrides: false })?.mode === "revert";
|
|
160
|
+
const parent = plan.targets.some((t) => {
|
|
161
|
+
const base = targetRel(plan, t);
|
|
162
|
+
return t.mode === "revert" && base !== null && underPath(base, o);
|
|
163
|
+
});
|
|
164
|
+
if (!direct && !parent)
|
|
165
|
+
throw overrideError(`${o}: matches no protected revert target`);
|
|
166
|
+
out.add(o);
|
|
167
|
+
}
|
|
168
|
+
return [...out].sort();
|
|
169
|
+
}
|
|
170
|
+
/** Report mode on a path a built-in rule already reverts would read as a relaxation; refuse it. */
|
|
171
|
+
function assertNoBuiltinDowngrade(plan, value) {
|
|
172
|
+
const hit = classifyCagePath(plan, value, { overrides: false });
|
|
173
|
+
if (hit && hit.mode === "revert" && cageRuleSource(hit.rule) === "builtin") {
|
|
174
|
+
throw new GantryUserError("GXT_CAGE_CONFIG_INVALID", `cage: ${CAGE_CONFIG_FILE}: mode: report on ${value} would weaken the built-in ${hit.rule} rule`, "Relax a built-in rule for one run with --allow-override <path>.", 2);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function addConfigTargets(plan, root) {
|
|
178
|
+
const config = loadCageConfig(root);
|
|
179
|
+
for (const e of config.entries) {
|
|
180
|
+
if (e.kind === "path" && e.mode === "report")
|
|
181
|
+
assertNoBuiltinDowngrade(plan, e.value);
|
|
182
|
+
if (e.kind === "path") {
|
|
183
|
+
plan.targets.push({ abs: rootJoin(root, e.value), rule: "cage_protect", mode: e.mode, source: "cage_yaml" });
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
plan.globs.push({ pattern: e.value, re: cageGlobToRegExp(e.value), mode: e.mode, source: "cage_yaml" });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
plan.config = {
|
|
190
|
+
present: config.present,
|
|
191
|
+
entries: config.entries.length,
|
|
192
|
+
committed: config.present ? cageConfigCommitted(root) : null,
|
|
193
|
+
};
|
|
194
|
+
return config.entries.length;
|
|
195
|
+
}
|
|
196
|
+
function builtinTarget(abs, rule) {
|
|
197
|
+
return { abs, rule, mode: CAGE_RULE_MODES[rule], source: cageRuleSource(rule) };
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Resolve the session's protected set. An invalid manifest, `.cage.yaml` or override throws, so cage
|
|
201
|
+
* fails closed before the wrapped command runs.
|
|
202
|
+
*/
|
|
203
|
+
export function buildCagePlan(root, opts = {}) {
|
|
86
204
|
const zones = manifestZoneTargets(root);
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
205
|
+
const plan = {
|
|
206
|
+
root,
|
|
207
|
+
targets: [
|
|
208
|
+
...CI_CONFIG_PATHS.map((rel) => builtinTarget(rootJoin(root, rel), "ci_config")),
|
|
209
|
+
...gitControlTargets(root).map((abs) => builtinTarget(abs, "git_control")),
|
|
210
|
+
// Always protected, present or not: an in-session edit is restored and a new file is removed.
|
|
211
|
+
builtinTarget(rootJoin(root, CAGE_CONFIG_FILE), "cage_config"),
|
|
212
|
+
...zones.map((abs) => builtinTarget(abs, "manifest_forbidden_zone")),
|
|
213
|
+
],
|
|
214
|
+
globs: [],
|
|
215
|
+
overrides: [],
|
|
216
|
+
manifestZoneCount: zones.length,
|
|
217
|
+
config: { present: false, entries: 0, committed: null },
|
|
218
|
+
};
|
|
219
|
+
addConfigTargets(plan, root);
|
|
220
|
+
plan.overrides = validateOverrides(plan, opts.overrides ?? []);
|
|
221
|
+
return plan;
|
|
222
|
+
}
|
|
223
|
+
/** JSON form for the session push guard, so it checks the exact plan the session started with. */
|
|
224
|
+
export function serializeCagePlan(plan) {
|
|
225
|
+
const out = { ...plan, globs: plan.globs.map((g) => ({ pattern: g.pattern, mode: g.mode, source: g.source })) };
|
|
226
|
+
return JSON.stringify(out);
|
|
227
|
+
}
|
|
228
|
+
export function parseSerializedCagePlan(json) {
|
|
229
|
+
const p = JSON.parse(json);
|
|
230
|
+
return { ...p, globs: p.globs.map((g) => ({ ...g, re: cageGlobToRegExp(g.pattern) })) };
|
|
93
231
|
}
|
|
94
232
|
//# sourceMappingURL=cage-rules.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cage-rules.js","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cage-rules.js","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,11 +15,18 @@ export interface CageRunOptions {
|
|
|
15
15
|
watchIntervalMs?: number;
|
|
16
16
|
/** Session pre-push guard for git run by the caged command (default true inside a git work tree). */
|
|
17
17
|
pushGuard?: boolean;
|
|
18
|
+
/** Root-relative paths whose revert rules are downgraded to report for this run (`--allow-override`). */
|
|
19
|
+
allowOverride?: readonly string[];
|
|
20
|
+
/** Baseline caps; defaults {@link CAGE_MAX_TARGETS} and {@link CAGE_MAX_SCAN_BYTES}. */
|
|
21
|
+
maxTargets?: number;
|
|
22
|
+
maxScanBytes?: number;
|
|
18
23
|
/** Called once before the command starts, e.g. to print where the session log is. */
|
|
19
24
|
onStart?: (info: {
|
|
20
25
|
sessionLog: string | null;
|
|
21
26
|
protectedFiles: number;
|
|
22
27
|
watch: boolean;
|
|
28
|
+
overrides: string[];
|
|
29
|
+
configCommitted: boolean | null;
|
|
23
30
|
}) => void;
|
|
24
31
|
bell?: () => void;
|
|
25
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cage-run.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-run.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cage-run.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-run.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAsBpE,iFAAiF;AACjF,eAAO,MAAM,2BAA2B,QAAkB,CAAC;AAC3D,kEAAkE;AAClE,eAAO,MAAM,4BAA4B,QAAmB,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,4FAA4F;IAC5F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qGAAqG;IACrG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yGAAyG;IACzG,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;QACvB,KAAK,EAAE,OAAO,CAAC;QACf,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;KACjC,KAAK,IAAI,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,uGAAuG;AACvG,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAkFD;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAkCvE"}
|
|
@@ -4,9 +4,10 @@ import { getRepoRoot } from "../git/git.js";
|
|
|
4
4
|
import { buildCageReport } from "./cage-report.js";
|
|
5
5
|
import { resolveCageChanges } from "./cage-revert.js";
|
|
6
6
|
import { buildCagePlan } from "./cage-rules.js";
|
|
7
|
-
import { diffCageSnapshots, takeCageSnapshot } from "./cage-snapshot.js";
|
|
7
|
+
import { CAGE_MAX_SCAN_BYTES, CAGE_MAX_TARGETS, diffCageSnapshots, takeCageSnapshot, } from "./cage-snapshot.js";
|
|
8
8
|
import { signalExitCode, spawnCaged } from "./cage-process.js";
|
|
9
9
|
import { createCagePushGuard } from "./cage-push-guard.js";
|
|
10
|
+
import { CAGE_SESSION_ENV } from "./cage-suggest.js";
|
|
10
11
|
import { CAGE_DEFAULT_WATCH_INTERVAL_MS, openCageSessionLog, startCageWatch, } from "./cage-watch.js";
|
|
11
12
|
/** Per-file in-memory snapshot cap; larger revert-mode files are detect-only. */
|
|
12
13
|
export const CAGE_DEFAULT_MAX_FILE_BYTES = 5 * 1024 * 1024;
|
|
@@ -55,13 +56,20 @@ function resolveSettings(opts) {
|
|
|
55
56
|
/** Run the command with the session log, live watcher and push guard; always tear the guard down. */
|
|
56
57
|
async function runSession(opts, s, plan, before) {
|
|
57
58
|
const log = s.watch || s.pushGuard ? openCageSessionLog() : null;
|
|
58
|
-
const guard = s.pushGuard ? createCagePushGuard(
|
|
59
|
-
opts.onStart?.({
|
|
59
|
+
const guard = s.pushGuard ? createCagePushGuard(plan, log?.path ?? null) : null;
|
|
60
|
+
opts.onStart?.({
|
|
61
|
+
sessionLog: log?.path ?? null,
|
|
62
|
+
protectedFiles: before.entries.size,
|
|
63
|
+
watch: s.watch,
|
|
64
|
+
overrides: plan.overrides,
|
|
65
|
+
configCommitted: plan.config.committed,
|
|
66
|
+
});
|
|
60
67
|
const watcher = s.watch && log
|
|
61
68
|
? startCageWatch({ plan, baseline: before, snapshotOptions: s.snap, intervalMs: s.intervalMs, log, bell: opts.bell })
|
|
62
69
|
: null;
|
|
63
70
|
try {
|
|
64
|
-
|
|
71
|
+
// The session marker lets setup-only commands (cage suggest) refuse to run inside the cage.
|
|
72
|
+
const proc = await spawnCaged(opts.command, s.cwd, { ...guard?.env, [CAGE_SESSION_ENV]: "1" });
|
|
65
73
|
return { proc, live: watcher?.stop() ?? null, log, guarded: guard !== null };
|
|
66
74
|
}
|
|
67
75
|
finally {
|
|
@@ -76,9 +84,11 @@ async function runSession(opts, s, plan, before) {
|
|
|
76
84
|
*/
|
|
77
85
|
export async function runCage(opts) {
|
|
78
86
|
const s = resolveSettings(opts);
|
|
79
|
-
// Plan before spawning: an invalid manifest
|
|
80
|
-
|
|
81
|
-
const
|
|
87
|
+
// Plan and baseline before spawning: an invalid manifest, .cage.yaml or override, or a protected set
|
|
88
|
+
// over the caps, fails closed and the command never runs.
|
|
89
|
+
const plan = buildCagePlan(s.root, { overrides: opts.allowOverride });
|
|
90
|
+
const limits = { maxTargets: opts.maxTargets ?? CAGE_MAX_TARGETS, maxScanBytes: opts.maxScanBytes ?? CAGE_MAX_SCAN_BYTES };
|
|
91
|
+
const before = takeCageSnapshot(plan, { ...s.snap, limits });
|
|
82
92
|
const { proc, live, log, guarded } = await runSession(opts, s, plan, before);
|
|
83
93
|
const after = takeCageSnapshot(plan, { ...s.snap, keepBytes: false });
|
|
84
94
|
const changes = mergeChanges(live, resolveCageChanges(diffCageSnapshots(before, after), { reportOnly: s.reportOnly }));
|
|
@@ -92,6 +102,8 @@ export async function runCage(opts) {
|
|
|
92
102
|
maxFileBytes: s.snap.maxFileBytes,
|
|
93
103
|
protectedFiles: before.entries.size,
|
|
94
104
|
manifestZones: plan.manifestZoneCount,
|
|
105
|
+
cageConfig: plan.config,
|
|
106
|
+
overrides: plan.overrides,
|
|
95
107
|
changes,
|
|
96
108
|
watch: {
|
|
97
109
|
enabled: s.watch,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cage-run.js","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAmB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAA2B,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,
|
|
1
|
+
{"version":3,"file":"cage-run.js","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { type CagePlan, type CageRuleId, type CageRuleMode } from "./cage-rules.js";
|
|
2
|
+
/** Baseline caps so an oversized or hostile protected set cannot stall the session. */
|
|
3
|
+
export declare const CAGE_MAX_TARGETS = 5000;
|
|
4
|
+
export declare const CAGE_MAX_SCAN_BYTES: number;
|
|
2
5
|
export interface CageEntry {
|
|
3
6
|
abs: string;
|
|
4
7
|
/** POSIX path relative to the cage root (may start with `../` for a linked worktree git dir). */
|
|
5
8
|
rel: string;
|
|
6
9
|
rule: CageRuleId;
|
|
7
10
|
mode: CageRuleMode;
|
|
11
|
+
/** A revert rule downgraded to report by `--allow-override`. */
|
|
12
|
+
overridden: boolean;
|
|
8
13
|
type: "file" | "symlink";
|
|
9
14
|
sha256: string;
|
|
10
15
|
size: number;
|
|
@@ -21,6 +26,11 @@ export interface CageSnapshotOptions {
|
|
|
21
26
|
keepBytes: boolean;
|
|
22
27
|
maxFileBytes: number;
|
|
23
28
|
maxTotalBytes: number;
|
|
29
|
+
/** Baseline only: abort when the protected set exceeds these caps (counts are reported). */
|
|
30
|
+
limits?: {
|
|
31
|
+
maxTargets: number;
|
|
32
|
+
maxScanBytes: number;
|
|
33
|
+
};
|
|
24
34
|
}
|
|
25
35
|
export interface CageChange {
|
|
26
36
|
abs: string;
|
|
@@ -28,6 +38,7 @@ export interface CageChange {
|
|
|
28
38
|
kind: "added" | "modified" | "deleted";
|
|
29
39
|
rule: CageRuleId;
|
|
30
40
|
mode: CageRuleMode;
|
|
41
|
+
overridden: boolean;
|
|
31
42
|
before: CageEntry | null;
|
|
32
43
|
after: CageEntry | null;
|
|
33
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cage-snapshot.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-snapshot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cage-snapshot.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-snapshot.ts"],"names":[],"mappings":"AAKA,OAAO,EAKL,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAEpD,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,iGAAiG;IACjG,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,gEAAgE;IAChE,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,4FAA4F;IAC5F,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB;AAqID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAYxF;AAOD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,UAAU,EAAE,CAezF"}
|
|
@@ -2,7 +2,11 @@ import crypto from "node:crypto";
|
|
|
2
2
|
import fs from "node:fs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { toPosixRel } from "../cli-io.js";
|
|
5
|
-
import {
|
|
5
|
+
import { GantryUserError } from "../errors.js";
|
|
6
|
+
import { CAGE_RULE_MODES, CAGE_SCAN_SKIP_DIRS, applyCageOverride, cageBasenameRule, } from "./cage-rules.js";
|
|
7
|
+
/** Baseline caps so an oversized or hostile protected set cannot stall the session. */
|
|
8
|
+
export const CAGE_MAX_TARGETS = 5000;
|
|
9
|
+
export const CAGE_MAX_SCAN_BYTES = 64 * 1024 * 1024;
|
|
6
10
|
const HASH_CHUNK_BYTES = 1024 * 1024;
|
|
7
11
|
function sha256Hex(data) {
|
|
8
12
|
return crypto.createHash("sha256").update(data).digest("hex");
|
|
@@ -23,10 +27,26 @@ function hashFileChunked(abs) {
|
|
|
23
27
|
}
|
|
24
28
|
return hash.digest("hex");
|
|
25
29
|
}
|
|
26
|
-
|
|
30
|
+
/** Past a cap, keep counting sizes (lstat only, no hashing) so the error can state the full totals. */
|
|
31
|
+
function countScan(abs, st, ctx) {
|
|
32
|
+
const limits = ctx.opts.limits;
|
|
33
|
+
if (!limits || ctx.scanned.seen.has(abs))
|
|
34
|
+
return ctx.scanned.over;
|
|
35
|
+
ctx.scanned.seen.add(abs);
|
|
36
|
+
ctx.scanned.files += 1;
|
|
37
|
+
ctx.scanned.bytes += st.isFile() ? st.size : 0;
|
|
38
|
+
if (ctx.scanned.files > limits.maxTargets || ctx.scanned.bytes > limits.maxScanBytes)
|
|
39
|
+
ctx.scanned.over = true;
|
|
40
|
+
return ctx.scanned.over;
|
|
41
|
+
}
|
|
42
|
+
function readEntry(abs, rule, ruleMode, ctx) {
|
|
27
43
|
const st = fs.lstatSync(abs);
|
|
28
|
-
|
|
29
|
-
|
|
44
|
+
if (countScan(abs, st, ctx))
|
|
45
|
+
return null;
|
|
46
|
+
const rel = toPosixRel(ctx.plan.root, abs);
|
|
47
|
+
const resolved = applyCageOverride(ctx.plan, rel, { rule, mode: ruleMode, overridden: false });
|
|
48
|
+
const mode = resolved.mode;
|
|
49
|
+
const base = { abs, rel, rule, mode, overridden: resolved.overridden, fileMode: st.mode & 0o7777 };
|
|
30
50
|
if (st.isSymbolicLink()) {
|
|
31
51
|
const target = fs.readlinkSync(abs);
|
|
32
52
|
return { ...base, type: "symlink", sha256: sha256Hex(`symlink\0${target}`), size: 0, bytes: null, linkTarget: target };
|
|
@@ -42,13 +62,13 @@ function readEntry(abs, rule, ctx) {
|
|
|
42
62
|
ctx.budget -= bytes.length;
|
|
43
63
|
return { ...base, type: "file", sha256: sha256Hex(bytes), size: bytes.length, bytes, linkTarget: null };
|
|
44
64
|
}
|
|
45
|
-
function captureEntry(abs, rule, ctx) {
|
|
65
|
+
function captureEntry(abs, rule, mode, ctx) {
|
|
46
66
|
const existing = ctx.entries.get(abs);
|
|
47
67
|
// A path matched by several rules keeps the strictest one (revert beats report).
|
|
48
|
-
if (existing && (existing.mode === "revert" ||
|
|
68
|
+
if (existing && (existing.mode === "revert" || existing.overridden || mode === "report"))
|
|
49
69
|
return;
|
|
50
70
|
try {
|
|
51
|
-
const entry = readEntry(abs, rule, ctx);
|
|
71
|
+
const entry = readEntry(abs, rule, mode, ctx);
|
|
52
72
|
if (entry)
|
|
53
73
|
ctx.entries.set(abs, entry);
|
|
54
74
|
}
|
|
@@ -76,7 +96,7 @@ function walkTree(absDir, skipDirs, visit) {
|
|
|
76
96
|
visit(child);
|
|
77
97
|
}
|
|
78
98
|
}
|
|
79
|
-
function captureTarget(abs, rule, ctx) {
|
|
99
|
+
function captureTarget(abs, rule, mode, ctx) {
|
|
80
100
|
let st;
|
|
81
101
|
try {
|
|
82
102
|
st = fs.lstatSync(abs);
|
|
@@ -85,20 +105,42 @@ function captureTarget(abs, rule, ctx) {
|
|
|
85
105
|
return;
|
|
86
106
|
}
|
|
87
107
|
if (st.isDirectory()) {
|
|
88
|
-
walkTree(abs, null, (child) => captureEntry(child, rule, ctx));
|
|
108
|
+
walkTree(abs, null, (child) => captureEntry(child, rule, mode, ctx));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
captureEntry(abs, rule, mode, ctx);
|
|
112
|
+
}
|
|
113
|
+
/** Whole-tree scan: built-in basename rules (`.env*`, lockfiles) and `.cage.yaml` globs. */
|
|
114
|
+
function captureScanned(abs, ctx) {
|
|
115
|
+
const rule = cageBasenameRule(path.basename(abs));
|
|
116
|
+
if (rule)
|
|
117
|
+
captureEntry(abs, rule, CAGE_RULE_MODES[rule], ctx);
|
|
118
|
+
if (ctx.plan.globs.length === 0)
|
|
89
119
|
return;
|
|
120
|
+
const rel = toPosixRel(ctx.plan.root, abs);
|
|
121
|
+
for (const g of ctx.plan.globs) {
|
|
122
|
+
if (g.re.test(rel))
|
|
123
|
+
captureEntry(abs, "cage_protect", g.mode, ctx);
|
|
90
124
|
}
|
|
91
|
-
|
|
125
|
+
}
|
|
126
|
+
function limitsError(ctx) {
|
|
127
|
+
const l = ctx.opts.limits;
|
|
128
|
+
const mib = (n) => (n / (1024 * 1024)).toFixed(1);
|
|
129
|
+
return new GantryUserError("GXT_CAGE_LIMITS_EXCEEDED", `cage: protected set too large: ${String(ctx.scanned.files)} file(s), ${mib(ctx.scanned.bytes)} MiB (limits ${String(l.maxTargets)} files, ${mib(l.maxScanBytes)} MiB); the command was not run`, "Narrow broad .cage.yaml or manifest forbidden_zones entries.", 2);
|
|
92
130
|
}
|
|
93
131
|
export function takeCageSnapshot(plan, opts) {
|
|
94
|
-
const ctx = {
|
|
132
|
+
const ctx = {
|
|
133
|
+
plan,
|
|
134
|
+
opts,
|
|
135
|
+
budget: opts.maxTotalBytes,
|
|
136
|
+
entries: new Map(),
|
|
137
|
+
scanned: { files: 0, bytes: 0, over: false, seen: new Set() },
|
|
138
|
+
};
|
|
95
139
|
for (const target of plan.targets)
|
|
96
|
-
captureTarget(target.abs, target.rule, ctx);
|
|
97
|
-
walkTree(plan.root, CAGE_SCAN_SKIP_DIRS, (abs) =>
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
captureEntry(abs, rule, ctx);
|
|
101
|
-
});
|
|
140
|
+
captureTarget(target.abs, target.rule, target.mode, ctx);
|
|
141
|
+
walkTree(plan.root, CAGE_SCAN_SKIP_DIRS, (abs) => captureScanned(abs, ctx));
|
|
142
|
+
if (ctx.scanned.over)
|
|
143
|
+
throw limitsError(ctx);
|
|
102
144
|
return { entries: ctx.entries };
|
|
103
145
|
}
|
|
104
146
|
function entryChanged(a, b) {
|
|
@@ -121,7 +163,7 @@ export function diffCageSnapshots(before, after) {
|
|
|
121
163
|
if (!kind)
|
|
122
164
|
continue;
|
|
123
165
|
const ref = (b ?? a);
|
|
124
|
-
changes.push({ abs, rel: ref.rel, kind, rule: ref.rule, mode: ref.mode, before: b, after: a });
|
|
166
|
+
changes.push({ abs, rel: ref.rel, kind, rule: ref.rule, mode: ref.mode, overridden: ref.overridden, before: b, after: a });
|
|
125
167
|
}
|
|
126
168
|
return changes.sort((x, y) => x.rel.localeCompare(y.rel));
|
|
127
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cage-snapshot.js","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"cage-snapshot.js","sourceRoot":"","sources":["../../../../src/cli/lib/cage/cage-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;AAEzB,uFAAuF;AACvF,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAoDpD,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAC;AAErC,SAAS,SAAS,CAAC,IAAqB;IACtC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,+EAA+E;AAC/E,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAS,CAAC;QACd,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,uGAAuG;AACvG,SAAS,SAAS,CAAC,GAAW,EAAE,EAAY,EAAE,GAAmB;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IAClE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACvB,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,YAAY;QAAE,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9G,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,IAAgB,EAAE,QAAsB,EAAE,GAAmB;IAC3F,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAE,CAAC;IAChG,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;IACnG,IAAI,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,YAAY,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACzH,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,IAAI,GACR,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC;IACvG,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/G,CAAC;IACD,mFAAmF;IACnF,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC1G,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,IAAgB,EAAE,IAAkB,EAAE,GAAmB;IAC1F,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,iFAAiF;IACjF,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,IAAI,IAAI,KAAK,QAAQ,CAAC;QAAE,OAAO;IACjG,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,IAAI,KAAK;YAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,iFAAiF;IACnF,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAoC,EAAE,KAA4B;IAClG,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,cAAc,EAAE;YAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,IAAgB,EAAE,IAAkB,EAAE,GAAmB;IAC3F,IAAI,EAAY,CAAC;IACjB,IAAI,CAAC;QACH,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IACD,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,4FAA4F;AAC5F,SAAS,cAAc,CAAC,GAAW,EAAE,GAAmB;IACtD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,IAAI,IAAI;QAAE,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACxC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAmB;IACtC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAO,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,IAAI,eAAe,CACxB,0BAA0B,EAC1B,kCAAkC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,gCAAgC,EAChM,8DAA8D,EAC9D,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAc,EAAE,IAAyB;IACxE,MAAM,GAAG,GAAmB;QAC1B,IAAI;QACJ,IAAI;QACJ,MAAM,EAAE,IAAI,CAAC,aAAa;QAC1B,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE;KAC9D,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO;QAAE,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5F,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5E,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI;QAAE,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,CAAY,EAAE,CAAY;IAC9C,iEAAiE;IACjE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAoB,EAAE,KAAmB;IACzE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QACzC,IAAI,IAAI,GAA8B,IAAI,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,IAAI,GAAG,SAAS,CAAC;aACzB,IAAI,CAAC,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,OAAO,CAAC;aAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,IAAI,GAAG,UAAU,CAAC;QACzD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7H,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|