@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-prd-intake
3
3
  description: "Scans a Linear workspace (or a specific team) for projects carrying the configured `ready` PRD label and runs the first eligible one through the dry-run validation pipeline. A project that passes every gate gets tickets written and the label flipped to the configured `ticketed` label; a project that fails gets clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to the configured `blocked` label. 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
- 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"]
4
+ allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
7
7
  # Linear PRD Intake: $ARGUMENTS
@@ -96,13 +96,13 @@ If the project does not yet use these labels, this skill cannot run. Adopting th
96
96
  - Bare team key → use as-is; the scope is that team.
97
97
  - The literal `linear` → fall back to `linear.workspace` from `.lisa.config.json`; error if not set.
98
98
  2. Verify the scope is reachable:
99
- - 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).
100
- - For a team: call `mcp__linear-server__list_teams({query: <KEY>})` and confirm the team resolves.
101
- 3. Resolve the project-label IDs for `$READY`, `$IN_REVIEW`, `$BLOCKED`, `$TICKETED` via `mcp__linear-server__list_project_labels`. Cache them — every transition uses these IDs. If any of the four are missing, surface a label-convention error and exit (see "Adoption").
99
+ - For a workspace: call `lisa:linear-access operation: list-teams` and confirm at least one team is returned (non-empty workspaces are readable; empty results indicate auth or workspace-mismatch).
100
+ - For a team: call `lisa:linear-access operation: list-teams({query: <KEY>})` and confirm the team resolves.
101
+ 3. Resolve the project-label IDs for `$READY`, `$IN_REVIEW`, `$BLOCKED`, `$TICKETED` via `lisa:linear-access operation: list-project-labels`. Cache them — every transition uses these IDs. If any of the four are missing, surface a label-convention error and exit (see "Adoption").
102
102
 
103
103
  ### Phase 2 — Find ready PRDs
104
104
 
105
- Call `mcp__linear-server__list_projects({label: "$READY", ...scope-filter})`:
105
+ Call `lisa:linear-access operation: list-projects({label: "$READY", ...scope-filter})`:
106
106
 
107
107
  - For a workspace scope: pass `label: "$READY"` only.
108
108
  - For a team scope: pass `label: "$READY"` AND `team: "<KEY>"`.
@@ -123,7 +123,7 @@ Select the first ready project returned by Phase 2 and process only that project
123
123
 
124
124
  #### 3a. Claim
125
125
 
126
- Transition labels via `mcp__linear-server__save_project({id, labels})`: pass the full new label set with `$READY` removed and `$IN_REVIEW` added. This is the idempotency lock — a re-entrant cycle running concurrently won't see this project because its query filters on `label: "$READY"`.
126
+ Transition labels via `lisa:linear-access operation: save-project({id, labels})`: pass the full new label set with `$READY` removed and `$IN_REVIEW` added. This is the idempotency lock — a re-entrant cycle running concurrently won't see this project because its query filters on `label: "$READY"`.
127
127
 
128
128
  If the update fails (permission error, race condition), log it and skip this project. Do not proceed to validation on a project you didn't successfully claim.
129
129
 
