@codyswann/lisa 3.45.6 → 3.45.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 (70) hide show
  1. package/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +50 -3
  2. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  3. package/dist/core/lisa-owned-hash-ledger.js +3 -0
  4. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  5. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  6. package/dist/core/upstream-evidence-manifest.js +8 -8
  7. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  8. package/dist/migrations/ensure-playwright-dedicated-caller.d.ts +77 -0
  9. package/dist/migrations/ensure-playwright-dedicated-caller.d.ts.map +1 -0
  10. package/dist/migrations/ensure-playwright-dedicated-caller.js +370 -0
  11. package/dist/migrations/ensure-playwright-dedicated-caller.js.map +1 -0
  12. package/dist/migrations/index.d.ts +1 -0
  13. package/dist/migrations/index.d.ts.map +1 -1
  14. package/dist/migrations/index.js +3 -0
  15. package/dist/migrations/index.js.map +1 -1
  16. package/package.json +1 -1
  17. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-agy/plugin.json +1 -1
  20. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  23. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo-agy/plugin.json +1 -1
  30. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  50. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails-agy/plugin.json +1 -1
  55. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  60. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  65. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  67. package/typescript/copy-overwrite/.github/GITHUB_ACTIONS.md +5 -6
  68. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +17 -10
  69. package/harper-fabric/copy-overwrite/.github/dependabot.yml +0 -47
  70. package/typescript/copy-overwrite/.github/dependabot.yml +0 -43
