@codyswann/lisa 3.11.9 → 3.13.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 (145) hide show
  1. package/all/copy-overwrite/scripts/lisa-command-envelope.mjs +10 -0
  2. package/all/copy-overwrite/scripts/lisa-destructive-guard.mjs +267 -0
  3. package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +15 -2
  4. package/all/create-only/scripts/remote-agent-aws-setup.sh +3 -0
  5. package/cdk/create-only/.github/workflows/deploy.yml +2 -1
  6. package/cdk/create-only/vitest.config.local.ts +3 -0
  7. package/dist/cli/doctor-lisa-owned-artifacts.d.ts +11 -2
  8. package/dist/cli/doctor-lisa-owned-artifacts.d.ts.map +1 -1
  9. package/dist/cli/doctor-lisa-owned-artifacts.js +60 -15
  10. package/dist/cli/doctor-lisa-owned-artifacts.js.map +1 -1
  11. package/dist/core/config.d.ts +21 -1
  12. package/dist/core/config.d.ts.map +1 -1
  13. package/dist/core/config.js +1 -0
  14. package/dist/core/config.js.map +1 -1
  15. package/dist/core/guard-capabilities.d.ts +60 -0
  16. package/dist/core/guard-capabilities.d.ts.map +1 -0
  17. package/dist/core/guard-capabilities.js +102 -0
  18. package/dist/core/guard-capabilities.js.map +1 -0
  19. package/dist/core/lisa-owned-hash-ledger.d.ts +11 -0
  20. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -0
  21. package/dist/core/lisa-owned-hash-ledger.js +127 -0
  22. package/dist/core/lisa-owned-hash-ledger.js.map +1 -0
  23. package/dist/core/lisa-owned-provenance.d.ts +75 -0
  24. package/dist/core/lisa-owned-provenance.d.ts.map +1 -0
  25. package/dist/core/lisa-owned-provenance.js +127 -0
  26. package/dist/core/lisa-owned-provenance.js.map +1 -0
  27. package/dist/core/lisa.d.ts +18 -0
  28. package/dist/core/lisa.d.ts.map +1 -1
  29. package/dist/core/lisa.js +38 -0
  30. package/dist/core/lisa.js.map +1 -1
  31. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  32. package/dist/core/upstream-evidence-manifest.js +66 -53
  33. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  34. package/dist/strategies/copy-overwrite.d.ts +28 -1
  35. package/dist/strategies/copy-overwrite.d.ts.map +1 -1
  36. package/dist/strategies/copy-overwrite.js +53 -3
  37. package/dist/strategies/copy-overwrite.js.map +1 -1
  38. package/dist/strategies/strategy.interface.d.ts +13 -0
  39. package/dist/strategies/strategy.interface.d.ts.map +1 -1
  40. package/expo/create-only/.github/workflows/ci.yml +3 -0
  41. package/expo/create-only/.github/workflows/deploy.yml +2 -1
  42. package/expo/create-only/.github/workflows/maestro-e2e.yml +3 -0
  43. package/expo/create-only/.github/workflows/nightly-e2e-bypass-reaper.yml +3 -0
  44. package/expo/create-only/.github/workflows/nightly-e2e-health.yml +3 -0
  45. package/expo/create-only/.github/workflows/nightly-e2e-report.yml +3 -0
  46. package/expo/create-only/babel.config.js +3 -0
  47. package/expo/create-only/jest.config.local.ts +3 -0
  48. package/expo/create-only/jest.config.react-native-mock.js +3 -0
  49. package/expo/create-only/jest.setup.local.ts +3 -0
  50. package/expo/create-only/jest.setup.pre.local.js +3 -0
  51. package/expo/create-only/scripts/zap-baseline.sh +3 -0
  52. package/harper-fabric/create-only/.github/workflows/deploy.yml +3 -0
  53. package/harper-fabric/create-only/.github/workflows/zap-baseline.yml +3 -0
  54. package/harper-fabric/create-only/scripts/zap-baseline.sh +3 -0
  55. package/nestjs/create-only/.github/workflows/deploy.yml +3 -0
  56. package/nestjs/create-only/scripts/zap-baseline.sh +3 -0
  57. package/nestjs/create-only/vitest.config.local.ts +3 -0
  58. package/npm-package/create-only/.github/workflows/publish-to-npm.yml +2 -1
  59. package/package.json +3 -1
  60. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa/hooks/block-no-verify.sh +15 -2
  63. package/plugins/lisa/rules/eager/reset-seed-coverage.md +2 -0
  64. package/plugins/lisa-agy/plugin.json +1 -1
  65. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  68. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-copilot/hooks/block-no-verify.sh +15 -2
  72. package/plugins/lisa-copilot/rules/eager/reset-seed-coverage.md +2 -0
  73. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-cursor/hooks/block-no-verify.sh +15 -2
  75. package/plugins/lisa-cursor/rules/reset-seed-coverage.mdc +2 -0
  76. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-expo-agy/plugin.json +1 -1
  79. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  84. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  89. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  93. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  94. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  98. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  99. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  103. package/plugins/lisa-rails-agy/plugin.json +1 -1
  104. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  107. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  108. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  109. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  111. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  112. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  113. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  114. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  115. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  116. package/plugins/src/base/hooks/block-no-verify.sh +15 -2
  117. package/plugins/src/base/rules/eager/reset-seed-coverage.md +2 -0
  118. package/rails/create-only/.github/workflows/claude-code-review-response.yml +2 -1
  119. package/rails/create-only/.github/workflows/claude-nightly-code-complexity.yml +2 -1
  120. package/rails/create-only/.github/workflows/claude-nightly-test-coverage.yml +2 -1
  121. package/rails/create-only/.github/workflows/claude-nightly-test-improvement.yml +2 -1
  122. package/rails/create-only/.github/workflows/claude-sync-down-branches.yml +2 -1
  123. package/rails/create-only/.github/workflows/deploy.yml +2 -1
  124. package/rails/create-only/.mutant.yml +3 -0
  125. package/rails/create-only/.reek.yml +3 -0
  126. package/rails/create-only/.rubocop_todo.yml +3 -0
  127. package/rails/create-only/mutation.gate.yml +3 -0
  128. package/rails/create-only/rubocop.thresholds.yml +3 -0
  129. package/rails/create-only/spec/rails_helper.rb +2 -0
  130. package/rails/create-only/spec/spec_helper.rb +2 -0
  131. package/scripts/generate-lisa-owned-hash-ledger.mjs +226 -0
  132. package/typescript/create-only/.github/workflows/auto-update-pr-branches-dispatch.yml +2 -1
  133. package/typescript/create-only/.github/workflows/auto-update-pr-branches.yml +2 -1
  134. package/typescript/create-only/.github/workflows/claude-ci-auto-fix.yml +2 -1
  135. package/typescript/create-only/.github/workflows/claude-code-review-response.yml +2 -1
  136. package/typescript/create-only/.github/workflows/claude-deploy-auto-fix.yml +2 -1
  137. package/typescript/create-only/.github/workflows/claude-nightly-code-complexity.yml +2 -1
  138. package/typescript/create-only/.github/workflows/claude-nightly-test-coverage.yml +2 -1
  139. package/typescript/create-only/.github/workflows/claude-nightly-test-improvement.yml +2 -1
  140. package/typescript/create-only/.github/workflows/claude-sync-down-branches.yml +2 -1
  141. package/typescript/create-only/.github/workflows/claude.yml +2 -1
  142. package/typescript/create-only/.github/workflows/required-checks-drift.yml +2 -1
  143. package/typescript/create-only/eslint.config.local.ts +3 -0
  144. package/typescript/create-only/jest.config.local.ts +3 -0
  145. package/typescript/create-only/vitest.config.local.ts +3 -0
