@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
@@ -0,0 +1,56 @@
1
+ # Integration Access Layer
2
+
3
+ Every Lisa skill or rule that consumes an external integration MUST route through
4
+ the integration's `*-access` skill instead of calling that vendor's MCP tools or
5
+ REST API directly.
6
+
7
+ The access skill owns substrate resolution:
8
+
9
+ 1. MCP, when the tool is available and already authenticated to the configured
10
+ workspace/account.
11
+ 2. Token/REST substrate, only when the documented env var is present.
12
+ 3. Loud failure naming the exact env var to set.
13
+
14
+ Do not blind-retry a failed or absent MCP. Fall back only after checking the
15
+ documented env var for that vendor, and never silently no-op when neither tier is
16
+ available.
17
+
18
+ ## Access Skills
19
+
20
+ | Vendor | Access skill | Headless env var | REST/token substrate |
21
+ |---|---|---|---|
22
+ | Atlassian | `lisa:atlassian-access` | `ATLASSIAN_API_TOKEN` | Atlassian Cloud REST |
23
+ | Notion | `lisa:notion-access` | `NOTION_API_TOKEN` | Notion REST |
24
+ | Linear | `lisa:linear-access` | `LINEAR_API_KEY` | Linear GraphQL |
25
+ | Jam | `lisa:jam-access` | `JAM_PAT` | Jam MCP HTTP endpoint with bearer PAT |
26
+ | SonarCloud | `lisa:sonarcloud-access` | `SONAR_TOKEN` | SonarCloud Web API |
27
+ | Sentry | `lisa:sentry-access` | `SENTRY_AUTH_TOKEN` | Sentry REST API |
28
+ | PostHog | `lisa:posthog-access` | `POSTHOG_PERSONAL_API_KEY` | PostHog REST API |
29
+
30
+ ## Current Coupling Matrix
31
+
32
+ Source audit date: 2026-06-23. Scope: `plugins/src/**/skills/**` and
33
+ `plugins/src/**/rules/**`.
34
+
35
+ | Vendor | Direct source MCP references | Current route | Retrofit status |
36
+ |---|---:|---|---|
37
+ | Atlassian | setup-only references plus legacy stack-generated sources | `atlassian-access` for base runtime paths | Done for base hot paths; stack overlays still need sync from base patterns when touched. |
38
+ | Notion | setup-only references | `notion-access` | Done. |
39
+ | Linear | Multiple base queue/read/write/verify skills | Raw Linear MCP | Access layer added; consumers still need migration to `linear-access`. |
40
+ | Jam | None in `plugins/src` at audit time | No access layer | Access layer added for host rules that include Jam triage. |
41
+ | SonarCloud | None in `plugins/src` at audit time | No access layer | Access layer added for host rules that include SonarCloud gate triage. |
42
+ | Sentry | No Sentry MCP references in `plugins/src`; CLI/REST mentions only | CLI/REST scattered in observability docs | Access layer added for future MCP-backed consumers. |
43
+ | PostHog | No PostHog MCP references in `plugins/src`; observability docs mention PostHog detection | No access layer | Access layer added for future MCP-backed consumers. |
44
+
45
+ ## Migration Rule For Consumers
46
+
47
+ When editing any skill listed in the matrix:
48
+
49
+ - Replace direct `mcp__<vendor>__*` calls in `allowed-tools` with `Skill` and
50
+ delegate to the matching access skill.
51
+ - Keep operation names coarse and vendor-native. Add new operation rows to the
52
+ access skill instead of embedding REST details in the consumer.
53
+ - Preserve existing MCP behavior as the first tier where Claude/Codex can expose
54
+ the MCP, but make headless token fallback explicit and gated by the env var.
55
+ - If a vendor has no documented token substrate, keep the MCP-only behavior and
56
+ fail with a clear "no documented headless substrate" message.
@@ -69,4 +69,4 @@ The procedure is vendor-neutral; the create + link + edit mechanics differ:
69
69
 
70
70
  - **JIRA** — create via `mcp__atlassian__createJiraIssue` (clone fields, set the same epic parent); link via `mcp__atlassian__createIssueLink` with `Blocks` / `is blocked by` (resolve names via `mcp__atlassian__getIssueLinkTypes`); narrow the original via `mcp__atlassian__editJiraIssue`; comment via `mcp__atlassian__addCommentToJiraIssue`. See `jira-write-ticket` Phase 6.
