@codyswann/lisa 4.54.11 → 4.54.13
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/all/copy-overwrite/scripts/lisa-gates.mjs +85 -4
- 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.d.ts +5 -0
- package/dist/core/nightly-e2e-guard-behavior-certificate.d.ts.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +9 -2
- package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +5 -3
- 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-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-cursor/.claude-plugin/plugin.json +1 -1
- 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/scripts/generate-nightly-e2e-guard-certificate.mjs +9 -0
- package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +59 -2
package/package.json
CHANGED
|
@@ -181,7 +181,7 @@
|
|
|
181
181
|
"zod-validation-error": "^4.0.0"
|
|
182
182
|
},
|
|
183
183
|
"name": "@codyswann/lisa",
|
|
184
|
-
"version": "4.54.
|
|
184
|
+
"version": "4.54.13",
|
|
185
185
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
186
186
|
"main": "dist/index.js",
|
|
187
187
|
"exports": {
|
|
@@ -329,7 +329,7 @@
|
|
|
329
329
|
"test": "tests"
|
|
330
330
|
},
|
|
331
331
|
"types": "./dist/index.d.ts",
|
|
332
|
-
"lisaReleaseCommit": "
|
|
333
|
-
"gitHead": "
|
|
334
|
-
"lisaReleaseTag": "v4.54.
|
|
332
|
+
"lisaReleaseCommit": "01138bafd69dc080f1cbf16b725477234cbde58a",
|
|
333
|
+
"gitHead": "01138bafd69dc080f1cbf16b725477234cbde58a",
|
|
334
|
+
"lisaReleaseTag": "v4.54.13"
|
|
335
335
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.54.
|
|
3
|
+
"version": "4.54.13",
|
|
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.54.
|
|
3
|
+
"version": "4.54.13",
|
|
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.54.
|
|
3
|
+
"version": "4.54.13",
|
|
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.54.
|
|
3
|
+
"version": "4.54.13",
|
|
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.54.
|
|
3
|
+
"version": "4.54.13",
|
|
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"
|
|
@@ -61,6 +61,15 @@ export const RETAINED_RELEASES = Object.freeze([
|
|
|
61
61
|
// under the same contract version, which is why retention is a ref list and
|
|
62
62
|
// not a contract list.
|
|
63
63
|
"v4.26.0",
|
|
64
|
+
// The 1.9.0 guard, as `@codyswann/lisa@4.50.3` published it. Retained in the
|
|
65
|
+
// same commit that moves the workspace guard, because that is the whole
|
|
66
|
+
// window: regeneration certifies the WORKSPACE bytes under the workspace
|
|
67
|
+
// package version, so a guard-changing commit replaces the outgoing row
|
|
68
|
+
// instead of adding beside it, and the release already installed in the field
|
|
69
|
+
// silently loses its certificate. That is exactly what commit 48c936bb9 did
|
|
70
|
+
// to the 50 releases from v4.22.13 through v4.26.0 (#3500), found only after
|
|
71
|
+
// the fact. Adding the ref here is what stops this change repeating it.
|
|
72
|
+
"v4.50.3",
|
|
64
73
|
]);
|
|
65
74
|
|
|
66
75
|
const digest = bytes => createHash("sha256").update(bytes).digest("hex");
|
|
@@ -464,6 +464,57 @@ export const REQUIRED_BYPASS_REASON_PATTERN =
|
|
|
464
464
|
*/
|
|
465
465
|
export const DEFAULT_BYPASS_REASON_PATTERN = REQUIRED_BYPASS_REASON_PATTERN;
|
|
466
466
|
|
|
467
|
+
/**
|
|
468
|
+
* Blank out fenced code blocks so documentation cannot stand in as a waiver.
|
|
469
|
+
*
|
|
470
|
+
* The reason pattern is `^`-anchored and matched multiline against the raw pull
|
|
471
|
+
* request body, so a `Nightly-E2E-Bypass:` line inside ``` ``` ``` matched
|
|
472
|
+
* exactly as readily as one an author wrote to assert something. A pull request
|
|
473
|
+
* DOCUMENTING the waiver format — which is the natural way to document it —
|
|
474
|
+
* therefore waived its own gate, and a quoted example from another pull request
|
|
475
|
+
* waived it under that other pull request's ticket. The bypass was still
|
|
476
|
+
* authorised (label present, applied by a maintainer, inside the window); what
|
|
477
|
+
* was fabricated is the audit record, which is the part the waiver exists to
|
|
478
|
+
* produce.
|
|
479
|
+
*
|
|
480
|
+
* Fences are the whole hole, and the `^` anchor is why. A line inside an
|
|
481
|
+
* indented block starts with spaces, a blockquote line starts with `>`, and an
|
|
482
|
+
* inline span at column zero starts with a backtick — none of them can match an
|
|
483
|
+
* anchored pattern. Inline spans are stripped anyway, because they cost one
|
|
484
|
+
* line here and the anchor is not a property anyone should have to remember.
|
|
485
|
+
*
|
|
486
|
+
* Lines are blanked rather than removed. Deleting them would slide unrelated
|
|
487
|
+
* lines together and could manufacture a match that the body never contained,
|
|
488
|
+
* which is the same class of defect one step along.
|
|
489
|
+
* @param {string} body - Raw pull request body.
|
|
490
|
+
* @returns {string} The body with code spans and fenced blocks blanked.
|
|
491
|
+
*/
|
|
492
|
+
export function stripMarkdownCode(body) {
|
|
493
|
+
let fence = null;
|
|
494
|
+
return String(body ?? "")
|
|
495
|
+
.split("\n")
|
|
496
|
+
.map(line => {
|
|
497
|
+
const opener = /^\s{0,3}(`{3,}|~{3,})/u.exec(line);
|
|
498
|
+
if (fence === null) {
|
|
499
|
+
if (opener) {
|
|
500
|
+
fence = opener[1][0].repeat(opener[1].length);
|
|
501
|
+
return "";
|
|
502
|
+
}
|
|
503
|
+
// A closing fence may be LONGER than its opener, never shorter, so the
|
|
504
|
+
// run length is carried rather than assumed.
|
|
505
|
+
return line.replace(/`+[^`]*`+/gu, " ");
|
|
506
|
+
}
|
|
507
|
+
if (
|
|
508
|
+
opener &&
|
|
509
|
+
opener[1][0] === fence[0] &&
|
|
510
|
+
opener[1].length >= fence.length
|
|
511
|
+
)
|
|
512
|
+
fence = null;
|
|
513
|
+
return "";
|
|
514
|
+
})
|
|
515
|
+
.join("\n");
|
|
516
|
+
}
|
|
517
|
+
|
|
467
518
|
/** Hard ceiling on how far out a bootstrap window may sit. */
|
|
468
519
|
export const BOOTSTRAP_ABSOLUTE_MAX_DAYS = 30;
|
|
469
520
|
|
|
@@ -1564,8 +1615,12 @@ export function evaluateBypass(request) {
|
|
|
1564
1615
|
|
|
1565
1616
|
// The built-in rule ALWAYS applies. It is checked first and on its own, so no
|
|
1566
1617
|
// caller-supplied pattern can stand in for it.
|
|
1618
|
+
//
|
|
1619
|
+
// Matched against the body with fenced code blanked: a waiver is prose that
|
|
1620
|
+
// ASSERTS something, and a code sample never is. See `stripMarkdownCode`.
|
|
1621
|
+
const assertedBody = stripMarkdownCode(prBody ?? "");
|
|
1567
1622
|
const found = new RegExp(REQUIRED_BYPASS_REASON_PATTERN, "m").exec(
|
|
1568
|
-
|
|
1623
|
+
assertedBody
|
|
1569
1624
|
);
|
|
1570
1625
|
if (!found) {
|
|
1571
1626
|
return reject("no_reason_or_ticket", {
|
|
@@ -1584,7 +1639,9 @@ export function evaluateBypass(request) {
|
|
|
1584
1639
|
`\`bypass_reason_pattern\` does not compile: ${error instanceof Error ? error.message : String(error)}`
|
|
1585
1640
|
);
|
|
1586
1641
|
}
|
|
1587
|
-
|
|
1642
|
+
// Same body the built-in rule saw. A project pattern that could match
|
|
1643
|
+
// inside a fence would reopen the hole one layer along.
|
|
1644
|
+
if (!extra.test(assertedBody)) {
|
|
1588
1645
|
return reject("no_reason_or_ticket", {
|
|
1589
1646
|
expiresAt: new Date(expiresMs).toISOString(),
|
|
1590
1647
|
});
|