@@ -0,0 +1,77 @@
1
+ import type { Migration, MigrationContext, MigrationResult } from "./migration.interface.js";
2
+ /**
3
+ * Inputs `playwright-e2e.yml` declares.
4
+ *
5
+ * Hardcoded rather than read from `ctx.lisaDir`, because `.github/` is not in
6
+ * the npm `files` allowlist — an installed Lisa carries no copy of the reusable
7
+ * workflow to parse. Exported so a test can pin it against the real workflow:
8
+ * an input added or renamed there would otherwise silently turn every caller
9
+ * passing it into a "diverged" verdict that nobody retrofits.
10
+ */
11
+ export declare const DECLARED_INPUTS: ReadonlySet<string>;
12
+ /**
13
+ * Migration: repoint a project's seeded Playwright caller at the dedicated
14
+ * reusable workflow.
15
+ *
16
+ * `expo/create-only/.github/workflows/playwright-e2e.yml` is create-only, so
17
+ * `src/core/lisa.ts` skips it whenever the destination exists. That is correct —
18
+ * it is why a project can customise the file — but it means editing the template
19
+ * ships the change to greenfield projects ONLY. "Fixed upstream" and "a version
20
+ * bump will carry it" are independent claims for anything in that lane, and this
21
+ * file was edited upstream with no path for the projects already holding a copy.
22
+ *
23
+ * The stale copy calls the shared quality workflow and suppresses the two dozen
24
+ * jobs it does not want by NAME. That inversion goes stale silently: a job added
25
+ * to the shared workflow is absent from every hand-maintained list, so it RUNS on
26
+ * a nightly whose whole point is that it runs one suite.
27
+ *
28
+ * Unlike most `ensure-*` migrations this one REWRITES a file the host owns, so it
29
+ * rewrites only a shape it recognises:
30
+ *
31
+ * - Exactly one Lisa caller in the file, and it targets the shared quality
32
+ * workflow.
33
+ * - Every input it passes, the retired `skip_jobs` aside, is one the dedicated
34
+ * workflow declares.
35
+ *
36
+ * Anything else is reported and left exactly as written. A silent fork is the
37
+ * harm to avoid, and so is a silent no-op that leaves an operator believing the
38
+ * retrofit happened — so both outcomes are logged.
39
+ */
40
+ export declare class EnsurePlaywrightDedicatedCallerMigration implements Migration {
41
+ readonly name = "ensure-playwright-dedicated-caller";
42
+ readonly description = "Repoint a seeded Playwright caller from the shared quality workflow at the dedicated one";
43
+ /**
44
+ * Applies when the caller is stale, or diverged and worth reporting.
45
+ * @param ctx - Migration context
46
+ * @returns True when there is something to do or something to say
47
+ */
48
+ applies(ctx: MigrationContext): Promise<boolean>;
49
+ /**
50
+ * Rewrite a stale caller, or report a diverged one without touching it.
51
+ * @param ctx - Migration context
52
+ * @returns Result describing the action taken
53
+ */
54
+ apply(ctx: MigrationContext): Promise<MigrationResult>;
55
+ /**
56
+ * Report a caller this migration declines to rewrite.
57
+ * @param ctx - Migration context
58
+ * @param plan - The classification that produced the decision
59
+ * @returns A skipped result carrying the operator-readable reason
60
+ */
61
+ private report;
62
+ /**
63
+ * Produce the rewritten caller lines.
64
+ * @param plan - The classification of the current file
65
+ * @param verbs - Facade verbs the project declares
66
+ * @returns The new file contents, line by line
67
+ */
68
+ private rewrite;
69
+ /**
70
+ * Summarize the rewrite for the operator standing outside the factory.
71
+ * @param plan - The classification of the current file
72
+ * @param verbs - Facade verbs the project declares
73
+ * @returns A one-line summary a non-technical reader can act on
74
+ */
75
+ private describe;
76
+ }
77
+ //# sourceMappingURL=ensure-playwright-dedicated-caller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-playwright-dedicated-caller.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-playwright-dedicated-caller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AA2BlC;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAa9C,CAAC;AAwQH;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,wCAAyC,YAAW,SAAS;IACxE,QAAQ,CAAC,IAAI,wCAAwC;IACrD,QAAQ,CAAC,WAAW,8FACyE;IAE7F;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IA+B5D;;;;;OAKG;IACH,OAAO,CAAC,MAAM;IAMd;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IA+Bf;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;CAUjB"}
@@ -0,0 +1,370 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import * as fse from "fs-extra";
4
+ import { readJsonOrNull } from "../utils/json-utils.js";
5
+ /** The seeded caller this migration repairs. */
6
+ const CALLER_FILE = path.join(".github", "workflows", "playwright-e2e.yml");
7
+ /** Any job-level caller pointing at a Lisa reusable workflow. */
8
+ const LISA_CALLER = /^\s*uses:\s*CodySwannGT\/lisa\/\.github\/workflows\/(\S+?)\.yml@(\S+)\s*$/u;
9
+ /** The reusable workflow a repaired caller must target. */
10
+ const DEDICATED_WORKFLOW = "playwright-e2e";
11
+ /** The reusable workflow a stale caller still targets. */
12
+ const STALE_WORKFLOW = "quality";
13
+ /** The `with:` block header inside a caller job. */
14
+ const WITH_HEADER = /^ {4}with:\s*$/u;
15
+ /** One input key inside a `with:` block. Continuation lines indent deeper. */
16
+ const WITH_KEY = /^ {6}(\w+):(.*)$/u;
17
+ /** A comment line at input indent — explanatory prose attached to the key below. */
18
+ const WITH_COMMENT = /^ {6}#/u;
19
+ /** The input a stale caller passes that the dedicated workflow does not declare. */
20
+ const RETIRED_INPUT = "skip_jobs";
21
+ /**
22
+ * Inputs `playwright-e2e.yml` declares.
23
+ *
24
+ * Hardcoded rather than read from `ctx.lisaDir`, because `.github/` is not in
25
+ * the npm `files` allowlist — an installed Lisa carries no copy of the reusable
26
+ * workflow to parse. Exported so a test can pin it against the real workflow:
27
+ * an input added or renamed there would otherwise silently turn every caller
28
+ * passing it into a "diverged" verdict that nobody retrofits.
29
+ */
30
+ export const DECLARED_INPUTS = new Set([
31
+ "node_version",
32
+ "package_manager",
33
+ "working_directory",
34
+ "moment",
35
+ "playwright_setup_command",
36
+ "playwright_shards",
37
+ "cache_build",
38
+ "concurrency_group",
39
+ "prepare_environment",
40
+ "prepare_verbs",
41
+ "prepare_setup_command",
42
+ "prepare_timeout_minutes",
43
+ ]);
44
+ /** Facade verbs the retrofit may request, and the script each one requires. */
45
+ const PREPARE_VERBS = [
46
+ ["reset", "environment:reset"],
47
+ ["reseed", "environment:reseed"],
48
+ ];
49
+ const EMPTY = {
50
+ verdict: "not-applicable",
51
+ reason: "",
52
+ lines: [],
53
+ usesAt: -1,
54
+ ref: "",
55
+ withAt: -1,
56
+ retiredAt: -1,
57
+ moment: "",
58
+ };
59
+ /**
60
+ * Read the input keys of the `with:` block starting at the given header line.
61
+ * @param lines - The caller file split into lines
62
+ * @param withAt - Index of the ` with:` header line
63
+ * @returns One entry per input key, in file order
64
+ */
65
+ function readWithEntries(lines, withAt) {
66
+ // Blank lines and comments stay inside the block; anything indented four
67
+ // spaces or less ends it. Continuation lines of a block scalar indent deeper
68
+ // than six spaces and so never match WITH_KEY.
69
+ const breaksAt = lines.findIndex((line, i) => i > withAt && line.trim() !== "" && !line.startsWith(" "));
70
+ const limit = breaksAt < 0 ? lines.length : breaksAt;
71
+ return lines
72
+ .slice(withAt + 1, limit)
73
+ .map((line, offset) => ({
74
+ index: withAt + 1 + offset,
75
+ match: WITH_KEY.exec(line),
76
+ }))
77
+ .filter((entry) => entry.match !== null)
78
+ .map(entry => ({
79
+ index: entry.index,
80
+ key: entry.match[1],
81
+ value: entry.match[2].trim(),
82
+ }));
83
+ }
84
+ /**
85
+ * Strip surrounding single or double quotes from a scalar value.
86
+ * @param value - Raw scalar text
87
+ * @returns The value without wrapping quotes
88
+ */
89
+ function unquote(value) {
90
+ return value.replace(/^['"]|['"]$/gu, "");
91
+ }
92
+ /**
93
+ * Input keys the dedicated workflow does not declare.
94
+ *
95
+ * `skip_jobs` CONTENTS are deliberately never consulted. That list was seeded by
96
+ * Lisa, grew every time the shared workflow gained a job, and no consumer could
97
+ * keep it current — a stale list and a hand-tuned one are the same bytes, so it
98
+ * cannot be evidence of host intent. What the host demonstrably chose is the set
99
+ * of INPUTS the caller passes, and that is what decides whether the repoint is
100
+ * safe: an undeclared input is refused at dispatch, so repointing over one would
101
+ * trade a wrong-but-running nightly for a dead one.
102
+ * @param entries - Input keys the caller passes
103
+ * @returns Undeclared keys, with the retired input excluded
104
+ */
105
+ function findUndeclared(entries) {
106
+ return entries
107
+ .filter(entry => entry.key !== RETIRED_INPUT && !DECLARED_INPUTS.has(entry.key))
108
+ .map(entry => entry.key);
109
+ }
110
+ /**
111
+ * Locate every Lisa reusable-workflow caller line in the file.
112
+ * @param lines - The caller file split into lines
113
+ * @returns Line index and capture groups for each caller found
114
+ */
115
+ function findCallers(lines) {
116
+ return lines
117
+ .map((line, index) => ({ index, match: LISA_CALLER.exec(line) }))
118
+ .filter((entry) => entry.match !== null);
119
+ }
120
+ /**
121
+ * Classify a caller already known to target the shared quality workflow.
122
+ * @param lines - The caller file split into lines
123
+ * @param caller - The caller line and its captures
124
+ * @param caller.index - Line index of the `uses:` line
125
+ * @param caller.match - Regex captures from the `uses:` line
126
+ * @returns The classification and everything a rewrite needs
127
+ */
128
+ function classifyStaleCaller(lines, caller) {
129
+ const withAt = lines.findIndex(line => WITH_HEADER.test(line));
130
+ if (withAt < 0) {
131
+ return {
132
+ ...EMPTY,
133
+ lines,
134
+ verdict: "diverged",
135
+ reason: "its caller job has no `with:` block, so it is not a shape Lisa seeded",
136
+ };
137
+ }
138
+ const entries = readWithEntries(lines, withAt);
139
+ const retired = entries.find(entry => entry.key === RETIRED_INPUT);
140
+ // An empty value means a block scalar (`|` / `>`), whose extent this
141
+ // line-based rewrite will not try to delete safely.
142
+ if (retired && retired.value === "") {
143
+ return {
144
+ ...EMPTY,
145
+ lines,
146
+ verdict: "diverged",
147
+ reason: `its \`${RETIRED_INPUT}\` value is a multi-line block, which this retrofit will not rewrite`,
148
+ };
149
+ }
150
+ const undeclared = findUndeclared(entries);
151
+ const shared = {
152
+ lines,
153
+ usesAt: caller.index,
154
+ ref: caller.match[2],
155
+ withAt,
156
+ retiredAt: retired?.index ?? -1,
157
+ moment: unquote(entries.find(entry => entry.key === "moment")?.value ?? ""),
158
+ };
159
+ return undeclared.length > 0
160
+ ? {
161
+ ...shared,
162
+ verdict: "diverged",
163
+ reason: `it passes ${undeclared.join(", ")}, which the dedicated workflow does not declare`,
164
+ }
165
+ : { ...shared, verdict: "stale", reason: "" };
166
+ }
167
+ /**
168
+ * Read and classify a project's seeded Playwright caller.
169
+ * @param projectDir - Destination project directory
170
+ * @returns The classification and everything a rewrite needs
171
+ */
172
+ async function buildPlan(projectDir) {
173
+ const file = path.join(projectDir, CALLER_FILE);
174
+ if (!(await fse.pathExists(file)))
175
+ return EMPTY;
176
+ const lines = (await readFile(file, "utf8")).split("\n");
177
+ const callers = findCallers(lines);
178
+ if (callers.length === 0)
179
+ return { ...EMPTY, lines };
180
+ if (callers.length > 1) {
181
+ return {
182
+ ...EMPTY,
183
+ lines,
184
+ verdict: "diverged",
185
+ reason: `it calls ${callers.length} Lisa reusable workflows, and this retrofit only understands a file with one`,
186
+ };
187
+ }
188
+ const caller = callers[0];
189
+ const workflow = caller.match[1];
190
+ if (workflow === DEDICATED_WORKFLOW) {
191
+ return { ...EMPTY, lines, verdict: "current" };
192
+ }
193
+ if (workflow !== STALE_WORKFLOW)
194
+ return { ...EMPTY, lines };
195
+ return classifyStaleCaller(lines, caller);
196
+ }
197
+ /**
198
+ * Derive the environment name to prepare from the caller's declared moment.
199
+ * @param moment - The caller's `moment:` input (e.g. `continuous:development`)
200
+ * @returns The environment segment, defaulting to `development`
201
+ */
202
+ function environmentFor(moment) {
203
+ const environment = moment.split(":")[1]?.trim() ?? "";
204
+ return environment === "" ? "development" : environment;
205
+ }
206
+ /**
207
+ * Read the facade verbs the project actually declares.
208
+ *
209
+ * A verb named in `prepare_verbs` that the project does not declare FAILS the
210
+ * run rather than skipping, so the retrofit asks only for verbs it can prove
211
+ * exist. A project with neither gets no `prepare_*` inputs at all, which leaves
212
+ * its nightly behaving exactly as it did.
213
+ * @param projectDir - Destination project directory
214
+ * @returns Declared verb names, in reset-then-reseed order
215
+ */
216
+ async function declaredVerbs(projectDir) {
217
+ const pkg = await readJsonOrNull(path.join(projectDir, "package.json"));
218
+ const scripts = pkg?.scripts ?? {};
219
+ return PREPARE_VERBS.filter(([, script]) => script in scripts).map(([verb]) => verb);
220
+ }
221
+ /**
222
+ * First line of the contiguous comment block immediately above `at`.
223
+ *
224
+ * The retired input's explanatory prose describes an input being deleted;
225
+ * leaving it behind documents a key the file no longer passes.
226
+ * @param lines - The caller file split into lines
227
+ * @param at - Index of the key line whose comments to find
228
+ * @returns The first line index to delete
229
+ */
230
+ function commentStart(lines, at) {
231
+ return lines
232
+ .slice(0, at)
233
+ .reduce((acc, line, i) => (WITH_COMMENT.test(line) ? acc : i + 1), 0);
234
+ }
235
+ /** The comment written above an inserted `prepare_environment` input. */
236
+ const PREPARE_NOTE = [
237
+ " # Return the environment to a known state BEFORE the suite. Cleanup-",
238
+ " # after is best-effort: it does not run when a runner dies, is",
239
+ " # cancelled, or is evicted, so the next run starts against whatever",
240
+ " # the last failure left behind.",
241
+ ];
242
+ /**
243
+ * Migration: repoint a project's seeded Playwright caller at the dedicated
244
+ * reusable workflow.
245
+ *
246
+ * `expo/create-only/.github/workflows/playwright-e2e.yml` is create-only, so
247
+ * `src/core/lisa.ts` skips it whenever the destination exists. That is correct —
248
+ * it is why a project can customise the file — but it means editing the template
249
+ * ships the change to greenfield projects ONLY. "Fixed upstream" and "a version
250
+ * bump will carry it" are independent claims for anything in that lane, and this
251
+ * file was edited upstream with no path for the projects already holding a copy.
252
+ *
253
+ * The stale copy calls the shared quality workflow and suppresses the two dozen
254
+ * jobs it does not want by NAME. That inversion goes stale silently: a job added
255
+ * to the shared workflow is absent from every hand-maintained list, so it RUNS on
256
+ * a nightly whose whole point is that it runs one suite.
257
+ *
258
+ * Unlike most `ensure-*` migrations this one REWRITES a file the host owns, so it
259
+ * rewrites only a shape it recognises:
260
+ *
261
+ * - Exactly one Lisa caller in the file, and it targets the shared quality
262
+ * workflow.
263
+ * - Every input it passes, the retired `skip_jobs` aside, is one the dedicated
264
+ * workflow declares.
265
+ *
266
+ * Anything else is reported and left exactly as written. A silent fork is the
267
+ * harm to avoid, and so is a silent no-op that leaves an operator believing the
268
+ * retrofit happened — so both outcomes are logged.
269
+ */
270
+ export class EnsurePlaywrightDedicatedCallerMigration {
271
+ name = "ensure-playwright-dedicated-caller";
272
+ description = "Repoint a seeded Playwright caller from the shared quality workflow at the dedicated one";
273
+ /**
274
+ * Applies when the caller is stale, or diverged and worth reporting.
275
+ * @param ctx - Migration context
276
+ * @returns True when there is something to do or something to say
277
+ */
278
+ async applies(ctx) {
279
+ const plan = await buildPlan(ctx.projectDir);
280
+ return plan.verdict === "stale" || plan.verdict === "diverged";
281
+ }
282
+ /**
283
+ * Rewrite a stale caller, or report a diverged one without touching it.
284
+ * @param ctx - Migration context
285
+ * @returns Result describing the action taken
286
+ */
287
+ async apply(ctx) {
288
+ const plan = await buildPlan(ctx.projectDir);
289
+ if (plan.verdict === "diverged")
290
+ return this.report(ctx, plan);
291
+ if (plan.verdict !== "stale")
292
+ return { name: this.name, action: "noop" };
293
+ const verbs = await declaredVerbs(ctx.projectDir);
294
+ const message = this.describe(plan, verbs);
295
+ if (ctx.dryRun) {
296
+ ctx.logger.dry(`Would update ${CALLER_FILE}: ${message}`);
297
+ return {
298
+ name: this.name,
299
+ action: "applied",
300
+ changedFiles: [CALLER_FILE],
301
+ message,
302
+ };
303
+ }
304
+ await writeFile(path.join(ctx.projectDir, CALLER_FILE), this.rewrite(plan, verbs).join("\n"));
305
+ ctx.logger.success(message);
306
+ return {
307
+ name: this.name,
308
+ action: "applied",
309
+ changedFiles: [CALLER_FILE],
310
+ message,
311
+ };
312
+ }
313
+ /**
314
+ * Report a caller this migration declines to rewrite.
315
+ * @param ctx - Migration context
316
+ * @param plan - The classification that produced the decision
317
+ * @returns A skipped result carrying the operator-readable reason
318
+ */
319
+ report(ctx, plan) {
320
+ const message = `Left ${CALLER_FILE} alone: ${plan.reason}. It still calls the shared quality workflow, so its nightly runs jobs this suite does not need. Repoint it by hand, or delete it and re-run to be seeded a current one.`;
321
+ ctx.logger.warn(message);
322
+ return { name: this.name, action: "skipped", message };
323
+ }
324
+ /**
325
+ * Produce the rewritten caller lines.
326
+ * @param plan - The classification of the current file
327
+ * @param verbs - Facade verbs the project declares
328
+ * @returns The new file contents, line by line
329
+ */
330
+ rewrite(plan, verbs) {
331
+ const usesLine = plan.lines[plan.usesAt].replace(`${STALE_WORKFLOW}.yml@${plan.ref}`, `${DEDICATED_WORKFLOW}.yml@${plan.ref}`);
332
+ const repointed = plan.lines.map((line, i) => i === plan.usesAt ? usesLine : line);
333
+ // Inserted at the TOP of the `with:` block: a key appended at the bottom
334
+ // could land inside a trailing block scalar such as
335
+ // `playwright_setup_command: |`, where it would be swallowed as script text.
336
+ const withPrepare = verbs.length === 0
337
+ ? repointed
338
+ : [
339
+ ...repointed.slice(0, plan.withAt + 1),
340
+ ...PREPARE_NOTE,
341
+ ` prepare_environment: '${environmentFor(plan.moment)}'`,
342
+ ` prepare_verbs: '${verbs.join(",")}'`,
343
+ ...repointed.slice(plan.withAt + 1),
344
+ ];
345
+ if (plan.retiredAt < 0)
346
+ return withPrepare;
347
+ const retiredAt = plan.retiredAt + (withPrepare.length - repointed.length);
348
+ return [
349
+ ...withPrepare.slice(0, commentStart(withPrepare, retiredAt)),
350
+ ...withPrepare.slice(retiredAt + 1),
351
+ ];
352
+ }
353
+ /**
354
+ * Summarize the rewrite for the operator standing outside the factory.
355
+ * @param plan - The classification of the current file
356
+ * @param verbs - Facade verbs the project declares
357
+ * @returns A one-line summary a non-technical reader can act on
358
+ */
359
+ describe(plan, verbs) {
360
+ const parts = [
361
+ `pointed it at the dedicated Playwright workflow (${DEDICATED_WORKFLOW}.yml@${plan.ref})`,
362
+ plan.retiredAt < 0 ? null : `dropped the retired ${RETIRED_INPUT} list`,
363
+ verbs.length === 0
364
+ ? "left the environment unprepared, because this project declares no environment:reset or environment:reseed script"
365
+ : `asked for a prepared environment (${verbs.join(", ")})`,
366
+ ].filter((part) => part !== null);
367
+ return `Retrofitted ${CALLER_FILE}: ${parts.join("; ")}`;
368
+ }
369
+ }
370
+ //# sourceMappingURL=ensure-playwright-dedicated-caller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-playwright-dedicated-caller.js","sourceRoot":"","sources":["../../src/migrations/ensure-playwright-dedicated-caller.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export { EnsureLearningsGitattributesMigration } from "./ensure-learnings-gitatt
6
6
  export { EnsureLearningsMergeDriverMigration } from "./ensure-learnings-merge-driver.js";
7
7
  export { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
8
8
  export { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
9
+ export { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.js";
9
10
  export { EnsureQualityCallerScopesMigration } from "./ensure-quality-caller-scopes.js";
10
11
  export { EnsureSonarExcludesLisaHarnessMigration } from "./ensure-sonar-excludes-lisa-harness.js";
11
12
  export { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-local-files-fallback.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,6CAA6C,EAAE,MAAM,gDAAgD,CAAC;AAC/G,OAAO,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,uCAAuC,EAAE,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD;;;OAGG;gBACS,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE;IAkB7C;;;OAGG;IACH,MAAM,IAAI,SAAS,SAAS,EAAE;IAI9B;;;;OAIG;IACG,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;CAazE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,6CAA6C,EAAE,MAAM,gDAAgD,CAAC;AAC/G,OAAO,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,wCAAwC,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,uCAAuC,EAAE,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD;;;OAGG;gBACS,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE;IAmB7C;;;OAGG;IACH,MAAM,IAAI,SAAS,SAAS,EAAE;IAI9B;;;;OAIG;IACG,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;CAazE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
@@ -4,6 +4,7 @@ import { EnsureLearningsGitattributesMigration } from "./ensure-learnings-gitatt
4
4
  import { EnsureLearningsMergeDriverMigration } from "./ensure-learnings-merge-driver.js";
5
5
  import { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
6
6
  import { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
7
+ import { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.js";
7
8
  import { EnsureQualityCallerScopesMigration } from "./ensure-quality-caller-scopes.js";
8
9
  import { EnsureSonarExcludesLisaHarnessMigration } from "./ensure-sonar-excludes-lisa-harness.js";
9
10
  import { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-local-files-fallback.js";
@@ -17,6 +18,7 @@ export { EnsureLearningsGitattributesMigration } from "./ensure-learnings-gitatt
17
18
  export { EnsureLearningsMergeDriverMigration } from "./ensure-learnings-merge-driver.js";
18
19
  export { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
19
20
  export { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
21
+ export { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.js";
20
22
  export { EnsureQualityCallerScopesMigration } from "./ensure-quality-caller-scopes.js";
21
23
  export { EnsureSonarExcludesLisaHarnessMigration } from "./ensure-sonar-excludes-lisa-harness.js";
22
24
  export { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-local-files-fallback.js";
@@ -43,6 +45,7 @@ export class MigrationRegistry {
43
45
  new EnsureLearningsMergeDriverMigration(),
44
46
  new EnsureLisaPostinstallMigration(),
45
47
  new EnsureOxlintBaseConfigsMigration(),
48
+ new EnsurePlaywrightDedicatedCallerMigration(),
46
49
  new EnsureQualityCallerScopesMigration(),
47
50
  new EnsureSonarExcludesLisaHarnessMigration(),
48
51
  new EnsureWikiSourceDeclaredMigration(),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -132,7 +132,7 @@
132
132
  "ws": ">=8.21.0"
133
133
  },
134
134
  "name": "@codyswann/lisa",
135
- "version": "3.45.6",
135
+ "version": "3.45.7",
136
136
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
137
137
  "main": "dist/index.js",
138
138
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "3.45.6",
3
+ "version": "3.45.7",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"