@codyswann/lisa 2.177.0 → 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/reference/repo-scope-split.md +1 -1
- package/plugins/lisa/skills/intake/SKILL.md +2 -2
- 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/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/setup-linear/SKILL.md +5 -5
- 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/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/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/setup-linear/SKILL.md +5 -5
- 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/reference/repo-scope-split.md +1 -1
- package/plugins/lisa-copilot/skills/intake/SKILL.md +2 -2
- 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/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/setup-linear/SKILL.md +5 -5
- 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/repo-scope-split-reference.mdc +1 -1
- package/plugins/lisa-cursor/skills/intake/SKILL.md +2 -2
- 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/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/setup-linear/SKILL.md +5 -5
- 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/reference/repo-scope-split.md +1 -1
- package/plugins/src/base/skills/intake/SKILL.md +2 -2
- 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/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/setup-linear/SKILL.md +5 -5
- package/plugins/src/base/skills/tracker-journey/SKILL.md +1 -1
- package/plugins/src/base/skills/verify-prd/SKILL.md +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-write-prd
|
|
3
3
|
description: "Creates or idempotently updates a PRD as a Linear Project carrying exactly one PRD lifecycle project-label (`prd-draft` by default, or `prd-ready` when initial_role is ready so lisa:linear-prd-intake auto-claims it). The Linear PRD-source writer behind lisa:prd-source-write. Dedupes by a stable marker embedded in the Project description (matched by marker, never by name). Uses the Linear MCP."
|
|
4
|
-
allowed-tools: ["Skill", "Bash"
|
|
4
|
+
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Write Linear PRD: $ARGUMENTS
|
|
@@ -37,17 +37,17 @@ PROGRESSED=("$PRD_IN_REVIEW" "$PRD_BLOCKED" "$PRD_TICKETED" "$PRD_SHIPPED" "$PRD
|
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
Resolve the target project-label from `initial_role`: `ready` → `$PRD_READY`, else `$PRD_DRAFT`.
|
|
40
|
-
Resolve its label id via `
|
|
41
|
-
`
|
|
40
|
+
Resolve its label id via `lisa:linear-access operation: list-project-labels` (create via
|
|
41
|
+
`lisa:linear-access operation: create-project-label` if missing).
|
|
42
42
|
|
|
43
43
|
## Phase 2 — Dedupe by marker (search before create)
|
|
44
44
|
|
|
45
45
|
The `marker` is embedded in the Project description. Find an existing Project carrying it — match the
|
|
46
46
|
marker, **never** the project name:
|
|
47
47
|
|
|
48
|
-
1. `
|
|
48
|
+
1. `lisa:linear-access operation: list-projects` scoped to the team/workspace (filtered by the `prd-*` label
|
|
49
49
|
set when supported), then inspect each candidate's description via
|
|
50
|
-
`
|
|
50
|
+
`lisa:linear-access operation: get-project` for the marker. If `source_ref` was passed, target it directly.
|
|
51
51
|
2. If a Project with the marker exists → **update**; else → **create**.
|
|
52
52
|
|
|
53
53
|
## Phase 3 — Create or update
|
|
@@ -59,7 +59,7 @@ dedupe. If the live Project description already contains the canonical managed `
|
|
|
59
59
|
section, preserve it verbatim unless the caller intentionally supplied an updated canonical section;
|
|
60
60
|
use the shared `usage-accounting` serializer/merge path rather than hand-editing ledger rows.
|
|
61
61
|
|
|
62
|
-
**CREATE:** `
|
|
62
|
+
**CREATE:** `lisa:linear-access operation: save-project` with:
|
|
63
63
|
- `name`: `$TITLE`
|
|
64
64
|
- `description`: the marker-normalized full PRD markdown
|
|
65
65
|
- `teamIds`: `[<resolved team id>]`
|
|
@@ -162,7 +162,7 @@ Linear models top-level grouping two ways, and the PRD's own entity type decides
|
|
|
162
162
|
- **PRD is a Linear Project** (the common case — a PRD project groups its generated work). Generated top-level **Issues** are attached to the PRD by setting their `projectId` to the PRD Project's id. The Project *is* the native parent of its Issues; no separate parent-issue link is needed.
|
|
163
163
|
- **PRD is a Linear Issue** (a parent issue, not a project). Generated top-level Issues are attached as native **sub-Issues** of the PRD Issue by setting their `parentId` to the PRD Issue's id.
|
|
164
164
|
|
|
165
|
-
Either way the write surface is `
|
|
165
|
+
Either way the write surface is `lisa:linear-access operation: save-issue` with the single relevant field (`projectId` or `parentId`) — the same primitive `lisa:linear-write-issue` uses to set a Story's `projectId` (Epic Project) and a Sub-task's `parentId` (Story Issue). Send **only** that field on update; Linear treats `save_issue` as a full overwrite of the fields named (`lisa:linear-write-issue` Phase 6 UPDATE), so resending other fields would clobber them.
|
|
166
166
|
|
|
167
167
|
### What gets linked — generated top-level work only
|
|
168
168
|
|
|
@@ -178,14 +178,14 @@ So if the PRD generated `Epic E1 (Project) → Story S1 (Issue) → Sub-task T1
|
|
|
178
178
|
The dedupe key is **child-ref identity** — the Linear issue/project identifier (e.g. `TEAM-123`) or its UUID — per the `prd-lifecycle-rollup` idempotency rule. Before attaching any child, read the PRD's current children and skip any child already attached, so re-running `prd-backlink` never duplicates a relationship and is a no-op when everything is already attached.
|
|
179
179
|
|
|
180
180
|
1. **Read the PRD's existing children** (the same reads `lisa:linear-read-issue` uses for Project members and sub-Issues):
|
|
181
|
-
- PRD-as-Project → `
|
|
182
|
-
- PRD-as-Issue → `
|
|
181
|
+
- PRD-as-Project → `lisa:linear-access operation: list-issues({project: <prd_project_id>})` and collect each member Issue's identifier/UUID.
|
|
182
|
+
- PRD-as-Issue → `lisa:linear-access operation: get-issue({id: <prd_issue_id>})` and collect its sub-Issue identifiers/UUIDs.
|
|
183
183
|
|
|
184
184
|
The resulting identifiers/UUIDs are the existing child-ref set.
|
|
185
185
|
|
|
186
186
|
2. **For each generated top-level item** whose child-ref is **not** already in that set, attach it with a single-field `save_issue`:
|
|
187
|
-
- PRD-as-Project → `
|
|
188
|
-
- PRD-as-Issue → `
|
|
187
|
+
- PRD-as-Project → `lisa:linear-access operation: save-issue({id: <child_id>, projectId: <prd_project_id>})`.
|
|
188
|
+
- PRD-as-Issue → `lisa:linear-access operation: save-issue({id: <child_id>, parentId: <prd_issue_id>})`.
|
|
189
189
|
|
|
190
190
|
A child already in the existing-children set is a no-op — do not issue the `save_issue` call for it. Reading the child's current `projectId`/`parentId` and finding it already equal to the PRD's id is the same no-op (attaching to the value it already holds changes nothing).
|
|
191
191
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: prd-ticket-coverage
|
|
3
3
|
description: "Verifies that every requirement in a PRD (Notion, Confluence, Linear, or GitHub Issues) is covered by at least one created destination ticket (JIRA, GitHub Issues, or Linear) — no silent drops. Parses the PRD into atomic items (goals, user stories, functional/non-functional requirements, acceptance criteria, important notes), maps each to the created tickets, and produces a coverage matrix and verdict (COMPLETE / COMPLETE_WITH_SCOPE_CREEP / GAPS_FOUND / NO_TICKETS_FOUND). Used by notion-prd-intake / confluence-prd-intake / linear-prd-intake / github-prd-intake post-write to gate the Ticketed transition; can also be invoked standalone for after-the-fact audits."
|
|
4
|
-
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# PRD Ticket Coverage Audit: $ARGUMENTS
|
|
@@ -15,7 +15,7 @@ The PRD URL can be a **Notion page URL**, a **Confluence page URL**, a **Linear
|
|
|
15
15
|
|
|
16
16
|
- `notion.so` / `notion.site` → Notion. Fetch with `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) and `mcp__claude_ai_Notion__notion-get-comments`.
|
|
17
17
|
- Atlassian Confluence host (e.g. `*.atlassian.net/wiki/...`) → Confluence. Fetch with `mcp__atlassian__getConfluencePage`, `mcp__atlassian__getConfluencePageDescendants` (for child epic pages), `mcp__atlassian__getConfluencePageFooterComments`, `mcp__atlassian__getConfluencePageInlineComments`, and `mcp__atlassian__getConfluenceCommentChildren` for nested replies.
|
|
18
|
-
- `linear.app` host → Linear. Fetch with `
|
|
18
|
+
- `linear.app` host → Linear. Fetch with `lisa:linear-access operation: get-project` (capture description, labels, state, attached resources), `lisa:linear-access operation: list-documents({projectId})` + `lisa:linear-access operation: get-document` per attached document, `lisa:linear-access operation: list-issues({project})` for sub-issues that act as child epics / user stories, and `lisa:linear-access operation: list-comments({issueId})` per sub-issue for decisions and engineering notes. Comments do not exist on the project itself in the MCP surface — sub-issue comments are the substitute.
|
|
19
19
|
- `github.com` host → GitHub Issues. Fetch with the `gh` CLI (no GitHub MCP — Lisa uses the CLI exclusively for GitHub):
|
|
20
20
|
- `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,milestone,assignees,author,createdAt,comments,url` for the PRD body and comments.
|
|
21
21
|
- `gh api graphql` with the `subIssues` field for native sub-issue children (these stand in for child epic pages — see `lisa:github-read-issue` Phase 3 for the exact query).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: repair-intake
|
|
3
3
|
description: "Vendor-agnostic repair scanner — the recovery counterpart to lisa:intake. Where intake claims `ready` work, repair-intake finds work that got stuck or was left half-closed: items left in `blocked`, stalled in an in-progress role (build `claimed`, PRD `in_review`), terminal-labeled items that are still natively open, and rollup/container items whose children are all terminal but whose parent is not closed out. Scans the same queues lisa:intake serves (Notion / Confluence / Linear / GitHub PRD databases; JIRA / GitHub / Linear build queues), enumerates candidates up to `max_candidates`, and repairs every materially actionable one in that bounded set: resumes stalled in-progress work IN PLACE (build → the vendor agent + the scanner's post-agent transition; PRD → the source `*-to-tracker` dry-run validate→route pipeline) — but for a stalled build it first diagnoses the PR/deploy state: a PR that already merged is recovered by applying the env transition build-intake never got to (no re-dispatch); a PR that is merely behind its base is re-synced in place via `gh pr update-branch` so the already-enabled auto-merge can land (a clean rebase needs no human); and only a PR that cannot merge for a non-mechanical reason (true conflict, failing checks, unaddressed CodeRabbit/changes-requested) or a failed deploy gets a build-ready leaf fix ticket with the item moved to `blocked` (blocked by that ticket) rather than re-dispatching, re-validates blocked PRDs when new clarifying answers exist, re-dispatches blocked build items whose `is blocked by` dependencies have since closed OR whose validation/quality-gate self-block now re-validates PASS (re-running `lisa:tracker-validate` against current content — the build mirror of PRD re-validation), performs terminal native closure for terminal-labeled items, reconciles parent rollups to their derived state per leaf-only-lifecycle — including the intermediate-env case (e.g. all children at `On Stg` → parent `On Stg`) and a container wrongly stuck in `ready` — and closes out rollups whose associated child work is fully terminal. Idempotent, loop-protected via a [lisa-repair-intake] marker + state fingerprint + backoff. Never mutates product-owned states (`draft`, `verified`) and never touches `ready` leaves (a container wrongly carrying `ready` is the one exception — it is rolled up from its children, since `ready` on a parent is an invariant violation, not intake's claim signal). Designed as a /schedule cron target running alongside lisa:intake."
|
|
4
|
-
allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit"
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Repair Intake: $ARGUMENTS
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: setup-linear
|
|
3
3
|
description: "Configure Linear as the destination tracker and/or the PRD source for this project. Verifies Linear access (MCP OAuth or a personal API key in OS keychain), resolves the workspace slug and team key, scaffolds the build-queue issue-label namespace (`status:*`) when Linear is the tracker and/or the PRD-lifecycle project-label namespace (`prd-*` + issue-level sentinel) when Linear is the PRD source, writes the `linear` section into `.lisa.config.json`, and offers to set top-level `tracker: \"linear\"` and/or `source: \"linear\"`. Idempotent — re-running updates the existing section and reuses existing labels. No /lisa:setup:atlassian prerequisite."
|
|
4
|
-
allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion", "mcp__linear-server__authenticate", "mcp__linear-server__complete_authentication"
|
|
4
|
+
allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion", "mcp__linear-server__authenticate", "mcp__linear-server__complete_authentication"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Setup Linear: $ARGUMENTS
|
|
@@ -40,7 +40,7 @@ The role answer drives Step 3 (which label namespaces to scaffold) and whether `
|
|
|
40
40
|
Verify the Linear MCP is authenticated to the right workspace by listing teams:
|
|
41
41
|
|
|
42
42
|
```text
|
|
43
|
-
|
|
43
|
+
lisa:linear-access operation: list-teams({})
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
If it errors / returns nothing, run `mcp__linear-server__authenticate` and have the user complete OAuth in the browser, then `mcp__linear-server__complete_authentication`, then re-list. A non-empty team list confirms the MCP is authed to a readable workspace.
|
|
@@ -137,7 +137,7 @@ echo "Linear key validated. Org: $(echo "$VIEWER" | jq -r '.data.organization.ur
|
|
|
137
137
|
### Step 2 — Resolve workspace slug + team key
|
|
138
138
|
|
|
139
139
|
- **Workspace slug**: honor `--workspace=<slug>`. Otherwise derive from the validated identity — the GraphQL `organization.urlKey` (API path) or the team list's workspace (MCP path). Confirm with the user; this slug is the keychain `account` key and the multi-workspace disambiguator.
|
|
140
|
-
- **Team key** (required when Linear is the **tracker**): honor `--team=<KEY>`. Otherwise enumerate teams via `
|
|
140
|
+
- **Team key** (required when Linear is the **tracker**): honor `--team=<KEY>`. Otherwise enumerate teams via `lisa:linear-access operation: list-teams({})` (or the GraphQL `teams` query) and present them via `AskUserQuestion` (label = team key, description = team name) for the user to pick the team that owns lisa's destination Issues. If Linear is source-only, `teamKey` is optional — skip unless the user wants to pin a team scope.
|
|
141
141
|
|
|
142
142
|
### Step 3 — Scaffold the lifecycle label namespaces
|
|
143
143
|
|
|
@@ -154,7 +154,7 @@ read_role() { # $1=namespace (build|prd) $2=role $3=default
|
|
|
154
154
|
|
|
155
155
|
#### 3a. Build-queue labels — ISSUE labels (only if Linear is the tracker)
|
|
156
156
|
|
|
157
|
-
Probe with `
|
|
157
|
+
Probe with `lisa:linear-access operation: list-issue-labels` (scoped to the team). For each role's resolved name, create it via `lisa:linear-access operation: create-issue-label` only if absent. The `done` role is env-keyed — create all three defaults; collapse to a single string in config later if the project's terminal state is env-independent.
|
|
158
158
|
|
|
159
159
|
| Role | Default |
|
|
160
160
|
|------|---------|
|
|
@@ -168,7 +168,7 @@ Probe with `mcp__linear-server__list_issue_labels` (scoped to the team). For eac
|
|
|
168
168
|
|
|
169
169
|
#### 3b. PRD-lifecycle labels — PROJECT labels (only if Linear is the PRD source)
|
|
170
170
|
|
|
171
|
-
Probe with `
|
|
171
|
+
Probe with `lisa:linear-access operation: list-project-labels`. Create missing ones via `lisa:linear-access operation: create-project-label`. This probe-then-create is find-or-create per label: a label already present is reused untouched, so re-running never duplicates `prd-*`. These are a **separate label kind** from issue labels — creating an issue label of the same name will NOT work for the PRD flow.
|
|
172
172
|
|
|
173
173
|
`prd-verified` is the terminal lifecycle state after `prd-shipped` (the `verified` role from config-resolution, #591): `/lisa:verify-prd` transitions a Linear PRD project into it once the shipped product has been empirically verified against the PRD. Scaffold it through the same find-or-create path as every other `prd-*` row.
|
|
174
174
|
|
|
@@ -22,5 +22,5 @@ See the `config-resolution` rule for configuration and dispatch table.
|
|
|
22
22
|
|
|
23
23
|
## Rules
|
|
24
24
|
|
|
25
|
-
- The journey content is identical across vendors; only the parser source differs (the JIRA vendor reads description via Atlassian MCP; the GitHub vendor reads body via `gh issue view --json body`; the Linear vendor reads description via `
|
|
25
|
+
- The journey content is identical across vendors; only the parser source differs (the JIRA vendor reads description via Atlassian MCP; the GitHub vendor reads body via `gh issue view --json body`; the Linear vendor reads description via `lisa:linear-access operation: get-issue`).
|
|
26
26
|
- Evidence posting always goes through `lisa:tracker-evidence` — never bypass.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: verify-prd
|
|
3
3
|
description: "Initiative-level PRD acceptance gate. Given a PRD ref/URL (GitHub Issue, Linear project/issue, Notion page, Confluence page, or JIRA issue), resolves the source vendor, reads the PRD body and its generated top-level child work set via the prd-lifecycle-rollup contract (native hierarchy first, machine-readable generated-work section fallback — never reimplementing child enumeration), and confirms every required generated top-level work item is terminal before any verification runs. If any required top-level child is non-terminal, it reports the incomplete child set and STOPS without verifying or transitioning the PRD. When the guard passes, it runs spec-conformance against the original PRD requirements (via the spec-conformance skill) plus empirical verification appropriate to the shipped surface (via verification-lifecycle). On a CONFORMS verdict with all empirical checks passing it runs the PASS path: transitions the PRD shipped → verified and posts verification evidence. On a PARTIAL/DIVERGES conformance verdict or any failing empirical check it runs the self-healing FAIL path: it re-opens the PRD shipped → ticketed (NEVER blocked), creates build-ready fix tickets (via tracker-write with build_ready: true) for each missing/incorrect/divergent behavior — registered as the PRD's generated work — and posts a product-readable failure report (with a verification-round count) naming which requirements/ACs failed with observed-vs-expected evidence. The fix tickets auto-build, rollup re-ships the PRD once they are terminal, and a later intake cycle re-verifies — the loop closes itself and never auto-halts. Re-runs are idempotent: evidence/failure-report comments are regenerated in place via a stable sentinel marker (never appended, round incremented), fix tickets are deduped by a stable PRD-ref + requirement marker (referenced/updated, never duplicated), and the lifecycle transition is a no-op when the PRD already carries the target role (exactly one lifecycle label/status remains) — per the prd-lifecycle-rollup idempotency dedupe key (match by stable ref, never by title)."
|
|
4
|
-
allowed-tools: ["Skill", "Bash", "Read", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# PRD-level Verification: $ARGUMENTS
|
|
@@ -38,7 +38,7 @@ Detect the vendor from `$ARGUMENTS` the same way `prd-ticket-coverage` / `prd-ba
|
|
|
38
38
|
| Input shape | Vendor | Read surface |
|
|
39
39
|
|---|---|---|
|
|
40
40
|
| `github.com/<org>/<repo>/issues/<n>` or `<org>/<repo>#<n>` | **GitHub Issues** | `gh` CLI (Lisa uses the CLI exclusively for GitHub — no GitHub MCP) |
|
|
41
|
-
| `linear.app/...` | **Linear** | `
|
|
41
|
+
| `linear.app/...` | **Linear** | `lisa:linear-access operation: get-project` / `lisa:linear-access operation: get-issue` |
|
|
42
42
|
| `notion.so` / `notion.site` | **Notion** | `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) |
|
|
43
43
|
| `*.atlassian.net/wiki/...` | **Confluence** | `mcp__atlassian__getConfluencePage` (+ descendants) |
|
|
44
44
|
| JIRA issue key (e.g. `PROJ-123`) or `*.atlassian.net/browse/...` | **JIRA** | `mcp__atlassian__getJiraIssue` |
|
|
@@ -51,9 +51,9 @@ Resolve build labels from `.lisa.config.json` `linear.labels.build.*` (defaults:
|
|
|
51
51
|
|
|
52
52
|
If `linear-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the creator:
|
|
53
53
|
1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing section — Technical Approach, Out of Scope, Gherkin acceptance criteria, expected-vs-actual, Repository, Relationship Search (run the git + Linear search, don't fabricate it), a Validation Journey **draft** via `linear-add-journey`, and a recommended Target Backend Environment — from the item's own content (title, description, screenshots, design links, repro steps) plus the codebase. Write it into the description via `linear-write-issue` as clearly-labeled assumptions/recommendations (never overwrite the creator's prose), then re-run `linear-verify`. Whatever the agent could author is now structured spec; only genuinely human-only inputs remain.
|
|
54
|
-
2. Update labels via `
|
|
54
|
+
2. Update labels via `lisa:linear-access operation: save-issue`: remove the current build label, add the configured `blocked` label **and** the configured `human_needed` marker label. (Create either label via `create_issue_label` if needed.) Even after the agent drafted what it could, a pre-flight gate failure bounces the item back to its creator because it still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision — so the marker tells a human scanning the board which blocked items are waiting on them. The marker is additive to `blocked`, not a replacement. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
|
|
55
55
|
3. Reassign the item to the **Issue creator** (the human who filed it — Linear's `creator` field).
|
|
56
|
-
4. Post the **confirmation comment** from the `pre-flight-autofill` rule via `
|
|
56
|
+
4. Post the **confirmation comment** from the `pre-flight-autofill` rule via `lisa:linear-access operation: save-comment`, **not** a bare remediation checklist: disclose it is a Claude draft, give one line per drafted section naming the key assumption made, list any remaining human-only item as a specific question with a recommended default, and close with *"review the drafted sections, correct anything wrong, then flip back to Ready and it builds — or reply with corrections."* Prefix with `[{repo}]`.
|
|
57
57
|
5. Stop. Do not run triage, do not delegate to a flow, do not start work.
|
|
58
58
|
|
|
59
59
|
**Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the creator: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this item to one repo, create a sibling Issue per additional repo cloning its metadata (same `projectId`), add the producer→consumer blocking relation, comment on the original, then re-run `linear-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting item passes.
|
|
@@ -130,6 +130,6 @@ The label transitions ARE the canonical signal. The native `state` field stays a
|
|
|
130
130
|
|
|
131
131
|
- Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the description as labeled assumptions), then update labels to the configured `blocked` label, add the configured `human_needed` marker label (`linear.labels.build.human_needed`, default `human-needed`), and reassign to the creator with a confirmation comment. Every other status change remains a label-driven suggestion.
|
|
132
132
|
- Always read the full item graph via `linear-read-issue` before determining intent — don't rely on type labels alone.
|
|
133
|
-
- Never create or materially edit an item by calling MCP write tools directly — always delegate to `linear-write-issue` so relationships, Gherkin criteria, and metadata gates are enforced. Two explicit exceptions are permitted: (1) the Step 2 pre-flight failure path (when `linear-verify` returns `FAIL`) may call `
|
|
133
|
+
- Never create or materially edit an item by calling MCP write tools directly — always delegate to `linear-write-issue` so relationships, Gherkin criteria, and metadata gates are enforced. Two explicit exceptions are permitted: (1) the Step 2 pre-flight failure path (when `linear-verify` returns `FAIL`) may call `lisa:linear-access operation: save-issue` and `lisa:linear-access operation: save-comment` directly to set `status:blocked`, add the configured `human_needed` marker label, and reassign to the creator — this narrow exception is already granted by the rule above; (2) the Step 3 triage path may call `lisa:linear-access operation: save-comment` to post triage findings and `lisa:linear-access operation: save-issue` to add the `claude-triaged-{repo}` label — these are lightweight metadata updates that do not create or materially edit ticket content and therefore do not need to route through `linear-write-issue`.
|
|
134
134
|
- If sign-in credentials are in the item, extract and pass them to the flow. If the item touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
135
135
|
- If the item has a Validation Journey section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the description.
|
|
@@ -69,4 +69,4 @@ The procedure is vendor-neutral; the create + link + edit mechanics differ:
|
|
|
69
69
|
|
|
70
70
|
- **JIRA** — create via `mcp__atlassian__createJiraIssue` (clone fields, set the same epic parent); link via `mcp__atlassian__createIssueLink` with `Blocks` / `is blocked by` (resolve names via `mcp__atlassian__getIssueLinkTypes`); narrow the original via `mcp__atlassian__editJiraIssue`; comment via `mcp__atlassian__addCommentToJiraIssue`. See `jira-write-ticket` Phase 6.
|
|
71
71
|
- **GitHub** — create the sibling issue with the same labels and parent sub-issue; encode the dependency in the body (`Blocked by #<n>` / `Blocks #<n>`) and via the sub-issue/parent graph where used; edit the original's body to narrow scope. See `github-write-issue` Phase 6.
|
|
72
|
-
- **Linear** — create via `
|
|
72
|
+
- **Linear** — create via `lisa:linear-access operation: save-issue` (clone fields, set the same `projectId`); add a blocking relation via the `relations` field or a paired relation call; edit the original to narrow scope. See `linear-write-issue` Phase 6.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: intake
|
|
3
3
|
description: "Vendor-agnostic scanner for Ready queues. Given a Notion PRD database URL → finds the first Ready PRD and runs lisa:plan. Given a Confluence space or parent page URL → finds the first prd-ready PRD and runs lisa:plan. Given a Linear workspace URL or team key → finds the first prd-ready Linear project and runs lisa:plan. Given a GitHub repo URL or `org/repo` token → finds the first prd-ready GitHub issue and runs lisa:plan. Given a JIRA project key or JQL filter → finds the first Ready ticket and runs lisa:implement. Given a GitHub repo URL or `org/repo` token when `tracker = github` → finds the first `status:ready` issue and runs lisa:implement. On the PRD side it also closes the loop: each cycle rolls a ticketed PRD up to shipped and dispatches lisa:verify-prd for one shipped PRD (shipped → verified on pass; on fail, re-opened shipped → ticketed with build-ready fix tickets that auto-build and re-verify — never blocked). Designed as the cron target for /schedule — one eligible item per invocation, exits cleanly on empty. Symmetric counterpart to the single-item lisa:plan and lisa:implement skills."
|
|
4
|
-
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue"
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Intake: $ARGUMENTS
|
|
@@ -87,7 +87,7 @@ Disambiguation rules:
|
|
|
87
87
|
- The literal token `linear` (case-insensitive) → Linear queue, default workspace from `linear.workspace` in `.lisa.config.json`.
|
|
88
88
|
- A `github.com` URL or an `<org>/<repo>` token → GitHub queue. The PRD-vs-build dispatch is determined by which label namespace the repo currently uses: PRD-side (`prd-ready`) → `lisa:github-prd-intake`; build-side (`status:ready` and `tracker = github` in `.lisa.config.json`) → `lisa:tracker-build-intake`. If both namespaces are present, prefer the PRD queue unless `$ARGUMENTS` includes `intake_mode=build`. If the URL points at a single issue (`https://github.com/<org>/<repo>/issues/<n>`), this skill is batch-only — direct the caller to `lisa:plan` (for a single PRD issue) or `lisa:implement` (for a single build issue).
|
|
89
89
|
- The literal token `github` (case-insensitive) → GitHub queue, default repo from `.lisa.config.json` `github.org` / `github.repo`.
|
|
90
|
-
- A bare alphanumeric token that matches the JIRA project key regex (uppercase letters / digits / hyphen, ≤10 chars — typically the value of `jira.project` in `.lisa.config.json`) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. If it does not resolve as a Confluence space key either, attempt to resolve as a Linear team key via `
|
|
90
|
+
- A bare alphanumeric token that matches the JIRA project key regex (uppercase letters / digits / hyphen, ≤10 chars — typically the value of `jira.project` in `.lisa.config.json`) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. If it does not resolve as a Confluence space key either, attempt to resolve as a Linear team key via `lisa:linear-access operation: list-teams({query})` before giving up. The only time to stop and ask is when the token resolves to more than one of {JIRA project, Confluence space, Linear team, GitHub `org/repo`} simultaneously — in that overlap the user must disambiguate which queue to scan.
|
|
91
91
|
- An `<org>/<repo>` token (slash-separated, both halves are GitHub-name-shaped) → GitHub queue.
|
|
92
92
|
- A string starting with `project = ` or containing JQL operators (`AND`, `OR`, `=`, `!=`, `~`, etc.) → JQL filter.
|
|
93
93
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-add-journey
|
|
3
3
|
description: "Add a Validation Journey section to an existing Linear Issue by analyzing the change type and generating appropriate verification steps with evidence markers. Linear counterpart of lisa:jira-add-journey."
|
|
4
|
-
allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"
|
|
4
|
+
allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Add Validation Journey to Existing Linear Issue
|
|
@@ -22,7 +22,7 @@ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.loca
|
|
|
22
22
|
|
|
23
23
|
### Step 1: Read the Issue
|
|
24
24
|
|
|
25
|
-
Fetch via `
|
|
25
|
+
Fetch via `lisa:linear-access operation: get-issue` and extract: title, description (markdown), labels, project, parent, attachments.
|
|
26
26
|
|
|
27
27
|
### Step 2: Check for Existing Journey
|
|
28
28
|
|
|
@@ -91,7 +91,7 @@ Display the drafted journey and ask for confirmation before appending.
|
|
|
91
91
|
|
|
92
92
|
### Step 7: Append to Issue Description
|
|
93
93
|
|
|
94
|
-
After approval, fetch the current description, append the new Validation Journey section, and update via `
|
|
94
|
+
After approval, fetch the current description, append the new Validation Journey section, and update via `lisa:linear-access operation: save-issue({id, description: <new-description>})`. Preserve all existing description content — never overwrite.
|
|
95
95
|
|
|
96
96
|
### Step 8: Verify
|
|
97
97
|
|
|
@@ -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
|