@codyswann/lisa 2.176.11 → 2.177.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 (96) hide show
  1. package/dist/codex/scripts/setup-jira-cli.sh +34 -0
  2. package/dist/opencode/plugin-templates/lisa-session-bootstrap.ts +34 -4
  3. package/package.json +1 -1
  4. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  5. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  6. package/plugins/lisa/hooks/setup-jira-cli.sh +36 -2
  7. package/plugins/lisa/rules/eager/integration-access-layer.md +10 -0
  8. package/plugins/lisa/rules/reference/integration-access-layer.md +56 -0
  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/posthog-access/SKILL.md +60 -0
  14. package/plugins/lisa/skills/posthog-access/agents/openai.yaml +4 -0
  15. package/plugins/lisa/skills/sentry-access/SKILL.md +56 -0
  16. package/plugins/lisa/skills/sentry-access/agents/openai.yaml +4 -0
  17. package/plugins/lisa/skills/sonarcloud-access/SKILL.md +71 -0
  18. package/plugins/lisa/skills/sonarcloud-access/agents/openai.yaml +4 -0
  19. package/plugins/lisa-agy/plugin.json +1 -1
  20. package/plugins/lisa-agy/skills/jam-access/SKILL.md +51 -0
  21. package/plugins/lisa-agy/skills/linear-access/SKILL.md +90 -0
  22. package/plugins/lisa-agy/skills/posthog-access/SKILL.md +60 -0
  23. package/plugins/lisa-agy/skills/sentry-access/SKILL.md +56 -0
  24. package/plugins/lisa-agy/skills/sonarcloud-access/SKILL.md +71 -0
  25. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  28. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-copilot/hooks/setup-jira-cli.sh +36 -2
  32. package/plugins/lisa-copilot/rules/eager/integration-access-layer.md +10 -0
  33. package/plugins/lisa-copilot/rules/reference/integration-access-layer.md +56 -0
  34. package/plugins/lisa-copilot/skills/jam-access/SKILL.md +51 -0
  35. package/plugins/lisa-copilot/skills/linear-access/SKILL.md +90 -0
  36. package/plugins/lisa-copilot/skills/posthog-access/SKILL.md +60 -0
  37. package/plugins/lisa-copilot/skills/sentry-access/SKILL.md +56 -0
  38. package/plugins/lisa-copilot/skills/sonarcloud-access/SKILL.md +71 -0
  39. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cursor/hooks/setup-jira-cli.sh +36 -2
  41. package/plugins/lisa-cursor/rules/integration-access-layer-reference.mdc +61 -0
  42. package/plugins/lisa-cursor/rules/integration-access-layer.mdc +15 -0
  43. package/plugins/lisa-cursor/skills/jam-access/SKILL.md +51 -0
  44. package/plugins/lisa-cursor/skills/linear-access/SKILL.md +90 -0
  45. package/plugins/lisa-cursor/skills/posthog-access/SKILL.md +60 -0
  46. package/plugins/lisa-cursor/skills/sentry-access/SKILL.md +56 -0
  47. package/plugins/lisa-cursor/skills/sonarcloud-access/SKILL.md +71 -0
  48. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-expo-agy/plugin.json +1 -1
  51. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  56. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  61. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  65. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  66. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  70. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  71. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  75. package/plugins/lisa-rails-agy/plugin.json +1 -1
  76. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  80. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  81. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  85. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  86. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  88. package/plugins/src/base/hooks/setup-jira-cli.sh +36 -2
  89. package/plugins/src/base/rules/eager/integration-access-layer.md +10 -0
  90. package/plugins/src/base/rules/reference/integration-access-layer.md +56 -0
  91. package/plugins/src/base/skills/jam-access/SKILL.md +51 -0
  92. package/plugins/src/base/skills/linear-access/SKILL.md +90 -0
  93. package/plugins/src/base/skills/posthog-access/SKILL.md +60 -0
  94. package/plugins/src/base/skills/sentry-access/SKILL.md +56 -0
  95. package/plugins/src/base/skills/sonarcloud-access/SKILL.md +71 -0
  96. 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.
@@ -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.
@@ -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