@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
+ ---
2
+ name: sentry-access
3
+ description: "Vendor-neutral access layer for Sentry. Sentry-oriented skills MUST delegate through this skill rather than calling Sentry MCP tools, sentry-cli, or REST directly. Resolves Sentry MCP/CLI first when available, then falls back to SENTRY_AUTH_TOKEN + Sentry REST API."
4
+ allowed-tools: ["Bash", "Read", "Skill"]
5
+ ---
6
+
7
+ # Sentry Access: $ARGUMENTS
8
+
9
+ Single chokepoint for Sentry operations. Caller skills MUST NOT call
10
+ `mcp__sentry__*`, `sentry-cli`, or `https://sentry.io/api/` directly.
11
+
12
+ ## Invocation Contract
13
+
14
+ ```text
15
+ operation: list-issues org:<ORG> project:<PROJECT> query:<QUERY> [environment:<ENV>]
16
+ operation: get-issue issue_id:<ID>
17
+ operation: events org:<ORG> project:<PROJECT> query:<QUERY>
18
+ operation: releases org:<ORG> project:<PROJECT>
19
+ ```
20
+
21
+ Return parsed JSON in a `<result>` block.
22
+
23
+ ## Substrate Selection
24
+
25
+ Probe in order:
26
+
27
+ 1. Sentry MCP, if available and authenticated.
28
+ 2. `sentry-cli`, if installed and authenticated to the requested org/project.
29
+ 3. `SENTRY_AUTH_TOKEN` bearer token against Sentry REST.
30
+
31
+ Sentry documents API auth tokens for REST API calls. The headless REST tier uses:
32
+
33
+ ```bash
34
+ sentry_api() {
35
+ local path="$1"
36
+ [ -n "$SENTRY_AUTH_TOKEN" ] || {
37
+ echo "Error: SENTRY_AUTH_TOKEN is not set." >&2
38
+ return 1
39
+ }
40
+ curl -sS "https://sentry.io/api/0${path}" \
41
+ -H "Authorization: Bearer $SENTRY_AUTH_TOKEN"
42
+ }
43
+ ```
44
+
45
+ If neither tier works, fail with:
46
+
47
+ ```text
48
+ Error: no Sentry access substrate available. Authenticate Sentry MCP/CLI or set SENTRY_AUTH_TOKEN.
49
+ ```
50
+
51
+ ## Invariants
52
+
53
+ - Fallback is gated on `SENTRY_AUTH_TOKEN`.
54
+ - Org/project come from `.sentryclirc`, `.lisa.config.json`, or explicit
55
+ operation args; never infer by searching all accessible orgs.
56
+ - Consumer skills do not embed Sentry REST paths.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: setup-linear
3
3
  description: "Configure Linear as the destination tracker and/or the PRD source for this project. Verifies Linear access (MCP OAuth or a personal API key in OS keychain), resolves the workspace slug and team key, scaffolds the build-queue issue-label namespace (`status:*`) when Linear is the tracker and/or the PRD-lifecycle project-label namespace (`prd-*` + issue-level sentinel) when Linear is the PRD source, writes the `linear` section into `.lisa.config.json`, and offers to set top-level `tracker: \"linear\"` and/or `source: \"linear\"`. Idempotent — re-running updates the existing section and reuses existing labels. No /lisa:setup:atlassian prerequisite."
4
- allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion", "mcp__linear-server__authenticate", "mcp__linear-server__complete_authentication", "mcp__linear-server__list_teams", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__list_project_labels", "mcp__linear-server__create_project_label"]
4
+ allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill", "AskUserQuestion", "mcp__linear-server__authenticate", "mcp__linear-server__complete_authentication"]
5
5
  ---
6
6
 
7
7
  # Setup Linear: $ARGUMENTS
@@ -40,7 +40,7 @@ The role answer drives Step 3 (which label namespaces to scaffold) and whether `
40
40
  Verify the Linear MCP is authenticated to the right workspace by listing teams:
41
41
 
42
42
  ```text
