@codyswann/lisa 4.51.0 → 4.52.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.
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +2 -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 -3
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/expo/copy-overwrite/scripts/check-e2e-coverage.mjs +117 -4
- 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-two-channel-couplings.ts +215 -7
- package/scripts/two-channel-couplings.json +94 -0
|
@@ -151,13 +151,119 @@ export function normalizeVisitedPath(raw) {
|
|
|
151
151
|
return trimmed || "/";
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Remove JavaScript comments, leaving string literals intact.
|
|
156
|
+
*
|
|
157
|
+
* Naively deleting from `//` to end of line would eat the rest of
|
|
158
|
+
* `page.goto("https://host/route")` and LOSE a real navigation, so this tracks
|
|
159
|
+
* string state and only treats a delimiter as a comment outside one.
|
|
160
|
+
*
|
|
161
|
+
* Two shapes are deliberately not modelled: a `//` inside `${...}` within a
|
|
162
|
+
* template literal, and one inside a regex literal. Both are left as string
|
|
163
|
+
* content, so the failure is UNDER-stripping — a comment that survives can only
|
|
164
|
+
* credit what the old code already credited. Over-stripping is the direction
|
|
165
|
+
* that would silently delete real navigations, and nothing here can reach it.
|
|
166
|
+
* @param {string} source - JavaScript or TypeScript source
|
|
167
|
+
* @returns {string} The same source with comment bodies removed
|
|
168
|
+
*/
|
|
169
|
+
export function stripJsComments(source) {
|
|
170
|
+
let out = "";
|
|
171
|
+
let index = 0;
|
|
172
|
+
let quote = null;
|
|
173
|
+
while (index < source.length) {
|
|
174
|
+
const character = source[index];
|
|
175
|
+
const next = source[index + 1];
|
|
176
|
+
if (quote !== null) {
|
|
177
|
+
if (character === "\\") {
|
|
178
|
+
out += character + (next ?? "");
|
|
179
|
+
index += 2;
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (character === quote) quote = null;
|
|
183
|
+
out += character;
|
|
184
|
+
index += 1;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (character === '"' || character === "'" || character === "`") {
|
|
188
|
+
quote = character;
|
|
189
|
+
out += character;
|
|
190
|
+
index += 1;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (character === "/" && next === "/") {
|
|
194
|
+
while (index < source.length && source[index] !== "\n") index += 1;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (character === "/" && next === "*") {
|
|
198
|
+
index += 2;
|
|
199
|
+
while (
|
|
200
|
+
index < source.length &&
|
|
201
|
+
!(source[index] === "*" && source[index + 1] === "/")
|
|
202
|
+
) {
|
|
203
|
+
// Newlines survive so any line-based reporting keeps its numbering.
|
|
204
|
+
if (source[index] === "\n") out += "\n";
|
|
205
|
+
index += 1;
|
|
206
|
+
}
|
|
207
|
+
index += 2;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
out += character;
|
|
211
|
+
index += 1;
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Remove YAML comments, leaving quoted scalars intact.
|
|
218
|
+
*
|
|
219
|
+
* `#` opens a comment only at line start or after whitespace, which is YAML's
|
|
220
|
+
* own rule and the reason `openLink: myapp://x#fragment` keeps its fragment.
|
|
221
|
+
* @param {string} source - YAML source
|
|
222
|
+
* @returns {string} The same source with comment bodies removed
|
|
223
|
+
*/
|
|
224
|
+
export function stripYamlComments(source) {
|
|
225
|
+
return source
|
|
226
|
+
.split("\n")
|
|
227
|
+
.map(line => {
|
|
228
|
+
let quote = null;
|
|
229
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
230
|
+
const character = line[index];
|
|
231
|
+
if (quote !== null) {
|
|
232
|
+
if (character === "\\" && quote === '"') {
|
|
233
|
+
index += 1;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
if (character === quote) quote = null;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (character === '"' || character === "'") {
|
|
240
|
+
quote = character;
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (character === "#" && (index === 0 || /\s/u.test(line[index - 1])))
|
|
244
|
+
return line.slice(0, index);
|
|
245
|
+
}
|
|
246
|
+
return line;
|
|
247
|
+
})
|
|
248
|
+
.join("\n");
|
|
249
|
+
}
|
|
250
|
+
|
|
154
251
|
/**
|
|
155
252
|
* Extract every route-comparable path a Playwright spec visits.
|
|
253
|
+
*
|
|
254
|
+
* Navigations are read from CODE and annotations from the RAW source, and the
|
|
255
|
+
* asymmetry is the whole point: a comment may DECLARE coverage, but it may not
|
|
256
|
+
* SIMULATE a navigation. `e2e-route:` lives in a comment on purpose — it is an
|
|
257
|
+
* author stating what a flow reaches by tapping — while a comment that merely
|
|
258
|
+
* mentions `.goto("/watchlist")` as an example was being read as a visit, so
|
|
259
|
+
* prose credited routes no test ever opened.
|
|
156
260
|
* @param {string} source - Spec file contents
|
|
157
261
|
* @returns {string[]} Normalized visited paths
|
|
158
262
|
*/
|
|
159
263
|
export function extractPlaywrightPaths(source) {
|
|
160
|
-
const fromGoto = [...source.matchAll(GOTO_PATTERN)].map(
|
|
264
|
+
const fromGoto = [...stripJsComments(source).matchAll(GOTO_PATTERN)].map(
|
|
265
|
+
match => match[2]
|
|
266
|
+
);
|
|
161
267
|
const fromAnnotations = [...source.matchAll(ROUTE_ANNOTATION_PATTERN)].map(
|
|
162
268
|
match => match[1]
|
|
163
269
|
);
|
|
@@ -168,13 +274,20 @@ export function extractPlaywrightPaths(source) {
|
|
|
168
274
|
|
|
169
275
|
/**
|
|
170
276
|
* Extract every route-comparable path a Maestro flow opens.
|
|
277
|
+
*
|
|
278
|
+
* Same asymmetry as the Playwright extractor, and this is where the defect was
|
|
279
|
+
* measured: a flow whose comment explained *"the coverage gate only sees
|
|
280
|
+
* `openLink:`, so they are declared here"* had that very sentence read as a
|
|
281
|
+
* navigation. The regex ate ``` `openLink:`, ``` and produced the path `` /`, ``,
|
|
282
|
+
* which happened to match no route — the same mechanism one character away
|
|
283
|
+
* from a false credit.
|
|
171
284
|
* @param {string} source - Flow YAML contents
|
|
172
285
|
* @returns {string[]} Normalized visited paths
|
|
173
286
|
*/
|
|
174
287
|
export function extractMaestroPaths(source) {
|
|
175
|
-
const fromOpenLink = [
|
|
176
|
-
|
|
177
|
-
);
|
|
288
|
+
const fromOpenLink = [
|
|
289
|
+
...stripYamlComments(source).matchAll(OPEN_LINK_PATTERN),
|
|
290
|
+
].map(match => match[1]);
|
|
178
291
|
const fromAnnotations = [...source.matchAll(ROUTE_ANNOTATION_PATTERN)].map(
|
|
179
292
|
match => match[1]
|
|
180
293
|
);
|
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.
|
|
184
|
+
"version": "4.52.0",
|
|
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.
|
|
332
|
+
"lisaReleaseCommit": "cd60bd28b424959c4efde697f268eb090ffde454",
|
|
333
|
+
"gitHead": "cd60bd28b424959c4efde697f268eb090ffde454",
|
|
334
|
+
"lisaReleaseTag": "v4.52.0"
|
|
335
335
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.52.0",
|
|
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.
|
|
3
|
+
"version": "4.52.0",
|
|
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.
|
|
3
|
+
"version": "4.52.0",
|
|
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.
|
|
3
|
+
"version": "4.52.0",
|
|
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.
|
|
3
|
+
"version": "4.52.0",
|
|
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"
|