@codyswann/lisa 2.10.1 → 2.11.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 (118) hide show
  1. package/README.md +65 -14
  2. package/package.json +1 -1
  3. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
  5. package/plugins/lisa/agents/github-prd-intake.md +2 -2
  6. package/plugins/lisa/agents/linear-agent.md +128 -0
  7. package/plugins/lisa/agents/linear-build-intake.md +62 -0
  8. package/plugins/lisa/agents/linear-prd-intake.md +2 -2
  9. package/plugins/lisa/agents/notion-prd-intake.md +1 -1
  10. package/plugins/lisa/commands/plan.md +1 -1
  11. package/plugins/lisa/rules/config-resolution.md +187 -0
  12. package/plugins/lisa/rules/intent-routing.md +13 -13
  13. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
  14. package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
  15. package/plugins/lisa/skills/github-create/SKILL.md +4 -4
  16. package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
  17. package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
  18. package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
  19. package/plugins/lisa/skills/implement/SKILL.md +1 -1
  20. package/plugins/lisa/skills/intake/SKILL.md +3 -3
  21. package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
  22. package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
  23. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
  24. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  25. package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
  26. package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
  27. package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
  28. package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
  29. package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
  30. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
  31. package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
  32. package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
  33. package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
  34. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
  35. package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
  36. package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
  37. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
  38. package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
  39. package/plugins/lisa/skills/plan/SKILL.md +3 -2
  40. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
  41. package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
  42. package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
  43. package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
  44. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
  45. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
  46. package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
  47. package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
  48. package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
  49. package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
  50. package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  51. package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
  52. package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
  53. package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
  54. package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
  55. package/plugins/lisa/skills/verify/SKILL.md +1 -1
  56. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-expo/skills/jira-create/SKILL.md +4 -4
  59. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails/skills/jira-create/SKILL.md +4 -4
  62. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  63. package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
  64. package/plugins/src/base/agents/github-prd-intake.md +2 -2
  65. package/plugins/src/base/agents/linear-agent.md +128 -0
  66. package/plugins/src/base/agents/linear-build-intake.md +62 -0
  67. package/plugins/src/base/agents/linear-prd-intake.md +2 -2
  68. package/plugins/src/base/agents/notion-prd-intake.md +1 -1
  69. package/plugins/src/base/commands/plan.md +1 -1
  70. package/plugins/src/base/rules/config-resolution.md +187 -0
  71. package/plugins/src/base/rules/intent-routing.md +13 -13
  72. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
  73. package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
  74. package/plugins/src/base/skills/github-create/SKILL.md +4 -4
  75. package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
  76. package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
  77. package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
  78. package/plugins/src/base/skills/implement/SKILL.md +1 -1
  79. package/plugins/src/base/skills/intake/SKILL.md +3 -3
  80. package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
  81. package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
  82. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
  83. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  84. package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
  85. package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
  86. package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
  87. package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
  88. package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
  89. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
  90. package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
  91. package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
  92. package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
  93. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
  94. package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
  95. package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
  96. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
  97. package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
  98. package/plugins/src/base/skills/plan/SKILL.md +3 -2
  99. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
  100. package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
  101. package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
  102. package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
  103. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
  104. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
  105. package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
  106. package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
  107. package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
  108. package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
  109. package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  110. package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
  111. package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
  112. package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
  113. package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
  114. package/plugins/src/base/skills/verify/SKILL.md +1 -1
  115. package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
  116. package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
  117. package/plugins/lisa/rules/tracker-resolution.md +0 -76
  118. package/plugins/src/base/rules/tracker-resolution.md +0 -76
