@codyswann/lisa 2.127.0 → 2.128.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 +5 -1
- package/plugins/lisa/.codex-plugin/hooks.json +4 -0
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/commands/parity-code-review.md +6 -0
- package/plugins/lisa/commands/parity-code-simplifier.md +6 -0
- package/plugins/lisa/commands/parity-coderabbit.md +6 -0
- package/plugins/lisa/commands/parity-safety-net-rules.md +6 -0
- package/plugins/lisa/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/lisa/commands/parity-sentry-seer.md +6 -0
- package/plugins/lisa/commands/parity-skill-creator.md +6 -0
- package/plugins/lisa/hooks/parity-safety-net.sh +102 -0
- package/plugins/lisa/rules/eager/base-rules.md +1 -1
- package/plugins/lisa/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/lisa/rules/eager/repo-scope-split.md +1 -1
- package/plugins/lisa/rules/reference/config-resolution.md +1 -1
- package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/lisa/rules/reference/repo-scope-split.md +2 -2
- package/plugins/lisa/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/lisa/skills/parity-code-review/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa/skills/parity-code-simplifier/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa/skills/parity-coderabbit/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa/skills/parity-safety-net-rules/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa/skills/parity-sentry-sdk-setup/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa/skills/parity-sentry-seer/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/lisa/skills/parity-skill-creator/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +4 -4
- package/plugins/lisa-agy/commands/parity-code-review.md +6 -0
- package/plugins/lisa-agy/commands/parity-code-simplifier.md +6 -0
- package/plugins/lisa-agy/commands/parity-coderabbit.md +6 -0
- package/plugins/lisa-agy/commands/parity-safety-net-rules.md +6 -0
- package/plugins/lisa-agy/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/lisa-agy/commands/parity-sentry-seer.md +6 -0
- package/plugins/lisa-agy/commands/parity-skill-creator.md +6 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-agy/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-agy/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa-agy/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa-agy/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa-agy/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa-agy/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/lisa-agy/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/tracker-build-intake/SKILL.md +4 -4
- 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 +5 -1
- package/plugins/lisa-copilot/commands/parity-code-review.md +6 -0
- package/plugins/lisa-copilot/commands/parity-code-simplifier.md +6 -0
- package/plugins/lisa-copilot/commands/parity-coderabbit.md +6 -0
- package/plugins/lisa-copilot/commands/parity-safety-net-rules.md +6 -0
- package/plugins/lisa-copilot/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/lisa-copilot/commands/parity-sentry-seer.md +6 -0
- package/plugins/lisa-copilot/commands/parity-skill-creator.md +6 -0
- package/plugins/lisa-copilot/hooks/parity-safety-net.sh +102 -0
- package/plugins/lisa-copilot/rules/eager/base-rules.md +1 -1
- package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/lisa-copilot/rules/eager/repo-scope-split.md +1 -1
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +1 -1
- package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +2 -2
- package/plugins/lisa-copilot/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-copilot/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-copilot/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa-copilot/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa-copilot/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa-copilot/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa-copilot/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/tracker-build-intake/SKILL.md +4 -4
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/commands/parity-code-review.md +6 -0
- package/plugins/lisa-cursor/commands/parity-code-simplifier.md +6 -0
- package/plugins/lisa-cursor/commands/parity-coderabbit.md +6 -0
- package/plugins/lisa-cursor/commands/parity-safety-net-rules.md +6 -0
- package/plugins/lisa-cursor/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/lisa-cursor/commands/parity-sentry-seer.md +6 -0
- package/plugins/lisa-cursor/commands/parity-skill-creator.md +6 -0
- package/plugins/lisa-cursor/hooks/hooks.json +4 -0
- package/plugins/lisa-cursor/hooks/parity-safety-net.sh +102 -0
- package/plugins/lisa-cursor/rules/base-rules.mdc +1 -1
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +9 -9
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle.mdc +4 -4
- package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +2 -2
- package/plugins/lisa-cursor/rules/repo-scope-split.mdc +1 -1
- package/plugins/lisa-cursor/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-cursor/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-cursor/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa-cursor/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa-cursor/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa-cursor/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa-cursor/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/tracker-build-intake/SKILL.md +4 -4
- 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-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 +2 -1
- package/plugins/src/base/commands/parity-code-review.md +6 -0
- package/plugins/src/base/commands/parity-code-simplifier.md +6 -0
- package/plugins/src/base/commands/parity-coderabbit.md +6 -0
- package/plugins/src/base/commands/parity-safety-net-rules.md +6 -0
- package/plugins/src/base/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/src/base/commands/parity-sentry-seer.md +6 -0
- package/plugins/src/base/commands/parity-skill-creator.md +6 -0
- package/plugins/src/base/hooks/parity-safety-net.sh +102 -0
- package/plugins/src/base/rules/eager/base-rules.md +1 -1
- package/plugins/src/base/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/src/base/rules/eager/repo-scope-split.md +1 -1
- package/plugins/src/base/rules/reference/config-resolution.md +1 -1
- package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/src/base/rules/reference/repo-scope-split.md +2 -2
- package/plugins/src/base/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/src/base/skills/intake-explain/SKILL.md +3 -3
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/src/base/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/src/base/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/src/base/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/src/base/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/src/base/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/src/base/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/src/base/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/src/base/skills/repair-intake/SKILL.md +2 -2
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +4 -4
- package/scripts/plugin-parity-drift.mjs +9 -1
|
@@ -162,9 +162,9 @@ If the spec doesn't set `authenticated_surface`, infer it: scan the description
|
|
|
162
162
|
|
|
163
163
|
#### S10 — Repository section, single-repo scope
|
|
164
164
|
|
|
165
|
-
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}
|
|
165
|
+
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` — or a **build-ready childless Story/Spike** (a claimable leaf per `leaf-only-lifecycle`) — description must contain `h2. Repository` naming exactly one repo. Multiple repos OR cross-repo references in AC: FAIL with recommendation `"Split into per-repo work units under a shared parent Story (see lisa:task-decomposition step 1.5)"`.
|
|
166
166
|
|
|
167
|
-
|
|
167
|
+
An **Epic**, or a **Story/Spike that still holds child work** (or is not build-ready): skipped (may span repos — coordination containers, not claimable leaf work units).
|
|
168
168
|
|
|
169
169
|
This gate is `product_relevant: false` because cross-repo work units are not a product question — they are a decomposition error. Callers (`lisa:notion-to-tracker`, `lisa:confluence-to-tracker`, `lisa:linear-to-tracker`, `lisa:github-to-tracker`) MUST pre-split cross-repo work into per-repo work units during the decomposition phase per `lisa:task-decomposition` step 1.5; an S10 failure here indicates the agent skipped that step and must auto-split + revalidate before writing, not surface a clarifying comment to product.
|
|
170
170
|
|
|
@@ -200,7 +200,7 @@ When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` AND `runtime_behavior_c
|
|
|
200
200
|
|
|
201
201
|
FAIL when the Validation Journey is present but declares zero `[EVIDENCE: name]` markers, or when any marker name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one marker passes but the remediation should recommend adding the error/edge case.
|
|
202
202
|
|
|
203
|
-
This gate depends on S11. It is `N/A` for Epic
|
|
203
|
+
This gate depends on S11. It is `N/A` for containers — an **Epic**, or any item with open child work (coordination containers, not work units) — and for leaf units with `runtime_behavior_change = false` (doc-only / config-only / type-only). If S11 fails because the Validation Journey is absent, S14 also FAILs (there is no manifest to bind) with remediation pointing back to `lisa:jira-add-journey`.
|
|
204
204
|
|
|
205
205
|
#### S15 — Leaf-only build-ready
|
|
206
206
|
|
|
@@ -212,20 +212,19 @@ Enforces the build-side of the vendor-neutral `leaf-only-lifecycle` rule: **only
|
|
|
212
212
|
|
|
213
213
|
Apply this decision and FAIL the two invariant-violating cases:
|
|
214
214
|
|
|
215
|
-
1. **Container with child work + build-ready** —
|
|
216
|
-
2. **Childless
|
|
215
|
+
1. **Container with child work + build-ready** — child work is present (any type that has open children), AND build-ready. FAIL. A parent organizes work; it is never claimed and implemented directly. Its lifecycle state rolls up from its children.
|
|
216
|
+
2. **Childless Epic + build-ready** — `issue_type = Epic` with **no** child work, AND build-ready. Still FAIL: an Epic is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, not an implementable unit. (A childless Story or Spike is **not** failed here — the childless-parent exception in `leaf-only-lifecycle` promotes every childless non-Epic type to a build-ready leaf.)
|
|
217
217
|
|
|
218
|
-
PASS (the childless-parent exception) when the ticket is build-ready and is a **leaf work unit**: `issue_type
|
|
218
|
+
PASS (the childless-parent exception) when the ticket is build-ready and is a **leaf work unit**: it has **no** open child work and `issue_type ≠ Epic` (i.e. `Bug, Task, Sub-task, Improvement`, or a childless `Story` / `Spike`). A flat Task/Bug, or a childless Story/Spike with no sub-tasks, is a valid build-ready leaf and must not be stranded.
|
|
219
219
|
|
|
220
220
|
| issue_type | has child work | build-ready | S15 |
|
|
221
221
|
|---|---|---|---|
|
|
222
|
-
| Bug / Task / Sub-task / Improvement | no | yes | **PASS** (leaf) |
|
|
223
|
-
|
|
|
224
|
-
| Epic
|
|
225
|
-
| Epic / Story / Spike | no | yes | **FAIL** (childless container-type, exception does not apply) |
|
|
222
|
+
| Bug / Task / Sub-task / Improvement / Story / Spike | no | yes | **PASS** (leaf) |
|
|
223
|
+
| any type | yes | yes | **FAIL** (structurally a container) |
|
|
224
|
+
| Epic | no | yes | **FAIL** (childless Epic — pure rollup container, exception does not apply) |
|
|
226
225
|
| any | any | no | **N/A** (not build-ready) |
|
|
227
226
|
|
|
228
|
-
Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle. Move status:ready off this container onto its leaf children (or, for a childless Epic
|
|
227
|
+
Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle. Move status:ready off this container onto its leaf children (or, for a childless Epic, decompose it into leaf children or reclassify it to a leaf type); a parent's lifecycle state rolls up from its children and is never set to ready directly."`
|
|
229
228
|
|
|
230
229
|
`product_relevant: false` — a build-ready container is a lifecycle/decomposition error for the caller to repair, not a product question.
|
|
231
230
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-build-intake
|
|
3
|
-
description: "Symmetric counterpart to lisa:jira-build-intake on the Linear side. Scans a Linear team for Issues carrying the configured `ready` build label, claims the first eligible Issue by relabeling to the configured `claimed` label, runs the implementation/build flow via lisa:linear-agent, relabels to the configured `done` label on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic
|
|
3
|
+
description: "Symmetric counterpart to lisa:jira-build-intake on the Linear side. Scans a Linear team for Issues carrying the configured `ready` build label, claims the first eligible Issue by relabeling to the configured `claimed` label, runs the implementation/build flow via lisa:linear-agent, relabels to the configured `done` label on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic) that still carries a stale build-ready label is skipped or safe-blocked with a lifecycle-repair comment, never claimed. The `ready` label is the human-flipped signal that an Issue is truly ready for development — mirroring how Notion PRDs work Draft → Ready → (us) In Review → Blocked|Ticketed."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_teams", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -167,17 +167,17 @@ Classify and act (first match wins). The type comes from the Issue's `type:` lab
|
|
|
167
167
|
| Condition | Class | Action |
|
|
168
168
|
|---|---|---|
|
|
169
169
|
| `OPEN_CHILDREN > 0` (open child work, any type) | **Container** | **Skip / safe-block — do NOT claim** |
|
|
170
|
-
| no open children AND type
|
|
171
|
-
| no open children AND type
|
|
170
|
+
| no open children AND type = Epic (a Linear Project) | **Childless Epic/Project (pure rollup container)** | **Skip / safe-block — do NOT claim** |
|
|
171
|
+
| no open children AND type ≠ Epic (Bug, Task, Sub-task, Improvement, Story, Spike, or no `type:` label) | **Leaf work unit** | **Proceed to 3b claim** |
|
|
172
172
|
|
|
173
|
-
The childless-parent exception
|
|
173
|
+
The childless-parent exception promotes every childless type **except Epic** to a claimable leaf: a childless Story is a directly shippable increment and a childless Spike *is* the investigation unit, so neither is stranded. Only a childless **Epic** (a Linear Project) stays unclaimed — it is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, never an implementable unit.
|
|
174
174
|
|
|
175
175
|
**Safe-block (default action for a flagged container).** Leave the build-ready label in place (don't silently strip it — that hides the lifecycle error), post a single lifecycle-repair comment, record the Issue under "Skipped (container)" in the summary, and end the cycle. Do NOT relabel to `$CLAIMED`. Keep the comment idempotent — skip posting if an identical `[claude-build-intake]` lifecycle-repair comment already exists on the Issue, so a re-entrant cycle doesn't spam it.
|
|
176
176
|
|
|
177
177
|
Post via `mcp__linear-server__save_comment` with:
|
|
178
178
|
|
|
179
179
|
```text
|
|
180
|
-
[claude-build-intake] Not claimed: this Issue carries the build-ready label ($READY) but is a container with open child work (or a childless Epic
|
|
180
|
+
[claude-build-intake] Not claimed: this Issue carries the build-ready label ($READY) but is a container with open child work (or a childless Epic), which violates the leaf-only-lifecycle rule. Build-ready (status:ready) is leaf-only per leaf-only-lifecycle — an agent claims and implements leaves, never a container. Repair: move $READY off this parent onto its leaf children (or, for a childless Epic, decompose it into leaf children or reclassify it to a leaf type). A parent's lifecycle state rolls up from its children and is never set to ready directly.
|
|
181
181
|
```
|
|
182
182
|
|
|
183
183
|
This gate never blocks a legitimate flat Task/Bug: those have no open children and a leaf `type:`, so they fall straight through to the claim in 3b.
|
|
@@ -252,7 +252,7 @@ Total PRs opened: <n>
|
|
|
252
252
|
|
|
253
253
|
## Idempotency & safety
|
|
254
254
|
|
|
255
|
-
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any claim; a container with open child work (or a childless Epic
|
|
255
|
+
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any claim; a container with open child work (or a childless Epic) is skipped/safe-blocked, never claimed (the `leaf-only-lifecycle` rule's claim-time arm). The safe-block comment is idempotent — a re-entrant cycle does not re-post it.
|
|
256
256
|
- **Claim-first ordering**: `$CLAIMED` set BEFORE agent invocation — no double-pickup.
|
|
257
257
|
- **No writes outside the lifecycle**: this skill only adds/removes `$READY`, `$CLAIMED`, `$DONE`, plus terminal-only native state completion required by `leaf-only-lifecycle`. Every other label change (and non-terminal native state change) is owned by the agent or `lisa:linear-evidence`.
|
|
258
258
|
- **Terminal native closure**: after the `$DONE` label is applied, move the Linear Issue to a native completed state only when `$DONE` is the true terminal done value; intermediate env labels stay open / active.
|
|
@@ -273,7 +273,7 @@ If the team hasn't adopted these labels, the first run exits with an adoption hi
|
|
|
273
273
|
|
|
274
274
|
## Rules
|
|
275
275
|
|
|
276
|
-
- **Claim leaves only.** Per the `leaf-only-lifecycle` rule, never claim a container — an Issue with open child work, or a childless Epic
|
|
276
|
+
- **Claim leaves only.** Per the `leaf-only-lifecycle` rule, never claim a container — an Issue with open child work, or a childless Epic — even if it carries the build-ready label. Skip or safe-block it (Phase 3a); never silently implement a container.
|
|
277
277
|
- Never relabel an Issue the cycle didn't claim. The `$CLAIMED` transition is the signature of cycle ownership.
|
|
278
278
|
- Never bypass `lisa:linear-agent` to do build work directly. The agent owns the per-Issue lifecycle.
|
|
279
279
|
- Never auto-transition past `$DONE`. Downstream labels are owned by QA / product / a future verification-intake skill.
|
|
@@ -165,9 +165,9 @@ If the spec doesn't set `authenticated_surface`, infer it: scan the description
|
|
|
165
165
|
|
|
166
166
|
#### S10 — Repository section, single-repo scope
|
|
167
167
|
|
|
168
|
-
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}
|
|
168
|
+
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` — or a **build-ready childless Story/Spike** (a claimable leaf per `leaf-only-lifecycle`) — description must contain `## Repository` naming exactly one repo. Multiple repos OR cross-repo references in AC: FAIL with recommendation `"Split into per-repo work units under a shared parent Story (see lisa:task-decomposition step 1.5)"`.
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
An **Epic** (a Linear Project), or a **Story/Spike that still holds child work** (or is not build-ready): skipped (may span repos — coordination containers, not claimable leaf work units).
|
|
171
171
|
|
|
172
172
|
This gate is `product_relevant: false` because cross-repo work units are not a product question — they are a decomposition error. Callers (`lisa:linear-to-tracker`, `lisa:notion-to-tracker`, etc.) MUST pre-split cross-repo work into per-repo work units during the decomposition phase per `lisa:task-decomposition` step 1.5; an S10 failure here indicates the agent skipped that step and must auto-split + revalidate before writing, not surface a clarifying comment to product.
|
|
173
173
|
|
|
@@ -201,7 +201,7 @@ When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` AND `runtime_behavior_c
|
|
|
201
201
|
|
|
202
202
|
FAIL when the Validation Journey is present but declares zero `[EVIDENCE: name]` markers, or when any marker name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one marker passes but the remediation should recommend adding the error/edge case.
|
|
203
203
|
|
|
204
|
-
This gate depends on S11. It is `N/A` for Project
|
|
204
|
+
This gate depends on S11. It is `N/A` for containers — a **Project** (the Epic equivalent), or any item with open child work (coordination containers, not work units) — and for leaf units with `runtime_behavior_change = false` (doc-only / config-only / type-only). If S11 fails because the Validation Journey is absent, S14 also FAILs (there is no manifest to bind) with remediation pointing back to `lisa:linear-add-journey`.
|
|
205
205
|
|
|
206
206
|
#### S15 — Leaf-only build-ready
|
|
207
207
|
|
|
@@ -213,20 +213,19 @@ Enforces the build-side of the vendor-neutral `leaf-only-lifecycle` rule: **only
|
|
|
213
213
|
|
|
214
214
|
Apply this decision and FAIL the two invariant-violating cases:
|
|
215
215
|
|
|
216
|
-
1. **Container with child work + build-ready** —
|
|
217
|
-
2. **Childless
|
|
216
|
+
1. **Container with child work + build-ready** — child work is present (any type that has open children), AND build-ready. FAIL. A parent organizes work; it is never claimed and implemented directly. Its lifecycle state rolls up from its children.
|
|
217
|
+
2. **Childless Epic/Project + build-ready** — `issue_type = Epic` (a Linear Project) with **no** child work, AND build-ready. Still FAIL: an Epic/Project is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, not an implementable unit. (A childless Story or Spike is **not** failed here — the childless-parent exception in `leaf-only-lifecycle` promotes every childless non-Epic type to a build-ready leaf.)
|
|
218
218
|
|
|
219
|
-
PASS (the childless-parent exception) when the item is build-ready and is a **leaf work unit**: `issue_type
|
|
219
|
+
PASS (the childless-parent exception) when the item is build-ready and is a **leaf work unit**: it has **no** open child work and `issue_type ≠ Epic` (i.e. `Bug, Task, Sub-task, Improvement`, or a childless `Story` / `Spike`). A flat Task/Bug, or a childless Story/Spike with no sub-issues, is a valid build-ready leaf and must not be stranded.
|
|
220
220
|
|
|
221
221
|
| issue_type | has child work | build-ready | S15 |
|
|
222
222
|
|---|---|---|---|
|
|
223
|
-
| Bug / Task / Sub-task / Improvement | no | yes | **PASS** (leaf) |
|
|
224
|
-
|
|
|
225
|
-
| Epic
|
|
226
|
-
| Epic / Story / Spike | no | yes | **FAIL** (childless container-type, exception does not apply) |
|
|
223
|
+
| Bug / Task / Sub-task / Improvement / Story / Spike | no | yes | **PASS** (leaf) |
|
|
224
|
+
| any type | yes | yes | **FAIL** (structurally a container) |
|
|
225
|
+
| Epic (Project) | no | yes | **FAIL** (childless Epic/Project — pure rollup container, exception does not apply) |
|
|
227
226
|
| any | any | no | **N/A** (not build-ready) |
|
|
228
227
|
|
|
229
|
-
Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle. Move status:ready off this container onto its leaf children (or, for a childless Epic
|
|
228
|
+
Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle. Move status:ready off this container onto its leaf children (or, for a childless Epic, decompose it into leaf children or reclassify it to a leaf type); a parent's lifecycle state rolls up from its children and is never set to ready directly."`
|
|
230
229
|
|
|
231
230
|
`product_relevant: false` — a build-ready container is a lifecycle/decomposition error for the caller to repair, not a product question.
|
|
232
231
|
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: parity-code-review
|
|
3
|
+
description: "Lisa-native code review of the current git diff. Walks every changed hunk and reports correctness bugs, security issues, and obvious defects as severity-ranked findings with file:line references. Vendor-neutral — the cross-agent equivalent of the upstream code-review command, runnable on Codex, agy, Copilot, Cursor, and Claude."
|
|
4
|
+
allowed-tools: ["Read", "Bash", "Grep", "Glob"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Parity Code Review
|
|
8
|
+
|
|
9
|
+
Review the code that is *about to ship* — the current uncommitted/branch diff — for defects a reviewer would block on. This is a focused **defect hunt**: correctness, security, and obvious mistakes. It is not a style audit and not a refactor pass (use `parity-code-simplifier` for quality-only cleanup).
|
|
10
|
+
|
|
11
|
+
> **Not drift-trackable.** This skill intentionally carries **no `synced-from` pin**. The upstream `code-review@claude-plugins-official` plugin publishes **no semver** (its cache version resolves to `unknown`), so a pin would be unparseable and meaningless to `scripts/plugin-parity-drift.mjs`. Drift is tracked **manually** — re-review the upstream command by hand when the curated plugin set is refreshed. This is a Lisa-native reimplementation, **not** a port of upstream code.
|
|
12
|
+
|
|
13
|
+
## Step 1: Establish the diff
|
|
14
|
+
|
|
15
|
+
Determine exactly what changed. Prefer the broadest accurate view of the work-in-progress:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Branch changes vs the merge base (preferred for a PR-style review)
|
|
19
|
+
git merge-base HEAD origin/main 2>/dev/null && \
|
|
20
|
+
git diff "$(git merge-base HEAD origin/main)"...HEAD
|
|
21
|
+
|
|
22
|
+
# Plus anything still uncommitted in the working tree
|
|
23
|
+
git diff HEAD
|
|
24
|
+
git status --short
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
If there is no diff at all, say so plainly and stop — do not invent findings. If the diff is enormous, review in full but prioritize the files with the most logic changes; never silently skip files (note any you deprioritized).
|
|
28
|
+
|
|
29
|
+
## Step 2: Read for real context
|
|
30
|
+
|
|
31
|
+
Do **not** review hunks in isolation. For each changed file, open enough surrounding code to understand:
|
|
32
|
+
|
|
33
|
+
- What the function/module is supposed to do and who calls it.
|
|
34
|
+
- Invariants and preconditions the change might violate.
|
|
35
|
+
- Error/edge paths touched by the change.
|
|
36
|
+
|
|
37
|
+
Use `Read`, `Grep`, and `Glob` to follow call sites and trace data flow. A finding you can't ground in the actual code is a guess — drop it.
|
|
38
|
+
|
|
39
|
+
## Step 3: Hunt for defects
|
|
40
|
+
|
|
41
|
+
For every changed hunk, evaluate against these lenses:
|
|
42
|
+
|
|
43
|
+
1. **Correctness** — Off-by-one errors, inverted conditions, wrong operator, missing `await`, unhandled `null`/`undefined`, incorrect default, broken control flow, type coercion bugs, mutation of shared state, race conditions.
|
|
44
|
+
2. **Security** — Unsanitized input at trust boundaries; injection (SQL/shell/template); secrets, tokens, or keys committed or logged; missing authn/authz on new endpoints; unsafe deserialization; path traversal; overly broad permissions; SSRF.
|
|
45
|
+
3. **Edge cases & failure modes** — Empty collections, zero, negative numbers, very large input, concurrent calls, partial failures, timeouts, retries that aren't idempotent.
|
|
46
|
+
4. **Obvious defects** — Dead code paths, unreachable branches, swallowed errors, resource leaks (unclosed handles/connections), `TODO`/`FIXME` left in shipping code, debug logging left on, broken or missing tests for the new behavior.
|
|
47
|
+
5. **Contract & API** — Breaking changes to public signatures, changed return shapes, altered error semantics callers depend on.
|
|
48
|
+
|
|
49
|
+
## Step 4: Output — severity-ranked findings
|
|
50
|
+
|
|
51
|
+
Group findings by severity. Within each group, list the most impactful first. Every finding **must** carry a `file:line` reference.
|
|
52
|
+
|
|
53
|
+
### Critical (must fix before merge)
|
|
54
|
+
Bugs that break correctness, leak/expose data, or introduce a security hole.
|
|
55
|
+
|
|
56
|
+
### Warning (should fix)
|
|
57
|
+
Likely to cause problems later, or a real defect with limited blast radius.
|
|
58
|
+
|
|
59
|
+
### Suggestion (nice to have)
|
|
60
|
+
Minor correctness nits or defensive improvements.
|
|
61
|
+
|
|
62
|
+
### Finding format
|
|
63
|
+
|
|
64
|
+
For each finding:
|
|
65
|
+
|
|
66
|
+
- **What** — precise description of the defect.
|
|
67
|
+
- **Where** — `path/to/file.ts:42` (and a span if it covers multiple lines).
|
|
68
|
+
- **Why** — the concrete failure it causes, with an example input or sequence that triggers it.
|
|
69
|
+
- **Fix** — a specific, actionable suggestion (or a short code sketch).
|
|
70
|
+
|
|
71
|
+
Example:
|
|
72
|
+
|
|
73
|
+
> **Critical — Unhandled null dereference**
|
|
74
|
+
> **Where:** `src/auth/session.ts:88`
|
|
75
|
+
> **Why:** `findUser()` returns `null` when the id is unknown, but line 88 reads `user.roles` directly. An unknown session id (expired token replay) throws and 500s instead of returning 401.
|
|
76
|
+
> **Fix:** Guard `if (!user) return unauthorized()` before reading `user.roles`.
|
|
77
|
+
|
|
78
|
+
## Rules
|
|
79
|
+
|
|
80
|
+
- **Ground every finding in the diff.** No speculative findings, no generic best-practice lectures unrelated to the change.
|
|
81
|
+
- **Be honest about coverage.** If you deprioritized files or couldn't fully trace a path, say so.
|
|
82
|
+
- **If the diff is clean, say so clearly** — "No blocking issues found across N changed files" — do not manufacture problems.
|
|
83
|
+
- This is review-only: report findings, do **not** edit files. Apply fixes via the normal implementation flow or `parity-code-simplifier` (quality) after triage.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: parity-code-simplifier
|
|
3
|
+
description: "Lisa-native, behavior-preserving simplification of recently-changed code. Removes duplication and dead code, reuses existing utilities, and improves readability without altering behavior — quality only, never a bug hunt. Vendor-neutral cross-agent equivalent of the upstream code-simplifier agent, runnable on Codex, agy, Copilot, Cursor, and Claude."
|
|
4
|
+
allowed-tools: ["Read", "Bash", "Grep", "Glob", "Edit", "Write"]
|
|
5
|
+
synced-from: code-simplifier@claude-plugins-official@1.0.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Parity Code Simplifier
|
|
9
|
+
|
|
10
|
+
Make the **recently-changed** code simpler and easier to maintain **without changing what it does**. This is a quality pass: deduplication, reuse, readability, and dead-code removal. It is explicitly **not** a bug hunt — if you spot a likely defect, note it for a reviewer (or `parity-code-review`) and leave the behavior intact.
|
|
11
|
+
|
|
12
|
+
> **Drift tracking.** Pinned to `code-simplifier@claude-plugins-official@1.0.0`. `scripts/plugin-parity-drift.mjs` compares this pin against the upstream version in the plugin cache and flags staleness. This is a Lisa-native reimplementation written from scratch — **do not port or copy upstream plugin code.**
|
|
13
|
+
|
|
14
|
+
## Scope: recently-changed code only
|
|
15
|
+
|
|
16
|
+
Default to the current diff, not the whole repository. Establish scope first:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
git merge-base HEAD origin/main 2>/dev/null && \
|
|
20
|
+
git diff --stat "$(git merge-base HEAD origin/main)"...HEAD
|
|
21
|
+
git diff HEAD --stat
|
|
22
|
+
git status --short
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Simplify the files that changed and the immediate code they touch. Do not embark on a repo-wide refactor unless explicitly asked.
|
|
26
|
+
|
|
27
|
+
## The prime directive: preserve behavior
|
|
28
|
+
|
|
29
|
+
Every edit must be behavior-preserving. Before changing anything, understand the current contract — inputs, outputs, side effects, error paths, public signatures. After changing it, the observable behavior must be identical. When in doubt, **don't** — leave a note instead of risking a semantic change.
|
|
30
|
+
|
|
31
|
+
## What to simplify
|
|
32
|
+
|
|
33
|
+
1. **Duplication (DRY)** — Collapse copy-pasted blocks into a single function or shared helper. Prefer delegating to an existing canonical implementation over re-deriving logic (see the repo's DRY rule: a function that reproduces a sequence should call the shared generator, not reimplement it).
|
|
34
|
+
2. **Reuse over reinvention** — Search for existing utilities (`Grep`/`Glob`) before introducing new code. If the project already has a helper for what the change hand-rolls, use it.
|
|
35
|
+
3. **Readability** — Clearer names; flatten needless nesting with early returns/guard clauses; replace clever one-liners with obvious code; split overly long functions along natural seams.
|
|
36
|
+
4. **Dead code** — Remove unreachable branches, unused variables/imports/exports, and commented-out blocks introduced or exposed by the change.
|
|
37
|
+
5. **Idiomatic constructs** — Prefer immutable transformations (`map`/`filter`/`reduce`) over mutable accumulation where it's clearer; remove redundant intermediate state.
|
|
38
|
+
|
|
39
|
+
## Respect project conventions
|
|
40
|
+
|
|
41
|
+
This repo enforces specific patterns — honor them so your simplification doesn't trip the linter or hooks:
|
|
42
|
+
|
|
43
|
+
- **Immutability / functional style** — avoid `let` and in-place mutation; prefer `const` and pure transformations.
|
|
44
|
+
- **Statement order** — do not place expression-statement helper calls before `const` definitions; inline validation as `if` guard clauses (exempt from `enforce-statement-order`).
|
|
45
|
+
- **eslint-disable directives** must include a `-- description`.
|
|
46
|
+
- **Barrel-export constraint** — if you delete a file referenced by an `index.ts`, update the barrel in the same change so lint/typecheck stays green.
|
|
47
|
+
- **Never edit generated plugin artifacts** (`plugins/lisa`, `plugins/lisa-*`); the source of truth is `plugins/src/`.
|
|
48
|
+
|
|
49
|
+
## Workflow
|
|
50
|
+
|
|
51
|
+
1. Read each changed file and enough of its callers to know the contract.
|
|
52
|
+
2. Identify simplification opportunities; rank by value-to-risk. Skip anything that risks behavior.
|
|
53
|
+
3. Apply edits with `Edit`/`Write`, one coherent change at a time.
|
|
54
|
+
4. **Verify behavior is unchanged** — run the project's checks:
|
|
55
|
+
```bash
|
|
56
|
+
bun run test
|
|
57
|
+
bun run typecheck 2>/dev/null || true
|
|
58
|
+
bun run lint 2>/dev/null || true
|
|
59
|
+
```
|
|
60
|
+
If any check fails, fix or revert the offending edit before continuing. Never leave the tree worse than you found it.
|
|
61
|
+
|
|
62
|
+
## Output
|
|
63
|
+
|
|
64
|
+
Summarize what you changed and why, grouped by file with `file:line` anchors:
|
|
65
|
+
|
|
66
|
+
- **Simplified** — the edits applied (dedup / reuse / readability / dead-code), each with a one-line rationale.
|
|
67
|
+
- **Left alone** — opportunities you deliberately skipped because they risked behavior, with the reason.
|
|
68
|
+
- **Flagged for review** — any suspected bugs noticed in passing (not fixed here — quality pass only).
|
|
69
|
+
- **Verification** — which checks you ran and that they pass.
|
|
70
|
+
|
|
71
|
+
## Rules
|
|
72
|
+
|
|
73
|
+
- **Behavior-preserving only.** No bug fixes, no feature changes, no API changes disguised as cleanup.
|
|
74
|
+
- **Quality only** — if the only "simplification" would change behavior, don't make it.
|
|
75
|
+
- **Tests must stay green.** A simplification that breaks a test is a behavior change — revert it.
|
|
76
|
+
- If there is nothing worth simplifying, say so clearly rather than churning the code.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: parity-coderabbit
|
|
3
|
+
description: "Thorough PR-style review of the full diff — bugs, security, performance, and maintainability — with concrete suggested fixes and a structured summary. An independent Lisa-native review skill that does NOT call CodeRabbit's service or port its code. Vendor-neutral cross-agent equivalent of the upstream coderabbit plugin, runnable on Codex, agy, Copilot, Cursor, and Claude."
|
|
4
|
+
allowed-tools: ["Read", "Bash", "Grep", "Glob"]
|
|
5
|
+
synced-from: coderabbit@claude-plugins-official@1.1.1
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Parity CodeRabbit
|
|
9
|
+
|
|
10
|
+
A comprehensive, PR-grade code review of the **entire diff** — the kind of pass a senior reviewer (or an automated reviewer like CodeRabbit) gives before approving. Where `parity-code-review` is a tight defect hunt, this skill is **broad and thorough**: it covers bugs, security, performance, *and* maintainability, suggests concrete fixes, and ends with a reviewer-style summary and verdict.
|
|
11
|
+
|
|
12
|
+
> **Independent reimplementation.** This skill is **not** a wrapper around CodeRabbit's hosted service and does **not** port or invoke CodeRabbit's code. It is a Lisa-native review that produces a comparable artifact using only the model and local tooling. No network calls to any review SaaS are made.
|
|
13
|
+
>
|
|
14
|
+
> **Drift tracking.** Pinned to `coderabbit@claude-plugins-official@1.1.1`. `scripts/plugin-parity-drift.mjs` compares this pin against the upstream version in the plugin cache and flags staleness. Reimplemented from scratch — **do not port or copy upstream plugin code.**
|
|
15
|
+
|
|
16
|
+
## Step 1: Assemble the full review surface
|
|
17
|
+
|
|
18
|
+
Gather the complete change set the way a PR review would see it:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Full branch diff vs merge base
|
|
22
|
+
BASE="$(git merge-base HEAD origin/main 2>/dev/null)"
|
|
23
|
+
git diff "$BASE"...HEAD
|
|
24
|
+
git diff "$BASE"...HEAD --stat # file-by-file overview
|
|
25
|
+
git log "$BASE"..HEAD --oneline # commit narrative
|
|
26
|
+
git diff HEAD # uncommitted work
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Read the commit messages and (if available) the PR/ticket description to understand **intent** — a review judges the change against what it was meant to do, not just what it does.
|
|
30
|
+
|
|
31
|
+
## Step 2: Build context per file
|
|
32
|
+
|
|
33
|
+
For each changed file, `Read` the surrounding code and use `Grep`/`Glob` to follow callers, dependents, and tests. Note the change's blast radius: public API, shared modules, migrations, config, and anything downstream consumers rely on.
|
|
34
|
+
|
|
35
|
+
## Step 3: Review across all dimensions
|
|
36
|
+
|
|
37
|
+
Walk every meaningful hunk and evaluate each dimension. A finding in any dimension is fair game.
|
|
38
|
+
|
|
39
|
+
1. **Correctness / bugs** — Logic errors, off-by-one, inverted conditions, missing `await`, null/undefined handling, type coercion, broken control flow, incorrect defaults, mutation of shared state, race conditions, broken or missing tests for new behavior.
|
|
40
|
+
2. **Security** — Injection (SQL/shell/template), unsanitized boundary input, secrets/keys/tokens in code or logs, missing or broken authn/authz, unsafe deserialization, path traversal, SSRF, overly broad permissions, dependency vulnerabilities introduced by the change.
|
|
41
|
+
3. **Performance** — N+1 queries, work inside hot loops, unnecessary allocations or re-renders, missing indexes, blocking I/O on hot paths, unbounded growth, accidental O(n²), redundant network/database round-trips, large bundle additions.
|
|
42
|
+
4. **Maintainability** — Duplication, dead code, unclear naming, overly long/complex functions, missing or misleading docs, leaky abstractions, inconsistent patterns, hidden coupling, magic numbers, and violations of the project's conventions (immutability/functional style, statement order, barrel-export integrity, "never edit generated plugin artifacts").
|
|
43
|
+
5. **Test coverage** — Are the new branches and edge cases tested? Do tests assert behavior rather than implementation? Are failure paths covered?
|
|
44
|
+
|
|
45
|
+
## Step 4: Suggest concrete fixes
|
|
46
|
+
|
|
47
|
+
For each finding, give a **specific, actionable** fix — ideally a short code sketch or a `diff`-style suggestion, not vague advice. The reader should be able to act on it without re-deriving the problem.
|
|
48
|
+
|
|
49
|
+
## Step 5: Output — structured review
|
|
50
|
+
|
|
51
|
+
Produce a review document with these sections:
|
|
52
|
+
|
|
53
|
+
### Summary
|
|
54
|
+
2–4 sentences: what the change does, overall quality, and the headline risks. State a verdict: **Approve**, **Approve with nits**, or **Request changes**.
|
|
55
|
+
|
|
56
|
+
### Findings by severity
|
|
57
|
+
Group as **Critical → Major → Minor → Nit**. Every finding includes:
|
|
58
|
+
|
|
59
|
+
- **What** — the issue, and which dimension it falls under (bug / security / perf / maintainability / tests).
|
|
60
|
+
- **Where** — `path/to/file.ts:line`.
|
|
61
|
+
- **Why** — the concrete consequence, with a triggering example where relevant.
|
|
62
|
+
- **Fix** — a concrete suggestion or code snippet.
|
|
63
|
+
|
|
64
|
+
### Walkthrough (optional but encouraged)
|
|
65
|
+
A brief per-file note on what changed and any file-specific observations — the orientation a human reviewer leaves so the next reader understands the diff quickly.
|
|
66
|
+
|
|
67
|
+
### Strengths
|
|
68
|
+
Call out what's done well. A credible review is balanced, not only critical.
|
|
69
|
+
|
|
70
|
+
## Rules
|
|
71
|
+
|
|
72
|
+
- **Cover the whole diff.** If you deprioritize anything for size, say which files and why — never imply full coverage you didn't give.
|
|
73
|
+
- **Ground every finding in the code.** No generic checklists detached from the actual change; no speculative findings you can't point to.
|
|
74
|
+
- **Concrete fixes only.** "Consider improving error handling" is not a finding; "wrap the `fetch` in try/catch and return a 502 on network error at `api/proxy.ts:31`" is.
|
|
75
|
+
- **No external review service.** Use only local git/tooling and the model — this is an independent review, not a CodeRabbit proxy.
|
|
76
|
+
- **Review-only.** Report findings; do not edit files. Route fixes through the implementation flow, `parity-code-simplifier` (quality), or a follow-up.
|
|
77
|
+
- **If the diff is clean, approve it plainly** and say why — do not invent problems to look thorough.
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: parity-safety-net-rules
|
|
3
|
+
description: "View, set, and verify the custom guard rules enforced by Lisa's safety-net PreToolUse Bash hook (parity-safety-net.sh). The consolidated cross-agent equivalent of the upstream safety-net plugin's set-custom-rules + verify-custom-rules skills — manages a project-local list of extended-regex patterns that block destructive shell commands, on Codex, agy, Copilot, Cursor, and Claude."
|
|
4
|
+
allowed-tools: ["Read", "Edit", "Write", "Bash"]
|
|
5
|
+
synced-from: safety-net@cc-marketplace@0.9.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Parity Safety-Net Rules
|
|
9
|
+
|
|
10
|
+
Manage the **custom guard rules** that Lisa's safety-net hook enforces on every
|
|
11
|
+
Bash command. The hook (`hooks/parity-safety-net.sh`, registered as a
|
|
12
|
+
`PreToolUse` matcher on `Bash`) ships with built-in guards against catastrophic
|
|
13
|
+
commands; this skill lets a project **view**, **set**, and **verify** *additional*
|
|
14
|
+
project-specific rules on top of those built-ins.
|
|
15
|
+
|
|
16
|
+
> **Lisa-native reimplementation.** This consolidates the upstream
|
|
17
|
+
> `safety-net@cc-marketplace` plugin's two rule-management skills
|
|
18
|
+
> (`set-custom-rules` + `verify-custom-rules`) into one. It is reimplemented from
|
|
19
|
+
> scratch against Lisa conventions — it does **not** port or invoke upstream
|
|
20
|
+
> plugin code.
|
|
21
|
+
>
|
|
22
|
+
> **Drift tracking.** Pinned to `safety-net@cc-marketplace@0.9.0`.
|
|
23
|
+
> `scripts/plugin-parity-drift.mjs` compares this pin against the upstream
|
|
24
|
+
> version in the plugin cache and flags staleness. **Do not port or copy upstream
|
|
25
|
+
> plugin code.**
|
|
26
|
+
|
|
27
|
+
## How the rules work
|
|
28
|
+
|
|
29
|
+
- The hook always enforces its **built-in guards** (see below). These cannot be
|
|
30
|
+
disabled from the rules file — they are the floor.
|
|
31
|
+
- **Custom rules** live in a project-local file, one **POSIX extended regular
|
|
32
|
+
expression (ERE)** per line. Blank lines and lines beginning with `#` are
|
|
33
|
+
ignored. Matching is case-insensitive (`grep -Ei`).
|
|
34
|
+
- If *any* built-in guard or custom rule matches the proposed command, the hook
|
|
35
|
+
exits non-zero and the Bash call is **blocked**, with the reason shown to the
|
|
36
|
+
agent.
|
|
37
|
+
|
|
38
|
+
### Rules file location
|
|
39
|
+
|
|
40
|
+
Resolved in this order:
|
|
41
|
+
|
|
42
|
+
1. `$SAFETY_NET_RULES_FILE` (explicit override), else
|
|
43
|
+
2. `${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt`
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
RULES_FILE="${SAFETY_NET_RULES_FILE:-${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt}"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Built-in guards (always on)
|
|
50
|
+
|
|
51
|
+
1. `rm -rf` of a filesystem root, `$HOME`/`~`, or a top-level wildcard.
|
|
52
|
+
2. Force-pushing a protected branch (`main`/`master`/`production`/`release`).
|
|
53
|
+
`--force-with-lease` is intentionally allowed.
|
|
54
|
+
3. `git reset --hard` while the working tree is **dirty** (would discard work).
|
|
55
|
+
4. Destructive SQL — `DROP DATABASE/SCHEMA/TABLE`, `TRUNCATE TABLE`.
|
|
56
|
+
|
|
57
|
+
## View the current rules
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
RULES_FILE="${SAFETY_NET_RULES_FILE:-${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt}"
|
|
61
|
+
if [ -f "$RULES_FILE" ]; then
|
|
62
|
+
echo "Custom safety-net rules ($RULES_FILE):"
|
|
63
|
+
grep -vE '^[[:space:]]*(#|$)' "$RULES_FILE" || echo "(no active rules)"
|
|
64
|
+
else
|
|
65
|
+
echo "No custom rules file yet ($RULES_FILE). Only built-in guards are active."
|
|
66
|
+
fi
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`Read` the file to show comments and structure as well.
|
|
70
|
+
|
|
71
|
+
## Set (add or edit) a rule
|
|
72
|
+
|
|
73
|
+
A rule is an ERE matched against the full command string. Keep rules **specific**
|
|
74
|
+
to avoid blocking legitimate work — anchor on the dangerous verb and its target.
|
|
75
|
+
|
|
76
|
+
1. Ensure the file exists, then **append** a commented rule (use `Edit`/`Write`,
|
|
77
|
+
or append from the shell):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
RULES_FILE="${SAFETY_NET_RULES_FILE:-${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt}"
|
|
81
|
+
mkdir -p "$(dirname "$RULES_FILE")"
|
|
82
|
+
{
|
|
83
|
+
echo "# Block deleting a Kubernetes namespace"
|
|
84
|
+
echo 'kubectl[[:space:]]+delete[[:space:]]+namespace'
|
|
85
|
+
} >> "$RULES_FILE"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
2. **Always verify** the new rule (next section) before considering it set —
|
|
89
|
+
confirm it blocks what it should and allows what it shouldn't.
|
|
90
|
+
|
|
91
|
+
Editing/removing: open the file with `Edit` and change or delete the line.
|
|
92
|
+
Removing a rule never affects the built-in guards.
|
|
93
|
+
|
|
94
|
+
## Verify the rules
|
|
95
|
+
|
|
96
|
+
Two checks — both should pass before you trust a rule.
|
|
97
|
+
|
|
98
|
+
### 1. The ERE is valid
|
|
99
|
+
|
|
100
|
+
An invalid regex would make the hook error on every command. Validate it:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
printf '%s' "$RULE" | grep -Eq -- "$RULE" 2>/dev/null && echo "valid ERE" \
|
|
104
|
+
|| echo "INVALID ERE — fix before saving"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 2. The rule behaves as intended
|
|
108
|
+
|
|
109
|
+
Drive the **actual hook** with a fake `PreToolUse` payload and assert the exit
|
|
110
|
+
code (non-zero = blocked, 0 = allowed). Build the JSON with `jq` so the test
|
|
111
|
+
command line itself never contains the dangerous literal:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
HOOK="${CLAUDE_PLUGIN_ROOT}/hooks/parity-safety-net.sh"
|
|
115
|
+
|
|
116
|
+
check() { # check <expect: block|allow> <command>
|
|
117
|
+
jq -nc --arg c "$2" '{tool_name:"Bash",tool_input:{command:$c}}' \
|
|
118
|
+
| bash "$HOOK" >/dev/null 2>&1
|
|
119
|
+
local code=$?
|
|
120
|
+
local got=allow; [ "$code" -ne 0 ] && got=block
|
|
121
|
+
printf '%-5s want=%-5s got=%-5s %s\n' \
|
|
122
|
+
"$([ "$got" = "$1" ] && echo OK || echo FAIL)" "$1" "$got" "$2"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
# Should block (matches the new rule):
|
|
126
|
+
check block "kubectl delete namespace prod"
|
|
127
|
+
# Should allow (must not over-match):
|
|
128
|
+
check allow "kubectl get pods"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Report a table of cases with want/got/verdict. If any case disagrees, tighten the
|
|
132
|
+
ERE and re-verify.
|
|
133
|
+
|
|
134
|
+
## Rules
|
|
135
|
+
|
|
136
|
+
- **Built-in guards are the floor** — custom rules only *add* blocks; they cannot
|
|
137
|
+
weaken the built-ins.
|
|
138
|
+
- **Prefer specific over broad** — a rule that blocks too much trains users to
|
|
139
|
+
bypass the safety net. Anchor on verb + target.
|
|
140
|
+
- **Verify every rule against the real hook** before saving — never ship an
|
|
141
|
+
unverified or syntactically invalid ERE.
|
|
142
|
+
- **Never weaken the net to unblock yourself.** If a built-in guard fires on a
|
|
143
|
+
command that is genuinely safe, run it manually outside the agent after the
|
|
144
|
+
user confirms — do not edit the hook to remove the guard.
|