@codyswann/lisa 2.176.12 → 2.178.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 (199) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/linear-agent.md +3 -3
  5. package/plugins/lisa/rules/eager/integration-access-layer.md +10 -0
  6. package/plugins/lisa/rules/reference/integration-access-layer.md +56 -0
  7. package/plugins/lisa/rules/reference/repo-scope-split.md +1 -1
  8. package/plugins/lisa/skills/intake/SKILL.md +2 -2
  9. package/plugins/lisa/skills/jam-access/SKILL.md +51 -0
  10. package/plugins/lisa/skills/jam-access/agents/openai.yaml +4 -0
  11. package/plugins/lisa/skills/linear-access/SKILL.md +90 -0
  12. package/plugins/lisa/skills/linear-access/agents/openai.yaml +4 -0
  13. package/plugins/lisa/skills/linear-add-journey/SKILL.md +3 -3
  14. package/plugins/lisa/skills/linear-build-intake/SKILL.md +11 -11
  15. package/plugins/lisa/skills/linear-create/SKILL.md +3 -3
  16. package/plugins/lisa/skills/linear-evidence/SKILL.md +5 -5
  17. package/plugins/lisa/skills/linear-journey/SKILL.md +2 -2
  18. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -11
  19. package/plugins/lisa/skills/linear-read-issue/SKILL.md +11 -11
  20. package/plugins/lisa/skills/linear-sync/SKILL.md +7 -7
  21. package/plugins/lisa/skills/linear-to-tracker/SKILL.md +7 -7
  22. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +8 -8
  23. package/plugins/lisa/skills/linear-verify/SKILL.md +3 -3
  24. package/plugins/lisa/skills/linear-write-issue/SKILL.md +20 -20
  25. package/plugins/lisa/skills/linear-write-prd/SKILL.md +6 -6
  26. package/plugins/lisa/skills/posthog-access/SKILL.md +60 -0
  27. package/plugins/lisa/skills/posthog-access/agents/openai.yaml +4 -0
  28. package/plugins/lisa/skills/prd-backlink/SKILL.md +5 -5
  29. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +2 -2
  30. package/plugins/lisa/skills/repair-intake/SKILL.md +1 -1
  31. package/plugins/lisa/skills/sentry-access/SKILL.md +56 -0
  32. package/plugins/lisa/skills/sentry-access/agents/openai.yaml +4 -0
  33. package/plugins/lisa/skills/setup-linear/SKILL.md +5 -5
  34. package/plugins/lisa/skills/sonarcloud-access/SKILL.md +71 -0
  35. package/plugins/lisa/skills/sonarcloud-access/agents/openai.yaml +4 -0
  36. package/plugins/lisa/skills/tracker-journey/SKILL.md +1 -1
  37. package/plugins/lisa/skills/verify-prd/SKILL.md +2 -2
  38. package/plugins/lisa-agy/agents/linear-agent.md +3 -3
  39. package/plugins/lisa-agy/plugin.json +1 -1
  40. package/plugins/lisa-agy/skills/intake/SKILL.md +2 -2
  41. package/plugins/lisa-agy/skills/jam-access/SKILL.md +51 -0
  42. package/plugins/lisa-agy/skills/linear-access/SKILL.md +90 -0
  43. package/plugins/lisa-agy/skills/linear-add-journey/SKILL.md +3 -3
  44. package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +11 -11
  45. package/plugins/lisa-agy/skills/linear-create/SKILL.md +3 -3
  46. package/plugins/lisa-agy/skills/linear-evidence/SKILL.md +5 -5
  47. package/plugins/lisa-agy/skills/linear-journey/SKILL.md +2 -2
  48. package/plugins/lisa-agy/skills/linear-prd-intake/SKILL.md +11 -11
  49. package/plugins/lisa-agy/skills/linear-read-issue/SKILL.md +11 -11
  50. package/plugins/lisa-agy/skills/linear-sync/SKILL.md +7 -7
  51. package/plugins/lisa-agy/skills/linear-to-tracker/SKILL.md +7 -7
  52. package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +8 -8
  53. package/plugins/lisa-agy/skills/linear-verify/SKILL.md +3 -3
  54. package/plugins/lisa-agy/skills/linear-write-issue/SKILL.md +20 -20
  55. package/plugins/lisa-agy/skills/linear-write-prd/SKILL.md +6 -6
  56. package/plugins/lisa-agy/skills/posthog-access/SKILL.md +60 -0
  57. package/plugins/lisa-agy/skills/prd-backlink/SKILL.md +5 -5
  58. package/plugins/lisa-agy/skills/prd-ticket-coverage/SKILL.md +2 -2
  59. package/plugins/lisa-agy/skills/repair-intake/SKILL.md +1 -1
  60. package/plugins/lisa-agy/skills/sentry-access/SKILL.md +56 -0
  61. package/plugins/lisa-agy/skills/setup-linear/SKILL.md +5 -5
  62. package/plugins/lisa-agy/skills/sonarcloud-access/SKILL.md +71 -0
  63. package/plugins/lisa-agy/skills/tracker-journey/SKILL.md +1 -1
  64. package/plugins/lisa-agy/skills/verify-prd/SKILL.md +2 -2
  65. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  68. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-copilot/agents/linear-agent.agent.md +3 -3
  72. package/plugins/lisa-copilot/rules/eager/integration-access-layer.md +10 -0
  73. package/plugins/lisa-copilot/rules/reference/integration-access-layer.md +56 -0
  74. package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +1 -1
  75. package/plugins/lisa-copilot/skills/intake/SKILL.md +2 -2
  76. package/plugins/lisa-copilot/skills/jam-access/SKILL.md +51 -0
  77. package/plugins/lisa-copilot/skills/linear-access/SKILL.md +90 -0
  78. package/plugins/lisa-copilot/skills/linear-add-journey/SKILL.md +3 -3
  79. package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +11 -11
  80. package/plugins/lisa-copilot/skills/linear-create/SKILL.md +3 -3
  81. package/plugins/lisa-copilot/skills/linear-evidence/SKILL.md +5 -5
  82. package/plugins/lisa-copilot/skills/linear-journey/SKILL.md +2 -2
  83. package/plugins/lisa-copilot/skills/linear-prd-intake/SKILL.md +11 -11
  84. package/plugins/lisa-copilot/skills/linear-read-issue/SKILL.md +11 -11
  85. package/plugins/lisa-copilot/skills/linear-sync/SKILL.md +7 -7
  86. package/plugins/lisa-copilot/skills/linear-to-tracker/SKILL.md +7 -7
  87. package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +8 -8
  88. package/plugins/lisa-copilot/skills/linear-verify/SKILL.md +3 -3
  89. package/plugins/lisa-copilot/skills/linear-write-issue/SKILL.md +20 -20
  90. package/plugins/lisa-copilot/skills/linear-write-prd/SKILL.md +6 -6
  91. package/plugins/lisa-copilot/skills/posthog-access/SKILL.md +60 -0
  92. package/plugins/lisa-copilot/skills/prd-backlink/SKILL.md +5 -5
  93. package/plugins/lisa-copilot/skills/prd-ticket-coverage/SKILL.md +2 -2
  94. package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +1 -1
  95. package/plugins/lisa-copilot/skills/sentry-access/SKILL.md +56 -0
  96. package/plugins/lisa-copilot/skills/setup-linear/SKILL.md +5 -5
  97. package/plugins/lisa-copilot/skills/sonarcloud-access/SKILL.md +71 -0
  98. package/plugins/lisa-copilot/skills/tracker-journey/SKILL.md +1 -1
  99. package/plugins/lisa-copilot/skills/verify-prd/SKILL.md +2 -2
  100. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-cursor/agents/linear-agent.md +3 -3
  102. package/plugins/lisa-cursor/rules/integration-access-layer-reference.mdc +61 -0
  103. package/plugins/lisa-cursor/rules/integration-access-layer.mdc +15 -0
  104. package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +1 -1
  105. package/plugins/lisa-cursor/skills/intake/SKILL.md +2 -2
  106. package/plugins/lisa-cursor/skills/jam-access/SKILL.md +51 -0
  107. package/plugins/lisa-cursor/skills/linear-access/SKILL.md +90 -0
  108. package/plugins/lisa-cursor/skills/linear-add-journey/SKILL.md +3 -3
  109. package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +11 -11
  110. package/plugins/lisa-cursor/skills/linear-create/SKILL.md +3 -3
  111. package/plugins/lisa-cursor/skills/linear-evidence/SKILL.md +5 -5
  112. package/plugins/lisa-cursor/skills/linear-journey/SKILL.md +2 -2
  113. package/plugins/lisa-cursor/skills/linear-prd-intake/SKILL.md +11 -11
  114. package/plugins/lisa-cursor/skills/linear-read-issue/SKILL.md +11 -11
  115. package/plugins/lisa-cursor/skills/linear-sync/SKILL.md +7 -7
  116. package/plugins/lisa-cursor/skills/linear-to-tracker/SKILL.md +7 -7
  117. package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +8 -8
  118. package/plugins/lisa-cursor/skills/linear-verify/SKILL.md +3 -3
  119. package/plugins/lisa-cursor/skills/linear-write-issue/SKILL.md +20 -20
  120. package/plugins/lisa-cursor/skills/linear-write-prd/SKILL.md +6 -6
  121. package/plugins/lisa-cursor/skills/posthog-access/SKILL.md +60 -0
  122. package/plugins/lisa-cursor/skills/prd-backlink/SKILL.md +5 -5
  123. package/plugins/lisa-cursor/skills/prd-ticket-coverage/SKILL.md +2 -2
  124. package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +1 -1
  125. package/plugins/lisa-cursor/skills/sentry-access/SKILL.md +56 -0
  126. package/plugins/lisa-cursor/skills/setup-linear/SKILL.md +5 -5
  127. package/plugins/lisa-cursor/skills/sonarcloud-access/SKILL.md +71 -0
  128. package/plugins/lisa-cursor/skills/tracker-journey/SKILL.md +1 -1
  129. package/plugins/lisa-cursor/skills/verify-prd/SKILL.md +2 -2
  130. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  131. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  132. package/plugins/lisa-expo-agy/plugin.json +1 -1
  133. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  134. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  135. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  136. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  137. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  138. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  139. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  140. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  141. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  142. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  143. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  144. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  145. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  146. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  147. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  148. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  149. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  150. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  151. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  152. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  153. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  154. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  155. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  156. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  157. package/plugins/lisa-rails-agy/plugin.json +1 -1
  158. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  159. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  160. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  161. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  162. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  163. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  164. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  165. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  166. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  167. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  168. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  169. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  170. package/plugins/src/base/agents/linear-agent.md +3 -3
  171. package/plugins/src/base/rules/eager/integration-access-layer.md +10 -0
  172. package/plugins/src/base/rules/reference/integration-access-layer.md +56 -0
  173. package/plugins/src/base/rules/reference/repo-scope-split.md +1 -1
  174. package/plugins/src/base/skills/intake/SKILL.md +2 -2
  175. package/plugins/src/base/skills/jam-access/SKILL.md +51 -0
  176. package/plugins/src/base/skills/linear-access/SKILL.md +90 -0
  177. package/plugins/src/base/skills/linear-add-journey/SKILL.md +3 -3
  178. package/plugins/src/base/skills/linear-build-intake/SKILL.md +11 -11
  179. package/plugins/src/base/skills/linear-create/SKILL.md +3 -3
  180. package/plugins/src/base/skills/linear-evidence/SKILL.md +5 -5
  181. package/plugins/src/base/skills/linear-journey/SKILL.md +2 -2
  182. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -11
  183. package/plugins/src/base/skills/linear-read-issue/SKILL.md +11 -11
  184. package/plugins/src/base/skills/linear-sync/SKILL.md +7 -7
  185. package/plugins/src/base/skills/linear-to-tracker/SKILL.md +7 -7
  186. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +8 -8
  187. package/plugins/src/base/skills/linear-verify/SKILL.md +3 -3
  188. package/plugins/src/base/skills/linear-write-issue/SKILL.md +20 -20
  189. package/plugins/src/base/skills/linear-write-prd/SKILL.md +6 -6
  190. package/plugins/src/base/skills/posthog-access/SKILL.md +60 -0
  191. package/plugins/src/base/skills/prd-backlink/SKILL.md +5 -5
  192. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +2 -2
  193. package/plugins/src/base/skills/repair-intake/SKILL.md +1 -1
  194. package/plugins/src/base/skills/sentry-access/SKILL.md +56 -0
  195. package/plugins/src/base/skills/setup-linear/SKILL.md +5 -5
  196. package/plugins/src/base/skills/sonarcloud-access/SKILL.md +71 -0
  197. package/plugins/src/base/skills/tracker-journey/SKILL.md +1 -1
  198. package/plugins/src/base/skills/verify-prd/SKILL.md +2 -2
  199. package/scripts/generate-codex-plugin-artifacts.mjs +28 -7
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-write-issue
3
3
  description: "Creates or updates a Linear work item — Project (Epic), Issue (Story), or sub-Issue (Sub-task) — following organizational best practices. Polymorphic: dispatches internally on issue_type to save_project (Epic) or save_issue (Story / Sub-task). Enforces description quality (three audiences), Gherkin acceptance criteria, project-as-parent for Stories, parentId for Sub-tasks, explicit relationship discovery (blocks / is blocked by / relates to / duplicates), labels, components-as-labels, project milestones for fix versions, native priority and estimate fields, and Validation Journey. Rejects thin items — use this skill any time a Linear work item is created or significantly edited."
