@codyswann/lisa 2.214.0 → 2.216.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/package.json +1 -1
- 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-drive-pr-to-merge/SKILL.md +54 -1
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +54 -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/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +54 -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/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +54 -1
- package/typescript/copy-overwrite/.github/GITHUB_ACTIONS.md +7 -3
- package/typescript/create-only/.github/workflows/claude-ci-auto-fix.yml +6 -2
- package/typescript/create-only/.github/workflows/claude-deploy-auto-fix.yml +4 -2
package/package.json
CHANGED
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"ws": ">=8.20.1"
|
|
96
96
|
},
|
|
97
97
|
"name": "@codyswann/lisa",
|
|
98
|
-
"version": "2.
|
|
98
|
+
"version": "2.216.0",
|
|
99
99
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
100
100
|
"main": "dist/index.js",
|
|
101
101
|
"exports": {
|
|
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
|
|
|
36
36
|
Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
|
|
37
37
|
Use plain `gh` + `git` so Claude and Codex execute identically.
|
|
38
38
|
|
|
39
|
+
## 0. Take the babysitter lease
|
|
40
|
+
|
|
41
|
+
This skill is the branch's owner while it runs. Declare that ownership so the
|
|
42
|
+
CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
|
|
43
|
+
pushing competing fixes to the same branch (the single-writer rule):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh label create "lisa:babysitter-on-duty" \
|
|
47
|
+
--description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
|
|
48
|
+
--color FBCA04 || true # tolerate only already-exists; check the next step
|
|
49
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
50
|
+
gh pr view <pr> --json labels \
|
|
51
|
+
--jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Verify the final command prints `true` before driving. If the label could not
|
|
55
|
+
be attached (for example, no label-write permission), retry once; if it still
|
|
56
|
+
fails, surface a warning that the branch is unleased — the CI auto-fix
|
|
57
|
+
workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
|
|
58
|
+
per section 2f while driving.
|
|
59
|
+
|
|
60
|
+
The auto-fix workflow reads freshness from the label's most recent `labeled`
|
|
61
|
+
timeline event and treats stamps older than its TTL (default 90 minutes) as
|
|
62
|
+
stale. **Refresh the lease** whenever more than ~30 minutes have passed since
|
|
63
|
+
the last stamp while the watch loop is still running — a refresh is a
|
|
64
|
+
remove + re-add (re-adding an existing label does not create a new timeline
|
|
65
|
+
event):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
|
|
69
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Release the lease** (remove the label) at every terminal state — merged,
|
|
73
|
+
closed, or a hard block handed to a human. A crashed session that never
|
|
74
|
+
releases is why the TTL exists; do not rely on it as the normal release path.
|
|
75
|
+
|
|
39
76
|
## 1. Enable auto-merge
|
|
40
77
|
|
|
41
78
|
Before enabling auto-merge, capture the live PR head and compare it to
|
|
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
|
|
|
74
111
|
```
|
|
75
112
|
|
|
76
113
|
Handle every blocker class; after any fix, re-poll and continue. Do not stop while
|
|
77
|
-
the PR is still open and progress is possible.
|
|
114
|
+
the PR is still open and progress is possible. On each iteration, refresh the
|
|
115
|
+
babysitter lease if its last stamp is older than ~30 minutes (section 0).
|
|
78
116
|
|
|
79
117
|
In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
|
|
80
118
|
apply; for any of (b)–(e) do not act — classify the blocker and return per the input
|
|
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
|
|
|
150
188
|
auto-merge — dismissing the stale review after resolving all threads is what
|
|
151
189
|
unblocks it.
|
|
152
190
|
|
|
191
|
+
### f. Pending auto-fix PR into this branch
|
|
192
|
+
If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
|
|
193
|
+
branch (the CI auto-fix workflow engaged before this session took the lease),
|
|
194
|
+
adjudicate it: merge it into the head branch if the fix is correct and still
|
|
195
|
+
needed, otherwise close it and delete the side branch. Never leave it dangling
|
|
196
|
+
— it represents a competing writer's pending work. Merging it mutates the
|
|
197
|
+
driven branch, so treat it like any other push: disarm auto-merge first,
|
|
198
|
+
re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
|
|
199
|
+
head's checks to start, then re-enable auto-merge (section 1).
|
|
200
|
+
|
|
153
201
|
## 3. Merge and verify it actually shipped (ancestry check)
|
|
154
202
|
|
|
155
203
|
Enabling auto-merge + green checks + resolved threads is **not** proof the merge
|
|
@@ -177,3 +225,8 @@ Loop until one of:
|
|
|
177
225
|
needs design input, or genuine unresolved human objection (not a bot gate). Stop
|
|
178
226
|
and report exactly what is blocking and what was already tried — never force the
|
|
179
227
|
merge or weaken a gate to get past it.
|
|
228
|
+
|
|
229
|
+
At every terminal state, release the babysitter lease
|
|
230
|
+
(`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
|
|
231
|
+
auto-fix workflow can take over as fixer of last resort if the branch goes
|
|
232
|
+
red later with nobody driving it.
|
|
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
|
|
|
36
36
|
Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
|
|
37
37
|
Use plain `gh` + `git` so Claude and Codex execute identically.
|
|
38
38
|
|
|
39
|
+
## 0. Take the babysitter lease
|
|
40
|
+
|
|
41
|
+
This skill is the branch's owner while it runs. Declare that ownership so the
|
|
42
|
+
CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
|
|
43
|
+
pushing competing fixes to the same branch (the single-writer rule):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh label create "lisa:babysitter-on-duty" \
|
|
47
|
+
--description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
|
|
48
|
+
--color FBCA04 || true # tolerate only already-exists; check the next step
|
|
49
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
50
|
+
gh pr view <pr> --json labels \
|
|
51
|
+
--jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Verify the final command prints `true` before driving. If the label could not
|
|
55
|
+
be attached (for example, no label-write permission), retry once; if it still
|
|
56
|
+
fails, surface a warning that the branch is unleased — the CI auto-fix
|
|
57
|
+
workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
|
|
58
|
+
per section 2f while driving.
|
|
59
|
+
|
|
60
|
+
The auto-fix workflow reads freshness from the label's most recent `labeled`
|
|
61
|
+
timeline event and treats stamps older than its TTL (default 90 minutes) as
|
|
62
|
+
stale. **Refresh the lease** whenever more than ~30 minutes have passed since
|
|
63
|
+
the last stamp while the watch loop is still running — a refresh is a
|
|
64
|
+
remove + re-add (re-adding an existing label does not create a new timeline
|
|
65
|
+
event):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
|
|
69
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Release the lease** (remove the label) at every terminal state — merged,
|
|
73
|
+
closed, or a hard block handed to a human. A crashed session that never
|
|
74
|
+
releases is why the TTL exists; do not rely on it as the normal release path.
|
|
75
|
+
|
|
39
76
|
## 1. Enable auto-merge
|
|
40
77
|
|
|
41
78
|
Before enabling auto-merge, capture the live PR head and compare it to
|
|
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
|
|
|
74
111
|
```
|
|
75
112
|
|
|
76
113
|
Handle every blocker class; after any fix, re-poll and continue. Do not stop while
|
|
77
|
-
the PR is still open and progress is possible.
|
|
114
|
+
the PR is still open and progress is possible. On each iteration, refresh the
|
|
115
|
+
babysitter lease if its last stamp is older than ~30 minutes (section 0).
|
|
78
116
|
|
|
79
117
|
In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
|
|
80
118
|
apply; for any of (b)–(e) do not act — classify the blocker and return per the input
|
|
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
|
|
|
150
188
|
auto-merge — dismissing the stale review after resolving all threads is what
|
|
151
189
|
unblocks it.
|
|
152
190
|
|
|
191
|
+
### f. Pending auto-fix PR into this branch
|
|
192
|
+
If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
|
|
193
|
+
branch (the CI auto-fix workflow engaged before this session took the lease),
|
|
194
|
+
adjudicate it: merge it into the head branch if the fix is correct and still
|
|
195
|
+
needed, otherwise close it and delete the side branch. Never leave it dangling
|
|
196
|
+
— it represents a competing writer's pending work. Merging it mutates the
|
|
197
|
+
driven branch, so treat it like any other push: disarm auto-merge first,
|
|
198
|
+
re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
|
|
199
|
+
head's checks to start, then re-enable auto-merge (section 1).
|
|
200
|
+
|
|
153
201
|
## 3. Merge and verify it actually shipped (ancestry check)
|
|
154
202
|
|
|
155
203
|
Enabling auto-merge + green checks + resolved threads is **not** proof the merge
|
|
@@ -177,3 +225,8 @@ Loop until one of:
|
|
|
177
225
|
needs design input, or genuine unresolved human objection (not a bot gate). Stop
|
|
178
226
|
and report exactly what is blocking and what was already tried — never force the
|
|
179
227
|
merge or weaken a gate to get past it.
|
|
228
|
+
|
|
229
|
+
At every terminal state, release the babysitter lease
|
|
230
|
+
(`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
|
|
231
|
+
auto-fix workflow can take over as fixer of last resort if the branch goes
|
|
232
|
+
red later with nobody driving it.
|
|
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
|
|
|
36
36
|
Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
|
|
37
37
|
Use plain `gh` + `git` so Claude and Codex execute identically.
|
|
38
38
|
|
|
39
|
+
## 0. Take the babysitter lease
|
|
40
|
+
|
|
41
|
+
This skill is the branch's owner while it runs. Declare that ownership so the
|
|
42
|
+
CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
|
|
43
|
+
pushing competing fixes to the same branch (the single-writer rule):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh label create "lisa:babysitter-on-duty" \
|
|
47
|
+
--description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
|
|
48
|
+
--color FBCA04 || true # tolerate only already-exists; check the next step
|
|
49
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
50
|
+
gh pr view <pr> --json labels \
|
|
51
|
+
--jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Verify the final command prints `true` before driving. If the label could not
|
|
55
|
+
be attached (for example, no label-write permission), retry once; if it still
|
|
56
|
+
fails, surface a warning that the branch is unleased — the CI auto-fix
|
|
57
|
+
workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
|
|
58
|
+
per section 2f while driving.
|
|
59
|
+
|
|
60
|
+
The auto-fix workflow reads freshness from the label's most recent `labeled`
|
|
61
|
+
timeline event and treats stamps older than its TTL (default 90 minutes) as
|
|
62
|
+
stale. **Refresh the lease** whenever more than ~30 minutes have passed since
|
|
63
|
+
the last stamp while the watch loop is still running — a refresh is a
|
|
64
|
+
remove + re-add (re-adding an existing label does not create a new timeline
|
|
65
|
+
event):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
|
|
69
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Release the lease** (remove the label) at every terminal state — merged,
|
|
73
|
+
closed, or a hard block handed to a human. A crashed session that never
|
|
74
|
+
releases is why the TTL exists; do not rely on it as the normal release path.
|
|
75
|
+
|
|
39
76
|
## 1. Enable auto-merge
|
|
40
77
|
|
|
41
78
|
Before enabling auto-merge, capture the live PR head and compare it to
|
|
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
|
|
|
74
111
|
```
|
|
75
112
|
|
|
76
113
|
Handle every blocker class; after any fix, re-poll and continue. Do not stop while
|
|
77
|
-
the PR is still open and progress is possible.
|
|
114
|
+
the PR is still open and progress is possible. On each iteration, refresh the
|
|
115
|
+
babysitter lease if its last stamp is older than ~30 minutes (section 0).
|
|
78
116
|
|
|
79
117
|
In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
|
|
80
118
|
apply; for any of (b)–(e) do not act — classify the blocker and return per the input
|
|
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
|
|
|
150
188
|
auto-merge — dismissing the stale review after resolving all threads is what
|
|
151
189
|
unblocks it.
|
|
152
190
|
|
|
191
|
+
### f. Pending auto-fix PR into this branch
|
|
192
|
+
If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
|
|
193
|
+
branch (the CI auto-fix workflow engaged before this session took the lease),
|
|
194
|
+
adjudicate it: merge it into the head branch if the fix is correct and still
|
|
195
|
+
needed, otherwise close it and delete the side branch. Never leave it dangling
|
|
196
|
+
— it represents a competing writer's pending work. Merging it mutates the
|
|
197
|
+
driven branch, so treat it like any other push: disarm auto-merge first,
|
|
198
|
+
re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
|
|
199
|
+
head's checks to start, then re-enable auto-merge (section 1).
|
|
200
|
+
|
|
153
201
|
## 3. Merge and verify it actually shipped (ancestry check)
|
|
154
202
|
|
|
155
203
|
Enabling auto-merge + green checks + resolved threads is **not** proof the merge
|
|
@@ -177,3 +225,8 @@ Loop until one of:
|
|
|
177
225
|
needs design input, or genuine unresolved human objection (not a bot gate). Stop
|
|
178
226
|
and report exactly what is blocking and what was already tried — never force the
|
|
179
227
|
merge or weaken a gate to get past it.
|
|
228
|
+
|
|
229
|
+
At every terminal state, release the babysitter lease
|
|
230
|
+
(`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
|
|
231
|
+
auto-fix workflow can take over as fixer of last resort if the branch goes
|
|
232
|
+
red later with nobody driving it.
|
|
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
|
|
|
36
36
|
Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
|
|
37
37
|
Use plain `gh` + `git` so Claude and Codex execute identically.
|
|
38
38
|
|
|
39
|
+
## 0. Take the babysitter lease
|
|
40
|
+
|
|
41
|
+
This skill is the branch's owner while it runs. Declare that ownership so the
|
|
42
|
+
CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
|
|
43
|
+
pushing competing fixes to the same branch (the single-writer rule):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh label create "lisa:babysitter-on-duty" \
|
|
47
|
+
--description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
|
|
48
|
+
--color FBCA04 || true # tolerate only already-exists; check the next step
|
|
49
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
50
|
+
gh pr view <pr> --json labels \
|
|
51
|
+
--jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Verify the final command prints `true` before driving. If the label could not
|
|
55
|
+
be attached (for example, no label-write permission), retry once; if it still
|
|
56
|
+
fails, surface a warning that the branch is unleased — the CI auto-fix
|
|
57
|
+
workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
|
|
58
|
+
per section 2f while driving.
|
|
59
|
+
|
|
60
|
+
The auto-fix workflow reads freshness from the label's most recent `labeled`
|
|
61
|
+
timeline event and treats stamps older than its TTL (default 90 minutes) as
|
|
62
|
+
stale. **Refresh the lease** whenever more than ~30 minutes have passed since
|
|
63
|
+
the last stamp while the watch loop is still running — a refresh is a
|
|
64
|
+
remove + re-add (re-adding an existing label does not create a new timeline
|
|
65
|
+
event):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
|
|
69
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Release the lease** (remove the label) at every terminal state — merged,
|
|
73
|
+
closed, or a hard block handed to a human. A crashed session that never
|
|
74
|
+
releases is why the TTL exists; do not rely on it as the normal release path.
|
|
75
|
+
|
|
39
76
|
## 1. Enable auto-merge
|
|
40
77
|
|
|
41
78
|
Before enabling auto-merge, capture the live PR head and compare it to
|
|
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
|
|
|
74
111
|
```
|
|
75
112
|
|
|
76
113
|
Handle every blocker class; after any fix, re-poll and continue. Do not stop while
|
|
77
|
-
the PR is still open and progress is possible.
|
|
114
|
+
the PR is still open and progress is possible. On each iteration, refresh the
|
|
115
|
+
babysitter lease if its last stamp is older than ~30 minutes (section 0).
|
|
78
116
|
|
|
79
117
|
In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
|
|
80
118
|
apply; for any of (b)–(e) do not act — classify the blocker and return per the input
|
|
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
|
|
|
150
188
|
auto-merge — dismissing the stale review after resolving all threads is what
|
|
151
189
|
unblocks it.
|
|
152
190
|
|
|
191
|
+
### f. Pending auto-fix PR into this branch
|
|
192
|
+
If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
|
|
193
|
+
branch (the CI auto-fix workflow engaged before this session took the lease),
|
|
194
|
+
adjudicate it: merge it into the head branch if the fix is correct and still
|
|
195
|
+
needed, otherwise close it and delete the side branch. Never leave it dangling
|
|
196
|
+
— it represents a competing writer's pending work. Merging it mutates the
|
|
197
|
+
driven branch, so treat it like any other push: disarm auto-merge first,
|
|
198
|
+
re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
|
|
199
|
+
head's checks to start, then re-enable auto-merge (section 1).
|
|
200
|
+
|
|
153
201
|
## 3. Merge and verify it actually shipped (ancestry check)
|
|
154
202
|
|
|
155
203
|
Enabling auto-merge + green checks + resolved threads is **not** proof the merge
|
|
@@ -177,3 +225,8 @@ Loop until one of:
|
|
|
177
225
|
needs design input, or genuine unresolved human objection (not a bot gate). Stop
|
|
178
226
|
and report exactly what is blocking and what was already tried — never force the
|
|
179
227
|
merge or weaken a gate to get past it.
|
|
228
|
+
|
|
229
|
+
At every terminal state, release the babysitter lease
|
|
230
|
+
(`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
|
|
231
|
+
auto-fix workflow can take over as fixer of last resort if the branch goes
|
|
232
|
+
red later with nobody driving it.
|
|
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
|
|
|
36
36
|
Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
|
|
37
37
|
Use plain `gh` + `git` so Claude and Codex execute identically.
|
|
38
38
|
|
|
39
|
+
## 0. Take the babysitter lease
|
|
40
|
+
|
|
41
|
+
This skill is the branch's owner while it runs. Declare that ownership so the
|
|
42
|
+
CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
|
|
43
|
+
pushing competing fixes to the same branch (the single-writer rule):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh label create "lisa:babysitter-on-duty" \
|
|
47
|
+
--description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
|
|
48
|
+
--color FBCA04 || true # tolerate only already-exists; check the next step
|
|
49
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
50
|
+
gh pr view <pr> --json labels \
|
|
51
|
+
--jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Verify the final command prints `true` before driving. If the label could not
|
|
55
|
+
be attached (for example, no label-write permission), retry once; if it still
|
|
56
|
+
fails, surface a warning that the branch is unleased — the CI auto-fix
|
|
57
|
+
workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
|
|
58
|
+
per section 2f while driving.
|
|
59
|
+
|
|
60
|
+
The auto-fix workflow reads freshness from the label's most recent `labeled`
|
|
61
|
+
timeline event and treats stamps older than its TTL (default 90 minutes) as
|
|
62
|
+
stale. **Refresh the lease** whenever more than ~30 minutes have passed since
|
|
63
|
+
the last stamp while the watch loop is still running — a refresh is a
|
|
64
|
+
remove + re-add (re-adding an existing label does not create a new timeline
|
|
65
|
+
event):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
|
|
69
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Release the lease** (remove the label) at every terminal state — merged,
|
|
73
|
+
closed, or a hard block handed to a human. A crashed session that never
|
|
74
|
+
releases is why the TTL exists; do not rely on it as the normal release path.
|
|
75
|
+
|
|
39
76
|
## 1. Enable auto-merge
|
|
40
77
|
|
|
41
78
|
Before enabling auto-merge, capture the live PR head and compare it to
|
|
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
|
|
|
74
111
|
```
|
|
75
112
|
|
|
76
113
|
Handle every blocker class; after any fix, re-poll and continue. Do not stop while
|
|
77
|
-
the PR is still open and progress is possible.
|
|
114
|
+
the PR is still open and progress is possible. On each iteration, refresh the
|
|
115
|
+
babysitter lease if its last stamp is older than ~30 minutes (section 0).
|
|
78
116
|
|
|
79
117
|
In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
|
|
80
118
|
apply; for any of (b)–(e) do not act — classify the blocker and return per the input
|
|
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
|
|
|
150
188
|
auto-merge — dismissing the stale review after resolving all threads is what
|
|
151
189
|
unblocks it.
|
|
152
190
|
|
|
191
|
+
### f. Pending auto-fix PR into this branch
|
|
192
|
+
If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
|
|
193
|
+
branch (the CI auto-fix workflow engaged before this session took the lease),
|
|
194
|
+
adjudicate it: merge it into the head branch if the fix is correct and still
|
|
195
|
+
needed, otherwise close it and delete the side branch. Never leave it dangling
|
|
196
|
+
— it represents a competing writer's pending work. Merging it mutates the
|
|
197
|
+
driven branch, so treat it like any other push: disarm auto-merge first,
|
|
198
|
+
re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
|
|
199
|
+
head's checks to start, then re-enable auto-merge (section 1).
|
|
200
|
+
|
|
153
201
|
## 3. Merge and verify it actually shipped (ancestry check)
|
|
154
202
|
|
|
155
203
|
Enabling auto-merge + green checks + resolved threads is **not** proof the merge
|
|
@@ -177,3 +225,8 @@ Loop until one of:
|
|
|
177
225
|
needs design input, or genuine unresolved human objection (not a bot gate). Stop
|
|
178
226
|
and report exactly what is blocking and what was already tried — never force the
|
|
179
227
|
merge or weaken a gate to get past it.
|
|
228
|
+
|
|
229
|
+
At every terminal state, release the babysitter lease
|
|
230
|
+
(`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
|
|
231
|
+
auto-fix workflow can take over as fixer of last resort if the branch goes
|
|
232
|
+
red later with nobody driving it.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.216.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": "2.
|
|
3
|
+
"version": "2.216.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": "2.
|
|
3
|
+
"version": "2.216.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": "2.
|
|
3
|
+
"version": "2.216.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": "2.
|
|
3
|
+
"version": "2.216.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"
|
|
@@ -36,6 +36,43 @@ merges" loop. Other skills delegate here instead of re-implementing it. Runs
|
|
|
36
36
|
Resolve `<owner>/<repo>` from `gh repo view --json nameWithOwner` (or the PR URL).
|
|
37
37
|
Use plain `gh` + `git` so Claude and Codex execute identically.
|
|
38
38
|
|
|
39
|
+
## 0. Take the babysitter lease
|
|
40
|
+
|
|
41
|
+
This skill is the branch's owner while it runs. Declare that ownership so the
|
|
42
|
+
CI auto-fix workflow (`reusable-claude-ci-auto-fix.yml`) stands down instead of
|
|
43
|
+
pushing competing fixes to the same branch (the single-writer rule):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh label create "lisa:babysitter-on-duty" \
|
|
47
|
+
--description "A drive-pr-to-merge session is actively driving this PR; CI auto-fix must stand down" \
|
|
48
|
+
--color FBCA04 || true # tolerate only already-exists; check the next step
|
|
49
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
50
|
+
gh pr view <pr> --json labels \
|
|
51
|
+
--jq '[.labels[].name] | contains(["lisa:babysitter-on-duty"])'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Verify the final command prints `true` before driving. If the label could not
|
|
55
|
+
be attached (for example, no label-write permission), retry once; if it still
|
|
56
|
+
fails, surface a warning that the branch is unleased — the CI auto-fix
|
|
57
|
+
workflow may engage in parallel — and watch for its `claude-auto-fix-*` PR
|
|
58
|
+
per section 2f while driving.
|
|
59
|
+
|
|
60
|
+
The auto-fix workflow reads freshness from the label's most recent `labeled`
|
|
61
|
+
timeline event and treats stamps older than its TTL (default 90 minutes) as
|
|
62
|
+
stale. **Refresh the lease** whenever more than ~30 minutes have passed since
|
|
63
|
+
the last stamp while the watch loop is still running — a refresh is a
|
|
64
|
+
remove + re-add (re-adding an existing label does not create a new timeline
|
|
65
|
+
event):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"
|
|
69
|
+
gh pr edit <pr> --add-label "lisa:babysitter-on-duty"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Release the lease** (remove the label) at every terminal state — merged,
|
|
73
|
+
closed, or a hard block handed to a human. A crashed session that never
|
|
74
|
+
releases is why the TTL exists; do not rely on it as the normal release path.
|
|
75
|
+
|
|
39
76
|
## 1. Enable auto-merge
|
|
40
77
|
|
|
41
78
|
Before enabling auto-merge, capture the live PR head and compare it to
|
|
@@ -74,7 +111,8 @@ gh pr view <pr> --json state,mergeStateStatus,mergeable,reviewDecision,statusChe
|
|
|
74
111
|
```
|
|
75
112
|
|
|
76
113
|
Handle every blocker class; after any fix, re-poll and continue. Do not stop while
|
|
77
|
-
the PR is still open and progress is possible.
|
|
114
|
+
the PR is still open and progress is possible. On each iteration, refresh the
|
|
115
|
+
babysitter lease if its last stamp is older than ~30 minutes (section 0).
|
|
78
116
|
|
|
79
117
|
In **`on_blocker=report`** mode, only the mechanical step (a) and auto-merge enabling
|
|
80
118
|
apply; for any of (b)–(e) do not act — classify the blocker and return per the input
|
|
@@ -150,6 +188,16 @@ Some org rulesets allow 0 approvals yet a bot `CHANGES_REQUESTED` still blocks
|
|
|
150
188
|
auto-merge — dismissing the stale review after resolving all threads is what
|
|
151
189
|
unblocks it.
|
|
152
190
|
|
|
191
|
+
### f. Pending auto-fix PR into this branch
|
|
192
|
+
If an open PR from `claude-auto-fix-<headRefName>` targets this PR's head
|
|
193
|
+
branch (the CI auto-fix workflow engaged before this session took the lease),
|
|
194
|
+
adjudicate it: merge it into the head branch if the fix is correct and still
|
|
195
|
+
needed, otherwise close it and delete the side branch. Never leave it dangling
|
|
196
|
+
— it represents a competing writer's pending work. Merging it mutates the
|
|
197
|
+
driven branch, so treat it like any other push: disarm auto-merge first,
|
|
198
|
+
re-read `headRefOid`, reset `verify_commit` to the merged head, wait for that
|
|
199
|
+
head's checks to start, then re-enable auto-merge (section 1).
|
|
200
|
+
|
|
153
201
|
## 3. Merge and verify it actually shipped (ancestry check)
|
|
154
202
|
|
|
155
203
|
Enabling auto-merge + green checks + resolved threads is **not** proof the merge
|
|
@@ -177,3 +225,8 @@ Loop until one of:
|
|
|
177
225
|
needs design input, or genuine unresolved human objection (not a bot gate). Stop
|
|
178
226
|
and report exactly what is blocking and what was already tried — never force the
|
|
179
227
|
merge or weaken a gate to get past it.
|
|
228
|
+
|
|
229
|
+
At every terminal state, release the babysitter lease
|
|
230
|
+
(`gh pr edit <pr> --remove-label "lisa:babysitter-on-duty"`) so the CI
|
|
231
|
+
auto-fix workflow can take over as fixer of last resort if the branch goes
|
|
232
|
+
red later with nobody driving it.
|
|
@@ -174,12 +174,16 @@ AI-powered code assistance that can:
|
|
|
174
174
|
|
|
175
175
|
**Triggers**: CI Quality Checks workflow failure (non-environment branches)
|
|
176
176
|
|
|
177
|
-
|
|
177
|
+
Fixer of last resort for red CI on unattended branches: Claude analyzes error logs and prepares a fix as a pull request into the failing branch.
|
|
178
178
|
|
|
179
|
+
- Stands down when the branch has an active owner: a fresh `lisa:babysitter-on-duty` lease label on the branch's open PR (stamped by drive-pr-to-merge sessions), or any push during a quiet-period wait (default 20 minutes)
|
|
179
180
|
- Fetches failed job names and error logs from the CI run
|
|
180
181
|
- Runs Claude with full context to diagnose and fix the root cause
|
|
181
|
-
-
|
|
182
|
-
-
|
|
182
|
+
- Never pushes to the failing branch — commits land on a `claude-auto-fix-<branch>` side branch and a PR is opened into the failing branch
|
|
183
|
+
- Falls back to a non-frozen dependency install when the lockfile itself is broken, so Claude can repair and commit the lockfile
|
|
184
|
+
- When no fix can be produced, files a deduplicated ticket in the tracker declared in `.lisa.config.json` (`tracker`: jira | github | linear) with a title that says whether Claude ran at all
|
|
185
|
+
- Skips environment branches (`main`, `staging`, `dev`) and auto-fix branches (prevents infinite loops); failing checks on an auto-fix PR escalate to a ticket instead of re-entering
|
|
186
|
+
- Requires `secrets: inherit` in the caller so tracker credentials (`JIRA_API_TOKEN` / `LINEAR_API_KEY`) reach the issue dispatcher
|
|
183
187
|
|
|
184
188
|
### Claude Code Review Response (`claude-code-review-response.yml`)
|
|
185
189
|
|
|
@@ -25,5 +25,9 @@ jobs:
|
|
|
25
25
|
head_branch: ${{ github.event.workflow_run.head_branch }}
|
|
26
26
|
run_id: ${{ github.event.workflow_run.id }}
|
|
27
27
|
package_manager: 'bun'
|
|
28
|
-
secrets:
|
|
29
|
-
|
|
28
|
+
# `secrets: inherit` (not an explicit mapping) is load-bearing: the
|
|
29
|
+
# reusable workflow forwards secrets to the issue dispatcher, which needs
|
|
30
|
+
# JIRA_API_TOKEN / LINEAR_API_KEY to file failure tickets in the tracker
|
|
31
|
+
# declared in .lisa.config.json. An explicit CLAUDE_CODE_OAUTH_TOKEN-only
|
|
32
|
+
# mapping silently strands those tickets in GitHub Issues.
|
|
33
|
+
secrets: inherit
|
|
@@ -25,5 +25,7 @@ jobs:
|
|
|
25
25
|
head_branch: ${{ github.event.workflow_run.head_branch }}
|
|
26
26
|
run_id: ${{ github.event.workflow_run.id }}
|
|
27
27
|
package_manager: 'bun'
|
|
28
|
-
secrets:
|
|
29
|
-
|
|
28
|
+
# `secrets: inherit` (not an explicit mapping) is load-bearing: the
|
|
29
|
+
# reusable workflow needs tracker credentials (JIRA_API_TOKEN /
|
|
30
|
+
# LINEAR_API_KEY) to reach the tracker declared in .lisa.config.json.
|
|
31
|
+
secrets: inherit
|