@codyswann/lisa 2.10.1 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +65 -14
  2. package/package.json +1 -1
  3. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
  5. package/plugins/lisa/agents/github-prd-intake.md +2 -2
  6. package/plugins/lisa/agents/linear-agent.md +128 -0
  7. package/plugins/lisa/agents/linear-build-intake.md +62 -0
  8. package/plugins/lisa/agents/linear-prd-intake.md +2 -2
  9. package/plugins/lisa/agents/notion-prd-intake.md +1 -1
  10. package/plugins/lisa/commands/plan.md +1 -1
  11. package/plugins/lisa/rules/config-resolution.md +187 -0
  12. package/plugins/lisa/rules/intent-routing.md +13 -13
  13. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
  14. package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
  15. package/plugins/lisa/skills/github-create/SKILL.md +4 -4
  16. package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
  17. package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
  18. package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
  19. package/plugins/lisa/skills/implement/SKILL.md +1 -1
  20. package/plugins/lisa/skills/intake/SKILL.md +3 -3
  21. package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
  22. package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
  23. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
  24. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  25. package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
  26. package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
  27. package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
  28. package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
  29. package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
  30. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
  31. package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
  32. package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
  33. package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
  34. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
  35. package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
  36. package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
  37. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
  38. package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
  39. package/plugins/lisa/skills/plan/SKILL.md +3 -2
  40. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
  41. package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
  42. package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
  43. package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
  44. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
  45. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
  46. package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
  47. package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
  48. package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
  49. package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
  50. package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  51. package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
  52. package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
  53. package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
  54. package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
  55. package/plugins/lisa/skills/verify/SKILL.md +1 -1
  56. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-expo/skills/jira-create/SKILL.md +4 -4
  59. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails/skills/jira-create/SKILL.md +4 -4
  62. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  63. package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
  64. package/plugins/src/base/agents/github-prd-intake.md +2 -2
  65. package/plugins/src/base/agents/linear-agent.md +128 -0
  66. package/plugins/src/base/agents/linear-build-intake.md +62 -0
  67. package/plugins/src/base/agents/linear-prd-intake.md +2 -2
  68. package/plugins/src/base/agents/notion-prd-intake.md +1 -1
  69. package/plugins/src/base/commands/plan.md +1 -1
  70. package/plugins/src/base/rules/config-resolution.md +187 -0
  71. package/plugins/src/base/rules/intent-routing.md +13 -13
  72. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
  73. package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
  74. package/plugins/src/base/skills/github-create/SKILL.md +4 -4
  75. package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
  76. package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
  77. package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
  78. package/plugins/src/base/skills/implement/SKILL.md +1 -1
  79. package/plugins/src/base/skills/intake/SKILL.md +3 -3
  80. package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
  81. package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
  82. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
  83. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  84. package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
  85. package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
  86. package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
  87. package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
  88. package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
  89. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
  90. package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
  91. package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
  92. package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
  93. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
  94. package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
  95. package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
  96. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
  97. package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
  98. package/plugins/src/base/skills/plan/SKILL.md +3 -2
  99. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
  100. package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
  101. package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
  102. package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
  103. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
  104. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
  105. package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
  106. package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
  107. package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
  108. package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
  109. package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  110. package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
  111. package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
  112. package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
  113. package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
  114. package/plugins/src/base/skills/verify/SKILL.md +1 -1
  115. package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
  116. package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
  117. package/plugins/lisa/rules/tracker-resolution.md +0 -76
  118. package/plugins/src/base/rules/tracker-resolution.md +0 -76
@@ -92,7 +92,7 @@ Scenario: <name>
92
92
  ## Source Artifacts
93
93
  [Group by domain (UI / UX flow / Data / Ops / Reference). One bullet per
94
94
  artifact with title and URL. Inherited from the parent epic per the rules
95
- in lisa:jira-source-artifacts.]
95
+ in lisa:tracker-source-artifacts.]
96
96
 
97
97
  ## Source Precedence