71
71
  - **GitHub** — create the sibling issue with the same labels and parent sub-issue; encode the dependency in the body (`Blocked by #<n>` / `Blocks #<n>`) and via the sub-issue/parent graph where used; edit the original's body to narrow scope. See `github-write-issue` Phase 6.
72
- - **Linear** — create via `mcp__linear-server__save_issue` (clone fields, set the same `projectId`); add a blocking relation via the `relations` field or a paired relation call; edit the original to narrow scope. See `linear-write-issue` Phase 6.
72
+ - **Linear** — create via `lisa:linear-access operation: save-issue` (clone fields, set the same `projectId`); add a blocking relation via the `relations` field or a paired relation call; edit the original to narrow scope. See `linear-write-issue` Phase 6.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: intake
3
3
  description: "Vendor-agnostic scanner for Ready queues. Given a Notion PRD database URL → finds the first Ready PRD and runs lisa:plan. Given a Confluence space or parent page URL → finds the first prd-ready PRD and runs lisa:plan. Given a Linear workspace URL or team key → finds the first prd-ready Linear project and runs lisa:plan. Given a GitHub repo URL or `org/repo` token → finds the first prd-ready GitHub issue and runs lisa:plan. Given a JIRA project key or JQL filter → finds the first Ready ticket and runs lisa:implement. Given a GitHub repo URL or `org/repo` token when `tracker = github` → finds the first `status:ready` issue and runs lisa:implement. On the PRD side it also closes the loop: each cycle rolls a ticketed PRD up to shipped and dispatches lisa:verify-prd for one shipped PRD (shipped → verified on pass; on fail, re-opened shipped → ticketed with build-ready fix tickets that auto-build and re-verify — never blocked). Designed as the cron target for /schedule — one eligible item per invocation, exits cleanly on empty. Symmetric counterpart to the single-item lisa:plan and lisa:implement skills."
4
- allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue", "mcp__linear-server__list_projects", "mcp__linear-server__list_teams", "mcp__linear-server__list_project_labels"]
4
+ allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue"]
5
5
  ---
6
6
 
7
7
  # Intake: $ARGUMENTS
@@ -87,7 +87,7 @@ Disambiguation rules:
87
87
  - The literal token `linear` (case-insensitive) → Linear queue, default workspace from `linear.workspace` in `.lisa.config.json`.
88
88
  - A `github.com` URL or an `<org>/<repo>` token → GitHub queue. The PRD-vs-build dispatch is determined by which label namespace the repo currently uses: PRD-side (`prd-ready`) → `lisa:github-prd-intake`; build-side (`status:ready` and `tracker = github` in `.lisa.config.json`) → `lisa:tracker-build-intake`. If both namespaces are present, prefer the PRD queue unless `$ARGUMENTS` includes `intake_mode=build`. If the URL points at a single issue (`https://github.com/<org>/<repo>/issues/<n>`), this skill is batch-only — direct the caller to `lisa:plan` (for a single PRD issue) or `lisa:implement` (for a single build issue).
89
89
  - The literal token `github` (case-insensitive) → GitHub queue, default repo from `.lisa.config.json` `github.org` / `github.repo`.
90
- - A bare alphanumeric token that matches the JIRA project key regex (uppercase letters / digits / hyphen, ≤10 chars — typically the value of `jira.project` in `.lisa.config.json`) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. If it does not resolve as a Confluence space key either, attempt to resolve as a Linear team key via `mcp__linear-server__list_teams({query})` before giving up. The only time to stop and ask is when the token resolves to more than one of {JIRA project, Confluence space, Linear team, GitHub `org/repo`} simultaneously — in that overlap the user must disambiguate which queue to scan.
90
+ - A bare alphanumeric token that matches the JIRA project key regex (uppercase letters / digits / hyphen, ≤10 chars — typically the value of `jira.project` in `.lisa.config.json`) is treated as a JIRA project key by default. A token that does not match the regex is treated as a Confluence space key. If it does not resolve as a Confluence space key either, attempt to resolve as a Linear team key via `lisa:linear-access operation: list-teams({query})` before giving up. The only time to stop and ask is when the token resolves to more than one of {JIRA project, Confluence space, Linear team, GitHub `org/repo`} simultaneously — in that overlap the user must disambiguate which queue to scan.
91
91
  - An `<org>/<repo>` token (slash-separated, both halves are GitHub-name-shaped) → GitHub queue.
92
92
  - A string starting with `project = ` or containing JQL operators (`AND`, `OR`, `=`, `!=`, `~`, etc.) → JQL filter.
