@codyswann/lisa 2.176.12 → 2.178.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/linear-agent.md +3 -3
- package/plugins/lisa/rules/eager/integration-access-layer.md +10 -0
- package/plugins/lisa/rules/reference/integration-access-layer.md +56 -0
- package/plugins/lisa/rules/reference/repo-scope-split.md +1 -1
- package/plugins/lisa/skills/intake/SKILL.md +2 -2
- package/plugins/lisa/skills/jam-access/SKILL.md +51 -0
- package/plugins/lisa/skills/jam-access/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/linear-access/SKILL.md +90 -0
- package/plugins/lisa/skills/linear-access/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/linear-add-journey/SKILL.md +3 -3
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +11 -11
- package/plugins/lisa/skills/linear-create/SKILL.md +3 -3
- package/plugins/lisa/skills/linear-evidence/SKILL.md +5 -5
- package/plugins/lisa/skills/linear-journey/SKILL.md +2 -2
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -11
- package/plugins/lisa/skills/linear-read-issue/SKILL.md +11 -11
- package/plugins/lisa/skills/linear-sync/SKILL.md +7 -7
- package/plugins/lisa/skills/linear-to-tracker/SKILL.md +7 -7
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +8 -8
- package/plugins/lisa/skills/linear-verify/SKILL.md +3 -3
- package/plugins/lisa/skills/linear-write-issue/SKILL.md +20 -20
- package/plugins/lisa/skills/linear-write-prd/SKILL.md +6 -6
- package/plugins/lisa/skills/posthog-access/SKILL.md +60 -0
- package/plugins/lisa/skills/posthog-access/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/prd-backlink/SKILL.md +5 -5
- package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa/skills/repair-intake/SKILL.md +1 -1
- package/plugins/lisa/skills/sentry-access/SKILL.md +56 -0
- package/plugins/lisa/skills/sentry-access/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/setup-linear/SKILL.md +5 -5
- package/plugins/lisa/skills/sonarcloud-access/SKILL.md +71 -0
- package/plugins/lisa/skills/sonarcloud-access/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/tracker-journey/SKILL.md +1 -1
- package/plugins/lisa/skills/verify-prd/SKILL.md +2 -2
- package/plugins/lisa-agy/agents/linear-agent.md +3 -3
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/intake/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/jam-access/SKILL.md +51 -0
- package/plugins/lisa-agy/skills/linear-access/SKILL.md +90 -0
- package/plugins/lisa-agy/skills/linear-add-journey/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +11 -11
- package/plugins/lisa-agy/skills/linear-create/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/linear-evidence/SKILL.md +5 -5
- package/plugins/lisa-agy/skills/linear-journey/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/linear-prd-intake/SKILL.md +11 -11
- package/plugins/lisa-agy/skills/linear-read-issue/SKILL.md +11 -11
- package/plugins/lisa-agy/skills/linear-sync/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/linear-to-tracker/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +8 -8
- package/plugins/lisa-agy/skills/linear-verify/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/linear-write-issue/SKILL.md +20 -20
- package/plugins/lisa-agy/skills/linear-write-prd/SKILL.md +6 -6
- package/plugins/lisa-agy/skills/posthog-access/SKILL.md +60 -0
- package/plugins/lisa-agy/skills/prd-backlink/SKILL.md +5 -5
- package/plugins/lisa-agy/skills/prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/repair-intake/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/sentry-access/SKILL.md +56 -0
- package/plugins/lisa-agy/skills/setup-linear/SKILL.md +5 -5
- package/plugins/lisa-agy/skills/sonarcloud-access/SKILL.md +71 -0
- package/plugins/lisa-agy/skills/tracker-journey/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/verify-prd/SKILL.md +2 -2
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/agents/linear-agent.agent.md +3 -3
- package/plugins/lisa-copilot/rules/eager/integration-access-layer.md +10 -0
- package/plugins/lisa-copilot/rules/reference/integration-access-layer.md +56 -0
- package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +1 -1
- package/plugins/lisa-copilot/skills/intake/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/jam-access/SKILL.md +51 -0
- package/plugins/lisa-copilot/skills/linear-access/SKILL.md +90 -0
- package/plugins/lisa-copilot/skills/linear-add-journey/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +11 -11
- package/plugins/lisa-copilot/skills/linear-create/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/linear-evidence/SKILL.md +5 -5
- package/plugins/lisa-copilot/skills/linear-journey/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/linear-prd-intake/SKILL.md +11 -11
- package/plugins/lisa-copilot/skills/linear-read-issue/SKILL.md +11 -11
- package/plugins/lisa-copilot/skills/linear-sync/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/linear-to-tracker/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +8 -8
- package/plugins/lisa-copilot/skills/linear-verify/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/linear-write-issue/SKILL.md +20 -20
- package/plugins/lisa-copilot/skills/linear-write-prd/SKILL.md +6 -6
- package/plugins/lisa-copilot/skills/posthog-access/SKILL.md +60 -0
- package/plugins/lisa-copilot/skills/prd-backlink/SKILL.md +5 -5
- package/plugins/lisa-copilot/skills/prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/sentry-access/SKILL.md +56 -0
- package/plugins/lisa-copilot/skills/setup-linear/SKILL.md +5 -5
- package/plugins/lisa-copilot/skills/sonarcloud-access/SKILL.md +71 -0
- package/plugins/lisa-copilot/skills/tracker-journey/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/verify-prd/SKILL.md +2 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/linear-agent.md +3 -3
- package/plugins/lisa-cursor/rules/integration-access-layer-reference.mdc +61 -0
- package/plugins/lisa-cursor/rules/integration-access-layer.mdc +15 -0
- package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +1 -1
- package/plugins/lisa-cursor/skills/intake/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/jam-access/SKILL.md +51 -0
- package/plugins/lisa-cursor/skills/linear-access/SKILL.md +90 -0
- package/plugins/lisa-cursor/skills/linear-add-journey/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +11 -11
- package/plugins/lisa-cursor/skills/linear-create/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/linear-evidence/SKILL.md +5 -5
- package/plugins/lisa-cursor/skills/linear-journey/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/linear-prd-intake/SKILL.md +11 -11
- package/plugins/lisa-cursor/skills/linear-read-issue/SKILL.md +11 -11
- package/plugins/lisa-cursor/skills/linear-sync/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/linear-to-tracker/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +8 -8
- package/plugins/lisa-cursor/skills/linear-verify/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/linear-write-issue/SKILL.md +20 -20
- package/plugins/lisa-cursor/skills/linear-write-prd/SKILL.md +6 -6
- package/plugins/lisa-cursor/skills/posthog-access/SKILL.md +60 -0
- package/plugins/lisa-cursor/skills/prd-backlink/SKILL.md +5 -5
- package/plugins/lisa-cursor/skills/prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/sentry-access/SKILL.md +56 -0
- package/plugins/lisa-cursor/skills/setup-linear/SKILL.md +5 -5
- package/plugins/lisa-cursor/skills/sonarcloud-access/SKILL.md +71 -0
- package/plugins/lisa-cursor/skills/tracker-journey/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/verify-prd/SKILL.md +2 -2
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/linear-agent.md +3 -3
- package/plugins/src/base/rules/eager/integration-access-layer.md +10 -0
- package/plugins/src/base/rules/reference/integration-access-layer.md +56 -0
- package/plugins/src/base/rules/reference/repo-scope-split.md +1 -1
- package/plugins/src/base/skills/intake/SKILL.md +2 -2
- package/plugins/src/base/skills/jam-access/SKILL.md +51 -0
- package/plugins/src/base/skills/linear-access/SKILL.md +90 -0
- package/plugins/src/base/skills/linear-add-journey/SKILL.md +3 -3
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +11 -11
- package/plugins/src/base/skills/linear-create/SKILL.md +3 -3
- package/plugins/src/base/skills/linear-evidence/SKILL.md +5 -5
- package/plugins/src/base/skills/linear-journey/SKILL.md +2 -2
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -11
- package/plugins/src/base/skills/linear-read-issue/SKILL.md +11 -11
- package/plugins/src/base/skills/linear-sync/SKILL.md +7 -7
- package/plugins/src/base/skills/linear-to-tracker/SKILL.md +7 -7
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +8 -8
- package/plugins/src/base/skills/linear-verify/SKILL.md +3 -3
- package/plugins/src/base/skills/linear-write-issue/SKILL.md +20 -20
- package/plugins/src/base/skills/linear-write-prd/SKILL.md +6 -6
- package/plugins/src/base/skills/posthog-access/SKILL.md +60 -0
- package/plugins/src/base/skills/prd-backlink/SKILL.md +5 -5
- package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +2 -2
- package/plugins/src/base/skills/repair-intake/SKILL.md +1 -1
- package/plugins/src/base/skills/sentry-access/SKILL.md +56 -0
- package/plugins/src/base/skills/setup-linear/SKILL.md +5 -5
- package/plugins/src/base/skills/sonarcloud-access/SKILL.md +71 -0
- package/plugins/src/base/skills/tracker-journey/SKILL.md +1 -1
- package/plugins/src/base/skills/verify-prd/SKILL.md +2 -2
- package/scripts/generate-codex-plugin-artifacts.mjs +28 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-build-intake
|
|
3
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
|
-
allowed-tools: ["Skill", "Bash"
|
|
4
|
+
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Linear Build Intake: $ARGUMENTS
|
|
@@ -107,7 +107,7 @@ ready → claimed → review → done(env-keyed) (downstream)
|
|
|
107
107
|
|
|
108
108
|
This skill ONLY transitions `$READY → $CLAIMED` on claim, and `$CLAIMED → $DONE` on completion. It never touches `status:done`-as-terminal, `$REVIEW` (owned by `lisa:linear-agent` / `lisa:linear-evidence`), or `status:blocked` (owned by `lisa:linear-agent`'s pre-flight gate).
|
|
109
109
|
|
|
110
|
-
**Pre-flight check**: at start of each cycle, confirm `$READY`, `$CLAIMED`, and the relevant `$DONE` variants exist on the team via `
|
|
110
|
+
**Pre-flight check**: at start of each cycle, confirm `$READY`, `$CLAIMED`, and the relevant `$DONE` variants exist on the team via `lisa:linear-access operation: list-issue-labels`. If `$READY` is missing, stop and report adoption needed. The other labels can be created on demand.
|
|
111
111
|
|
|
112
112
|
## Phases
|
|
113
113
|
|
|
@@ -116,11 +116,11 @@ This skill ONLY transitions `$READY → $CLAIMED` on claim, and `$CLAIMED → $D
|
|
|
116
116
|
1. Parse `$ARGUMENTS`:
|
|
117
117
|
- Bare team key → use as-is.
|
|
118
118
|
- Literal `linear` → fall back to `linear.teamKey` from config.
|
|
119
|
-
2. Resolve team ID via `
|
|
119
|
+
2. Resolve team ID via `lisa:linear-access operation: list-teams({query: <teamKey>})`.
|
|
120
120
|
|
|
121
121
|
### Phase 2 — Find ready Issues
|
|
122
122
|
|
|
123
|
-
Query: `
|
|
123
|
+
Query: `lisa:linear-access operation: list-issues({team: <teamId>, label: "$READY"})`.
|
|
124
124
|
|
|
125
125
|
Capture each Issue's: identifier, title, type label, priority, assignee, project, labels, description summary.
|
|
126
126
|
|
|
@@ -138,7 +138,7 @@ A Linear team can oversee multiple repos (`frontend` / `backend` / `infrastructu
|
|
|
138
138
|
2. **Cheap path first.** Prefer candidates already carrying the `repo:<current>` label. Keep the Phase 2 scan broad so unlabeled Issues are still seen, determined, and stamped.
|
|
139
139
|
3. **Per candidate, apply the repo-scope decision (`repo-scope-split`):**
|
|
140
140
|
- Carries `repo:<other>` → **skip** (leave it `ready` for that repo's own intake); next candidate.
|
|
141
|
-
- **Unlabeled** → determine the target repo(s) from the Issue + code surfaces, then **stamp** `repo:<name>` via `
|
|
141
|
+
- **Unlabeled** → determine the target repo(s) from the Issue + code surfaces, then **stamp** `repo:<name>` via `lisa:linear-access operation: save-issue` (resolve/create the label via `list_issue_labels`/`create_issue_label`) so later cycles filter cheaply; re-apply with the now-known repo.
|
|
142
142
|
- **Multi-repo leaf → split, never claim.** Run the `repo-scope-split` work-time procedure into single-repo siblings, each created **build-ready** (`build_ready: true`) and stamped with its own `repo:<name>`; the current repo's sibling becomes a normal candidate.
|
|
143
143
|
- **Single-repo leaf for the current repo** → fall through to 3a (leaf-only gate) and 3b (claim).
|
|
144
144
|
4. Continue until a claimable current-repo leaf is found (claim it; one per cycle) or the ready set is exhausted — exit cleanly with `"No ready Issues for repo <current>. Nothing to do."`.
|
|
@@ -151,7 +151,7 @@ Run this gate **before** the claim relabel, starting with the oldest/highest-pri
|
|
|
151
151
|
|
|
152
152
|
**Resolve container vs. leaf — structural first, then nominal.** Per `leaf-only-lifecycle` the classification is structural: an Issue is a **container** if it has **open** child work, whatever its declared type; otherwise the **type label** decides. Resolve child work using the same hierarchy `lisa:linear-read-issue` uses — Linear's native parentage: an Issue groups **sub-issues** via `parentId`, and a **Project** (the Epic equivalent) groups Issues via `projectId`. Relations (`save_issue_relation` — `blocks` / `is blocked by`) express dependencies and are **not** parentage — do not count them as children.
|
|
153
153
|
|
|
154
|
-
Fetch the Issue's sub-issues via `
|
|
154
|
+
Fetch the Issue's sub-issues via `lisa:linear-access operation: get-issue` (which returns the children) or `lisa:linear-access operation: list-issues({parentId: <issueId>})`, then count those still open (Linear `state.type` not in the completed/canceled set):
|
|
155
155
|
|
|
156
156
|
```text
|
|
157
157
|
# Children of <issueId>: native sub-issues via parentId.
|
|
@@ -176,7 +176,7 @@ The childless-parent exception promotes every childless type **except Epic** to
|
|
|
176
176
|
|
|
177
177
|
**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.
|
|
178
178
|
|
|
179
|
-
Post via `
|
|
179
|
+
Post via `lisa:linear-access operation: save-comment` with:
|
|
180
180
|
|
|
181
181
|
```text
|
|
182
182
|
[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.
|
|
@@ -186,9 +186,9 @@ This gate never blocks a legitimate flat Task/Bug: those have no open children a
|
|
|
186
186
|
|
|
187
187
|
#### 3b. Claim
|
|
188
188
|
|
|
189
|
-
Update labels via `
|
|
189
|
+
Update labels via `lisa:linear-access operation: save-issue`: remove `$READY`, add `$CLAIMED`. Resolve label IDs via `list_issue_labels` (create `$CLAIMED` if missing).
|
|
190
190
|
|
|
191
|
-
**Assign to the authenticated user when the Issue is unassigned.** A claim must be attributable. If the Issue has no assignee, set its `assigneeId` to the authenticated viewer (resolve the viewer's id via the Linear MCP identity — e.g. `get_user` for the current actor) through `
|
|
191
|
+
**Assign to the authenticated user when the Issue is unassigned.** A claim must be attributable. If the Issue has no assignee, set its `assigneeId` to the authenticated viewer (resolve the viewer's id via the Linear MCP identity — e.g. `get_user` for the current actor) through `lisa:linear-access operation: save-issue`. Leave an already-assigned Issue's assignee untouched — never reassign work that already has an owner.
|
|
192
192
|
|
|
193
193
|
Post a `[claude-build-intake]` comment via `save_comment`: `"Claimed by Claude. Starting build."`
|
|
194
194
|
|
|
@@ -264,7 +264,7 @@ If `lisa:linear-agent` returned Success:
|
|
|
264
264
|
- If `linear.labels.build.done` is a string, that string is terminal.
|
|
265
265
|
- If `linear.labels.build.done` is an object, only the production/final environment value is terminal (default: `status:done`). Intermediate env values such as `status:on-dev` and `status:on-stg` are not terminal and must keep the native Issue open.
|
|
266
266
|
- If the project uses a different final environment name, resolve it from the configured deployment topology; if ambiguous, record an Error and do not change the native state.
|
|
267
|
-
4. Update labels via `
|
|
267
|
+
4. Update labels via `lisa:linear-access operation: save-issue`: remove `$CLAIMED` (or `$REVIEW` if `lisa:linear-evidence` already moved it forward), add `$DONE`.
|
|
268
268
|
5. If `$DONE` is terminal, move the native Linear Issue state to the configured Done / Completed state. Resolve that state from project configuration if present; otherwise inspect the team workflow for a terminal state with `state.type = "completed"` and a name such as `Done` or `Completed`. If no terminal state can be resolved, record an Error and leave the labels as the source of truth — do not invent a state name.
|
|
269
269
|
6. Post a `[claude-build-intake]` comment: `"Build complete. PR <URL> merged. Transitioned to $DONE."` Include whether native closure was applied, already satisfied, skipped for an intermediate env, or unavailable for setup reasons.
|
|
270
270
|
|
|
@@ -275,7 +275,7 @@ For any non-Success outcome, do NOT transition. The Issue sits where the agent l
|
|
|
275
275
|
Run this **only after a successful `$DONE` transition in 3d**. This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` may complete its parent Issue, which may in turn complete its Project. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
|
|
276
276
|
|
|
277
277
|
1. Resolve the Issue's parent using the same hierarchy `lisa:linear-read-issue` uses — native parentage: a sub-issue's `parentId`, and Project membership via `projectId` for the Epic-equivalent. If the Issue has no parent, skip — nothing to roll up.
|
|
278
|
-
2. Walk **up the ancestor chain bottom-up** (sub-issue → parent Issue → Project): for each ancestor invoke `lisa:linear-sync <ANCESTOR-ID> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it via `
|
|
278
|
+
2. Walk **up the ancestor chain bottom-up** (sub-issue → parent Issue → Project): for each ancestor invoke `lisa:linear-sync <ANCESTOR-ID> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it via `lisa:linear-access operation: save-issue` only when it differs (never `status:ready`), and moves the native Linear `state` to the configured Done / Completed state when the derived env is the terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
|
|
279
279
|
3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change. Record each rolled-up ancestor and its derived state in the summary.
|
|
280
280
|
|
|
281
281
|
This does not re-implement the state machine — it delegates to `lisa:linear-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow are not observed here; `lisa:repair-intake` remains the recovery net for those.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-create
|
|
3
3
|
description: "Creates Linear Projects (Epic-equivalent), Issues (Story / Task / Bug / Spike), and sub-Issues (Sub-task) from code files or descriptions. Analyzes the input, determines the appropriate hierarchy, and creates items with comprehensive quality requirements including test-first development and Validation Journey. The Linear counterpart of lisa:jira-create — delegates every write to lisa:linear-write-issue."
|
|
4
|
-
allowed-tools: ["Read", "Glob", "LS", "Skill"
|
|
4
|
+
allowed-tools: ["Read", "Glob", "LS", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Create Linear Work Items from $ARGUMENTS
|
|
8
8
|
|
|
9
|
-
Analyze the provided file(s) and plan a Linear hierarchy. **This skill plans structure only — every individual write is delegated to `lisa:linear-write-issue`.** Do not call `
|
|
9
|
+
Analyze the provided file(s) and plan a Linear hierarchy. **This skill plans structure only — every individual write is delegated to `lisa:linear-write-issue`.** Do not call `lisa:linear-access operation: save-project` or `lisa:linear-access operation: save-issue` from this skill; those write tools are intentionally not in `allowed-tools`.
|
|
10
10
|
|
|
11
11
|
This skill is the destination of the `lisa:tracker-create` shim when `tracker = "linear"`.
|
|
12
12
|
|
|
@@ -104,7 +104,7 @@ Default team: from `linear.teamKey` config (override via arguments).
|
|
|
104
104
|
|
|
105
105
|
## Delegation to linear-write-issue
|
|
106
106
|
|
|
107
|
-
**Mandatory.** Every item created by this skill MUST go through `lisa:linear-write-issue`. This skill never
|
|
107
|
+
**Mandatory.** Every item created by this skill MUST go through `lisa:linear-write-issue`. This skill never performs Linear save operations itself — those tools are intentionally excluded from `allowed-tools` so the gate cannot be bypassed.
|
|
108
108
|
|
|
109
109
|
`lisa:linear-write-issue` enforces:
|
|
110
110
|
- 3-audience description (Context / Technical Approach / Acceptance Criteria)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-evidence
|
|
3
3
|
description: "Uploads text evidence to the GitHub `pr-assets` release, updates the PR description, posts a comment on the originating Linear Issue with code blocks, and transitions the Issue from the configured `claimed` label to the configured `review` label. Reusable by any skill that captures evidence and generates evidence/comment.txt + evidence/code-blocks.md. Linear counterpart of lisa:jira-evidence and lisa:github-evidence."
|
|
4
|
-
allowed-tools: ["Bash", "Skill"
|
|
4
|
+
allowed-tools: ["Bash", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Linear Evidence: $ARGUMENTS
|
|
@@ -44,7 +44,7 @@ If any of these are missing, stop and report.
|
|
|
44
44
|
## Phase 1 — Resolve Linear Issue
|
|
45
45
|
|
|
46
46
|
1. Parse the identifier from `$ARGUMENTS`.
|
|
47
|
-
2. Fetch via `
|
|
47
|
+
2. Fetch via `lisa:linear-access operation: get-issue` to confirm it exists and capture its current state, label set, and Project membership.
|
|
48
48
|
|
|
49
49
|
## Phase 2 — Upload Evidence Files (optional)
|
|
50
50
|
|
|
@@ -64,7 +64,7 @@ If no PR is open, skip this phase.
|
|
|
64
64
|
|
|
65
65
|
## Phase 4 — Post Linear Comment
|
|
66
66
|
|
|
67
|
-
Call `
|
|
67
|
+
Call `lisa:linear-access operation: save-comment({issueId: <id>, body: <body>})` where `<body>` is:
|
|
68
68
|
|
|
69
69
|
```markdown
|
|
70
70
|
[<comment.txt contents verbatim>]
|
|
@@ -83,7 +83,7 @@ Linear comments support markdown including `<details>` collapsibles, fenced code
|
|
|
83
83
|
|
|
84
84
|
## Phase 5 — Transition Status
|
|
85
85
|
|
|
86
|
-
Update labels via `
|
|
86
|
+
Update labels via `lisa:linear-access operation: save-issue` to remove `$CLAIMED` and add `$REVIEW`. Resolve label IDs first via `lisa:linear-access operation: list-issue-labels` (create the label via `create_issue_label` if it doesn't exist on the team).
|
|
87
87
|
|
|
88
88
|
The native Linear `state` field is also updated to the team's "In Review" state if one exists — but the label remains the source of truth for cross-team consistency.
|
|
89
89
|
|
|
@@ -99,5 +99,5 @@ Return:
|
|
|
99
99
|
|
|
100
100
|
- Never modify the Issue description as part of evidence posting — comments only. Description edits go through `lisa:linear-write-issue`.
|
|
101
101
|
- Never skip the label transition. The build queue is keyed off the configured `linear.labels.build.*` labels; an item that ships without transitioning is invisible to monitoring.
|
|
102
|
-
- If `
|
|
102
|
+
- If `lisa:linear-access operation: save-comment` fails, retry once. If it fails again, surface the error — don't pretend the comment was posted.
|
|
103
103
|
- Do not delete prior comments. The history is the audit trail.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-journey
|
|
3
3
|
description: "Parse a Linear Issue's Validation Journey section, execute the verification steps using appropriate tools (curl, test commands, database queries, Playwright), capture evidence at each [EVIDENCE: name] marker, and post to Linear + GitHub PR using the linear-evidence skill. Linear counterpart of lisa:jira-journey."
|
|
4
|
-
allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"
|
|
4
|
+
allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Linear Validation Journey
|
|
@@ -31,7 +31,7 @@ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.loca
|
|
|
31
31
|
|
|
32
32
|
### Step 1: Parse the Validation Journey
|
|
33
33
|
|
|
34
|
-
Fetch the Issue via `
|
|
34
|
+
Fetch the Issue via `lisa:linear-access operation: get-issue` and extract the `## Validation Journey` section from the markdown description. Parse:
|
|
35
35
|
|
|
36
36
|
- `### Prerequisites` — list of required services / env / setup
|
|
37
37
|
- `### Steps` — numbered steps, each potentially containing `[EVIDENCE: name]` markers
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-prd-intake
|
|
3
3
|
description: "Scans a Linear workspace (or a specific team) for projects carrying the configured `ready` PRD label and runs the first eligible one through the dry-run validation pipeline. A project that passes every gate gets tickets written and the label flipped to the configured `ticketed` label; a project that fails gets clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to the configured `blocked` label. Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (linear-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
|
|
4
|
-
allowed-tools: ["Skill", "Bash"
|
|
4
|
+
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Linear PRD Intake: $ARGUMENTS
|
|
@@ -96,13 +96,13 @@ If the project does not yet use these labels, this skill cannot run. Adopting th
|
|
|
96
96
|
- Bare team key → use as-is; the scope is that team.
|
|
97
97
|
- The literal `linear` → fall back to `linear.workspace` from `.lisa.config.json`; error if not set.
|
|
98
98
|
2. Verify the scope is reachable:
|
|
99
|
-
- For a workspace: call `
|
|
100
|
-
- For a team: call `
|
|
101
|
-
3. Resolve the project-label IDs for `$READY`, `$IN_REVIEW`, `$BLOCKED`, `$TICKETED` via `
|
|
99
|
+
- For a workspace: call `lisa:linear-access operation: list-teams` and confirm at least one team is returned (non-empty workspaces are readable; empty results indicate auth or workspace-mismatch).
|
|
100
|
+
- For a team: call `lisa:linear-access operation: list-teams({query: <KEY>})` and confirm the team resolves.
|
|
101
|
+
3. Resolve the project-label IDs for `$READY`, `$IN_REVIEW`, `$BLOCKED`, `$TICKETED` via `lisa:linear-access operation: list-project-labels`. Cache them — every transition uses these IDs. If any of the four are missing, surface a label-convention error and exit (see "Adoption").
|
|
102
102
|
|
|
103
103
|
### Phase 2 — Find ready PRDs
|
|
104
104
|
|
|
105
|
-
Call `
|
|
105
|
+
Call `lisa:linear-access operation: list-projects({label: "$READY", ...scope-filter})`:
|
|
106
106
|
|
|
107
107
|
- For a workspace scope: pass `label: "$READY"` only.
|
|
108
108
|
- For a team scope: pass `label: "$READY"` AND `team: "<KEY>"`.
|
|
@@ -123,7 +123,7 @@ Select the first ready project returned by Phase 2 and process only that project
|
|
|
123
123
|
|
|
124
124
|
#### 3a. Claim
|
|
125
125
|
|
|
126
|
-
Transition labels via `
|
|
126
|
+
Transition labels via `lisa:linear-access operation: save-project({id, labels})`: pass the full new label set with `$READY` removed and `$IN_REVIEW` added. This is the idempotency lock — a re-entrant cycle running concurrently won't see this project because its query filters on `label: "$READY"`.
|
|
127
127
|
|
|
128
128
|
If the update fails (permission error, race condition), log it and skip this project. Do not proceed to validation on a project you didn't successfully claim.
|
|
129
129
|
|
|
@@ -145,7 +145,7 @@ This call also indirectly invokes `lisa:tracker-source-artifacts` (artifact extr
|
|
|
145
145
|
|
|
146
146
|
1. Re-invoke `lisa:linear-to-tracker` with `dry_run: false` to actually write the tickets. This re-runs Phases 1-5 and runs the preservation gate (Phase 5.5).
|
|
147
147
|
2. Capture the created ticket keys from the skill's output.
|
|
148
|
-
3. Ensure the project has a sentinel feedback issue (see "Sentinel feedback issue" below for the helper). Post a comment on it via `
|
|
148
|
+
3. Ensure the project has a sentinel feedback issue (see "Sentinel feedback issue" below for the helper). Post a comment on it via `lisa:linear-access operation: save-comment` listing the created tickets (epic, stories, sub-tasks) with their JIRA URLs. Lead with: `"Ticketed by Claude. Created N JIRA issues — see below. Add the $SHIPPED label to the Linear project after the work is delivered."`
|
|
149
149
|
4. Transition labels: remove `$IN_REVIEW`, add `$TICKETED` via `save_project`.
|
|
150
150
|
5. **Run Phase 3e (coverage audit)** before considering this PRD done.
|
|
151
151
|
|
|
@@ -160,7 +160,7 @@ The audience for these comments is the **product team**, not engineers. They are
|
|
|
160
160
|
|
|
161
161
|
##### 3c.2 Render each comment
|
|
162
162
|
|
|
163
|
-
Ensure the project has a sentinel feedback issue (see helper below). For each anchored group (`prd_anchor` is a sub-issue identifier), post a comment on THAT sub-issue via `
|
|
163
|
+
Ensure the project has a sentinel feedback issue (see helper below). For each anchored group (`prd_anchor` is a sub-issue identifier), post a comment on THAT sub-issue via `lisa:linear-access operation: save-comment({issueId: <prd_anchor>, body: <template>})`. For the unanchored group, post a single comment on the sentinel feedback issue using the same template, prefixed with `Issues without a specific sub-issue anchor:` and one block per failure.
|
|
164
164
|
|
|
165
165
|
If `save_comment` fails for a specific anchored sub-issue (the issue was deleted between fetch and post, or the agent lacks comment permission), fall back to the sentinel feedback issue for that group. Do not silently drop the failure.
|
|
166
166
|
|
|
@@ -246,7 +246,7 @@ Rollup is keyed by the PRD's current state. If the PRD project already carries `
|
|
|
246
246
|
|
|
247
247
|
Read the PRD's **generated top-level work** — its created Epics and any top-level Stories created directly under it, **excluding** leaf Sub-tasks and any Story nested under a generated Epic (`prd-lifecycle-rollup` rule, generated-top-level-work contract). Use two sources, native first:
|
|
248
248
|
|
|
249
|
-
1. **Native parent / project relationships (primary).** Linear records the PRD→child relationship natively where the PRD also lives in Linear: a generated top-level Issue uses `parentId`, or a generated Project groups the generated Issues. Read the PRD project's generated top-level Issues via `
|
|
249
|
+
1. **Native parent / project relationships (primary).** Linear records the PRD→child relationship natively where the PRD also lives in Linear: a generated top-level Issue uses `parentId`, or a generated Project groups the generated Issues. Read the PRD project's generated top-level Issues via `lisa:linear-access operation: list-issues({project: <id>})` and take the **top-level** ones (no `parentId`, or whose parent is the PRD itself) — those are the PRD's direct children. Fetch each with `lisa:linear-access operation: get-issue` for its workflow state.
|
|
250
250
|
|
|
251
251
|
2. **Documented `## Tickets` section (fallback).** When the native relationship is unavailable (the destination tracker is a *different* system — e.g. Linear PRD → JIRA tracker — so the children were never linked as Linear issues), parse the machine-readable generated-work section `lisa:prd-backlink` writes to the PRD (`## Tickets`, alias `## Generated Work`; see #582). Top-level children are the `### <Epic key>: <title>` group headers' first line (`- [<ref>](<url>) — Epic`) plus any top-level Story listed directly under `### Unparented items`. Lines nested deeper (` - ... — Story:` under an Epic, ` - ... — Sub-task:`) are descendants, NOT top-level children — skip them.
|
|
252
252
|
|
|
@@ -266,7 +266,7 @@ The set of **required** children for the all-terminal check is the top-level chi
|
|
|
266
266
|
|
|
267
267
|
**All required children terminal** (every required top-level child is terminal; at least one required child exists):
|
|
268
268
|
|
|
269
|
-
1. Transition labels: remove `$TICKETED`, add `$SHIPPED` via `
|
|
269
|
+
1. Transition labels: remove `$TICKETED`, add `$SHIPPED` via `lisa:linear-access operation: save-project({id, labels})`. Verify exactly one lifecycle label remains (the single-label invariant).
|
|
270
270
|
2. Leave the PRD active for `/lisa:verify-prd`; do not archive at the shipped hop.
|
|
271
271
|
3. Post a short rollup comment on the sentinel feedback issue naming the terminal child set and (when dropped children exist) the dropped set, so the audit trail records *why* the PRD shipped. Lead with `"Shipped by Claude — all generated top-level work is complete."`
|
|
272
272
|
|
|
@@ -283,7 +283,7 @@ This phase implements exactly one PRD-lifecycle hop — `$TICKETED → $SHIPPED`
|
|
|
283
283
|
|
|
284
284
|
`shipped` and `verified` are distinct facts about a PRD (see the `prd-lifecycle-rollup` rule's "PRD-level verification vs ticket verification" and "Closing the loop" sections). Rollup (3f) only reaches `$SHIPPED`; the `shipped → verified` (pass) / `shipped → ticketed` (fail) hops are owned by `/lisa:verify-prd`. This phase **closes that loop** by dispatching the initiative-level acceptance gate for shipped PRDs. It never performs the verification transition itself — the "never sets the verification outcome" invariant holds: `lisa:verify-prd`, not this skill, sets `verified` (or, on failure, re-opens the PRD to `ticketed`).
|
|
285
285
|
|
|
286
|
-
Re-query the projects currently carrying the `$SHIPPED` label via `
|
|
286
|
+
Re-query the projects currently carrying the `$SHIPPED` label via `lisa:linear-access operation: list-projects` (filtered by the `$SHIPPED` project label, **including archived projects** — so shipped PRDs remain active for `lisa:verify-prd`). Pick the **first** one and invoke `lisa:verify-prd <project-url>`. Process **one shipped PRD per cycle** — `lisa:verify-prd` is a heavy full flow (spec-conformance + empirical verification + fix-issue creation), so it is bounded exactly like the single-ready-PRD claim in Phase 3; the scheduler drains the rest.
|
|
287
287
|
|
|
288
288
|
**Per-cycle combined bound:** each scheduler cycle dispatches at most one ready PRD (the Phase 3 single-ready-PRD claim) **and** at most one shipped PRD for verification (this Phase 3g dispatch), for a maximum of two PRD operations per cycle. Ready intake runs first (Phase 3), then shipped verify (Phase 3g).
|
|
289
289
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-read-issue
|
|
3
3
|
description: "Fetches the full scope of a Linear work item — Issue or Project — including metadata, description, acceptance criteria, all comments, attachments, native relations (blocks/blocked_by/relates_to/duplicates), Project parent (if any) with siblings, and sub-Issues. Produces a consolidated context bundle that downstream agents consume so they never act on a single item in isolation."
|
|
4
|
-
allowed-tools: ["Bash", "Skill"
|
|
4
|
+
allowed-tools: ["Bash", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Read Linear Work Item: $ARGUMENTS
|
|
@@ -21,13 +21,13 @@ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.loca
|
|
|
21
21
|
1. If `$ARGUMENTS` matches `<TEAM>-<n>` → Issue mode.
|
|
22
22
|
2. If `$ARGUMENTS` is a URL containing `/project/<slug>-<short-id>` → Project mode (extract `<short-id>`).
|
|
23
23
|
3. Otherwise stop and report. Do NOT guess.
|
|
24
|
-
4. Resolve team ID via `
|
|
24
|
+
4. Resolve team ID via `lisa:linear-access operation: list-teams({query: <teamKey>})`.
|
|
25
25
|
|
|
26
26
|
## Phase 2 — Fetch Primary Item
|
|
27
27
|
|
|
28
28
|
### Issue mode
|
|
29
29
|
|
|
30
|
-
Call `
|
|
30
|
+
Call `lisa:linear-access operation: get-issue`. Extract and preserve:
|
|
31
31
|
|
|
32
32
|
**Metadata**
|
|
33
33
|
- Identifier, title, issue type (typically a label or workflow state), state, priority (0–4)
|
|
@@ -43,13 +43,13 @@ Call `mcp__linear-server__get_issue`. Extract and preserve:
|
|
|
43
43
|
- Attachment URLs (capture, do not download unless needed)
|
|
44
44
|
|
|
45
45
|
**Comments**
|
|
46
|
-
Fetch ALL comments via `
|
|
46
|
+
Fetch ALL comments via `lisa:linear-access operation: list-comments({issueId: <id>})` in chronological order. Walk thread parents/children — Linear comments are threaded via `parentId`. Do not truncate. For each comment:
|
|
47
47
|
- Author, timestamp, body
|
|
48
48
|
- Flag comments that contain: credentials, reproduction steps, status updates from stakeholders, decisions, or triage headers.
|
|
49
49
|
|
|
50
50
|
### Project mode
|
|
51
51
|
|
|
52
|
-
Call `
|
|
52
|
+
Call `lisa:linear-access operation: get-project` with `includeMilestones: true`, `includeResources: true`. Extract:
|
|
53
53
|
|
|
54
54
|
**Metadata**
|
|
55
55
|
- ID, slug, name, state, priority, lead, color
|
|
@@ -58,10 +58,10 @@ Call `mcp__linear-server__get_project` with `includeMilestones: true`, `includeR
|
|
|
58
58
|
|
|
59
59
|
**Body**
|
|
60
60
|
- Description (markdown)
|
|
61
|
-
- Attached documents — call `
|
|
61
|
+
- Attached documents — call `lisa:linear-access operation: list-documents({projectId})` then `lisa:linear-access operation: get-document` per result. Treat each as additional spec content.
|
|
62
62
|
|
|
63
63
|
**Member Issues**
|
|
64
|
-
- Call `
|
|
64
|
+
- Call `lisa:linear-access operation: list-issues({project: <id>})` to enumerate the Project's Issues. Capture identifier, title, state, parent Issue (for sub-Issue tree).
|
|
65
65
|
|
|
66
66
|
## Phase 3 — Fetch Attachments / Remote Links
|
|
67
67
|
|
|
@@ -81,7 +81,7 @@ Linear native Issue relations are returned in the `get_issue` response under `re
|
|
|
81
81
|
- `relates_to`
|
|
82
82
|
- `duplicates` / `duplicated_by`
|
|
83
83
|
|
|
84
|
-
For each related Issue, call `
|
|
84
|
+
For each related Issue, call `lisa:linear-access operation: get-issue` and capture:
|
|
85
85
|
- Identifier, title, state, priority, assignee
|
|
86
86
|
- Description (full, unless cancelled — then summary only)
|
|
87
87
|
- Acceptance Criteria section
|
|
@@ -96,9 +96,9 @@ For Project-level relationships (Project ↔ Project), Linear doesn't model nati
|
|
|
96
96
|
|
|
97
97
|
If the primary Item is an Issue with a Project parent:
|
|
98
98
|
|
|
99
|
-
1. Fetch the Project via `
|
|
99
|
+
1. Fetch the Project via `lisa:linear-access operation: get-project` — full description, milestones, labels, lead.
|
|
100
100
|
2. Fetch Project documents (Phase 2 procedure).
|
|
101
|
-
3. Find Project siblings via `
|
|
101
|
+
3. Find Project siblings via `lisa:linear-access operation: list-issues({project: <projectId>})` excluding the primary identifier.
|
|
102
102
|
4. For each sibling, capture: identifier, title, state, priority, assignee, summary (first paragraph of description).
|
|
103
103
|
5. If a sibling is `Started` or `In Review` with a different assignee, flag it prominently.
|
|
104
104
|
|
|
@@ -106,7 +106,7 @@ If the primary Item IS a Project, Phase 5 is the same as fetching all member Iss
|
|
|
106
106
|
|
|
107
107
|
## Phase 6 — Fetch Sub-Issues
|
|
108
108
|
|
|
109
|
-
If the primary Issue has children (sub-Issues), fetch each via `
|
|
109
|
+
If the primary Issue has children (sub-Issues), fetch each via `lisa:linear-access operation: get-issue`: identifier, title, state, assignee, description (first paragraph), Acceptance Criteria.
|
|
110
110
|
|
|
111
111
|
## Phase 7 — Assemble Context Bundle
|
|
112
112
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-sync
|
|
3
3
|
description: "Syncs plan progress to a linked Linear Issue. Posts plan contents, progress updates, branch links, and PR links at key milestones. Use this skill throughout the plan lifecycle to keep Linear Issues in sync. The Linear counterpart of lisa:jira-sync and lisa:github-sync."
|
|
4
|
-
allowed-tools: ["Bash", "Skill"
|
|
4
|
+
allowed-tools: ["Bash", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Sync Plan to Linear: $ARGUMENTS
|
|
@@ -37,7 +37,7 @@ This skill **suggests** transitions but does not auto-transition the native Line
|
|
|
37
37
|
|
|
38
38
|
1. If `$ARGUMENTS` includes an identifier, parse it.
|
|
39
39
|
2. Else search for the active plan file (most recent file under `plans/`) and extract the linked Linear Issue identifier from its frontmatter.
|
|
40
|
-
3. Fetch the Issue via `
|
|
40
|
+
3. Fetch the Issue via `lisa:linear-access operation: get-issue` to confirm it exists.
|
|
41
41
|
|
|
42
42
|
## Phase 2 — Compose Milestone Comment
|
|
43
43
|
|
|
@@ -65,7 +65,7 @@ Next: implementation begins. Suggested status: **Todo** (label: `status:ready`).
|
|
|
65
65
|
|
|
66
66
|
## Phase 3 — Post Comment
|
|
67
67
|
|
|
68
|
-
Call `
|
|
68
|
+
Call `lisa:linear-access operation: save-comment({issueId: <id>, body: <comment>})`.
|
|
69
69
|
|
|
70
70
|
## Phase 3b — Ensure PR Backlink
|
|
71
71
|
|
|
@@ -79,14 +79,14 @@ The PR branch/title/body identifier is the PR -> Linear side. This phase is the
|
|
|
79
79
|
|
|
80
80
|
## Phase 4 — Update Status Label (when caller requests)
|
|
81
81
|
|
|
82
|
-
If the caller passes `--update-label`, update the `status:*` label set via `
|
|
82
|
+
If the caller passes `--update-label`, update the `status:*` label set via `lisa:linear-access operation: save-issue`:
|
|
83
83
|
|
|
84
84
|
- `plan-created` → add `status:ready`
|
|
85
85
|
- `implementation-in-progress` → remove `status:ready`, add `status:in-progress`
|
|
86
86
|
- `pr-ready` → remove `status:in-progress`, add `status:code-review`
|
|
87
87
|
- `pr-merged` → remove `status:code-review`, add `status:done`
|
|
88
88
|
|
|
89
|
-
If the requested label doesn't exist on the team, create it via `
|
|
89
|
+
If the requested label doesn't exist on the team, create it via `lisa:linear-access operation: create-issue-label`.
|
|
90
90
|
|
|
91
91
|
Verify exactly one `status:*` label remains after the update — having two simultaneously breaks the build-queue invariant.
|
|
92
92
|
|
|
@@ -96,7 +96,7 @@ Without `--update-label`, this skill posts the comment only and does NOT touch l
|
|
|
96
96
|
|
|
97
97
|
When the caller passes `--rollup`, this skill **derives a parent/container's `status:*` label from the roll-up of its children** instead of acting on a leaf. A **Project** (the Epic equivalent) rolls up from its Issues; an **Issue** rolls up from its sub-Issues. This implements the Linear child-issue-status arm of the **Parent status rollup (the state machine)** section of the `leaf-only-lifecycle` rule — cite that rule, do not restate the policy.
|
|
98
98
|
|
|
99
|
-
**Resolve the child set the same way `lisa:linear-read-issue` does** — `
|
|
99
|
+
**Resolve the child set the same way `lisa:linear-read-issue` does** — `lisa:linear-access operation: list-issues({project: <id>})` for a Project's Issues, or `lisa:linear-access operation: get-issue` per child for an Issue's sub-Issues (via `parentId`). Capture each child's `status:*` label. If the item has **no** children it is a leaf — rollup is N/A; behave as a normal milestone sync.
|
|
100
100
|
|
|
101
101
|
**Evaluate the required children over the env ladder `in-progress < dev < staging < production` (the ordered keys of the Linear env-keyed `done` map, e.g. `status:on-dev < status:on-stg < status:done`) and take the first match** (canonical roles from `config-resolution`; Linear label map is `status:blocked`, `status:in-progress`, `status:code-review`, env-keyed `done`):
|
|
102
102
|
|
|
@@ -115,7 +115,7 @@ When the caller passes `--rollup`, this skill **derives a parent/container's `st
|
|
|
115
115
|
|
|
116
116
|
**Single-environment collapse (this repo).** The env rungs resolve via the env-keyed `done` logic in `config-resolution`. In this repo `deploy.branches` declares only `production: main`, so `done` collapses to the single `status:done` label, the only env rung is production, and the lifecycle is `status:ready → status:in-progress → status:code-review → status:done` with **no** dev/staging promotion hops; the rollup never resolves a dev or staging `done`. Multi-environment projects keep the env-keyed map and roll a parent up to intermediate env labels (`status:on-dev`/`status:on-stg`).
|
|
117
117
|
|
|
118
|
-
**Apply the derived label** via `
|
|
118
|
+
**Apply the derived label** via `lisa:linear-access operation: save-issue` (Project or Issue), removing the parent's existing `status:*` and adding the derived one so exactly one `status:*` label remains. Post an idempotent rollup comment naming the derived state and the child tally. The native Linear `state` is **not** auto-transitioned — only the `status:*` label, mirroring the `--update-label` rule. **Safe default:** if the derived terminal cannot be resolved (ambiguous required-set or unresolvable env `done`), do not guess — post the derived suggestion as a comment and leave the parent's label untouched.
|
|
119
119
|
|
|
120
120
|
## Rules
|
|
121
121
|
|
|
@@ -6,7 +6,7 @@ description: >
|
|
|
6
6
|
"break down this Linear project", "create tickets from a Linear project", "turn this Linear PRD into tickets", or similar. This skill mirrors `lisa:notion-to-tracker` and `lisa:confluence-to-tracker` for projects
|
|
7
7
|
whose PRDs live in Linear — the workflow, gates, dry-run mode, and validation rules are identical;
|
|
8
8
|
only the source-of-truth tool surface differs (Linear MCP instead of Notion / Confluence MCP).
|
|
9
|
-
allowed-tools: ["Skill", "Bash"
|
|
9
|
+
allowed-tools: ["Skill", "Bash"]
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Linear PRD to Tracker Breakdown
|
|
@@ -21,8 +21,8 @@ This skill is the Linear counterpart of `lisa:notion-to-tracker` and `lisa:confl
|
|
|
21
21
|
Linear has no native "PRD" entity. This skill treats a **Linear Project** as the PRD container:
|
|
22
22
|
|
|
23
23
|
- **Project description** (markdown) is the PRD body — equivalent to a Notion page body or a Confluence page body.
|
|
24
|
-
- **Project documents** (Linear's long-form markdown docs attached to projects, fetched via `
|
|
25
|
-
- **Project sub-issues** (`
|
|
24
|
+
- **Project documents** (Linear's long-form markdown docs attached to projects, fetched via `list-documents({projectId})` / `get-document`) are treated as additional spec content and merged into the analysis. A multi-document Linear PRD is the analog of a multi-page Confluence PRD.
|
|
25
|
+
- **Project sub-issues** (`list-issues({project})`) act as the candidate set for epics and user stories — the same role child Epic pages play in a Notion/Confluence PRD.
|
|
26
26
|
- **Linear comments live on Issues, not on Projects.** This skill aggregates comments from every issue under the project to capture decisions and engineering notes. Project-level discussion that isn't reflected on an issue is invisible to this skill.
|
|
27
27
|
|
|
28
28
|
## Modes
|
|
@@ -127,10 +127,10 @@ If env vars are not available, ask the user to provide them explicitly before pr
|
|
|
127
127
|
|
|
128
128
|
### Phase 1: Fetch & Analyze the PRD
|
|
129
129
|
|
|
130
|
-
1. **Resolve the project** via `
|
|
131
|
-
2. **Fetch attached Linear documents** via `
|
|
132
|
-
3. **Identify candidate epics and user stories** from project sub-issues via `
|
|
133
|
-
4. **Fetch full comments per sub-issue** via `
|
|
130
|
+
1. **Resolve the project** via `lisa:linear-access operation: get-project` with the slug or ID, including milestones and resources (`includeMilestones: true`, `includeResources: true`). Capture the project title, description, state, labels, lead, dates, attached documents, attached links.
|
|
131
|
+
2. **Fetch attached Linear documents** via `lisa:linear-access operation: list-documents({projectId})` then `lisa:linear-access operation: get-document` per result. Treat each as additional PRD content. (A Linear PRD with a single rich project description and no attached documents is the common case; multi-document PRDs are valid too.)
|
|
132
|
+
3. **Identify candidate epics and user stories** from project sub-issues via `lisa:linear-access operation: list-issues({project: <id>})`. Capture identifier, title, description, labels, state, parent issue, and `parentId` chain so the issue hierarchy is reproducible.
|
|
133
|
+
4. **Fetch full comments per sub-issue** via `lisa:linear-access operation: list-comments({issueId})` for every issue surfaced in step 3. Walk thread parents/children — comments are threaded via `parentId` references on the comment object.
|
|
134
134
|
5. **Synthesize decisions and blockers** from the project description + every document + every issue comment:
|
|
135
135
|
- Decisions already confirmed by the team (look for agreement in comment threads)
|
|
136
136
|
- Open questions that need product/engineering input
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-validate-issue
|
|
3
3
|
description: "Validates a proposed Linear work item spec (Project, Issue, or sub-Issue) — or an existing Linear item — against the organizational quality gates without writing anything. Returns a structured PASS/FAIL report per gate with concrete remediation. Single source of truth for what makes a valid Linear item — both the write path (linear-write-issue runs it pre-write) and the dry-run path (linear-to-tracker runs it during PRD intake) call this skill so the bar can never drift."
|
|
4
|
-
allowed-tools: ["
|
|
4
|
+
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Validate Linear Work Item: $ARGUMENTS
|
|
@@ -65,7 +65,7 @@ build_ready: true # caller asserts the build-ready role (status:
|
|
|
65
65
|
child_refs: ["ENG-601", "ENG-602"] # known child work (sub-issues / project-member issues / blocked_by parentage) — see S15
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
If the caller passes only an identifier, fetch the item via `
|
|
68
|
+
If the caller passes only an identifier, fetch the item via `lisa:linear-access operation: get-issue` (Issue) or `lisa:linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa:linear-read-issue`) so S15 can classify the item — then run gates.
|
|
69
69
|
|
|
70
70
|
## Gates
|
|
71
71
|
|
|
@@ -235,28 +235,28 @@ Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle.
|
|
|
235
235
|
|
|
236
236
|
#### F1 — Issue type valid in team
|
|
237
237
|
|
|
238
|
-
For Issue types: confirm the team supports the issue type via `
|
|
238
|
+
For Issue types: confirm the team supports the issue type via `lisa:linear-access operation: get-team`. Linear issue types are typically per-team; check that the requested type exists.
|
|
239
239
|
|
|
240
240
|
For Epic (Project): confirm the team allows projects.
|
|
241
241
|
|
|
242
242
|
#### F2 — Project parent exists and is in same team
|
|
243
243
|
|
|
244
|
-
When `parent_project_id` is set: fetch via `
|
|
244
|
+
When `parent_project_id` is set: fetch via `lisa:linear-access operation: get-project`, confirm it exists and belongs to the configured team.
|
|
245
245
|
|
|
246
|
-
When `parent_issue_id` is set (Sub-task case): fetch via `
|
|
246
|
+
When `parent_issue_id` is set (Sub-task case): fetch via `lisa:linear-access operation: get-issue`, confirm the issue is non-Sub-task and in the same team / project.
|
|
247
247
|
|
|
248
248
|
#### F3 — Linked items exist
|
|
249
249
|
|
|
250
|
-
For each entry in `relations`, call `
|
|
250
|
+
For each entry in `relations`, call `lisa:linear-access operation: get-issue` to confirm the identifier resolves. Flag broken identifiers.
|
|
251
251
|
|
|
252
252
|
#### F4 — Required labels exist (or can be created)
|
|
253
253
|
|
|
254
|
-
For each label referenced (`status:*`, `component:<name>`, `prd-*`), confirm via `
|
|
254
|
+
For each label referenced (`status:*`, `component:<name>`, `prd-*`), confirm via `lisa:linear-access operation: list-issue-labels` (or `lisa:linear-access operation: list-project-labels` for Project labels) that it exists OR is creatable. Linear labels are team-scoped or workspace-scoped; flag if the requested scope is wrong.
|
|
255
255
|
|
|
256
256
|
## Execution
|
|
257
257
|
|
|
258
258
|
1. Parse `$ARGUMENTS`. If it's an identifier, fetch the item and derive the spec from the fetched fields — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa:linear-read-issue`) so S15 can classify the item. Otherwise parse the YAML spec.
|
|
259
|
-
2. Resolve team ID via `
|
|
259
|
+
2. Resolve team ID via `lisa:linear-access operation: list-teams({query: <teamKey>})` if any feasibility gate will run.
|
|
260
260
|
3. Run every Specification gate in order. Collect PASS / FAIL / N/A with a one-line reason.
|
|
261
261
|
4. Unless the caller passed `--spec-only` (dry-run), run every Feasibility gate. Collect results.
|
|
262
262
|
5. Emit the report below.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-verify
|
|
3
3
|
description: "Verifies a Linear work item meets organizational standards by fetching the live item and running it through lisa:linear-validate-issue. Catches anything dropped or reformatted on write — same gates as the pre-write check, but applied to what Linear actually stored. Read-only."
|
|
4
|
-
allowed-tools: ["Bash", "Skill"
|
|
4
|
+
allowed-tools: ["Bash", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Verify Linear Work Item: $ARGUMENTS
|
|
@@ -25,14 +25,14 @@ If `$ARGUMENTS` is not parseable, stop and report.
|
|
|
25
25
|
## Phase 1 — Resolve Context
|
|
26
26
|
|
|
27
27
|
1. Read `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
|
|
28
|
-
2. Resolve team ID via `
|
|
28
|
+
2. Resolve team ID via `lisa:linear-access operation: list-teams({query: <teamKey>})`.
|
|
29
29
|
3. Determine entity type from the identifier shape:
|
|
30
30
|
- `<TEAM>-<n>` → Issue
|
|
31
31
|
- URL containing `/project/<slug>-<id>` → Project
|
|
32
32
|
|
|
33
33
|
## Phase 2 — Fetch Live State
|
|
34
34
|
|
|
35
|
-
Call `
|
|
35
|
+
Call `lisa:linear-access operation: get-issue` (for Issues) or `lisa:linear-access operation: get-project` (for Projects). Capture every field, label, relation, comment, milestone, and project membership.
|
|
36
36
|
|
|
37
37
|
## Phase 3 — Delegate to Validator
|
|
38
38
|
|