@@ -145,7 +145,7 @@ This call also indirectly invokes `lisa:tracker-source-artifacts` (artifact extr
145
145
 
146
146
  1. Re-invoke `lisa:linear-to-tracker` with `dry_run: false` to actually write the tickets. This re-runs Phases 1-5 and runs the preservation gate (Phase 5.5).
147
147
  2. Capture the created ticket keys from the skill's output.
148
- 3. Ensure the project has a sentinel feedback issue (see "Sentinel feedback issue" below for the helper). Post a comment on it via `mcp__linear-server__save_comment` listing the created tickets (epic, stories, sub-tasks) with their JIRA URLs. Lead with: `"Ticketed by Claude. Created N JIRA issues — see below. Add the $SHIPPED label to the Linear project after the work is delivered."`
148
+ 3. Ensure the project has a sentinel feedback issue (see "Sentinel feedback issue" below for the helper). Post a comment on it via `lisa:linear-access operation: save-comment` listing the created tickets (epic, stories, sub-tasks) with their JIRA URLs. Lead with: `"Ticketed by Claude. Created N JIRA issues — see below. Add the $SHIPPED label to the Linear project after the work is delivered."`
149
149
  4. Transition labels: remove `$IN_REVIEW`, add `$TICKETED` via `save_project`.
150
150
  5. **Run Phase 3e (coverage audit)** before considering this PRD done.
151
151
 
@@ -160,7 +160,7 @@ The audience for these comments is the **product team**, not engineers. They are
160
160
 
161
161
  ##### 3c.2 Render each comment
162
162
 
163
- Ensure the project has a sentinel feedback issue (see helper below). For each anchored group (`prd_anchor` is a sub-issue identifier), post a comment on THAT sub-issue via `mcp__linear-server__save_comment({issueId: <prd_anchor>, body: <template>})`. For the unanchored group, post a single comment on the sentinel feedback issue using the same template, prefixed with `Issues without a specific sub-issue anchor:` and one block per failure.
163
+ Ensure the project has a sentinel feedback issue (see helper below). For each anchored group (`prd_anchor` is a sub-issue identifier), post a comment on THAT sub-issue via `lisa:linear-access operation: save-comment({issueId: <prd_anchor>, body: <template>})`. For the unanchored group, post a single comment on the sentinel feedback issue using the same template, prefixed with `Issues without a specific sub-issue anchor:` and one block per failure.
164
164
 
165
165
  If `save_comment` fails for a specific anchored sub-issue (the issue was deleted between fetch and post, or the agent lacks comment permission), fall back to the sentinel feedback issue for that group. Do not silently drop the failure.
166
166
 
@@ -246,7 +246,7 @@ Rollup is keyed by the PRD's current state. If the PRD project already carries `
246
246
 
247
247
  Read the PRD's **generated top-level work** — its created Epics and any top-level Stories created directly under it, **excluding** leaf Sub-tasks and any Story nested under a generated Epic (`prd-lifecycle-rollup` rule, generated-top-level-work contract). Use two sources, native first:
248
248
 
249
- 1. **Native parent / project relationships (primary).** Linear records the PRD→child relationship natively where the PRD also lives in Linear: a generated top-level Issue uses `parentId`, or a generated Project groups the generated Issues. Read the PRD project's generated top-level Issues via `mcp__linear-server__list_issues({project: <id>})` and take the **top-level** ones (no `parentId`, or whose parent is the PRD itself) — those are the PRD's direct children. Fetch each with `mcp__linear-server__get_issue` for its workflow state.
249
+ 1. **Native parent / project relationships (primary).** Linear records the PRD→child relationship natively where the PRD also lives in Linear: a generated top-level Issue uses `parentId`, or a generated Project groups the generated Issues. Read the PRD project's generated top-level Issues via `lisa:linear-access operation: list-issues({project: <id>})` and take the **top-level** ones (no `parentId`, or whose parent is the PRD itself) — those are the PRD's direct children. Fetch each with `lisa:linear-access operation: get-issue` for its workflow state.
250
250
 
251
251
  2. **Documented `## Tickets` section (fallback).** When the native relationship is unavailable (the destination tracker is a *different* system — e.g. Linear PRD → JIRA tracker — so the children were never linked as Linear issues), parse the machine-readable generated-work section `lisa:prd-backlink` writes to the PRD (`## Tickets`, alias `## Generated Work`; see #582). Top-level children are the `### <Epic key>: <title>` group headers' first line (`- [<ref>](<url>) — Epic`) plus any top-level Story listed directly under `### Unparented items`. Lines nested deeper (` - ... — Story:` under an Epic, ` - ... — Sub-task:`) are descendants, NOT top-level children — skip them.
252
252
 
@@ -266,7 +266,7 @@ The set of **required** children for the all-terminal check is the top-level chi
266
266
 
267
267
  **All required children terminal** (every required top-level child is terminal; at least one required child exists):
268
268
 
269
- 1. Transition labels: remove `$TICKETED`, add `$SHIPPED` via `mcp__linear-server__save_project({id, labels})`. Verify exactly one lifecycle label remains (the single-label invariant).
269
+ 1. Transition labels: remove `$TICKETED`, add `$SHIPPED` via `lisa:linear-access operation: save-project({id, labels})`. Verify exactly one lifecycle label remains (the single-label invariant).
270
270
  2. Leave the PRD active for `/lisa:verify-prd`; do not archive at the shipped hop.
271
271
  3. Post a short rollup comment on the sentinel feedback issue naming the terminal child set and (when dropped children exist) the dropped set, so the audit trail records *why* the PRD shipped. Lead with `"Shipped by Claude — all generated top-level work is complete."`
272
272
 
@@ -283,7 +283,7 @@ This phase implements exactly one PRD-lifecycle hop — `$TICKETED → $SHIPPED`
283
283
 
284
284
  `shipped` and `verified` are distinct facts about a PRD (see the `prd-lifecycle-rollup` rule's "PRD-level verification vs ticket verification" and "Closing the loop" sections). Rollup (3f) only reaches `$SHIPPED`; the `shipped → verified` (pass) / `shipped → ticketed` (fail) hops are owned by `/lisa:verify-prd`. This phase **closes that loop** by dispatching the initiative-level acceptance gate for shipped PRDs. It never performs the verification transition itself — the "never sets the verification outcome" invariant holds: `lisa:verify-prd`, not this skill, sets `verified` (or, on failure, re-opens the PRD to `ticketed`).
285
285
 
286
- Re-query the projects currently carrying the `$SHIPPED` label via `mcp__linear-server__list_projects` (filtered by the `$SHIPPED` project label, **including archived projects** — so shipped PRDs remain active for `lisa:verify-prd`). Pick the **first** one and invoke `lisa:verify-prd <project-url>`. Process **one shipped PRD per cycle** — `lisa:verify-prd` is a heavy full flow (spec-conformance + empirical verification + fix-issue creation), so it is bounded exactly like the single-ready-PRD claim in Phase 3; the scheduler drains the rest.
286
+ Re-query the projects currently carrying the `$SHIPPED` label via `lisa:linear-access operation: list-projects` (filtered by the `$SHIPPED` project label, **including archived projects** — so shipped PRDs remain active for `lisa:verify-prd`). Pick the **first** one and invoke `lisa:verify-prd <project-url>`. Process **one shipped PRD per cycle** — `lisa:verify-prd` is a heavy full flow (spec-conformance + empirical verification + fix-issue creation), so it is bounded exactly like the single-ready-PRD claim in Phase 3; the scheduler drains the rest.
287
287
 
288
288
  **Per-cycle combined bound:** each scheduler cycle dispatches at most one ready PRD (the Phase 3 single-ready-PRD claim) **and** at most one shipped PRD for verification (this Phase 3g dispatch), for a maximum of two PRD operations per cycle. Ready intake runs first (Phase 3), then shipped verify (Phase 3g).
289
289
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-read-issue
3
3
  description: "Fetches the full scope of a Linear work item — Issue or Project — including metadata, description, acceptance criteria, all comments, attachments, native relations (blocks/blocked_by/relates_to/duplicates), Project parent (if any) with siblings, and sub-Issues. Produces a consolidated context bundle that downstream agents consume so they never act on a single item in isolation."
4
- allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__get_project", "mcp__linear-server__list_issues", "mcp__linear-server__list_comments", "mcp__linear-server__list_documents", "mcp__linear-server__get_document"]
4
+ allowed-tools: ["Bash", "Skill"]
5
5
  ---
6
6
 
7
7
  # Read Linear Work Item: $ARGUMENTS
@@ -21,13 +21,13 @@ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.loca
21
21
  1. If `$ARGUMENTS` matches `<TEAM>-<n>` → Issue mode.
22
22
  2. If `$ARGUMENTS` is a URL containing `/project/<slug>-<short-id>` → Project mode (extract `<short-id>`).
23
23
  3. Otherwise stop and report. Do NOT guess.
24
- 4. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})`.
24
+ 4. Resolve team ID via `lisa:linear-access operation: list-teams({query: <teamKey>})`.
25
25
 
26
26
  ## Phase 2 — Fetch Primary Item
27
27
 
28
28
  ### Issue mode
29
29
 
30
- Call `mcp__linear-server__get_issue`. Extract and preserve:
30
+ Call `lisa:linear-access operation: get-issue`. Extract and preserve:
31
31
 
32
32
  **Metadata**
33
33
  - Identifier, title, issue type (typically a label or workflow state), state, priority (0–4)
@@ -43,13 +43,13 @@ Call `mcp__linear-server__get_issue`. Extract and preserve:
43
43
  - Attachment URLs (capture, do not download unless needed)
44
44
 
45
45
  **Comments**
46
- Fetch ALL comments via `mcp__linear-server__list_comments({issueId: <id>})` in chronological order. Walk thread parents/children — Linear comments are threaded via `parentId`. Do not truncate. For each comment:
46
+ Fetch ALL comments via `lisa:linear-access operation: list-comments({issueId: <id>})` in chronological order. Walk thread parents/children — Linear comments are threaded via `parentId`. Do not truncate. For each comment:
47
47
  - Author, timestamp, body
48
48
  - Flag comments that contain: credentials, reproduction steps, status updates from stakeholders, decisions, or triage headers.
49
49
 
50
50
  ### Project mode
51
51
 
52
- Call `mcp__linear-server__get_project` with `includeMilestones: true`, `includeResources: true`. Extract:
52
+ Call `lisa:linear-access operation: get-project` with `includeMilestones: true`, `includeResources: true`. Extract:
53
53
 
54
54
  **Metadata**
55
55
  - ID, slug, name, state, priority, lead, color
@@ -58,10 +58,10 @@ Call `mcp__linear-server__get_project` with `includeMilestones: true`, `includeR
58
58
 
59
59
  **Body**
60
60
  - Description (markdown)
61
- - Attached documents — call `mcp__linear-server__list_documents({projectId})` then `get_document` per result. Treat each as additional spec content.
61
+ - Attached documents — call `lisa:linear-access operation: list-documents({projectId})` then `lisa:linear-access operation: get-document` per result. Treat each as additional spec content.
62
62
 
63
63
  **Member Issues**
64
- - Call `mcp__linear-server__list_issues({project: <id>})` to enumerate the Project's Issues. Capture identifier, title, state, parent Issue (for sub-Issue tree).
64
+ - Call `lisa:linear-access operation: list-issues({project: <id>})` to enumerate the Project's Issues. Capture identifier, title, state, parent Issue (for sub-Issue tree).
65
65
 
66
66
  ## Phase 3 — Fetch Attachments / Remote Links
67
67
 
@@ -81,7 +81,7 @@ Linear native Issue relations are returned in the `get_issue` response under `re
81
81
  - `relates_to`
82
82
  - `duplicates` / `duplicated_by`
83
83
 
84
- For each related Issue, call `mcp__linear-server__get_issue` and capture:
84
+ For each related Issue, call `lisa:linear-access operation: get-issue` and capture:
85
85
  - Identifier, title, state, priority, assignee
86
86
  - Description (full, unless cancelled — then summary only)
87
87
  - Acceptance Criteria section
@@ -96,9 +96,9 @@ For Project-level relationships (Project ↔ Project), Linear doesn't model nati
96
96
 
97
97
  If the primary Item is an Issue with a Project parent:
98
98
 
99
- 1. Fetch the Project via `mcp__linear-server__get_project` — full description, milestones, labels, lead.
99
+ 1. Fetch the Project via `lisa:linear-access operation: get-project` — full description, milestones, labels, lead.
100
100
  2. Fetch Project documents (Phase 2 procedure).
101
- 3. Find Project siblings via `mcp__linear-server__list_issues({project: <projectId>})` excluding the primary identifier.
101
+ 3. Find Project siblings via `lisa:linear-access operation: list-issues({project: <projectId>})` excluding the primary identifier.
102
102
  4. For each sibling, capture: identifier, title, state, priority, assignee, summary (first paragraph of description).
103
103
  5. If a sibling is `Started` or `In Review` with a different assignee, flag it prominently.
104
104
 
@@ -106,7 +106,7 @@ If the primary Item IS a Project, Phase 5 is the same as fetching all member Iss
106
106
 
107
107
  ## Phase 6 — Fetch Sub-Issues
108
108
 
109
- If the primary Issue has children (sub-Issues), fetch each via `mcp__linear-server__get_issue`: identifier, title, state, assignee, description (first paragraph), Acceptance Criteria.
109
+ If the primary Issue has children (sub-Issues), fetch each via `lisa:linear-access operation: get-issue`: identifier, title, state, assignee, description (first paragraph), Acceptance Criteria.
110
110
 
111
111
  ## Phase 7 — Assemble Context Bundle
112
112
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-sync
3
3
  description: "Syncs plan progress to a linked Linear Issue. Posts plan contents, progress updates, branch links, and PR links at key milestones. Use this skill throughout the plan lifecycle to keep Linear Issues in sync. The Linear counterpart of lisa:jira-sync and lisa:github-sync."
4
- allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__list_issues", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__save_issue"]
4
+ allowed-tools: ["Bash", "Skill"]
5
5
  ---
6
6
 
7
7
  # Sync Plan to Linear: $ARGUMENTS
@@ -37,7 +37,7 @@ This skill **suggests** transitions but does not auto-transition the native Line
37
37
 
38
38
  1. If `$ARGUMENTS` includes an identifier, parse it.
39
39
  2. Else search for the active plan file (most recent file under `plans/`) and extract the linked Linear Issue identifier from its frontmatter.
40
- 3. Fetch the Issue via `mcp__linear-server__get_issue` to confirm it exists.
40
+ 3. Fetch the Issue via `lisa:linear-access operation: get-issue` to confirm it exists.
41
41
 
42
42
  ## Phase 2 — Compose Milestone Comment
43
43
 
@@ -65,7 +65,7 @@ Next: implementation begins. Suggested status: **Todo** (label: `status:ready`).
65
65
 
66
66
  ## Phase 3 — Post Comment
67
67
 
68
- Call `mcp__linear-server__save_comment({issueId: <id>, body: <comment>})`.
68
+ Call `lisa:linear-access operation: save-comment({issueId: <id>, body: <comment>})`.
69
69
 
70
70
  ## Phase 3b — Ensure PR Backlink
71
71
 
@@ -79,14 +79,14 @@ The PR branch/title/body identifier is the PR -> Linear side. This phase is the
79
79
 
80
80
  ## Phase 4 — Update Status Label (when caller requests)
81
81
 
82
- If the caller passes `--update-label`, update the `status:*` label set via `mcp__linear-server__save_issue`:
82
+ If the caller passes `--update-label`, update the `status:*` label set via `lisa:linear-access operation: save-issue`:
83
83
 
84
84
  - `plan-created` → add `status:ready`
85
85
  - `implementation-in-progress` → remove `status:ready`, add `status:in-progress`
86
86
  - `pr-ready` → remove `status:in-progress`, add `status:code-review`
87
87
  - `pr-merged` → remove `status:code-review`, add `status:done`
88
88
 
89
- If the requested label doesn't exist on the team, create it via `mcp__linear-server__create_issue_label`.
89
+ If the requested label doesn't exist on the team, create it via `lisa:linear-access operation: create-issue-label`.
90
90
 
91
91
  Verify exactly one `status:*` label remains after the update — having two simultaneously breaks the build-queue invariant.
92
92
 
@@ -96,7 +96,7 @@ Without `--update-label`, this skill posts the comment only and does NOT touch l
96
96
 
97
97
  When the caller passes `--rollup`, this skill **derives a parent/container's `status:*` label from the roll-up of its children** instead of acting on a leaf. A **Project** (the Epic equivalent) rolls up from its Issues; an **Issue** rolls up from its sub-Issues. This implements the Linear child-issue-status arm of the **Parent status rollup (the state machine)** section of the `leaf-only-lifecycle` rule — cite that rule, do not restate the policy.
98
98
 
99
- **Resolve the child set the same way `lisa:linear-read-issue` does** — `mcp__linear-server__list_issues({project: <id>})` for a Project's Issues, or `mcp__linear-server__get_issue` per child for an Issue's sub-Issues (via `parentId`). Capture each child's `status:*` label. If the item has **no** children it is a leaf — rollup is N/A; behave as a normal milestone sync.
99
+ **Resolve the child set the same way `lisa:linear-read-issue` does** — `lisa:linear-access operation: list-issues({project: <id>})` for a Project's Issues, or `lisa:linear-access operation: get-issue` per child for an Issue's sub-Issues (via `parentId`). Capture each child's `status:*` label. If the item has **no** children it is a leaf — rollup is N/A; behave as a normal milestone sync.
100
100
 
101
101
  **Evaluate the required children over the env ladder `in-progress < dev < staging < production` (the ordered keys of the Linear env-keyed `done` map, e.g. `status:on-dev < status:on-stg < status:done`) and take the first match** (canonical roles from `config-resolution`; Linear label map is `status:blocked`, `status:in-progress`, `status:code-review`, env-keyed `done`):
102
102
 
@@ -115,7 +115,7 @@ When the caller passes `--rollup`, this skill **derives a parent/container's `st
115
115
 
116
116
  **Single-environment collapse (this repo).** The env rungs resolve via the env-keyed `done` logic in `config-resolution`. In this repo `deploy.branches` declares only `production: main`, so `done` collapses to the single `status:done` label, the only env rung is production, and the lifecycle is `status:ready → status:in-progress → status:code-review → status:done` with **no** dev/staging promotion hops; the rollup never resolves a dev or staging `done`. Multi-environment projects keep the env-keyed map and roll a parent up to intermediate env labels (`status:on-dev`/`status:on-stg`).
117
117
 
118
- **Apply the derived label** via `mcp__linear-server__save_issue` (Project or Issue), removing the parent's existing `status:*` and adding the derived one so exactly one `status:*` label remains. Post an idempotent rollup comment naming the derived state and the child tally. The native Linear `state` is **not** auto-transitioned — only the `status:*` label, mirroring the `--update-label` rule. **Safe default:** if the derived terminal cannot be resolved (ambiguous required-set or unresolvable env `done`), do not guess — post the derived suggestion as a comment and leave the parent's label untouched.
118
+ **Apply the derived label** via `lisa:linear-access operation: save-issue` (Project or Issue), removing the parent's existing `status:*` and adding the derived one so exactly one `status:*` label remains. Post an idempotent rollup comment naming the derived state and the child tally. The native Linear `state` is **not** auto-transitioned — only the `status:*` label, mirroring the `--update-label` rule. **Safe default:** if the derived terminal cannot be resolved (ambiguous required-set or unresolvable env `done`), do not guess — post the derived suggestion as a comment and leave the parent's label untouched.
119
119
 
120
120
  ## Rules
121
121
 
@@ -6,7 +6,7 @@ description: >
6
6
  "break down this Linear project", "create tickets from a Linear project", "turn this Linear PRD into tickets", or similar. This skill mirrors `lisa:notion-to-tracker` and `lisa:confluence-to-tracker` for projects
7
7
  whose PRDs live in Linear — the workflow, gates, dry-run mode, and validation rules are identical;
8
8
  only the source-of-truth tool surface differs (Linear MCP instead of Notion / Confluence MCP).
9
- allowed-tools: ["Skill", "Bash", "mcp__linear-server__get_project", "mcp__linear-server__list_projects", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_comments", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_teams"]
9
+ allowed-tools: ["Skill", "Bash"]
10
10
  ---
11
11
 
12
12
  # Linear PRD to Tracker Breakdown
@@ -21,8 +21,8 @@ This skill is the Linear counterpart of `lisa:notion-to-tracker` and `lisa:confl
21
21
  Linear has no native "PRD" entity. This skill treats a **Linear Project** as the PRD container:
22
22
 
23
23
  - **Project description** (markdown) is the PRD body — equivalent to a Notion page body or a Confluence page body.
24
- - **Project documents** (Linear's long-form markdown docs attached to projects, fetched via `list_documents({projectId})` / `get_document`) are treated as additional spec content and merged into the analysis. A multi-document Linear PRD is the analog of a multi-page Confluence PRD.
25
- - **Project sub-issues** (`list_issues({project})`) act as the candidate set for epics and user stories — the same role child Epic pages play in a Notion/Confluence PRD.
24
+ - **Project documents** (Linear's long-form markdown docs attached to projects, fetched via `list-documents({projectId})` / `get-document`) are treated as additional spec content and merged into the analysis. A multi-document Linear PRD is the analog of a multi-page Confluence PRD.
25
+ - **Project sub-issues** (`list-issues({project})`) act as the candidate set for epics and user stories — the same role child Epic pages play in a Notion/Confluence PRD.
26
26
  - **Linear comments live on Issues, not on Projects.** This skill aggregates comments from every issue under the project to capture decisions and engineering notes. Project-level discussion that isn't reflected on an issue is invisible to this skill.
27
27
 
28
28
  ## Modes
@@ -127,10 +127,10 @@ If env vars are not available, ask the user to provide them explicitly before pr
127
127
 
128
128
  ### Phase 1: Fetch & Analyze the PRD
129
129
 
130
- 1. **Resolve the project** via `mcp__linear-server__get_project` with the slug or ID, including milestones and resources (`includeMilestones: true`, `includeResources: true`). Capture the project title, description, state, labels, lead, dates, attached documents, attached links.
131
- 2. **Fetch attached Linear documents** via `mcp__linear-server__list_documents({projectId})` then `get_document` per result. Treat each as additional PRD content. (A Linear PRD with a single rich project description and no attached documents is the common case; multi-document PRDs are valid too.)
132
- 3. **Identify candidate epics and user stories** from project sub-issues via `mcp__linear-server__list_issues({project: <id>})`. Capture identifier, title, description, labels, state, parent issue, and `parentId` chain so the issue hierarchy is reproducible.
133
- 4. **Fetch full comments per sub-issue** via `mcp__linear-server__list_comments({issueId})` for every issue surfaced in step 3. Walk thread parents/children — comments are threaded via `parentId` references on the comment object.
130
+ 1. **Resolve the project** via `lisa:linear-access operation: get-project` with the slug or ID, including milestones and resources (`includeMilestones: true`, `includeResources: true`). Capture the project title, description, state, labels, lead, dates, attached documents, attached links.
131
+ 2. **Fetch attached Linear documents** via `lisa:linear-access operation: list-documents({projectId})` then `lisa:linear-access operation: get-document` per result. Treat each as additional PRD content. (A Linear PRD with a single rich project description and no attached documents is the common case; multi-document PRDs are valid too.)
132
+ 3. **Identify candidate epics and user stories** from project sub-issues via `lisa:linear-access operation: list-issues({project: <id>})`. Capture identifier, title, description, labels, state, parent issue, and `parentId` chain so the issue hierarchy is reproducible.
133
+ 4. **Fetch full comments per sub-issue** via `lisa:linear-access operation: list-comments({issueId})` for every issue surfaced in step 3. Walk thread parents/children — comments are threaded via `parentId` references on the comment object.
134
134
  5. **Synthesize decisions and blockers** from the project description + every document + every issue comment:
135
135
  - Decisions already confirmed by the team (look for agreement in comment threads)
136
136
  - Open questions that need product/engineering input
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-validate-issue
3
3
  description: "Validates a proposed Linear work item spec (Project, Issue, or sub-Issue) — or an existing Linear item — against the organizational quality gates without writing anything. Returns a structured PASS/FAIL report per gate with concrete remediation. Single source of truth for what makes a valid Linear item — both the write path (linear-write-issue runs it pre-write) and the dry-run path (linear-to-tracker runs it during PRD intake) call this skill so the bar can never drift."
4
- allowed-tools: ["Bash", "mcp__linear-server__list_teams", "mcp__linear-server__get_team", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_issue_labels", "mcp__linear-server__list_project_labels"]
4
+ allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
7
7
  # Validate Linear Work Item: $ARGUMENTS
@@ -65,7 +65,7 @@ build_ready: true # caller asserts the build-ready role (status:
65
65
  child_refs: ["ENG-601", "ENG-602"] # known child work (sub-issues / project-member issues / blocked_by parentage) — see S15
66
66
  ```
67
67
 
68
- If the caller passes only an identifier, fetch the item via `mcp__linear-server__get_issue` (Issue) or `mcp__linear-server__get_project` (Project), derive the same fields from the fetched data — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa:linear-read-issue`) so S15 can classify the item — then run gates.
68
+ If the caller passes only an identifier, fetch the item via `lisa:linear-access operation: get-issue` (Issue) or `lisa:linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa:linear-read-issue`) so S15 can classify the item — then run gates.
69
69
 
70
70
  ## Gates
71
71
 
@@ -235,28 +235,28 @@ Remediation: `"Build-ready (status:ready) is leaf-only per leaf-only-lifecycle.
235
235
 
236
236
  #### F1 — Issue type valid in team
237
237
 
238
- For Issue types: confirm the team supports the issue type via `mcp__linear-server__get_team`. Linear issue types are typically per-team; check that the requested type exists.
238
+ For Issue types: confirm the team supports the issue type via `lisa:linear-access operation: get-team`. Linear issue types are typically per-team; check that the requested type exists.
239
239
 
240
240
  For Epic (Project): confirm the team allows projects.
241
241
 
242
242
  #### F2 — Project parent exists and is in same team
243
243
 
244
- When `parent_project_id` is set: fetch via `mcp__linear-server__get_project`, confirm it exists and belongs to the configured team.
244
+ When `parent_project_id` is set: fetch via `lisa:linear-access operation: get-project`, confirm it exists and belongs to the configured team.
245
245
 
246
- When `parent_issue_id` is set (Sub-task case): fetch via `mcp__linear-server__get_issue`, confirm the issue is non-Sub-task and in the same team / project.
246
+ When `parent_issue_id` is set (Sub-task case): fetch via `lisa:linear-access operation: get-issue`, confirm the issue is non-Sub-task and in the same team / project.
247
247
 
248
248
  #### F3 — Linked items exist
249
249
 
250
- For each entry in `relations`, call `mcp__linear-server__get_issue` to confirm the identifier resolves. Flag broken identifiers.
250
+ For each entry in `relations`, call `lisa:linear-access operation: get-issue` to confirm the identifier resolves. Flag broken identifiers.
251
251
 
252
252
  #### F4 — Required labels exist (or can be created)
253
253
 
254
- For each label referenced (`status:*`, `component:<name>`, `prd-*`), confirm via `mcp__linear-server__list_issue_labels` (or `list_project_labels` for Project labels) that it exists OR is creatable. Linear labels are team-scoped or workspace-scoped; flag if the requested scope is wrong.
254
+ For each label referenced (`status:*`, `component:<name>`, `prd-*`), confirm via `lisa:linear-access operation: list-issue-labels` (or `lisa:linear-access operation: list-project-labels` for Project labels) that it exists OR is creatable. Linear labels are team-scoped or workspace-scoped; flag if the requested scope is wrong.
255
255
 
256
256
  ## Execution
257
257
 
258
258
  1. Parse `$ARGUMENTS`. If it's an identifier, fetch the item and derive the spec from the fetched fields — including `build_ready` (label set contains `status:ready`) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa:linear-read-issue`) so S15 can classify the item. Otherwise parse the YAML spec.
259
- 2. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})` if any feasibility gate will run.
259
+ 2. Resolve team ID via `lisa:linear-access operation: list-teams({query: <teamKey>})` if any feasibility gate will run.
260
260
  3. Run every Specification gate in order. Collect PASS / FAIL / N/A with a one-line reason.
261
261
  4. Unless the caller passed `--spec-only` (dry-run), run every Feasibility gate. Collect results.
262
262
  5. Emit the report below.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-verify
3
3
  description: "Verifies a Linear work item meets organizational standards by fetching the live item and running it through lisa:linear-validate-issue. Catches anything dropped or reformatted on write — same gates as the pre-write check, but applied to what Linear actually stored. Read-only."
4
- allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__get_project", "mcp__linear-server__list_issue_labels", "mcp__linear-server__list_project_labels"]
4
+ allowed-tools: ["Bash", "Skill"]
5
5
  ---
6
6
 
7
7
  # Verify Linear Work Item: $ARGUMENTS
@@ -25,14 +25,14 @@ If `$ARGUMENTS` is not parseable, stop and report.
25
25
  ## Phase 1 — Resolve Context
26
26
 
27
27
  1. Read `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.local` override).
28
- 2. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})`.
28
+ 2. Resolve team ID via `lisa:linear-access operation: list-teams({query: <teamKey>})`.
29
29
  3. Determine entity type from the identifier shape:
30
30
  - `<TEAM>-<n>` → Issue
31
31
  - URL containing `/project/<slug>-<id>` → Project
32
32
 
33
33
  ## Phase 2 — Fetch Live State
34
34
 
35
- Call `mcp__linear-server__get_issue` (for Issues) or `mcp__linear-server__get_project` (for Projects). Capture every field, label, relation, comment, milestone, and project membership.
35
+ Call `lisa:linear-access operation: get-issue` (for Issues) or `lisa:linear-access operation: get-project` (for Projects). Capture every field, label, relation, comment, milestone, and project membership.
36
36
 
37
37
  ## Phase 3 — Delegate to Validator
38
38
 
@@ -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.