@codyswann/lisa 4.28.4 → 4.29.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.
Files changed (218) hide show
  1. package/README.md +3 -1
  2. package/all/copy-overwrite/scripts/lisa-gates.mjs +2 -1
  3. package/all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh +3 -2
  4. package/all/copy-overwrite/scripts/lisa-postinstall.mjs +6 -2
  5. package/cdk/create-only/vitest.config.local.ts +5 -1
  6. package/cdk/package-lisa/package.lisa.json +14 -7
  7. package/dist/cli/apply.d.ts +20 -0
  8. package/dist/cli/apply.d.ts.map +1 -1
  9. package/dist/cli/apply.js +70 -3
  10. package/dist/cli/apply.js.map +1 -1
  11. package/dist/cli/doctor-apply-freshness.d.ts.map +1 -1
  12. package/dist/cli/doctor-apply-freshness.js +10 -4
  13. package/dist/cli/doctor-apply-freshness.js.map +1 -1
  14. package/dist/cli/lisa-test-run-bootstrap.d.ts +3 -0
  15. package/dist/cli/lisa-test-run-bootstrap.d.ts.map +1 -0
  16. package/dist/cli/lisa-test-run-bootstrap.js +201 -0
  17. package/dist/cli/lisa-test-run-bootstrap.js.map +1 -0
  18. package/dist/cli/lisa-test-run-ipc.d.ts +42 -0
  19. package/dist/cli/lisa-test-run-ipc.d.ts.map +1 -0
  20. package/dist/cli/lisa-test-run-ipc.js +200 -0
  21. package/dist/cli/lisa-test-run-ipc.js.map +1 -0
  22. package/dist/cli/lisa-test-run-process-group.d.ts +30 -0
  23. package/dist/cli/lisa-test-run-process-group.d.ts.map +1 -0
  24. package/dist/cli/lisa-test-run-process-group.js +123 -0
  25. package/dist/cli/lisa-test-run-process-group.js.map +1 -0
  26. package/dist/cli/lisa-test-run-reaper.d.ts +3 -0
  27. package/dist/cli/lisa-test-run-reaper.d.ts.map +1 -0
  28. package/dist/cli/lisa-test-run-reaper.js +195 -0
  29. package/dist/cli/lisa-test-run-reaper.js.map +1 -0
  30. package/dist/cli/lisa-test-run-runtime.d.ts +46 -0
  31. package/dist/cli/lisa-test-run-runtime.d.ts.map +1 -0
  32. package/dist/cli/lisa-test-run-runtime.js +123 -0
  33. package/dist/cli/lisa-test-run-runtime.js.map +1 -0
  34. package/dist/cli/lisa-test-run-supervisor.d.ts +13 -0
  35. package/dist/cli/lisa-test-run-supervisor.d.ts.map +1 -0
  36. package/dist/cli/lisa-test-run-supervisor.js +268 -0
  37. package/dist/cli/lisa-test-run-supervisor.js.map +1 -0
  38. package/dist/cli/lisa-test-run.d.ts +3 -0
  39. package/dist/cli/lisa-test-run.d.ts.map +1 -0
  40. package/dist/cli/lisa-test-run.js +66 -0
  41. package/dist/cli/lisa-test-run.js.map +1 -0
  42. package/dist/cli/shared-options.d.ts +11 -4
  43. package/dist/cli/shared-options.d.ts.map +1 -1
  44. package/dist/cli/shared-options.js +8 -8
  45. package/dist/cli/shared-options.js.map +1 -1
  46. package/dist/configs/vitest/base.d.ts.map +1 -1
  47. package/dist/configs/vitest/base.js +5 -2
  48. package/dist/configs/vitest/base.js.map +1 -1
  49. package/dist/configs/vitest/cdk.d.ts +4 -0
  50. package/dist/configs/vitest/cdk.d.ts.map +1 -1
  51. package/dist/configs/vitest/cdk.js +5 -0
  52. package/dist/configs/vitest/cdk.js.map +1 -1
  53. package/dist/configs/vitest/harper-fabric.d.ts.map +1 -1
  54. package/dist/configs/vitest/harper-fabric.js +1 -0
  55. package/dist/configs/vitest/harper-fabric.js.map +1 -1
  56. package/dist/configs/vitest/nestjs.d.ts.map +1 -1
  57. package/dist/configs/vitest/nestjs.js +1 -0
  58. package/dist/configs/vitest/nestjs.js.map +1 -1
  59. package/dist/configs/vitest/phaser.d.ts.map +1 -1
  60. package/dist/configs/vitest/phaser.js +1 -0
  61. package/dist/configs/vitest/phaser.js.map +1 -1
  62. package/dist/configs/vitest/scratch-authority.d.ts +25 -0
  63. package/dist/configs/vitest/scratch-authority.d.ts.map +1 -0
  64. package/dist/configs/vitest/scratch-authority.js +107 -0
  65. package/dist/configs/vitest/scratch-authority.js.map +1 -0
  66. package/dist/configs/vitest/scratch-bound-cleanup-programs.d.ts +5 -0
  67. package/dist/configs/vitest/scratch-bound-cleanup-programs.d.ts.map +1 -0
  68. package/dist/configs/vitest/scratch-bound-cleanup-programs.js +219 -0
  69. package/dist/configs/vitest/scratch-bound-cleanup-programs.js.map +1 -0
  70. package/dist/configs/vitest/scratch-bound-cleanup.d.ts +28 -0
  71. package/dist/configs/vitest/scratch-bound-cleanup.d.ts.map +1 -0
  72. package/dist/configs/vitest/scratch-bound-cleanup.js +155 -0
  73. package/dist/configs/vitest/scratch-bound-cleanup.js.map +1 -0
  74. package/dist/configs/vitest/scratch-bound-root-cleanup.d.ts +17 -0
  75. package/dist/configs/vitest/scratch-bound-root-cleanup.d.ts.map +1 -0
  76. package/dist/configs/vitest/scratch-bound-root-cleanup.js +149 -0
  77. package/dist/configs/vitest/scratch-bound-root-cleanup.js.map +1 -0
  78. package/dist/configs/vitest/scratch-global-setup.d.ts +17 -9
  79. package/dist/configs/vitest/scratch-global-setup.d.ts.map +1 -1
  80. package/dist/configs/vitest/scratch-global-setup.js +103 -35
  81. package/dist/configs/vitest/scratch-global-setup.js.map +1 -1
  82. package/dist/configs/vitest/scratch-leak-setup.d.ts +2 -0
  83. package/dist/configs/vitest/scratch-leak-setup.d.ts.map +1 -0
  84. package/dist/configs/vitest/scratch-leak-setup.js +108 -0
  85. package/dist/configs/vitest/scratch-leak-setup.js.map +1 -0
  86. package/dist/configs/vitest/scratch-namespace-authority.d.ts +80 -0
  87. package/dist/configs/vitest/scratch-namespace-authority.d.ts.map +1 -0
  88. package/dist/configs/vitest/scratch-namespace-authority.js +291 -0
  89. package/dist/configs/vitest/scratch-namespace-authority.js.map +1 -0
  90. package/dist/configs/vitest/scratch-owner.d.ts +131 -0
  91. package/dist/configs/vitest/scratch-owner.d.ts.map +1 -0
  92. package/dist/configs/vitest/scratch-owner.js +297 -0
  93. package/dist/configs/vitest/scratch-owner.js.map +1 -0
  94. package/dist/configs/vitest/scratch-route-profile.d.ts +36 -0
  95. package/dist/configs/vitest/scratch-route-profile.d.ts.map +1 -0
  96. package/dist/configs/vitest/scratch-route-profile.js +217 -0
  97. package/dist/configs/vitest/scratch-route-profile.js.map +1 -0
  98. package/dist/configs/vitest/scratch-run-root-compatibility.d.ts +33 -0
  99. package/dist/configs/vitest/scratch-run-root-compatibility.d.ts.map +1 -0
  100. package/dist/configs/vitest/scratch-run-root-compatibility.js +137 -0
  101. package/dist/configs/vitest/scratch-run-root-compatibility.js.map +1 -0
  102. package/dist/configs/vitest/scratch-run-root-intent.d.ts +66 -0
  103. package/dist/configs/vitest/scratch-run-root-intent.d.ts.map +1 -0
  104. package/dist/configs/vitest/scratch-run-root-intent.js +183 -0
  105. package/dist/configs/vitest/scratch-run-root-intent.js.map +1 -0
  106. package/dist/configs/vitest/scratch-setup.d.ts.map +1 -1
  107. package/dist/configs/vitest/scratch-setup.js +45 -15
  108. package/dist/configs/vitest/scratch-setup.js.map +1 -1
  109. package/dist/configs/vitest/scratch-supervision-intent.d.ts +8 -0
  110. package/dist/configs/vitest/scratch-supervision-intent.d.ts.map +1 -0
  111. package/dist/configs/vitest/scratch-supervision-intent.js +125 -0
  112. package/dist/configs/vitest/scratch-supervision-intent.js.map +1 -0
  113. package/dist/configs/vitest/scratch-supervision-protocol.d.ts +12 -0
  114. package/dist/configs/vitest/scratch-supervision-protocol.d.ts.map +1 -0
  115. package/dist/configs/vitest/scratch-supervision-protocol.js +230 -0
  116. package/dist/configs/vitest/scratch-supervision-protocol.js.map +1 -0
  117. package/dist/configs/vitest/scratch-supervision.d.ts +64 -0
  118. package/dist/configs/vitest/scratch-supervision.d.ts.map +1 -0
  119. package/dist/configs/vitest/scratch-supervision.js +209 -0
  120. package/dist/configs/vitest/scratch-supervision.js.map +1 -0
  121. package/dist/configs/vitest/scratch-sweep.d.ts +66 -0
  122. package/dist/configs/vitest/scratch-sweep.d.ts.map +1 -0
  123. package/dist/configs/vitest/scratch-sweep.js +82 -0
  124. package/dist/configs/vitest/scratch-sweep.js.map +1 -0
  125. package/dist/configs/vitest/scratch.d.ts +14 -187
  126. package/dist/configs/vitest/scratch.d.ts.map +1 -1
  127. package/dist/configs/vitest/scratch.js +18 -285
  128. package/dist/configs/vitest/scratch.js.map +1 -1
  129. package/dist/configs/vitest/typescript.d.ts.map +1 -1
  130. package/dist/configs/vitest/typescript.js +1 -0
  131. package/dist/configs/vitest/typescript.js.map +1 -1
  132. package/dist/core/apply-mode.d.ts +80 -29
  133. package/dist/core/apply-mode.d.ts.map +1 -1
  134. package/dist/core/apply-mode.js +23 -2
  135. package/dist/core/apply-mode.js.map +1 -1
  136. package/dist/core/apply-receipt.d.ts +5 -1
  137. package/dist/core/apply-receipt.d.ts.map +1 -1
  138. package/dist/core/apply-receipt.js.map +1 -1
  139. package/dist/core/config.d.ts +24 -12
  140. package/dist/core/config.d.ts.map +1 -1
  141. package/dist/core/config.js.map +1 -1
  142. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  143. package/dist/core/lisa-owned-hash-ledger.js +8 -0
  144. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  145. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  146. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  147. package/dist/core/upstream-evidence-manifest.js +63 -15
  148. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  149. package/dist/migrations/ensure-lisa-postinstall.d.ts +1 -1
  150. package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
  151. package/dist/migrations/ensure-lisa-postinstall.js +28 -5
  152. package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
  153. package/dist/utils/postinstall-trampoline-source.js +10 -1
  154. package/dist/utils/postinstall-trampoline-source.js.map +1 -1
  155. package/expo/package-lisa/package.lisa.json +14 -14
  156. package/harper-fabric/package-lisa/package.lisa.json +8 -3
  157. package/nestjs/create-only/vitest.config.local.ts +5 -1
  158. package/nestjs/package-lisa/package.lisa.json +14 -8
  159. package/npm-package/package-lisa/package.lisa.json +8 -0
  160. package/package.json +17 -13
  161. package/phaser/package-lisa/package.lisa.json +9 -3
  162. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  163. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  164. package/plugins/lisa/hooks/sonar-secrets.sh +3 -2
  165. package/plugins/lisa-agy/plugin.json +1 -1
  166. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  167. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  168. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  169. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  170. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  171. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  172. package/plugins/lisa-copilot/hooks/sonar-secrets.sh +3 -2
  173. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  174. package/plugins/lisa-cursor/hooks/sonar-secrets.sh +3 -2
  175. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  176. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  177. package/plugins/lisa-expo-agy/plugin.json +1 -1
  178. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  179. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  180. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  181. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  182. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  183. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  184. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  185. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  186. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  187. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  188. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  189. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  190. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  191. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  192. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  193. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  194. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  195. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  196. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  197. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  198. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  199. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  200. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  201. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  202. package/plugins/lisa-rails-agy/plugin.json +1 -1
  203. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  204. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  205. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  206. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  207. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  208. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  209. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  210. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  211. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  212. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  213. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  214. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  215. package/plugins/src/base/hooks/sonar-secrets.sh +3 -2
  216. package/scripts/install-claude-plugins.sh +7 -2
  217. package/typescript/create-only/vitest.config.local.ts +5 -1
  218. package/typescript/package-lisa/package.lisa.json +14 -8