@@ -0,0 +1,200 @@
1
+ ---
2
+ name: linear-read-issue
3
+ description: "Fetches the full scope of a Linear work item — Issue or Project — including metadata, description, acceptance criteria, all comments, attachments, native relations (blocks/blocked_by/relates_to/duplicates), Project parent (if any) with siblings, and sub-Issues. Produces a consolidated context bundle that downstream agents consume so they never act on a single item in isolation."
4
+ allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__get_project", "mcp__linear-server__list_issues", "mcp__linear-server__list_comments", "mcp__linear-server__list_documents", "mcp__linear-server__get_document"]
5
+ ---
6
+
7
+ # Read Linear Work Item: $ARGUMENTS
8
+
9
+ Fetch the full scope of the item AND its related graph. Downstream agents must never act on an item in isolation — always call this skill first so they see blockers, project siblings, linked PRs, and historical comments.
10
+
11
+ This skill is the destination of the `lisa:tracker-read` shim when `tracker = "linear"`. Read-only.
12
+
13
+ Repository name for scoped comments and logs: `basename $(git rev-parse --show-toplevel)`.
14
+
15
+ ## Configuration
16
+
17
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
18
+
19
+ ## Phase 1 — Resolve Context
20
+
21
+ 1. If `$ARGUMENTS` matches `<TEAM>-<n>` → Issue mode.
22
+ 2. If `$ARGUMENTS` is a URL containing `/project/<slug>-<short-id>` → Project mode (extract `<short-id>`).
23
+ 3. Otherwise stop and report. Do NOT guess.
24
+ 4. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})`.
25
+
26
+ ## Phase 2 — Fetch Primary Item
27
+
28
+ ### Issue mode
29
+
30
+ Call `mcp__linear-server__get_issue`. Extract and preserve:
31
+
32
+ **Metadata**
33
+ - Identifier, title, issue type (typically a label or workflow state), state, priority (0–4)
34
+ - Assignee, creator, subscribers
35
+ - Labels (capture full names — `status:*`, `component:*`, `priority:*`, `prd-*`)
36
+ - Project (parent), parent Issue (if Sub-task), cycle, milestone (ProjectMilestone)
37
+ - Estimate, due date
38
+ - Created, updated, completed dates
39
+
40
+ **Body**
41
+ - Full description (preserve markdown)
42
+ - **Validation Journey** section if present (pass verbatim to downstream)
43
+ - Attachment URLs (capture, do not download unless needed)
44
+
45
+ **Comments**
46
+ Fetch ALL comments via `mcp__linear-server__list_comments({issueId: <id>})` in chronological order. Walk thread parents/children — Linear comments are threaded via `parentId`. Do not truncate. For each comment:
47
+ - Author, timestamp, body
48
+ - Flag comments that contain: credentials, reproduction steps, status updates from stakeholders, decisions, or triage headers.
49
+
50
+ ### Project mode
51
+
52
+ Call `mcp__linear-server__get_project` with `includeMilestones: true`, `includeResources: true`. Extract:
53
+
54
+ **Metadata**
55
+ - ID, slug, name, state, priority, lead, color
56
+ - Teams, labels, milestones, target date, start date
57
+ - Created, updated dates
58
+
59
+ **Body**
60
+ - Description (markdown)
61
+ - Attached documents — call `mcp__linear-server__list_documents({projectId})` then `get_document` per result. Treat each as additional spec content.
62
+
63
+ **Member Issues**
64
+ - Call `mcp__linear-server__list_issues({project: <id>})` to enumerate the Project's Issues. Capture identifier, title, state, parent Issue (for sub-Issue tree).
65
+
66
+ ## Phase 3 — Fetch Attachments / Remote Links
67
+
68
+ Linear stores remote URLs as attachments on the Issue. For each:
69
+
70
+ - **GitHub PR or commit**: run `gh pr view <url> --json title,state,body,mergedAt,reviewDecision,comments,reviews` (PRs) or `gh api repos/<owner>/<repo>/commits/<sha>` (commits). Capture title, state, unresolved review comments, merge status.
71
+ - **Confluence page**: capture title and URL. Do not fetch body unless a downstream task explicitly needs it.
72
+ - **Dashboard / log link / external URL**: capture title and URL only.
73
+
74
+ If `gh` is not authenticated, note "gh auth required" and continue — do not abort.
75
+
76
+ ## Phase 4 — Fetch Relations
77
+
78
+ Linear native Issue relations are returned in the `get_issue` response under `relations`. Group by type:
79
+
80
+ - `blocks` / `blocked_by`
81
+ - `relates_to`
82
+ - `duplicates` / `duplicated_by`
83
+
84
+ For each related Issue, call `mcp__linear-server__get_issue` and capture:
85
+ - Identifier, title, state, priority, assignee
86
+ - Description (full, unless cancelled — then summary only)
87
+ - Acceptance Criteria section
88
+ - Last 10 comments (chronological)
89
+ - Attachments (URLs only — skip deep PR fetch unless the relation is `blocks` or `blocked_by`)
90
+
91
+ **Special handling for `blocked_by`:** fetch full PR details via `gh` for each blocker's GitHub attachments so the agent knows whether the blocker is actually shipped.
92
+
93
+ For Project-level relationships (Project ↔ Project), Linear doesn't model native relations — check the Project description and resources for cross-references and capture them as plain links.
94
+
95
+ ## Phase 5 — Fetch Project Context
96
+
97
+ If the primary Item is an Issue with a Project parent:
98
+
99
+ 1. Fetch the Project via `mcp__linear-server__get_project` — full description, milestones, labels, lead.
100
+ 2. Fetch Project documents (Phase 2 procedure).
101
+ 3. Find Project siblings via `mcp__linear-server__list_issues({project: <projectId>})` excluding the primary identifier.
102
+ 4. For each sibling, capture: identifier, title, state, priority, assignee, summary (first paragraph of description).
103
+ 5. If a sibling is `Started` or `In Review` with a different assignee, flag it prominently.
104
+
105
+ If the primary Item IS a Project, Phase 5 is the same as fetching all member Issues (already done in Phase 2 Project mode).
106
+
107
+ ## Phase 6 — Fetch Sub-Issues
108
+
109
+ If the primary Issue has children (sub-Issues), fetch each via `mcp__linear-server__get_issue`: identifier, title, state, assignee, description (first paragraph), Acceptance Criteria.
110
+
111
+ ## Phase 7 — Assemble Context Bundle
112
+
113
+ Produce a single structured output the caller can pass verbatim to downstream agents.
114
+
115
+ ```text
116
+ # Linear Work Item Context: <IDENTIFIER>
117
+
118
+ ## Primary Item
119
+ - Identifier: <ID>
120
+ - Type: <Issue | Project>
121
+ - State: <state>
122
+ - Priority: <0–4 or named>
123
+ - Assignee: <name or none>
124
+ - Project (parent): <project-slug — name> or none
125
+ - Parent Issue: <ID — title> or none (Sub-task only)
126
+ - Cycle: <name or none>
127
+ - Milestone: <project-milestone or none>
128
+ - Labels: <comma-separated>
129
+ - Estimate: <points>
130
+
131
+ ### Description
132
+ <full description>
133
+
134
+ ### Acceptance Criteria
135
+ <criteria>
136
+
137
+ ### Validation Journey
138
+ <section or "None">
139
+
140
+ ### Comments (<count>)
141
+ <chronological comments, flagged items called out>
142
+
143
+ ### Attachments
144
+ <list of URLs with titles>
145
+
146
+ ## Remote Links
147
+ ### Pull Requests (<count>)
148
+ - <url> — <title> — <state> — <reviewDecision>
149
+ <body summary + unresolved review comments>
150
+
151
+ ### Confluence
152
+ - <title> — <url>
153
+
154
+ ### Other
155
+ - <title> — <url>
156
+
157
+ ## Relations
158
+ ### Blocks (<count>)
159
+ <per-issue block>
160
+
161
+ ### Blocked By (<count>)
162
+ <per-issue block with PR state>
163
+
164
+ ### Relates To (<count>)
165
+ <per-issue block>
166
+
167
+ ### Duplicates / Duplicated By
168
+ <per-issue block>
169
+
170
+ ## Project Context (when primary is an Issue under a Project)
171
+ ### Project <slug> — <name>
172
+ - State: <state>
173
+ - Description: <full markdown>
174
+ - Milestones: <list>
175
+ - Documents: <list of doc titles + identifiers>
176
+
177
+ ### Siblings In-Flight (<count>)
178
+ - <ID> — <state> — <assignee> — <title> **[FLAG: in progress by other assignee]**
179
+
180
+ ### Other Siblings (<count>)
181
+ - <ID> — <state> — <title>
182
+
183
+ ## Sub-Issues (<count>)
184
+ - <ID> — <state> — <assignee> — <title>
185
+
186
+ ## Summary for Downstream
187
+ - Full item count pulled: <N>
188
+ - Blockers still open: <list>
189
+ - Related in-flight work: <list>
190
+ - Relevant PRs: <list with state>
191
+ ```
192
+
193
+ ## Rules
194
+
195
+ - Never summarize or truncate the primary item's description or Validation Journey.
196
+ - Never skip a relation type, even if it seems unrelated — the downstream agent decides relevance.
197
+ - If a related item returns an access error, capture the error and continue. Do not abort the read.
198
+ - Flag in-flight sibling work prominently so the caller can avoid duplicate implementation.
199
+ - If the Issue has no Project parent, state this explicitly — do not silently skip Phase 5.
200
+ - Output is pure context. This skill never modifies the item.
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: linear-sync
3
+ description: "Syncs plan progress to a linked Linear Issue. Posts plan contents, progress updates, branch links, and PR links at key milestones. Use this skill throughout the plan lifecycle to keep Linear Issues in sync. The Linear counterpart of lisa:jira-sync and lisa:github-sync."
4
+ allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__save_issue"]
5
+ ---
6
+
7
+ # Sync Plan to Linear: $ARGUMENTS
8
+
9
+ Post milestone updates to the linked Linear Issue at key plan-lifecycle moments. This skill is the destination of the `lisa:tracker-sync` shim when `tracker = "linear"`.
10
+
11
+ ## Configuration
12
+
13
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
14
+
15
+ ## When to invoke
16
+
17
+ Callers (planning skills, lifecycle skills) invoke this skill at:
18
+
19
+ | Milestone | What to post |
20
+ |-----------|--------------|
21
+ | Plan created | Plan contents (sections + ordered tasks) as a comment, suggest transition `Backlog → Todo` (label: `status:ready`) |
22
+ | Implementation in progress | Branch URL + first commit, suggest transition `Todo → In Progress` (label: `status:in-progress`) |
23
+ | PR ready for review | PR URL + summary, the implementation handoff comment, suggest transition `In Progress → In Review` (label: `status:code-review`) |
24
+ | PR merged | Merge SHA + deploy environment (if known), suggest transition `In Review → Done` (label: `status:done`) |
25
+
26
+ This skill **suggests** transitions but does not auto-transition the native Linear `state` field. It DOES update the `status:*` label set when the caller asks (the build queue is keyed off labels). Native state transitions remain a human / triage decision.
27
+
28
+ ## Input
29
+
30
+ `$ARGUMENTS` is `<IDENTIFIER> <milestone>` where:
31
+
32
+ - `<IDENTIFIER>` is the Linear Issue identifier (e.g. `ENG-123`). If not provided, the skill searches the active plan file for a linked Linear Issue.
33
+ - `<milestone>` is one of `plan-created`, `implementation-in-progress`, `pr-ready`, `pr-merged`.
34
+
35
+ ## Phase 1 — Resolve Issue
36
+
37
+ 1. If `$ARGUMENTS` includes an identifier, parse it.
38
+ 2. Else search for the active plan file (most recent file under `plans/`) and extract the linked Linear Issue identifier from its frontmatter.
39
+ 3. Fetch the Issue via `mcp__linear-server__get_issue` to confirm it exists.
40
+
41
+ ## Phase 2 — Compose Milestone Comment
42
+
43
+ Per the milestone, build the comment body. Include:
44
+
45
+ - A milestone header (e.g. `**Plan created** — <plan-file>`)
46
+ - Relevant links (plan file, branch, PR)
47
+ - A short summary (first 5 lines of the plan section / commit message / PR description)
48
+ - The suggested status transition
49
+
50
+ Example for `plan-created`:
51
+
52
+ ```markdown
53
+ **Plan created** — `plans/feat-X.md`
54
+
55
+ Sections:
56
+ - Phase 1: Schema doc
57
+ - Phase 2: Linear destination skills
58
+ - ...
59
+
60
+ Tasks: 7 ordered items.
61
+
62
+ Next: implementation begins. Suggested status: **Todo** (label: `status:ready`).
63
+ ```
64
+
65
+ ## Phase 3 — Post Comment
66
+
67
+ Call `mcp__linear-server__save_comment({issueId: <id>, body: <comment>})`.
68
+
69
+ ## Phase 4 — Update Status Label (when caller requests)
70
+
71
+ If the caller passes `--update-label`, update the `status:*` label set via `mcp__linear-server__save_issue`:
72
+
73
+ - `plan-created` → add `status:ready`
74
+ - `implementation-in-progress` → remove `status:ready`, add `status:in-progress`
75
+ - `pr-ready` → remove `status:in-progress`, add `status:code-review`
76
+ - `pr-merged` → remove `status:code-review`, add `status:done`
77
+
78
+ If the requested label doesn't exist on the team, create it via `mcp__linear-server__create_issue_label`.
79
+
80
+ Verify exactly one `status:*` label remains after the update — having two simultaneously breaks the build-queue invariant.
81
+
82
+ Without `--update-label`, this skill posts the comment only and does NOT touch labels.
83
+
84
+ ## Rules
85
+
86
+ - Never auto-transition the native Linear `state` — only the label, and only when the caller explicitly asks.
87
+ - Never post empty or minimal comments — if a milestone has no meaningful content, skip the post.
88
+ - Do not delete prior milestone comments. They are the audit trail.
89
+ - If `save_comment` fails, retry once. If it fails again, surface the error.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-to-tracker
3
3
  description: >
4
- Break down a Linear PRD (a Linear Project) into Epics, Stories, and Sub-tasks in the configured destination tracker (JIRA or GitHub Issues per .lisa.config.json). Use this skill
4
+ Break down a Linear PRD (a Linear Project) into Epics, Stories, and Sub-tasks in the configured destination tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json). Use this skill
5
5
  whenever the user shares a Linear project URL and wants it converted into tracker tickets, or asks to
6
6
  "break down this Linear project", "create tickets from a Linear project", "turn this Linear PRD into tickets", or similar. This skill mirrors `lisa:notion-to-tracker` and `lisa:confluence-to-tracker` for projects
7
7
  whose PRDs live in Linear — the workflow, gates, dry-run mode, and validation rules are identical;
@@ -11,7 +11,7 @@ allowed-tools: ["Skill", "Bash", "mcp__linear-server__get_project", "mcp__linear
11
11
 
12
12
  # Linear PRD to Tracker Breakdown
13
13
 
14
- Convert a Linear PRD (a Linear **Project**) into a structured ticket hierarchy in the configured destination tracker (JIRA or GitHub Issues per .lisa.config.json): Epics > Stories > Sub-tasks.
14
+ Convert a Linear PRD (a Linear **Project**) into a structured ticket hierarchy in the configured destination tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json): Epics > Stories > Sub-tasks.
15
15
  Each sub-task is scoped to exactly one repo and includes an empirical verification plan.
16
16
 
17
17
  This skill is the Linear counterpart of `lisa:notion-to-tracker` and `lisa:confluence-to-tracker`. 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.
@@ -101,13 +101,20 @@ Extract the trailing `<short-id>` (the alphanumeric segment after the last `-` i
101
101
 
102
102
  ## Configuration
103
103
 
104
- This skill reads project-specific configuration from environment variables. If these are not set, ask the user for the values before proceeding.
104
+ This skill reads project configuration from `.lisa.config.json` (with `.lisa.config.local.json` overriding per key) and operational E2E test config from environment variables. See the `config-resolution` rule for the full schema.
105
+
106
+ ### From `.lisa.config.json`
107
+
108
+ This skill is a **PRD source** (Linear); destination tracker resolution is handled by `lisa:tracker-write` and `lisa:tracker-validate` internally — this skill does NOT read `tracker` directly. The relevant config for the source side:
109
+
110
+ | Field | Purpose | Required when |
111
+ |-------|---------|---------------|
112
+ | `linear.workspace` | Linear workspace slug (used for URL synthesis on remote links) | always |
113
+
114
+ ### From environment variables (E2E test config — operational, not tracker)
105
115
 
106
116
  | Variable | Purpose | Example |
107
117
  |----------|---------|---------|
108
- | `JIRA_PROJECT` | JIRA project key for ticket creation | `SE` |
109
- | `JIRA_SERVER` | Atlassian instance URL (site host) | `mycompany.atlassian.net` |
110
- | `LINEAR_WORKSPACE` | Linear workspace slug (used for URL synthesis on JIRA remote links) | `acme` |
111
118
  | `E2E_TEST_PHONE` | Test user phone number for verification plans | `0000000099` |
112
119
  | `E2E_TEST_OTP` | Test user OTP code | `555555` |
113
120
  | `E2E_TEST_ORG` | Test organization name | `Arsenal` |
@@ -144,17 +151,17 @@ PRDs typically reference external design, UX, and data artifacts (Figma files, L
144
151
  - Embedded images and file attachments referenced in the project / documents
145
152
  - Fenced code blocks with example data (JSON, SQL, GraphQL, cURL request/response)
146
153
 
147
- 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.
154
+ 2. **Classify each artifact and apply taxonomy rules** by invoking the `lisa:tracker-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.
148
155
 