@@ -0,0 +1,226 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Generate the ledger of every content hash Lisa has ever shipped at each
4
+ * Lisa-owned destination path.
5
+ *
6
+ * Refresh uses it to tell a host copy that is *behind* Lisa (its bytes are some
7
+ * past Lisa release, so overwriting is correct) from one that is *ahead* (its
8
+ * bytes match no Lisa release, so overwriting would delete downstream work).
9
+ *
10
+ * Two properties are load-bearing:
11
+ *
12
+ * - **Keyed by destination, not source.** Several stacks ship a variant of the
13
+ * same installed path; a host has exactly one of them and refresh must accept
14
+ * whichever it has. The union across stacks is the honest answer to "has Lisa
15
+ * ever shipped these bytes here?".
16
+ * - **Append-only.** Existing entries are unioned in, never dropped. That makes
17
+ * the generator safe under a shallow clone: less history yields fewer new
18
+ * hashes, never the loss of known-good ones. Losing a hash would reclassify a
19
+ * legitimately stale file as host-modified and stop refreshing it — failing
20
+ * safe, but permanently.
21
+ */
22
+ import { execFileSync } from "node:child_process";
23
+ import { createHash } from "node:crypto";
24
+ import { readFileSync, writeFileSync } from "node:fs";
25
+ import path from "node:path";
26
+
27
+ const repoRoot = path.resolve(import.meta.dirname, "..");
28
+ const outputPath = path.join(repoRoot, "src/core/lisa-owned-hash-ledger.ts");
29
+ const COPY_OVERWRITE = "copy-overwrite";
30
+ const LISA_NAMESPACE_PREFIX = "lisa-";
31
+
32
+ /**
33
+ * Run a git command in the repository and return stdout as latin1 text.
34
+ *
35
+ * Blobs are read as `binary` so arbitrary bytes survive the round trip into the
36
+ * Buffer that gets hashed; decoding as UTF-8 would corrupt any non-text file.
37
+ * @param {readonly string[]} args - Arguments passed to git
38
+ * @returns {string} Command stdout, or an empty string when git fails
39
+ */
40
+ function git(args) {
41
+ try {
42
+ return execFileSync("git", args, {
43
+ cwd: repoRoot,
44
+ encoding: "buffer",
45
+ maxBuffer: 64 * 1024 * 1024,
46
+ stdio: ["ignore", "pipe", "ignore"],
47
+ }).toString("binary");
48
+ } catch {
49
+ return "";
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Whether a destination path sits in the namespace Lisa owns outright.
55
+ *
56
+ * Mirrors `isLisaOwnedTemplate` in `src/core/lisa-owned-templates.ts`. The
57
+ * duplication is deliberate — this script runs before the TypeScript build, so
58
+ * it cannot import the compiled module — and a test asserts the two agree.
59
+ *
60
+ * This is also the ledger's boundary, and it is inherited rather than chosen.
61
+ * The `lisa-` path segment is what decides which files refresh at all, so a file
62
+ * outside it is never refreshed after its initial create and has nothing for
63
+ * provenance to decide — recording hashes for it would add a regeneration gate
64
+ * to ~120 more templates and buy nothing today. If that predicate is ever
65
+ * replaced (CodySwannGT/lisa#2491 tracks it freezing non-`lisa-` guards at
66
+ * whatever version first landed), widening enrolment is this one function: the
67
+ * ledger answers "has Lisa ever shipped these bytes here?" for any managed path.
68
+ * @param {string} destination - Repo-relative destination path
69
+ * @returns {boolean} True when Lisa owns the file outright
70
+ */
71
+ function isLisaOwned(destination) {
72
+ return destination
73
+ .split("/")
74
+ .some(segment => segment.startsWith(LISA_NAMESPACE_PREFIX));
75
+ }
76
+
77
+ /**
78
+ * Every tracked copy-overwrite source that installs a Lisa-owned file.
79
+ * @returns {Map<string, string[]>} Destination path to the source paths producing it
80
+ */
81
+ function lisaOwnedSources() {
82
+ const byDestination = new Map();
83
+ const marker = `/${COPY_OVERWRITE}/`;
84
+ for (const tracked of git(["ls-files"]).split("\n")) {
85
+ const at = tracked.indexOf(marker);
86
+ if (at === -1) continue;
87
+ const destination = tracked.slice(at + marker.length);
88
+ if (!isLisaOwned(destination)) continue;
89
+ const sources = byDestination.get(destination) ?? [];
90
+ sources.push(tracked);
91
+ byDestination.set(destination, sources);
92
+ }
93
+ return byDestination;
94
+ }
95
+
96
+ /**
97
+ * Hex sha256 of a blob's bytes.
98
+ * @param {Buffer} bytes - Blob contents
99
+ * @returns {string} Lower-case hex digest
100
+ */
101
+ function digest(bytes) {
102
+ return createHash("sha256").update(bytes).digest("hex");
103
+ }
104
+
105
+ /**
106
+ * Every hash this source path has ever had, across all of its history.
107
+ *
108
+ * `--follow` keeps a renamed guard's earlier hashes, which is exactly the case
109
+ * where a host is most likely to be running an older copy.
110
+ * @param {string} source - Repo-relative source path
111
+ * @returns {string[]} Hashes of every historical revision plus the checked-in copy
112
+ */
113
+ function historicalHashes(source) {
114
+ const hashes = [];
115
+ const current = git(["show", `HEAD:${source}`]);
116
+ if (current !== "") hashes.push(digest(Buffer.from(current, "binary")));
117
+
118
+ // `--name-only` is what makes rename-following actually work. Asking for the
119
+ // commit list alone and then reading `<rev>:<source>` fails for every revision
120
+ // before a rename, because the file did not live at that path yet — the very
121
+ // revisions a long-installed host is most likely to be running.
122
+ const log = git([
123
+ "log",
124
+ "--format=%H",
125
+ "--follow",
126
+ "--name-only",
127
+ "--",
128
+ source,
129
+ ]).split("\n");
130
+ let revision = "";
131
+ for (const line of log) {
132
+ if (/^[0-9a-f]{40}$/.test(line)) {
133
+ revision = line;
134
+ continue;
135
+ }
136
+ if (line === "" || revision === "") continue;
137
+ const blob = git(["show", `${revision}:${line}`]);
138
+ if (blob !== "") hashes.push(digest(Buffer.from(blob, "binary")));
139
+ }
140
+ return hashes;
141
+ }
142
+
143
+ /**
144
+ * Hashes already recorded in the checked-in ledger, so none is ever lost.
145
+ * @returns {Map<string, string[]>} Destination path to previously recorded hashes
146
+ */
147
+ function existingLedger() {
148
+ const previous = new Map();
149
+ let source = "";
150
+ try {
151
+ source = readFileSync(outputPath, "utf8");
152
+ } catch {
153
+ return previous;
154
+ }
155
+ const entry = /"([^"]+)": Object\.freeze\(\[([^\]]*)\]\)/g;
156
+ for (const match of source.matchAll(entry)) {
157
+ previous.set(
158
+ match[1],
159
+ [...match[2].matchAll(/"([0-9a-f]{64})"/g)].map(hash => hash[1])
160
+ );
161
+ }
162
+ return previous;
163
+ }
164
+
165
+ /**
166
+ * Render the ledger module.
167
+ * @param {Map<string, string[]>} ledger - Destination path to known-good hashes
168
+ * @returns {string} TypeScript module source
169
+ */
170
+ function render(ledger) {
171
+ const entries = [...ledger.entries()]
172
+ .sort(([left], [right]) => (left < right ? -1 : 1))
173
+ // Indentation matches what Prettier produces. `lint-staged` reformats every
174
+ // staged file, so a generator whose output Prettier would reindent leaves
175
+ // `--check` failing immediately after the commit that regenerated it.
176
+ .map(([destination, hashes]) => {
177
+ const rendered = hashes.map(hash => ` "${hash}",`).join("\n");
178
+ return ` "${destination}": Object.freeze([\n${rendered}\n ]),`;
179
+ })
180
+ .join("\n");
181
+ return `/** Generated by scripts/generate-lisa-owned-hash-ledger.mjs. Do not edit. */
182
+
183
+ /**
184
+ * Every content hash Lisa has published at each Lisa-owned destination path.
185
+ *
186
+ * A host copy whose hash appears here is provably an older Lisa artifact and may
187
+ * be refreshed. One that appears nowhere here was edited downstream, and refresh
188
+ * refuses rather than risk deleting a stronger guard. See
189
+ * \`src/core/lisa-owned-provenance.ts\`.
190
+ */
191
+ export const LISA_OWNED_HASH_LEDGER: Readonly<
192
+ Record<string, readonly string[]>
193
+ > = Object.freeze({
194
+ ${entries}
195
+ });
196
+ `;
197
+ }
198
+
199
+ const ledger = new Map(existingLedger());
200
+ for (const [destination, sources] of lisaOwnedSources()) {
201
+ const known = new Set(ledger.get(destination) ?? []);
202
+ for (const source of sources) {
203
+ for (const hash of historicalHashes(source)) known.add(hash);
204
+ }
205
+ ledger.set(destination, [...known].sort());
206
+ }
207
+
208
+ const rendered = render(ledger);
209
+ if (process.argv.includes("--check")) {
210
+ let actual = "";
211
+ try {
212
+ actual = readFileSync(outputPath, "utf8");
213
+ } catch {
214
+ actual = "";
215
+ }
216
+ if (actual !== rendered) {
217
+ process.stderr.write(
218
+ "Lisa-owned hash ledger is out of date. Run `bun run build:lisa-owned-hash-ledger` and commit the result.\n"
219
+ );
220
+ process.exit(1);
221
+ }
222
+ process.stdout.write("Lisa-owned hash ledger is current.\n");
223
+ } else {
224
+ writeFileSync(outputPath, rendered);
225
+ process.stdout.write(`Wrote ${ledger.size} ledger entries.\n`);
226
+ }
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Auto-update PR branches (Dispatch Handler)
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Auto-update PR branches
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Claude CI Auto-Fix
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Claude Code Review Response
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Claude Deploy Auto-Fix
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Claude Nightly Code Complexity
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Claude Nightly Test Coverage
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Claude Nightly Test Improvement
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
  #