4
- allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_team", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_comments", "mcp__linear-server__save_comment"]
4
+ allowed-tools: ["Bash", "Skill"]
5
5
  ---
6
6
 
7
7
  # Write Linear Work Item: $ARGUMENTS
@@ -25,11 +25,11 @@ Linear's data model maps Epic / Story / Sub-task to **different entity types**.
25
25
 
26
26
  | `issue_type` | Linear entity | MCP write tool | Parent field |
27
27
  |--------------|---------------|----------------|--------------|
28
- | `Epic` | **Project** | `mcp__linear-server__save_project` | (none — Projects are top-level within a team) |
29
- | `Story` / `Task` / `Improvement` | **Issue** | `mcp__linear-server__save_issue` | `projectId` (the Epic Project) |
30
- | `Sub-task` | **sub-Issue** | `mcp__linear-server__save_issue` | `parentId` (the Story Issue) |
31
- | `Bug` | **Issue** | `mcp__linear-server__save_issue` | `projectId` if part of an Epic; else top-level |
32
- | `Spike` | **Issue** | `mcp__linear-server__save_issue` | `projectId` if part of an Epic; else top-level |
28
+ | `Epic` | **Project** | `lisa:linear-access operation: save-project` | (none — Projects are top-level within a team) |
29
+ | `Story` / `Task` / `Improvement` | **Issue** | `lisa:linear-access operation: save-issue` | `projectId` (the Epic Project) |
30
+ | `Sub-task` | **sub-Issue** | `lisa:linear-access operation: save-issue` | `parentId` (the Story Issue) |
31
+ | `Bug` | **Issue** | `lisa:linear-access operation: save-issue` | `projectId` if part of an Epic; else top-level |
32
+ | `Spike` | **Issue** | `lisa:linear-access operation: save-issue` | `projectId` if part of an Epic; else top-level |
33
33
 
