@codyswann/lisa 4.56.2 → 4.56.4
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.
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +4 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +5 -4
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/hooks/threshold-ratchet-compare.mjs +42 -5
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/hooks/threshold-ratchet-compare.mjs +42 -5
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/threshold-ratchet-compare.mjs +42 -5
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/hooks/threshold-ratchet-compare.mjs +42 -5
- package/rails/copy-overwrite/scripts/threshold-ratchet-compare.mjs +42 -5
- package/typescript/copy-overwrite/scripts/lisa-mutation.mjs +40 -12
- package/typescript/copy-overwrite/scripts/threshold-ratchet-compare.mjs +42 -5
package/package.json
CHANGED
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
"zod-validation-error": "^4.0.0"
|
|
188
188
|
},
|
|
189
189
|
"name": "@codyswann/lisa",
|
|
190
|
-
"version": "4.56.
|
|
190
|
+
"version": "4.56.4",
|
|
191
191
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
192
192
|
"main": "dist/index.js",
|
|
193
193
|
"exports": {
|
|
@@ -336,7 +336,7 @@
|
|
|
336
336
|
"test": "tests"
|
|
337
337
|
},
|
|
338
338
|
"types": "./dist/index.d.ts",
|
|
339
|
-
"lisaReleaseCommit": "
|
|
340
|
-
"gitHead": "
|
|
341
|
-
"lisaReleaseTag": "v4.56.
|
|
339
|
+
"lisaReleaseCommit": "1f134d88a24036f168aa78106e127e1b2379c09d",
|
|
340
|
+
"gitHead": "1f134d88a24036f168aa78106e127e1b2379c09d",
|
|
341
|
+
"lisaReleaseTag": "v4.56.4"
|
|
342
342
|
}
|
|
@@ -231,6 +231,47 @@ function compareAllowList(relPath, base, current) {
|
|
|
231
231
|
return findings;
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Compare Lighthouse assertions, including the shipped detail checker's default.
|
|
236
|
+
* Only lighthouserc-config.json's top-level forced-reflow setting is read by
|
|
237
|
+
* check-lighthouse-details.mjs. Other filenames and audits have no inferred
|
|
238
|
+
* baseline. The real checker/comparator boundary is covered by a parity test.
|
|
239
|
+
* @param {string} relPath Repo-relative path
|
|
240
|
+
* @param {unknown} base Parsed baseline config
|
|
241
|
+
* @param {unknown} current Parsed current config
|
|
242
|
+
* @returns {Finding[]} Removed or weakened assertions
|
|
243
|
+
*/
|
|
244
|
+
function compareLighthouse(relPath, base, current) {
|
|
245
|
+
const baseline = extractLighthouseAssertions(base);
|
|
246
|
+
const updated = extractLighthouseAssertions(current);
|
|
247
|
+
const findings = compareConstraints(relPath, baseline, updated);
|
|
248
|
+
const previous = base?.assertions?.forcedReflowInsight?.maxNumericValue;
|
|
249
|
+
const added = current?.assertions?.forcedReflowInsight?.maxNumericValue;
|
|
250
|
+
if (
|
|
251
|
+
relPath.split("/").at(-1) === "lighthouserc-config.json" &&
|
|
252
|
+
(previous == null ||
|
|
253
|
+
base?.ci?.assert?.assertions != null ||
|
|
254
|
+
current?.ci?.assert?.assertions != null) &&
|
|
255
|
+
(previous == null ||
|
|
256
|
+
(typeof previous === "number" && Number.isFinite(previous))) &&
|
|
257
|
+
typeof added === "number" &&
|
|
258
|
+
Number.isFinite(added)
|
|
259
|
+
) {
|
|
260
|
+
// This checker reads top-level settings even beside canonical assertions.
|
|
261
|
+
// Keep its comparison separate so a new setting cannot replace a canonical
|
|
262
|
+
// bound with the same audit name and hide that bound's weakening.
|
|
263
|
+
const key = "forcedReflowInsight.maxNumericValue";
|
|
264
|
+
findings.push(
|
|
265
|
+
...compareConstraints(
|
|
266
|
+
relPath,
|
|
267
|
+
new Map([[key, { value: previous ?? 100, direction: "max" }]]),
|
|
268
|
+
new Map([[key, { value: added, direction: "max" }]])
|
|
269
|
+
)
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
return findings;
|
|
273
|
+
}
|
|
274
|
+
|
|
234
275
|
/**
|
|
235
276
|
* Compare one watched file's baseline and current contents and report every
|
|
236
277
|
* weakening. Pure: no filesystem or git access.
|
|
@@ -301,11 +342,7 @@ export function compareFile(relPath, baselineText, currentText) {
|
|
|
301
342
|
case "k6":
|
|
302
343
|
return compareK6(relPath, base, current);
|
|
303
344
|
case "lighthouse":
|
|
304
|
-
return
|
|
305
|
-
relPath,
|
|
306
|
-
extractLighthouseAssertions(base),
|
|
307
|
-
extractLighthouseAssertions(current)
|
|
308
|
-
);
|
|
345
|
+
return compareLighthouse(relPath, base, current);
|
|
309
346
|
case KIND_ALLOW_LIST:
|
|
310
347
|
return compareAllowList(relPath, base, current);
|
|
311
348
|
default:
|
|
@@ -231,6 +231,47 @@ function compareAllowList(relPath, base, current) {
|
|
|
231
231
|
return findings;
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Compare Lighthouse assertions, including the shipped detail checker's default.
|
|
236
|
+
* Only lighthouserc-config.json's top-level forced-reflow setting is read by
|
|
237
|
+
* check-lighthouse-details.mjs. Other filenames and audits have no inferred
|
|
238
|
+
* baseline. The real checker/comparator boundary is covered by a parity test.
|
|
239
|
+
* @param {string} relPath Repo-relative path
|
|
240
|
+
* @param {unknown} base Parsed baseline config
|
|
241
|
+
* @param {unknown} current Parsed current config
|
|
242
|
+
* @returns {Finding[]} Removed or weakened assertions
|
|
243
|
+
*/
|
|
244
|
+
function compareLighthouse(relPath, base, current) {
|
|
245
|
+
const baseline = extractLighthouseAssertions(base);
|
|
246
|
+
const updated = extractLighthouseAssertions(current);
|
|
247
|
+
const findings = compareConstraints(relPath, baseline, updated);
|
|
248
|
+
const previous = base?.assertions?.forcedReflowInsight?.maxNumericValue;
|
|
249
|
+
const added = current?.assertions?.forcedReflowInsight?.maxNumericValue;
|
|
250
|
+
if (
|
|
251
|
+
relPath.split("/").at(-1) === "lighthouserc-config.json" &&
|
|
252
|
+
(previous == null ||
|
|
253
|
+
base?.ci?.assert?.assertions != null ||
|
|
254
|
+
current?.ci?.assert?.assertions != null) &&
|
|
255
|
+
(previous == null ||
|
|
256
|
+
(typeof previous === "number" && Number.isFinite(previous))) &&
|
|
257
|
+
typeof added === "number" &&
|
|
258
|
+
Number.isFinite(added)
|
|
259
|
+
) {
|
|
260
|
+
// This checker reads top-level settings even beside canonical assertions.
|
|
261
|
+
// Keep its comparison separate so a new setting cannot replace a canonical
|
|
262
|
+
// bound with the same audit name and hide that bound's weakening.
|
|
263
|
+
const key = "forcedReflowInsight.maxNumericValue";
|
|
264
|
+
findings.push(
|
|
265
|
+
...compareConstraints(
|
|
266
|
+
relPath,
|
|
267
|
+
new Map([[key, { value: previous ?? 100, direction: "max" }]]),
|
|
268
|
+
new Map([[key, { value: added, direction: "max" }]])
|
|
269
|
+
)
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
return findings;
|
|
273
|
+
}
|
|
274
|
+
|
|
234
275
|
/**
|
|
235
276
|
* Compare one watched file's baseline and current contents and report every
|
|
236
277
|
* weakening. Pure: no filesystem or git access.
|
|
@@ -301,11 +342,7 @@ export function compareFile(relPath, baselineText, currentText) {
|
|
|
301
342
|
case "k6":
|
|
302
343
|
return compareK6(relPath, base, current);
|
|
303
344
|
case "lighthouse":
|
|
304
|
-
return
|
|
305
|
-
relPath,
|
|
306
|
-
extractLighthouseAssertions(base),
|
|
307
|
-
extractLighthouseAssertions(current)
|
|
308
|
-
);
|
|
345
|
+
return compareLighthouse(relPath, base, current);
|
|
309
346
|
case KIND_ALLOW_LIST:
|
|
310
347
|
return compareAllowList(relPath, base, current);
|
|
311
348
|
default:
|
|
@@ -231,6 +231,47 @@ function compareAllowList(relPath, base, current) {
|
|
|
231
231
|
return findings;
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Compare Lighthouse assertions, including the shipped detail checker's default.
|
|
236
|
+
* Only lighthouserc-config.json's top-level forced-reflow setting is read by
|
|
237
|
+
* check-lighthouse-details.mjs. Other filenames and audits have no inferred
|
|
238
|
+
* baseline. The real checker/comparator boundary is covered by a parity test.
|
|
239
|
+
* @param {string} relPath Repo-relative path
|
|
240
|
+
* @param {unknown} base Parsed baseline config
|
|
241
|
+
* @param {unknown} current Parsed current config
|
|
242
|
+
* @returns {Finding[]} Removed or weakened assertions
|
|
243
|
+
*/
|
|
244
|
+
function compareLighthouse(relPath, base, current) {
|
|
245
|
+
const baseline = extractLighthouseAssertions(base);
|
|
246
|
+
const updated = extractLighthouseAssertions(current);
|
|
247
|
+
const findings = compareConstraints(relPath, baseline, updated);
|
|
248
|
+
const previous = base?.assertions?.forcedReflowInsight?.maxNumericValue;
|
|
249
|
+
const added = current?.assertions?.forcedReflowInsight?.maxNumericValue;
|
|
250
|
+
if (
|
|
251
|
+
relPath.split("/").at(-1) === "lighthouserc-config.json" &&
|
|
252
|
+
(previous == null ||
|
|
253
|
+
base?.ci?.assert?.assertions != null ||
|
|
254
|
+
current?.ci?.assert?.assertions != null) &&
|
|
255
|
+
(previous == null ||
|
|
256
|
+
(typeof previous === "number" && Number.isFinite(previous))) &&
|
|
257
|
+
typeof added === "number" &&
|
|
258
|
+
Number.isFinite(added)
|
|
259
|
+
) {
|
|
260
|
+
// This checker reads top-level settings even beside canonical assertions.
|
|
261
|
+
// Keep its comparison separate so a new setting cannot replace a canonical
|
|
262
|
+
// bound with the same audit name and hide that bound's weakening.
|
|
263
|
+
const key = "forcedReflowInsight.maxNumericValue";
|
|
264
|
+
findings.push(
|
|
265
|
+
...compareConstraints(
|
|
266
|
+
relPath,
|
|
267
|
+
new Map([[key, { value: previous ?? 100, direction: "max" }]]),
|
|
268
|
+
new Map([[key, { value: added, direction: "max" }]])
|
|
269
|
+
)
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
return findings;
|
|
273
|
+
}
|
|
274
|
+
|
|
234
275
|
/**
|
|
235
276
|
* Compare one watched file's baseline and current contents and report every
|
|
236
277
|
* weakening. Pure: no filesystem or git access.
|
|
@@ -301,11 +342,7 @@ export function compareFile(relPath, baselineText, currentText) {
|
|
|
301
342
|
case "k6":
|
|
302
343
|
return compareK6(relPath, base, current);
|
|
303
344
|
case "lighthouse":
|
|
304
|
-
return
|
|
305
|
-
relPath,
|
|
306
|
-
extractLighthouseAssertions(base),
|
|
307
|
-
extractLighthouseAssertions(current)
|
|
308
|
-
);
|
|
345
|
+
return compareLighthouse(relPath, base, current);
|
|
309
346
|
case KIND_ALLOW_LIST:
|
|
310
347
|
return compareAllowList(relPath, base, current);
|
|
311
348
|
default:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.56.
|
|
3
|
+
"version": "4.56.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.56.
|
|
3
|
+
"version": "4.56.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.56.
|
|
3
|
+
"version": "4.56.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.56.
|
|
3
|
+
"version": "4.56.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.56.
|
|
3
|
+
"version": "4.56.4",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|