93
93
 
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: jam-access
3
+ description: "Vendor-neutral access layer for Jam. Jam triage rules and skills MUST delegate through this skill rather than calling Jam MCP tools directly. Resolves Jam MCP first when available, then falls back to JAM_PAT bearer auth for headless routines."
4
+ allowed-tools: ["Bash", "Read", "Skill"]
5
+ ---
6
+
7
+ # Jam Access: $ARGUMENTS
8
+
9
+ Single chokepoint for Jam operations. Caller skills and rules MUST NOT call
10
+ `mcp__Jam__*` tools directly.
11
+
12
+ ## Invocation Contract
13
+
14
+ ```text
15
+ operation: get-trace url:<jam-url-or-id>
16
+ operation: get-recording url:<jam-url-or-id>
17
+ operation: get-bug-report url:<jam-url-or-id>
18
+ ```
19
+
20
+ Return parsed JSON or a concise structured summary in a `<result>` block.
21
+
22
+ ## Substrate Selection
23
+
24
+ Probe in order:
25
+
26
+ 1. Jam MCP, if the tool is available and authenticated.
27
+ 2. `JAM_PAT` bearer token against Jam's MCP/trace HTTP substrate.
28
+
29
+ Jam documents personal access tokens for MCP clients so a browser OAuth flow is
30
+ not required. The headless tier uses:
31
+
32
+ ```bash
33
+ curl -sS "https://mcp.jam.dev/mcp" \
34
+ -H "Authorization: Bearer $JAM_PAT" \
35
+ -H "Content-Type: application/json" \
36
+ --data-binary "$PAYLOAD"
37
+ ```
38
+
39
+ If neither tier works, fail with:
40
+
41
+ ```text
42
+ Error: no Jam access substrate available. Authenticate the Jam MCP or set JAM_PAT.
43
+ ```
44
+
45
+ ## Invariants
46
+
47
+ - Fallback is gated on `JAM_PAT`; do not retry Jam MCP failures blindly.
48
+ - Never commit a Jam PAT into `.mcp.json`. Use env interpolation in host MCP
49
+ config, for example `Authorization: Bearer ${JAM_PAT}`.
50
+ - If a requested operation is not yet mapped to the Jam HTTP substrate, surface
51
+ that exact missing adapter instead of pretending the trace is unavailable.
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: linear-access
3
+ description: "Vendor-neutral access layer for Linear. Linear skills MUST delegate through this skill rather than calling Linear MCP tools or Linear GraphQL directly. Resolves Linear MCP first when authenticated, then falls back to LINEAR_API_KEY + Linear GraphQL in headless environments."
4
+ allowed-tools: ["Bash", "Read", "Skill"]
5
+ ---
6
+
7
+ # Linear Access: $ARGUMENTS
8
+
9
+ Single chokepoint for Linear operations. Caller skills (`linear-*`) MUST go
10
+ through this skill. They MUST NOT call `mcp__linear-server__*` tools directly or
11
+ curl `https://api.linear.app/graphql` themselves.
12
+
13
+ ## Invocation Contract
14
+
15
+ ```text
16
+ operation: list-teams [query:<KEY>]
17
+ operation: get-team id:<ID>
18
+ operation: list-projects [team:<KEY>] [label:<NAME>] [state:<arr>]
19
+ operation: get-project id:<ID>
20
+ operation: save-project payload:{...}
21
+ operation: list-issues [team:<ID>] [project:<ID>] [label:<NAME>] [state_type:<arr>]
22
+ operation: get-issue id:<ID>
23
+ operation: save-issue payload:{...}
24
+ operation: list-comments issue_id:<ID>
25
+ operation: save-comment issue_id:<ID> body:"..."
26
+ operation: list-issue-labels [team:<ID>]
27
+ operation: create-issue-label payload:{...}
28
+ operation: list-project-labels
29
+ operation: create-project-label payload:{...}
30
+ operation: list-documents project_id:<ID>
31
+ operation: get-document id:<ID>
32
+ ```
33
+
34
+ Return parsed JSON in a `<result>` block. On failure, prefix the message with
35
+ `Error:` and include the failing operation name.
36
+
37
+ ## Substrate Selection
38
+
39
+ Read config:
40
+
41
+ ```bash
42
+ WORKSPACE=$(jq -r '.linear.workspace // empty' .lisa.config.json 2>/dev/null)
43
+ TEAM_KEY=$(jq -r '.linear.teamKey // empty' .lisa.config.json 2>/dev/null)
44
+ ```
45
+
46
+ Probe in order:
47
+
48
+ 1. Linear MCP, if `mcp__linear-server__list_teams` is available and can list the
49
+ configured workspace/team.
50
+ 2. `LINEAR_API_KEY` with Linear GraphQL (`https://api.linear.app/graphql`).
51
+
52
+ The Linear GraphQL docs support personal API keys for scripts and authenticate
53
+ with an `Authorization: <API_KEY>` header. Treat `LINEAR_API_KEY` as the
54
+ headless substrate. If neither tier works, fail with:
55
+
56
+ ```text
57
+ Error: no Linear access substrate available. Authenticate the Linear MCP or set LINEAR_API_KEY.
58
+ ```
59
+
60
+ ## GraphQL Adapter
61
+
62
+ All GraphQL calls use:
63
+
64
+ ```bash
65
+ linear_graphql() {
66
+ local query="$1"
67
+ local variables="${2:-{}}"
68
+ [ -n "$LINEAR_API_KEY" ] || {
69
+ echo "Error: LINEAR_API_KEY is not set." >&2
70
+ return 1
71
+ }
72
+ jq -n --arg query "$query" --argjson variables "$variables" \
73
+ '{query:$query, variables:$variables}' |
74
+ curl -sS -X POST "https://api.linear.app/graphql" \
75
+ -H "Content-Type: application/json" \
76
+ -H "Authorization: '"$LINEAR_API_KEY"'" \
77
+ --data-binary @-
78
+ }
79
+ ```
80
+
81
+ Map operation names to Linear GraphQL queries/mutations in this access skill.
82
+ Consumers pass business-shaped arguments only; they do not embed GraphQL.
83
+
84
+ ## Invariants
85
+
86
+ - MCP is preferred when it is present and already authenticated.
87
+ - GraphQL fallback runs only when `LINEAR_API_KEY` is present.
88
+ - Missing MCP plus missing token is a hard failure naming `LINEAR_API_KEY`.
89
+ - Mutations send only the fields being changed, matching existing Linear skill
90
+ guidance that `save_*` style updates should not clobber unrelated fields.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-add-journey
3
3
  description: "Add a Validation Journey section to an existing Linear Issue by analyzing the change type and generating appropriate verification steps with evidence markers. Linear counterpart of lisa:jira-add-journey."