34
34
  Status workflow uses **labels** (`status:ready`, `status:in-progress`, `status:on-dev`, `status:done`) for portability across teams — Linear's per-team workflow state names vary, but labels are workspace-scoped and stable. Native Linear `state` is set to the team's default `Todo` state on create.
35
35
 
@@ -40,7 +40,7 @@ Determine from `$ARGUMENTS` and context whether this is a CREATE or UPDATE:
40
40
  - **CREATE**: no existing identifier provided.
41
41
  - **UPDATE**: identifier provided (`<TEAM>-<n>` for Issue, project slug + short-id for Project) — call `/linear-read-issue <ref>` first to load the full current state. Never overwrite without reading.
42
42
 
43
- Resolve the team ID for `linear.teamKey` via `mcp__linear-server__list_teams({query: <teamKey>})`. Cache it.
43
+ Resolve the team ID for `linear.teamKey` via `lisa:linear-access operation: list-teams({query: <teamKey>})`. Cache it.
44
44
 
45
45
  ## Phase 2 — Gather Required Inputs
46
46
 
@@ -129,7 +129,7 @@ If the parent is explicitly provided, use it. Otherwise:
129
129
 
130
130
  1. Search active Projects in the team:
131
131
  ```text
132
- mcp__linear-server__list_projects({team: <teamKey>, state: ["backlog", "planned", "started"]})
132
+ lisa:linear-access operation: list-projects({team: <teamKey>, state: ["backlog", "planned", "started"]})
133
133
  ```
134
134
  Match on keywords from the summary and description.
135
135
  2. If no matching Project exists, stop and ask the human to create or pick one. Do NOT orphan the item.
@@ -152,16 +152,16 @@ If the git search surfaces a PR or commit that relates to this work, capture the
152
152
 
153
153
  ```text
154
154
  # Open items in the same Project
155
- mcp__linear-server__list_issues({project: <projectId>, state_type: ["unstarted", "started"]})
155
+ lisa:linear-access operation: list-issues({project: <projectId>, state_type: ["unstarted", "started"]})
156
156
 
157
157
  # Open items with overlapping keywords (workspace-wide)
158
- mcp__linear-server__list_issues({query: "<keyword>", state_type: ["unstarted", "started"]})
158
+ lisa:linear-access operation: list-issues({query: "<keyword>", state_type: ["unstarted", "started"]})
159
159
 
160
160
  # Items with shared labels
161
- mcp__linear-server__list_issues({label: "<label>", updatedAt: ">-30d"})
161
+ lisa:linear-access operation: list-issues({label: "<label>", updatedAt: ">-30d"})
162
162
 
163
163
  # Recently closed items in the same Project
164
- mcp__linear-server__list_issues({project: <projectId>, state_type: ["completed", "canceled"], updatedAt: ">-30d"})
164
+ lisa:linear-access operation: list-issues({project: <projectId>, state_type: ["completed", "canceled"], updatedAt: ">-30d"})
165
165
  ```
166
166
 
167
167
  **Record the outcome.** Add a `## Relationship Search` subsection (or a comment if updating) listing the queries you ran and what they returned. If the searches yielded nothing, write that explicitly — "Searched git history for `<keywords>` and Linear for project=`X`, label=`Y`; no related work found." An item with zero relations and no documented search is rejected.
@@ -229,7 +229,7 @@ The validator is the **single source of truth** for what makes a valid Linear wo
229
229
  If the validator reports `FAIL`:
230
230
  - Surface the failure list and the per-gate remediation to the user.
231
231
  - Do NOT proceed to Phase 6. Fix the spec (or stop and ask the human) and re-run validation.
232
- - Never call `mcp__linear-server__save_project` or `mcp__linear-server__save_issue` while the validator's verdict is FAIL.
232
+ - Never call `lisa:linear-access operation: save-project` or `lisa:linear-access operation: save-issue` while the validator's verdict is FAIL.
233
233
 
234
234
  If the validator reports `PASS`, continue to Phase 6.
235
235
 
@@ -237,15 +237,15 @@ If the validator reports `PASS`, continue to Phase 6.
237
237
 
238
238
  ### CREATE — Epic (Project)
239
239
 
240
- 1. Resolve any required Project labels (`prd-ticketed`, etc.) via `mcp__linear-server__list_project_labels` (create via `create_project_label` if missing).
241
- 2. Call `mcp__linear-server__save_project` with: `name` (summary), `description` (markdown), `teamIds: [<teamId>]`, `labelIds`, `priority` (Linear Project priority is also 0–4), `state` (default `backlog`), milestones if dated.
240
+ 1. Resolve any required Project labels (`prd-ticketed`, etc.) via `lisa:linear-access operation: list-project-labels` (create via `lisa:linear-access operation: create-project-label` if missing).
241
+ 2. Call `lisa:linear-access operation: save-project` with: `name` (summary), `description` (markdown), `teamIds: [<teamId>]`, `labelIds`, `priority` (Linear Project priority is also 0–4), `state` (default `backlog`), milestones if dated.
242
242
  3. Capture the returned Project ID and slug — Phase 4 children need these.
243
243
  4. If the Project is the parent for downstream Stories, record the ID for `lisa:linear-to-tracker` Phase 4 to use.
244
244
 
245
245
  ### CREATE — Story / Task / Bug / Spike / Improvement (Issue with projectId)
246
246
 
247
- 1. Resolve any required Issue labels (`component:<name>`, `prd-intake-feedback` only if this is a sentinel issue, etc.) via `mcp__linear-server__list_issue_labels` (create via `create_issue_label` if missing). Include `status:ready` in `labelIds` only for a **leaf** work unit and only when `build_ready` is not `false` (per the Build-ready control input) — omit it for a container, and for a `build_ready: false` leaf which then waits in the backlog for a human to promote it.
248
- 2. Call `mcp__linear-server__save_issue` with: `team` (teamId), `title` (summary), `description` (markdown), `projectId` (the Epic Project), `priority` (0–4), `estimate`, `labelIds`, `assignee` if known.
247
+ 1. Resolve any required Issue labels (`component:<name>`, `prd-intake-feedback` only if this is a sentinel issue, etc.) via `lisa:linear-access operation: list-issue-labels` (create via `lisa:linear-access operation: create-issue-label` if missing). Include `status:ready` in `labelIds` only for a **leaf** work unit and only when `build_ready` is not `false` (per the Build-ready control input) — omit it for a container, and for a `build_ready: false` leaf which then waits in the backlog for a human to promote it.
248
+ 2. Call `lisa:linear-access operation: save-issue` with: `team` (teamId), `title` (summary), `description` (markdown), `projectId` (the Epic Project), `priority` (0–4), `estimate`, `labelIds`, `assignee` if known.
249
249
  3. Capture the returned identifier (e.g. `ENG-123`) — Phase 4 sub-tasks need it as `parentId`.
250
250
  4. Add relationships from Phase 4b via `save_issue` (relations field) or paired relation calls.
251
251
  5. If the item changes runtime behavior, invoke `lisa:linear-add-journey` to append the Validation Journey section.
@@ -253,13 +253,13 @@ If the validator reports `PASS`, continue to Phase 6.
253
253
  ### CREATE — Sub-task (Issue with parentId)
254
254
 
255
255
  1. Resolve labels as above.