4
5
  # Back-syncs merges down the env chain so hotfixes propagate.
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa on first setup.
1
+ # Seeded by Lisa on first setup — this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # You can customize this file — Lisa will not overwrite it.
3
4
 
4
5
  name: Claude Code
@@ -1,4 +1,5 @@
1
- # This file was created by Lisa and is yours to edit.
1
+ # Seeded by Lisa on first setup this file is YOURS.
2
+ # Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
2
3
  # -----------------------------------------------------------------------------
3
4
  # Required-checks snapshot drift — the REMOTE arm (#2426)
4
5
  # -----------------------------------------------------------------------------
@@ -1,3 +1,6 @@
1
+ // Seeded by Lisa on first setup — this file is YOURS.
2
+ // Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
3
+
1
4
  /**
2
5
  * ESLint 9 Flat Config - Project-Local Customizations
3
6
  *
@@ -1,3 +1,6 @@
1
+ // Seeded by Lisa on first setup — this file is YOURS.
2
+ // Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
3
+
1
4
  /**
2
5
  * Jest Configuration - Project-Local Customizations
3
6
  *
@@ -1,3 +1,6 @@
1
+ // Seeded by Lisa on first setup — this file is YOURS.
2
+ // Lisa will not overwrite it. (copy-overwrite assets ARE replaced each run.)
3
+
1
4
  /**
2
5
  * Vitest Configuration - Project-Local Customizations
3
6
  *