43
- mcp__linear-server__list_teams({})
43
+ lisa:linear-access operation: list-teams({})
44
44
  ```
45
45
 
46
46
  If it errors / returns nothing, run `mcp__linear-server__authenticate` and have the user complete OAuth in the browser, then `mcp__linear-server__complete_authentication`, then re-list. A non-empty team list confirms the MCP is authed to a readable workspace.
@@ -137,7 +137,7 @@ echo "Linear key validated. Org: $(echo "$VIEWER" | jq -r '.data.organization.ur
137
137
  ### Step 2 — Resolve workspace slug + team key
138
138
 
139
139
  - **Workspace slug**: honor `--workspace=<slug>`. Otherwise derive from the validated identity — the GraphQL `organization.urlKey` (API path) or the team list's workspace (MCP path). Confirm with the user; this slug is the keychain `account` key and the multi-workspace disambiguator.
140
- - **Team key** (required when Linear is the **tracker**): honor `--team=<KEY>`. Otherwise enumerate teams via `mcp__linear-server__list_teams({})` (or the GraphQL `teams` query) and present them via `AskUserQuestion` (label = team key, description = team name) for the user to pick the team that owns lisa's destination Issues. If Linear is source-only, `teamKey` is optional — skip unless the user wants to pin a team scope.
140
+ - **Team key** (required when Linear is the **tracker**): honor `--team=<KEY>`. Otherwise enumerate teams via `lisa:linear-access operation: list-teams({})` (or the GraphQL `teams` query) and present them via `AskUserQuestion` (label = team key, description = team name) for the user to pick the team that owns lisa's destination Issues. If Linear is source-only, `teamKey` is optional — skip unless the user wants to pin a team scope.
141
141
 
142
142
  ### Step 3 — Scaffold the lifecycle label namespaces
143
143
 
@@ -154,7 +154,7 @@ read_role() { # $1=namespace (build|prd) $2=role $3=default
154
154
 
155
155
  #### 3a. Build-queue labels — ISSUE labels (only if Linear is the tracker)
156
156
 
157
- Probe with `mcp__linear-server__list_issue_labels` (scoped to the team). For each role's resolved name, create it via `mcp__linear-server__create_issue_label` only if absent. The `done` role is env-keyed — create all three defaults; collapse to a single string in config later if the project's terminal state is env-independent.
157
+ Probe with `lisa:linear-access operation: list-issue-labels` (scoped to the team). For each role's resolved name, create it via `lisa:linear-access operation: create-issue-label` only if absent. The `done` role is env-keyed — create all three defaults; collapse to a single string in config later if the project's terminal state is env-independent.
158
158
 
159
159
  | Role | Default |
160
160
  |------|---------|
@@ -168,7 +168,7 @@ Probe with `mcp__linear-server__list_issue_labels` (scoped to the team). For eac
168
168
 
169
169
  #### 3b. PRD-lifecycle labels — PROJECT labels (only if Linear is the PRD source)
170
170
 
171
- Probe with `mcp__linear-server__list_project_labels`. Create missing ones via `mcp__linear-server__create_project_label`. This probe-then-create is find-or-create per label: a label already present is reused untouched, so re-running never duplicates `prd-*`. These are a **separate label kind** from issue labels — creating an issue label of the same name will NOT work for the PRD flow.
171
+ Probe with `lisa:linear-access operation: list-project-labels`. Create missing ones via `lisa:linear-access operation: create-project-label`. This probe-then-create is find-or-create per label: a label already present is reused untouched, so re-running never duplicates `prd-*`. These are a **separate label kind** from issue labels — creating an issue label of the same name will NOT work for the PRD flow.
172
172
 
173
173
  `prd-verified` is the terminal lifecycle state after `prd-shipped` (the `verified` role from config-resolution, #591): `/lisa:verify-prd` transitions a Linear PRD project into it once the shipped product has been empirically verified against the PRD. Scaffold it through the same find-or-create path as every other `prd-*` row.
174
174
 
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: sonarcloud-access
3
+ description: "Vendor-neutral access layer for SonarCloud/SonarQube Cloud. Sonar triage skills MUST delegate through this skill rather than calling Sonar MCP tools or REST directly. Resolves Sonar MCP first when available, then falls back to SONAR_TOKEN + SonarCloud Web API."
4
+ allowed-tools: ["Bash", "Read", "Skill"]
5
+ ---
6
+
7
+ # SonarCloud Access: $ARGUMENTS
8
+
9
+ Single chokepoint for SonarCloud operations. Caller skills MUST NOT call
10
+ `mcp__sonarqube__*` tools directly or curl `https://sonarcloud.io/api/`
11
+ themselves.
12
+
13
+ ## Invocation Contract
14
+
15
+ ```text
16
+ operation: gate-status project_key:<KEY> [branch:<BRANCH>] [pull_request:<N>]
17
+ operation: issues project_key:<KEY> [branch:<BRANCH>] [pull_request:<N>] [types:<csv>] [severities:<csv>]
18
+ operation: hotspots project_key:<KEY> [branch:<BRANCH>] [pull_request:<N>]
19
+ operation: rule-detail key:<RULE_KEY>
20
+ operation: source-snippet component:<COMPONENT_KEY> from:<N> to:<N>
21
+ ```
22
+
23
+ Return parsed JSON in a `<result>` block.
24
+
25
+ ## Substrate Selection
26
+
27
+ Probe in order:
28
+
29
+ 1. Sonar MCP, if available and authenticated.
30
+ 2. `SONAR_TOKEN` against the SonarCloud Web API.
31
+
32
+ SonarCloud documents bearer-token authentication for the Web API. Use:
33
+
34
+ ```bash
35
+ sonar_api() {
36
+ local path="$1"
37
+ [ -n "$SONAR_TOKEN" ] || {
38
+ echo "Error: SONAR_TOKEN is not set." >&2
39
+ return 1
40
+ }
41
+ curl -sS "https://sonarcloud.io/api${path}" \
42
+ -H "Authorization: Bearer $SONAR_TOKEN"
43
+ }
44
+ ```
45
+
46
+ If a host still requires the legacy token-as-basic-auth form, make that an
47
+ explicit adapter branch in this skill; consumers do not choose auth style.
48
+
49
+ If neither tier works, fail with:
50
+
51
+ ```text
52
+ Error: no SonarCloud access substrate available. Authenticate the Sonar MCP or set SONAR_TOKEN.
53
+ ```
54
+
55
+ ## REST Dispatch
56
+
57
+ | Operation | REST path |
58
+ |---|---|
59
+ | `gate-status` | `/qualitygates/project_status?projectKey=<KEY>[&branch=<BRANCH>][&pullRequest=<N>]` |
60
+ | `issues` | `/issues/search?componentKeys=<KEY>[&branch=<BRANCH>][&pullRequest=<N>]...` |
61
+ | `hotspots` | `/hotspots/search?projectKey=<KEY>[&branch=<BRANCH>][&pullRequest=<N>]` |
62
+ | `rule-detail` | `/rules/show?key=<RULE_KEY>` |
63
+ | `source-snippet` | `/sources/lines?key=<COMPONENT_KEY>&from=<N>&to=<N>` |
64
+
65
+ ## Invariants
66
+
67
+ - Fallback is gated on `SONAR_TOKEN`.
68
+ - SonarCloud host access requires `sonarcloud.io` in any custom remote network
69
+ allowlist.
70
+ - Consumers ask for analysis data by operation name; this skill owns the Web API
71
+ path shape.
@@ -22,5 +22,5 @@ See the `config-resolution` rule for configuration and dispatch table.
22
22
 
