@codyswann/lisa 2.10.1 → 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.
Files changed (117) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
  4. package/plugins/lisa/agents/github-prd-intake.md +2 -2
  5. package/plugins/lisa/agents/linear-agent.md +128 -0
  6. package/plugins/lisa/agents/linear-build-intake.md +62 -0
  7. package/plugins/lisa/agents/linear-prd-intake.md +2 -2
  8. package/plugins/lisa/agents/notion-prd-intake.md +1 -1
  9. package/plugins/lisa/commands/plan.md +1 -1
  10. package/plugins/lisa/rules/config-resolution.md +187 -0
  11. package/plugins/lisa/rules/intent-routing.md +13 -13
  12. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
  13. package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
  14. package/plugins/lisa/skills/github-create/SKILL.md +4 -4
  15. package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
  16. package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
  17. package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
  18. package/plugins/lisa/skills/implement/SKILL.md +1 -1
  19. package/plugins/lisa/skills/intake/SKILL.md +3 -3
  20. package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
  21. package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
  22. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
  23. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  24. package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
  25. package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
  26. package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
  27. package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
  28. package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
  29. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
  30. package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
  31. package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
  32. package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
  33. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
  34. package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
  35. package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
  36. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
  37. package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
  38. package/plugins/lisa/skills/plan/SKILL.md +3 -2
  39. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
  40. package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
  41. package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
  42. package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
  43. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
  44. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
  45. package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
  46. package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
  47. package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
  48. package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
  49. package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  50. package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
  51. package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
  52. package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
  53. package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
  54. package/plugins/lisa/skills/verify/SKILL.md +1 -1
  55. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo/skills/jira-create/SKILL.md +4 -4
  58. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/skills/jira-create/SKILL.md +4 -4
  61. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  62. package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
  63. package/plugins/src/base/agents/github-prd-intake.md +2 -2
  64. package/plugins/src/base/agents/linear-agent.md +128 -0
  65. package/plugins/src/base/agents/linear-build-intake.md +62 -0
  66. package/plugins/src/base/agents/linear-prd-intake.md +2 -2
  67. package/plugins/src/base/agents/notion-prd-intake.md +1 -1
  68. package/plugins/src/base/commands/plan.md +1 -1
  69. package/plugins/src/base/rules/config-resolution.md +187 -0
  70. package/plugins/src/base/rules/intent-routing.md +13 -13
  71. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
  72. package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
  73. package/plugins/src/base/skills/github-create/SKILL.md +4 -4
  74. package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
  75. package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
  76. package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
  77. package/plugins/src/base/skills/implement/SKILL.md +1 -1
  78. package/plugins/src/base/skills/intake/SKILL.md +3 -3
  79. package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
  80. package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
  81. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
  82. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  83. package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
  84. package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
  85. package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
  86. package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
  87. package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
  88. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
  89. package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
  90. package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
  91. package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
  92. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
  93. package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
  94. package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
  95. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
  96. package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
  97. package/plugins/src/base/skills/plan/SKILL.md +3 -2
  98. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
  99. package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
  100. package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
  101. package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
  102. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
  103. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
  104. package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
  105. package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
  106. package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
  107. package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
  108. package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  109. package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
  110. package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
  111. package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
  112. package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
  113. package/plugins/src/base/skills/verify/SKILL.md +1 -1
  114. package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
  115. package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
  116. package/plugins/lisa/rules/tracker-resolution.md +0 -76
  117. package/plugins/src/base/rules/tracker-resolution.md +0 -76
