@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
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: parity-skill-creator
|
|
3
|
+
description: "Author a new Lisa skill end-to-end — scaffold the SKILL.md frontmatter (name/description/allowed-tools), write the pass-through command, follow hyphen naming, place files under plugins/src/base, and rebuild plugins. Lisa-native reimplementation of the upstream skill-creator plugin. NO drift pin: upstream publishes no semver, so it is not drift-trackable."
|
|
4
|
+
allowed-tools: ["Read", "Edit", "Write", "Bash"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill Creator
|
|
8
|
+
|
|
9
|
+
Author a new, working Lisa skill (and its pass-through command) from a one-line
|
|
10
|
+
description. This is the Lisa-native equivalent of the upstream
|
|
11
|
+
`skill-creator@claude-plugins-official` plugin, reimplemented from scratch
|
|
12
|
+
against Lisa's conventions so the same capability is available to the Codex,
|
|
13
|
+
agy, and Copilot runtimes (Cursor reads `.claude-plugin/` natively).
|
|
14
|
+
|
|
15
|
+
## Not drift-trackable
|
|
16
|
+
|
|
17
|
+
This skill intentionally carries **no `synced-from` pin**. The upstream
|
|
18
|
+
`skill-creator` plugin publishes **no semver** (its cache version resolves to
|
|
19
|
+
`unknown`), so a `@unknown` pin would be unparseable and meaningless to
|
|
20
|
+
`scripts/plugin-parity-drift.mjs`. **Drift is tracked manually** — re-review the
|
|
21
|
+
upstream plugin by hand whenever the curated plugin set is refreshed. Do **not**
|
|
22
|
+
add a `synced-from` line to skills generated by this skill unless they
|
|
23
|
+
reimplement a semver-versioned upstream plugin.
|
|
24
|
+
|
|
25
|
+
## When to use
|
|
26
|
+
|
|
27
|
+
- A reusable workflow, checklist, or piece of domain knowledge keeps recurring
|
|
28
|
+
and deserves a named, invokable skill.
|
|
29
|
+
- You are reimplementing an upstream third-party plugin command/skill for
|
|
30
|
+
cross-agent parity (see `analyze-plugin` / `implement-plugin-parity`).
|
|
31
|
+
- The user asks to "create a skill", "add a command", or "scaffold a skill".
|
|
32
|
+
|
|
33
|
+
If the knowledge is narrow or one-off, prefer a rule in `.claude/rules/` instead
|
|
34
|
+
— skills are for broad, repeatable capabilities. When unsure whether content
|
|
35
|
+
warrants a skill, run it past the `skill-evaluator` agent first.
|
|
36
|
+
|
|
37
|
+
## Where skills live
|
|
38
|
+
|
|
39
|
+
Lisa skills are **build output** for downstream projects. The source of truth is
|
|
40
|
+
`plugins/src/`, never the generated `plugins/lisa*` artifacts:
|
|
41
|
+
|
|
42
|
+
| Source directory | Builds artifact | Use for |
|
|
43
|
+
| --- | --- | --- |
|
|
44
|
+
| `plugins/src/base/` | `plugins/lisa` | Skills that ship to **every** stack |
|
|
45
|
+
| `plugins/src/<stack>/` | `plugins/lisa-<stack>` | Stack-specific (typescript, expo, nestjs, cdk, harper-fabric, rails) |
|
|
46
|
+
|
|
47
|
+
Lisa-repo-only skills (parity tooling, wiki ingestion, `lisa-*` meta-skills) live
|
|
48
|
+
at the **root** `.claude/skills/` and `.claude/commands/`, NOT under
|
|
49
|
+
`plugins/src` — they are not relevant to downstream projects. Decide placement
|
|
50
|
+
first:
|
|
51
|
+
|
|
52
|
+
- Ships to downstream projects → `plugins/src/base/skills/<name>/SKILL.md`
|
|
53
|
+
- Only meaningful inside the Lisa monorepo → `.claude/skills/<name>/SKILL.md`
|
|
54
|
+
|
|
55
|
+
## Naming
|
|
56
|
+
|
|
57
|
+
- Use **hyphen-separated** names: `git-commit`, `tracker-write`,
|
|
58
|
+
`parity-sentry-seer`. No spaces, no camelCase, no underscores.
|
|
59
|
+
- The directory name, the frontmatter `name`, and the command filename must all
|
|
60
|
+
match exactly.
|
|
61
|
+
- Commands map to colon-separated UI names via directory nesting:
|
|
62
|
+
`commands/git/commit.md` → `/lisa:git:commit`; a flat
|
|
63
|
+
`commands/plan.md` → `/lisa:plan`.
|
|
64
|
+
|
|
65
|
+
## SKILL.md frontmatter
|
|
66
|
+
|
|
67
|
+
Skills support **only** these frontmatter keys (they do **not** support
|
|
68
|
+
`argument-hint` or `$ARGUMENTS` substitution — those belong on the command):
|
|
69
|
+
|
|
70
|
+
```yaml
|
|
71
|
+
---
|
|
72
|
+
name: my-skill # required — matches the directory name
|
|
73
|
+
description: "One or two sentences." # required — when to use + what it does
|
|
74
|
+
allowed-tools: ["Read", "Edit", "Write", "Bash"] # optional — least privilege
|
|
75
|
+
synced-from: <plugin>@<marketplace>@<version> # ONLY for semver upstream reimplementations
|
|
76
|
+
---
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- **`name`** — the hyphen identifier, byte-identical to the directory.
|
|
80
|
+
- **`description`** — write it so the model knows *when* to reach for the skill,
|
|
81
|
+
not just what it does. Lead with the trigger. This is the single most
|
|
82
|
+
important field for discoverability.
|
|
83
|
+
- **`allowed-tools`** — grant the minimum set. A read-only review skill needs no
|
|
84
|
+
`Write`/`Edit`. Omit the key entirely to inherit the caller's tools.
|
|
85
|
+
- **`synced-from`** — add **only** when the skill reimplements an upstream plugin
|
|
86
|
+
that publishes a real semver. Grammar: `name@marketplace@version`
|
|
87
|
+
(e.g. `sentry@claude-plugins-official@1.0.0`). Omit for upstreams with no
|
|
88
|
+
semver (note that in the body instead, as this skill does).
|
|
89
|
+
|
|
90
|
+
## The command pass-through pattern
|
|
91
|
+
|
|
92
|
+
Every skill should have a thin command that is the user-facing entry point.
|
|
93
|
+
Commands support `description`, `argument-hint`, and `$ARGUMENTS`; they delegate
|
|
94
|
+
straight to the skill:
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
---
|
|
98
|
+
description: "Same human-facing summary as the skill, phrased for the picker."
|
|
99
|
+
argument-hint: "<what the user should type after the command>"
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
Use the /lisa:my-skill skill to <do the thing>. $ARGUMENTS
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
The command carries the `argument-hint` and forwards `$ARGUMENTS`; the SKILL.md
|
|
106
|
+
carries the actual logic. Keep the two descriptions consistent.
|
|
107
|
+
|
|
108
|
+
## Scaffolding walkthrough
|
|
109
|
+
|
|
110
|
+
1. **Decide placement** — downstream (`plugins/src/base`) vs. Lisa-only
|
|
111
|
+
(`.claude`). For base, both a skill and a command directory entry are needed.
|
|
112
|
+
2. **Pick the name** — hyphenated, unique. Check it does not collide:
|
|
113
|
+
`ls plugins/src/base/skills/` and `ls plugins/src/base/commands/`.
|
|
114
|
+
3. **Create the skill** at
|
|
115
|
+
`plugins/src/base/skills/<name>/SKILL.md` with the frontmatter above and a
|
|
116
|
+
body that follows house style — see `plugins/src/base/skills/quality-review/SKILL.md`
|
|
117
|
+
for the canonical shape (title, "When to use", numbered checklist/steps,
|
|
118
|
+
explicit "Rules"/"Output" sections). Write real, actionable guidance, not
|
|
119
|
+
TODOs.
|
|
120
|
+
4. **Create the command** at `plugins/src/base/commands/<name>.md` (or a nested
|
|
121
|
+
`commands/<namespace>/<name>.md` for a colon-namespaced command) using the
|
|
122
|
+
pass-through template.
|
|
123
|
+
5. **Rebuild the artifacts** so the generated plugins match source:
|
|
124
|
+
```bash
|
|
125
|
+
bun run build:plugins
|
|
126
|
+
```
|
|
127
|
+
Then commit **both** `plugins/src/...` and the regenerated `plugins/lisa*`.
|
|
128
|
+
The `🧩 Plugins Sync` CI check (and `bun run check:plugins` locally) fails if
|
|
129
|
+
artifacts drift from source — never hand-edit `plugins/lisa*`.
|
|
130
|
+
6. **Verify discoverability** — confirm the skill appears in the skill list and
|
|
131
|
+
the command resolves to `/lisa:<name>`.
|
|
132
|
+
|
|
133
|
+
## Body house style
|
|
134
|
+
|
|
135
|
+
- Open with an `#` H1 title in Title Case.
|
|
136
|
+
- Add a `## When to use` section that names the triggers.
|
|
137
|
+
- Use numbered steps for procedures, checklists for review-style skills.
|
|
138
|
+
- End with an explicit `## Rules` (hard constraints) and/or `## Output` section.
|
|
139
|
+
- Write in plain, imperative English. Prefer concrete examples over abstraction.
|
|
140
|
+
- Reference sibling skills by their hyphen name (e.g. "delegate to `git-commit`").
|
|
141
|
+
|
|
142
|
+
## Rules
|
|
143
|
+
|
|
144
|
+
- Never edit `plugins/lisa*` directly — edit `plugins/src/` and rebuild.
|
|
145
|
+
- Skill frontmatter must not contain `argument-hint` or `$ARGUMENTS`.
|
|
146
|
+
- The directory name, `name` field, and command filename must match exactly.
|
|
147
|
+
- Add `synced-from` **only** for semver-versioned upstream reimplementations.
|
|
148
|
+
- Do not include `/coding-philosophy` in task `skills` metadata — it auto-loads.
|
|
149
|
+
- One skill, one responsibility. If a skill grows two jobs, split it.
|
|
@@ -30,7 +30,7 @@ close-out** roles and moves work *unstuck* or *fully closed*:
|
|
|
30
30
|
out) **and** the *intermediate-env* case (all children shipped to an env like `On Stg`, but the
|
|
31
31
|
parent never advanced — including a parent left stranded in a status it should never carry).
|
|
32
32
|
- **Stale-`ready` container** — a parent/container (open child work, or a childless
|
|
33
|
-
Epic
|
|
33
|
+
**Epic**) wrongly carrying the build-ready role. This is a leaf-only-invariant violation
|
|
34
34
|
the build-intake claim gate deliberately leaves for a human; repair-intake reconciles it by
|
|
35
35
|
rolling the parent up from its children (with an audit note), so a container never sits in `ready`
|
|
36
36
|
indefinitely.
|
|
@@ -364,7 +364,7 @@ native-open / active / unresolved:
|
|
|
364
364
|
|
|
365
365
|
### Build parent rollup reconciliation (intermediate-env or terminal close-out)
|
|
366
366
|
|
|
367
|
-
For each parent/container item (Epic,
|
|
367
|
+
For each parent/container item (an Epic, a Linear Project, or any item — of any type — with open child work),
|
|
368
368
|
reconcile its lifecycle state with the roll-up of its children — **including the intermediate-env
|
|
369
369
|
case**, not only fully-terminal close-out. This is the recovery-side complement to the forward
|
|
370
370
|
rollup the `*-sync --rollup` skills perform; it catches a parent that was never rolled up (or was
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tracker-build-intake
|
|
3
|
-
description: "Vendor-neutral wrapper for the build-queue scanner. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-build-intake (JQL/project-key queue), lisa:github-build-intake (GitHub repo queue keyed off the `status:ready` label), or lisa:linear-build-intake (Linear team queue keyed off the `status:ready` label). Every vendor scanner processes at most one eligible item per cycle and enforces the claim-time arm of the `leaf-only-lifecycle` rule — dispatch leaf work units only; move or safe-block a container with open child work (or a childless Epic
|
|
3
|
+
description: "Vendor-neutral wrapper for the build-queue scanner. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-build-intake (JQL/project-key queue), lisa:github-build-intake (GitHub repo queue keyed off the `status:ready` label), or lisa:linear-build-intake (Linear team queue keyed off the `status:ready` label). Every vendor scanner processes at most one eligible item per cycle and enforces the claim-time arm of the `leaf-only-lifecycle` rule — dispatch leaf work units only; move or safe-block a container with open child work (or a childless Epic) that carries a stale build-ready role according to the vendor's lifecycle semantics. Counterpart to lisa:intake's PRD-side dispatchers."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -26,8 +26,8 @@ The vendor scanners also own the terminal native-closure step from `leaf-only-li
|
|
|
26
26
|
|
|
27
27
|
This shim is dispatch only — it does not reclassify or re-gate items — but the contract it forwards is part of the build-intake API, so it is documented here once and the three vendor scanners implement it identically. Per the vendor-neutral `leaf-only-lifecycle` rule, **build intake claims only independently implementable leaf work units**:
|
|
28
28
|
|
|
29
|
-
- A **leaf work unit** (Bug, Task, Sub-task, Improvement with no open child work) is claimed and built.
|
|
30
|
-
- A **container** — anything with open child work, or a childless Epic
|
|
29
|
+
- A **leaf work unit** (Bug, Task, Sub-task, Improvement, or a childless Story/Spike — anything with no open child work except an Epic) is claimed and built.
|
|
30
|
+
- A **container** — anything with open child work, or a childless Epic — that still carries a stale build-ready role is **never dispatched**. The GitHub scanner moves it out of the pickup queue by replacing `status:ready` with `status:in-progress` and posting an idempotent lifecycle-repair comment; other vendor scanners skip or safe-block according to their native lifecycle semantics.
|
|
31
31
|
|
|
32
32
|
This is the claim-time arm of the rule. Its siblings are the write-time labeling (`lisa:tracker-write` → the vendor `*-write-*` skills apply build-ready to leaves only) and the validate-time S15 gate (`lisa:tracker-validate` → the vendor `*-validate-*` skills FAIL a build-ready container). All three arms cite `leaf-only-lifecycle` so no vendor drifts. Each vendor scanner implements the gate against its own hierarchy:
|
|
33
33
|
|
|
@@ -59,6 +59,6 @@ Intermediate env states are not native closure. A vendor scanner that resolves `
|
|
|
59
59
|
|
|
60
60
|
- Single cycle per invocation — the vendor skill processes at most one eligible `Ready` item and exits. Scheduler repetition works the rest of the queue.
|
|
61
61
|
- The vendor skills run their own pre-flight checks (JIRA workflow transitions for the JIRA path; label namespace adoption for the GitHub and Linear paths) before processing items. Never bypass.
|
|
62
|
-
- **Leaf-only dispatch, every vendor.** Per the `leaf-only-lifecycle` rule, each vendor scanner dispatches leaf work units only and moves or safe-blocks a container (open child work, or a childless Epic
|
|
62
|
+
- **Leaf-only dispatch, every vendor.** Per the `leaf-only-lifecycle` rule, each vendor scanner dispatches leaf work units only and moves or safe-blocks a container (open child work, or a childless Epic) carrying a stale build-ready role according to its lifecycle semantics. This shim does not re-implement the gate — it relies on the vendor scanner's Phase 3a — but the contract is uniform across `jira`, `github`, and `linear` so behavior never drifts by tracker.
|
|
63
63
|
- **Terminal native closure, every capable vendor.** Per the same rule, each vendor scanner finalizes native open/closed state only at the true terminal `done` value. This shim never performs native closure itself, but callers can rely on the dispatched vendor scanner to apply the contract.
|
|
64
64
|
- Never run two intake cycles concurrently against overlapping queues — the scheduling layer is responsible for serialization.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.128.0",
|
|
4
4
|
"description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
{
|
|
14
14
|
"type": "command",
|
|
15
15
|
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/block-no-verify.sh"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"type": "command",
|
|
19
|
+
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/parity-safety-net.sh"
|
|
16
20
|
}
|
|
17
21
|
]
|
|
18
22
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Lisa-native code review of the current git diff — correctness bugs, security issues, and obvious defects, reported as severity-ranked findings with file:line references. Vendor-neutral cross-agent equivalent of the upstream code-review command."
|
|
3
|
+
argument-hint: "[optional: path or scope hint]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-code-review skill to review the current branch and working-tree diff for correctness bugs, security issues, and obvious defects, and report findings ranked by severity with file:line references. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Behavior-preserving simplification of recently-changed code — dedup, reuse, readability, and dead-code removal, quality only (never a bug hunt). Vendor-neutral cross-agent equivalent of the upstream code-simplifier agent."
|
|
3
|
+
argument-hint: "[optional: path or scope hint]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-code-simplifier skill to simplify the recently-changed code — removing duplication and dead code, reusing existing utilities, and improving readability — without altering behavior, then verify tests still pass. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Thorough PR-style review of the full diff — bugs, security, performance, and maintainability — with concrete fixes and a structured summary. An independent Lisa-native review (does NOT call CodeRabbit's service); vendor-neutral cross-agent equivalent of the upstream coderabbit plugin."
|
|
3
|
+
argument-hint: "[optional: PR number, path, or scope hint]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-coderabbit skill to run a thorough PR-style review of the full diff — flagging bugs, security, performance, and maintainability issues with concrete suggested fixes — and produce a structured summary with a verdict. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "View, set, and verify the custom guard rules enforced by Lisa's safety-net PreToolUse Bash hook — the cross-agent equivalent of the upstream safety-net plugin's set/verify-custom-rules skills."
|
|
3
|
+
argument-hint: "[view | set <regex> | verify]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-safety-net-rules skill to view, set, or verify the project-local custom guard rules enforced by Lisa's safety-net Bash hook (`parity-safety-net.sh`). $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Install and configure the Sentry SDK for a project — detect the framework, add the right @sentry/<framework> package, init the client, wire the DSN via env, enable error + performance monitoring, and set up source maps. One consolidated skill covering react, nextjs, node, nestjs, python, react-native, and more."
|
|
3
|
+
argument-hint: "[framework override, e.g. nextjs | node | python] (auto-detected if omitted)"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-sentry-sdk-setup skill to detect the framework and install + configure the correct Sentry SDK with error and performance monitoring and source maps. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "AI debugging — given an error, stack trace, or failing test, analyze it, form ranked hypotheses, locate the root cause in the codebase with file:line evidence, and propose a minimal fix. Lisa-native reimplementation of Sentry's seer workflow."
|
|
3
|
+
argument-hint: "<error message | stack trace | failing test | Sentry issue URL>"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-sentry-seer skill to root-cause the failure and propose an evidence-backed fix. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Author a new Lisa skill end-to-end — scaffold the SKILL.md frontmatter, write the pass-through command, follow hyphen naming and placement under plugins/src, and rebuild plugins. Lisa-native equivalent of the upstream skill-creator plugin."
|
|
3
|
+
argument-hint: "<skill-name and a one-line description of what it should do>"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-skill-creator skill to scaffold a new Lisa skill and its pass-through command, following frontmatter, naming, placement, and build conventions. $ARGUMENTS
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PreToolUse hook for Bash: a safety net that blocks destructive shell commands
|
|
3
|
+
# before they run. Lisa-native reimplementation of the upstream
|
|
4
|
+
# `safety-net@cc-marketplace` plugin's PreToolUse Bash-guard (parity work, issue
|
|
5
|
+
# #1059). It does NOT port upstream code — it re-expresses the behavior in Lisa's
|
|
6
|
+
# hook conventions, modeled on block-no-verify.sh.
|
|
7
|
+
#
|
|
8
|
+
# It reads the hook stdin JSON, inspects the proposed Bash command, and EXITS
|
|
9
|
+
# NON-ZERO (2) to BLOCK when a known-destructive pattern matches:
|
|
10
|
+
# - `rm -rf /` (recursive forced delete of a root / home / wildcard path)
|
|
11
|
+
# - force-pushing a protected branch (main/master/production/release)
|
|
12
|
+
# - `git reset --hard` while the working tree is dirty (would discard work)
|
|
13
|
+
# - dropping or truncating a database/schema/table
|
|
14
|
+
# Otherwise it exits 0 and the command proceeds.
|
|
15
|
+
#
|
|
16
|
+
# Operators extend the built-in rules with a project-local rule file — one
|
|
17
|
+
# extended-regex (ERE) per line, blank lines and `#` comments ignored — managed
|
|
18
|
+
# by the parity-safety-net-rules skill. Default location (overridable via
|
|
19
|
+
# SAFETY_NET_RULES_FILE):
|
|
20
|
+
# ${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt
|
|
21
|
+
set -euo pipefail
|
|
22
|
+
|
|
23
|
+
input="$(cat)"
|
|
24
|
+
|
|
25
|
+
tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty')"
|
|
26
|
+
if [ "$tool_name" != "Bash" ]; then
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
command_str="$(printf '%s' "$input" | jq -r '.tool_input.command // empty')"
|
|
31
|
+
if [ -z "$command_str" ]; then
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# block() prints the reason to stderr (surfaced to the model) and exits 2 so the
|
|
36
|
+
# Bash tool call is denied. $1 = human-readable reason for the block.
|
|
37
|
+
block() {
|
|
38
|
+
cat >&2 <<EOF
|
|
39
|
+
Blocked by safety-net: $1
|
|
40
|
+
|
|
41
|
+
This command matched a destructive-operation guard. If it is genuinely safe and
|
|
42
|
+
intentional, ask the user to confirm, then run it manually outside the agent, or
|
|
43
|
+
narrow the command so it no longer matches the guard.
|
|
44
|
+
EOF
|
|
45
|
+
exit 2
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# 1. Recursive forced delete (`rm -rf`) of a filesystem root, home, or top-level
|
|
49
|
+
# wildcard. Two gates ANDed: the command must invoke `rm` with BOTH a
|
|
50
|
+
# recursive and a force flag, AND name a catastrophic target. Splitting the
|
|
51
|
+
# flag check from the target check keeps each regex legible and testable.
|
|
52
|
+
if printf '%s' "$command_str" \
|
|
53
|
+
| grep -Eiq '(^|[^[:alnum:]_./-])rm([[:space:]]+-[[:alnum:]-]+)*[[:space:]]+(-[[:alnum:]]*r[[:alnum:]]*f|-[[:alnum:]]*f[[:alnum:]]*r)([[:space:]]|$)' \
|
|
54
|
+
|| printf '%s' "$command_str" \
|
|
55
|
+
| grep -Eiq '(^|[^[:alnum:]_./-])rm[[:space:]].*(-r\b.*[[:space:]]-f\b|-f\b.*[[:space:]]-r\b|--recursive\b.*--force\b|--force\b.*--recursive\b)'; then
|
|
56
|
+
if printf '%s' "$command_str" \
|
|
57
|
+
| grep -Eq '([[:space:]]|=)(/|/\*|/\.\*?|~|~/\*?|\$HOME\b|\$\{HOME\}|\*)([[:space:]]|/?\*?$)'; then
|
|
58
|
+
block "recursive forced delete of a root, home, or wildcard path (rm -rf)"
|
|
59
|
+
fi
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# 2. Force-pushing a protected branch. `--force-with-lease` is the safe,
|
|
63
|
+
# non-clobbering alternative and is intentionally NOT blocked.
|
|
64
|
+
if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_-])git[[:space:]]+push\b'; then
|
|
65
|
+
if printf '%s' "$command_str" | grep -Eiq '(--force([[:space:]]|=|$)|[[:space:]]-f([[:space:]]|$))' \
|
|
66
|
+
&& ! printf '%s' "$command_str" | grep -Eiq -- '--force-with-lease'; then
|
|
67
|
+
if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_/-])(main|master|production|prod|release)([^[:alnum:]_/-]|$)'; then
|
|
68
|
+
block "force-pushing a protected branch (use --force-with-lease, or push a feature branch)"
|
|
69
|
+
fi
|
|
70
|
+
fi
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# 3. `git reset --hard` while the working tree has uncommitted changes — this
|
|
74
|
+
# silently discards them. Only blocks when the tree is actually dirty, so a
|
|
75
|
+
# clean-tree reset (a legitimate workflow) still passes.
|
|
76
|
+
if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_-])git[[:space:]]+reset\b.*--hard\b'; then
|
|
77
|
+
if git rev-parse --is-inside-work-tree >/dev/null 2>&1 \
|
|
78
|
+
&& [ -n "$(git status --porcelain 2>/dev/null)" ]; then
|
|
79
|
+
block "git reset --hard on a dirty working tree would discard uncommitted changes (stash or commit first)"
|
|
80
|
+
fi
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# 4. Dropping or truncating a database / schema / table.
|
|
84
|
+
if printf '%s' "$command_str" \
|
|
85
|
+
| grep -Eiq '\b(drop[[:space:]]+(database|schema|table)|truncate[[:space:]]+(table[[:space:]]+)?[[:alnum:]_."`]+)\b'; then
|
|
86
|
+
block "destructive SQL (DROP/TRUNCATE) detected"
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# 5. Project-local custom rules. Each non-comment line is an ERE; a match blocks.
|
|
90
|
+
rules_file="${SAFETY_NET_RULES_FILE:-${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt}"
|
|
91
|
+
if [ -f "$rules_file" ]; then
|
|
92
|
+
while IFS= read -r rule || [ -n "$rule" ]; do
|
|
93
|
+
case "$rule" in
|
|
94
|
+
'' | '#'*) continue ;;
|
|
95
|
+
esac
|
|
96
|
+
if printf '%s' "$command_str" | grep -Eiq -- "$rule"; then
|
|
97
|
+
block "matched a project custom safety rule (${rules_file##*/}): $rule"
|
|
98
|
+
fi
|
|
99
|
+
done <"$rules_file"
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
exit 0
|
|
@@ -43,7 +43,7 @@ Do not begin work if there are blockers, ambiguities, access requirements, or un
|
|
|
43
43
|
- Read **all** comments on a ticket, not just the description.
|
|
44
44
|
- When clarifying, comment via ADF and @mention the Reporter.
|
|
45
45
|
- Establish issue link relationships (`blocks`, `is blocked by`, `relates to`) — search git history AND Jira before declaring "no related work."
|
|
46
|
-
- Single-repo invariant: Bug/Task/Sub-task MUST be single-repo. Epic
|
|
46
|
+
- Single-repo invariant: Bug/Task/Sub-task/Improvement (and any childless Story/Spike — a leaf per `leaf-only-lifecycle`) MUST be single-repo. An Epic, or any Story/Spike that still holds child work, MAY span repos. Cross-repo leaves are split per the `repo-scope-split` rule.
|
|
47
47
|
- Pre-flight gate: BLOCK + reassign-to-Reporter if a ticket is missing target backend env, sign-in credentials, Gherkin acceptance criteria, epic parent (non-bug/non-epic), or relationship discovery evidence.
|
|
48
48
|
|
|
49
49
|
## Pace
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Build-ready means a directly implementable leaf work unit.** Containers never carry build-ready.
|
|
4
4
|
|
|
5
|
-
A leaf is structurally defined: **no
|
|
5
|
+
A leaf is structurally defined: **no open children** AND not an Epic — the by-design leaf types (Bug, Task, Sub-task, Improvement) plus a childless Story or Spike. A container is an **Epic**, or any item of any type that has acquired open child work.
|
|
6
6
|
|
|
7
7
|
## Invariant
|
|
8
8
|
|
|
@@ -12,10 +12,10 @@ A leaf is structurally defined: **no child work** AND a leaf-typed item (Bug, Ta
|
|
|
12
12
|
|
|
13
13
|
## Childless-parent exception
|
|
14
14
|
|
|
15
|
-
A
|
|
15
|
+
A childless item is structurally a leaf — and may be build-ready **unless its type is Epic**:
|
|
16
16
|
|
|
17
|
-
- **Task or
|
|
18
|
-
- **Epic
|
|
17
|
+
- **Task, Bug, Story, Spike, or Improvement with no children** → leaf → may be build-ready. A Story ships directly as one increment and a Spike *is* the investigation unit; neither needs sub-items to be implementable, so a childless one must not be stranded.
|
|
18
|
+
- **Epic with no children** → still NOT build-ready. An Epic is a pure rollup container by design — its body is a high-level summary, never directly implementable — so a childless build-ready Epic is an incomplete decomposition or a mis-applied role. Repair: decompose into leaves, or reclassify to a leaf type.
|
|
19
19
|
|
|
20
20
|
## Parent state rollup (priority order, first match wins)
|
|
21
21
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Repo Scope & Work-Time Splitting (load-bearing)
|
|
2
2
|
|
|
3
|
-
**Leaf work units are single-repo.** A leaf is an individually implementable ticket with no children — types **Bug, Task, Sub-task, Improvement
|
|
3
|
+
**Leaf work units are single-repo.** A leaf is an individually implementable ticket with no open children — the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a childless **Story** or **Spike** (structurally a leaf per `leaf-only-lifecycle`). Each names exactly one repo. An **Epic**, and any **Story/Spike that still holds child work**, are coordination containers and may span repos.
|
|
4
4
|
|
|
5
5
|
Enforced at four points: gate **S10** (`*-validate-*`, write time), `task-decomposition` step 1.5 (PRD-decomposition time), claim-time repo scoping (`*-build-intake`), and the work-time split procedure (an existing ticket about to be implemented).
|
|
6
6
|
|
|
@@ -647,7 +647,7 @@ A ticketing system can oversee **multiple repos** — e.g. one JIRA project (or
|
|
|
647
647
|
|
|
648
648
|
### The `repo:<name>` label (the repo marker)
|
|
649
649
|
|
|
650
|
-
A work item's target repo is recorded as a **label** `repo:<name>`, where `<name>` is the repo's short name (e.g. `repo:frontend`). The convention is uniform across trackers (JIRA / GitHub / Linear), consistent with the other namespaced labels (`status:`, `type:`, `component:`). On JIRA a **component** equal to the repo name is accepted as an alias (matches the legacy `component = "frontend"` JQL pattern). A leaf work unit carries **exactly one** `repo:<name>` (leaves are single-repo per `repo-scope-split`); a container (Epic
|
|
650
|
+
A work item's target repo is recorded as a **label** `repo:<name>`, where `<name>` is the repo's short name (e.g. `repo:frontend`). The convention is uniform across trackers (JIRA / GitHub / Linear), consistent with the other namespaced labels (`status:`, `type:`, `component:`). On JIRA a **component** equal to the repo name is accepted as an alias (matches the legacy `component = "frontend"` JQL pattern). A leaf work unit carries **exactly one** `repo:<name>` (leaves are single-repo per `repo-scope-split`); a container (an Epic, or any item with open child work) may carry several or none.
|
|
651
651
|
|
|
652
652
|
The label is not required to exist up front: build-intake **determines** the target repo from the ticket's content + code surfaces when the label is absent and **stamps** `repo:<name>` so later cycles filter cheaply (see `repo-scope-split` "claim-time repo scoping").
|
|
653
653
|
|
|
@@ -16,16 +16,16 @@ The fix is not vendor-specific. It belongs here, in a cross-vendor rule, and eve
|
|
|
16
16
|
|
|
17
17
|
## Container vs. leaf taxonomy
|
|
18
18
|
|
|
19
|
-
A **leaf work unit** is an individually implementable item with **no child work
|
|
19
|
+
A **leaf work unit** is an individually implementable item with **no open child work**. Structurally, that is *any work item with no open children except an Epic*: the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a **childless Story or Spike** (a Story is a directly shippable increment and a Spike is itself the investigation unit — neither needs sub-items to be implementable). These are what an agent claims and implements. A leaf work unit is also single-repo (the `repo-scope-split` rule).
|
|
20
20
|
|
|
21
21
|
A **container** organizes other work and is never directly implemented:
|
|
22
22
|
|
|
23
23
|
| Class | Examples by type | May carry build-ready? |
|
|
24
24
|
|---|---|---|
|
|
25
|
-
| **Leaf work unit** | Bug, Task, Sub-task, Improvement — with no children | **Yes** |
|
|
26
|
-
| **Container** | Epic
|
|
25
|
+
| **Leaf work unit** | Bug, Task, Sub-task, Improvement, or a childless Story / Spike — anything with no open children **except an Epic** | **Yes** |
|
|
26
|
+
| **Container** | An **Epic**, or *any* item (of any type) that has open child work | **No** — state rolls up from children |
|
|
27
27
|
|
|
28
|
-
The classification is **structural, not nominal**: an item is a container if it has child work, regardless of its declared type. A "Task" that has acquired sub-tasks is a container for rollup purposes. The
|
|
28
|
+
The classification is **structural, not nominal**: an item is a container if it has open child work, regardless of its declared type. A "Task" that has acquired sub-tasks is a container for rollup purposes. The single nominal exception is the **Epic**, which is a pure rollup container by design and is treated as a container even when childless; for every other type the presence of children is decisive. See the childless-parent exception below for the converse case.
|
|
29
29
|
|
|
30
30
|
### How each vendor encodes hierarchy
|
|
31
31
|
|
|
@@ -49,12 +49,12 @@ The permission boundary is the maintainer-applied build-ready role, not authorsh
|
|
|
49
49
|
|
|
50
50
|
## Childless-parent exception
|
|
51
51
|
|
|
52
|
-
A
|
|
52
|
+
A childless item is, structurally, a leaf — and may be build-ready **unless its issue type is Epic**.
|
|
53
53
|
|
|
54
|
-
- A **Task
|
|
55
|
-
- An **Epic
|
|
54
|
+
- A **Task, Bug, Story, Spike,** or **Improvement** with no children → leaf → may be build-ready. Many real tickets are flat Tasks with no sub-tasks; just as common, a **Story** is implemented directly as a single shippable increment and a **Spike** *is* the investigation work unit. None of these need to be decomposed to be claimable, and this rule must not strand them. (A childless Story/Spike promoted to a leaf this way is single-repo like any other leaf — see `repo-scope-split`.)
|
|
55
|
+
- An **Epic** with no children → still **not** build-ready. An Epic is a pure rollup container by design: its body is a high-level summary, never a directly implementable unit, so a childless Epic carrying the build-ready role is an incomplete decomposition or a mis-applied role — not work. The correct repair is to decompose it (add leaf children) or reclassify it to a leaf type — not to claim it.
|
|
56
56
|
|
|
57
|
-
So the exception is narrow: childlessness
|
|
57
|
+
So the exception is narrow only at the top: childlessness promotes every type **except Epic** to a build-ready leaf. A childless Epic is never directly implementable; everything else, when childless, is.
|
|
58
58
|
|
|
59
59
|
## Parent status rollup (the state machine)
|
|
60
60
|
|
|
@@ -112,7 +112,7 @@ This action is **terminal-only**:
|
|
|
112
112
|
Skills that enforce this invariant or perform rollup cite this rule by slug (the `leaf-only-lifecycle` rule) instead of restating it:
|
|
113
113
|
|
|
114
114
|
- **Decomposition / write** (`*-to-tracker`, `*-write-*`) — apply the `ready` role to leaves only; never to containers.
|
|
115
|
-
- **Validate** (`*-validate-*`) — FAIL a container carrying the build-ready role; FAIL a childless Epic
|
|
115
|
+
- **Validate** (`*-validate-*`) — FAIL a container carrying the build-ready role; FAIL a childless **Epic** marked build-ready (a childless Story/Spike is a valid leaf and passes).
|
|
116
116
|
- **Build intake** (`*-build-intake`, `tracker-build-intake`) — dispatch leaves only; move or safe-block containers with stale build-ready roles according to vendor lifecycle semantics.
|
|
117
117
|
- **Rollup** — derive parent state from children per the state machine above. `repair-intake`
|
|
118
118
|
also uses this rule to close out parent/container rollups that were left open after every
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Repo Scope & Work-Time Splitting
|
|
2
2
|
|
|
3
|
-
Leaf work units are single-repo. A **leaf work unit** is an individually implementable ticket with no child tickets —
|
|
3
|
+
Leaf work units are single-repo. A **leaf work unit** is an individually implementable ticket with no open child tickets — the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a childless **Story** or **Spike** (a childless Story/Spike is structurally a leaf — see `leaf-only-lifecycle`). Each must name exactly one repository. An **Epic**, and any **Story or Spike that still holds child work**, are coordination containers and may span repos.
|
|
4
4
|
|
|
5
5
|
This invariant is enforced at four points: gate **S10** in the `*-validate-*` skills (write time), `task-decomposition` step 1.5 (PRD-decomposition time), **claim-time repo scoping** in the build-intake skills (when intake decides whether to claim a ready ticket for the current repo — see below), and the work-time split procedure below (when an agent picks up an existing ticket to implement it).
|
|
6
6
|
|
|
@@ -47,7 +47,7 @@ Resolve the current repo per the `config-resolution` "Repo scoping" section (con
|
|
|
47
47
|
|
|
48
48
|
**Cost.** Only **unlabeled** candidates need content determination; once stamped, wrong-repo candidates are skipped by label alone. Prefer candidates already labeled `repo:<current>` first (cheap claim), falling through to unlabeled candidates (determine + stamp) only when no pre-labeled current-repo leaf is ready.
|
|
49
49
|
|
|
50
|
-
A container (Epic
|
|
50
|
+
A container (an Epic, or any item with open child work) is handled by the leaf-only gate, not here — containers may span repos, may keep multiple `repo:<name>` labels for visibility, and are never claimed/built directly. Only a leaf work unit — including a now-childless Story/Spike that the leaf-only gate treats as a leaf — is split or skipped by repo scope.
|
|
51
51
|
|
|
52
52
|
## Vendor mechanics
|
|
53
53
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-build-intake
|
|
3
|
-
description: "GitHub counterpart to lisa:jira-build-intake. Scans a GitHub repository for issues carrying the configured `ready` build label, processes the first eligible issue, runs leaf work via lisa:github-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: "GitHub counterpart to lisa:jira-build-intake. Scans a GitHub repository for issues carrying the configured `ready` build label, processes the first eligible issue, runs leaf work via lisa:github-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 moved out of the ready pickup queue into the configured `claimed` label with a lifecycle-repair comment, never dispatched to lisa:github-agent. The `ready` label is the human-flipped signal that an issue is truly ready for direct development pickup — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
|
|
4
4
|
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -209,16 +209,16 @@ Classify and act (first match wins). `type:` is read from the issue's labels (`t
|
|
|
209
209
|
| Condition | Class | Action |
|
|
210
210
|
|---|---|---|
|
|
211
211
|
| `OPEN_CHILDREN > 0` (open child work, any type) | **Container** | **Move to `$CLAIMED` as lifecycle repair — do NOT dispatch** |
|
|
212
|
-
| no open children AND `type
|
|
213
|
-
| no open children AND `type
|
|
212
|
+
| no open children AND `type = Epic` | **Childless Epic (pure rollup container)** | **Move to `$CLAIMED` as lifecycle repair — do NOT dispatch** |
|
|
213
|
+
| no open children AND `type ≠ Epic` (Bug, Task, Sub-task, Improvement, Story, Spike, or no `type:` label) | **Leaf work unit** | **Proceed to 3b claim** |
|
|
214
214
|
|
|
215
|
-
The childless-parent exception
|
|
215
|
+
The childless-parent exception promotes every childless type **except Epic** to a dispatchable 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** is held back — an Epic is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, moved out of the ready pickup queue for repair/rollup and never dispatched.
|
|
216
216
|
|
|
217
217
|
**Lifecycle repair (default action for a flagged container).** Move the issue out of the pickup queue by removing `$READY` and adding `$CLAIMED`, post a single lifecycle-repair comment, and record the issue under "Repaired (container)" in the summary. Do NOT invoke `lisa:github-agent`. 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.
|
|
218
218
|
|
|
219
219
|
```bash
|
|
220
220
|
gh issue edit <number> --repo <org>/<repo> --remove-label "$READY" --add-label "$CLAIMED"
|
|
221
|
-
gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Lifecycle repair: this issue carried the build-ready role ($READY) but is a parent/container with open child work (or a childless Epic
|
|
221
|
+
gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Lifecycle repair: this issue carried the build-ready role ($READY) but is a parent/container with open child work (or a childless Epic). I moved it to $CLAIMED without invoking the build agent. For parent/container issues, $CLAIMED means rollup/build-lane progress through child/leaf work; direct implementation must happen on leaf issues. Build-ready is leaf-only per leaf-only-lifecycle — move $READY onto its leaf children, or decompose/reclassify a childless Epic."
|
|
222
222
|
```
|
|
223
223
|
|
|
224
224
|
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.
|
|
@@ -326,7 +326,7 @@ Total PRs opened: <n>
|
|
|
326
326
|
|
|
327
327
|
## Idempotency & safety
|
|
328
328
|
|
|
329
|
-
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any leaf claim; a container with open child work (or a childless Epic
|
|
329
|
+
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any leaf claim; a container with open child work (or a childless Epic) is moved `$READY` → `$CLAIMED` as lifecycle repair and never dispatched. The lifecycle-repair comment is idempotent — a re-entrant cycle does not re-post it.
|
|
330
330
|
- **Dependency hold runs before leaf claim**: explicit `Blocked by:` relationships are resolved after container repair is ruled out but before `$READY → $CLAIMED`; active blockers leave the leaf candidate in `$READY` and are reported as skipped, not blocked.
|
|
331
331
|
- **Claim-first ordering**: `$CLAIMED` set BEFORE `lisa:github-agent` invocation for leaves; containers are also moved to `$CLAIMED` to leave the ready pickup queue, but are not dispatched.
|
|
332
332
|
- **No writes outside the lifecycle**: this skill only relabels `$READY → $CLAIMED` and `$CLAIMED → $DONE`. For containers, `$READY → $CLAIMED` is a lifecycle repair, not a direct build claim. Every other label change is owned by `lisa:github-agent`.
|
|
@@ -351,7 +351,7 @@ If the repo has not adopted the `status:*` label namespace, this skill cannot ru
|
|
|
351
351
|
|
|
352
352
|
## Rules
|
|
353
353
|
|
|
354
|
-
- **Dispatch leaves only.** Per the `leaf-only-lifecycle` rule, never dispatch a container — an issue with open child work, or a childless Epic
|
|
354
|
+
- **Dispatch leaves only.** Per the `leaf-only-lifecycle` rule, never dispatch a container — an issue with open child work, or a childless Epic — even if it carries the build-ready role. Move it `$READY → $CLAIMED` as lifecycle repair (Phase 3a); never silently implement a container.
|
|
355
355
|
- Never relabel an issue outside the cycle's allowed transitions. The `$CLAIMED` label is the signature of cycle ownership for leaves, and the parent/container progress state for lifecycle repairs.
|
|
356
356
|
- Never bypass `lisa:github-agent` to do build work directly. `lisa:github-agent` owns the per-issue lifecycle.
|
|
357
357
|
- Never auto-transition past `$DONE`. Downstream labels (terminal `status:done`, etc.) are owned by QA / PM / merge automation.
|