149
156
  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).
150
157
 
151
- 4. **Surface coverage smells** as defined in `lisa:jira-source-artifacts` §5. Record any detected smells on the epic.
158
+ 4. **Surface coverage smells** as defined in `lisa:tracker-source-artifacts` §5. Record any detected smells on the epic.
152
159
 
153
160
  ### Phase 1.6: Source Precedence & Conflict Resolution
154
161
 
155
- 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.
162
+ Source precedence rules and cross-axis conflict handling are defined in `lisa:tracker-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.
156
163
 
157
- The existing-component reuse expectation is defined in `lisa:jira-source-artifacts` §7. Encode it on every UI-touching story.
164
+ The existing-component reuse expectation is defined in `lisa:tracker-source-artifacts` §7. Encode it on every UI-touching story.
158
165
 
159
166
  ### Phase 2: Codebase + Live Product Research
160
167
 
@@ -174,7 +181,7 @@ Walkthrough findings are surfaced back to product via the orchestrating intake s
174
181
 
175
182
  For each epic identified in Phase 1, **invoke the `lisa:tracker-write` skill** (do not call `createJiraIssue` directly). Pass it everything it needs to enforce its quality gates:
176
183
 
177
- - `project_key`: from `JIRA_PROJECT` config
184
+ - `project_key`: resolved by `lisa:tracker-write` from `.lisa.config.json`
178
185
  - `issue_type`: `Epic`
179
186
  - `summary`: epic title from the PRD
180
187
  - `description_body`: a draft of the 3-audience description containing:
@@ -202,7 +209,7 @@ For each Epic, plan two kinds of stories:
202
209
 
203
210
  For each story, **invoke `lisa:tracker-write`** with:
204
211
 
205
- - `project_key`: from `JIRA_PROJECT` config
212
+ - `project_key`: resolved by `lisa:tracker-write` from `.lisa.config.json`
206
213
  - `issue_type`: `Story`
207
214
  - `epic_parent`: the Epic key captured in Phase 3 (mandatory)
208
215
  - `summary`: prefixed per the naming convention above
@@ -230,7 +237,7 @@ Sub-tasks inherit their parent story's artifacts by reference (the parent link).
230
237
 
231
238
  ### Phase 5.5: Artifact Preservation Gate (mandatory)
232
239
 
233
- 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`.
240
+ Run the preservation gate defined in `lisa:tracker-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:tracker-source-artifacts`.
234
241
 
