@codyswann/lisa 2.4.0 → 2.5.1

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.
Files changed (38) hide show
  1. package/cdk/copy-overwrite/tsconfig.json +1 -4
  2. package/dist/configs/eslint/base.d.ts.map +1 -1
  3. package/dist/configs/jest/base.d.ts.map +1 -1
  4. package/dist/configs/jest/cdk.d.ts.map +1 -1
  5. package/dist/configs/jest/expo.d.ts.map +1 -1
  6. package/dist/configs/jest/nestjs.d.ts.map +1 -1
  7. package/dist/configs/jest/typescript.d.ts.map +1 -1
  8. package/dist/configs/vitest/base.d.ts.map +1 -1
  9. package/dist/configs/vitest/cdk.d.ts.map +1 -1
  10. package/dist/configs/vitest/nestjs.d.ts.map +1 -1
  11. package/dist/configs/vitest/typescript.d.ts.map +1 -1
  12. package/dist/utils/fibonacci.d.ts.map +1 -1
  13. package/expo/copy-overwrite/tsconfig.expo.json +0 -1
  14. package/expo/copy-overwrite/tsconfig.json +1 -4
  15. package/nestjs/copy-overwrite/tsconfig.json +1 -4
  16. package/nestjs/copy-overwrite/tsconfig.nestjs.json +0 -1
  17. package/package.json +3 -3
  18. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa/agents/linear-prd-intake.md +64 -0
  20. package/plugins/lisa/commands/intake.md +2 -2
  21. package/plugins/lisa/skills/intake/SKILL.md +13 -5
  22. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +275 -0
  23. package/plugins/lisa/skills/linear-to-jira/SKILL.md +314 -0
  24. package/plugins/lisa/skills/plan/SKILL.md +5 -3
  25. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +12 -9
  26. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  31. package/plugins/src/base/agents/linear-prd-intake.md +64 -0
  32. package/plugins/src/base/commands/intake.md +2 -2
  33. package/plugins/src/base/skills/intake/SKILL.md +13 -5
  34. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +275 -0
  35. package/plugins/src/base/skills/linear-to-jira/SKILL.md +314 -0
  36. package/plugins/src/base/skills/plan/SKILL.md +5 -3
  37. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +12 -9
  38. package/typescript/copy-overwrite/tsconfig.json +1 -4