23
23
  ## Rules
24
24
 
25
- - The journey content is identical across vendors; only the parser source differs (the JIRA vendor reads description via Atlassian MCP; the GitHub vendor reads body via `gh issue view --json body`; the Linear vendor reads description via `mcp__linear-server__get_issue`).
25
+ - The journey content is identical across vendors; only the parser source differs (the JIRA vendor reads description via Atlassian MCP; the GitHub vendor reads body via `gh issue view --json body`; the Linear vendor reads description via `lisa:linear-access operation: get-issue`).
26
26
  - Evidence posting always goes through `lisa:tracker-evidence` — never bypass.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: verify-prd
3
3
  description: "Initiative-level PRD acceptance gate. Given a PRD ref/URL (GitHub Issue, Linear project/issue, Notion page, Confluence page, or JIRA issue), resolves the source vendor, reads the PRD body and its generated top-level child work set via the prd-lifecycle-rollup contract (native hierarchy first, machine-readable generated-work section fallback — never reimplementing child enumeration), and confirms every required generated top-level work item is terminal before any verification runs. If any required top-level child is non-terminal, it reports the incomplete child set and STOPS without verifying or transitioning the PRD. When the guard passes, it runs spec-conformance against the original PRD requirements (via the spec-conformance skill) plus empirical verification appropriate to the shipped surface (via verification-lifecycle). On a CONFORMS verdict with all empirical checks passing it runs the PASS path: transitions the PRD shipped → verified and posts verification evidence. On a PARTIAL/DIVERGES conformance verdict or any failing empirical check it runs the self-healing FAIL path: it re-opens the PRD shipped → ticketed (NEVER blocked), creates build-ready fix tickets (via tracker-write with build_ready: true) for each missing/incorrect/divergent behavior — registered as the PRD's generated work — and posts a product-readable failure report (with a verification-round count) naming which requirements/ACs failed with observed-vs-expected evidence. The fix tickets auto-build, rollup re-ships the PRD once they are terminal, and a later intake cycle re-verifies — the loop closes itself and never auto-halts. Re-runs are idempotent: evidence/failure-report comments are regenerated in place via a stable sentinel marker (never appended, round incremented), fix tickets are deduped by a stable PRD-ref + requirement marker (referenced/updated, never duplicated), and the lifecycle transition is a no-op when the PRD already carries the target role (exactly one lifecycle label/status remains) — per the prd-lifecycle-rollup idempotency dedupe key (match by stable ref, never by title)."