98
98
  [When artifacts are attached, name the authoritative source per axis:
@@ -175,7 +175,7 @@ Identify and attach (under `## Links`):
175
175
  - Related GitHub PRs, branches, or commits.
176
176
  - Confluence / Notion / Linear PRD pages (the originating PRD).
177
177
  - Dashboards (Grafana, Datadog, Sentry).
178
- - **Source artifacts from the originating PRD / parent Epic**: classify and inherit per `lisa:jira-source-artifacts`. Inherit by domain — UI → `ui-design` + `ux-flow`; backend → `data`; infra → `ops`; always inherit `reference`. Never assume a developer will walk up to the Epic to find design context.
178
+ - **Source artifacts from the originating PRD / parent Epic**: classify and inherit per `lisa:tracker-source-artifacts`. Inherit by domain — UI → `ui-design` + `ux-flow`; backend → `data`; infra → `ops`; always inherit `reference`. Never assume a developer will walk up to the Epic to find design context.
179
179
 
180
180
  If the issue was generated from a PRD and the parent Epic has no source artifacts, surface that as a smell and ask whether artifacts were missed during extraction.
181
181
 
@@ -27,7 +27,7 @@ The team lead does NOT read the input directly. The first task on the team's pla
27
27
  - If it's a ticket, calls `lisa:tracker-read` (preferred — vendor-agnostic; dispatches per `.lisa.config.json` `tracker`). **Mismatch guard**: if the ticket format doesn't match the configured tracker (e.g., a GitHub URL when `tracker` is `jira`), `tracker-read` stops and reports the error — never auto-translates vendors:
28
28
  - JIRA ticket → `lisa:tracker-read` → `lisa:jira-read-ticket`
29
29
  - GitHub Issue → `lisa:tracker-read` → `lisa:github-read-issue`
30
- - Linear ticket the Linear CLI (no `lisa:linear-*` build-side adapter; Linear is a PRD source only)
30
+ - Linear identifier or project URL `lisa:tracker-read` `lisa:linear-read-issue`
31
31
  - Captures comments and metadata, not just the description.
32
32
  - If it's a file, reads the entire file without offset or limit.
33
33
  - If it's a plain-text request, uses the provided text verbatim as the resolved input.
@@ -49,7 +49,7 @@ Detect the queue type from `$ARGUMENTS` and route:
49
49
  | A Confluence **parent page** URL or page ID (the page whose descendants are PRDs) | PRD queue (Confluence, narrowed) | Invoke `lisa:confluence-prd-intake` with the parent ID (CQL: `ancestor = <id> AND label = "prd-ready"`) |
50
50
  | A Linear **workspace** URL (e.g. `https://linear.app/acme`) | PRD queue (Linear) | Invoke `lisa:linear-prd-intake` (which queries `list_projects({label: "prd-ready"})` across the workspace, claims each by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline) |
51
51
  | A Linear **team** URL (e.g. `https://linear.app/acme/team/ENG/projects`) or a token already routed as a Linear team key | PRD queue (Linear, narrowed) | Invoke `lisa:linear-prd-intake` with the team key (`list_projects({team, label: "prd-ready"})`) |
52
- | The literal token `linear` | PRD queue (Linear, default workspace) | Invoke `lisa:linear-prd-intake linear` — only valid if `LINEAR_WORKSPACE` is configured |
52
+ | The literal token `linear` | PRD queue (Linear, default workspace) | Invoke `lisa:linear-prd-intake linear` — only valid if `linear.workspace` is configured in `.lisa.config.json` |
53
53
  | A JIRA project key (e.g. `SE`) | Work queue (JIRA) | Invoke `lisa:jira-build-intake` (which scans the project for Status=Ready, claims each via In Progress, runs `lisa:implement` per ticket, transitions to On Dev on success) |
54
54
  | A full JQL filter (e.g. `project = SE AND component = "frontend"`) | Work queue (JIRA, narrowed) | Invoke `lisa:jira-build-intake` with the JQL |
55
55
  | A GitHub **repository** URL or `org/repo` token (e.g. `https://github.com/acme/product-prds` or `acme/product-prds`) when used for **PRDs** | PRD queue (GitHub) | Invoke `lisa:github-prd-intake` (which queries `gh issue list --label prd-ready`, claims each by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline). PRD discovery is independent of the destination tracker — the resulting tickets land wherever `.lisa.config.json` `tracker` says. |
@@ -62,10 +62,10 @@ Disambiguation rules:
62
62
  - An Atlassian Confluence URL containing `/wiki/spaces/<KEY>` with no `/pages/...` segment → Confluence space queue.
63
63
  - An Atlassian Confluence URL containing `/wiki/spaces/<KEY>/pages/<ID>/...` → Confluence parent-page queue (the page is the parent whose descendants are PRDs). If the user actually meant "this single page is a PRD, plan it", route to `lisa:plan` instead — this skill is batch-only.
64
64
  - A `linear.app` URL → Linear queue. If the path is `/<workspace>` only or `/<workspace>/team/<KEY>/...`, route here. If the path includes `/project/<slug>-<id>` it's a single-PRD URL — direct the caller to `lisa:plan` instead, this skill is batch-only.
65
- - The literal token `linear` (case-insensitive) → Linear queue, default workspace from `LINEAR_WORKSPACE`.
65
+ - The literal token `linear` (case-insensitive) → Linear queue, default workspace from `linear.workspace` in `.lisa.config.json`.
66
66
  - A `github.com` URL or an `<org>/<repo>` token → GitHub queue. The PRD-vs-build dispatch is determined by which label namespace the repo currently uses: PRD-side (`prd-ready`) → `lisa:github-prd-intake`; build-side (`status:ready` and `tracker = github` in `.lisa.config.json`) → `lisa:tracker-build-intake`. If both namespaces are present, prefer the PRD queue unless `$ARGUMENTS` includes `intake_mode=build`. If the URL points at a single issue (`https://github.com/<org>/<repo>/issues/<n>`), this skill is batch-only — direct the caller to `lisa:plan` (for a single PRD issue) or `lisa:implement` (for a single build issue).
67
67
  - The literal token `github` (case-insensitive) → GitHub queue, default repo from `.lisa.config.json` `github.org` / `github.repo`.
68
- - A bare alphanumeric token that matches the configured `JIRA_PROJECT` regex (uppercase letters / digits / hyphen, ≤10 chars) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. If it does not resolve as a Confluence space key either, attempt to resolve as a Linear team key via `mcp__linear-server__list_teams({query})` before giving up. The only time to stop and ask is when the token resolves to more than one of {JIRA project, Confluence space, Linear team, GitHub `org/repo`} simultaneously — in that overlap the user must disambiguate which queue to scan.
68
+ - A bare alphanumeric token that matches the JIRA project key regex (uppercase letters / digits / hyphen, ≤10 chars — typically the value of `jira.project` in `.lisa.config.json`) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. If it does not resolve as a Confluence space key either, attempt to resolve as a Linear team key via `mcp__linear-server__list_teams({query})` before giving up. The only time to stop and ask is when the token resolves to more than one of {JIRA project, Confluence space, Linear team, GitHub `org/repo`} simultaneously — in that overlap the user must disambiguate which queue to scan.
69
69
  - An `<org>/<repo>` token (slash-separated, both halves are GitHub-name-shaped) → GitHub queue.
70
70
  - A string starting with `project = ` or containing JQL operators (`AND`, `OR`, `=`, `!=`, `~`, etc.) → JQL filter.
71
71
 
@@ -131,13 +131,16 @@ Total PRs opened: <n>
131
131
 
132
132
  ## Configuration
133
133
 
134
+ Reads `atlassian.cloudId` and `jira.project` from `.lisa.config.json` (with `.lisa.config.local.json` overriding per key). The project key is also accepted as `$ARGUMENTS` for ad-hoc invocations.
135
+
134
136
  Status names default to `Ready`, `In Progress`, `On Dev`. If a project uses different names (`Open` instead of `TODO`, `In Development` instead of `In Progress`, `Code Review` instead of `On Dev`), pass overrides in `$ARGUMENTS` as `claim_status="In Development" done_status="Code Review"`.
135
137
 
136
138
  If a `Ready` status does not exist in the JIRA project's workflow, this skill cannot run. The remediation is to add `Ready` to the project workflow scheme — JIRA admin task, not something this skill can do.
137
139
 
138
- | Variable | Default | Purpose |
139
- |----------|---------|---------|
140
- | `JIRA_PROJECT` | (from `$ARGUMENTS`) | Project key for the default JQL |
140
+ | Field / variable | Default | Purpose |
141
+ |------------------|---------|---------|
142
+ | `.lisa.config.json` `jira.project` | (from `$ARGUMENTS`) | Project key for the default JQL |
143
+ | `.lisa.config.json` `atlassian.cloudId` | — | Atlassian Cloud site UUID (required) |
141
144
  | Status: queue | `Ready` | The status that signals "human says this is buildable" |
142
145
  | Status: claim | `In Progress` | The intermediate status the agent sets on pickup |
143
146
  | Status: done | `On Dev` | The status set after a successful build |
@@ -11,7 +11,7 @@ Analyze the provided file(s) and plan a JIRA hierarchy. **This skill plans struc
11
11
  ## Process
12
12
 
13
13
  1. **Analyze**: Read $ARGUMENTS to understand scope.
14
- 2. **Extract source artifacts**: invoke the `lisa:jira-source-artifacts` skill, then enumerate every external URL, embed, attachment, or example payload in the input and classify each by domain per its rules. Build the `artifacts` map (one entry per artifact: url, title, domain, source page, classification reason). See "Source Artifacts" below.
14
+ 2. **Extract source artifacts**: invoke the `lisa:tracker-source-artifacts` skill, then enumerate every external URL, embed, attachment, or example payload in the input and classify each by domain per its rules. Build the `artifacts` map (one entry per artifact: url, title, domain, source page, classification reason). See "Source Artifacts" below.
15
15
  3. **Walk the live product** (when applicable): if the work touches existing user-facing surfaces, invoke the `lisa:product-walkthrough` skill to capture current behavior, design-vs-product divergence, and reuse candidates. Skip when the work is purely backend or affects a screen that does not yet exist. See "Live Product Walkthrough" below.
16
16
  4. **Determine structure**:
17
17
  - Epic needed if: multiple features, major changes, >3 related files
@@ -20,8 +20,8 @@ Analyze the provided file(s) and plan a JIRA hierarchy. **This skill plans struc
20
20
  ```text
21
21
  Epic → User Story → Tasks (test, implement, document, cleanup)
22
22
  ```
23
- 6. **Delegate every write to `lisa:jira-write-ticket`** in dependency order (epic first, then stories with the epic as parent, then sub-tasks with their story as parent). Pass the artifacts (filtered by domain per `lisa:jira-source-artifacts` inheritance rules) and the walkthrough findings (under `## Current Product`). See "Delegation to jira-write-ticket" below.
24
- 7. **Run the artifact preservation gate** (`lisa:jira-source-artifacts` §8): after all writes complete, build the preservation matrix and verify every extracted artifact is reachable from the created tickets. Fail loudly if anything was dropped.
23
+ 6. **Delegate every write to `lisa:jira-write-ticket`** in dependency order (epic first, then stories with the epic as parent, then sub-tasks with their story as parent). Pass the artifacts (filtered by domain per `lisa:tracker-source-artifacts` inheritance rules) and the walkthrough findings (under `## Current Product`). See "Delegation to jira-write-ticket" below.
24
+ 7. **Run the artifact preservation gate** (`lisa:tracker-source-artifacts` §8): after all writes complete, build the preservation matrix and verify every extracted artifact is reachable from the created tickets. Fail loudly if anything was dropped.
25
25
 
26
26
  ## Mandatory for Every Code Issue
27
27
 
@@ -89,7 +89,7 @@ h3. Assertions
89
89
 
90
90
  If $ARGUMENTS includes (or references) any external artifact — PRD, design doc, Figma URL, Lovable prototype, Loom walkthrough, screenshot, example payload — those references MUST be preserved as remote links on the created tickets. Silent artifact loss is the single most common quality failure in this pipeline.
91
91
 
92
- **Invoke the `lisa:jira-source-artifacts` skill** for the canonical rules: domains, per-tool classification (Figma `/proto/` vs design, Lovable, Loom, screenshots), source precedence, conflict handling under `## Open Questions`, inheritance from epic → story → sub-task, and the existing-component reuse expectation. Do not restate the rules here — invoke the skill so any rule change propagates uniformly.
92
+ **Invoke the `lisa:tracker-source-artifacts` skill** for the canonical rules: domains, per-tool classification (Figma `/proto/` vs design, Lovable, Loom, screenshots), source precedence, conflict handling under `## Open Questions`, inheritance from epic → story → sub-task, and the existing-component reuse expectation. Do not restate the rules here — invoke the skill so any rule change propagates uniformly.
93
93
 
94
94
  When delegating actual writes to `lisa:jira-write-ticket`, pass the extracted artifact list so its Phase 4c (Remote Links) step can attach them.
95
95
 
@@ -174,7 +174,7 @@ Either way the gate emits `FAIL`, not a third state. Strictness is the caller's
174
174
 
175
175
  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`.
176
176
 
177
- Accept either placement — both are valid per `lisa:jira-source-artifacts`:
177
+ Accept either placement — both are valid per `lisa:tracker-source-artifacts`:
178
178
  - A dedicated `## Source Precedence` (or `h2. Source Precedence`) subsection, OR
179
179
  - A "Source Precedence" / "source precedence" / "authoritative source" paragraph under `Technical Approach` that covers the four axes above.
180
180
 
@@ -170,15 +170,15 @@ Identify and attach:
170
170
  - Confluence pages (design docs, RFCs, runbooks)
171
171
  - Dashboards (Grafana, Datadog, Sentry issue)
172
172
  - Incident tickets (PagerDuty, Statuspage)
173
- - **Source artifacts from the originating PRD / parent epic**: classify and inherit per the rules in `lisa:jira-source-artifacts` (invoke that skill if you haven't loaded the rules in this session). The short version: enumerate the parent epic's remote links and inherit the ones whose domain matches this ticket's scope (UI → `ui-design` + `ux-flow`; backend → `data`; infra → `ops`; always inherit `reference`). Never assume a developer will walk up to the epic to find design context — attach it here.
173
+ - **Source artifacts from the originating PRD / parent epic**: classify and inherit per the rules in `lisa:tracker-source-artifacts` (invoke that skill if you haven't loaded the rules in this session). The short version: enumerate the parent epic's remote links and inherit the ones whose domain matches this ticket's scope (UI → `ui-design` + `ux-flow`; backend → `data`; infra → `ops`; always inherit `reference`). Never assume a developer will walk up to the epic to find design context — attach it here.
174
174
 
175
175
  If the ticket was generated from a PRD (by `lisa:notion-to-tracker` or similar) and the parent epic has no source artifacts, surface that as a smell and ask whether artifacts were missed during extraction before proceeding.
176
176
 
177
177
  ### 4d. Source Precedence (must appear on the ticket)
178
178
 
179
- Source precedence rules and cross-axis conflict handling are defined in `lisa:jira-source-artifacts` §3 and §4. When a ticket carries both design artifacts and a description, record the precedence explicitly in the ticket 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.
179
+ Source precedence rules and cross-axis conflict handling are defined in `lisa:tracker-source-artifacts` §3 and §4. When a ticket carries both design artifacts and a description, record the precedence explicitly in the ticket 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.
180
180
 
181
- For UI-touching tickets, include the existing-component reuse expectation per `lisa:jira-source-artifacts` §7.
181
+ For UI-touching tickets, include the existing-component reuse expectation per `lisa:tracker-source-artifacts` §7.
182
182
 
183
183
  ### 4e. Live Product Walkthrough Findings (UI-touching tickets)
184
184
 
@@ -0,0 +1,104 @@
1
+ ---
2
+ name: linear-add-journey
3
+ description: "Add a Validation Journey section to an existing Linear Issue by analyzing the change type and generating appropriate verification steps with evidence markers. Linear counterpart of lisa:jira-add-journey."
4
+ allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue"]
5
+ ---
6
+
7
+ # Add Validation Journey to Existing Linear Issue
8
+
9
+ Read an existing Linear Issue, analyze the change type, and append a Validation Journey section to the description with appropriate verification steps based on the project's verification patterns.
10
+
11
+ This skill is the destination of the `lisa:tracker-add-journey` shim when `tracker = "linear"`.
12
+
13
+ ## Configuration
14
+
15
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
16
+
17
+ ## Arguments
18
+
19
+ `$ARGUMENTS`: `<IDENTIFIER>` — Linear Issue identifier (e.g. `ENG-123`).
20
+
21
+ ## Workflow
22
+
23
+ ### Step 1: Read the Issue
24
+
25
+ Fetch via `mcp__linear-server__get_issue` and extract: title, description (markdown), labels, project, parent, attachments.
26
+
27
+ ### Step 2: Check for Existing Journey
28
+
29
+ If the description already contains a `## Validation Journey` section, report and stop — never overwrite an existing journey without explicit instruction.
30
+
31
+ ### Step 3: Analyze the Change Type
32
+
33
+ Examine the description, acceptance criteria, and codebase to determine the change type:
34
+
35
+ 1. **API/GraphQL** — New or modified endpoints, request/response schemas
36
+ 2. **Database migration** — Schema changes, new tables/columns, indexes
37
+ 3. **Background job/queue** — New job processors, queue consumers, event handlers
38
+ 4. **Library/utility** — Exported functions, shared modules, npm package changes
39
+ 5. **Security fix** — Auth, authorization, input validation, OWASP vulnerabilities
40
+ 6. **Authentication/authorization** — Role-based access, session management, tokens
41
+ 7. **UI/frontend** — Components, flows, browser-driven verification
42
+
43
+ Use Explore agents or read the codebase to understand which files are affected and what verification approach is appropriate.
44
+
45
+ ### Step 4: Map Change Type to Verification Pattern
46
+
47
+ | Change Type | Verification Approach |
48
+ |---|---|
49
+ | API/GraphQL | curl commands verifying endpoints, status codes, response schemas |
50
+ | Database migration | Migration execution + schema verification + rollback check |
51
+ | Background job/queue | Enqueue + process + state change verification |
52
+ | Library/utility | Test execution + build verification + export check |
53
+ | Security fix | Exploit reproduction pre-fix + exploit failure post-fix |
54
+ | Auth/authz | Multi-role verification with explicit status codes |
55
+ | UI/frontend | Playwright browser flow + visual evidence |
56
+
57
+ ### Step 5: Draft the Validation Journey (markdown)
58
+
59
+ Linear descriptions are markdown. Use `##` and `###` headings — not Jira wiki markup.
60
+
61
+ ```markdown
62
+ ## Validation Journey
63
+
64
+ ### Prerequisites
65
+ - List required services, database, env vars
66
+
67
+ ### Steps
68
+ 1. Verify current state before changes
69
+ 2. Apply the change
70
+ 3. Verify expected new state [EVIDENCE: state-name]
71
+ 4. Test error/edge cases [EVIDENCE: error-case]
72
+ 5. Verify rollback if applicable [EVIDENCE: rollback]
73
+
74
+ ### Assertions
75
+ - Describe what must be true after verification
76
+ ```
77
+
78
+ ### Guidelines for Drafting
79
+
80
+ 1. **2–5 evidence markers** — Focus on proving the change works and handles errors.
81
+ 2. **Concrete, runnable steps** — `Run \`curl -s localhost:3000/health | jq .status\`` not "Check the endpoint".
82
+ 3. **Include environment setup** — Database connection, running services, env vars.
83
+ 4. **Evidence names in kebab-case** — `api-response`, `schema-check`, `rate-limit-hit`.
84
+ 5. **Assertions are measurable** — "Returns 200 with `{status: ok}`" not "API works correctly".
85
+ 6. **Cover happy path and error path** — At minimum, one success and one failure evidence marker.
86
+
87
+ ### Step 6: Present to User for Approval
88
+
89
+ Display the drafted journey and ask for confirmation before appending.
90
+
91
+ ### Step 7: Append to Issue Description
92
+
93
+ After approval, fetch the current description, append the new Validation Journey section, and update via `mcp__linear-server__save_issue({id, description: <new-description>})`. Preserve all existing description content — never overwrite.
94
+
95
+ ### Step 8: Verify
96
+
97
+ Re-fetch the issue and confirm the section is present.
98
+
99
+ ## When to Use This Skill
100
+
101
+ - Issue was created before the Validation Journey convention was established
102
+ - Issue was created manually without following `lisa:linear-create` guidelines
103
+ - Issue needs a journey added or updated based on implementation progress
104
+ - Before starting work on an Issue, to ensure verification steps are documented
@@ -0,0 +1,160 @@
1
+ ---
2
+ name: linear-build-intake
3
+ description: "Symmetric counterpart to lisa:jira-build-intake on the Linear side. Scans a Linear team for Issues labeled status:ready, claims each by relabeling to status:in-progress, runs the implementation/build flow via lisa:linear-agent, and relabels to status:on-dev on completion. status:ready is the human-flipped signal that an Issue is truly ready for development — mirroring how Notion PRDs work Draft → Ready → (us) In Review → Blocked|Ticketed."
4
+ allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_teams", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
5
+ ---
6
+
7
+ # Linear Build Intake: $ARGUMENTS
8
+
9
+ `$ARGUMENTS` is one of:
10
+
11
+ 1. A Linear team key (e.g. `ENG`) — scans that team for `status:ready` Issues.
12
+ 2. The literal token `linear` — falls back to `linear.teamKey` from `.lisa.config.json`.
13
+ 3. A pre-built Linear MCP filter (advanced) — used as-is.
14
+
15
+ Run one build-intake cycle. Each `status:ready` Issue is claimed, built via the `lisa:linear-agent` flow, and relabeled to `status:on-dev` on completion. The cycle is the symmetric mirror of `lisa:jira-build-intake` and `lisa:github-build-intake`: humans flip `status:ready`, agents pick up and progress.
16
+
17
+ This skill is the destination of the `lisa:tracker-build-intake` shim when `tracker = "linear"`.
18
+
19
+ ## Why labels, not native states
20
+
21
+ Linear's per-team workflow state names vary (`Todo` / `Backlog` / `Up Next` / etc.). Labels are workspace-scoped or team-scoped and stable across teams, so we drive the build queue off labels rather than chasing renamed native states. The native `state` field is informational only for this skill.
22
+
23
+ ## Configuration
24
+
25
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
26
+
27
+ ## Confirmation policy
28
+
29
+ Do NOT ask the caller whether to proceed. Once invoked with a team key, run the cycle to completion — claim, dispatch each Issue through `lisa:linear-agent`, transition successful builds to `status:on-dev`, write the summary. The caller (a human or a cron) has already authorized the run by invoking the skill.
30
+
31
+ Specifically forbidden:
32
+
33
+ - Previewing projected scope (Issue count, projected PR count, build duration) and asking whether to continue.
34
+ - Offering A/B/C-style choices like "proceed / skip a few / dry-run only" — the documented behavior IS the default.
35
+ - Pausing because the queue is large, items look complex, or items are likely to be `status:blocked` by `lisa:linear-agent`'s pre-flight gate. The pre-flight `status:blocked` outcome is a valid terminal state of the per-Issue lifecycle.
36
+ - Pausing because the build flow looks expensive.
37
+
38
+ The only legitimate reasons to stop early:
39
+
40
+ - Missing team key or required configuration. Surface and exit.
41
+ - Label convention not yet adopted (`status:ready` does not exist on the team's labels). Surface and exit with an Adoption hint.
42
+ - Empty `status:ready` set. Exit cleanly with `"No Linear Issues labeled status:ready. Nothing to do."`
43
+
44
+ ## Lifecycle assumed
45
+
46
+ Linear build queue uses these issue-level labels:
47
+
48
+ ```text
49
+ status:ready → status:in-progress → status:code-review → status:on-dev → status:done
50
+ (human/PM) (us claim) (us PR ready) (us build done) (downstream)
51
+ ```
52
+
53
+ This skill ONLY transitions `status:ready → status:in-progress` on claim, and `status:in-progress → status:on-dev` on completion. It never touches `status:done`, `status:code-review` (owned by `lisa:linear-agent` / `lisa:linear-evidence`), or `status:blocked` (owned by `lisa:linear-agent`'s pre-flight gate).
54
+
55
+ **Pre-flight check**: at start of each cycle, confirm `status:ready`, `status:in-progress`, `status:on-dev` exist on the team via `mcp__linear-server__list_issue_labels`. If `status:ready` is missing, stop and report adoption needed. The other labels can be created on demand.
56
+
57
+ ## Phases
58
+
59
+ ### Phase 1 — Resolve scope
60
+
61
+ 1. Parse `$ARGUMENTS`:
62
+ - Bare team key → use as-is.
63
+ - Literal `linear` → fall back to `linear.teamKey` from config.
64
+ 2. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})`.
65
+
66
+ ### Phase 2 — Find Ready Issues
67
+
68
+ Query: `mcp__linear-server__list_issues({team: <teamId>, label: "status:ready"})`.
69
+
70
+ Capture each Issue's: identifier, title, type label, priority, assignee, project, labels, description summary.
71
+
72
+ If empty, report `"No Linear Issues labeled status:ready. Nothing to do."` and exit. Common idle case.
73
+
74
+ ### Phase 3 — Process each Ready Issue (serial)
75
+
76
+ #### 3a. Claim
77
+
78
+ Update labels via `mcp__linear-server__save_issue`: remove `status:ready`, add `status:in-progress`. Resolve label IDs via `list_issue_labels` (create `status:in-progress` if missing).
79
+
80
+ Post a `[claude-build-intake]` comment via `save_comment`: `"Claimed by Claude. Starting build."`
81
+
82
+ This is the idempotency lock — a re-entrant cycle's `label: status:ready` filter will not see this Issue again.
83
+
84
+ If the relabel fails (permission, race), record under "Errors" and skip. **Do not invoke the build flow on an Issue you didn't successfully claim.**
85
+
86
+ #### 3b. Run the build flow
87
+
88
+ Invoke `lisa:linear-agent` (per-Issue lifecycle agent) with the Issue identifier. `lisa:linear-agent` owns:
89
+ - Reading the full Issue graph (`lisa:linear-read-issue`)
90
+ - Running its own pre-flight quality gate (`lisa:linear-verify`)
91
+ - Running ticket triage (`lisa:ticket-triage`)
92
+ - Routing to the appropriate flow (Build / Fix / Investigate / Improve based on type)
93
+ - Posting progress comments via `lisa:linear-sync`
94
+ - Posting evidence via `lisa:linear-evidence`
95
+
96
+ Wait for the agent to return. Capture its outcome:
97
+ - **Success** — PR is ready (open or merged); evidence posted; ready for next status.
98
+ - **Blocked by linear-verify pre-flight gate** — `lisa:linear-agent` itself relabels to `status:blocked` and assigns to creator. Let it stand. Record and move on.
99
+ - **Blocked by ticket-triage ambiguities** — agent posts findings and stops. The Issue stays at `status:in-progress`. Surface to human; do not auto-transition. Record under "Errors".
100
+ - **Errored** — exception, missing config, etc. Leave at `status:in-progress`. Record with exception summary.
101
+
102
+ #### 3c. Relabel to status:on-dev (only on Success)
103
+
104
+ If `lisa:linear-agent` returned Success:
105
+ 1. Update labels via `mcp__linear-server__save_issue`: remove `status:in-progress`, add `status:on-dev`. (Note: at this point `lisa:linear-evidence` has typically already moved the Issue to `status:code-review` after PR creation. The transition is `status:code-review → status:on-dev` if that's the current state.)
106
+ 2. Post a `[claude-build-intake]` comment: `"Build complete. PR <URL>. Transitioned to status:on-dev."`
107
+
108
+ For any non-Success outcome, do NOT transition. The Issue sits where the agent left it — humans take it from there.
109
+
110
+ #### 3d. Continue
111
+
112
+ Move to the next Ready Issue. One Issue failing does not stop others.
113
+
114
+ ### Phase 4 — Summary report
115
+
116
+ ```text
117
+ ## linear-build-intake summary
118
+
119
+ Team: <teamKey>
120
+ Cycle started: <ISO timestamp>
121
+ Cycle completed: <ISO timestamp>
122
+
123
+ Issues processed: <n>
124
+ - status:on-dev (build complete, PR ready): <n>
125
+ - <ID> <title> → PR <URL>
126
+ - status:blocked (pre-flight verify failed): <n>
127
+ - <ID> <title> — see Issue comments
128
+ - Held (triage found ambiguities): <n>
129
+ - <ID> <title> — see Issue comments
130
+ - Errors: <n>
131
+ - <ID> <title> — <reason>
132
+
133
+ Total PRs opened: <n>
134
+ ```
135
+
136
+ ## Idempotency & safety
137
+
138
+ - **Claim-first ordering**: `status:in-progress` set BEFORE agent invocation — no double-pickup.
139
+ - **No writes outside the lifecycle**: this skill only adds/removes `status:ready`, `status:in-progress`, `status:on-dev`. Every other label change (and the native state) is owned by the agent or `lisa:linear-evidence`.
140
+ - **Failure isolation**: per-Issue exceptions caught and recorded; the cycle continues.
141
+ - **Single cycle per team**: do not run two concurrent cycles against the same team — concurrent claims could race.
142
+ - **Single-label invariant**: after every transition, verify exactly one `status:*` label is present. Two simultaneously breaks the build queue.
143
+
144
+ ## Adoption (one-time per team)
145
+
146
+ Before this skill can run against a Linear team, the team must adopt the `status:*` issue-label convention:
147
+
148
+ 1. Create labels `status:ready`, `status:in-progress`, `status:code-review`, `status:on-dev`, `status:done`, `status:blocked` on the team (or workspace).
149
+ 2. Apply `status:ready` to Issues that are ready for development.
150
+ 3. Reserve `status:in-progress`, `status:code-review`, `status:on-dev` for Lisa — humans should not set them manually except to recover from an error.
151
+
152
+ If the team hasn't adopted these labels, the first run exits with an adoption hint.
153
+
154
+ ## Rules
155
+
156
+ - Never relabel an Issue the cycle didn't claim. The `status:in-progress` transition is the signature of cycle ownership.
157
+ - Never bypass `lisa:linear-agent` to do build work directly. The agent owns the per-Issue lifecycle.
158
+ - Never auto-transition past `status:on-dev`. Downstream labels (`status:done`) are owned by QA / product / a future verification-intake skill.
159
+ - If the Issue has no Validation Journey or no sign-in credentials in its description, `lisa:linear-agent`'s pre-flight verify will catch it and relabel to `status:blocked` — don't try to fix the Issue from here.
160
+ - On any unexpected response from `lisa:linear-agent` (label it doesn't claim, missing PR URL on success, etc.), record as Error and surface — never assume.
@@ -0,0 +1,146 @@
1
+ ---
2
+ name: linear-create
3
+ description: "Creates Linear Projects (Epic-equivalent), Issues (Story / Task / Bug / Spike), and sub-Issues (Sub-task) from code files or descriptions. Analyzes the input, determines the appropriate hierarchy, and creates items with comprehensive quality requirements including test-first development and Validation Journey. The Linear counterpart of lisa:jira-create — delegates every write to lisa:linear-write-issue."
4
+ allowed-tools: ["Read", "Glob", "LS", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__list_projects", "mcp__linear-server__list_issue_labels", "mcp__linear-server__list_project_labels"]
5
+ ---
6
+
7
+ # Create Linear Work Items from $ARGUMENTS
8
+
9
+ Analyze the provided file(s) and plan a Linear hierarchy. **This skill plans structure only — every individual write is delegated to `lisa:linear-write-issue`.** Do not call `mcp__linear-server__save_project` or `mcp__linear-server__save_issue` from this skill; those write tools are intentionally not in `allowed-tools`.
10
+
11
+ This skill is the destination of the `lisa:tracker-create` shim when `tracker = "linear"`.
12
+
13
+ ## Configuration
14
+
15
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
16
+
17
+ ## Process
18
+
19
+ 1. **Analyze**: Read `$ARGUMENTS` to understand scope.
20
+ 2. **Extract source artifacts**: invoke `lisa:tracker-source-artifacts`, then enumerate every external URL, embed, attachment, or example payload in the input and classify each by domain. Build the `artifacts` map (one entry per artifact: url, title, domain, source page, classification reason). See "Source Artifacts" below.
21
+ 3. **Walk the live product** (when applicable): if the work touches existing user-facing surfaces, invoke `lisa:product-walkthrough` to capture current behavior, design-vs-product divergence, and reuse candidates. Skip when the work is purely backend or affects a screen that does not yet exist.
22
+ 4. **Determine structure**:
23
+ - Project (Epic) needed if: multiple features, major changes, >3 related files
24
+ - Direct Issues if: bug fix, single file, minor change
25
+ 5. **Plan hierarchy**:
26
+ ```text
27
+ Project (Epic) → Issue (Story) → sub-Issue (Sub-task)
28
+ ```
29
+ Mapping per Linear best practices: Epic → Linear Project, Story → Issue with `projectId`, Sub-task → Issue with `parentId`. See `config-resolution.md` "Linear destination semantics".
30
+ 6. **Delegate every write to `lisa:linear-write-issue`** in dependency order (Project first, then Issues with `projectId` set, then sub-Issues with `parentId`). Pass artifacts (filtered by domain per `lisa:tracker-source-artifacts` inheritance rules) and walkthrough findings (under `## Current Product`).
31
+ 7. **Run the artifact preservation gate** (`lisa:tracker-source-artifacts` §8): after all writes complete, build the preservation matrix and verify every extracted artifact is reachable from the created items. Fail loudly if anything was dropped.
32
+
33
+ ## Mandatory for Every Code Issue
34
+
35
+ - **Test-First**: Write tests before implementation
36
+ - **Quality Gates**: All tests / checks must pass, no SonarCloud violations
37
+ - **Documentation**: Check existing, update / create new, remove obsolete
38
+ - **Cleanup**: Remove temporary code, scripts, dev configs
39
+
40
+ ## Validation Journey
41
+
42
+ Items that change runtime behavior should include a `## Validation Journey` section. This section is consumed by `lisa:linear-journey` to automate verification.
43
+
44
+ ### When to Include
45
+
46
+ - API endpoint changes (new, modified, or removed routes)
47
+ - Database schema changes (migrations, new columns, index changes)
48
+ - Background job / queue processing changes
49
+ - Library / utility function changes that affect exports
50
+ - Security fixes (authentication, authorization, input validation)
51
+ - Performance-critical changes requiring measurement
52
+
53
+ ### When to Skip
54
+
55
+ - Documentation-only changes
56
+ - Config-only changes (env vars, CI/CD, feature flags with no code)
57
+ - Type-definition-only changes
58
+
59
+ ### How to Write
60
+
61
+ Design the journey based on the **change type**. Place `[EVIDENCE: name]` markers at key verification points.
62
+
63
+ ```markdown
64
+ ## Validation Journey
65
+
66
+ ### Prerequisites
67
+ - Local dev server running
68
+ - Database accessible
69
+ - Required environment variables set
70
+
71
+ ### Steps
72
+ 1. Verify the current state before changes
73
+ 2. Apply the change (run migration, deploy, etc.)
74
+ 3. Verify the expected new state [EVIDENCE: state-after-change]
75
+ 4. Test error/edge cases [EVIDENCE: error-handling]
76
+ 5. Verify rollback or cleanup if applicable [EVIDENCE: rollback-check]
77
+
78
+ ### Assertions
79
+ - Describe what must be true after verification
80
+ - Each assertion is verified against the captured evidence
81
+ ```
82
+
83
+ ## Source Artifacts
84
+
85
+ If `$ARGUMENTS` includes (or references) any external artifact — PRD, design doc, Figma URL, Lovable prototype, Loom walkthrough, screenshot, example payload — those references MUST be preserved as attachments / remote links on the created items. Silent artifact loss is the single most common quality failure in this pipeline.
86
+
87
+ **Invoke `lisa:tracker-source-artifacts`** for the canonical rules: domains, per-tool classification, source precedence, conflict handling under `## Open Questions`, inheritance from Project → Issue → sub-Issue, and the existing-component reuse expectation. Do not restate the rules here — invoke the skill so any rule change propagates uniformly.
88
+
89
+ When delegating actual writes to `lisa:linear-write-issue`, pass the extracted artifact list so its Phase 4c (Remote Links) step can attach them.
90
+
91
+ ## Live Product Walkthrough
92
+
93
+ When the work touches existing user-facing surfaces, invoke `lisa:product-walkthrough` before drafting items. The walkthrough findings (current behavior, design-vs-product divergence, reuse candidates, behavioral surprises) become inputs to the item plan and surface under `## Current Product` on the resulting items. Skip only when the work is purely backend or affects a screen that does not yet exist.
94
+
95
+ ## Item Requirements
96
+
97
+ Each item must clearly communicate to:
98
+
99
+ - **Coding Assistants**: Implementation requirements
100
+ - **Developers**: Technical approach
101
+ - **Stakeholders**: Business value
102
+
103
+ Default team: from `linear.teamKey` config (override via arguments).
104
+
105
+ ## Delegation to linear-write-issue
106
+
107
+ **Mandatory.** Every item created by this skill MUST go through `lisa:linear-write-issue`. This skill never calls `mcp__linear-server__save_*` itself — those tools are intentionally excluded from `allowed-tools` so the gate cannot be bypassed.
108
+
109
+ `lisa:linear-write-issue` enforces:
110
+ - 3-audience description (Context / Technical Approach / Acceptance Criteria)
111
+ - Gherkin acceptance criteria
112
+ - Project parent for Stories; parentId for Sub-tasks
113
+ - Explicit relationship discovery (`blocks` / `blocked_by` / `relates_to` / `duplicates`)
114
+ - Remote links / attachments
115
+ - Single-repo scope check for Bug / Task / Sub-task
116
+ - Sign-in account and target environment recorded in description
117
+ - Post-create verification
118
+
119
+ ### Invocation order
120
+
121
+ Items must be created in parent-before-child order so each child can be passed its parent ID:
122
+
123
+ 1. Invoke `lisa:linear-write-issue` for the Epic (Project). Capture the returned Project ID.
124
+ 2. For each Story, invoke `lisa:linear-write-issue` with the Project ID as `parent_project_id`. Capture each Issue identifier.
125
+ 3. For each Sub-task, invoke `lisa:linear-write-issue` with the Story Issue ID as `parent_issue_id`.
126
+
127
+ ### What to pass to each invocation
128
+
129
+ For every delegated write, pass:
130
+ - The summary, issue type, team key, and priority you decided
131
+ - The 3-section description body you drafted (Context / Technical Approach / Acceptance Criteria)
132
+ - Gherkin acceptance criteria
133
+ - Parent ID (Project for Stories; Story for Sub-tasks)
134
+ - The artifact list extracted in "Source Artifacts", filtered by domain per the inheritance rules
135
+ - For items that change runtime behavior: the Validation Journey draft (or instruct it to call `lisa:linear-add-journey` after create)
136
+
137
+ ### What this skill is responsible for
138
+
139
+ This skill owns:
140
+ - Deciding the *shape* of the hierarchy (what's a Project vs. Issue vs. sub-Issue)
141
+ - Drafting the description body and acceptance criteria from the input
142
+ - Extracting and classifying source artifacts
143
+ - Threading parent IDs through subsequent writes
144
+ - Running the Phase 5.5-style preservation check after all writes complete
145
+
146
+ It does not own the actual Linear write — that's `lisa:linear-write-issue`'s job.
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: linear-evidence
3
+ description: "Uploads text evidence to the GitHub `pr-assets` release, updates the PR description, posts a comment on the originating Linear Issue with code blocks, and transitions the Issue from in-progress to code-review by relabeling. Reusable by any skill that captures evidence and generates evidence/comment.txt + evidence/code-blocks.md. Linear counterpart of lisa:jira-evidence and lisa:github-evidence."
4
+ allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
5
+ ---
6
+
7
+ # Linear Evidence: $ARGUMENTS
8
+
9
+ Post verification evidence to a Linear Issue and transition it to the code-review state. This skill is the destination of the `lisa:tracker-evidence` shim when `tracker = "linear"`.
10
+
11
+ `$ARGUMENTS` is the Linear Issue identifier (e.g. `ENG-123`) and the path to the evidence directory. Caller passes both: `<IDENTIFIER> <evidence-dir>`.
12
+
13
+ ## Configuration
14
+
15
+ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
16
+
17
+ ## Inputs (in `<evidence-dir>`)
18
+
19
+ The caller must produce:
20
+
21
+ - `evidence/comment.txt` — the human-readable comment body posted on the Linear Issue.
22
+ - `evidence/code-blocks.md` — fenced code blocks (test outputs, command output, log excerpts) appended to the comment.
23
+ - `evidence/files/` (optional) — any text files that should be uploaded to the GitHub `pr-assets` release for permalink-style references.
24
+
25
+ If any of these are missing, stop and report.
26
+
27
+ ## Phase 1 — Resolve Linear Issue
28
+
29
+ 1. Parse the identifier from `$ARGUMENTS`.
30
+ 2. Fetch via `mcp__linear-server__get_issue` to confirm it exists and capture its current state, label set, and Project membership.
31
+
32
+ ## Phase 2 — Upload Evidence Files (optional)
33
+
34
+ If `evidence/files/` is non-empty, upload each text file to the GitHub `pr-assets` release on the current repo via `gh release upload`. The release is the permalink store — keeps the Linear comment lightweight while preserving large outputs.
35
+
36
+ For each uploaded file, capture the public release URL.
37
+
38
+ ## Phase 3 — Update PR Description
39
+
40
+ If a PR is open on the current branch (`gh pr view --json url,number,body 2>/dev/null`), append an "Evidence" section to its description with:
41
+
42
+ - The Linear identifier and URL (constructed as `https://linear.app/<workspace>/issue/<IDENTIFIER>`).
43
+ - Links to any uploaded evidence files.
44
+ - A short summary line (first 2 lines of `evidence/comment.txt`).
45
+
46
+ If no PR is open, skip this phase.
47
+
48
+ ## Phase 4 — Post Linear Comment
49
+
50
+ Call `mcp__linear-server__save_comment({issueId: <id>, body: <body>})` where `<body>` is:
51
+
52
+ ```markdown
53
+ [<comment.txt contents verbatim>]
54
+
55
+ <details>
56
+ <summary>Evidence</summary>
57
+
58
+ [<code-blocks.md contents verbatim>]
59
+
60
+ </details>
61
+
62
+ [<bullet list of uploaded evidence file URLs, if any>]
63
+ ```
64
+
65
+ Linear comments support markdown including `<details>` collapsibles, fenced code, and links — preserve the formatting.
66
+
67
+ ## Phase 5 — Transition Status
68
+
69
+ Update labels via `mcp__linear-server__save_issue` to remove `status:in-progress` and add `status:code-review`. Resolve label IDs first via `mcp__linear-server__list_issue_labels` (create the label via `create_issue_label` if it doesn't exist on the team).
70
+
71
+ The native Linear `state` field is also updated to the team's "In Review" state if one exists — but the label remains the source of truth for cross-team consistency.
72
+
73
+ ## Phase 6 — Report
74
+
75
+ Return:
76
+
77
+ - Linear Issue URL with new label state
78
+ - PR URL (if updated)
79
+ - List of uploaded evidence file URLs
80
+
81
+ ## Rules
82
+
83
+ - Never modify the Issue description as part of evidence posting — comments only. Description edits go through `lisa:linear-write-issue`.
84
+ - Never skip the label transition. The build queue is keyed off `status:*` labels; an item that ships without transitioning is invisible to monitoring.
85
+ - If `mcp__linear-server__save_comment` fails, retry once. If it fails again, surface the error — don't pretend the comment was posted.
86
+ - Do not delete prior comments. The history is the audit trail.