@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,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.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear-verify
|
|
3
|
+
description: "Verifies a Linear work item meets organizational standards by fetching the live item and running it through lisa:linear-validate-issue. Catches anything dropped or reformatted on write — same gates as the pre-write check, but applied to what Linear actually stored. Read-only."
|
|
4
|
+
allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__get_project", "mcp__linear-server__list_issue_labels", "mcp__linear-server__list_project_labels"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Verify Linear Work Item: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Fetch the live Linear work item and run it through `lisa:linear-validate-issue`. This catches any field that was dropped or reformatted between the pre-write spec and what Linear stored.
|
|
10
|
+
|
|
11
|
+
This skill is the destination of the `lisa:tracker-verify` shim when `tracker = "linear"`. Read-only — never writes.
|
|
12
|
+
|
|
13
|
+
## Configuration
|
|
14
|
+
|
|
15
|
+
Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
|
|
16
|
+
|
|
17
|
+
## Input
|
|
18
|
+
|
|
19
|
+
`$ARGUMENTS` is a Linear identifier:
|
|
20
|
+
- An Issue identifier (e.g. `ENG-123`)
|
|
21
|
+
- A Project URL or slug (e.g. `https://linear.app/<workspace>/project/<slug>-<id>`)
|
|
22
|
+
|
|
23
|
+
If `$ARGUMENTS` is not parseable, stop and report.
|
|
24
|
+
|
|
25
|
+
## Phase 1 — Resolve Context
|
|
26
|
+
|
|
27
|
+
1. Read `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
|
|
28
|
+
2. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})`.
|
|
29
|
+
3. Determine entity type from the identifier shape:
|
|
30
|
+
- `<TEAM>-<n>` → Issue
|
|
31
|
+
- URL containing `/project/<slug>-<id>` → Project
|
|
32
|
+
|
|
33
|
+
## Phase 2 — Fetch Live State
|
|
34
|
+
|
|
35
|
+
Call `mcp__linear-server__get_issue` (for Issues) or `mcp__linear-server__get_project` (for Projects). Capture every field, label, relation, comment, milestone, and project membership.
|
|
36
|
+
|
|
37
|
+
## Phase 3 — Delegate to Validator
|
|
38
|
+
|
|
39
|
+
Pass the fetched item to `lisa:linear-validate-issue` (in identifier mode — let it derive the spec from the live state). The validator runs both Specification AND Feasibility gates against what Linear actually stored.
|
|
40
|
+
|
|
41
|
+
## Phase 4 — Report
|
|
42
|
+
|
|
43
|
+
Return the validator's report verbatim — same structured format as `lisa:linear-validate-issue`. Callers (especially `lisa:linear-write-issue` Phase 7) parse the verdict to decide whether to declare success.
|
|
44
|
+
|
|
45
|
+
If the verdict is `FAIL`, the caller should fix the item and re-run verify. Never declare success on a `FAIL` verdict.
|
|
46
|
+
|
|
47
|
+
## Rules
|
|
48
|
+
|
|
49
|
+
- Never write to Linear. Read-only.
|
|
50
|
+
- Never short-circuit the validator. Always run the full gate set.
|
|
51
|
+
- If `get_issue` / `get_project` returns an access error, surface it and exit — don't pretend the item is fine.
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear-write-issue
|
|
3
|
+
description: "Creates or updates a Linear work item — Project (Epic), Issue (Story), or sub-Issue (Sub-task) — following organizational best practices. Polymorphic: dispatches internally on issue_type to save_project (Epic) or save_issue (Story / Sub-task). Enforces description quality (three audiences), Gherkin acceptance criteria, project-as-parent for Stories, parentId for Sub-tasks, explicit relationship discovery (blocks / is blocked by / relates to / duplicates), labels, components-as-labels, project milestones for fix versions, native priority and estimate fields, and Validation Journey. Rejects thin items — use this skill any time a Linear work item is created or significantly edited."
|
|
4
|
+
allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_team", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_comments", "mcp__linear-server__save_comment"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Write Linear Work Item: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Create or update a Linear work item — Project (for Epics), Issue (for Stories), or sub-Issue (for Sub-tasks) — with all required relationships, metadata, and quality gates. Every section below is mandatory. Thin items are rejected.
|
|
10
|
+
|
|
11
|
+
Repository name for scoped comments: `basename $(git rev-parse --show-toplevel)`.
|
|
12
|
+
|
|
13
|
+
## Configuration
|
|
14
|
+
|
|
15
|
+
This skill reads configuration from `.lisa.config.json` (with `.lisa.config.local.json` overriding per key). Required keys:
|
|
16
|
+
|
|
17
|
+
- `linear.workspace` — Linear workspace slug
|
|
18
|
+
- `linear.teamKey` — Linear team key (e.g. `ENG`); the team owns the destination items
|
|
19
|
+
|
|
20
|
+
If either is missing, stop and report — never invent values.
|
|
21
|
+
|
|
22
|
+
## Polymorphic dispatch
|
|
23
|
+
|
|
24
|
+
Linear's data model maps Epic / Story / Sub-task to **different entity types**. This skill dispatches on `issue_type`:
|
|
25
|
+
|
|
26
|
+
| `issue_type` | Linear entity | MCP write tool | Parent field |
|
|
27
|
+
|--------------|---------------|----------------|--------------|
|
|
28
|
+
| `Epic` | **Project** | `mcp__linear-server__save_project` | (none — Projects are top-level within a team) |
|
|
29
|
+
| `Story` / `Task` / `Improvement` | **Issue** | `mcp__linear-server__save_issue` | `projectId` (the Epic Project) |
|
|
30
|
+
| `Sub-task` | **sub-Issue** | `mcp__linear-server__save_issue` | `parentId` (the Story Issue) |
|
|
31
|
+
| `Bug` | **Issue** | `mcp__linear-server__save_issue` | `projectId` if part of an Epic; else top-level |
|
|
32
|
+
| `Spike` | **Issue** | `mcp__linear-server__save_issue` | `projectId` if part of an Epic; else top-level |
|
|
33
|
+
|
|
34
|
+
Status workflow uses **labels** (`status:ready`, `status:in-progress`, `status:on-dev`, `status:done`) for portability across teams — Linear's per-team workflow state names vary, but labels are workspace-scoped and stable. Native Linear `state` is set to the team's default `Todo` state on create.
|
|
35
|
+
|
|
36
|
+
## Phase 1 — Resolve Intent
|
|
37
|
+
|
|
38
|
+
Determine from `$ARGUMENTS` and context whether this is a CREATE or UPDATE:
|
|
39
|
+
|
|
40
|
+
- **CREATE**: no existing identifier provided.
|
|
41
|
+
- **UPDATE**: identifier provided (`<TEAM>-<n>` for Issue, project slug + short-id for Project) — call `/linear-read-issue <ref>` first to load the full current state. Never overwrite without reading.
|
|
42
|
+
|
|
43
|
+
Resolve the team ID for `linear.teamKey` via `mcp__linear-server__list_teams({query: <teamKey>})`. Cache it.
|
|
44
|
+
|
|
45
|
+
## Phase 2 — Gather Required Inputs
|
|
46
|
+
|
|
47
|
+
Required fields (stop and ask if missing — never invent values):
|
|
48
|
+
|
|
49
|
+
| Field | Required For | Notes |
|
|
50
|
+
|-------|--------------|-------|
|
|
51
|
+
| `team_key` | CREATE | From `linear.teamKey` config; required for both Project and Issue creation |
|
|
52
|
+
| `issue_type` | CREATE | One of: Epic, Story, Task, Bug, Spike, Sub-task, Improvement |
|
|
53
|
+
| Summary | CREATE, UPDATE | One line, imperative voice, under 100 chars |
|
|
54
|
+
| Description | CREATE, UPDATE | Multi-section markdown — see Phase 3 |
|
|
55
|
+
| Project parent (for Story / Task / Bug / Spike / Improvement when part of an Epic) | non-Epic, non-Sub-task in Epic context | Linear Project ID — the Epic |
|
|
56
|
+
| Sub-task parent | Sub-task | Linear Issue ID — the Story |
|
|
57
|
+
| Priority | CREATE | Native Linear priority: 0=No priority, 1=Urgent, 2=High, 3=Medium, 4=Low |
|
|
58
|
+
| Acceptance criteria | Story, Task, Bug, Sub-task, Improvement | Gherkin — see Phase 3 |
|
|
59
|
+
| Validation Journey | Runtime-behavior changes | Delegate to `/linear-add-journey` |
|
|
60
|
+
| Target backend environment | Runtime-behavior changes | `dev` / `staging` / `prod`; recorded in description (Phase 3). Skip only for doc/config/type-only items. |
|
|
61
|
+
| Sign-in account / credentials | Items that touch authenticated surfaces | Name the account (or source — 1Password item, env var, seeded fixture) and role; recorded in description. Omit when sign-in is not required. |
|
|
62
|
+
| Single-repo scope | Bug, Task, Sub-task | These types MUST cover one repo only. If the work crosses repos, split it before creating. Epic / Spike / Story may span repos. |
|
|
63
|
+
|
|
64
|
+
Optional but recommended: assignee, estimate (story points), labels, project milestone (fix-version equivalent), cycle.
|
|
65
|
+
|
|
66
|
+
## Phase 3 — Description Quality
|
|
67
|
+
|
|
68
|
+
Linear descriptions are markdown (NOT Jira wiki markup — no `h2.` headings, use `##` instead). The description MUST address three audiences. Reject and rewrite if any are missing.
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
## Context / Business Value
|
|
72
|
+
[Why this matters. Stakeholder-facing. Concrete user impact or business outcome.
|
|
73
|
+
Link to the originating Slack thread, Notion doc, incident, or customer report.]
|
|
74
|
+
|
|
75
|
+
## Technical Approach
|
|
76
|
+
[Developer-facing. Integration points, impacted modules, data model implications,
|
|
77
|
+
relevant tradeoffs. Not a full design doc — a pointer for someone picking it up.]
|
|
78
|
+
|
|
79
|
+
## Acceptance Criteria
|
|
80
|
+
1. Given <precondition>
|
|
81
|
+
When <action>
|
|
82
|
+
Then <observable outcome>
|
|
83
|
+
2. Given <precondition>
|
|
84
|
+
When <action>
|
|
85
|
+
Then <observable outcome>
|
|
86
|
+
|
|
87
|
+
## Out of Scope
|
|
88
|
+
[Explicit list of what this item does NOT cover. Forces scope discipline.]
|
|
89
|
+
|
|
90
|
+
## Target Backend Environment
|
|
91
|
+
[Required when the item changes runtime behavior. One of: dev / staging / prod.
|
|
92
|
+
Skip section entirely for doc-only, config-only, or type-only items.]
|
|
93
|
+
|
|
94
|
+
## Sign-in Required
|
|
95
|
+
[Include this section ONLY if the work touches authenticated surfaces.
|
|
96
|
+
Specify: the account/role to sign in as, where to get the credentials
|
|
97
|
+
(1Password item name, env var, seeded fixture), and any MFA/SSO notes.
|
|
98
|
+
Omit the section entirely when sign-in is not required.]
|
|
99
|
+
|
|
100
|
+
## Repository
|
|
101
|
+
[Required for Bug / Task / Sub-task. Name the single repo this item covers.
|
|
102
|
+
If the work spans repos, this issue type is wrong — split into per-repo
|
|
103
|
+
Tasks/Sub-tasks under a parent Story or Epic.]
|
|
104
|
+
|
|
105
|
+
## Validation Journey
|
|
106
|
+
[Delegate to /linear-add-journey if the item changes runtime behavior.
|
|
107
|
+
Skip only for doc-only, config-only, or type-only items.]
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Rules:
|
|
111
|
+
- Every acceptance criterion uses Given/When/Then. No vague "should work" language.
|
|
112
|
+
- Every criterion is independently verifiable (UI, API, data, or performance check).
|
|
113
|
+
- If the item is a Bug, include reproduction steps, expected vs. actual behavior, and environment.
|
|
114
|
+
- If the item is a Spike, include the question being answered and the definition of done (decision doc, prototype, or findings).
|
|
115
|
+
- If sign-in is required, the implementer must be able to sign in from the description alone — never assume they will guess the account or hunt for credentials.
|
|
116
|
+
|
|
117
|
+
## Phase 4 — Relationship Discovery (Mandatory)
|
|
118
|
+
|
|
119
|
+
Before creating or updating, find candidate relationships. Do NOT skip — this is the step agents most often omit.
|
|
120
|
+
|
|
121
|
+
### 4a. Project Parent (Epic-equivalent)
|
|
122
|
+
|
|
123
|
+
If the item is **not an Epic** and **not a top-level Bug/Spike**, it MUST have a parent context:
|
|
124
|
+
|
|
125
|
+
- **Story / Task / Improvement** → must have a `projectId` (the Epic Project) set.
|
|
126
|
+
- **Sub-task** → must have a `parentId` (the Story Issue) set.
|
|
127
|
+
|
|
128
|
+
If the parent is explicitly provided, use it. Otherwise:
|
|
129
|
+
|
|
130
|
+
1. Search active Projects in the team:
|
|
131
|
+
```text
|
|
132
|
+
mcp__linear-server__list_projects({team: <teamKey>, state: ["backlog", "planned", "started"]})
|
|
133
|
+
```
|
|
134
|
+
Match on keywords from the summary and description.
|
|
135
|
+
2. If no matching Project exists, stop and ask the human to create or pick one. Do NOT orphan the item.
|
|
136
|
+
|
|
137
|
+
### 4b. Related Items
|
|
138
|
+
|
|
139
|
+
Relationship discovery is **mandatory** on every create and every update — never declare "no related work" without doing both searches below and recording their outcomes on the item.
|
|
140
|
+
|
|
141
|
+
**Search 1: local git history** (catches PRs / commits that touched the same area but were never linked):
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
git log --all --oneline --grep="<keyword>"
|
|
145
|
+
git log --all --oneline -- <path-or-glob>
|
|
146
|
+
git log --since=90.days --oneline -- <path-or-glob>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
If the git search surfaces a PR or commit that relates to this work, capture the PR URL — it becomes a remote link (Phase 4c) and may also point to a sibling item worth linking.
|
|
150
|
+
|
|
151
|
+
**Search 2: Linear MCP** (catches open and recently-closed items):
|
|
152
|
+
|
|
153
|
+
```text
|
|
154
|
+
# Open items in the same Project
|
|
155
|
+
mcp__linear-server__list_issues({project: <projectId>, state_type: ["unstarted", "started"]})
|
|
156
|
+
|
|
157
|
+
# Open items with overlapping keywords (workspace-wide)
|
|
158
|
+
mcp__linear-server__list_issues({query: "<keyword>", state_type: ["unstarted", "started"]})
|
|
159
|
+
|
|
160
|
+
# Items with shared labels
|
|
161
|
+
mcp__linear-server__list_issues({label: "<label>", updatedAt: ">-30d"})
|
|
162
|
+
|
|
163
|
+
# Recently closed items in the same Project
|
|
164
|
+
mcp__linear-server__list_issues({project: <projectId>, state_type: ["completed", "canceled"], updatedAt: ">-30d"})
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Record the outcome.** Add a `## Relationship Search` subsection (or a comment if updating) listing the queries you ran and what they returned. If the searches yielded nothing, write that explicitly — "Searched git history for `<keywords>` and Linear for project=`X`, label=`Y`; no related work found." An item with zero relations and no documented search is rejected.
|
|
168
|
+
|
|
169
|
+
For each candidate, classify the relationship:
|
|
170
|
+
|
|
171
|
+
| Relation Type | When to Use |
|
|
172
|
+
|---------------|-------------|
|
|
173
|
+
| `blocks` | This item must ship before the linked item can proceed |
|
|
174
|
+
| `blocked_by` | The linked item must ship before this one can proceed |
|
|
175
|
+
| `relates_to` | Shared context, no ordering constraint |
|
|
176
|
+
| `duplicates` | This item already exists — close one as duplicate |
|
|
177
|
+
|
|
178
|
+
Linear native relations are set on the Issue via `save_issue`'s `relations` field (or via a paired `save_issue_relation` call if available in the MCP). For Project-level (Epic) relationships, capture them in the description under `## Related Projects` since Linear doesn't model relations between Projects natively.
|
|
179
|
+
|
|
180
|
+
### 4c. Remote Links
|
|
181
|
+
|
|
182
|
+
Identify and attach (Linear stores attachments / links on the Issue or in description body):
|
|
183
|
+
|
|
184
|
+
- GitHub PRs, branches, or commits related to this work
|
|
185
|
+
- Confluence pages (design docs, RFCs, runbooks)
|
|
186
|
+
- Dashboards (Grafana, Datadog, Sentry issue)
|
|
187
|
+
- Incident items (PagerDuty, Statuspage)
|
|
188
|
+
- **Source artifacts from the originating PRD / parent Project**: classify and inherit per the rules in `lisa:tracker-source-artifacts` (invoke that skill if you haven't loaded the rules in this session). Enumerate the parent Project's links and inherit the ones whose domain matches this item's scope (UI → `ui-design` + `ux-flow`; backend → `data`; infra → `ops`; always inherit `reference`). Never assume a developer will walk up to the Project to find design context — attach it here.
|
|
189
|
+
|
|
190
|
+
If the item was generated from a PRD (by `lisa:notion-to-tracker` or similar) and the parent Project has no source artifacts, surface that as a smell and ask whether artifacts were missed during extraction before proceeding.
|
|
191
|
+
|
|
192
|
+
### 4d. Source Precedence (must appear on the item)
|
|
193
|
+
|
|
194
|
+
Source precedence rules and cross-axis conflict handling are defined in `lisa:tracker-source-artifacts` §3 and §4. When an item carries both design artifacts and a description, record the precedence explicitly in the description (under Technical Approach or a dedicated `## Source Precedence` subsection) so the implementer doesn't silently reconcile conflicts. Cross-axis conflicts go under `## Open Questions` as BLOCKER items.
|
|
195
|
+
|
|
196
|
+
For UI-touching items, include the existing-component reuse expectation per `lisa:tracker-source-artifacts` §7.
|
|
197
|
+
|
|
198
|
+
### 4e. Live Product Walkthrough Findings (UI-touching items)
|
|
199
|
+
|
|
200
|
+
If the item modifies an existing user-facing surface, a `lisa:product-walkthrough` should already have been run upstream. Inherit its findings under a `## Current Product` subsection in the description so the implementer sees what's shipped today before changing it. If the upstream skill skipped the walkthrough but this item clearly modifies an existing surface, invoke `lisa:product-walkthrough` here before proceeding.
|
|
201
|
+
|
|
202
|
+
## Phase 5 — Set Metadata
|
|
203
|
+
|
|
204
|
+
Before create/update, verify each field is populated where applicable:
|
|
205
|
+
|
|
206
|
+
- **Labels**: include `status:ready` for new items; component labels (`component:<name>`); status / priority labels are NOT redundant with native fields — labels exist for portability and downstream queries.
|
|
207
|
+
- **Native priority field**: 0–4 per Linear's scale; explicit, not "unset".
|
|
208
|
+
- **Native estimate**: per Linear's team-configured estimate scale (often 0–8 Fibonacci); skip for Epic / Spike.
|
|
209
|
+
- **ProjectMilestone**: when the team uses dated milestones, set the milestone on the Project (Epic) or on the Issue (when an Issue belongs to a milestone).
|
|
210
|
+
- **Cycle**: only if actively in a cycle.
|
|
211
|
+
- **Assignee**: leave unset if unknown rather than auto-assigning.
|
|
212
|
+
|
|
213
|
+
For Bug / Task / Sub-task, ensure the summary is prefixed with `[<repo-name>]`.
|
|
214
|
+
|
|
215
|
+
## Phase 5.5 — Validate (Pre-write Gate)
|
|
216
|
+
|
|
217
|
+
Before any write, invoke `lisa:linear-validate-issue` with the full proposed spec assembled from Phases 2 / 3 / 4 / 5. Pass it as a YAML block per the `lisa:linear-validate-issue` schema, including `runtime_behavior_change`, `authenticated_surface`, and `artifacts_attached` flags so the right gates run.
|
|
218
|
+
|
|
219
|
+
The validator is the **single source of truth** for what makes a valid Linear work item. The same gates are used by `lisa:linear-to-tracker` dry-run, by `lisa:linear-verify` post-write, and here. Do not re-implement gate logic in this skill.
|
|
220
|
+
|
|
221
|
+
If the validator reports `FAIL`:
|
|
222
|
+
- Surface the failure list and the per-gate remediation to the user.
|
|
223
|
+
- Do NOT proceed to Phase 6. Fix the spec (or stop and ask the human) and re-run validation.
|
|
224
|
+
- Never call `mcp__linear-server__save_project` or `mcp__linear-server__save_issue` while the validator's verdict is FAIL.
|
|
225
|
+
|
|
226
|
+
If the validator reports `PASS`, continue to Phase 6.
|
|
227
|
+
|
|
228
|
+
## Phase 6 — Create or Update
|
|
229
|
+
|
|
230
|
+
### CREATE — Epic (Project)
|
|
231
|
+
|
|
232
|
+
1. Resolve any required Project labels (`prd-ticketed`, etc.) via `mcp__linear-server__list_project_labels` (create via `create_project_label` if missing).
|
|
233
|
+
2. Call `mcp__linear-server__save_project` with: `name` (summary), `description` (markdown), `teamIds: [<teamId>]`, `labelIds`, `priority` (Linear Project priority is also 0–4), `state` (default `backlog`), milestones if dated.
|
|
234
|
+
3. Capture the returned Project ID and slug — Phase 4 children need these.
|
|
235
|
+
4. If the Project is the parent for downstream Stories, record the ID for `lisa:linear-to-tracker` Phase 4 to use.
|
|
236
|
+
|
|
237
|
+
### CREATE — Story / Task / Bug / Spike / Improvement (Issue with projectId)
|
|
238
|
+
|
|
239
|
+
1. Resolve any required Issue labels (`status:ready`, `component:<name>`, `prd-intake-feedback` only if this is a sentinel issue, etc.) via `mcp__linear-server__list_issue_labels` (create via `create_issue_label` if missing).
|
|
240
|
+
2. Call `mcp__linear-server__save_issue` with: `team` (teamId), `title` (summary), `description` (markdown), `projectId` (the Epic Project), `priority` (0–4), `estimate`, `labelIds`, `assignee` if known.
|
|
241
|
+
3. Capture the returned identifier (e.g. `ENG-123`) — Phase 4 sub-tasks need it as `parentId`.
|
|
242
|
+
4. Add relationships from Phase 4b via `save_issue` (relations field) or paired relation calls.
|
|
243
|
+
5. If the item changes runtime behavior, invoke `lisa:linear-add-journey` to append the Validation Journey section.
|
|
244
|
+
|
|
245
|
+
### CREATE — Sub-task (Issue with parentId)
|
|
246
|
+
|
|
247
|
+
1. Resolve labels as above.
|
|
248
|
+
2. Call `mcp__linear-server__save_issue` with: `team` (teamId), `title` (`[<repo>] <summary>` prefix is mandatory), `description` (markdown), `parentId` (the Story Issue ID), `projectId` (inherit from parent), `priority`, `estimate`, `labelIds`.
|
|
249
|
+
3. Capture identifier.
|
|
250
|
+
4. Add relationships via Phase 4b.
|
|
251
|
+
|
|
252
|
+
### UPDATE
|
|
253
|
+
|
|
254
|
+
1. Call `mcp__linear-server__save_project` or `mcp__linear-server__save_issue` with **only the fields being changed**. Do NOT resend fields that weren't in the change set — Linear treats the call as a full overwrite of the listed fields.
|
|
255
|
+
2. Preserve description sections you are not editing — re-read via `/linear-read-issue` first.
|
|
256
|
+
|
|
257
|
+
## Phase 7 — Verify
|
|
258
|
+
|
|
259
|
+
Call the `lisa:linear-verify` skill on the resulting item. `lisa:linear-verify` fetches the live item and runs `lisa:linear-validate-issue` against it — same gates as Phase 5.5, but applied to what Linear actually stored. If it reports failures, fix them before returning. Do not report success on an item that fails verify.
|
|
260
|
+
|
|
261
|
+
## Phase 8 — Announce
|
|
262
|
+
|
|
263
|
+
Post a creation comment via `mcp__linear-server__save_comment` (on the Issue, or on a sentinel issue under the Project for Epic-level announcements) with:
|
|
264
|
+
|
|
265
|
+
- `[<repo>]` prefix if the item is repo-scoped
|
|
266
|
+
- Who the item is assigned to (if known)
|
|
267
|
+
- The relationships that were set (`blocks`, `blocked_by`, `relates_to`) with Linear identifiers
|
|
268
|
+
- Any remote PRs attached
|
|
269
|
+
|
|
270
|
+
Skip this step only on UPDATE when no material change was made.
|
|
271
|
+
|
|
272
|
+
## Rules
|
|
273
|
+
|
|
274
|
+
- Never create a non-Epic, non-top-level item without a parent context (Project for Stories, parentId for Sub-tasks).
|
|
275
|
+
- Never skip relationship discovery — both the git history search AND the Linear MCP search must run, and their outcomes must be recorded on the item. "None found" is acceptable only when it's documented.
|
|
276
|
+
- Never create a Bug, Task, or Sub-task that spans multiple repos. Split it before creating.
|
|
277
|
+
- Never include a runtime-behavior item without a target backend environment, and never include an authenticated-surface item without sign-in credentials in the description.
|
|
278
|
+
- Never invent custom field values. If the team requires a field you don't have, stop and ask.
|
|
279
|
+
- Never overwrite a description without reading the current version first.
|
|
280
|
+
- All Linear writes go through this skill so best practices are enforced uniformly. Downstream skills (e.g. `lisa:linear-create`) should delegate here rather than calling the MCP write tools directly.
|
|
281
|
+
- The gate logic (what makes a valid item) lives in `lisa:linear-validate-issue`, NOT in this skill. This skill calls the validator at Phase 5.5 (pre-write) and Phase 7 (via `lisa:linear-verify` post-write). When a gate needs to change, change it in `lisa:linear-validate-issue` — every caller picks it up automatically.
|
|
282
|
+
- This skill is the destination of the `lisa:tracker-write` shim when `tracker = "linear"`. Vendor-neutral callers (`notion-to-tracker`, `confluence-to-tracker`, `linear-to-tracker`, `github-to-tracker`) MUST go through `lisa:tracker-write`, not call this skill directly.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: notion-prd-intake
|
|
3
|
-
description: "Scans a Notion PRD database for pages with Status=Ready and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and Status=Ticketed; PRDs that fail get clarifying-question comments and Status=Blocked. The skill is the runtime for the Ready → In Review → Blocked|Ticketed lifecycle. Composes existing skills (notion-to-tracker, tracker-validate,
|
|
3
|
+
description: "Scans a Notion PRD database for pages with Status=Ready and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and Status=Ticketed; PRDs that fail get clarifying-question comments and Status=Blocked. The skill is the runtime for the Ready → In Review → Blocked|Ticketed lifecycle. Composes existing skills (notion-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough); does not reimplement their logic."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__claude_ai_Notion__notion-update-page", "mcp__claude_ai_Notion__notion-create-comment", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -27,7 +27,7 @@ Specifically forbidden:
|
|
|
27
27
|
|
|
28
28
|
The only legitimate reasons to stop early:
|
|
29
29
|
|
|
30
|
-
- Missing database URL or required configuration (`
|
|
30
|
+
- Missing database URL or required configuration (`atlassian.cloudId`, `jira.project` or destination-tracker equivalents in `.lisa.config.json`, `E2E_BASE_URL`, etc.). Surface the missing value and exit.
|
|
31
31
|
- Database misconfigured (Status property missing expected values, data source unreachable). Surface and exit.
|
|
32
32
|
- Empty `Ready` set. Exit cleanly with `"No PRDs with Status=Ready. Nothing to do."`
|
|
33
33
|
|
|
@@ -78,7 +78,7 @@ Invoke the `lisa:notion-to-tracker` skill with `dry_run: true` and the PRD's URL
|
|
|
78
78
|
- An overall PASS / FAIL verdict
|
|
79
79
|
- A failure count
|
|
80
80
|
|
|
81
|
-
This call also indirectly invokes `lisa:
|
|
81
|
+
This call also indirectly invokes `lisa:tracker-source-artifacts` (artifact extraction + classification) and `lisa:product-walkthrough` (when the PRD touches existing user-facing surfaces). All gate logic lives in `lisa:tracker-validate`, which `lisa:notion-to-tracker` calls per ticket.
|
|
82
82
|
|
|
83
83
|
#### 3c. Branch on the verdict
|
|
84
84
|
|
|
@@ -208,12 +208,18 @@ Print to the agent's output. Do not write this summary to Notion or JIRA — it'
|
|
|
208
208
|
|
|
209
209
|
## Configuration
|
|
210
210
|
|
|
211
|
-
This skill reads project configuration from environment variables
|
|
211
|
+
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. Destination tracker config (jira / github / linear) is consumed by `lisa:tracker-write` internally — this skill does NOT read it.
|
|
212
|
+
|
|
213
|
+
### From `.lisa.config.json`
|
|
214
|
+
|
|
215
|
+
| Field | Purpose |
|
|
216
|
+
|-------|---------|
|
|
217
|
+
| `notion.prdDatabaseId` | Notion database hosting PRDs (when `$ARGUMENTS` is the literal token `notion`) |
|
|
218
|
+
|
|
219
|
+
### From environment variables
|
|
212
220
|
|
|
213
221
|
| Variable | Purpose |
|
|
214
222
|
|----------|---------|
|
|
215
|
-
| `JIRA_PROJECT` | JIRA project key for ticket creation (passed to `lisa:notion-to-tracker`) |
|
|
216
|
-
| `JIRA_SERVER` | Atlassian instance host |
|
|
217
223
|
| `E2E_BASE_URL` | Frontend URL for `lisa:product-walkthrough` |
|
|
218
224
|
| `E2E_TEST_PHONE` / `E2E_TEST_OTP` / `E2E_TEST_ORG` | Test user creds for walkthrough + verification plans |
|
|
219
225
|
| `E2E_GRAPHQL_URL` | API URL for verification plans |
|