256
- 2. Call `mcp__linear-server__save_issue` with: `team` (teamId), `title` (`[<repo>] <summary>` prefix is mandatory), `description` (markdown), `parentId` (the Story Issue ID), `projectId` (inherit from parent), `priority`, `estimate`, `labelIds`.
256
+ 2. Call `lisa:linear-access operation: save-issue` with: `team` (teamId), `title` (`[<repo>] <summary>` prefix is mandatory), `description` (markdown), `parentId` (the Story Issue ID), `projectId` (inherit from parent), `priority`, `estimate`, `labelIds`.
257
257
  3. Capture identifier.
258
258
  4. Add relationships via Phase 4b.
259
259
 
260
260
  ### UPDATE
261
261
 
262
- 1. Call `mcp__linear-server__save_project` or `mcp__linear-server__save_issue` with **only the fields being changed**. Do NOT resend fields that weren't in the change set — Linear treats the call as a full overwrite of the listed fields.
262
+ 1. Call `lisa:linear-access operation: save-project` or `lisa:linear-access operation: save-issue` with **only the fields being changed**. Do NOT resend fields that weren't in the change set — Linear treats the call as a full overwrite of the listed fields.
263
263
  2. Preserve description sections you are not editing — re-read via `/linear-read-issue` first, including any existing canonical managed `## Lisa Usage` section unless the caller intentionally supplied an updated canonical section. Use the shared `usage-accounting` serializer/merge path rather than freehand edits to ledger rows.
264
264
 
265
265
  ## Phase 7 — Verify
@@ -268,7 +268,7 @@ Call the `lisa:linear-verify` skill on the resulting item. `lisa:linear-verify`
268
268
 
269
269
  ## Phase 8 — Announce
270
270
 
271
- Post a creation comment via `mcp__linear-server__save_comment` (on the Issue, or on a sentinel issue under the Project for Epic-level announcements) with:
271
+ Post a creation comment via `lisa:linear-access operation: save-comment` (on the Issue, or on a sentinel issue under the Project for Epic-level announcements) with:
272
272
 
273
273
  - `[<repo>]` prefix if the item is repo-scoped
274
274
  - Who the item is assigned to (if known)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-write-prd
3
3
  description: "Creates or idempotently updates a PRD as a Linear Project carrying exactly one PRD lifecycle project-label (`prd-draft` by default, or `prd-ready` when initial_role is ready so lisa:linear-prd-intake auto-claims it). The Linear PRD-source writer behind lisa:prd-source-write. Dedupes by a stable marker embedded in the Project description (matched by marker, never by name). Uses the Linear MCP."
4
- allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_teams", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_project_labels", "mcp__linear-server__create_project_label"]
4
+ allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
7
7
  # Write Linear PRD: $ARGUMENTS
