@codyswann/lisa 4.34.15 → 4.34.17

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 (91) hide show
  1. package/all/copy-overwrite/scripts/lib/gate-failure-diagnosis.mjs +3 -5
  2. package/all/copy-overwrite/scripts/lisa-hooks/block-direct-issue-create.sh +20 -3
  3. package/all/copy-overwrite/scripts/lisa-hooks/block-managed-file-edits.sh +33 -8
  4. package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +49 -4
  5. package/all/copy-overwrite/scripts/lisa-work-item.mjs +1 -1
  6. package/dist/codex/scripts/block-no-verify.sh +49 -4
  7. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  8. package/dist/core/lisa-owned-hash-ledger.js +18 -0
  9. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  10. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  11. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  12. package/dist/core/upstream-evidence-manifest.js +17 -14
  13. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  14. package/dist/opencode/plugin-templates/block-no-verify.sh +49 -4
  15. package/expo/copy-overwrite/scripts/check-lighthouse-details.mjs +13 -7
  16. package/package.json +4 -4
  17. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +90 -0
  20. package/plugins/lisa/hooks/block-direct-issue-create.sh +20 -3
  21. package/plugins/lisa/hooks/block-managed-file-edits.sh +33 -8
  22. package/plugins/lisa/hooks/block-no-verify.agy.sh +49 -4
  23. package/plugins/lisa/hooks/block-no-verify.sh +49 -4
  24. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +90 -0
  25. package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +20 -3
  26. package/plugins/lisa-agy/hooks/block-no-verify.agy.sh +49 -4
  27. package/plugins/lisa-agy/plugin.json +1 -1
  28. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +90 -0
  29. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  32. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +20 -3
  36. package/plugins/lisa-copilot/hooks/block-managed-file-edits.sh +33 -8
  37. package/plugins/lisa-copilot/hooks/block-no-verify.sh +49 -4
  38. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +90 -0
  39. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +20 -3
  41. package/plugins/lisa-cursor/hooks/block-managed-file-edits.sh +33 -8
  42. package/plugins/lisa-cursor/hooks/block-no-verify.sh +49 -4
  43. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +90 -0
  44. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-expo-agy/plugin.json +1 -1
  47. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  52. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  57. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  62. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  67. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-rails-agy/plugin.json +1 -1
  72. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  77. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  82. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/src/base/hooks/block-direct-issue-create.sh +20 -3
  85. package/plugins/src/base/hooks/block-managed-file-edits.sh +33 -8
  86. package/plugins/src/base/hooks/block-no-verify.agy.sh +49 -4
  87. package/plugins/src/base/hooks/block-no-verify.sh +49 -4
  88. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +90 -0
  89. package/rails/create-only/.github/workflows/deploy.yml +30 -0
  90. package/typescript/copy-overwrite/.claude/hooks/worktree-create.sh +3 -1
  91. package/typescript/copy-overwrite/scripts/lisa-mutation.mjs +14 -54
@@ -197,46 +197,6 @@ export const OUTCOMES = Object.freeze({
197
197
  noFloorApplied: "mutation-gate: no-floor-applied",
198
198
  });
199
199
 
200
- /**
201
- * The outcomes under which Stryker generated mutants and produced a score.
202
- *
203
- * THE POINT OF #3668. Every other outcome in {@link OUTCOMES} ends a run that
204
- * MEASURED NOTHING, and until this set existed the exit-0 members of that group
205
- * were indistinguishable from a real pass at the only layer a merge decision
206
- * consults: `🔍 Quality Checks / 🧬 Mutation Testing Gate` printed `pass` for a
207
- * pull request no mutant had touched. Measured on #3664 — a 400-line change to
208
- * a shipped guard script, `nothing-to-mutate`, `pass`.
209
- *
210
- * The file said so itself, above {@link OUTCOMES}, and had for months: "both
211
- * exit 0, and only the marker says which one happened." The marker lives in a
212
- * log; a log is not a control. This set is what lets the workflow render the
213
- * difference.
214
- *
215
- * MEMBERSHIP IS THE STRYKER RUN, not the verdict. `scoped` and `wholeList` are
216
- * the two outcomes that carry a `reportRun`, so they are the two under which
217
- * mutants existed — whether the score then cleared the floor or not is a
218
- * different question, answered by the exit code. A run that measured and FAILED
219
- * is still a run that measured.
220
- */
221
- export const MEASURED_OUTCOMES = Object.freeze([
222
- OUTCOMES.scoped,
223
- OUTCOMES.wholeList,
224
- ]);
225
-
226
- /**
227
- * Whether an outcome means mutants were generated against this change.
228
- *
229
- * An unknown marker answers `false`, and that direction is deliberate: a new
230
- * outcome added without being classified must not inherit "measured". Failing
231
- * closed here costs a `skipping` row on a run that did measure; failing open
232
- * costs exactly the false green this issue is about.
233
- *
234
- * @param {string} outcome - One {@link OUTCOMES} marker
235
- * @returns {boolean} True when Stryker produced mutants
236
- */
237
- export const measuredAnything = outcome =>
238
- MEASURED_OUTCOMES.includes(String(outcome));
239
-
240
200
  /**
241
201
  * Publishes the outcome where the workflow can render it, then returns the code.
242
202
  *
@@ -259,16 +219,17 @@ export const measuredAnything = outcome =>
259
219
  *
260
220
  * @param {string} outcome - The {@link OUTCOMES} marker this run ended on
261
221
  * @param {number} code - The exit code to return unchanged
222
+ * @param {boolean} [measured] - Whether this concrete run produced a score
262
223
  * @param {NodeJS.ProcessEnv} [env] - Environment, injectable for tests
263
224
  * @returns {number} `code`, unchanged
264
225
  */