235
242
  To run the gate, this skill must:
236
243
 
@@ -0,0 +1,270 @@
1
+ ---
2
+ name: linear-validate-issue
3
+ description: "Validates a proposed Linear work item spec (Project, Issue, or sub-Issue) — or an existing Linear item — against the organizational quality gates without writing anything. Returns a structured PASS/FAIL report per gate with concrete remediation. Single source of truth for what makes a valid Linear item — both the write path (linear-write-issue runs it pre-write) and the dry-run path (linear-to-tracker runs it during PRD intake) call this skill so the bar can never drift."
4
+ allowed-tools: ["Bash", "mcp__linear-server__list_teams", "mcp__linear-server__get_team", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_issue_labels", "mcp__linear-server__list_project_labels"]
5
+ ---
6
+
7
+ # Validate Linear Work Item: $ARGUMENTS
8
+
9
+ Run all organizational quality gates against a Linear work item spec OR an existing Linear item. **This skill is read-only — it never writes to Linear.** The output is a structured report consumed by callers (`lisa:linear-write-issue` for pre-write gating, `lisa:linear-to-tracker` for PRD dry-run, `lisa:linear-verify` for post-write checks).
10
+
11
+ ## Configuration
12
+
13
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override) for any feasibility lookups.
14
+
15
+ ## Input
16
+
17
+ `$ARGUMENTS` is one of:
18
+
19
+ 1. **An existing Linear identifier** (e.g. `ENG-123` for an Issue, or `<workspace>/project/<slug>-<id>` for a Project): fetch and validate the live state.
20
+ 2. **A proposed item spec** (YAML block, see schema below): validate as-is without touching Linear.
21
+
22
+ ### Spec schema
23
+
24
+ ```yaml
25
+ issue_type: Story # Epic | Story | Task | Bug | Spike | Sub-task | Improvement
26
+ team_key: ENG
27
+ summary: "[CU-1.2] Upload contract PDF from settings"
28
+ priority: 3 # Linear native: 0=No priority, 1=Urgent, 2=High, 3=Medium, 4=Low
29
+ parent_project_id: <uuid> # Required for Story/Task/Improvement when in Epic context
30
+ parent_issue_id: <uuid> # Required for Sub-task (the Story Issue)
31
+ description: | # Full description text — every required section
32
+ ## Context / Business Value
33
+ ...
34
+
35
+ ## Technical Approach
36
+ ...
37
+
38
+ ## Acceptance Criteria
39
+ 1. Given <precondition>
40
+ When <action>
41
+ Then <observable outcome>
42
+
43
+ ## Out of Scope
44
+ ...
45
+
46
+ ## Target Backend Environment
47
+ dev
48
+
49
+ ## Sign-in Required
50
+ Account: ...
51
+
52
+ ## Repository
53
+ backend-api
54
+
55
+ ## Validation Journey
56
+ ...
57
+
58
+ # Behavioral flags — caller asserts these so the validator picks the right gates
59
+ runtime_behavior_change: true # → requires Target Backend Environment + Validation Journey
60
+ authenticated_surface: true # → requires Sign-in Required
61
+ artifacts_attached: true # → requires Source Precedence section
62
+ relations: [{ id: "ENG-99", type: "blocked_by" }] # known issue relations (may be empty)
63
+ remote_links: [{ url: "https://github.com/...", title: "PR #42" }]
64
+ ```
65
+
66
+ If the caller passes only an identifier, fetch the item via `mcp__linear-server__get_issue` (Issue) or `mcp__linear-server__get_project` (Project), derive the same fields from the fetched data, then run gates.
67
+
68
+ ## Gates
69
+
70
+ Gates are grouped into **Specification** (spec-only checks, no Linear lookups) and **Feasibility** (requires Linear lookups). The dry-run path may opt to run Specification gates only; the write path runs both.
71
+
72
+ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Categories drive how downstream callers (notably `lisa:linear-prd-intake`) translate failures into product-facing comments; `product_relevant=false` failures indicate internal data-quality problems the agent should fix itself rather than ask product to clarify.
73
+
74
+ | Gate | Category | Product-relevant |
75
+ |------|----------|------------------|
76
+ | S1 Required core fields | `structural` | false |
77
+ | S2 Summary format | `structural` | false |
78
+ | S3 Description three audiences | `product-clarity` | true |
79
+ | S4 Acceptance criteria in Gherkin | `acceptance-criteria` | true |
80
+ | S5 Bug-specific content | `product-clarity` | true |
81
+ | S6 Spike-specific content | `scope` | true |
82
+ | S7 Project parent declared | `structural` | false |
83
+ | S8 Target Backend Environment | `technical` | false |
84
+ | S9 Sign-in Required | `technical` | false |
85
+ | S10 Single-repo scope | `scope` | true |
86
+ | S11 Validation Journey | `acceptance-criteria` | true |
87
+ | S12 Source Precedence | `design-ux` | true |
88
+ | S13 Relationship Search | `dependency` | true |
89
+ | F1 Issue type valid in team | `structural` | false |
90
+ | F2 Project parent exists and is in same team | `structural` | false |
91
+ | F3 Linked items exist | `structural` | false |
92
+ | F4 Required labels exist (or can be created) | `structural` | false |
93
+
94
+ Category values are the same fixed set as `lisa:jira-validate-ticket`:
95
+
96
+ - `product-clarity` — feature behavior or user intent unclear in the PRD
97
+ - `acceptance-criteria` — pass/fail conditions missing or ambiguous
98
+ - `design-ux` — visual or interaction spec missing
99
+ - `scope` — boundary unclear, items overlap, split needed
100
+ - `dependency` — blocked by another team / system / decision
101
+ - `data` — data source / shape / volume unspecified
102
+ - `technical` — engineering decision required
103
+ - `structural` — internal data-quality problem the agent must fix itself, not surface to product
104
+
105
+ ### Specification Gates
106
+
107
+ #### S1 — Required core fields
108
+
109
+ `team_key`, `issue_type`, `summary`, `priority`, `description` must all be present and non-empty.
110
+
111
+ #### S2 — Summary format
112
+
113
+ - Single line, ≤ 100 characters
114
+ - Imperative voice ("Add X", "Fix Y", not "Adding X" or "X is broken")
115
+ - Bug / Task / Sub-task summaries SHOULD start with a `[repo-name]` prefix when the project convention uses one
116
+
117
+ #### S3 — Description has all three audiences
118
+
119
+ Description text must include all of these sections (case-insensitive `##` markdown headings):
120
+ - `Context / Business Value` — stakeholder-facing
121
+ - `Technical Approach` — developer-facing
122
+ - `Acceptance Criteria` — coding-assistant-facing
123
+ - `Out of Scope` — explicit non-coverage list
124
+
125
+ Missing any → FAIL with name of missing section.
126
+
127
+ #### S4 — Acceptance criteria in Gherkin
128
+
129
+ Applies when `issue_type ∈ {Story, Task, Bug, Sub-task, Improvement}`.
130
+
131
+ The `Acceptance Criteria` section must contain at least one criterion in `Given / When / Then` form. Reject prose-only criteria, "should work" language, or numbered lists without Given/When/Then verbs.
132
+
133
+ #### S5 — Bug-specific content
134
+
135
+ When `issue_type = Bug`, description must additionally include:
136
+ - Reproduction steps
137
+ - Expected vs. actual behavior
138
+ - Environment where reproduced
139
+
140
+ #### S6 — Spike-specific content
141
+
142
+ When `issue_type = Spike`, description must include:
143
+ - The question being answered
144
+ - Definition of done (decision doc / prototype / findings deliverable)
145
+
146
+ #### S7 — Project parent declared
147
+
148
+ When `issue_type ∈ {Story, Task, Improvement}` AND the item is part of an Epic context, `parent_project_id` must be set. When `issue_type = Sub-task`, `parent_issue_id` must be set. (Validity of the IDs is checked in feasibility gates.)
149
+
150
+ For top-level Bug / Spike not under an Epic, this gate is N/A.
151
+
152
+ #### S8 — Target Backend Environment
153
+
154
+ When `runtime_behavior_change = true`, description must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
155
+
156
+ #### S9 — Sign-in Required
157
+
158
+ When `authenticated_surface = true`, description must contain `## Sign-in Required` naming the account/role and credential source.
159
+
160
+ If the spec doesn't set `authenticated_surface`, infer it: scan the description and AC for sign-in / login / "as a {role} user" / authenticated route signals. If signals present and no `Sign-in Required` section: FAIL.
161
+
162
+ #### S10 — Repository section, single-repo scope
163
+
164
+ When `issue_type ∈ {Bug, Task, Sub-task}`, description must contain `## Repository` naming exactly one repo. Multiple repos OR cross-repo references in AC: FAIL with recommendation to split.
165
+
166
+ Story / Epic / Spike / Improvement: skipped (may span repos).
167
+
168
+ #### S11 — Validation Journey present
169
+
170
+ When `runtime_behavior_change = true`, description must contain `## Validation Journey`. Skipped for doc-only / config-only / type-only / Epic.
171
+
172
+ The caller controls strictness via `journey_followup: "auto"` or `"none"`:
173
+ - `auto` (default): missing section returns `FAIL` with remediation `"Invoke lisa:linear-add-journey to append the section after create"`. The write path auto-fixes; dry-run path leaves it as a FAIL the caller must address.
174
+ - `none`: missing section is a `FAIL` the caller will not auto-fix.
175
+
176
+ #### S12 — Source Precedence (when artifacts attached)
177
+
178
+ When `artifacts_attached = true`, description must include source-precedence guidance covering: business rules → PRD body, visual treatment → mocks, flow → prototypes, API/data → data artifacts. Cross-axis conflicts surfaced under `## Open Questions`.
179
+
180
+ Accept either placement:
181
+ - A dedicated `## Source Precedence` subsection, OR
182
+ - A "Source Precedence" / "authoritative source" paragraph under `Technical Approach` covering the four axes.
183
+
184
+ Detect by scanning for the phrase `Source Precedence` (case-insensitive) anywhere in the description AND verifying the four axes are each named. Missing the phrase OR any axis: FAIL with remediation naming the missing axes.
185
+
186
+ #### S13 — Relationship Search documented
187
+
188
+ The item must EITHER have at least one entry in `relations`, OR the description / a comment must contain a `## Relationship Search` block listing the git history queries and Linear MCP queries that were run with their outcomes.
189
+
190
+ An item with zero relations and no documented search: FAIL.
191
+
192
+ ### Feasibility Gates (require Linear lookups; skip in dry-run if requested)
193
+
194
+ #### F1 — Issue type valid in team
195
+
196
+ For Issue types: confirm the team supports the issue type via `mcp__linear-server__get_team`. Linear issue types are typically per-team; check that the requested type exists.
197
+
198
+ For Epic (Project): confirm the team allows projects.
199
+
200
+ #### F2 — Project parent exists and is in same team
201
+
202
+ When `parent_project_id` is set: fetch via `mcp__linear-server__get_project`, confirm it exists and belongs to the configured team.
203
+
204
+ When `parent_issue_id` is set (Sub-task case): fetch via `mcp__linear-server__get_issue`, confirm the issue is non-Sub-task and in the same team / project.
205
+
206
+ #### F3 — Linked items exist
207
+
208
+ For each entry in `relations`, call `mcp__linear-server__get_issue` to confirm the identifier resolves. Flag broken identifiers.
209
+
210
+ #### F4 — Required labels exist (or can be created)
211
+
212
+ For each label referenced (`status:*`, `component:<name>`, `prd-*`), confirm via `mcp__linear-server__list_issue_labels` (or `list_project_labels` for Project labels) that it exists OR is creatable. Linear labels are team-scoped or workspace-scoped; flag if the requested scope is wrong.
213
+
214
+ ## Execution
215
+
216
+ 1. Parse `$ARGUMENTS`. If it's an identifier, fetch the item and derive the spec from the fetched fields. Otherwise parse the YAML spec.
217
+ 2. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})` if any feasibility gate will run.
218
+ 3. Run every Specification gate in order. Collect PASS / FAIL / N/A with a one-line reason.
219
+ 4. Unless the caller passed `--spec-only` (dry-run), run every Feasibility gate. Collect results.
220
+ 5. Emit the report below.
221
+
222
+ ## Output
223
+
224
+ Output is a single fenced text block. Callers parse it; do not add free-form prose around it.
225
+
226
+ ```text
227
+ ## linear-validate-issue: <IDENTIFIER-or-SUMMARY>
228
+
229
+ ### Specification Gates
230
+ - [PASS|FAIL|N/A] S1 Required core fields — <one-line reason>
231
+ - [PASS|FAIL|N/A] S2 Summary format — <one-line reason>
232
+ - [PASS|FAIL|N/A] S3 Description three audiences — <one-line reason>
233
+ - [PASS|FAIL|N/A] S4 Acceptance criteria in Gherkin — <one-line reason>
234
+ - [PASS|FAIL|N/A] S5 Bug-specific content — <one-line reason>
235
+ - [PASS|FAIL|N/A] S6 Spike-specific content — <one-line reason>
236
+ - [PASS|FAIL|N/A] S7 Project parent declared — <one-line reason>
237
+ - [PASS|FAIL|N/A] S8 Target Backend Environment — <one-line reason>
238
+ - [PASS|FAIL|N/A] S9 Sign-in Required — <one-line reason>
239
+ - [PASS|FAIL|N/A] S10 Single-repo scope — <one-line reason>
240
+ - [PASS|FAIL|N/A] S11 Validation Journey — <one-line reason>
241
+ - [PASS|FAIL|N/A] S12 Source Precedence — <one-line reason>
242
+ - [PASS|FAIL|N/A] S13 Relationship Search — <one-line reason>
243
+
244
+ ### Feasibility Gates (omit when --spec-only)
245
+ - [PASS|FAIL|N/A] F1 Issue type valid in team — <one-line reason>
246
+ - [PASS|FAIL|N/A] F2 Project parent exists and is in same team — <one-line reason>
247
+ - [PASS|FAIL|N/A] F3 Linked items exist — <one-line reason>
248
+ - [PASS|FAIL|N/A] F4 Required labels exist (or can be created) — <one-line reason>
249
+
250
+ ### Verdict: PASS | FAIL
251
+ ### Failures: <count>
252
+ ### Failure details
253
+ - gate: <gate-id>
254
+ category: <category>
255
+ product_relevant: <true|false>
256
+ what: <plain-language description, no gate-IDs, no Linear jargon>
257
+ recommendation: <1–3 concrete options>
258
+ - gate: ...
259
+ ```
260
+
261
+ The verdict is `PASS` if and only if every applicable gate is `PASS`. Any `FAIL` makes the verdict `FAIL`. `N/A` does not affect the verdict.
262
+
263
+ ## Rules
264
+
265
+ - Never write to Linear. The `allowed-tools` list intentionally excludes any `save_*` tool.
266
+ - Never auto-fix the spec. This skill reports gaps; callers decide what to do.
267
+ - Never silently skip a gate. If a gate genuinely doesn't apply, return `N/A` with the reason.
268
+ - The `what` and `recommendation` fields must be concrete and product-readable — the dry-run path turns each failure into a Linear comment. Vague guidance is useless; always give 1–3 candidate resolutions.
269
+ - Never emit a category outside the fixed set.
270
+ - `product_relevant` is determined by the gate, not by the failure context.