@codyswann/lisa 4.45.3 → 4.45.5
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-blind-automerge.sh +523 -70
- package/all/copy-overwrite/scripts/lisa-hooks/block-direct-issue-create.sh +160 -2
- package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +115 -23
- 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 +18 -10
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +40 -1
- package/package.json +5 -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-write-issue/SKILL.md +16 -0
- package/plugins/lisa/hooks/block-blind-automerge.agy.sh +5 -4
- package/plugins/lisa/hooks/block-blind-automerge.sh +523 -70
- package/plugins/lisa/hooks/block-direct-issue-create.sh +160 -2
- package/plugins/lisa/hooks/worktree-binding-guard.mjs +115 -23
- package/plugins/lisa/rules/eager/ready-role-filing.md +3 -2
- package/plugins/lisa/rules/reference/ready-role-filing.md +20 -2
- package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/plugins/lisa-agy/hooks/block-blind-automerge.agy.sh +5 -4
- package/plugins/lisa-agy/hooks/block-blind-automerge.sh +523 -70
- package/plugins/lisa-agy/hooks/block-direct-issue-create.sh +160 -2
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +16 -0
- 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/hooks/block-blind-automerge.sh +523 -70
- package/plugins/lisa-copilot/hooks/block-direct-issue-create.sh +160 -2
- package/plugins/lisa-copilot/hooks/worktree-binding-guard.mjs +115 -23
- package/plugins/lisa-copilot/rules/eager/ready-role-filing.md +3 -2
- package/plugins/lisa-copilot/rules/reference/ready-role-filing.md +20 -2
- package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/block-blind-automerge.sh +523 -70
- package/plugins/lisa-cursor/hooks/block-direct-issue-create.sh +160 -2
- package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +115 -23
- package/plugins/lisa-cursor/rules/ready-role-filing-reference.mdc +20 -2
- package/plugins/lisa-cursor/rules/ready-role-filing.mdc +3 -2
- package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +16 -0
- 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/hooks/block-blind-automerge.agy.sh +5 -4
- package/plugins/src/base/hooks/block-blind-automerge.sh +523 -70
- package/plugins/src/base/hooks/block-direct-issue-create.sh +160 -2
- package/plugins/src/base/hooks/worktree-binding-guard.mjs +115 -23
- package/plugins/src/base/rules/eager/ready-role-filing.md +3 -2
- package/plugins/src/base/rules/reference/ready-role-filing.md +20 -2
- package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +16 -0
- package/scripts/check-cwd-resolution-corpus.mjs +163 -0
|
@@ -159,6 +159,41 @@ const LisaBlockDirectIssueCreate = async () => {
|
|
|
159
159
|
*/
|
|
160
160
|
const LIFECYCLE_ROLE_READY =
|
|
161
161
|
/(?:^|[^\w.-])(?:lifecycle_role|LIFECYCLE_ROLE)["']?\s*[:=]\s*["']?ready\b|(?:^|[^\w.-])--role[=\s]+["']?ready\b/;
|
|
162
|
+
/**
|
|
163
|
+
* The third declaration: this item is a CONTAINER.
|
|
164
|
+
*
|
|
165
|
+
* A container is neither build-ready nor human-gated. `leaf-only-lifecycle`
|
|
166
|
+
* FORBIDS the build-ready role on an Epic, and a human gate it does not have
|
|
167
|
+
* is a durable false hold — so a guard with only the two arms above could be
|
|
168
|
+
* satisfied for a container only by writing something untrue, and both
|
|
169
|
+
* untruths corrupt data another control reads.
|
|
170
|
+
*
|
|
171
|
+
* It keys on the canonical container line that `derived-branch-plan` defines
|
|
172
|
+
* and `lisa-github-write-issue` already stamps, NOT on a declared
|
|
173
|
+
* `type:Epic`. A declared type is a claim that costs a leaf nothing and
|
|
174
|
+
* leaves it looking buildable; the container line costs the item its Target
|
|
175
|
+
* Backend Environment and Branch Plan, so it is only useful to something
|
|
176
|
+
* that actually is a container.
|
|
177
|
+
*
|
|
178
|
+
* Matched as the WHOLE canonical value, `None` included: the tail alone
|
|
179
|
+
* would match ordinary prose about how a container's state behaves, and a
|
|
180
|
+
* declaration that ordinary prose satisfies is not a declaration.
|
|
181
|
+
* Whitespace-tolerant because a body file may wrap the line; dash-tolerant
|
|
182
|
+
* because an author retyping it by hand will not always reach for the em
|
|
183
|
+
* dash.
|
|
184
|
+
*/
|
|
185
|
+
const CONTAINER_DECLARATION =
|
|
186
|
+
/None\s*[\u2014\u2013-]\s*container:\s*state\s+rolls\s+up\s+from\s+children/i;
|
|
187
|
+
/**
|
|
188
|
+
* The checkable half of "is it really a container": an item cannot be a
|
|
189
|
+
* container and a by-design leaf at once. The types are quoted from
|
|
190
|
+
* `leaf-only-lifecycle`. Story and Spike are deliberately absent — that
|
|
191
|
+
* rule's childless-parent exception makes them leaf-or-container depending
|
|
192
|
+
* on child work, and a decomposition legitimately files a parent Story
|
|
193
|
+
* before the children that make it one.
|
|
194
|
+
*/
|
|
195
|
+
const LEAF_TYPE_FLAG =
|
|
196
|
+
/--(?:label|labels|add-label|type|issue-type|issuetype)(?:=|\s+)(['"]?)(?:type:)?(bug|task|sub-?task|improvement)\1(?=[\s,]|$)/i;
|
|
162
197
|
/** A creation verb, and a tracker endpoint to send it to. */
|
|
163
198
|
const GRAPHQL_CREATE = /createIssue|issueCreate/;
|
|
164
199
|
const TRACKER_ENDPOINT =
|
|
@@ -487,7 +522,11 @@ const LisaBlockDirectIssueCreate = async () => {
|
|
|
487
522
|
.some(candidate => against.includes(candidate))
|
|
488
523
|
) ||
|
|
489
524
|
text.includes(HUMAN_GATE_MARKER) ||
|
|
490
|
-
(roleOk && LIFECYCLE_ROLE_READY.test(text))
|
|
525
|
+
(roleOk && LIFECYCLE_ROLE_READY.test(text)) ||
|
|
526
|
+
// The container arm. The contradiction check comes first, so a filing
|
|
527
|
+
// declaring itself both a container and a by-design leaf is refused
|
|
528
|
+
// rather than allowed on the strength of the half that suits it.
|
|
529
|
+
(!LEAF_TYPE_FLAG.test(text) && CONTAINER_DECLARATION.test(text));
|
|
491
530
|
const declares = (text: string): boolean =>
|
|
492
531
|
declaresFor(text, roles, stateRoleOk);
|
|
493
532
|
// A creation the command does not spell out itself, because it lives in
|
package/package.json
CHANGED
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
"check:pipeline-status-reads": "node scripts/check-pipeline-status-reads.mjs",
|
|
64
64
|
"check:whole-output-guards": "node scripts/check-whole-output-guards.mjs",
|
|
65
65
|
"check:empty-subject-guards": "node scripts/check-empty-subject-guards.mjs",
|
|
66
|
+
"check:cwd-resolution-corpus": "node scripts/check-cwd-resolution-corpus.mjs",
|
|
66
67
|
"check:probe-absence-direction": "node scripts/check-probe-absence-direction.mjs",
|
|
67
68
|
"check:shell-guard-refusals": "bun run build && $npm_execpath run lisa-test-run -- --adapter direct -- node scripts/check-shell-guard-refusal-coverage.mjs",
|
|
68
69
|
"check:workflow-inputs": "node scripts/detect-stale-workflow-inputs.mjs --project . --project typescript/create-only --project rails/create-only --json",
|
|
@@ -175,7 +176,7 @@
|
|
|
175
176
|
"zod-validation-error": "^4.0.0"
|
|
176
177
|
},
|
|
177
178
|
"name": "@codyswann/lisa",
|
|
178
|
-
"version": "4.45.
|
|
179
|
+
"version": "4.45.5",
|
|
179
180
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
180
181
|
"main": "dist/index.js",
|
|
181
182
|
"exports": {
|
|
@@ -323,7 +324,7 @@
|
|
|
323
324
|
"test": "tests"
|
|
324
325
|
},
|
|
325
326
|
"types": "./dist/index.d.ts",
|
|
326
|
-
"lisaReleaseCommit": "
|
|
327
|
-
"gitHead": "
|
|
328
|
-
"lisaReleaseTag": "v4.45.
|
|
327
|
+
"lisaReleaseCommit": "2dfa25a8a2115203dd400e5e1f69aefef8014933",
|
|
328
|
+
"gitHead": "2dfa25a8a2115203dd400e5e1f69aefef8014933",
|
|
329
|
+
"lisaReleaseTag": "v4.45.5"
|
|
329
330
|
}
|
|
@@ -289,6 +289,22 @@ proceed — the marker still holds. Never file the label *instead of* the marker
|
|
|
289
289
|
|
|
290
290
|
If a leaf arrives with `build_ready` omitted or `false` **and** no `human_gate`, do not create it: report the incomplete handoff and name both ways to resolve it (`build_ready: true`, or a `human_gate` reason). Containers are exempt — their state rolls up from children, so they need neither.
|
|
291
291
|
|
|
292
|
+
**The container exemption is executable, not prose.** It used to live only in the sentence above,
|
|
293
|
+
which meant the `block-direct-issue-create.sh` guard — the control that actually runs on the CLI
|
|
294
|
+
path — had no arm for it, and a container could satisfy that guard only by declaring a build-ready
|
|
295
|
+
role `leaf-only-lifecycle` forbids on it or a human gate it does not have. A container now declares
|
|
296
|
+
a **third** thing, and this skill already writes it: the canonical Target Backend Environment value
|
|
297
|
+
`None — container: state rolls up from children`, defined once by `derived-branch-plan`. The guard
|
|
298
|
+
reads that one string, so there is nothing for the skill and the guard to disagree about.
|
|
299
|
+
|
|
300
|
+
Two consequences for a container written from here. Render the Target Backend Environment section
|
|
301
|
+
with that exact value — an absent section reads as *underivable*, not exempt, and leaves the guard
|
|
302
|
+
nothing to read. And do not put a **by-design leaf type** (`type:Bug` / `type:Task` /
|
|
303
|
+
`type:Sub-task` / `type:Improvement`) on a filing carrying that declaration: an item cannot be a
|
|
304
|
+
container and a leaf at once, and the guard refuses the combination. `type:Story` and `type:Spike`
|
|
305
|
+
are not in that set, because `leaf-only-lifecycle`'s childless-parent exception makes them
|
|
306
|
+
leaf-or-container depending on child work.
|
|
307
|
+
|
|
292
308
|
## Phase 5.5 — Validate (Pre-write Gate)
|
|
293
309
|
|
|
294
310
|
Before any write, invoke `lisa-github-validate-issue` with the full proposed spec assembled from Phases 2 / 3 / 4 / 5. Pass it as a YAML block per the `lisa-github-validate-issue` schema, including `runtime_behavior_change`, `authenticated_surface`, and `artifacts_attached` flags so the right gates run.
|
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
# adapter only translates protocols; all classification — which commands arm
|
|
8
8
|
# auto-merge, and what GitHub says about the PR's review gate — stays in the
|
|
9
9
|
# canonical block-blind-automerge.sh beside it (same delegation pattern as
|
|
10
|
-
# block-shell-json-parsing.agy.sh)
|
|
11
|
-
#
|
|
12
|
-
#
|
|
10
|
+
# block-shell-json-parsing.agy.sh) — including which commands re-target a pull
|
|
11
|
+
# request onto a base ref no ruleset covers. Fail-open on missing runtimes,
|
|
12
|
+
# matching the canonical guard's own degrade-loudly path: a guard that cannot
|
|
13
|
+
# read the PR cannot tell an honest arming from a blind one.
|
|
13
14
|
set -uo pipefail
|
|
14
15
|
|
|
15
16
|
allow() {
|
|
@@ -50,5 +51,5 @@ else
|
|
|
50
51
|
fi
|
|
51
52
|
|
|
52
53
|
[ "$canonical_status" -eq 0 ] && allow
|
|
53
|
-
[ -n "$canonical_output" ] || canonical_output="Blocked:
|
|
54
|
+
[ -n "$canonical_output" ] || canonical_output="Blocked: this command would arm auto-merge on a PR that cannot merge, or move a failing PR onto a base with no required checks."
|
|
54
55
|
deny "$canonical_output"
|