265
- export const finish = (outcome, code, env = process.env) => {
226
+ export const finish = (outcome, code, measured = false, env = process.env) => {
266
227
  const target = env.GITHUB_OUTPUT;
267
228
  if (target === undefined || target === "") return code;
268
229
  try {
269
230
  fs.appendFileSync(
270
231
  target,
271
- `mutation_outcome=${outcome}\nmutation_measured=${measuredAnything(outcome)}\n`
232
+ `mutation_outcome=${outcome}\nmutation_measured=${measured === true}\n`
272
233
  );
273
234
  } catch (error) {
274
235
  console.error(
@@ -2107,10 +2068,10 @@ export const WHOLE_LIST_FLAG = "--all";
2107
2068
  * measured, printed, and — when it is what carried the run over the floor —
2108
2069
  * failed on. See {@link timeoutAccounting}.
2109
2070
  * @param {string} cwd - Project root.
2110
- * @param {{code: number, output: string|null}} result - From `runStryker`.
2111
- * @returns {number} The exit code the caller should use.
2071
+ * @param {{code: number, output: string|null, killedBy?: string}} result - From `runStryker`.
2072
+ * @returns {{code: number, measured: boolean}} The exit code and whether a score was produced.
2112
2073
  */
2113
- const reportRun = (cwd, result) => {
2074
+ export const reportRun = (cwd, result) => {
2114
2075
  const accounting = accountForTimeouts(result.output, cwd);
2115
2076
  if (result.killedBy === CHILD_DEADLINE) {
2116
2077
  // A gate that ran and failed measured something; a gate that was KILLED
@@ -2119,7 +2080,7 @@ const reportRun = (cwd, result) => {
2119
2080
  // arm comes before the classification below because that reads Stryker's
2120
2081
  // transcript, and a killed run's transcript stops wherever the kill landed.
2121
2082
  console.error(childDeadlineBlock(resolveChildDeadline()));
2122
- return result.code;
2083
+ return { code: result.code, measured: false };
2123
2084
  }
2124
2085
  if (result.code !== 0) {
2125
2086
  // Stryker's own verdict stands; what is added is WHICH failure it was. The
@@ -2135,14 +2096,14 @@ const reportRun = (cwd, result) => {
2135
2096
  // that DID produce one still gets the honest recomputation: a run under the
2136
2097
  // floor is under it by more than Stryker said.
2137
2098
  if (accounting.measured) console.error(accounting.message);
2138
- return result.code;
2099
+ return { code: result.code, measured: accounting.measured };
2139
2100
  }
2140
2101
  if (accounting.failed) {
2141
2102
  console.error(accounting.message);
2142
- return 1;
2103
+ return { code: 1, measured: accounting.measured };
2143
2104
  }
2144
2105
  console.log(accounting.message);
2145
- return 0;
2106
+ return { code: 0, measured: accounting.measured };
2146
2107
  };
2147
2108
 
2148
2109
  /**
@@ -2216,7 +2177,8 @@ export const runGate = (cwd = process.cwd(), argv = []) => {
2216
2177
  `🧬 ${OUTCOMES.wholeList} — Stryker over every pattern in ` +
2217
2178
  `${declaration.source}, with no diff scoping.`
2218
2179
  );
2219
- return finish(OUTCOMES.wholeList, reportRun(cwd, runStryker(cwd, [])));
2180
+ const reported = reportRun(cwd, runStryker(cwd, []));
2181
+ return finish(OUTCOMES.wholeList, reported.code, reported.measured);
2220
2182
  }
2221
2183
 
2222
2184
  const base = resolveDiffBase(cwd, since);
@@ -2324,10 +2286,8 @@ export const runGate = (cwd = process.cwd(), argv = []) => {
2324
2286
  );
2325
2287
  for (const file of scope.selected) console.log(` • ${file}`);
2326
2288
 
2327
- return finish(
2328
- OUTCOMES.scoped,
2329
- reportRun(cwd, runStryker(cwd, scope.selected))
2330
- );
2289
+ const reported = reportRun(cwd, runStryker(cwd, scope.selected));
2290
+ return finish(OUTCOMES.scoped, reported.code, reported.measured);
2331
2291
  };
2332
2292
 
2333
2293
  /**