4
- allowed-tools: ["Skill", "Bash", "Read", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__linear-server__get_project", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_documents", "mcp__linear-server__get_document"]
4
+ allowed-tools: ["Skill", "Bash", "Read", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
5
5
  ---
6
6
 
7
7
  # PRD-level Verification: $ARGUMENTS
@@ -38,7 +38,7 @@ Detect the vendor from `$ARGUMENTS` the same way `prd-ticket-coverage` / `prd-ba
38
38
  | Input shape | Vendor | Read surface |
39
39
  |---|---|---|
40
40
  | `github.com/<org>/<repo>/issues/<n>` or `<org>/<repo>#<n>` | **GitHub Issues** | `gh` CLI (Lisa uses the CLI exclusively for GitHub — no GitHub MCP) |
41
- | `linear.app/...` | **Linear** | `mcp__linear-server__get_project` / `get_issue` |
41
+ | `linear.app/...` | **Linear** | `lisa:linear-access operation: get-project` / `lisa:linear-access operation: get-issue` |
42
42
  | `notion.so` / `notion.site` | **Notion** | `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) |
43
43
  | `*.atlassian.net/wiki/...` | **Confluence** | `mcp__atlassian__getConfluencePage` (+ descendants) |
44
44
  | JIRA issue key (e.g. `PROJ-123`) or `*.atlassian.net/browse/...` | **JIRA** | `mcp__atlassian__getJiraIssue` |
@@ -191,12 +191,28 @@ const ACRONYMS = new Set([
191
191
  "llm",
192
192
  ]);
193
193
 
194
+ /**
195
+ * Brand names whose mixed-case capitalization cannot be reproduced by the
196
+ * simple title-case or all-upper-case rules above.
197
+ *
198
+ * Keys are lower-cased token forms (as they appear split from a kebab skill
199
+ * name). Values are the canonical display spellings. Entries here take
200
+ * precedence over both {@link ACRONYMS} and the default title-case path so
201
+ * that `posthog-access` -> "PostHog Access" rather than "Posthog Access".
202
+ */
203
+ const BRAND_NAMES = new Map([
204
+ ["posthog", "PostHog"],
205
+ ["sonarcloud", "SonarCloud"],
206
+ ]);
207
+
194
208
  /**
195
209
  * Humanize a kebab/snake/space-delimited token into a Title-Cased display name.
196
210
  *
197
211
  * Splits on `-`, `_`, and runs of whitespace, then title-cases each word —
198
- * except tokens in {@link ACRONYMS}, which are upper-cased. This is the rule the
199
- * PRD (#521) specifies for `display_name`: `exploratory-qa` -> "Exploratory QA".
212
+ * except tokens in {@link ACRONYMS}, which are upper-cased, and tokens in
213
+ * {@link BRAND_NAMES}, which are emitted with their canonical spelling.
214
+ * This is the rule the PRD (#521) specifies for `display_name`:
215
+ * `exploratory-qa` -> "Exploratory QA".
200
216
  * Pure: same input always yields the same output.
201
217
  *
202
218
  * @param {string} raw The raw skill/frontmatter name token.
@@ -206,11 +222,16 @@ function humanizeName(raw) {
206
222
  return raw
207
223
  .split(/[-_\s]+/)
208
224
  .filter(word => word.length > 0)
209
- .map(word =>
210
- ACRONYMS.has(word.toLowerCase())
211
- ? word.toUpperCase()
212
- : word.charAt(0).toUpperCase() + word.slice(1)
213
- )
225
+ .map(word => {
226
+ const lower = word.toLowerCase();
227
+ if (BRAND_NAMES.has(lower)) {
228
+ return BRAND_NAMES.get(lower);
229
+ }
230
+ if (ACRONYMS.has(lower)) {
231
+ return word.toUpperCase();
232
+ }
233
+ return word.charAt(0).toUpperCase() + word.slice(1);
234
+ })
214
235
  .join(" ");
215
236
  }
216
237