@codyswann/lisa 4.17.5 → 4.17.7

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.
Files changed (84) hide show
  1. package/all/copy-contents/gitignore +6 -0
  2. package/dist/cli/doctor-reconciliation.d.ts +15 -0
  3. package/dist/cli/doctor-reconciliation.d.ts.map +1 -0
  4. package/dist/cli/doctor-reconciliation.js +123 -0
  5. package/dist/cli/doctor-reconciliation.js.map +1 -0
  6. package/dist/cli/doctor.d.ts.map +1 -1
  7. package/dist/cli/doctor.js +7 -0
  8. package/dist/cli/doctor.js.map +1 -1
  9. package/dist/core/lisa.d.ts.map +1 -1
  10. package/dist/core/lisa.js +15 -1
  11. package/dist/core/lisa.js.map +1 -1
  12. package/dist/core/reconciliation-report.d.ts +100 -0
  13. package/dist/core/reconciliation-report.d.ts.map +1 -0
  14. package/dist/core/reconciliation-report.js +178 -0
  15. package/dist/core/reconciliation-report.js.map +1 -0
  16. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  17. package/dist/core/upstream-evidence-manifest.js +17 -1
  18. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  19. package/dist/utils/postinstall-trampoline-report-source.d.ts +50 -0
  20. package/dist/utils/postinstall-trampoline-report-source.d.ts.map +1 -0
  21. package/dist/utils/postinstall-trampoline-report-source.js +113 -0
  22. package/dist/utils/postinstall-trampoline-report-source.js.map +1 -0
  23. package/dist/utils/postinstall-trampoline-source.d.ts +65 -0
  24. package/dist/utils/postinstall-trampoline-source.d.ts.map +1 -0
  25. package/dist/utils/postinstall-trampoline-source.js +312 -0
  26. package/dist/utils/postinstall-trampoline-source.js.map +1 -0
  27. package/dist/utils/postinstall-trampoline.d.ts +4 -2
  28. package/dist/utils/postinstall-trampoline.d.ts.map +1 -1
  29. package/dist/utils/postinstall-trampoline.js +5 -197
  30. package/dist/utils/postinstall-trampoline.js.map +1 -1
  31. package/package.json +3 -2
  32. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-agy/plugin.json +1 -1
  35. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  38. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-expo-agy/plugin.json +1 -1
  45. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  50. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  55. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  60. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  65. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-rails-agy/plugin.json +1 -1
  70. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  75. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  80. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  82. package/scripts/check-shell-guard-refusal-coverage.mjs +233 -0
  83. package/scripts/lib/shell-guard-refusal-coverage.mjs +315 -0
  84. package/scripts/lib/shell-guard-trace.mjs +256 -0