@@ -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.
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: linear-journey
3
+ description: "Parse a Linear Issue's Validation Journey section, execute the verification steps using appropriate tools (curl, test commands, database queries, Playwright), capture evidence at each [EVIDENCE: name] marker, and post to Linear + GitHub PR using the linear-evidence skill. Linear counterpart of lisa:jira-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
+ # Linear Validation Journey
8
+
9
+ Parse a Linear Issue's Validation Journey, execute the verification steps using the appropriate tools for the change type, capture evidence at each `[EVIDENCE: name]` marker, and post to Linear + GitHub PR.
10
+
11
+ This skill is the destination of the `lisa:tracker-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> [PR_NUMBER]`
20
+
21
+ - `IDENTIFIER` (required): Linear Issue identifier (e.g. `ENG-123`)
22
+ - `PR_NUMBER` (optional): GitHub PR number to update description
23
+
24
+ ## Prerequisites
25
+
26
+ - Linear MCP authenticated
27
+ - `gh` CLI authenticated
28
+ - Appropriate services running for the verification type (dev server, database, etc.)
29
+
30
+ ## Workflow
31
+
32
+ ### Step 1: Parse the Validation Journey
33
+
34
+ Fetch the Issue via `mcp__linear-server__get_issue` and extract the `## Validation Journey` section from the markdown description. Parse:
35
+
36
+ - `### Prerequisites` — list of required services / env / setup
37
+ - `### Steps` — numbered steps, each potentially containing `[EVIDENCE: name]` markers
38
+ - `### Assertions` — what must be true after verification
39
+
40
+ If the section is missing or has no steps, report `"No Validation Journey on <IDENTIFIER>. Run /linear-add-journey first."` and stop.
41
+
42
+ ### Step 2: Satisfy Prerequisites
43
+
44
+ Before executing steps, verify each prerequisite:
45
+
46
+ 1. Required services running (dev server, database, queue worker)
47
+ 2. Database connectivity if needed
48
+ 3. Environment variables set
49
+ 4. Run any setup commands mentioned in prerequisites
50
+
51
+ Stop and report if any prerequisite is not satisfied.
52
+
53
+ ### Step 3: Execute Steps and Capture Evidence
54
+
55
+ Execute each step sequentially. Determine the verification approach based on the step text and change type:
56
+
57
+ - **API endpoints** → Run curl commands, capture HTTP response to `evidence/NN-name.txt` (or `.json` for structured data)
58
+ - **Database changes** → Run psql / migration commands, capture schema output
59
+ - **Background jobs** → Trigger the job, check queue / state, capture logs
60
+ - **Library / utility changes** → Run tests, capture output
61
+ - **Security fixes** → Reproduce exploit attempt, verify fix
62
+ - **UI / frontend** → Playwright browser flow, capture screenshots / DOM state
63
+
64
+ At each `[EVIDENCE: name]` marker, capture stdout / stderr to a numbered file:
65
+
66
+ #### Evidence Naming Convention
67
+
68
+ `{NN}-{evidence-name}.{ext}`
69
+
70
+ - `NN`: zero-padded sequential number (`01`, `02`, `03`...)
71
+ - `evidence-name`: the value from `[EVIDENCE: name]`
72
+ - `ext`: `.txt` for plain output, `.json` for structured data
73
+
74
+ Example:
75
+
76
+ ```text
77
+ evidence/
78
+ 01-health-check.json
79
+ 02-schema-after-migration.txt
80
+ 03-rate-limit-response.txt
81
+ comment.txt
82
+ code-blocks.md
83
+ ```
84
+
85
+ ### Step 4: Generate Evidence Comment + Code Blocks
86
+
87
+ After capturing all evidence, build:
88
+
89
+ - `evidence/comment.txt` — human-readable summary of the verification (Linear comment body, markdown-supported)
90
+ - `evidence/code-blocks.md` — fenced code blocks containing the captured evidence outputs (appended below `comment.txt` inside a `<details>` block)
91
+
92
+ ### Step 5: Post Evidence
93
+
94
+ Invoke `lisa:linear-evidence` with `<IDENTIFIER> ./evidence` to:
95
+
96
+ 1. Upload large evidence files to the GitHub `pr-assets` release (if files present in `evidence/files/`).
97
+ 2. Update the GitHub PR description with an Evidence section (when a PR is open).
98
+ 3. Post the Linear comment (`comment.txt` + collapsible `code-blocks.md`).
99
+ 4. Transition labels: remove `status:in-progress`, add `status:code-review`.
100
+
101
+ ### Step 6: Verify
102
+
103
+ Confirm:
104
+ - Evidence appears as a comment on the Linear Issue.
105
+ - The PR description shows the Evidence section.
106
+ - The Issue's `status:*` label transitioned to `code-review`.
107
+
108
+ ## Verification Patterns Reference
109
+
110
+ Use patterns from the project's `verification.md`:
111
+
112
+ | Change Type | Verification Method | Evidence Format |
113
+ |---|---|---|
114
+ | API endpoint | `curl -s localhost:PORT/endpoint` | JSON response |
115
+ | Database migration | `psql -c "\d table"` or migration output | Schema text |
116
+ | Background job | Trigger + check state | Log output |
117
+ | Library / utility | `bun run test -- path/to/test` | Test output |
118
+ | Security fix | Reproduce + verify fix | Request / response |
119
+ | Auth/authz | Multi-role verification | Status codes per role |
120
+ | UI / frontend | Playwright `browser_*` MCP tools | Screenshot + DOM |
121
+
122
+ ## Troubleshooting
123
+
124
+ ### Evidence file is empty
125
+
126
+ Ensure the command succeeded and produced output. Use `2>&1` to capture both stdout and stderr.
127
+
128
+ ### Parser returns no steps
129
+
130
+ The Issue may not have a Validation Journey section. Run `/linear-add-journey <IDENTIFIER>` to add one.
131
+
132
+ ### Label transition fails
133
+
134
+ Ensure `status:in-progress` and `status:code-review` exist on the team. `lisa:linear-evidence` creates them on demand if missing.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: linear-prd-intake
3
- description: "Scans a Linear workspace (or a specific team) for projects labelled `prd-ready` and runs each one through the dry-run validation pipeline. Projects that pass every gate get tickets written and the label flipped to `prd-ticketed`; projects that fail get clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to `prd-blocked`. Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (linear-to-tracker, tracker-validate, jira-source-artifacts, product-walkthrough)."
3
+ description: "Scans a Linear workspace (or a specific team) for projects labelled `prd-ready` and runs each one through the dry-run validation pipeline. Projects that pass every gate get tickets written and the label flipped to `prd-ticketed`; projects that fail get clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to `prd-blocked`. Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (linear-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
4
4
  allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__list_comments", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_teams"]