@@ -0,0 +1,123 @@
1
+ /** Runtime-only companion, environment, and signal escalation primitives. */
2
+ import { fork } from "node:child_process";
3
+ import { env } from "node:process";
4
+ import { fileURLToPath } from "node:url";
5
+ import * as path from "node:path";
6
+ import { SCRATCH_PREFIXES_ENV, SCRATCH_SUITE_ENV, } from "../configs/vitest/scratch-route-profile.js";
7
+ import { SCRATCH_SUPERVISION_LEASE_ENV } from "../configs/vitest/scratch-supervision.js";
8
+ import { drainTestRunTarget, } from "./lisa-test-run-process-group.js";
9
+ /** Grace period for a payload to honor a forwarded catchable signal. */
10
+ const FORWARDED_SIGNAL_GRACE_MS = 1_000;
11
+ /** Private deterministic protocol-fault seam. */
12
+ const TEST_FAULT_ENV = "LISA_TEST_RUN_TEST_FAULT";
13
+ /** Catchable signals forwarded to the target process group. */
14
+ export const FORWARDED_SIGNALS = [
15
+ "SIGINT",
16
+ "SIGTERM",
17
+ "SIGHUP",
18
+ ];
19
+ /**
20
+ * Start one source-or-built sibling as a detached IPC child.
21
+ * @param name - Sibling module basename
22
+ * @returns Detached protocol companion
23
+ */
24
+ export function forkDetachedSibling(name) {
25
+ const self = fileURLToPath(import.meta.url);
26
+ const modulePath = path.join(path.dirname(self), `${name}${path.extname(self)}`);
27
+ return fork(modulePath, [], {
28
+ cwd: process.cwd(),
29
+ detached: true,
30
+ execArgv: process.execArgv,
31
+ stdio: ["ignore", "inherit", "inherit", "ipc"],
32
+ });
33
+ }
34
+ /**
35
+ * Convert inherited values plus the frozen lease to the spawn contract.
36
+ * @param lease - Serialized exact suite lease
37
+ * @param profile - Frozen wrapper route profile
38
+ * @param directScratchRoot - Direct-adapter platform temp root, when applicable
39
+ * @returns String-only payload environment
40
+ */
41
+ export function payloadEnvironment(lease, profile, directScratchRoot) {
42
+ return Object.fromEntries(Object.entries({
43
+ ...env,
44
+ [SCRATCH_SUPERVISION_LEASE_ENV]: lease,
45
+ [SCRATCH_SUITE_ENV]: profile.suiteLabel,
46
+ [SCRATCH_PREFIXES_ENV]: JSON.stringify(profile.registeredPrefixes),
47
+ ...(directScratchRoot === undefined
48
+ ? {}
49
+ : {
50
+ TMPDIR: directScratchRoot,
51
+ TMP: directScratchRoot,
52
+ TEMP: directScratchRoot,
53
+ }),
54
+ }).filter((entry) => entry[0] !== TEST_FAULT_ENV && entry[1] !== undefined));
55
+ }
56
+ /**
57
+ * Reject if the detached cleanup authority exits during the payload.
58
+ * @param reaper - Armed detached reaper
59
+ * @returns Promise that only rejects on exit
60
+ */
61
+ export function rejectOnReaperExit(reaper) {
62
+ return new Promise((_, reject) => {
63
+ const onExit = () => {
64
+ reaper.off("exit", onExit);
65
+ reject(new Error("Detached reaper exited while the payload was active"));
66
+ };
67
+ reaper.once("exit", onExit);
68
+ if (reaper.exitCode !== null || reaper.signalCode !== null)
69
+ onExit();
70
+ });
71
+ }
72
+ /**
73
+ * Drain with deterministic birth-probe failures only in dedicated controls.
74
+ * @param target - Armed target authority
75
+ * @returns Bounded drain promise
76
+ */
77
+ export function drainSupervisedTarget(target) {
78
+ const fault = env[TEST_FAULT_ENV];
79
+ if (fault === "stop-send-closed" || fault === "stop-send-rejected") {
80
+ return Promise.resolve();
81
+ }
82
+ if (fault === "birth-unavailable-on-drain") {
83
+ return drainTestRunTarget(target, {
84
+ probes: { processBirthFingerprint: () => undefined },
85
+ });
86
+ }
87
+ if (fault === "birth-mismatch-on-drain") {
88
+ return drainTestRunTarget(target, {
89
+ probes: { processBirthFingerprint: () => "mismatched-birth-control" },
90
+ });
91
+ }
92
+ return drainTestRunTarget(target);
93
+ }
94
+ /**
95
+ * Build one cancellable TERM-to-KILL escalation.
96
+ * @param target - Armed birth-bound target
97
+ * @returns Cancellable escalation
98
+ */
99
+ export function createSignalEscalation(target) {
100
+ const state = { started: false };
101
+ const promise = new Promise((resolve, reject) => {
102
+ // eslint-disable-next-line functional/immutable-data -- one promise settlement handle
103
+ state.settle = { resolve, reject };
104
+ });
105
+ return {
106
+ promise,
107
+ begin: signal => {
108
+ if (state.started)
109
+ return;
110
+ // eslint-disable-next-line functional/immutable-data -- first forwarded signal wins
111
+ state.started = true;
112
+ // eslint-disable-next-line functional/immutable-data -- cancellable bounded timer
113
+ state.timer = setTimeout(() => {
114
+ void drainSupervisedTarget(target).then(() => state.settle?.resolve({ code: null, signal }), error => state.settle?.reject(error));
115
+ }, FORWARDED_SIGNAL_GRACE_MS);
116
+ },
117
+ cancel: () => {
118
+ if (state.timer !== undefined)
119
+ clearTimeout(state.timer);
120
+ },
121
+ };
122
+ }
123
+ //# sourceMappingURL=lisa-test-run-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lisa-test-run-runtime.js","sourceRoot":"","sources":["../../src/cli/lisa-test-run-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ScratchRouteProfile } from "../configs/vitest/scratch-route-profile.js";
2
+ import { type PayloadOutcome } from "./lisa-test-run-ipc.js";
3
+ /** Explicit scratch delivery selected by each generated route. */
4
+ export type TestRunAdapter = "vitest" | "direct";
5
+ /**
6
+ * Arm and execute one supervised command.
7
+ * @param argv - Exact payload argv
8
+ * @param profile - Frozen wrapper route profile
9
+ * @param adapter - Explicit payload delivery adapter
10
+ * @returns Payload outcome after proven cleanup
11
+ */
12
+ export declare function superviseTestRun(argv: readonly [string, ...string[]], profile: ScratchRouteProfile, adapter: TestRunAdapter): Promise<PayloadOutcome>;
13
+ //# sourceMappingURL=lisa-test-run-supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lisa-test-run-supervisor.d.ts","sourceRoot":"","sources":["../../src/cli/lisa-test-run-supervisor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAKtF,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAgBhC,kEAAkE;AAClE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAmSjD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EACpC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAsBzB"}
@@ -0,0 +1,268 @@
1
+ import { env } from "node:process";
2
+ import { openOwnedScratchRunRoot, prepareOwnedScratchRunRoot, removeOwnedScratchRunRoot, } from "../configs/vitest/scratch.js";
3
+ import { readBoundedScratchNames, removeAuthorizedScratchChildren, } from "../configs/vitest/scratch-authority.js";
4
+ import { SCRATCH_OWNER_FILE } from "../configs/vitest/scratch-owner.js";
5
+ import { processBirthFingerprint } from "../configs/vitest/scratch-owner.js";
6
+ import { SCRATCH_SUPERVISION_LEASE_ENV, createScratchSupervisionLease, } from "../configs/vitest/scratch-supervision.js";
7
+ import { sendMessage, stopBootstrap, waitForExit, waitForMessage, waitForPayload, } from "./lisa-test-run-ipc.js";
8
+ import { assertTestRunPlatform } from "./lisa-test-run-process-group.js";
9
+ import { FORWARDED_SIGNALS, createSignalEscalation, drainSupervisedTarget, forkDetachedSibling, payloadEnvironment, rejectOnReaperExit, } from "./lisa-test-run-runtime.js";
10
+ /** Private deterministic protocol-fault seam, never inherited by the payload. */
11
+ const TEST_FAULT_ENV = "LISA_TEST_RUN_TEST_FAULT";
12
+ /**
13
+ * Prepare the immutable root intent before starting protocol companions.
14
+ * @param profile - Frozen wrapper route profile
15
+ * @returns Immutable root intent
16
+ */
17
+ function prepareIntent(profile) {
18
+ return prepareOwnedScratchRunRoot(env[TEST_FAULT_ENV] === "birth-unavailable-on-prepare"
19
+ ? {
20
+ platform: process.platform,
21
+ processBirthFingerprint: () => undefined,
22
+ suiteLabel: profile.suiteLabel,
23
+ registeredPrefixes: profile.registeredPrefixes,
24
+ }
25
+ : {
26
+ suiteLabel: profile.suiteLabel,
27
+ registeredPrefixes: profile.registeredPrefixes,
28
+ });
29
+ }
30
+ /**
31
+ * Arm both companions and materialize only after root/target acknowledgements.
32
+ * @param state - One foreground supervision state
33
+ */
34
+ async function armAuthorities(state) {
35
+ await waitForMessage(state.reaper, "REAPER_READY");
36
+ const bootstrap = forkDetachedSibling("lisa-test-run-bootstrap");
37
+ // eslint-disable-next-line functional/immutable-data -- companion handle captured once
38
+ state.bootstrap = bootstrap;
39
+ await waitForMessage(bootstrap, "BOOTSTRAP_READY");
40
+ const birth = processBirthFingerprint(bootstrap.pid ?? 0);
41
+ if (bootstrap.pid === undefined || birth === undefined) {
42
+ throw new Error("Could not bind bootstrap process birth");
43
+ }
44
+ const target = {
45
+ pid: bootstrap.pid,
46
+ pgid: bootstrap.pid,
47
+ processBirthFingerprint: birth,
48
+ };
49
+ // eslint-disable-next-line functional/immutable-data -- target authority captured once
50
+ state.target = target;
51
+ const rootAck = waitForMessage(state.reaper, "ROOT_INTENT_ARMED", state.intent.token);
52
+ await sendMessage(state.reaper, {
53
+ type: "ROOT_INTENT",
54
+ correlation: state.intent.token,
55
+ intent: state.intent,
56
+ });
57
+ await rootAck;
58
+ const targetAck = waitForMessage(state.reaper, "TARGET_ARMED", state.intent.token);
59
+ await sendMessage(state.reaper, {
60
+ type: "TARGET_INTENT",
61
+ correlation: state.intent.token,
62
+ target,
63
+ });
64
+ await targetAck;
65
+ const rootArmed = waitForMessage(state.reaper, "ROOT_ARMED", state.intent.token);
66
+ await sendMessage(state.reaper, {
67
+ type: "MATERIALIZE_ROOT",
68
+ correlation: state.intent.token,
69
+ });
70
+ const acknowledgement = await rootArmed;
71
+ const opened = openOwnedScratchRunRoot(state.intent);
72
+ const acknowledgedRoot = acknowledgement["root"];
73
+ if (opened === undefined ||
74
+ acknowledgedRoot?.canonicalPath !== opened.owner.root.canonicalPath ||
75
+ acknowledgedRoot.dev !== opened.owner.root.dev ||
76
+ acknowledgedRoot.ino !== opened.owner.root.ino) {
77
+ throw new Error("Detached reaper acknowledged a different scratch root identity");
78
+ }
79
+ // eslint-disable-next-line functional/immutable-data -- exact materialization acknowledgement transition
80
+ state.rootMaterialized = true;
81
+ if (env[TEST_FAULT_ENV] === "kill-reaper-after-root") {
82
+ state.reaper.kill("SIGKILL");
83
+ await waitForExit(state.reaper);
84
+ throw new Error("Detached reaper exited after root materialization");
85
+ }
86
+ }
87
+ /**
88
+ * Send one immutable command after root and target authority are armed.
89
+ * @param state - One foreground supervision state
90
+ * @param argv - Exact payload argv
91
+ * @param profile - Frozen wrapper route profile
92
+ * @param adapter - Explicit payload delivery adapter
93
+ */
94
+ async function configurePayload(state, argv, profile, adapter) {
95
+ if (state.bootstrap === undefined)
96
+ throw new Error("Bootstrap is not armed");
97
+ const lease = createScratchSupervisionLease(state.intent, {
98
+ suiteLabel: state.intent.suiteLabel,
99
+ registeredPrefixes: state.intent.registeredPrefixes,
100
+ });
101
+ const command = {
102
+ schema: 1,
103
+ argv,
104
+ env: payloadEnvironment(JSON.stringify(lease), profile, adapter === "direct" ? state.intent.rootPath : undefined),
105
+ };
106
+ if (adapter === "direct") {
107
+ // eslint-disable-next-line functional/immutable-data -- immutable invocation snapshot captured once
108
+ state.directBaseline = new Set(readBoundedScratchNames(state.intent.rootPath));
109
+ }
110
+ const commandReady = waitForMessage(state.bootstrap, "COMMAND_READY");
111
+ await sendMessage(state.bootstrap, { type: "COMMAND", command });
112
+ await commandReady;
113
+ }
114
+ /**
115
+ * Attribute and remove direct-adapter scratch additions after the payload drains.
116
+ * @param state - One foreground supervision state
117
+ */
118
+ function auditDirectScratch(state) {
119
+ if (state.directBaseline === undefined)
120
+ return;
121
+ const opened = openOwnedScratchRunRoot(state.intent);
122
+ if (opened === undefined) {
123
+ throw new Error("Direct scratch root disappeared before invocation audit");
124
+ }
125
+ const additions = readBoundedScratchNames(opened.path).filter(name => name !== SCRATCH_OWNER_FILE && !state.directBaseline?.has(name));
126
+ const unregistered = additions.filter(name => !opened.owner.registeredPrefixes.some(prefix => name.startsWith(prefix)));
127
+ removeAuthorizedScratchChildren({
128
+ parent: opened.owner.root,
129
+ basenames: additions,
130
+ });
131
+ if (unregistered.length > 0) {
132
+ const names = [...unregistered].sort((left, right) => left === right ? 0 : left < right ? -1 : 1);
133
+ throw new Error(`Suite ${opened.owner.suiteLabel} leaked ${String(names.length)} unregistered direct scratch fixture(s): ${names.join(", ")}`);
134
+ }
135
+ }
136
+ /**
137
+ * Report a cleanup verdict without replacing an already-failing payload.
138
+ * @param error - Secondary direct-audit failure
139
+ */
140
+ function reportPreservedAuditFailure(error) {
141
+ process.stderr.write(`lisa-test-run direct scratch audit also failed: ${error instanceof Error ? error.message : String(error)}\n`);
142
+ }
143
+ /**
144
+ * Execute the armed payload while retaining the first forwarded signal.
145
+ * @param state - One foreground supervision state
146
+ * @returns Exact payload outcome
147
+ */
148
+ async function executePayload(state) {
149
+ const bootstrap = state.bootstrap;
150
+ const target = state.target;
151
+ if (bootstrap === undefined || target === undefined) {
152
+ throw new Error("Payload authority is not fully armed");
153
+ }
154
+ const escalation = createSignalEscalation(target);
155
+ // eslint-disable-next-line functional/immutable-data -- cancellable handle scoped to this run
156
+ state.signalEscalation = escalation;
157
+ for (const signal of FORWARDED_SIGNALS) {
158
+ // Persistent, not `once`. A one-shot listener is removed the first time it
159
+ // fires, and Node restores that signal's DEFAULT disposition the moment its
160
+ // last listener goes. A second delivery of the same signal during the grace
161
+ // window then kills this process outright — skipping the scratch removal
162
+ // this supervisor exists to guarantee. Ctrl-C pressed twice, or a scheduler
163
+ // that re-sends SIGTERM, is the ordinary case. The `finally` in
164
+ // superviseTestRun removes every one of these before the outcome is
165
+ // re-raised, so staying armed costs nothing.
166
+ process.on(signal, () => {
167
+ if (state.forwardedSignal !== undefined)
168
+ return;
169
+ // eslint-disable-next-line functional/immutable-data -- first observed terminal signal is preserved
170
+ state.forwardedSignal = signal;
171
+ void sendMessage(bootstrap, { type: "SIGNAL", signal }).catch(() => undefined);
172
+ escalation.begin(signal);
173
+ });
174
+ }
175
+ const outcomePromise = waitForPayload(bootstrap, () => state.forwardedSignal !== undefined);
176
+ await sendMessage(bootstrap, { type: "GO" });
177
+ if (env[TEST_FAULT_ENV] === "kill-reaper-after-go") {
178
+ state.reaper.kill("SIGKILL");
179
+ }
180
+ return await Promise.race([
181
+ outcomePromise,
182
+ rejectOnReaperExit(state.reaper),
183
+ escalation.promise,
184
+ ]);
185
+ }
186
+ /**
187
+ * Drain, clean, and disarm after one payload result.
188
+ * @param state - One foreground supervision state
189
+ * @param outcome - Exact payload outcome
190
+ * @returns Outcome after cleanup and disarm
191
+ */
192
+ async function finishSuccess(state, outcome) {
193
+ state.signalEscalation?.cancel();
194
+ await drainSupervisedTarget(state.target);
195
+ if (state.bootstrap !== undefined)
196
+ await stopBootstrap(state.bootstrap);
197
+ try {
198
+ auditDirectScratch(state);
199
+ }
200
+ catch (error) {
201
+ if (outcome.code === 0 && outcome.signal === null)
202
+ throw error;
203
+ reportPreservedAuditFailure(error);
204
+ }
205
+ removeOwnedScratchRunRoot(state.intent);
206
+ // eslint-disable-next-line code-organization/enforce-statement-order -- disarm is meaningful only after foreground removal
207
+ const disarmedAck = waitForMessage(state.reaper, "DISARMED");
208
+ await sendMessage(state.reaper, { type: "CLEANED" });
209
+ await disarmedAck;
210
+ await waitForExit(state.reaper);
211
+ // eslint-disable-next-line functional/immutable-data -- terminal verified state
212
+ state.disarmed = true;
213
+ return state.forwardedSignal === undefined
214
+ ? outcome
215
+ : { code: null, signal: state.forwardedSignal };
216
+ }
217
+ /**
218
+ * Best-effort foreground cleanup that never hides a drain authority failure.
219
+ * @param state - One foreground supervision state
220
+ */
221
+ async function cleanupFailure(state) {
222
+ await drainSupervisedTarget(state.target);
223
+ if (state.bootstrap !== undefined) {
224
+ try {
225
+ await stopBootstrap(state.bootstrap);
226
+ }
227
+ catch {
228
+ state.bootstrap.kill("SIGKILL");
229
+ }
230
+ }
231
+ if (state.rootMaterialized)
232
+ removeOwnedScratchRunRoot(state.intent);
233
+ }
234
+ /**
235
+ * Arm and execute one supervised command.
236
+ * @param argv - Exact payload argv
237
+ * @param profile - Frozen wrapper route profile
238
+ * @param adapter - Explicit payload delivery adapter
239
+ * @returns Payload outcome after proven cleanup
240
+ */
241
+ export async function superviseTestRun(argv, profile, adapter) {
242
+ assertTestRunPlatform();
243
+ delete env[SCRATCH_SUPERVISION_LEASE_ENV];
244
+ // eslint-disable-next-line code-organization/enforce-statement-order -- inherited authority must be cleared before intent preparation
245
+ const state = {
246
+ intent: prepareIntent(profile),
247
+ reaper: forkDetachedSibling("lisa-test-run-reaper"),
248
+ rootMaterialized: false,
249
+ disarmed: false,
250
+ };
251
+ try {
252
+ await armAuthorities(state);
253
+ await configurePayload(state, argv, profile, adapter);
254
+ return await finishSuccess(state, await executePayload(state));
255
+ }
256
+ catch (error) {
257
+ await cleanupFailure(state);
258
+ throw error;
259
+ }
260
+ finally {
261
+ for (const signal of FORWARDED_SIGNALS)
262
+ process.removeAllListeners(signal);
263
+ state.signalEscalation?.cancel();
264
+ if (!state.disarmed && state.reaper.connected)
265
+ state.reaper.disconnect();
266
+ }
267
+ }
268
+ //# sourceMappingURL=lisa-test-run-supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lisa-test-run-supervisor.js","sourceRoot":"","sources":["../../src/cli/lisa-test-run-supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export { assertTestRunPlatform } from "./lisa-test-run-process-group.js";
3
+ //# sourceMappingURL=lisa-test-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lisa-test-run.d.ts","sourceRoot":"","sources":["../../src/cli/lisa-test-run.ts"],"names":[],"mappings":";AAcA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ /** Public entrypoint for birth-bound test supervision and scratch cleanup. */
3
+ // @ts-expect-error -- the shipped JavaScript helper carries the same checked JSDoc signature
4
+ import { invokedAsScript } from "../../scripts/lib/invoked-as-script.mjs";
5
+ import { resolveScratchRouteProfile, } from "../configs/vitest/scratch-route-profile.js";
6
+ import { superviseTestRun, } from "./lisa-test-run-supervisor.js";
7
+ export { assertTestRunPlatform } from "./lisa-test-run-process-group.js";
8
+ /** Dedicated operational-failure exit status. */
9
+ const OPERATIONAL_FAILURE_EXIT = 1;
10
+ /**
11
+ * Parse the exact public `--profile <route> --adapter <kind> -- <command>` syntax.
12
+ * @param argv - Public CLI arguments
13
+ * @returns Validated route profile and payload argv
14
+ */
15
+ function commandArgv(argv) {
16
+ if (argv[0] !== "--profile" ||
17
+ argv[1] === undefined ||
18
+ argv[2] !== "--adapter" ||
19
+ (argv[3] !== "vitest" && argv[3] !== "direct") ||
20
+ argv[4] !== "--" ||
21
+ argv.length < 6 ||
22
+ argv[5] === undefined) {
23
+ throw new Error("Usage: lisa-test-run --profile <route> --adapter vitest|direct -- <executable> [args...]");
24
+ }
25
+ return {
26
+ profile: resolveScratchRouteProfile(argv[1]),
27
+ adapter: argv[3],
28
+ argv: argv.slice(5),
29
+ };
30
+ }
31
+ /**
32
+ * Parse public input or emit the usage verdict without starting companions.
33
+ * @returns Validated invocation or undefined after a usage verdict
34
+ */
35
+ function invocationOrExit() {
36
+ try {
37
+ return commandArgv(process.argv.slice(2));
38
+ }
39
+ catch (error) {
40
+ process.stderr.write(`${error.message}\n`);
41
+ process.exitCode = 2;
42
+ return undefined;
43
+ }
44
+ }
45
+ /** Run the public CLI and preserve the child result only after cleanup. */
46
+ async function main() {
47
+ const invocation = invocationOrExit();
48
+ if (invocation === undefined)
49
+ return;
50
+ try {
51
+ const outcome = await superviseTestRun(invocation.argv, invocation.profile, invocation.adapter);
52
+ if (outcome.signal !== null) {
53
+ process.removeAllListeners(outcome.signal);
54
+ process.kill(process.pid, outcome.signal);
55
+ return;
56
+ }
57
+ process.exit(outcome.code ?? OPERATIONAL_FAILURE_EXIT);
58
+ }
59
+ catch (error) {
60
+ process.stderr.write(`lisa-test-run failed: ${error instanceof Error ? error.message : String(error)}\n`);
61
+ process.exit(OPERATIONAL_FAILURE_EXIT);
62
+ }
63
+ }
64
+ if (invokedAsScript(import.meta.url))
65
+ void main();
66
+ //# sourceMappingURL=lisa-test-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lisa-test-run.js","sourceRoot":"","sources":["../../src/cli/lisa-test-run.ts"],"names":[],"mappings":";AACA,8EAA8E;AAC9E,6FAA6F;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE1E,OAAO,EACL,0BAA0B,GAE3B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,gBAAgB,GAEjB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,iDAAiD;AACjD,MAAM,wBAAwB,GAAG,CAAC,CAAC;AASnC;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAuB;IAC1C,IACE,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW;QACvB,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;QACrB,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW;QACvB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;QAC9C,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EACrB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAChB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAA0B;KAC7C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACpC,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,OAAO,CACnB,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC5B,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,wBAAwB,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CACpF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAAE,KAAK,IAAI,EAAE,CAAC"}
@@ -12,11 +12,18 @@ export interface CLIOptions {
12
12
  validate?: boolean;
13
13
  skipGitCheck?: boolean;
14
14
  /**
15
- * Run the FULL apply even with `--skip-git-check`.
15
+ * Declare this apply a package-manager install lifecycle.
16
16
  *
17
- * The escape hatch from the conflation in CodySwannGT/lisa#3066: waiving the
18
- * dirty-tree check otherwise selects the reduced `postinstall-safe` subset as
19
- * a side effect, with no way to decline.
17
+ * The only thing that selects the reduced `postinstall-safe` subset. Every
18
+ * Lisa-written postinstall invocation carries it, in this spelling or as
19
+ * `LISA_POSTINSTALL=1` (CodySwannGT/lisa#3066).
20
+ */
21
+ postinstallSafe?: boolean;
22
+ /**
23
+ * Run the FULL apply even inside a declared postinstall.
24
+ *
25
+ * The override of last resort, for an operator forcing the complete apply
26
+ * from inside a lifecycle script.
20
27
  */
21
28
  fullApply?: boolean;
22
29
  /** Bare `--refresh-templates` yields true; with a value, the raw path list. */
@@ -1 +1 @@
1
- {"version":3,"file":"shared-options.d.ts","sourceRoot":"","sources":["../../src/cli/shared-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAwB,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOzD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAClC,gBAAgB,GAAG,SAAS,CAW9B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAoC1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,GACpB,gBAAgB,CAYlB"}
1
+ {"version":3,"file":"shared-options.d.ts","sourceRoot":"","sources":["../../src/cli/shared-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAwB,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOzD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAClC,gBAAgB,GAAG,SAAS,CAW9B;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAuC1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,GACpB,gBAAgB,CAYlB"}
@@ -52,14 +52,14 @@ export function addSharedOptions(command) {
52
52
  .option("-n, --dry-run", "Show what would be done without making changes")
53
53
  .option("-y, --yes", "Non-interactive mode (auto-accept defaults, overwrite on conflict)")
54
54
  .option("-v, --validate", "Validate project compatibility without applying changes")
55
- .option("--skip-git-check", "Skip dirty git working directory check (for postinstall use). " +
56
- "NOTE: on its own this also selects the reduced postinstall-safe apply, " +
57
- "which skips every agent emit and the Sonar integration. Add --full-apply " +
58
- "to waive the check without reducing the apply.")
59
- .option("--full-apply", "Run the FULL apply even with --skip-git-check. Without this, waiving the " +
60
- "dirty-tree check also selects the reduced postinstall-safe subset, so an " +
61
- "automated caller that only needed a dirty tree silently gets no agent " +
62
- "emits (CodySwannGT/lisa#3066).")
55
+ .option("--skip-git-check", "Skip the dirty git working directory check. Means only that: the apply " +
56
+ "still runs in full, including every agent emit (CodySwannGT/lisa#3066).")
57
+ .option("--postinstall-safe", "Declare this apply a package-manager install lifecycle, which runs the " +
58
+ "reduced postinstall-safe subset: no agent emit (Codex, Claude, agy, " +
59
+ "Copilot, OpenCode) and no Sonar integration, so an install never " +
60
+ "regenerates committed agent trees. Equivalent to LISA_POSTINSTALL=1.")
61
+ .option("--full-apply", "Run the FULL apply even inside a declared postinstall. Overrides " +
62
+ "--postinstall-safe and LISA_POSTINSTALL=1.")
63
63
  .option("--refresh-templates [paths]", "Let a non-interactive apply replace managed files it would otherwise report as out of date. " +
64
64
  "Optionally scope to a comma-separated list of repo-relative paths " +
65
65
  "(e.g. --refresh-templates=scripts/lisa-hooks). Backs up before replacing.")
@@ -1 +1 @@
1
- {"version":3,"file":"shared-options.js","sourceRoot":"","sources":["../../src/cli/shared-options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared-options.js","sourceRoot":"","sources":["../../src/cli/shared-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA+B9C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAmC;IAEnC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,2EAA2E;IAC3E,uEAAuE;IACvE,6BAA6B;IAC7B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,IAAI,oBAAoB,CAC5B,YAAY,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CACpD,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,OAAO;SACX,MAAM,CAAC,eAAe,EAAE,gDAAgD,CAAC;SACzE,MAAM,CACL,WAAW,EACX,oEAAoE,CACrE;SACA,MAAM,CACL,gBAAgB,EAChB,yDAAyD,CAC1D;SACA,MAAM,CACL,kBAAkB,EAClB,yEAAyE;QACvE,yEAAyE,CAC5E;SACA,MAAM,CACL,oBAAoB,EACpB,yEAAyE;QACvE,sEAAsE;QACtE,mEAAmE;QACnE,sEAAsE,CACzE;SACA,MAAM,CACL,cAAc,EACd,mEAAmE;QACjE,4CAA4C,CAC/C;SACA,MAAM,CACL,6BAA6B,EAC7B,8FAA8F;QAC5F,oEAAoE;QACpE,2EAA2E,CAC9E;SACA,MAAM,CACL,qBAAqB,EACrB,yCAAyC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,qDAAqD,EACjI,eAAe,CAChB,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAe,EACf,OAAgB,EAChB,MAAqB;IAErB,OAAO;QACL,MAAM;QACN,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC;QACjC,aAAa,EAAE,MAAM;YACnB,CAAC,CAAC,IAAI,mBAAmB,EAAE;YAC3B,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;QAC7B,gBAAgB,EAAE,IAAI,gBAAgB,EAAE;QACxC,gBAAgB,EAAE,IAAI,gBAAgB,EAAE;QACxC,UAAU,EAAE,IAAI,UAAU,EAAE;QAC5B,iBAAiB,EAAE,IAAI,iBAAiB,EAAE;KAC3C,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/base.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,8DAA8D;AAC9D,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF;;;;;;;;OAQG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBAO/B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAatD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAGlD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAItD;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,MAAM,EAAE,CAErD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEtD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACxB,YAAY,kBAAkB,KAC7B,gBAaD,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,kBAAkB,EAC5B,WAAW,kBAAkB,KAC5B,kBAiBF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,SAAS,UAAU,EAAE,KAAG,UA4C7D,CAAC"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/base.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpD,8DAA8D;AAC9D,KAAK,UAAU,GAAG,cAAc,CAAC;AAEjC;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF;;;;;;;;OAQG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,kBAO/B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAatD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAGlD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAItD;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,MAAM,EAAE,CAKrD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEtD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GACxB,YAAY,kBAAkB,KAC7B,gBAaD,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,kBAAkB,EAC5B,WAAW,kBAAkB,KAC5B,kBAiBF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,SAAS,UAAU,EAAE,KAAG,UA4C7D,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * project-specific vitest.config.ts files. Reduces duplication between
6
6
  * typescript, nestjs, and other project type configurations.
7
7
  *
8
- * Published as part of the @codyswann/lisa npm package so downstream
8
+ * Published as part of the `@codyswann/lisa` npm package so downstream
9
9
  * projects can import these utilities directly from the package.
10
10
  * @see https://vitest.dev/config/
11
11
  * @module configs/vitest/base
@@ -112,7 +112,10 @@ const resolveScratchModule = (basename) => {
112
112
  * @see {@link module:configs/vitest/scratch} for the measurements behind this
113
113
  */
114
114
  export function scratchSetupFiles() {
115
- return [resolveScratchModule("scratch-setup")];
115
+ return [
116
+ resolveScratchModule("scratch-setup"),
117
+ resolveScratchModule("scratch-leak-setup"),
118
+ ];
116
119
  }
117
120
  /**
118
121
  * Global setup that reclaims residue before a run and audits the namespace after it.