@codyswann/lisa 4.38.0 → 4.38.2
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-hooks/block-direct-issue-create.sh +140 -4
- package/all/copy-overwrite/scripts/lisa-work-item.mjs +209 -8
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +10 -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 +13 -6
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +9 -0
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +19 -5
- package/plugins/lisa/.codex-plugin/hooks.json +18 -4
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/SKILL.md +8 -3
- package/plugins/lisa/hooks/block-direct-issue-create.agy.sh +13 -3
- package/plugins/lisa/hooks/block-direct-issue-create.sh +140 -4
- package/plugins/lisa/hooks/discharge-work-item-gates.sh +54 -0
- package/plugins/lisa/skills/lisa-git-submit-pr/SKILL.md +8 -3
- package/plugins/lisa-agy/hooks/block-direct-issue-create.agy.sh +13 -3
- package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +140 -4
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-git-submit-pr/SKILL.md +8 -3
- 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 +19 -5
- package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +140 -4
- package/plugins/lisa-copilot/hooks/discharge-work-item-gates.sh +54 -0
- package/plugins/lisa-copilot/skills/lisa-git-submit-pr/SKILL.md +8 -3
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +140 -4
- package/plugins/lisa-cursor/hooks/discharge-work-item-gates.sh +54 -0
- package/plugins/lisa-cursor/hooks/hooks.json +7 -4
- package/plugins/lisa-cursor/skills/lisa-git-submit-pr/SKILL.md +8 -3
- 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/.claude-plugin/plugin.json +18 -4
- package/plugins/src/base/hooks/block-direct-issue-create.agy.sh +13 -3
- package/plugins/src/base/hooks/block-direct-issue-create.sh +140 -4
- package/plugins/src/base/hooks/discharge-work-item-gates.sh +54 -0
- package/plugins/src/base/skills/lisa-git-submit-pr/SKILL.md +8 -3
- package/scripts/lib/per-agent-hook-filter.mjs +19 -0
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
"command": "${CURSOR_PLUGIN_ROOT}/hooks/failure-signature-index.sh",
|
|
16
16
|
"matcher": "Bash"
|
|
17
17
|
},
|
|
18
|
+
{
|
|
19
|
+
"command": "${CURSOR_PLUGIN_ROOT}/hooks/discharge-work-item-gates.sh",
|
|
20
|
+
"matcher": "Bash"
|
|
21
|
+
},
|
|
18
22
|
{
|
|
19
23
|
"command": "${CURSOR_PLUGIN_ROOT}/hooks/threshold-ratchet.sh",
|
|
20
24
|
"matcher": "Edit|Write|NotebookEdit|Bash"
|
|
@@ -41,10 +45,6 @@
|
|
|
41
45
|
"command": "${CURSOR_PLUGIN_ROOT}/hooks/block-instruction-file-edits.sh",
|
|
42
46
|
"matcher": "Bash"
|
|
43
47
|
},
|
|
44
|
-
{
|
|
45
|
-
"command": "${CURSOR_PLUGIN_ROOT}/hooks/block-direct-issue-create.sh",
|
|
46
|
-
"matcher": "Bash"
|
|
47
|
-
},
|
|
48
48
|
{
|
|
49
49
|
"command": "${CURSOR_PLUGIN_ROOT}/hooks/block-blind-automerge.sh",
|
|
50
50
|
"matcher": "Bash"
|
|
@@ -59,6 +59,9 @@
|
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"command": "${CURSOR_PLUGIN_ROOT}/hooks/enforce-verification-gate.sh"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"command": "${CURSOR_PLUGIN_ROOT}/hooks/block-direct-issue-create.sh"
|
|
62
65
|
}
|
|
63
66
|
],
|
|
64
67
|
"stop": [
|
|
@@ -57,6 +57,7 @@ Add provider-appropriate linkage to the PR title and/or body without changing th
|
|
|
57
57
|
- **GitHub Issues**:
|
|
58
58
|
- If `work_item_ref` is a GitHub issue URL, `org/repo#<n>`, or `#<n>`, add a dedicated issue reference line to the PR body.
|
|
59
59
|
- Always use a non-closing reference such as `Refs #<n>`, so the merge cannot close the issue before the post-merge deploy, remote verification, health check, and terminal `done` label.
|
|
60
|
+
- **This rule is what makes the managed backlink mandatory, and neither rule says so on its own.** `Refs` creates no native development link, so gate 5 has nothing to defer to and the `[lisa-pr-link]` comment becomes the only backlink there is. Anyone following the non-closing rule alone will hit gate 5. Separately, `Refs #<n>` does **not** satisfy gate 4 either: the body needs its own `Work-Item: <ref>` line, and `Closes`/`Fixes` do not satisfy it. One `Refs` line, one `Work-Item:` line, one backlink comment — three different requirements that look like one. `discharge-pr-gates` (below) is what checks the last two together.
|
|
60
61
|
- **A non-closing reference does not populate the issue's Development / linked pull requests surface, and no non-closing form does.** That surface *is* the closing-reference mechanism: a closing keyword populates the PR's `closingIssuesReferences`, while `Refs` yields only a `CrossReferencedEvent`. Measured on this repository — a `Refs`-only PR reports `closingIssuesReferences: 0`; a `Closes` PR reports 1. So the ticket-side backlink cannot be delegated to GitHub: the managed `[lisa-pr-link]` comment written by `node scripts/lisa-work-item.mjs backlink` — the one producer, which `lisa-github-sync` and the other vendor sync skills call rather than reimplement — is the **required** backlink under this rule, not a fallback for when native linkage happens to be absent. Two-way linkage (`lisa-implement` step 7a) depends on that comment, and so does the Work-Item Traceability check wherever the project declares `workItem.verify: "full"` — there, a PR carrying a correct `Refs` line still fails the check without it. Post it either way: under the default `trailer` level the check does not read the tracker, but the two-way linkage a human follows is still worth having, and a project can raise its level at any time.
|
|
61
62
|
- For cross-repo issue refs, use the fully qualified non-closing form, for example `Refs CodySwannGT/lisa#614`.
|
|
62
63
|
- **Linear**:
|
|
@@ -76,13 +77,17 @@ When updating an existing PR, preserve any existing linkage line unless the new
|
|
|
76
77
|
After creating or updating the PR, always make the reverse link durable on the source work item when `work_item_ref` is available:
|
|
77
78
|
|
|
78
79
|
1. Resolve the live PR URL with `gh pr view <pr-number> --json url --jq .url`.
|
|
79
|
-
2.
|
|
80
|
+
2. Discharge the two gates the push could not check. Gate 4 (the `Work-Item:` line in the PR BODY) and gate 5 (the backlink) are both properties of a pull request, so a push before the PR existed reported them as `UNRESOLVED` rather than checked. One command closes both out at the first moment they *are* checkable:
|
|
80
81
|
|
|
81
82
|
```bash
|
|
82
|
-
node scripts/lisa-work-item.mjs
|
|
83
|
+
node scripts/lisa-work-item.mjs discharge-pr-gates
|
|
83
84
|
```
|
|
84
85
|
|
|
85
|
-
It
|
|
86
|
+
It posts (or refreshes) the managed `[lisa-pr-link]` comment on every item the range names — so gate 5 passes without anyone remembering to — and then evaluates gate 4 against the live body, failing here rather than one CI cycle later. Exit 3 means there is no pull request for this branch yet, which is not a violation; exit 1 is a real unmet requirement and the message names it.
|
|
87
|
+
|
|
88
|
+
It writes no PR body. Gate 4 is the author's declaration of what the change is for; a command that inserted the line would be answering its own question.
|
|
89
|
+
|
|
90
|
+
The narrower `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` is what it wraps, and remains the right call when you hold a ref and a URL but no checkout of the PR's branch (a sync skill updating a backlink after the fact). Both are idempotent, refuse loudly for a tracker they cannot write, and never silently no-op. Do not hand-post the comment, and do not describe the posting procedure anywhere: the same file that writes it is the file that checks it, which is what keeps producer and consumer from drifting.
|
|
86
91
|
3. Invoke `lisa-tracker-sync` with the original work item ref, milestone `pr-ready`, `pr_url=<url>`, and `tracker_provider=<provider>` when known. That is the progress-note and status side; it is not what satisfies the traceability check.
|
|
87
92
|
4. When the PR later merges, invoke `lisa-tracker-sync` again with milestone `pr-merged`, the same `pr_url`, and the merge SHA when available.
|
|
88
93
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.38.
|
|
3
|
+
"version": "4.38.2",
|
|
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.38.
|
|
3
|
+
"version": "4.38.2",
|
|
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.38.
|
|
3
|
+
"version": "4.38.2",
|
|
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.38.
|
|
3
|
+
"version": "4.38.2",
|
|
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.38.
|
|
3
|
+
"version": "4.38.2",
|
|
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"
|
|
@@ -72,6 +72,15 @@
|
|
|
72
72
|
}
|
|
73
73
|
]
|
|
74
74
|
},
|
|
75
|
+
{
|
|
76
|
+
"matcher": "Bash",
|
|
77
|
+
"hooks": [
|
|
78
|
+
{
|
|
79
|
+
"type": "command",
|
|
80
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/discharge-work-item-gates.sh"
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
},
|
|
75
84
|
{
|
|
76
85
|
"matcher": "Edit|Write|NotebookEdit|Bash",
|
|
77
86
|
"hooks": [
|
|
@@ -129,10 +138,6 @@
|
|
|
129
138
|
"type": "command",
|
|
130
139
|
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/block-instruction-file-edits.sh"
|
|
131
140
|
},
|
|
132
|
-
{
|
|
133
|
-
"type": "command",
|
|
134
|
-
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/block-direct-issue-create.sh"
|
|
135
|
-
},
|
|
136
141
|
{
|
|
137
142
|
"type": "command",
|
|
138
143
|
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/block-blind-automerge.sh"
|
|
@@ -169,6 +174,15 @@
|
|
|
169
174
|
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/enforce-verification-gate.sh"
|
|
170
175
|
}
|
|
171
176
|
]
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"matcher": "",
|
|
180
|
+
"hooks": [
|
|
181
|
+
{
|
|
182
|
+
"type": "command",
|
|
183
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/block-direct-issue-create.sh"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
172
186
|
}
|
|
173
187
|
],
|
|
174
188
|
"Stop": [
|
|
@@ -8,9 +8,19 @@
|
|
|
8
8
|
# block-direct-issue-create.sh beside it (same delegation pattern as
|
|
9
9
|
# block-instruction-file-edits.agy.sh).
|
|
10
10
|
#
|
|
11
|
-
#
|
|
12
|
-
# Bash-only by construction, and
|
|
13
|
-
#
|
|
11
|
+
# SCOPE GAP, recorded rather than silently dropped (AGENTS.md). This used to
|
|
12
|
+
# read "no scope gap here: the canonical guard is Bash-only by construction, and
|
|
13
|
+
# `run_command` is exactly the surface it needs." That stopped being true in
|
|
14
|
+
# CodySwannGT/lisa#3753: the canonical guard now covers a SECOND substrate —
|
|
15
|
+
# structured tool payloads, where a creation arrives as named fields rather than
|
|
16
|
+
# as a command line — because the filing contract was enforced on the shell and
|
|
17
|
+
# unenforced on every tool call beside it.
|
|
18
|
+
#
|
|
19
|
+
# This adapter forwards `run_command` and nothing else, so on agy that second
|
|
20
|
+
# substrate is still uncovered. Closing it needs agy's own tool-call envelope
|
|
21
|
+
# (which tool names its creation surface, and where the arguments land), and
|
|
22
|
+
# that is a different piece of work from translating one protocol. The shell
|
|
23
|
+
# surface agy does expose receives the whole guard, exactly as before.
|
|
14
24
|
#
|
|
15
25
|
# Fail-open on missing runtimes: a missed refusal costs one under-declared
|
|
16
26
|
# ticket, and `lisa-repair-intake` already sweeps for exactly that. Failing
|