@@ -37,17 +37,17 @@ PROGRESSED=("$PRD_IN_REVIEW" "$PRD_BLOCKED" "$PRD_TICKETED" "$PRD_SHIPPED" "$PRD
37
37
  ```
38
38
 
39
39
  Resolve the target project-label from `initial_role`: `ready` → `$PRD_READY`, else `$PRD_DRAFT`.
40
- Resolve its label id via `mcp__linear-server__list_project_labels` (create via
41
- `mcp__linear-server__create_project_label` if missing).
40
+ Resolve its label id via `lisa:linear-access operation: list-project-labels` (create via
41
+ `lisa:linear-access operation: create-project-label` if missing).
42
42
 
43
43
  ## Phase 2 — Dedupe by marker (search before create)
44
44
 
45
45
  The `marker` is embedded in the Project description. Find an existing Project carrying it — match the
46
46
  marker, **never** the project name:
47
47
 
48
- 1. `mcp__linear-server__list_projects` scoped to the team/workspace (filtered by the `prd-*` label
48
+ 1. `lisa:linear-access operation: list-projects` scoped to the team/workspace (filtered by the `prd-*` label
49
49
  set when supported), then inspect each candidate's description via
50
- `mcp__linear-server__get_project` for the marker. If `source_ref` was passed, target it directly.
50
+ `lisa:linear-access operation: get-project` for the marker. If `source_ref` was passed, target it directly.
51
51
  2. If a Project with the marker exists → **update**; else → **create**.
52
52
 
53
53
  ## Phase 3 — Create or update
@@ -59,7 +59,7 @@ dedupe. If the live Project description already contains the canonical managed `
59
59
  section, preserve it verbatim unless the caller intentionally supplied an updated canonical section;
60
60
  use the shared `usage-accounting` serializer/merge path rather than hand-editing ledger rows.
61
61
 
62
- **CREATE:** `mcp__linear-server__save_project` with:
62
+ **CREATE:** `lisa:linear-access operation: save-project` with:
63
63
  - `name`: `$TITLE`
64
64
  - `description`: the marker-normalized full PRD markdown
65
65
  - `teamIds`: `[<resolved team id>]`
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: posthog-access
3
+ description: "Vendor-neutral access layer for PostHog. PostHog skills and observability rules MUST delegate through this skill rather than calling PostHog MCP tools or REST directly. Resolves PostHog MCP first when available, then falls back to POSTHOG_PERSONAL_API_KEY bearer auth."
4
+ allowed-tools: ["Bash", "Read", "Skill"]
5
+ ---
6
+
7
+ # PostHog Access: $ARGUMENTS
8
+
9
+ Single chokepoint for PostHog operations. Caller skills and rules MUST NOT call
10
+ `mcp__posthog__*` tools or PostHog REST directly.
11
+
12
+ ## Invocation Contract
13
+
14
+ ```text
15
+ operation: query project_id:<ID> payload:{...}
16
+ operation: insights project_id:<ID>
17
+ operation: persons project_id:<ID> [query:<QUERY>]
18
+ operation: events project_id:<ID> [after:<ISO>] [before:<ISO>]
19
+ ```
20
+
21
+ Return parsed JSON in a `<result>` block.
22
+
23
+ ## Substrate Selection
24
+
25
+ Probe in order:
26
+
27
+ 1. PostHog MCP, if available and authenticated.
28
+ 2. `POSTHOG_PERSONAL_API_KEY` bearer token against the configured PostHog host.
29
+
30
+ PostHog documents personal API keys and bearer authentication. The headless REST
31
+ tier uses:
32
+
33
+ ```bash
34
+ POSTHOG_HOST=${POSTHOG_HOST:-https://app.posthog.com}
35
+ posthog_api() {
36
+ local path="$1"
37
+ local method="${2:-GET}"
38
+ local body="${3:-}"
39
+ [ -n "$POSTHOG_PERSONAL_API_KEY" ] || {
40
+ echo "Error: POSTHOG_PERSONAL_API_KEY is not set." >&2
41
+ return 1
42
+ }
43
+ local args=(-sS -X "$method" -H "Authorization: Bearer $POSTHOG_PERSONAL_API_KEY")
44
+ [ -n "$body" ] && args+=(-H "Content-Type: application/json" --data-binary "$body")
45
+ curl "${args[@]}" "${POSTHOG_HOST%/}/api${path}"
46
+ }
47
+ ```
48
+
49
+ If neither tier works, fail with:
50
+
51
+ ```text
52
+ Error: no PostHog access substrate available. Authenticate the PostHog MCP or set POSTHOG_PERSONAL_API_KEY.
53
+ ```
54
+
55
+ ## Invariants
56
+
57
+ - Fallback is gated on `POSTHOG_PERSONAL_API_KEY`.
58
+ - `POSTHOG_HOST` defaults to PostHog Cloud but can point at a self-hosted
59
+ deployment.
60
+ - Consumer skills do not embed PostHog REST paths.
@@ -162,7 +162,7 @@ Linear models top-level grouping two ways, and the PRD's own entity type decides
162
162
  - **PRD is a Linear Project** (the common case — a PRD project groups its generated work). Generated top-level **Issues** are attached to the PRD by setting their `projectId` to the PRD Project's id. The Project *is* the native parent of its Issues; no separate parent-issue link is needed.
163
163
  - **PRD is a Linear Issue** (a parent issue, not a project). Generated top-level Issues are attached as native **sub-Issues** of the PRD Issue by setting their `parentId` to the PRD Issue's id.
164
164
 
165
- Either way the write surface is `mcp__linear-server__save_issue` with the single relevant field (`projectId` or `parentId`) — the same primitive `lisa:linear-write-issue` uses to set a Story's `projectId` (Epic Project) and a Sub-task's `parentId` (Story Issue). Send **only** that field on update; Linear treats `save_issue` as a full overwrite of the fields named (`lisa:linear-write-issue` Phase 6 UPDATE), so resending other fields would clobber them.
165
+ Either way the write surface is `lisa:linear-access operation: save-issue` with the single relevant field (`projectId` or `parentId`) — the same primitive `lisa:linear-write-issue` uses to set a Story's `projectId` (Epic Project) and a Sub-task's `parentId` (Story Issue). Send **only** that field on update; Linear treats `save_issue` as a full overwrite of the fields named (`lisa:linear-write-issue` Phase 6 UPDATE), so resending other fields would clobber them.
166
166
 
167
167
  ### What gets linked — generated top-level work only
168
168
 
@@ -178,14 +178,14 @@ So if the PRD generated `Epic E1 (Project) → Story S1 (Issue) → Sub-task T1
178
178
  The dedupe key is **child-ref identity** — the Linear issue/project identifier (e.g. `TEAM-123`) or its UUID — per the `prd-lifecycle-rollup` idempotency rule. Before attaching any child, read the PRD's current children and skip any child already attached, so re-running `prd-backlink` never duplicates a relationship and is a no-op when everything is already attached.
179
179
 
180
180
  1. **Read the PRD's existing children** (the same reads `lisa:linear-read-issue` uses for Project members and sub-Issues):
181
- - PRD-as-Project → `mcp__linear-server__list_issues({project: <prd_project_id>})` and collect each member Issue's identifier/UUID.
182
- - PRD-as-Issue → `mcp__linear-server__get_issue({id: <prd_issue_id>})` and collect its sub-Issue identifiers/UUIDs.
181
+ - PRD-as-Project → `lisa:linear-access operation: list-issues({project: <prd_project_id>})` and collect each member Issue's identifier/UUID.
182
+ - PRD-as-Issue → `lisa:linear-access operation: get-issue({id: <prd_issue_id>})` and collect its sub-Issue identifiers/UUIDs.
183
183
 
184
184
  The resulting identifiers/UUIDs are the existing child-ref set.
185
185
 
186
186
  2. **For each generated top-level item** whose child-ref is **not** already in that set, attach it with a single-field `save_issue`:
187
- - PRD-as-Project → `mcp__linear-server__save_issue({id: <child_id>, projectId: <prd_project_id>})`.
188
- - PRD-as-Issue → `mcp__linear-server__save_issue({id: <child_id>, parentId: <prd_issue_id>})`.
187
+ - PRD-as-Project → `lisa:linear-access operation: save-issue({id: <child_id>, projectId: <prd_project_id>})`.
188
+ - PRD-as-Issue → `lisa:linear-access operation: save-issue({id: <child_id>, parentId: <prd_issue_id>})`.
189
189
 
190
190
  A child already in the existing-children set is a no-op — do not issue the `save_issue` call for it. Reading the child's current `projectId`/`parentId` and finding it already equal to the PRD's id is the same no-op (attaching to the value it already holds changes nothing).
191
191
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: prd-ticket-coverage
3
3
  description: "Verifies that every requirement in a PRD (Notion, Confluence, Linear, or GitHub Issues) is covered by at least one created destination ticket (JIRA, GitHub Issues, or Linear) — no silent drops. Parses the PRD into atomic items (goals, user stories, functional/non-functional requirements, acceptance criteria, important notes), maps each to the created tickets, and produces a coverage matrix and verdict (COMPLETE / COMPLETE_WITH_SCOPE_CREEP / GAPS_FOUND / NO_TICKETS_FOUND). Used by notion-prd-intake / confluence-prd-intake / linear-prd-intake / github-prd-intake post-write to gate the Ticketed transition; can also be invoked standalone for after-the-fact audits."
4
- allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__linear-server__get_project", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_comments"]
4
+ allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
5
5
  ---
6
6
 
7
7
  # PRD Ticket Coverage Audit: $ARGUMENTS
@@ -15,7 +15,7 @@ The PRD URL can be a **Notion page URL**, a **Confluence page URL**, a **Linear
15
15
 
16
16
  - `notion.so` / `notion.site` → Notion. Fetch with `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) and `mcp__claude_ai_Notion__notion-get-comments`.
17
17
  - Atlassian Confluence host (e.g. `*.atlassian.net/wiki/...`) → Confluence. Fetch with `mcp__atlassian__getConfluencePage`, `mcp__atlassian__getConfluencePageDescendants` (for child epic pages), `mcp__atlassian__getConfluencePageFooterComments`, `mcp__atlassian__getConfluencePageInlineComments`, and `mcp__atlassian__getConfluenceCommentChildren` for nested replies.
18
- - `linear.app` host → Linear. Fetch with `mcp__linear-server__get_project` (capture description, labels, state, attached resources), `mcp__linear-server__list_documents({projectId})` + `mcp__linear-server__get_document` per attached document, `mcp__linear-server__list_issues({project})` for sub-issues that act as child epics / user stories, and `mcp__linear-server__list_comments({issueId})` per sub-issue for decisions and engineering notes. Comments do not exist on the project itself in the MCP surface — sub-issue comments are the substitute.
18
+ - `linear.app` host → Linear. Fetch with `lisa:linear-access operation: get-project` (capture description, labels, state, attached resources), `lisa:linear-access operation: list-documents({projectId})` + `lisa:linear-access operation: get-document` per attached document, `lisa:linear-access operation: list-issues({project})` for sub-issues that act as child epics / user stories, and `lisa:linear-access operation: list-comments({issueId})` per sub-issue for decisions and engineering notes. Comments do not exist on the project itself in the MCP surface — sub-issue comments are the substitute.
19
19
  - `github.com` host → GitHub Issues. Fetch with the `gh` CLI (no GitHub MCP — Lisa uses the CLI exclusively for GitHub):
20
20
  - `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,milestone,assignees,author,createdAt,comments,url` for the PRD body and comments.