4
- allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue"]
4
+ allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"]
5
5
  ---
6
6
 
7
7
  # Add Validation Journey to Existing Linear Issue
@@ -22,7 +22,7 @@ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.loca
22
22
 
23
23
  ### Step 1: Read the Issue
24
24
 
25
- Fetch via `mcp__linear-server__get_issue` and extract: title, description (markdown), labels, project, parent, attachments.
25
+ Fetch via `lisa:linear-access operation: get-issue` and extract: title, description (markdown), labels, project, parent, attachments.
26
26
 
27
27
  ### Step 2: Check for Existing Journey
28
28
 
@@ -91,7 +91,7 @@ Display the drafted journey and ask for confirmation before appending.
91
91
 
92
92
  ### Step 7: Append to Issue Description
93
93
 
94
- After approval, fetch the current description, append the new Validation Journey section, and update via `mcp__linear-server__save_issue({id, description: <new-description>})`. Preserve all existing description content — never overwrite.
94
+ After approval, fetch the current description, append the new Validation Journey section, and update via `lisa:linear-access operation: save-issue({id, description: <new-description>})`. Preserve all existing description content — never overwrite.
95
95
 
96
96
  ### Step 8: Verify
97
97
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-build-intake
3
3
  description: "Symmetric counterpart to lisa:jira-build-intake on the Linear side. Scans a Linear team for Issues carrying the configured `ready` build label, claims the first eligible Issue by relabeling to the configured `claimed` label, runs the implementation/build flow via lisa:linear-agent, relabels to the configured `done` label on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic) that still carries a stale build-ready label is skipped or safe-blocked with a lifecycle-repair comment, never claimed. The `ready` label is the human-flipped signal that an Issue is truly ready for development — mirroring how Notion PRDs work Draft → Ready → (us) In Review → Blocked|Ticketed."
4
- allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_teams", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
4
+ allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
7
7
  # Linear Build Intake: $ARGUMENTS
@@ -107,7 +107,7 @@ ready → claimed → review → done(env-keyed) (downstream)
107
107
 