@@ -0,0 +1,100 @@
1
+ /** Directory-relative location of the report, for messages and gitignores. */
2
+ export declare const RECONCILIATION_REPORT_DISPLAY_PATH = ".lisa/reconciliation-report.json";
3
+ /**
4
+ * Report schema version. Bump only alongside a reader change — an unknown
5
+ * version is treated as no report at all rather than being misread.
6
+ */
7
+ export declare const RECONCILIATION_REPORT_SCHEMA_VERSION = 1;
8
+ /**
9
+ * What the reconciliation ended up doing.
10
+ *
11
+ * The two non-terminal values are the load-bearing ones. `scheduled` is written
12
+ * by the parent apply before the spawn; `started` is written by the detached
13
+ * child as its very first act. A report that never advances past `scheduled`
14
+ * means the child never ran; one stuck at `started` means it ran and died. Both
15
+ * used to look identical to success.
16
+ */
17
+ export type ReconciliationOutcome =
18
+ /** Parent recorded the intent; no child has reported yet. */
19
+ "scheduled"
20
+ /** The detached child is alive and waiting for the package manager to exit. */
21
+ | "started"
22
+ /** The parent apply could not spawn the child at all. */
23
+ | "spawn-failed"
24
+ /** The child gave up waiting for the package manager and deliberately did not re-apply. */
25
+ | "parent-wait-timed-out"
26
+ /** The child ran and found package.json matching its pre-apply baseline: no lockfile can be stale. */
27
+ | "not-needed"
28
+ /** Every detected lockfile was regenerated successfully. */
29
+ | "regenerated"
30
+ /** The child started but did not finish: a regen command failed, or it aborted. */
31
+ | "failed";
32
+ /** Outcomes that mean the reconciliation finished and nothing is outstanding. */
33
+ export declare const SETTLED_RECONCILIATION_OUTCOMES: readonly ReconciliationOutcome[];
34
+ /** Outcomes that mean a child has not yet reported a terminal result. */
35
+ export declare const PENDING_RECONCILIATION_OUTCOMES: readonly ReconciliationOutcome[];
36
+ /** The persisted `.lisa/reconciliation-report.json` shape. */
37
+ export interface ReconciliationReport {
38
+ readonly schema_version: number;
39
+ /** Lisa version whose apply scheduled the reconciliation. */
40
+ readonly lisa_version: string;
41
+ /** Where the reconciliation got to. */
42
+ readonly outcome: ReconciliationOutcome;
43
+ /** ISO timestamp of the parent apply that scheduled it. */
44
+ readonly scheduled_at: string;
45
+ /** ISO timestamp of the most recent write — the age that makes a stall visible. */
46
+ readonly updated_at: string;
47
+ /** Package managers whose lockfiles the child regenerated (or tried to). */
48
+ readonly package_managers: readonly string[];
49
+ /** One operator-readable sentence about this outcome. */
50
+ readonly detail: string;
51
+ }
52
+ /**
53
+ * Resolve the single path every reader and writer uses.
54
+ * @param root - Project root
55
+ * @returns Absolute path to the report
56
+ */
57
+ export declare function resolveReconciliationReportPath(root: string): string;
58
+ /**
59
+ * Read the report, returning null when it is missing, unparseable, or written
60
+ * by a schema this build does not understand.
61
+ * @param root - Project root
62
+ * @returns The report, or null when there is no usable one
63
+ */
64
+ export declare function readReconciliationReport(root: string): Promise<ReconciliationReport | null>;
65
+ /**
66
+ * Write a report.
67
+ *
68
+ * Written atomically (temp file plus rename) so a reader never sees a partial
69
+ * document, and never throws: a report that could not be written must not turn
70
+ * a successful install into a failed one. That is the same trade the apply
71
+ * receipt makes, and for the same reason — the cost of a missing record is one
72
+ * doctor blind spot, the cost of throwing here is breaking installs.
73
+ * @param root - Project root being reconciled
74
+ * @param report - The record to persist
75
+ * @returns True when the report was persisted
76
+ */
77
+ export declare function writeReconciliationReport(root: string, report: ReconciliationReport): Promise<boolean>;
78
+ /**
79
+ * Record that a reconciliation is about to be spawned.
80
+ *
81
+ * Written by the PARENT apply, before the spawn, precisely so that a spawn which
82
+ * never produces a child still leaves a trace. Without this write there is
83
+ * nothing on disk at all when the trampoline fails to launch, which is one of
84
+ * the two failure modes #2750 could not tell apart.
85
+ * @param root - Project root being reconciled
86
+ * @param lisaVersion - Lisa version running the apply
87
+ * @param now - Clock, injectable for tests
88
+ * @returns True when the report was persisted
89
+ */
90
+ export declare function recordReconciliationScheduled(root: string, lisaVersion: string, now?: () => Date): Promise<boolean>;
91
+ /**
92
+ * Record that the parent apply could not spawn the reconciliation child.
93
+ * @param root - Project root being reconciled
94
+ * @param lisaVersion - Lisa version running the apply
95
+ * @param message - The spawn error, verbatim
96
+ * @param now - Clock, injectable for tests
97
+ * @returns True when the report was persisted
98
+ */
99
+ export declare function recordReconciliationSpawnFailure(root: string, lisaVersion: string, message: string, now?: () => Date): Promise<boolean>;
100
+ //# sourceMappingURL=reconciliation-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconciliation-report.d.ts","sourceRoot":"","sources":["../../src/core/reconciliation-report.ts"],"names":[],"mappings":"AAiCA,8EAA8E;AAC9E,eAAO,MAAM,kCAAkC,qCACX,CAAC;AAErC;;;GAGG;AACH,eAAO,MAAM,oCAAoC,IAAI,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,MAAM,qBAAqB;AAC/B,6DAA6D;AAC3D,WAAW;AACb,+EAA+E;GAC7E,SAAS;AACX,yDAAyD;GACvD,cAAc;AAChB,2FAA2F;GACzF,uBAAuB;AACzB,sGAAsG;GACpG,YAAY;AACd,4DAA4D;GAC1D,aAAa;AACf,mFAAmF;GACjF,QAAQ,CAAC;AAEb,iFAAiF;AACjF,eAAO,MAAM,+BAA+B,EAAE,SAAS,qBAAqB,EAC7C,CAAC;AAEhC,yEAAyE;AACzE,eAAO,MAAM,+BAA+B,EAAE,SAAS,qBAAqB,EAClD,CAAC;AAY3B,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,4EAA4E;IAC5E,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAyBD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAuBtC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;;;;;;GAOG;AACH,wBAAsB,gCAAgC,CACpD,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,OAAO,CAAC,CAWlB"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * The durable record of what the lockfile-reconciliation trampoline actually did.
3
+ *
4
+ * `lisa apply` runs from a host project's `postinstall`, which means bun (and
5
+ * every other package manager) writes the lockfile BEFORE apply rewrites
6
+ * package.json. The detached trampoline exists to close that gap: it waits for
7
+ * the package manager to exit, re-applies, and regenerates the lockfiles.
8
+ *
9
+ * It runs with `stdio: "ignore"` — it has to, because it outlives the terminal
10
+ * that started it — and its regen step swallows failures on purpose, because a
11
+ * missing package-manager binary must never cascade into a failed install. Both
12
+ * are correct, and together they made the control indistinguishable from its own
13
+ * failure: a trampoline that never spawned, one that died on arrival, and one
14
+ * that ran and correctly did nothing all produced exactly the same evidence,
15
+ * which is none (CodySwannGT/lisa#2750). The only signal anyone could use was
16
+ * the apply receipt, and only because it happens to be written for an unrelated
17
+ * reason.
18
+ *
19
+ * So the trampoline now reports. The parent records `scheduled` before it
20
+ * spawns; the child records `started` as its first act, which is what separates
21
+ * "never spawned" from "spawned and died"; and the child records a terminal
22
+ * outcome naming what it regenerated or why it could not. A report still sitting
23
+ * at `scheduled` or `started` long after it was written is a reconciliation that
24
+ * never landed, and `lisa doctor` says so (see `cli/doctor-reconciliation`).
25
+ *
26
+ * Machine-local and gitignored for the same reason as the apply receipt: it
27
+ * describes this checkout's last install, not the project.
28
+ * @module core/reconciliation-report
29
+ */
30
+ import { mkdir, rename, writeFile } from "node:fs/promises";
31
+ import * as path from "node:path";
32
+ import { readJsonOrNull } from "../utils/json-utils.js";
33
+ /** Directory-relative location of the report, for messages and gitignores. */
34
+ export const RECONCILIATION_REPORT_DISPLAY_PATH = ".lisa/reconciliation-report.json";
35
+ /**
36
+ * Report schema version. Bump only alongside a reader change — an unknown
37
+ * version is treated as no report at all rather than being misread.
38
+ */
39
+ export const RECONCILIATION_REPORT_SCHEMA_VERSION = 1;
40
+ /** Outcomes that mean the reconciliation finished and nothing is outstanding. */
41
+ export const SETTLED_RECONCILIATION_OUTCOMES = ["not-needed", "regenerated"];
42
+ /** Outcomes that mean a child has not yet reported a terminal result. */
43
+ export const PENDING_RECONCILIATION_OUTCOMES = ["scheduled", "started"];
44
+ const KNOWN_OUTCOMES = [
45
+ "scheduled",
46
+ "started",
47
+ "spawn-failed",
48
+ "parent-wait-timed-out",
49
+ "not-needed",
50
+ "regenerated",
51
+ "failed",
52
+ ];
53
+ /**
54
+ * Narrow a persisted outcome, treating anything unrecognised as `scheduled`.
55
+ *
56
+ * Deliberately the most alarming reading rather than the most reassuring one: a
57
+ * report this build cannot interpret is exactly the case where claiming the
58
+ * reconciliation succeeded would restore the silence this file exists to end.
59
+ * @param value - Raw value from the report
60
+ * @returns A known outcome
61
+ */
62
+ function toOutcome(value) {
63
+ return KNOWN_OUTCOMES.find(outcome => outcome === value) ?? "scheduled";
64
+ }
65
+ /**
66
+ * Narrow the recorded package-manager list, dropping anything non-string.
67
+ * @param value - Raw value from the report
68
+ * @returns The recorded managers, or an empty list
69
+ */
70
+ function toPackageManagers(value) {
71
+ if (!Array.isArray(value))
72
+ return [];
73
+ return value.filter((entry) => typeof entry === "string");
74
+ }
75
+ /**
76
+ * Resolve the single path every reader and writer uses.
77
+ * @param root - Project root
78
+ * @returns Absolute path to the report
79
+ */
80
+ export function resolveReconciliationReportPath(root) {
81
+ return path.join(root, ".lisa", "reconciliation-report.json");
82
+ }
83
+ /**
84
+ * Read the report, returning null when it is missing, unparseable, or written
85
+ * by a schema this build does not understand.
86
+ * @param root - Project root
87
+ * @returns The report, or null when there is no usable one
88
+ */
89
+ export async function readReconciliationReport(root) {
90
+ const parsed = await readJsonOrNull(resolveReconciliationReportPath(root));
91
+ if (parsed?.schema_version !== RECONCILIATION_REPORT_SCHEMA_VERSION ||
92
+ typeof parsed.lisa_version !== "string" ||
93
+ typeof parsed.scheduled_at !== "string") {
94
+ return null;
95
+ }
96
+ return {
97
+ schema_version: parsed.schema_version,
98
+ lisa_version: parsed.lisa_version,
99
+ outcome: toOutcome(parsed.outcome),
100
+ scheduled_at: parsed.scheduled_at,
101
+ updated_at: typeof parsed.updated_at === "string"
102
+ ? parsed.updated_at
103
+ : parsed.scheduled_at,
104
+ package_managers: toPackageManagers(parsed.package_managers),
105
+ detail: typeof parsed.detail === "string" ? parsed.detail : "",
106
+ };
107
+ }
108
+ /**
109
+ * Write a report.
110
+ *
111
+ * Written atomically (temp file plus rename) so a reader never sees a partial
112
+ * document, and never throws: a report that could not be written must not turn
113
+ * a successful install into a failed one. That is the same trade the apply
114
+ * receipt makes, and for the same reason — the cost of a missing record is one
115
+ * doctor blind spot, the cost of throwing here is breaking installs.
116
+ * @param root - Project root being reconciled
117
+ * @param report - The record to persist
118
+ * @returns True when the report was persisted
119
+ */
120
+ export async function writeReconciliationReport(root, report) {
121
+ const reportPath = resolveReconciliationReportPath(root);
122
+ try {
123
+ await mkdir(path.dirname(reportPath), { recursive: true });
124
+ const tempPath = `${reportPath}.tmp`;
125
+ await writeFile(tempPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
126
+ await rename(tempPath, reportPath);
127
+ return true;
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
133
+ /**
134
+ * Record that a reconciliation is about to be spawned.
135
+ *
136
+ * Written by the PARENT apply, before the spawn, precisely so that a spawn which
137
+ * never produces a child still leaves a trace. Without this write there is
138
+ * nothing on disk at all when the trampoline fails to launch, which is one of
139
+ * the two failure modes #2750 could not tell apart.
140
+ * @param root - Project root being reconciled
141
+ * @param lisaVersion - Lisa version running the apply
142
+ * @param now - Clock, injectable for tests
143
+ * @returns True when the report was persisted
144
+ */
145
+ export async function recordReconciliationScheduled(root, lisaVersion, now = () => new Date()) {
146
+ const timestamp = now().toISOString();
147
+ return writeReconciliationReport(root, {
148
+ schema_version: RECONCILIATION_REPORT_SCHEMA_VERSION,
149
+ lisa_version: lisaVersion,
150
+ outcome: "scheduled",
151
+ scheduled_at: timestamp,
152
+ updated_at: timestamp,
153
+ package_managers: [],
154
+ detail: "Lisa's apply changed package.json and scheduled a detached lockfile " +
155
+ "reconciliation. Nothing has reported back yet.",
156
+ });
157
+ }
158
+ /**
159
+ * Record that the parent apply could not spawn the reconciliation child.
160
+ * @param root - Project root being reconciled
161
+ * @param lisaVersion - Lisa version running the apply
162
+ * @param message - The spawn error, verbatim
163
+ * @param now - Clock, injectable for tests
164
+ * @returns True when the report was persisted
165
+ */
166
+ export async function recordReconciliationSpawnFailure(root, lisaVersion, message, now = () => new Date()) {
167
+ const timestamp = now().toISOString();
168
+ return writeReconciliationReport(root, {
169
+ schema_version: RECONCILIATION_REPORT_SCHEMA_VERSION,
170
+ lisa_version: lisaVersion,
171
+ outcome: "spawn-failed",
172
+ scheduled_at: timestamp,
173
+ updated_at: timestamp,
174
+ package_managers: [],
175
+ detail: `Could not spawn the lockfile reconciliation: ${message}`,
176
+ });
177
+ }
178
+ //# sourceMappingURL=reconciliation-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconciliation-report.js","sourceRoot":"","sources":["../../src/core/reconciliation-report.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAs6EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAgtPjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
1
+ {"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA46EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA6tPjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -2,7 +2,7 @@
2
2
  /** Generated by scripts/generate-upstream-evidence-manifest.mjs. Do not edit. */
3
3
  export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
4
4
  "all/copy-contents/.gitattributes": "b23282f829ee514a25d8e334b31597851c1d89c1c58f119787eb4c99ecdc8407",
5
- "all/copy-contents/gitignore": "06fc4bca36fabe2abc81e60b3e3886dcb9a0eacb4ae9d670beb2125a4eb4f850",
5
+ "all/copy-contents/gitignore": "3c3ce0693a6bf0531c7e080aef16103c5cfa6aeb0f897ffaba730966c103ffb6",
6
6
  "all/copy-overwrite/scripts/check-conflict-markers.mjs": "d7a689bcc122af7f38d1c536924fc2f3dcb503b09658ffc6035ccbe720d14d6b",
7
7
  "all/copy-overwrite/scripts/check-state-classification.mjs": "a72910f9885629dd6d8a739b900f5603e4b53d68ece64100a2a5647016b58e1e",
8
8
  "all/copy-overwrite/scripts/lib/bounded-spawn.mjs": "72e277ada531914d7bc51c3cb8dc67b8881aa817d96fa2f9f4d81668a3d3bbc1",
@@ -1088,6 +1088,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1088
1088
  "scripts/check-required-check-promotions.mjs": "ae7a3d80beb98d8069af12d2d588e76f73f7a329b1f883ddbe1818bb1b5cafa9",
1089
1089
  "scripts/check-rules-pairing.sh": "4d4a0d9e8d36794a22020f419c879d7336b1c5bfe883acdcc826d26764560c7a",
1090
1090
  "scripts/check-security-floors.mjs": "6122404ea247c7d70718472e44bb007c0c5dad2fcc064c8a2d797cd9d0f85b29",
1091
+ "scripts/check-shell-guard-refusal-coverage.mjs": "d6b056c4311ea612e85d16ae565a57c5e10c822e87e21d689e12a6cc89dfda3f",
1091
1092
  "scripts/check-state-classification.mjs": "26baaa85c0758fa41f1f66257f7d3a31ea4dd5cf17a9c0acaa3e89caaaf6265a",
1092
1093
  "scripts/check-template-workflow-refs.mjs": "f784a822ae82f41b7501d61e45a1badeecb84f118083f4c53c66402d6c50ffa2",
1093
1094
  "scripts/check-whole-output-guards.mjs": "bb3c959fe67a6f481a9b8442a5a9a51a49599b4efd8fbefe3329fdf5c96b9c02",
@@ -1128,6 +1129,8 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1128
1129
  "scripts/lib/plugin-cache-resolution.mjs": "47a564e2f9d46c0a955defe8eb924f86d7a273098e6ccb118e10f9eeecf3950c",
1129
1130
  "scripts/lib/reusable-workflow-contract.d.mts": "791f01b55dd7a6b5d9a5f4cb9c44167caa146c2fc3c31a2ae4c2d8a350adc2f1",
1130
1131
  "scripts/lib/reusable-workflow-contract.mjs": "134ee2a327290f066f1eb318b5ed53c711557c3e10ed462c00ff5c97cfb20863",
1132
+ "scripts/lib/shell-guard-refusal-coverage.mjs": "6fb20aa010d8d1b339f3047135301e4a23c87dfdfe4fdc85240f38b061f9d07d",
1133
+ "scripts/lib/shell-guard-trace.mjs": "cb38f7b938bc2932e52ce2abefec8466b2c3edde97292e1e7b5a0f7c6464d4b5",
1131
1134
  "scripts/lib/upstream-manifest-staleness.mjs": "c69fc5ba10228b7f4f8d0068db27ee8a289143094fa8718b14af83f4af31f76d",
1132
1135
  "scripts/lib/workflow-contract-probe.mjs": "e51e2872bfc074fccd27cb814d2a4b14e45b3981290a98300b415beecc2b1ec8",
1133
1136
  "scripts/lisa-assert-eas-profile.mjs": "624e40d7f33ca17208fc6b7a19320a785cff19da5d2ff8062b67a432b2a34022",
@@ -7103,6 +7106,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7103
7106
  "scripts/check-required-check-promotions.mjs": true,
7104
7107
  "scripts/check-rules-pairing.sh": true,
7105
7108
  "scripts/check-security-floors.mjs": true,
7109
+ "scripts/check-shell-guard-refusal-coverage.mjs": true,
7106
7110
  "scripts/check-state-classification.mjs": true,
7107
7111
  "scripts/check-template-workflow-refs.mjs": true,
7108
7112
  "scripts/check-whole-output-guards.mjs": true,
@@ -7143,6 +7147,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7143
7147
  "scripts/lib/plugin-cache-resolution.mjs": true,
7144
7148
  "scripts/lib/reusable-workflow-contract.d.mts": true,
7145
7149
  "scripts/lib/reusable-workflow-contract.mjs": true,
7150
+ "scripts/lib/shell-guard-refusal-coverage.mjs": true,
7151
+ "scripts/lib/shell-guard-trace.mjs": true,
7146
7152
  "scripts/lib/upstream-manifest-staleness.mjs": true,
7147
7153
  "scripts/lib/workflow-contract-probe.mjs": true,
7148
7154
  "scripts/lisa-assert-eas-profile.mjs": true,
@@ -7235,6 +7241,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7235
7241
  "src/cli/doctor-readiness-workflows.ts": true,
7236
7242
  "src/cli/doctor-readiness-workspaces.ts": true,
7237
7243
  "src/cli/doctor-readiness.ts": true,
7244
+ "src/cli/doctor-reconciliation.ts": true,
7238
7245
  "src/cli/doctor-render.ts": true,
7239
7246
  "src/cli/doctor-reusable-workflow-refs.ts": true,
7240
7247
  "src/cli/doctor-serialize-legs-contract.ts": true,
@@ -7448,6 +7455,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7448
7455
  "src/core/override-floors.ts": true,
7449
7456
  "src/core/project-config-kane.ts": true,
7450
7457
  "src/core/project-config.ts": true,
7458
+ "src/core/reconciliation-report.ts": true,
7451
7459
  "src/core/self-apply.ts": true,
7452
7460
  "src/core/sonar-integration.ts": true,
7453
7461
  "src/core/template-ownership.ts": true,
@@ -7578,6 +7586,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7578
7586
  "src/utils/package-manager-detect.ts": true,
7579
7587
  "src/utils/path-utils.ts": true,
7580
7588
  "src/utils/pm-env.ts": true,
7589
+ "src/utils/postinstall-trampoline-report-source.ts": true,
7590
+ "src/utils/postinstall-trampoline-source.ts": true,
7581
7591
  "src/utils/postinstall-trampoline.ts": true,
7582
7592
  "src/utils/usage-accounting-rollup.ts": true,
7583
7593
  "src/utils/usage-accounting.ts": true,
@@ -7784,6 +7794,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7784
7794
  "tests/integration/playwright-caller-template.test.ts": true,
7785
7795
  "tests/integration/playwright-e2e-workflow.test.ts": true,
7786
7796
  "tests/integration/postinstall-safe-reports-stale-root-configs.test.ts": true,
7797
+ "tests/integration/postinstall-trampoline-regen.test.ts": true,
7787
7798
  "tests/integration/pre-tool-refusal-equivalence.test.ts": true,
7788
7799
  "tests/integration/pre-tool-refusal-inventory.test.ts": true,
7789
7800
  "tests/integration/pre-tool-refusal-scripts-resolve-gates.test.ts": true,
@@ -7819,6 +7830,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7819
7830
  "tests/integration/review-evidence-gate.test.ts": true,
7820
7831
  "tests/integration/security-floors-gate.test.ts": true,
7821
7832
  "tests/integration/seeded-gates-preserve-hook-outcomes.test.ts": true,
7833
+ "tests/integration/shell-guard-allow-controls.test.ts": true,
7834
+ "tests/integration/shell-guard-refusals.test.ts": true,
7822
7835
  "tests/integration/skipped-required-checks-gate-fail-closed.test.ts": true,
7823
7836
  "tests/integration/standards-proof-fixture.ts": true,
7824
7837
  "tests/integration/standards-proof-rails.test.ts": true,
@@ -7833,6 +7846,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7833
7846
  "tests/integration/support/pre-tool-refusal-harness.ts": true,
7834
7847
  "tests/integration/support/rails-learnings-budget-gate.ts": true,
7835
7848
  "tests/integration/support/reusable-workflow-scopes.ts": true,
7849
+ "tests/integration/support/shell-guard-refusal-fixture.ts": true,
7836
7850
  "tests/integration/threshold-ratchet-gate-fail-closed.test.ts": true,
7837
7851
  "tests/integration/tracked-source-nul-bytes.test.ts": true,
7838
7852
  "tests/support/git-executable.ts": true,
@@ -7893,6 +7907,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7893
7907
  "tests/unit/cli/doctor-readiness-tracking.test.ts": true,
7894
7908
  "tests/unit/cli/doctor-readiness-workflows.test.ts": true,
7895
7909
  "tests/unit/cli/doctor-readiness.test.ts": true,
7910
+ "tests/unit/cli/doctor-reconciliation.test.ts": true,
7896
7911
  "tests/unit/cli/doctor-render.test.ts": true,
7897
7912
  "tests/unit/cli/doctor-reusable-workflow-refs.test.ts": true,
7898
7913
  "tests/unit/cli/doctor-serialize-legs-contract.test.ts": true,
@@ -8310,6 +8325,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8310
8325
  "tests/unit/scripts/check-learnings-budget.test.ts": true,
8311
8326
  "tests/unit/scripts/check-orphan-test-processes.test.ts": true,
8312
8327
  "tests/unit/scripts/check-pipeline-status-reads.test.ts": true,
8328
+ "tests/unit/scripts/check-shell-guard-refusal-coverage.test.ts": true,
8313
8329
  "tests/unit/scripts/check-template-workflow-refs.test.ts": true,
8314
8330
  "tests/unit/scripts/check-whole-output-guards.test.ts": true,
8315
8331
  "tests/unit/scripts/check-workflow-package-contracts.test.ts": true,