21
21
  - `gh api graphql` with the `subIssues` field for native sub-issue children (these stand in for child epic pages — see `lisa:github-read-issue` Phase 3 for the exact query).
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: repair-intake
3
3
  description: "Vendor-agnostic repair scanner — the recovery counterpart to lisa:intake. Where intake claims `ready` work, repair-intake finds work that got stuck or was left half-closed: items left in `blocked`, stalled in an in-progress role (build `claimed`, PRD `in_review`), terminal-labeled items that are still natively open, and rollup/container items whose children are all terminal but whose parent is not closed out. Scans the same queues lisa:intake serves (Notion / Confluence / Linear / GitHub PRD databases; JIRA / GitHub / Linear build queues), enumerates candidates up to `max_candidates`, and repairs every materially actionable one in that bounded set: resumes stalled in-progress work IN PLACE (build → the vendor agent + the scanner's post-agent transition; PRD → the source `*-to-tracker` dry-run validate→route pipeline) — but for a stalled build it first diagnoses the PR/deploy state: a PR that already merged is recovered by applying the env transition build-intake never got to (no re-dispatch); a PR that is merely behind its base is re-synced in place via `gh pr update-branch` so the already-enabled auto-merge can land (a clean rebase needs no human); and only a PR that cannot merge for a non-mechanical reason (true conflict, failing checks, unaddressed CodeRabbit/changes-requested) or a failed deploy gets a build-ready leaf fix ticket with the item moved to `blocked` (blocked by that ticket) rather than re-dispatching, re-validates blocked PRDs when new clarifying answers exist, re-dispatches blocked build items whose `is blocked by` dependencies have since closed OR whose validation/quality-gate self-block now re-validates PASS (re-running `lisa:tracker-validate` against current content — the build mirror of PRD re-validation), performs terminal native closure for terminal-labeled items, reconciles parent rollups to their derived state per leaf-only-lifecycle — including the intermediate-env case (e.g. all children at `On Stg` → parent `On Stg`) and a container wrongly stuck in `ready` — and closes out rollups whose associated child work is fully terminal. Idempotent, loop-protected via a [lisa-repair-intake] marker + state fingerprint + backoff. Never mutates product-owned states (`draft`, `verified`) and never touches `ready` leaves (a container wrongly carrying `ready` is the one exception — it is rolled up from its children, since `ready` on a parent is an invariant violation, not intake's claim signal). Designed as a /schedule cron target running alongside lisa:intake."
4
- allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit", "mcp__linear-server__list_teams", "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"]
4
+ allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit"]
5
5
  ---
6
6
 
7
7
  # Repair Intake: $ARGUMENTS
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: sentry-access
3
+ description: "Vendor-neutral access layer for Sentry. Sentry-oriented skills MUST delegate through this skill rather than calling Sentry MCP tools, sentry-cli, or REST directly. Resolves Sentry MCP/CLI first when available, then falls back to SENTRY_AUTH_TOKEN + Sentry REST API."
4
+ allowed-tools: ["Bash", "Read", "Skill"]
5
+ ---
6
+
7
+ # Sentry Access: $ARGUMENTS
8
+
9
+ Single chokepoint for Sentry operations. Caller skills MUST NOT call
10
+ `mcp__sentry__*`, `sentry-cli`, or `https://sentry.io/api/` directly.
11
+
12
+ ## Invocation Contract
13
+
14
+ ```text
15
+ operation: list-issues org:<ORG> project:<PROJECT> query:<QUERY> [environment:<ENV>]
16
+ operation: get-issue issue_id:<ID>
17
+ operation: events org:<ORG> project:<PROJECT> query:<QUERY>
18
+ operation: releases org:<ORG> project:<PROJECT>
19
+ ```
20
+
21
+ Return parsed JSON in a `<result>` block.
22
+
23
+ ## Substrate Selection
24
+
25
+ Probe in order:
26
+
27
+ 1. Sentry MCP, if available and authenticated.
28
+ 2. `sentry-cli`, if installed and authenticated to the requested org/project.
29
+ 3. `SENTRY_AUTH_TOKEN` bearer token against Sentry REST.
30
+
31
+ Sentry documents API auth tokens for REST API calls. The headless REST tier uses:
32
+
33
+ ```bash
34
+ sentry_api() {
35
+ local path="$1"
36
+ [ -n "$SENTRY_AUTH_TOKEN" ] || {
37
+ echo "Error: SENTRY_AUTH_TOKEN is not set." >&2
38
+ return 1
39
+ }
40
+ curl -sS "https://sentry.io/api/0${path}" \
41
+ -H "Authorization: Bearer $SENTRY_AUTH_TOKEN"
42
+ }
43
+ ```
44
+
45
+ If neither tier works, fail with:
46
+
47
+ ```text
48
+ Error: no Sentry access substrate available. Authenticate Sentry MCP/CLI or set SENTRY_AUTH_TOKEN.
49
+ ```
50
+
51
+ ## Invariants
52
+
53
+ - Fallback is gated on `SENTRY_AUTH_TOKEN`.
54
+ - Org/project come from `.sentryclirc`, `.lisa.config.json`, or explicit
55
+ operation args; never infer by searching all accessible orgs.
56
+ - Consumer skills do not embed Sentry REST paths.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: setup-linear
3
3
  description: "Configure Linear as the destination tracker and/or the PRD source for this project. Verifies Linear access (MCP OAuth or a personal API key in OS keychain), resolves the workspace slug and team key, scaffolds the build-queue issue-label namespace (`status:*`) when Linear is the tracker and/or the PRD-lifecycle project-label namespace (`prd-*` + issue-level sentinel) when Linear is the PRD source, writes the `linear` section into `.lisa.config.json`, and offers to set top-level `tracker: \"linear\"` and/or `source: \"linear\"`. Idempotent — re-running updates the existing section and reuses existing labels. No /lisa:setup:atlassian prerequisite."
4
- allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion", "mcp__linear-server__authenticate", "mcp__linear-server__complete_authentication", "mcp__linear-server__list_teams", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__list_project_labels", "mcp__linear-server__create_project_label"]
4
+ allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion", "mcp__linear-server__authenticate", "mcp__linear-server__complete_authentication"]
5
5
  ---
6
6
 
7
7
  # Setup Linear: $ARGUMENTS
@@ -40,7 +40,7 @@ The role answer drives Step 3 (which label namespaces to scaffold) and whether `
40
40
  Verify the Linear MCP is authenticated to the right workspace by listing teams:
41
41
 
42
42
  ```text