5
5
  ---
6
6
 
@@ -10,7 +10,7 @@ allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_projects", "mcp__line
10
10
 
11
11
  - A Linear **workspace** URL — scans every project in the workspace whose labels include `prd-ready`. Example: `https://linear.app/acme`.
12
12
  - A Linear **team** URL or team key — scans every project on the team whose labels include `prd-ready`. Example: `https://linear.app/acme/team/ENG/projects` or bare `ENG`.
13
- - The literal token `linear` — equivalent to "the default Linear workspace"; only valid if `LINEAR_WORKSPACE` is configured.
13
+ - The literal token `linear` — equivalent to "the default Linear workspace"; only valid if `linear.workspace` is configured in `.lisa.config.json`.
14
14
 
15
15
  Run one intake cycle against that scope. Each project with the `prd-ready` label is claimed, validated, and routed to either `prd-blocked` (with clarifying comments on a sentinel feedback issue) or `prd-ticketed` (with JIRA tickets created).
16
16
 
@@ -29,7 +29,7 @@ Specifically forbidden:
29
29
 
30
30
  The only legitimate reasons to stop early:
31
31
 
32
- - Missing scope argument or required configuration (`JIRA_PROJECT`, `JIRA_SERVER`, `LINEAR_WORKSPACE`, `E2E_BASE_URL`, etc.). Surface the missing key(s) and exit this cycle — never invent values.
32
+ - Missing scope argument or required configuration (`linear.workspace` in `.lisa.config.json`, `E2E_BASE_URL`, etc.). Surface the missing key(s) and exit this cycle — never invent values.
33
33
  - Workspace/team unreachable, or the labelling convention not yet adopted (no projects carry any of `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed`). Surface and exit.
34
34
  - Empty `prd-ready` set. Exit cleanly with `"No Linear projects labelled prd-ready. Nothing to do."`
35
35
 
@@ -63,7 +63,7 @@ If the project does not yet use `prd-*` labels, this skill cannot run. Adopting
63
63
  - Workspace URL (`https://linear.app/<workspace>`) → extract workspace slug; the scope is the entire workspace.
64
64
  - Team URL containing `/team/<KEY>/...` → extract team key; the scope is that team.
65
65
  - Bare team key → use as-is; the scope is that team.
66
- - The literal `linear` → fall back to `LINEAR_WORKSPACE` env var; error if not set.
66
+ - The literal `linear` → fall back to `linear.workspace` from `.lisa.config.json`; error if not set.
67
67
  2. Verify the scope is reachable:
68
68
  - For a workspace: call `mcp__linear-server__list_teams` and confirm at least one team is returned (non-empty workspaces are readable; empty results indicate auth or workspace-mismatch).
69
69
  - For a team: call `mcp__linear-server__list_teams({query: <KEY>})` and confirm the team resolves.
@@ -106,7 +106,7 @@ Invoke the `lisa:linear-to-tracker` skill with `dry_run: true` and the project's
106
106
  - An overall PASS / FAIL verdict
107
107
  - A failure count
108
108
 
109
- This call also indirectly invokes `lisa:jira-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:linear-to-tracker` calls per ticket.
109
+ 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:linear-to-tracker` calls per ticket.
110
110
 
111
111
  #### 3c. Branch on the verdict
112
112
 
@@ -250,7 +250,12 @@ Idempotency: the helper finds-or-creates. Re-runs of the cycle reuse the same se
250
250
 
251
251
  ## Configuration
252
252
 
253
- Same env vars as `lisa:linear-to-tracker` — `JIRA_PROJECT`, `JIRA_SERVER`, `LINEAR_WORKSPACE`, `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
253
+ Same configuration as `lisa:linear-to-tracker`. See that skill for the full table. Key items:
254
+
255
+ - **From `.lisa.config.json`**: `linear.workspace` (required for Linear MCP). When the destination tracker is `linear`, also `linear.teamKey`.
256
+ - **From environment variables**: `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL` (operational E2E test config).
257
+
258
+ Destination tracker config (jira / github / linear) is consumed by `lisa:tracker-write` internally — this skill does NOT read it. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
254
259
 
255
260
  ## Rules
256
261