@@ -0,0 +1,314 @@
1
+ ---
2
+ name: linear-to-jira
3
+ description: >
4
+ Break down a Linear PRD (a Linear Project) into JIRA epics, stories, and sub-tasks. Use this skill
5
+ whenever the user shares a Linear project URL and wants it converted into JIRA tickets, or asks to
6
+ "break down this Linear project", "create tickets from a Linear project", "turn this Linear PRD into
7
+ JIRA", or similar. This skill mirrors `lisa:notion-to-jira` and `lisa:confluence-to-jira` for projects
8
+ whose PRDs live in Linear — the workflow, gates, dry-run mode, and validation rules are identical;
9
+ only the source-of-truth tool surface differs (Linear MCP instead of Notion / Confluence MCP).
10
+ allowed-tools: ["Skill", "Bash", "mcp__linear-server__get_project", "mcp__linear-server__list_projects", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_comments", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_teams", "mcp__atlassian__getJiraIssueRemoteIssueLinks"]
11
+ ---
12
+
13
+ # Linear PRD to JIRA Breakdown
14
+
15
+ Convert a Linear PRD (a Linear **Project**) into a structured JIRA ticket hierarchy: Epics > Stories > Sub-tasks.
16
+ Each sub-task is scoped to exactly one repo and includes an empirical verification plan.
17
+
18
+ This skill is the Linear counterpart of `lisa:notion-to-jira` and `lisa:confluence-to-jira`. The three skills share the same phases, gates, dry-run contract, and per-ticket validation logic. Only the PRD-side fetch tools differ. When changing workflow logic, change ALL THREE skills together so the source vendors stay behaviorally identical.
19
+
20
+ ## What "PRD" means in Linear
21
+
22
+ Linear has no native "PRD" entity. This skill treats a **Linear Project** as the PRD container:
23
+
24
+ - **Project description** (markdown) is the PRD body — equivalent to a Notion page body or a Confluence page body.
25
+ - **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.
26
+ - **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.
27
+ - **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.
28
+
29
+ ## Modes
30
+
31
+ This skill supports two modes, controlled by a `dry_run` flag in `$ARGUMENTS`:
32
+
33
+ - **`dry_run: false`** (default — full mode): run all phases, write tickets via `lisa:jira-write-ticket`, run the preservation gate, report.
34
+ - **`dry_run: true`** (planning + validation only — no writes): run Phases 1, 1.5, 1.6, 2, 3, 4 to plan the hierarchy and draft each ticket spec, then call `lisa:jira-validate-ticket` (with `--spec-only`) on every drafted ticket. Aggregate the per-ticket validator reports into a single dry-run report. **Skip Phase 5 (sub-task creation), Phase 5.5 (preservation gate), and Phase 6 (results report)** — none of those make sense without writes. Return the dry-run report so the caller (e.g. `lisa:linear-prd-intake`) can decide whether to proceed.
35
+
36
+ Dry-run output format is identical to `lisa:notion-to-jira`'s and `lisa:confluence-to-jira`'s. Reuse the same fields, including `prd_anchor` and `prd_section`. The only difference: Linear has no inline-comment selection-anchor primitive at the project level — `prd_anchor` is the anchor a downstream caller would use to *post a comment on the related sub-issue* (typically the issue identifier, e.g. `LIN-123`, scoped to a section heading). When the failure does not map to any single sub-issue, set `prd_anchor: null` and the caller falls back to its sentinel feedback channel.
37
+
38
+ ```text
39
+ ## linear-to-jira dry-run: <PRD title>
40
+
41
+ ### Planned hierarchy
42
+ - Epic: <summary>
43
+ prd_section: "<heading text from the project description / document that produced this epic>"
44
+ prd_anchor: "<linear issue identifier or null>"
45
+ - Story 1.1: <summary>
46
+ prd_section: "<heading or user-story line>"
47
+ prd_anchor: "<linear issue identifier or null>"
48
+ - Sub-task [<repo>]: <summary>
49
+ prd_section: "<heading or AC bullet>"
50
+ prd_anchor: "<linear issue identifier or null>"
51
+ - ...
52
+ - Story 1.2: ...
53
+
54
+ ### Per-ticket validation
55
+ - <ticket-id>: PASS | FAIL — <count> failures
56
+ prd_section: "<heading text>"
57
+ prd_anchor: "<linear issue identifier or null>"
58
+ failures:
59
+ - gate: <gate-id>
60
+ category: <category from validator>
61
+ product_relevant: <true|false>
62
+ what: <plain-language description from validator>
63
+ recommendation: <1–3 candidate resolutions from validator>
64
+
65
+ ### Verdict: PASS | FAIL
66
+ ### Total failures: <n>
67
+ ```
68
+
69
+ The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJiraIssue`. It also never modifies the source Linear project, never adds/removes labels, never edits sub-issues, and never posts comments — that is the orchestrating skill's responsibility (`lisa:linear-prd-intake`).
70
+
71
+ ## Hard Rule: All Writes Go Through `lisa:jira-write-ticket`
72
+
73
+ **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa:jira-write-ticket` skill. Never call `mcp__atlassian__createJiraIssue`, `mcp__atlassian__editJiraIssue`, `mcp__atlassian__createIssueLink`, or any other Atlassian write tool directly from this skill or from any sub-agent it spawns.**
74
+
75
+ `lisa:jira-write-ticket` enforces gates this skill does not:
76
+ - 3-audience description (Context / Technical Approach / Acceptance Criteria)
77
+ - Gherkin acceptance criteria
78
+ - Epic parent validation
79
+ - Explicit issue-link discovery (`blocks` / `is blocked by` / `relates to` / `duplicates` / `clones`)
80
+ - Single-repo scope check on Bug / Task / Sub-task
81
+ - Sign-in account and target environment recorded in description
82
+ - Post-create verification
83
+
84
+ Bypassing `lisa:jira-write-ticket` produces thin tickets that the rest of the lifecycle (triage, ticket-verify, journey, evidence) treats as broken. Atlassian reads in this skill are limited to the tools listed in `allowed-tools` (currently `getJiraIssueRemoteIssueLinks`) for the Phase 5.5 preservation gate. The Linear read tools listed in `allowed-tools` above are PRD-side only and never write.
85
+
86
+ ## Input
87
+
88
+ A Linear project URL, slug, or ID. The PRD is expected to have:
89
+ - A project with a description containing context, problems, and (optionally) a list of user stories
90
+ - One or more sub-issues that act as candidate epics or user stories
91
+ - Optionally one or more Linear documents attached to the project, with deeper spec content
92
+ - Issue comments capturing engineering notes and product decisions
93
+
94
+ URL parsing — Linear project URLs come in this shape:
95
+
96
+ ```text
97
+ https://linear.app/<workspace>/project/<slug>-<short-id>
98
+ https://linear.app/<workspace>/project/<slug>-<short-id>/<view>
99
+ ```
100
+
101
+ Extract the trailing `<short-id>` (the alphanumeric segment after the last `-` in the slug). If only a workspace or team URL is provided (no `/project/<slug>-<id>` segment), stop and report — single-PRD mode requires a specific project. The caller wanted `lisa:linear-prd-intake` (batch mode).
102
+
103
+ ## Configuration
104
+
105
+ This skill reads project-specific configuration from environment variables. If these are not set, ask the user for the values before proceeding.
106
+
107
+ | Variable | Purpose | Example |
108
+ |----------|---------|---------|
109
+ | `JIRA_PROJECT` | JIRA project key for ticket creation | `SE` |
110
+ | `JIRA_SERVER` | Atlassian instance URL (site host) | `mycompany.atlassian.net` |
111
+ | `LINEAR_WORKSPACE` | Linear workspace slug (used for URL synthesis on JIRA remote links) | `acme` |
112
+ | `E2E_TEST_PHONE` | Test user phone number for verification plans | `0000000099` |
113
+ | `E2E_TEST_OTP` | Test user OTP code | `555555` |
114
+ | `E2E_TEST_ORG` | Test organization name | `Arsenal` |
115
+ | `E2E_BASE_URL` | Frontend base URL for Playwright tests | `https://dev.example.io/` |
116
+ | `E2E_GRAPHQL_URL` | GraphQL API URL for curl verification | `https://gql.dev.example.io/graphql` |
117
+
118
+ If env vars are not available, ask the user to provide them explicitly before proceeding. Do not retrieve credentials from repository files or local agent settings.
119
+
120
+ ## Workflow
121
+
122
+ ### Phase 1: Fetch & Analyze the PRD
123
+
124
+ 1. **Resolve the project** via `mcp__linear-server__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.
125
+ 2. **Fetch attached Linear documents** via `mcp__linear-server__list_documents({projectId})` then `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.)
126
+ 3. **Identify candidate epics and user stories** from project sub-issues via `mcp__linear-server__list_issues({project: <id>})`. Capture identifier, title, description, labels, state, parent issue, and `parentId` chain so the issue hierarchy is reproducible.
127
+ 4. **Fetch full comments per sub-issue** via `mcp__linear-server__list_comments({issueId})` for every issue surfaced in step 3. Walk thread parents/children — comments are threaded via `parentId` references on the comment object.
128
+ 5. **Synthesize decisions and blockers** from the project description + every document + every issue comment:
129
+ - Decisions already confirmed by the team (look for agreement in comment threads)
130
+ - Open questions that need product/engineering input
131
+ - Engineering comments (prefixed with "Engineering:" or wrench emoji) that identify technical constraints
132
+ - Cross-PRD dependencies (references to other Linear projects, documents, or shared infrastructure)
133
+
134
+ ### Phase 1.5: Extract Source Artifacts
135
+
136
+ PRDs typically reference external design, UX, and data artifacts (Figma files, Lovable prototypes, Loom walkthroughs, screenshots, example payloads, peer Linear or Confluence pages). These MUST be preserved onto the resulting tickets — otherwise developers picking up a ticket lose the source of truth. This is the failure mode this step exists to prevent.
137
+
138
+ 1. **Scan the project description, every attached document body, every sub-issue description, and every fetched comment thread** for:
139
+ - URLs to design/prototype tools (Figma, FigJam, Figma Make, Lovable, Framer, Penpot)
140
+ - URLs to recording/walkthrough tools (Loom, YouTube, Vimeo, Descript)
141
+ - URLs to collaborative docs (Google Docs/Slides/Sheets, peer Confluence pages, Notion peer pages, peer Linear documents)
142
+ - URLs to code sandboxes (CodeSandbox, StackBlitz, Replit, GitHub permalinks/gists)
143
+ - URLs to diagramming tools (Miro, Mural, Excalidraw, Mermaid Live, draw.io, Lucid)
144
+ - URLs to data/observability tools (Grafana, Datadog, Sentry, Metabase, Looker)
145
+ - Embedded images and file attachments referenced in the project / documents
146
+ - Fenced code blocks with example data (JSON, SQL, GraphQL, cURL request/response)
147
+
148
+ 2. **Classify each artifact and apply taxonomy rules** by invoking the `lisa:jira-source-artifacts` skill. That skill is the single source of truth for: domains (`ui-design` / `ux-flow` / `data` / `ops` / `reference`), per-tool classification rules (Figma `/proto/` vs design, Lovable as `ux-flow`, Loom, screenshots), and coverage smells. Do not restate the rules here — invoke the skill so any drift in the rules propagates uniformly.
149
+
150
+ 3. **Build an `artifacts` map** keyed by domain. Each entry: `{ url, title, domain, source_page, source_page_url, classification_reason }`. The `classification_reason` makes disambiguation auditable. The `source_page` lets you trace each reference back to where it appeared (project description vs a specific document title vs a specific sub-issue comment).
151
+
152
+ 4. **Surface coverage smells** as defined in `lisa:jira-source-artifacts` §5. Record any detected smells on the epic.
153
+
154
+ ### Phase 1.6: Source Precedence & Conflict Resolution
155
+
156
+ Source precedence rules and cross-axis conflict handling are defined in `lisa:jira-source-artifacts` §3 and §4. Apply them during ticket synthesis: every conflict between artifacts must be recorded under `## Open Questions` on the affected ticket, never silently reconciled.
157
+
158
+ The existing-component reuse expectation is defined in `lisa:jira-source-artifacts` §7. Encode it on every UI-touching story.
159
+
160
+ ### Phase 2: Codebase + Live Product Research
161
+
162
+ Identical to `lisa:notion-to-jira` Phase 2 and `lisa:confluence-to-jira` Phase 2. Two complementary inputs ground PRD analysis: the **code** (what's there to reuse / extend) and the **live product** (what users see today). Skipping either produces tickets that misjudge the change.
163
+
164
+ **2a. Codebase research.** If the session doesn't already have codebase context, explore the repos to understand what exists. Use Explore agents for repos not yet examined.
165
+
166
+ **2b. Live product walkthrough.** If the PRD touches existing user-facing surfaces, invoke the `lisa:product-walkthrough` skill against `E2E_BASE_URL` using the test user from config.
167
+
168
+ Skip 2b only when the work is purely backend with no user-visible surface, or affects a screen that does not yet exist in dev/prod.
169
+
170
+ Walkthrough findings are surfaced back to product via the orchestrating intake skill (`lisa:linear-prd-intake`), which posts them on the project's sentinel feedback issue. This skill itself does NOT post to Linear — it only reads. The walkthrough section is also inherited onto the resulting epic / stories under a `## Current Product` subsection in the JIRA description.
171
+
172
+ ### Phase 3: Create Epics
173
+
174
+ > **Mode guard**: In `dry_run: true` mode, do not invoke `lisa:jira-write-ticket` in this phase. Instead, draft the epic spec (summary, description_body, artifacts) and validate it with `lisa:jira-validate-ticket --spec-only`. Record the drafted spec (including a placeholder epic key like `DRY-RUN-EPIC-1`) for Phase 4 to use as parent references. In `dry_run: false` mode (default), proceed as described below.
175
+
176
+ For each epic identified in Phase 1, **invoke the `lisa:jira-write-ticket` skill** (do not call `createJiraIssue` directly). Pass it everything it needs to enforce its quality gates:
177
+
178
+ - `project_key`: from `JIRA_PROJECT` config
179
+ - `issue_type`: `Epic`
180
+ - `summary`: epic title from the PRD
181
+ - `description_body`: a draft of the 3-audience description containing:
182
+ - **Context / Business Value**: epic summary from the PRD, originating Linear project URL, business outcome
183
+ - **Technical Approach**: cross-cutting integration points and constraints surfaced in Phase 2 codebase research
184
+ - List of user stories the epic contains
185
+ - Key decisions from comments (with attribution)
186
+ - Blockers and open questions
187
+ - Dependencies on other epics or PRDs
188
+ - A **Source Artifacts** section listing every artifact extracted in Phase 1.5 (grouped by domain)
189
+ - `artifacts`: the full Phase 1.5 artifact list — every artifact, regardless of domain. The epic is the canonical hub. No filtering at the epic level.
190
+ - `priority`, `labels`, `components`, `fix_version`: as appropriate
191
+
192
+ Capture the returned epic key — Phase 4 needs it as the parent for stories.
193
+
194
+ ### Phase 4: Create Stories
195
+
196
+ > **Mode guard**: In `dry_run: true` mode, do not invoke `lisa:jira-write-ticket` in this phase. Instead, draft each story spec and validate it with `lisa:jira-validate-ticket --spec-only`. Use placeholder keys (e.g. `DRY-RUN-STORY-1.1`) for any downstream references. In `dry_run: false` mode (default), proceed as described below.
197
+
198
+ For each Epic, plan two kinds of stories:
199
+ - **One "X.0 Setup" story** for data model and infrastructure prerequisites
200
+ - **One story per user story** from the PRD (numbered to match the PRD's structure or the source Linear sub-issues)
201
+
202
+ **Story naming convention**: Prefix the summary with a short code derived from the PRD title (e.g., `[CU-1.1]` for "Contract Upload").
203
+
204
+ For each story, **invoke `lisa:jira-write-ticket`** with:
205
+
206
+ - `project_key`: from `JIRA_PROJECT` config
207
+ - `issue_type`: `Story`
208
+ - `epic_parent`: the Epic key captured in Phase 3 (mandatory)
209
+ - `summary`: prefixed per the naming convention above
210
+ - `description_body`: 3-audience description as in `lisa:notion-to-jira` Phase 4
211
+ - `artifacts`: the Phase 1.5 artifacts filtered by domain per the inheritance table below
212
+
213
+ | Story type | Inherits domains |
214
+ |------------|------------------|
215
+ | Frontend / UI | `ui-design`, `ux-flow`, `reference` |
216
+ | Backend / API / data model | `data`, `reference` |
217
+ | Infrastructure | `ops`, `reference` |
218
+ | Mixed / setup ("X.0") | All domains |
219
+
220
+ Capture each returned story key — Phase 5 needs it as the parent for sub-tasks.
221
+
222
+ ### Phase 5: Create Sub-tasks
223
+
224
+ Delegate sub-task creation to **parallel agents** (one per epic or batch of stories) for efficiency. **Every spawned agent must invoke `lisa:jira-write-ticket` for each sub-task — no agent may call `createJiraIssue` directly.**
225
+
226
+ Each sub-task MUST:
227
+ 1. **Be scoped to exactly ONE repo** — indicated in brackets in the summary: `[repo-name]`
228
+ 2. **Include an Empirical Verification Plan** — real user-like verification, NOT unit tests, linting, or typechecking
229
+
230
+ Sub-tasks inherit their parent story's artifacts by reference (the parent link). Do not pass the same artifact list to every sub-task.
231
+
232
+ ### Phase 5.5: Artifact Preservation Gate (mandatory)
233
+
234
+ Run the preservation gate defined in `lisa:jira-source-artifacts` §8 against the artifacts extracted in Phase 1.5 and the tickets just created. Do NOT restate or modify the gate logic here — invoke the rules from `lisa:jira-source-artifacts`.
235
+
236
+ To run the gate, this skill must:
237
+
238
+ 1. Pull the remote links of every epic and story created in this run via `mcp__atlassian__getJiraIssueRemoteIssueLinks`.
239
+ 2. Apply the §8 preservation matrix and verdict rules.
240
+ 3. If the gate fails: list each dropped/misrouted artifact and either re-attach via `lisa:jira-write-ticket` (UPDATE mode) or stop and ask the human.
241
+ 4. If the gate passes: print the matrix compactly and proceed to Phase 6.
242
+
243
+ This gate is not optional.
244
+
245
+ ### Phase 6: Report Results
246
+
247
+ After all tickets are created, present a summary table to the user:
248
+ - All Epics with keys and URLs
249
+ - All Stories grouped by Epic
250
+ - All Sub-tasks grouped by Story with repo tags
251
+ - Repo distribution
252
+ - **Artifact Preservation Matrix**
253
+ - Blockers list with recommendations and alternatives
254
+ - Cross-PRD dependencies
255
+
256
+ ## Handling Ambiguities and Blockers
257
+
258
+ When you encounter something the PRD + comments + codebase can't resolve:
259
+
260
+ 1. **Don't guess** — mark the ticket with a BLOCKER section
261
+ 2. **Include your recommendation** with rationale
262
+ 3. **List 2-3 alternatives** so the user/product can choose
263
+ 4. **State what's needed to unblock**
264
+
265
+ ## Agent Prompt Template for Sub-task Creation
266
+
267
+ When delegating to agents, provide this context. **The "MUST invoke jira-write-ticket" instruction is load-bearing — do not edit it out when adapting this template.**
268
+
269
+ ```text
270
+ Create JIRA sub-tasks in the [PROJECT] project at [CLOUD_ID].
271
+
272
+ CRITICAL: For each sub-task, invoke the `lisa:jira-write-ticket` skill via the Skill tool.
273
+ Do NOT call `mcp__atlassian__createJiraIssue` directly. The `lisa:jira-write-ticket` skill
274
+ enforces required quality gates (Gherkin acceptance criteria, 3-audience description,
275
+ single-repo scope, sign-in/environment fields, post-create verification). Bypassing it
276
+ produces broken tickets that downstream skills (triage, journey, evidence) cannot use.
277
+
278
+ For each sub-task, invoke `lisa:jira-write-ticket` with:
279
+ - issue_type: "Sub-task"
280
+ - parent: the parent story key
281
+ - project_key: [PROJECT]
282
+ - summary: prefixed with the repo in brackets, e.g. "[backend-api] Add audit log table"
283
+ - description_body: a 3-section draft (Context / Technical Approach / Acceptance Criteria)
284
+ - gherkin_acceptance_criteria: derived from the story's functional requirements
285
+ - sign_in_account: [test user credentials from config — name + role + how to obtain]
286
+ - target_environment: "dev"
287
+ - empirical_verification_plan: real user-like verification (curl + auth token,
288
+ Playwright browser flow, CLI check after deploy) using the test credentials.
289
+ NOT unit tests, linting, or typechecking.
290
+
291
+ Each sub-task must:
292
+ 1. Be scoped to ONE repo only — repo named in brackets in the summary
293
+ 2. Include the Empirical Verification Plan in the description
294
+ 3. Be created via `lisa:jira-write-ticket`, not via direct MCP calls
295
+
296
+ If `lisa:jira-write-ticket` rejects a sub-task, fix the input and re-invoke. Do NOT fall back
297
+ to a direct `createJiraIssue` call to bypass the gate.
298
+
299
+ Test user info: [credentials from config]
300
+
301
+ [Then list all sub-tasks grouped by parent story with details]
302
+ ```
303
+
304
+ ## Cross-PRD Shared Infrastructure
305
+
306
+ Track tickets that are shared across PRDs to avoid duplication. When a sub-task overlaps with an existing ticket, reference it instead of creating a duplicate. Search JIRA for existing tickets in the project before creating new ones for shared infrastructure.
307
+
308
+ ## Linear-specific notes
309
+
310
+ - **Project description format**: Linear project descriptions are markdown. Treat headings (`#`, `##`, `###`) as section markers for `prd_section`.
311
+ - **Document parents**: Linear documents are attached to either a Project or an Issue (exactly one). For PRD intake, only documents attached to the project being processed are in scope. Documents attached to a child Issue are picked up via that issue's content surface.
312
+ - **Comment threading**: Linear comments are threaded via a `parentId` field on each comment. When fetching comments via `list_comments`, capture the full reply tree — replies often hold the actual decision while the root comment was the question.
313
+ - **No project-level comments via MCP**: clarifying-question comments cannot land directly on the project itself. The orchestrating skill (`lisa:linear-prd-intake`) handles this by maintaining a sentinel feedback issue under the project. This skill does not write to Linear at all — it only reads.
314
+ - **Issue identifiers** (`LIN-123`, `ENG-456`, etc.) are the closest analog to a Confluence inline-comment anchor. When dry-run output sets `prd_anchor` to an issue identifier, the caller knows it can post a clarifying-question comment on that specific issue if it wants block-level anchoring.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: plan
3
- description: "Decompose a single PRD or specification into ordered work items in the configured tracker. Vendor-agnostic — the source can be a Notion PRD URL, a Confluence PRD URL, an existing JIRA epic key, a markdown file, or a free-form description; the destination tracker is whatever the project is configured to use (JIRA today; Linear/GitHub Issues are pluggable). Single-PRD mode only — for batch scanning of all Ready PRDs in a queue, use the lisa:intake skill."
3
+ description: "Decompose a single PRD or specification into ordered work items in the configured tracker. Vendor-agnostic — the source can be a Notion PRD URL, a Confluence PRD URL, a Linear project URL, an existing JIRA epic key, a markdown file, or a free-form description; the destination tracker is whatever the project is configured to use (JIRA today; GitHub Issues is pluggable). Single-PRD mode only — for batch scanning of all Ready PRDs in a queue, use the lisa:intake skill."
4
4
  allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
5
5
  ---
6
6
 
@@ -24,8 +24,10 @@ Detect the input type from `$ARGUMENTS` and route to the appropriate source skil
24
24
  | A Notion **database** URL or database ID | Stop and report — single-PRD mode only. Direct the caller to `lisa:intake` for batch scanning of a database. |
25
25
  | A Confluence **page** URL containing `/wiki/spaces/<KEY>/pages/<ID>/...` (single PRD) | `lisa:confluence-to-jira` (with the PRD URL; same full pipeline as the Notion path) |
26
26
  | A Confluence **space** URL (`/wiki/spaces/<KEY>` with no `/pages/...`) | Stop and report — single-PRD mode only. Direct the caller to `lisa:intake` for batch scanning of a space. |
27
+ | A Linear **project** URL (`https://linear.app/<workspace>/project/<slug>-<id>`) | `lisa:linear-to-jira` (with the project URL; same full pipeline as the Notion / Confluence paths). The Linear project's description, attached documents, and sub-issues form the PRD body. |
28
+ | A Linear **workspace** URL (`https://linear.app/<workspace>` with no `/project/...`) or **team** URL | Stop and report — single-PRD mode only. Direct the caller to `lisa:intake` for batch scanning of a workspace or team. |
27
29
  | A JIRA ticket ID/URL of an Epic (existing epic *is* the spec) | `lisa:jira-agent` (read epic, decompose into stories/sub-tasks) |
28
- | A Linear / GitHub Issues URL or key | Not yet implemented. Stop and tell the user the adapter doesn't exist yet — the architecture supports it, but no `linear-prd-source` / `github-prd-source` skill has been built. Don't fall back. |
30
+ | A GitHub Issues URL or key | Not yet implemented. Stop and tell the user the adapter doesn't exist yet — the architecture supports it, but no `github-prd-source` skill has been built. Don't fall back. |
29
31
  | A file path (`@plan.md`, `./spec.md`) | Read the file as the spec; run the Plan flow's core decomposition with the file content as input. |
30
32
  | A plain-text description | Use the description as the spec; run the Plan flow's core decomposition. |
31
33
 
@@ -37,4 +39,4 @@ Execute the **Plan** flow as defined in the `intent-routing` rule (loaded via th
37
39
 
38
40
  ## Output
39
41
 
40
- Work items in the configured tracker (JIRA today; Linear/GitHub Issues when adapters exist) with acceptance criteria, dependencies, and recommended skills/agents per item. Ordered by dependency. If the specification cannot be decomposed without further clarification, stop and report what is missing.
42
+ Work items in the configured tracker (JIRA today; GitHub Issues when the adapter exists) with acceptance criteria, dependencies, and recommended skills/agents per item. Ordered by dependency. If the specification cannot be decomposed without further clarification, stop and report what is missing.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: prd-ticket-coverage
3
- description: "Verifies that every requirement in a PRD (Notion or Confluence) is covered by at least one created JIRA ticket — 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 post-write to gate the Ticketed transition; can also be invoked standalone for after-the-fact audits."
4
- allowed-tools: ["Skill", "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"]
3
+ description: "Verifies that every requirement in a PRD (Notion, Confluence, or Linear) is covered by at least one created JIRA ticket — 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 post-write to gate the Ticketed transition; can also be invoked standalone for after-the-fact audits."
4
+ allowed-tools: ["Skill", "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", "mcp__linear-server__get_project", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_comments"]
5
5
  ---
6
6
 
7
7
  # PRD Ticket Coverage Audit: $ARGUMENTS
@@ -11,14 +11,15 @@ allowed-tools: ["Skill", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_
11
11
  1. A PRD URL alone — auto-discover created tickets via the PRD's epic remote link.
12
12
  2. A PRD URL plus an explicit list of ticket keys — `<PRD URL> tickets=[KEY-1,KEY-2,...]`. Use this when called from `lisa:notion-prd-intake` or `lisa:confluence-prd-intake` (which know the keys they just created).
13
13
 
14
- The PRD URL can be a **Notion page URL** or a **Confluence page URL**. Detect the vendor from the host:
14
+ The PRD URL can be a **Notion page URL**, a **Confluence page URL**, or a **Linear project URL**. Detect the vendor from the host:
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 `mcp__linear-server__get_project` (capture description, labels, state, attached resources), `mcp__linear-server__list_documents({projectId})` + `mcp__linear-server__get_document` per attached document, `mcp__linear-server__list_issues({project})` for sub-issues that act as child epics / user stories, and `mcp__linear-server__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.
18
19
 
19
- Both vendors produce the same downstream artifact-extraction and coverage-matrix logic — only the fetch surface differs. The rest of this skill is vendor-agnostic.
20
+ All three vendors produce the same downstream artifact-extraction and coverage-matrix logic — only the fetch surface differs. The rest of this skill is vendor-agnostic.
20
21
 
21
- Verify that every atomic item in the PRD is covered by at least one of the listed/discovered JIRA tickets. The output gates whether the PRD's lifecycle should remain at `Ticketed` (Notion `Status = Ticketed`, Confluence `prd-ticketed` label) or revert to `Blocked`.
22
+ Verify that every atomic item in the PRD is covered by at least one of the listed/discovered JIRA tickets. The output gates whether the PRD's lifecycle should remain at `Ticketed` (Notion `Status = Ticketed`, Confluence `prd-ticketed` label, Linear `prd-ticketed` project label) or revert to `Blocked`.
22
23
 
23
24
  ## Why this exists
24
25
 
@@ -34,13 +35,15 @@ Per-ticket gates (`lisa:jira-validate-ticket`) prove each created ticket is well
34
35
  2. Fetch the PRD using the vendor-appropriate tool surface:
35
36
  - **Notion**: `notion-fetch` with `include_discussions: true`. Capture: title, body, child Epic pages, all comment threads.
36
37
  - **Confluence**: `getConfluencePage` (capture title, body, labels), `getConfluencePageFooterComments` + `getConfluencePageInlineComments` (capture all comments; walk replies via `getConfluenceCommentChildren` for any thread with children).
38
+ - **Linear**: `get_project` (capture name, description, labels, state, attached resources). Capture sub-issues via `list_issues({project})` and per-issue comments via `list_comments({issueId})`.
37
39
  3. If the PRD has child Epic sub-pages (a multi-epic PRD), fetch each in parallel:
38
40
  - **Notion**: `notion-fetch` per child page with `include_discussions: true`.
39
41
  - **Confluence**: enumerate descendants via `getConfluencePageDescendants`, then `getConfluencePage` per child plus its comment streams.
42
+ - **Linear**: enumerate attached documents via `list_documents({projectId})` and fetch each via `get_document`. Treat each document as an extra body source. Sub-issues themselves stand in for "child epic pages" — their descriptions and comments are already captured in step 2.
40
43
  The audit walks the full PRD tree.
41
44
  4. If `tickets=[...]` not provided, locate the JIRA epic by:
42
- - Looking for a JIRA URL in the PRD body, comments, or the PRD's most recent "Ticketed by Claude" comment posted by `lisa:notion-prd-intake` / `lisa:confluence-prd-intake`.
43
- - Searching JIRA via `searchJiraIssuesUsingJql` for an epic whose summary or description references the PRD title or page ID.
45
+ - Looking for a JIRA URL in the PRD body, comments, or the PRD's most recent "Ticketed by Claude" comment posted by `lisa:notion-prd-intake` / `lisa:confluence-prd-intake` / `lisa:linear-prd-intake` (for Linear, this comment lives on the project's sentinel feedback issue).
46
+ - Searching JIRA via `searchJiraIssuesUsingJql` for an epic whose summary or description references the PRD title or project ID.
44
47
  - If no epic found, return verdict `NO_TICKETS_FOUND` with a clear remediation — coverage cannot be assessed without the ticket set.
45
48
  5. Once the epic is known, fetch all child stories and sub-tasks via JQL: `"Epic Link" = <EPIC-KEY>` and recursively for sub-tasks.
46
49
 
@@ -144,7 +147,7 @@ Atomic PRD items extracted: <n>
144
147
  ### Scope-creep count: <n>
145
148
  ```
146
149
 
147
- `prd_anchor` and `prd_section` are built the same way as in `lisa:notion-to-jira` / `lisa:confluence-to-jira`. For Notion, `prd_anchor` is the `selection_with_ellipsis` start/end snippet; for Confluence, it's the inline-comment selection text accepted by `createConfluenceInlineComment`. The downstream caller knows which vendor it's writing to and uses the right API; this skill just emits the anchor that vendor expects. Set both to `null` only when the gap is not anchored to any specific section (rare).
150
+ `prd_anchor` and `prd_section` are built the same way as in `lisa:notion-to-jira` / `lisa:confluence-to-jira` / `lisa:linear-to-jira`. For Notion, `prd_anchor` is the `selection_with_ellipsis` start/end snippet; for Confluence, it's the inline-comment selection text accepted by `createConfluenceInlineComment`; for Linear, it's a sub-issue identifier (e.g. `LIN-123`) when the gap maps to a specific issue, otherwise `null` (the caller posts unanchored Linear gaps on the project's sentinel feedback issue). The downstream caller knows which vendor it's writing to and uses the right API; this skill just emits the anchor that vendor expects.
148
151
 
149
152
  `category` is drawn from the same fixed taxonomy used by `lisa:jira-validate-ticket` so downstream callers can apply one consistent comment-formatting policy. Most coverage gaps map to `scope` (item not represented in any ticket) or `product-clarity` (item too vague to map). Use `acceptance-criteria` for missing pass/fail conditions and `design-ux` for missing visuals.
150
153
 
@@ -154,4 +157,4 @@ Atomic PRD items extracted: <n>
154
157
  - Never silently drop a PRD item from extraction. If an item is ambiguous about whether it's scope, include it in extraction with type `ambiguous` and let the matching phase resolve it. The point of the audit is to catch silent drops; the audit can't have its own.
155
158
  - Be explicit about confidence in matches — the matrix is for humans to skim; vague matches help no one. If a match is rule-3 ("scope inheritance"), say so.
156
159
  - Scope creep is INFORMATIONAL. It is normal for an agent to add infra tickets (`X.0 Setup`) the PRD doesn't explicitly enumerate. Only flag scope creep when the ticket genuinely doesn't trace to PRD content AND isn't standard scaffolding.
157
- - The `GAPS_FOUND` verdict is the gate. The caller (e.g. `lisa:notion-prd-intake`) uses it to decide whether to revert `Status` from `Ticketed` to `Blocked`.
160
+ - The `GAPS_FOUND` verdict is the gate. The caller (e.g. `lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, `lisa:linear-prd-intake`) uses it to decide whether to revert the lifecycle from `Ticketed` to `Blocked`.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.4.0",
3
+ "version": "2.5.1",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.4.0",
3
+ "version": "2.5.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.4.0",
3
+ "version": "2.5.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.4.0",
3
+ "version": "2.5.1",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.4.0",
3
+ "version": "2.5.1",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: linear-prd-intake
3
+ description: PRD intake agent for Linear-hosted PRDs. Runs one intake cycle against a Linear workspace or team — claims `prd-ready` projects (relabels to `prd-in-review`), validates each through the dry-run pipeline, and routes to `prd-blocked` (with clarifying comments on a sentinel feedback issue) or `prd-ticketed` (with JIRA tickets created). Linear counterpart of `notion-prd-intake` and `confluence-prd-intake`. Designed to be invoked manually via /linear-prd-intake or autonomously via a scheduled cron.
4
+ skills:
5
+ - linear-prd-intake
6
+ - linear-to-jira
7
+ - jira-validate-ticket
8
+ - jira-source-artifacts
9
+ - product-walkthrough
10
+ - jira-write-ticket
11
+ - prd-ticket-coverage
12
+ ---
13
+
14
+ # PRD Intake Agent (Linear)
15
+
16
+ You are a PRD intake agent. Your single job is to run one intake cycle against the Linear scope (a workspace or a team) given to you, then report what happened.
17
+
18
+ This agent is the Linear counterpart of `notion-prd-intake` and `confluence-prd-intake`. The behavior is identical apart from the source-of-truth tool surface and one structural difference (clarifying comments land on a sentinel feedback issue under each project, not on the project page itself, because Linear's MCP doesn't expose project-level comments). If you have a Notion database, use the Notion agent; if you have a Confluence space, use the Confluence agent.
19
+
20
+ ## Confirmation policy
21
+
22
+ Once you have a workspace or team scope, RUN. Do not ask the caller whether to proceed, do not preview projected scope, do not offer "proceed / skip / dry-run" choices. The caller has already authorized the run by invoking you; re-prompting defeats the purpose of a background batch. `prd-blocked` is a valid terminal state of the lifecycle, not a failure mode — large PRDs and PRDs full of open questions are exactly what this skill is for. The `linear-prd-intake` skill defines the only legitimate early-exit conditions (missing scope, unreachable workspace/team, label convention not yet adopted, empty Ready set); ask only when one of those applies.
23
+
24
+ ## Workflow
25
+
26
+ ### 1. Receive the scope URL or key
27
+
28
+ The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear workspace URL, a team URL, a bare team key, or the literal token `linear` (which falls back to `LINEAR_WORKSPACE`). You do not pick the scope yourself.
29
+
30
+ If no scope is provided, stop and ask. Never run intake against a default or guessed scope — the side effects (label changes, sentinel-issue creation, JIRA tickets created) are too high to act without an explicit target.
31
+
32
+ ### 2. Run the intake skill
33
+
34
+ Invoke the `linear-prd-intake` skill with the scope as `$ARGUMENTS`. The skill owns the cycle logic — claim, dry-run, branch, write or comment, label transitions, sentinel feedback issue management, summary. Do not duplicate that logic here.
35
+
36
+ Treat the skill's output as the source of truth. If it reports `prd-ticketed: 3 / prd-blocked: 1 / Errors: 0`, that's what you report.
37
+
38
+ ### 3. Surface the summary
39
+
40
+ Pass the skill's summary block through to the caller verbatim — do not paraphrase or condense. The caller (often a human running `/linear-prd-intake` ad-hoc, or a scheduled cron) needs the structured record:
41
+
42
+ - Total processed
43
+ - Per-PRD outcomes (`prd-ticketed` → which tickets created; `prd-blocked` → how many gate failures; Errors → reason)
44
+ - JIRA ticket count
45
+
46
+ If the cycle errored before processing any PRDs (e.g. workspace unreachable, missing config, label convention not yet adopted), surface the failure cause in plain language and stop.
47
+
48
+ ### 4. Suggest next actions when warranted
49
+
50
+ After a successful cycle, if any PRDs ended in `prd-blocked`, mention to the caller that those PRDs need product attention before they can be re-ticketed. Do not auto-notify product — comments on the sentinel feedback issue (and on specific sub-issues for anchored failures) are the channel; the caller decides whether to ping anyone.
51
+
52
+ When reporting `prd-blocked` outcomes, distinguish the cause: **pre-write gate failure** (per-ticket validator caught a problem before any tickets were created) vs **post-write coverage gap** (tickets were created and remain in JIRA, but the PRD has uncovered requirements that the next intake cycle will address). Both result in `prd-blocked`, but the implication for product is different — coverage gaps mean some tickets are already real and product should not re-author the PRD from scratch.
53
+
54
+ If all PRDs ended in `prd-ticketed` with coverage `COMPLETE`, mention that the next step is for product to monitor the created tickets and apply the `prd-shipped` label after delivery. If any are `COMPLETE_WITH_SCOPE_CREEP`, point that out so product can review the flagged tickets.
55
+
56
+ ## Rules
57
+
58
+ - **Never run a cycle without an explicit scope.** Side effects are too high to default.
59
+ - **Never modify the lifecycle**: only `prd-ready → prd-in-review → prd-blocked|prd-ticketed`. Never touch `prd-draft` or `prd-shipped`. Never invent new labels.
60
+ - **Never write JIRA tickets directly.** All writes go through the skill chain (intake → linear-to-jira → jira-write-ticket).
61
+ - **Never edit a project's description or any attached Linear document.** Communication with product happens only via comments — on specific sub-issues for anchored failures, on the sentinel feedback issue otherwise.
62
+ - **Never close, archive, or repurpose the sentinel feedback issue.** It is reused across cycles; its longevity is the audit trail.
63
+ - **Never start a second cycle while one is in flight against the same scope.** Serial execution; the scheduling layer is responsible for not double-firing.
64
+ - **Stop and surface failures rather than retry-loop.** If `linear-to-jira` returns an error, the skill records it under `Errors` in the summary; pass that through.
@@ -1,6 +1,6 @@
1
1
  ---
2
- description: "Vendor-agnostic batch scanner for Ready queues. Notion PRD database URL → finds Status=Ready PRDs and runs lisa:plan per item. Confluence space or parent-page URL → finds prd-ready PRDs and runs lisa:plan per item. JIRA project key or JQL → finds Ready tickets and runs lisa:implement per item. Designed as the cron target for /schedule."
3
- argument-hint: "<Notion-PRD-database-URL | Confluence-space-URL | Confluence-parent-page-URL | JIRA-project-key | JQL-filter>"
2
+ description: "Vendor-agnostic batch scanner for Ready queues. Notion PRD database URL → finds Status=Ready PRDs and runs lisa:plan per item. Confluence space or parent-page URL → finds prd-ready PRDs and runs lisa:plan per item. Linear workspace or team URL → finds prd-ready Linear projects and runs lisa:plan per item. JIRA project key or JQL → finds Ready tickets and runs lisa:implement per item. Designed as the cron target for /schedule."
3
+ argument-hint: "<Notion-PRD-database-URL | Confluence-space-URL | Confluence-parent-page-URL | Linear-workspace-URL | Linear-team-URL | JIRA-project-key | JQL-filter>"
4
4
  ---
5
5
 
6
6
  Use the /lisa:intake skill to scan the queue for Ready items and dispatch each one through the appropriate single-item lifecycle skill. $ARGUMENTS
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: intake
3
- description: "Vendor-agnostic batch scanner for Ready queues. Given a Notion PRD database URL → finds Ready PRDs and runs lisa:plan per item. Given a Confluence space or parent page URL → finds prd-ready PRDs and runs lisa:plan per item. Given a JIRA project key or JQL filter → finds Ready tickets and runs lisa:implement per item. Designed as the cron target for /schedule — one cycle per invocation, processes everything currently Ready, 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"]
3
+ description: "Vendor-agnostic batch scanner for Ready queues. Given a Notion PRD database URL → finds Ready PRDs and runs lisa:plan per item. Given a Confluence space or parent page URL → finds prd-ready PRDs and runs lisa:plan per item. Given a Linear workspace URL or team key → finds prd-ready Linear projects and runs lisa:plan per item. Given a JIRA project key or JQL filter → finds Ready tickets and runs lisa:implement per item. Designed as the cron target for /schedule — one cycle per invocation, processes everything currently Ready, 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", "mcp__linear-server__list_projects", "mcp__linear-server__list_teams", "mcp__linear-server__list_project_labels"]
5
5
  ---
6
6
 
7
7
  # Intake: $ARGUMENTS
@@ -42,19 +42,24 @@ Detect the queue type from `$ARGUMENTS` and route:
42
42
  | A Notion **database** URL or database ID | PRD queue (Notion) | Invoke `lisa:notion-prd-intake` (which scans the DB for Status=Ready, claims each, runs `lisa:plan` per PRD via the dry-run validate → branch → write pipeline) |
43
43
  | A Confluence **space** URL or space key (e.g. `https://acme.atlassian.net/wiki/spaces/PRD` or `PRD`) | PRD queue (Confluence) | Invoke `lisa:confluence-prd-intake` (which CQL-queries the space for `label = "prd-ready"`, claims each by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline) |
44
44
  | A Confluence **parent page** URL or page ID (the page whose descendants are PRDs) | PRD queue (Confluence, narrowed) | Invoke `lisa:confluence-prd-intake` with the parent ID (CQL: `ancestor = <id> AND label = "prd-ready"`) |
45
+ | A Linear **workspace** URL (e.g. `https://linear.app/acme`) | PRD queue (Linear) | Invoke `lisa:linear-prd-intake` (which queries `list_projects({label: "prd-ready"})` across the workspace, claims each by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline) |
46
+ | A Linear **team** URL (e.g. `https://linear.app/acme/team/ENG/projects`) or a token already routed as a Linear team key | PRD queue (Linear, narrowed) | Invoke `lisa:linear-prd-intake` with the team key (`list_projects({team, label: "prd-ready"})`) |
47
+ | The literal token `linear` | PRD queue (Linear, default workspace) | Invoke `lisa:linear-prd-intake linear` — only valid if `LINEAR_WORKSPACE` is configured |
45
48
  | A JIRA project key (e.g. `SE`) | Work queue (JIRA) | Invoke `lisa:jira-build-intake` (which scans the project for Status=Ready, claims each via In Progress, runs `lisa:implement` per ticket, transitions to On Dev on success) |
46
49
  | A full JQL filter (e.g. `project = SE AND component = "frontend"`) | Work queue (JIRA, narrowed) | Invoke `lisa:jira-build-intake` with the JQL |
47
- | A Linear / GitHub Issues queue | Not yet implemented | Stop and report — no `linear-tracker` or `github-tracker` adapter has been built. Don't fall back. |
50
+ | A GitHub Issues queue | Not yet implemented | Stop and report — no `github-tracker` adapter has been built. Don't fall back. |
48
51
 
49
52
  Disambiguation rules:
50
53
 
51
54
  - A `notion.so` / `notion.site` URL → Notion queue.
52
55
  - An Atlassian Confluence URL containing `/wiki/spaces/<KEY>` with no `/pages/...` segment → Confluence space queue.
53
56
  - An Atlassian Confluence URL containing `/wiki/spaces/<KEY>/pages/<ID>/...` → Confluence parent-page queue (the page is the parent whose descendants are PRDs). If the user actually meant "this single page is a PRD, plan it", route to `lisa:plan` instead — this skill is batch-only.
54
- - A bare alphanumeric token that matches the configured `JIRA_PROJECT` regex (uppercase letters / digits / hyphen, ≤10 chars) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. The only time to stop and ask is when the token matches the JIRA_PROJECT regex AND is also a confirmed reachable Confluence space key (verified via Atlassian API) in that specific overlap the user must disambiguate which queue to scan.
57
+ - A `linear.app` URL Linear queue. If the path is `/<workspace>` only or `/<workspace>/team/<KEY>/...`, route here. If the path includes `/project/<slug>-<id>` it's a single-PRD URLdirect the caller to `lisa:plan` instead, this skill is batch-only.
58
+ - The literal token `linear` (case-insensitive) → Linear queue, default workspace from `LINEAR_WORKSPACE`.
59
+ - A bare alphanumeric token that matches the configured `JIRA_PROJECT` regex (uppercase letters / digits / hyphen, ≤10 chars) 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 `mcp__linear-server__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} simultaneously — in that overlap the user must disambiguate which queue to scan.
55
60
  - A string starting with `project = ` or containing JQL operators (`AND`, `OR`, `=`, `!=`, `~`, etc.) → JQL filter.
56
61
 
57
- The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch skills (`lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, `lisa:jira-build-intake`) are internal — Intake is the public entry point. Developers schedule `/lisa:intake <queue>`; the rest is composition.
62
+ The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch skills (`lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, `lisa:linear-prd-intake`, `lisa:jira-build-intake`) are internal — Intake is the public entry point. Developers schedule `/lisa:intake <queue>`; the rest is composition.
58
63
 
59
64
  ## Cycle behavior
60
65
 
@@ -64,6 +69,7 @@ The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch
64
69
  4. **Process each Ready item serially** (claim-first ordering for idempotency):
65
70
  - Notion PRDs → `lisa:notion-prd-intake` handles per-item: claim (Status=In Review), dry-run validate, branch to Blocked or Ticketed, coverage audit
66
71
  - Confluence PRDs → `lisa:confluence-prd-intake` handles per-item: claim (relabel to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed`, coverage audit
72
+ - Linear PRDs → `lisa:linear-prd-intake` handles per-item: claim (relabel project to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed` (with a sentinel feedback issue under each project hosting clarifying-question comments), coverage audit
67
73
  - JIRA tickets → `lisa:jira-build-intake` handles per-item: claim, dispatch to `lisa:jira-agent`, transition to On Dev on success
68
74
  5. **Failure isolation** — one item failing does not stop the cycle; record under "Errors" and continue.
69
75
  6. **Summary report** — per-item outcomes, total processed, total errors.
@@ -73,6 +79,8 @@ The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch
73
79
  ```text
74
80
  /schedule "every 30 minutes" /lisa:intake https://www.notion.so/<workspace>/<database-id>
75
81
  /schedule "every 30 minutes" /lisa:intake https://acme.atlassian.net/wiki/spaces/PRD
82
+ /schedule "every 30 minutes" /lisa:intake https://linear.app/acme
83
+ /schedule "every 30 minutes" /lisa:intake https://linear.app/acme/team/ENG/projects
76
84
  /schedule "every 30 minutes" /lisa:intake SE
77
85
  /schedule "every hour" /lisa:intake "project = SE AND component = 'frontend'"
78
86
  ```