43
- mcp__linear-server__list_teams({})
43
+ lisa:linear-access operation: list-teams({})
44
44
  ```
45
45
 
46
46
  If it errors / returns nothing, run `mcp__linear-server__authenticate` and have the user complete OAuth in the browser, then `mcp__linear-server__complete_authentication`, then re-list. A non-empty team list confirms the MCP is authed to a readable workspace.
@@ -137,7 +137,7 @@ echo "Linear key validated. Org: $(echo "$VIEWER" | jq -r '.data.organization.ur
137
137
  ### Step 2 — Resolve workspace slug + team key
138
138
 
139
139
  - **Workspace slug**: honor `--workspace=<slug>`. Otherwise derive from the validated identity — the GraphQL `organization.urlKey` (API path) or the team list's workspace (MCP path). Confirm with the user; this slug is the keychain `account` key and the multi-workspace disambiguator.
140
- - **Team key** (required when Linear is the **tracker**): honor `--team=<KEY>`. Otherwise enumerate teams via `mcp__linear-server__list_teams({})` (or the GraphQL `teams` query) and present them via `AskUserQuestion` (label = team key, description = team name) for the user to pick the team that owns lisa's destination Issues. If Linear is source-only, `teamKey` is optional — skip unless the user wants to pin a team scope.
140
+ - **Team key** (required when Linear is the **tracker**): honor `--team=<KEY>`. Otherwise enumerate teams via `lisa:linear-access operation: list-teams({})` (or the GraphQL `teams` query) and present them via `AskUserQuestion` (label = team key, description = team name) for the user to pick the team that owns lisa's destination Issues. If Linear is source-only, `teamKey` is optional — skip unless the user wants to pin a team scope.
141
141
 
142
142
  ### Step 3 — Scaffold the lifecycle label namespaces
143
143
 
@@ -154,7 +154,7 @@ read_role() { # $1=namespace (build|prd) $2=role $3=default
154
154
 
155
155
  #### 3a. Build-queue labels — ISSUE labels (only if Linear is the tracker)
156
156
 
157
- Probe with `mcp__linear-server__list_issue_labels` (scoped to the team). For each role's resolved name, create it via `mcp__linear-server__create_issue_label` only if absent. The `done` role is env-keyed — create all three defaults; collapse to a single string in config later if the project's terminal state is env-independent.
157
+ Probe with `lisa:linear-access operation: list-issue-labels` (scoped to the team). For each role's resolved name, create it via `lisa:linear-access operation: create-issue-label` only if absent. The `done` role is env-keyed — create all three defaults; collapse to a single string in config later if the project's terminal state is env-independent.
158
158
 
159
159
  | Role | Default |
160
160
  |------|---------|
@@ -168,7 +168,7 @@ Probe with `mcp__linear-server__list_issue_labels` (scoped to the team). For eac
168
168
 
169
169
  #### 3b. PRD-lifecycle labels — PROJECT labels (only if Linear is the PRD source)
170
170
 
171
- Probe with `mcp__linear-server__list_project_labels`. Create missing ones via `mcp__linear-server__create_project_label`. This probe-then-create is find-or-create per label: a label already present is reused untouched, so re-running never duplicates `prd-*`. These are a **separate label kind** from issue labels — creating an issue label of the same name will NOT work for the PRD flow.
171
+ Probe with `lisa:linear-access operation: list-project-labels`. Create missing ones via `lisa:linear-access operation: create-project-label`. This probe-then-create is find-or-create per label: a label already present is reused untouched, so re-running never duplicates `prd-*`. These are a **separate label kind** from issue labels — creating an issue label of the same name will NOT work for the PRD flow.
172
172
 
173
173
  `prd-verified` is the terminal lifecycle state after `prd-shipped` (the `verified` role from config-resolution, #591): `/lisa:verify-prd` transitions a Linear PRD project into it once the shipped product has been empirically verified against the PRD. Scaffold it through the same find-or-create path as every other `prd-*` row.
174
174
 
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: sonarcloud-access
3
+ description: "Vendor-neutral access layer for SonarCloud/SonarQube Cloud. Sonar triage skills MUST delegate through this skill rather than calling Sonar MCP tools or REST directly. Resolves Sonar MCP first when available, then falls back to SONAR_TOKEN + SonarCloud Web API."
4
+ allowed-tools: ["Bash", "Read", "Skill"]
5
+ ---
6
+
7
+ # SonarCloud Access: $ARGUMENTS
8
+
9
+ Single chokepoint for SonarCloud operations. Caller skills MUST NOT call
10
+ `mcp__sonarqube__*` tools directly or curl `https://sonarcloud.io/api/`
11
+ themselves.
12
+
13
+ ## Invocation Contract
14
+
15
+ ```text
16
+ operation: gate-status project_key:<KEY> [branch:<BRANCH>] [pull_request:<N>]
17
+ operation: issues project_key:<KEY> [branch:<BRANCH>] [pull_request:<N>] [types:<csv>] [severities:<csv>]
18
+ operation: hotspots project_key:<KEY> [branch:<BRANCH>] [pull_request:<N>]
19
+ operation: rule-detail key:<RULE_KEY>
20
+ operation: source-snippet component:<COMPONENT_KEY> from:<N> to:<N>
21
+ ```
22
+
23
+ Return parsed JSON in a `<result>` block.
24
+
25
+ ## Substrate Selection
26
+
27
+ Probe in order:
28
+
29
+ 1. Sonar MCP, if available and authenticated.
30
+ 2. `SONAR_TOKEN` against the SonarCloud Web API.
31
+
32
+ SonarCloud documents bearer-token authentication for the Web API. Use:
33
+
34
+ ```bash
35
+ sonar_api() {
36
+ local path="$1"
37
+ [ -n "$SONAR_TOKEN" ] || {
38
+ echo "Error: SONAR_TOKEN is not set." >&2
39
+ return 1
40
+ }
41
+ curl -sS "https://sonarcloud.io/api${path}" \
42
+ -H "Authorization: Bearer $SONAR_TOKEN"
43
+ }
44
+ ```
45
+
46
+ If a host still requires the legacy token-as-basic-auth form, make that an
47
+ explicit adapter branch in this skill; consumers do not choose auth style.
48
+
49
+ If neither tier works, fail with:
50
+
51
+ ```text
52
+ Error: no SonarCloud access substrate available. Authenticate the Sonar MCP or set SONAR_TOKEN.
53
+ ```
54
+
55
+ ## REST Dispatch
56
+
57
+ | Operation | REST path |
58
+ |---|---|
59
+ | `gate-status` | `/qualitygates/project_status?projectKey=<KEY>[&branch=<BRANCH>][&pullRequest=<N>]` |
60
+ | `issues` | `/issues/search?componentKeys=<KEY>[&branch=<BRANCH>][&pullRequest=<N>]...` |
61
+ | `hotspots` | `/hotspots/search?projectKey=<KEY>[&branch=<BRANCH>][&pullRequest=<N>]` |
62
+ | `rule-detail` | `/rules/show?key=<RULE_KEY>` |
63
+ | `source-snippet` | `/sources/lines?key=<COMPONENT_KEY>&from=<N>&to=<N>` |
64
+
65
+ ## Invariants
66
+
67
+ - Fallback is gated on `SONAR_TOKEN`.
68
+ - SonarCloud host access requires `sonarcloud.io` in any custom remote network
69
+ allowlist.
70
+ - Consumers ask for analysis data by operation name; this skill owns the Web API
71
+ path shape.
@@ -22,5 +22,5 @@ See the `config-resolution` rule for configuration and dispatch table.
22
22
 
23
23
  ## Rules
24
24
 
25
- - The journey content is identical across vendors; only the parser source differs (the JIRA vendor reads description via Atlassian MCP; the GitHub vendor reads body via `gh issue view --json body`; the Linear vendor reads description via `mcp__linear-server__get_issue`).
25
+ - The journey content is identical across vendors; only the parser source differs (the JIRA vendor reads description via Atlassian MCP; the GitHub vendor reads body via `gh issue view --json body`; the Linear vendor reads description via `lisa:linear-access operation: get-issue`).
26
26
  - Evidence posting always goes through `lisa:tracker-evidence` — never bypass.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: verify-prd
3
3
  description: "Initiative-level PRD acceptance gate. Given a PRD ref/URL (GitHub Issue, Linear project/issue, Notion page, Confluence page, or JIRA issue), resolves the source vendor, reads the PRD body and its generated top-level child work set via the prd-lifecycle-rollup contract (native hierarchy first, machine-readable generated-work section fallback — never reimplementing child enumeration), and confirms every required generated top-level work item is terminal before any verification runs. If any required top-level child is non-terminal, it reports the incomplete child set and STOPS without verifying or transitioning the PRD. When the guard passes, it runs spec-conformance against the original PRD requirements (via the spec-conformance skill) plus empirical verification appropriate to the shipped surface (via verification-lifecycle). On a CONFORMS verdict with all empirical checks passing it runs the PASS path: transitions the PRD shipped → verified and posts verification evidence. On a PARTIAL/DIVERGES conformance verdict or any failing empirical check it runs the self-healing FAIL path: it re-opens the PRD shipped → ticketed (NEVER blocked), creates build-ready fix tickets (via tracker-write with build_ready: true) for each missing/incorrect/divergent behavior — registered as the PRD's generated work — and posts a product-readable failure report (with a verification-round count) naming which requirements/ACs failed with observed-vs-expected evidence. The fix tickets auto-build, rollup re-ships the PRD once they are terminal, and a later intake cycle re-verifies — the loop closes itself and never auto-halts. Re-runs are idempotent: evidence/failure-report comments are regenerated in place via a stable sentinel marker (never appended, round incremented), fix tickets are deduped by a stable PRD-ref + requirement marker (referenced/updated, never duplicated), and the lifecycle transition is a no-op when the PRD already carries the target role (exactly one lifecycle label/status remains) — per the prd-lifecycle-rollup idempotency dedupe key (match by stable ref, never by title)."
