@codyswann/lisa 2.10.0 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
- package/plugins/lisa/agents/github-prd-intake.md +2 -2
- package/plugins/lisa/agents/linear-agent.md +128 -0
- package/plugins/lisa/agents/linear-build-intake.md +62 -0
- package/plugins/lisa/agents/linear-prd-intake.md +2 -2
- package/plugins/lisa/agents/notion-prd-intake.md +1 -1
- package/plugins/lisa/commands/plan.md +1 -1
- package/plugins/lisa/rules/config-resolution.md +187 -0
- package/plugins/lisa/rules/intent-routing.md +13 -13
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
- package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
- package/plugins/lisa/skills/github-create/SKILL.md +4 -4
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
- package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
- package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
- package/plugins/lisa/skills/implement/SKILL.md +1 -1
- package/plugins/lisa/skills/intake/SKILL.md +3 -3
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
- package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
- package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
- package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
- package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
- package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
- package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
- package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
- package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
- package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
- package/plugins/lisa/skills/plan/SKILL.md +3 -2
- package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
- package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
- package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
- package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
- package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
- package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
- package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
- package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
- package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
- package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
- package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
- package/plugins/lisa/skills/verify/SKILL.md +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/skills/jira-create/SKILL.md +4 -4
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
- package/plugins/src/base/agents/github-prd-intake.md +2 -2
- package/plugins/src/base/agents/linear-agent.md +128 -0
- package/plugins/src/base/agents/linear-build-intake.md +62 -0
- package/plugins/src/base/agents/linear-prd-intake.md +2 -2
- package/plugins/src/base/agents/notion-prd-intake.md +1 -1
- package/plugins/src/base/commands/plan.md +1 -1
- package/plugins/src/base/rules/config-resolution.md +187 -0
- package/plugins/src/base/rules/intent-routing.md +13 -13
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
- package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
- package/plugins/src/base/skills/github-create/SKILL.md +4 -4
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
- package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
- package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
- package/plugins/src/base/skills/implement/SKILL.md +1 -1
- package/plugins/src/base/skills/intake/SKILL.md +3 -3
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
- package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
- package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
- package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
- package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
- package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
- package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
- package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
- package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
- package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
- package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
- package/plugins/src/base/skills/plan/SKILL.md +3 -2
- package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
- package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
- package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
- package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
- package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
- package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
- package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
- package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
- package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
- package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
- package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
- package/plugins/src/base/skills/verify/SKILL.md +1 -1
- package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
- package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
- package/typescript/copy-overwrite/.prettierignore +7 -1
- package/plugins/lisa/rules/tracker-resolution.md +0 -76
- 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
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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`:
|
|
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`:
|
|
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:
|
|
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.
|