@codyswann/lisa 4.55.13 → 4.55.15
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/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/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/.codex-plugin/skills/lisa-github-sync/SKILL.md +5 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +7 -2
- package/plugins/lisa/skills/lisa-github-sync/SKILL.md +5 -3
- package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +7 -2
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-github-sync/SKILL.md +5 -3
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +7 -2
- 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/skills/lisa-github-sync/SKILL.md +5 -3
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +7 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-github-sync/SKILL.md +5 -3
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +7 -2
- 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/skills/lisa-github-sync/SKILL.md +5 -3
- package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +7 -2
- package/scripts/check-pipeline-status-reads.mjs +19 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.55.
|
|
3
|
+
"version": "4.55.15",
|
|
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.55.
|
|
3
|
+
"version": "4.55.15",
|
|
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.55.
|
|
3
|
+
"version": "4.55.15",
|
|
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"
|
|
@@ -41,6 +41,8 @@ Optional arguments include `pr_url=<url>` for the live pull request and `merge_s
|
|
|
41
41
|
|
|
42
42
|
### Step 3: Post Update
|
|
43
43
|
|
|
44
|
+
For `--rollup`, skip this milestone path and use Step 5's classifier decision.
|
|
45
|
+
|
|
44
46
|
1. **Idempotency check** — read the issue's recent comments. If the most recent comment with the prefix `[claude-sync] <milestone>` matches the current milestone AND the body content is unchanged, skip the post (no duplicate).
|
|
45
47
|
2. **Add the comment**:
|
|
46
48
|
|
|
@@ -48,7 +50,7 @@ Optional arguments include `pr_url=<url>` for the live pull request and `merge_s
|
|
|
48
50
|
gh issue comment <number> --repo <org>/<repo> --body-file /tmp/sync-comment.md
|
|
49
51
|
```
|
|
50
52
|
|
|
51
|
-
The body must start with `[claude-sync] <milestone>` so the next sync run can
|
|
53
|
+
The body must start with `[claude-sync] <milestone>` so the next sync run can locate it for comparison.
|
|
52
54
|
|
|
53
55
|
3. **Report** to the user what was synced.
|
|
54
56
|
|
|
@@ -111,7 +113,7 @@ If the `subIssues` field is unavailable (older GHES), fall back to body parentag
|
|
|
111
113
|
| else (children exist, none started) | — | unchanged — parent keeps its non-ready container label |
|
|
112
114
|
|
|
113
115
|
- **Blocked dominates — and the rollup must say which child and which kind** — a single blocked child surfaces `status:blocked` on the parent even while siblings progress, so a human sees the parent needs attention. `status:blocked` alone is a single bit and cannot tell a child waiting on an external event from one whose acceptance criteria are unbuildable; the second never clears on its own.
|
|
114
|
-
- **Run the shared classifier for every derived rollup state before writing the label or comment**, not only for `status:blocked`. Include the exact rendered state and child tally in the classifier input alongside the resolved child graph, so
|
|
116
|
+
- **Run the shared classifier for every derived rollup state before writing the label or comment**, not only for `status:blocked`. Include the exact rendered state and child tally in the classifier input alongside the resolved child graph, so `change.changed` covers the complete rollup note for `status:in-progress`, every env-keyed `done`, and `status:blocked` alike:
|
|
115
117
|
|
|
116
118
|
```bash
|
|
117
119
|
run_rollup_classifier() {
|
|
@@ -190,7 +192,7 @@ gh issue edit <parent-number> --repo <org>/<repo> \
|
|
|
190
192
|
## Important Notes
|
|
191
193
|
|
|
192
194
|
- **Never auto-transition labels** — always suggest and let the user / pipeline confirm. The one exception is the explicit `--rollup` parent derivation (Step 5), which moves a *parent's* `status:*` label as the `leaf-only-lifecycle` rule mandates — never a leaf's, and never to `status:ready`.
|
|
193
|
-
- **Idempotent updates** —
|
|
195
|
+
- **Idempotent updates** — compare milestone comments as described in Step 3. For parent rollups, use `[claude-sync] rollup` only to locate the managed comment; use Step 5's persisted fingerprint and `change.changed` decision, never prefix or body equality.
|
|
194
196
|
- **Comment format** — use GitHub-flavored markdown (`##` headings, fenced code blocks). The same template is used for the JIRA path (rendered as wiki markup there); keep the markdown source canonical.
|
|
195
197
|
- **Rollup cites the rule by slug** — parent state derivation follows the `leaf-only-lifecycle` rule's state machine; this skill does not restate the policy.
|
|
196
198
|
|
|
@@ -846,6 +846,8 @@ export function installUserSessionHook(repoRoot, options = {}) {
|
|
|
846
846
|
? hooks.SessionStart
|
|
847
847
|
: [];
|
|
848
848
|
let installed = false;
|
|
849
|
+
// Distinct matchers may cover different events. Do not infer regex equivalence.
|
|
850
|
+
const installedMatchers = new Set();
|
|
849
851
|
let migrated = false;
|
|
850
852
|
const normalizedSessionStart = sessionStart.flatMap(entry => {
|
|
851
853
|
if (!Array.isArray(entry?.hooks)) return [entry];
|
|
@@ -853,18 +855,21 @@ export function installUserSessionHook(repoRoot, options = {}) {
|
|
|
853
855
|
if (hook?.command !== command && hook?.command !== legacyCommand) {
|
|
854
856
|
return [hook];
|
|
855
857
|
}
|
|
856
|
-
if (
|
|
858
|
+
if (installedMatchers.has(entry.matcher)) {
|
|
857
859
|
migrated = true;
|
|
858
860
|
return [];
|
|
859
861
|
}
|
|
860
862
|
installed = true;
|
|
863
|
+
installedMatchers.add(entry.matcher);
|
|
861
864
|
if (hook.command === command) return [hook];
|
|
862
865
|
migrated = true;
|
|
863
866
|
return [{ ...hook, command }];
|
|
864
867
|
});
|
|
865
868
|
return normalizedHooks.length > 0
|
|
866
869
|
? [{ ...entry, hooks: normalizedHooks }]
|
|
867
|
-
:
|
|
870
|
+
: entry.hooks.length === 0
|
|
871
|
+
? [entry]
|
|
872
|
+
: [];
|
|
868
873
|
});
|
|
869
874
|
|
|
870
875
|
if (installed) {
|
|
@@ -337,6 +337,18 @@ export function netDepth(line) {
|
|
|
337
337
|
/** Whether a `set` builtin on this line turns `-e` on. */
|
|
338
338
|
const errexitOn = line => /^\s*set\s+-[a-zA-Z]*e/.test(line);
|
|
339
339
|
|
|
340
|
+
/** Whether an unescaped trailing backslash survives the existing comment scanner. */
|
|
341
|
+
function hasLineContinuation(text) {
|
|
342
|
+
let slashes = 0;
|
|
343
|
+
for (
|
|
344
|
+
let index = text.length - 1;
|
|
345
|
+
index >= 0 && text[index] === "\\";
|
|
346
|
+
index -= 1
|
|
347
|
+
)
|
|
348
|
+
slashes += 1;
|
|
349
|
+
return slashes % 2 === 1 && splitTopLevel(text, [])[0]?.text === text;
|
|
350
|
+
}
|
|
351
|
+
|
|
340
352
|
/**
|
|
341
353
|
* Inspect one block of shell source.
|
|
342
354
|
*
|
|
@@ -365,7 +377,12 @@ export function inspectShellSource(source) {
|
|
|
365
377
|
};
|
|
366
378
|
const findings = [];
|
|
367
379
|
for (let index = 0; index < lines.length; index += 1) {
|
|
368
|
-
const
|
|
380
|
+
const startLine = index + 1;
|
|
381
|
+
let line = lines[index];
|
|
382
|
+
while (index + 1 < lines.length && hasLineContinuation(line)) {
|
|
383
|
+
index += 1;
|
|
384
|
+
line = line.slice(0, -1) + lines[index];
|
|
385
|
+
}
|
|
369
386
|
const opening = state.carry;
|
|
370
387
|
state.carry = Math.max(0, state.carry + netDepth(line));
|
|
371
388
|
if (opening > 0) continue;
|
|
@@ -397,7 +414,7 @@ export function inspectShellSource(source) {
|
|
|
397
414
|
findings.push({
|
|
398
415
|
file: source.file,
|
|
399
416
|
location: source.location,
|
|
400
|
-
line:
|
|
417
|
+
line: startLine,
|
|
401
418
|
statement: statement.text.trim(),
|
|
402
419
|
lastStage: last,
|
|
403
420
|
reason,
|