4
- allowed-tools: ["Skill", "Bash", "Read", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__linear-server__get_project", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_documents", "mcp__linear-server__get_document"]
4
+ allowed-tools: ["Skill", "Bash", "Read", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
5
5
  ---
6
6
 
7
7
  # PRD-level Verification: $ARGUMENTS
@@ -38,7 +38,7 @@ Detect the vendor from `$ARGUMENTS` the same way `prd-ticket-coverage` / `prd-ba
38
38
  | Input shape | Vendor | Read surface |
39
39
  |---|---|---|
40
40
  | `github.com/<org>/<repo>/issues/<n>` or `<org>/<repo>#<n>` | **GitHub Issues** | `gh` CLI (Lisa uses the CLI exclusively for GitHub — no GitHub MCP) |
41
- | `linear.app/...` | **Linear** | `mcp__linear-server__get_project` / `get_issue` |
41
+ | `linear.app/...` | **Linear** | `lisa:linear-access operation: get-project` / `lisa:linear-access operation: get-issue` |
42
42
  | `notion.so` / `notion.site` | **Notion** | `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) |
43
43
  | `*.atlassian.net/wiki/...` | **Confluence** | `mcp__atlassian__getConfluencePage` (+ descendants) |
44
44
  | JIRA issue key (e.g. `PROJ-123`) or `*.atlassian.net/browse/...` | **JIRA** | `mcp__atlassian__getJiraIssue` |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.176.12",
3
+ "version": "2.178.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.176.12",
3
+ "version": "2.178.0",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.176.12",
3
+ "version": "2.178.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.176.12",
3
+ "version": "2.178.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.176.12",
3
+ "version": "2.178.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.176.12",
3
+ "version": "2.178.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -51,9 +51,9 @@ Resolve build labels from `.lisa.config.json` `linear.labels.build.*` (defaults:
51
51
 
52
52
  If `linear-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the creator:
53
53
  1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing section — Technical Approach, Out of Scope, Gherkin acceptance criteria, expected-vs-actual, Repository, Relationship Search (run the git + Linear search, don't fabricate it), a Validation Journey **draft** via `linear-add-journey`, and a recommended Target Backend Environment — from the item's own content (title, description, screenshots, design links, repro steps) plus the codebase. Write it into the description via `linear-write-issue` as clearly-labeled assumptions/recommendations (never overwrite the creator's prose), then re-run `linear-verify`. Whatever the agent could author is now structured spec; only genuinely human-only inputs remain.
54
- 2. Update labels via `mcp__linear-server__save_issue`: remove the current build label, add the configured `blocked` label **and** the configured `human_needed` marker label. (Create either label via `create_issue_label` if needed.) Even after the agent drafted what it could, a pre-flight gate failure bounces the item back to its creator because it still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision — so the marker tells a human scanning the board which blocked items are waiting on them. The marker is additive to `blocked`, not a replacement. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
54
+ 2. Update labels via `lisa:linear-access operation: save-issue`: remove the current build label, add the configured `blocked` label **and** the configured `human_needed` marker label. (Create either label via `create_issue_label` if needed.) Even after the agent drafted what it could, a pre-flight gate failure bounces the item back to its creator because it still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision — so the marker tells a human scanning the board which blocked items are waiting on them. The marker is additive to `blocked`, not a replacement. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
55
55
  3. Reassign the item to the **Issue creator** (the human who filed it — Linear's `creator` field).
56
- 4. Post the **confirmation comment** from the `pre-flight-autofill` rule via `mcp__linear-server__save_comment`, **not** a bare remediation checklist: disclose it is a Claude draft, give one line per drafted section naming the key assumption made, list any remaining human-only item as a specific question with a recommended default, and close with *"review the drafted sections, correct anything wrong, then flip back to Ready and it builds — or reply with corrections."* Prefix with `[{repo}]`.
56
+ 4. Post the **confirmation comment** from the `pre-flight-autofill` rule via `lisa:linear-access operation: save-comment`, **not** a bare remediation checklist: disclose it is a Claude draft, give one line per drafted section naming the key assumption made, list any remaining human-only item as a specific question with a recommended default, and close with *"review the drafted sections, correct anything wrong, then flip back to Ready and it builds — or reply with corrections."* Prefix with `[{repo}]`.
57
57
  5. Stop. Do not run triage, do not delegate to a flow, do not start work.
58
58
 
59
59
  **Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the creator: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this item to one repo, create a sibling Issue per additional repo cloning its metadata (same `projectId`), add the producer→consumer blocking relation, comment on the original, then re-run `linear-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting item passes.
@@ -130,6 +130,6 @@ The label transitions ARE the canonical signal. The native `state` field stays a
130
130
 
131
131
  - Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the description as labeled assumptions), then update labels to the configured `blocked` label, add the configured `human_needed` marker label (`linear.labels.build.human_needed`, default `human-needed`), and reassign to the creator with a confirmation comment. Every other status change remains a label-driven suggestion.
132
132
  - Always read the full item graph via `linear-read-issue` before determining intent — don't rely on type labels alone.
133
- - Never create or materially edit an item by calling MCP write tools directly — always delegate to `linear-write-issue` so relationships, Gherkin criteria, and metadata gates are enforced. Two explicit exceptions are permitted: (1) the Step 2 pre-flight failure path (when `linear-verify` returns `FAIL`) may call `mcp__linear-server__save_issue` and `mcp__linear-server__save_comment` directly to set `status:blocked`, add the configured `human_needed` marker label, and reassign to the creator — this narrow exception is already granted by the rule above; (2) the Step 3 triage path may call `mcp__linear-server__save_comment` to post triage findings and `mcp__linear-server__save_issue` to add the `claude-triaged-{repo}` label — these are lightweight metadata updates that do not create or materially edit ticket content and therefore do not need to route through `linear-write-issue`.
133
+ - Never create or materially edit an item by calling MCP write tools directly — always delegate to `linear-write-issue` so relationships, Gherkin criteria, and metadata gates are enforced. Two explicit exceptions are permitted: (1) the Step 2 pre-flight failure path (when `linear-verify` returns `FAIL`) may call `lisa:linear-access operation: save-issue` and `lisa:linear-access operation: save-comment` directly to set `status:blocked`, add the configured `human_needed` marker label, and reassign to the creator — this narrow exception is already granted by the rule above; (2) the Step 3 triage path may call `lisa:linear-access operation: save-comment` to post triage findings and `lisa:linear-access operation: save-issue` to add the `claude-triaged-{repo}` label — these are lightweight metadata updates that do not create or materially edit ticket content and therefore do not need to route through `linear-write-issue`.
134
134
  - If sign-in credentials are in the item, extract and pass them to the flow. If the item touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
135
135
  - If the item has a Validation Journey section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the description.
@@ -0,0 +1,10 @@
1
+ # Integration Access Layer
2
+
3
+ Skills and rules that use external integrations route through the matching
4
+ `*-access` skill. Do not call vendor MCP tools or REST APIs directly from a
5
+ consumer skill.
6
+
7
+ Resolution order is MCP when available and authenticated, then documented
8
+ token/REST substrate when the env var is set, then a loud error naming the env
9
+ var. Full matrix and migration rules:
10
+ [reference/integration-access-layer.md](../reference/integration-access-layer.md).