108
108
  This skill ONLY transitions `$READY → $CLAIMED` on claim, and `$CLAIMED → $DONE` on completion. It never touches `status:done`-as-terminal, `$REVIEW` (owned by `lisa:linear-agent` / `lisa:linear-evidence`), or `status:blocked` (owned by `lisa:linear-agent`'s pre-flight gate).
109
109
 
110
- **Pre-flight check**: at start of each cycle, confirm `$READY`, `$CLAIMED`, and the relevant `$DONE` variants exist on the team via `mcp__linear-server__list_issue_labels`. If `$READY` is missing, stop and report adoption needed. The other labels can be created on demand.
110
+ **Pre-flight check**: at start of each cycle, confirm `$READY`, `$CLAIMED`, and the relevant `$DONE` variants exist on the team via `lisa:linear-access operation: list-issue-labels`. If `$READY` is missing, stop and report adoption needed. The other labels can be created on demand.
111
111
 
112
112
  ## Phases
113
113
 
@@ -116,11 +116,11 @@ This skill ONLY transitions `$READY → $CLAIMED` on claim, and `$CLAIMED → $D
116
116
  1. Parse `$ARGUMENTS`:
117
117
  - Bare team key → use as-is.
118
118
  - Literal `linear` → fall back to `linear.teamKey` from config.
119
- 2. Resolve team ID via `mcp__linear-server__list_teams({query: <teamKey>})`.
119
+ 2. Resolve team ID via `lisa:linear-access operation: list-teams({query: <teamKey>})`.
120
120
 
121
121
  ### Phase 2 — Find ready Issues
122
122
 
123
- Query: `mcp__linear-server__list_issues({team: <teamId>, label: "$READY"})`.
123
+ Query: `lisa:linear-access operation: list-issues({team: <teamId>, label: "$READY"})`.
124
124
 
125
125
  Capture each Issue's: identifier, title, type label, priority, assignee, project, labels, description summary.
126
126
 
@@ -138,7 +138,7 @@ A Linear team can oversee multiple repos (`frontend` / `backend` / `infrastructu
138
138
  2. **Cheap path first.** Prefer candidates already carrying the `repo:<current>` label. Keep the Phase 2 scan broad so unlabeled Issues are still seen, determined, and stamped.
139
139
  3. **Per candidate, apply the repo-scope decision (`repo-scope-split`):**
140
140
  - Carries `repo:<other>` → **skip** (leave it `ready` for that repo's own intake); next candidate.
141
- - **Unlabeled** → determine the target repo(s) from the Issue + code surfaces, then **stamp** `repo:<name>` via `mcp__linear-server__save_issue` (resolve/create the label via `list_issue_labels`/`create_issue_label`) so later cycles filter cheaply; re-apply with the now-known repo.
141
+ - **Unlabeled** → determine the target repo(s) from the Issue + code surfaces, then **stamp** `repo:<name>` via `lisa:linear-access operation: save-issue` (resolve/create the label via `list_issue_labels`/`create_issue_label`) so later cycles filter cheaply; re-apply with the now-known repo.
142
142
  - **Multi-repo leaf → split, never claim.** Run the `repo-scope-split` work-time procedure into single-repo siblings, each created **build-ready** (`build_ready: true`) and stamped with its own `repo:<name>`; the current repo's sibling becomes a normal candidate.
143
143
  - **Single-repo leaf for the current repo** → fall through to 3a (leaf-only gate) and 3b (claim).
144
144
  4. Continue until a claimable current-repo leaf is found (claim it; one per cycle) or the ready set is exhausted — exit cleanly with `"No ready Issues for repo <current>. Nothing to do."`.
@@ -151,7 +151,7 @@ Run this gate **before** the claim relabel, starting with the oldest/highest-pri
151
151
 
152
152
  **Resolve container vs. leaf — structural first, then nominal.** Per `leaf-only-lifecycle` the classification is structural: an Issue is a **container** if it has **open** child work, whatever its declared type; otherwise the **type label** decides. Resolve child work using the same hierarchy `lisa:linear-read-issue` uses — Linear's native parentage: an Issue groups **sub-issues** via `parentId`, and a **Project** (the Epic equivalent) groups Issues via `projectId`. Relations (`save_issue_relation` — `blocks` / `is blocked by`) express dependencies and are **not** parentage — do not count them as children.
153
153
 
154
- Fetch the Issue's sub-issues via `mcp__linear-server__get_issue` (which returns the children) or `mcp__linear-server__list_issues({parentId: <issueId>})`, then count those still open (Linear `state.type` not in the completed/canceled set):
154
+ Fetch the Issue's sub-issues via `lisa:linear-access operation: get-issue` (which returns the children) or `lisa:linear-access operation: list-issues({parentId: <issueId>})`, then count those still open (Linear `state.type` not in the completed/canceled set):
155
155
 
156
156
  ```text
157
157
  # Children of <issueId>: native sub-issues via parentId.
@@ -176,7 +176,7 @@ The childless-parent exception promotes every childless type **except Epic** to
176
176
 
177
177
  **Safe-block (default action for a flagged container).** Leave the build-ready label in place (don't silently strip it — that hides the lifecycle error), post a single lifecycle-repair comment, record the Issue under "Skipped (container)" in the summary, and end the cycle. Do NOT relabel to `$CLAIMED`. Keep the comment idempotent — skip posting if an identical `[claude-build-intake]` lifecycle-repair comment already exists on the Issue, so a re-entrant cycle doesn't spam it.
178
178
 
179
- Post via `mcp__linear-server__save_comment` with:
179
+ Post via `lisa:linear-access operation: save-comment` with:
180
180
 
181
181
  ```text
182
182
  [claude-build-intake] Not claimed: this Issue carries the build-ready label ($READY) but is a container with open child work (or a childless Epic), which violates the leaf-only-lifecycle rule. Build-ready (status:ready) is leaf-only per leaf-only-lifecycle — an agent claims and implements leaves, never a container. Repair: move $READY off this parent onto its leaf children (or, for a childless Epic, decompose it into leaf children or reclassify it to a leaf type). A parent's lifecycle state rolls up from its children and is never set to ready directly.
@@ -186,9 +186,9 @@ This gate never blocks a legitimate flat Task/Bug: those have no open children a
186
186
 
187
187
  #### 3b. Claim
188
188
 
189
- Update labels via `mcp__linear-server__save_issue`: remove `$READY`, add `$CLAIMED`. Resolve label IDs via `list_issue_labels` (create `$CLAIMED` if missing).
189
+ Update labels via `lisa:linear-access operation: save-issue`: remove `$READY`, add `$CLAIMED`. Resolve label IDs via `list_issue_labels` (create `$CLAIMED` if missing).
190
190
 
191
- **Assign to the authenticated user when the Issue is unassigned.** A claim must be attributable. If the Issue has no assignee, set its `assigneeId` to the authenticated viewer (resolve the viewer's id via the Linear MCP identity — e.g. `get_user` for the current actor) through `mcp__linear-server__save_issue`. Leave an already-assigned Issue's assignee untouched — never reassign work that already has an owner.
191
+ **Assign to the authenticated user when the Issue is unassigned.** A claim must be attributable. If the Issue has no assignee, set its `assigneeId` to the authenticated viewer (resolve the viewer's id via the Linear MCP identity — e.g. `get_user` for the current actor) through `lisa:linear-access operation: save-issue`. Leave an already-assigned Issue's assignee untouched — never reassign work that already has an owner.
192
192
 
193
193
  Post a `[claude-build-intake]` comment via `save_comment`: `"Claimed by Claude. Starting build."`
194
194
 
@@ -264,7 +264,7 @@ If `lisa:linear-agent` returned Success:
264
264
  - If `linear.labels.build.done` is a string, that string is terminal.
265
265
  - If `linear.labels.build.done` is an object, only the production/final environment value is terminal (default: `status:done`). Intermediate env values such as `status:on-dev` and `status:on-stg` are not terminal and must keep the native Issue open.
266
266
  - If the project uses a different final environment name, resolve it from the configured deployment topology; if ambiguous, record an Error and do not change the native state.
267
- 4. Update labels via `mcp__linear-server__save_issue`: remove `$CLAIMED` (or `$REVIEW` if `lisa:linear-evidence` already moved it forward), add `$DONE`.
267
+ 4. Update labels via `lisa:linear-access operation: save-issue`: remove `$CLAIMED` (or `$REVIEW` if `lisa:linear-evidence` already moved it forward), add `$DONE`.
268
268
  5. If `$DONE` is terminal, move the native Linear Issue state to the configured Done / Completed state. Resolve that state from project configuration if present; otherwise inspect the team workflow for a terminal state with `state.type = "completed"` and a name such as `Done` or `Completed`. If no terminal state can be resolved, record an Error and leave the labels as the source of truth — do not invent a state name.
269
269
  6. Post a `[claude-build-intake]` comment: `"Build complete. PR <URL> merged. Transitioned to $DONE."` Include whether native closure was applied, already satisfied, skipped for an intermediate env, or unavailable for setup reasons.
270
270
 
@@ -275,7 +275,7 @@ For any non-Success outcome, do NOT transition. The Issue sits where the agent l
275
275
  Run this **only after a successful `$DONE` transition in 3d**. This is the **forward** arm of the `leaf-only-lifecycle` rule's *"rollup is evaluated whenever a child transitions"* requirement: a leaf reaching `$DONE` may complete its parent Issue, which may in turn complete its Project. Without this step a fully-built parent stays open until the recovery `lisa:repair-intake` cron happens to run.
276
276
 
277
277
  1. Resolve the Issue's parent using the same hierarchy `lisa:linear-read-issue` uses — native parentage: a sub-issue's `parentId`, and Project membership via `projectId` for the Epic-equivalent. If the Issue has no parent, skip — nothing to roll up.
278
- 2. Walk **up the ancestor chain bottom-up** (sub-issue → parent Issue → Project): for each ancestor invoke `lisa:linear-sync <ANCESTOR-ID> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it via `mcp__linear-server__save_issue` only when it differs (never `status:ready`), and moves the native Linear `state` to the configured Done / Completed state when the derived env is the terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
278
+ 2. Walk **up the ancestor chain bottom-up** (sub-issue → parent Issue → Project): for each ancestor invoke `lisa:linear-sync <ANCESTOR-ID> --rollup`. That skill derives the ancestor's `status:*` from its children per `leaf-only-lifecycle`, applies it via `lisa:linear-access operation: save-issue` only when it differs (never `status:ready`), and moves the native Linear `state` to the configured Done / Completed state when the derived env is the terminal `$DONE`. It is idempotent and safe-defaults (suggests, does not guess) when the rolled state is ambiguous.
279
279
  3. Stop walking up when an ancestor has no parent, or when `--rollup` reports no change. Record each rolled-up ancestor and its derived state in the summary.
280
280
 
281
281
  This does not re-implement the state machine — it delegates to `lisa:linear-sync --rollup`, the single rollup implementation `lisa:repair-intake` also uses, so the forward and recovery paths can never drift. Children closed **outside** this flow are not observed here; `lisa:repair-intake` remains the recovery net for those.
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: linear-create
3
3
  description: "Creates Linear Projects (Epic-equivalent), Issues (Story / Task / Bug / Spike), and sub-Issues (Sub-task) from code files or descriptions. Analyzes the input, determines the appropriate hierarchy, and creates items with comprehensive quality requirements including test-first development and Validation Journey. The Linear counterpart of lisa:jira-create — delegates every write to lisa:linear-write-issue."
4
- allowed-tools: ["Read", "Glob", "LS", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__list_projects", "mcp__linear-server__list_issue_labels", "mcp__linear-server__list_project_labels"]
4
+ allowed-tools: ["Read", "Glob", "LS", "Skill"]
5
5
  ---
6
6
 
7
7
  # Create Linear Work Items from $ARGUMENTS
8
8
 
9
- Analyze the provided file(s) and plan a Linear hierarchy. **This skill plans structure only — every individual write is delegated to `lisa:linear-write-issue`.** Do not call `mcp__linear-server__save_project` or `mcp__linear-server__save_issue` from this skill; those write tools are intentionally not in `allowed-tools`.
9
+ Analyze the provided file(s) and plan a Linear hierarchy. **This skill plans structure only — every individual write is delegated to `lisa:linear-write-issue`.** Do not call `lisa:linear-access operation: save-project` or `lisa:linear-access operation: save-issue` from this skill; those write tools are intentionally not in `allowed-tools`.
10
10
 
11
11
  This skill is the destination of the `lisa:tracker-create` shim when `tracker = "linear"`.
12
12
 
@@ -104,7 +104,7 @@ Default team: from `linear.teamKey` config (override via arguments).
104
104
 
105
105
  ## Delegation to linear-write-issue
106
106
 
107
- **Mandatory.** Every item created by this skill MUST go through `lisa:linear-write-issue`. This skill never calls `mcp__linear-server__save_*` itself — those tools are intentionally excluded from `allowed-tools` so the gate cannot be bypassed.
107
+ **Mandatory.** Every item created by this skill MUST go through `lisa:linear-write-issue`. This skill never performs Linear save operations itself — those tools are intentionally excluded from `allowed-tools` so the gate cannot be bypassed.
108
108
 
109
109
  `lisa:linear-write-issue` enforces:
110
110
  - 3-audience description (Context / Technical Approach / Acceptance Criteria)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-evidence
3
3
  description: "Uploads text evidence to the GitHub `pr-assets` release, updates the PR description, posts a comment on the originating Linear Issue with code blocks, and transitions the Issue from the configured `claimed` label to the configured `review` label. Reusable by any skill that captures evidence and generates evidence/comment.txt + evidence/code-blocks.md. Linear counterpart of lisa:jira-evidence and lisa:github-evidence."
4
- allowed-tools: ["Bash", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
4
+ allowed-tools: ["Bash", "Skill"]
5
5
  ---
6
6
 
7
7
  # Linear Evidence: $ARGUMENTS
@@ -44,7 +44,7 @@ If any of these are missing, stop and report.
44
44
  ## Phase 1 — Resolve Linear Issue
45
45
 
46
46
  1. Parse the identifier from `$ARGUMENTS`.
47
- 2. Fetch via `mcp__linear-server__get_issue` to confirm it exists and capture its current state, label set, and Project membership.
47
+ 2. Fetch via `lisa:linear-access operation: get-issue` to confirm it exists and capture its current state, label set, and Project membership.
48
48
 
49
49
  ## Phase 2 — Upload Evidence Files (optional)
50
50
 
@@ -64,7 +64,7 @@ If no PR is open, skip this phase.
64
64
 
65
65
  ## Phase 4 — Post Linear Comment
66
66
 
67
- Call `mcp__linear-server__save_comment({issueId: <id>, body: <body>})` where `<body>` is:
67
+ Call `lisa:linear-access operation: save-comment({issueId: <id>, body: <body>})` where `<body>` is:
68
68
 
69
69
  ```markdown
70
70
  [<comment.txt contents verbatim>]
@@ -83,7 +83,7 @@ Linear comments support markdown including `<details>` collapsibles, fenced code
83
83
 
84
84
  ## Phase 5 — Transition Status
85
85
 
86
- Update labels via `mcp__linear-server__save_issue` to remove `$CLAIMED` and add `$REVIEW`. Resolve label IDs first via `mcp__linear-server__list_issue_labels` (create the label via `create_issue_label` if it doesn't exist on the team).
86
+ Update labels via `lisa:linear-access operation: save-issue` to remove `$CLAIMED` and add `$REVIEW`. Resolve label IDs first via `lisa:linear-access operation: list-issue-labels` (create the label via `create_issue_label` if it doesn't exist on the team).
87
87
 
88
88
  The native Linear `state` field is also updated to the team's "In Review" state if one exists — but the label remains the source of truth for cross-team consistency.
89
89
 
@@ -99,5 +99,5 @@ Return:
99
99
 
100
100
  - Never modify the Issue description as part of evidence posting — comments only. Description edits go through `lisa:linear-write-issue`.
101
101
  - Never skip the label transition. The build queue is keyed off the configured `linear.labels.build.*` labels; an item that ships without transitioning is invisible to monitoring.
102
- - If `mcp__linear-server__save_comment` fails, retry once. If it fails again, surface the error — don't pretend the comment was posted.
102
+ - If `lisa:linear-access operation: save-comment` fails, retry once. If it fails again, surface the error — don't pretend the comment was posted.
103
103
  - Do not delete prior comments. The history is the audit trail.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: linear-journey
3
3
  description: "Parse a Linear Issue's Validation Journey section, execute the verification steps using appropriate tools (curl, test commands, database queries, Playwright), capture evidence at each [EVIDENCE: name] marker, and post to Linear + GitHub PR using the linear-evidence skill. Linear counterpart of lisa:jira-journey."
4
- allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill", "mcp__linear-server__list_teams", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue"]
4
+ allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"]
5
5
  ---
6
6
 
7
7
  # Linear Validation Journey
@@ -31,7 +31,7 @@ Reads `linear.workspace`, `linear.teamKey` from `.lisa.config.json` (with `.loca
31
31
 
32
32
  ### Step 1: Parse the Validation Journey
33
33
 
34
- Fetch the Issue via `mcp__linear-server__get_issue` and extract the `## Validation Journey` section from the markdown description. Parse:
34
+ Fetch the Issue via `lisa:linear-access operation: get-issue` and extract the `## Validation Journey` section from the markdown description. Parse:
35
35
 
36
36
  - `### Prerequisites` — list of required services / env / setup
37
37
  - `### Steps` — numbered steps, each potentially containing `[EVIDENCE: name]` markers
@@ -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