@codyswann/lisa 2.2.0 → 2.4.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 (31) hide show
  1. package/dist/utils/postinstall-trampoline.d.ts +3 -1
  2. package/dist/utils/postinstall-trampoline.d.ts.map +1 -1
  3. package/dist/utils/postinstall-trampoline.js +9 -2
  4. package/dist/utils/postinstall-trampoline.js.map +1 -1
  5. package/package.json +1 -1
  6. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  7. package/plugins/lisa/agents/confluence-prd-intake.md +63 -0
  8. package/plugins/lisa/commands/intake.md +3 -3
  9. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +259 -0
  10. package/plugins/lisa/skills/confluence-to-jira/SKILL.md +318 -0
  11. package/plugins/lisa/skills/intake/SKILL.md +16 -4
  12. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +53 -4
  13. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +56 -13
  14. package/plugins/lisa/skills/notion-to-jira/SKILL.md +18 -1
  15. package/plugins/lisa/skills/plan/SKILL.md +3 -1
  16. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +31 -11
  17. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  22. package/plugins/src/base/agents/confluence-prd-intake.md +63 -0
  23. package/plugins/src/base/commands/intake.md +3 -3
  24. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +259 -0
  25. package/plugins/src/base/skills/confluence-to-jira/SKILL.md +318 -0
  26. package/plugins/src/base/skills/intake/SKILL.md +16 -4
  27. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +53 -4
  28. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +56 -13
  29. package/plugins/src/base/skills/notion-to-jira/SKILL.md +18 -1
  30. package/plugins/src/base/skills/plan/SKILL.md +3 -1
  31. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +31 -11
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: prd-ticket-coverage
3
- description: "Verifies that every requirement in a Notion PRD is covered by at least one created JIRA ticket — no silent drops. Parses the PRD into atomic items (goals, user stories, functional/non-functional requirements, acceptance criteria, important notes), maps each to the created tickets, and produces a coverage matrix and verdict (COMPLETE / COMPLETE_WITH_SCOPE_CREEP / GAPS_FOUND / NO_TICKETS_FOUND). Used by notion-prd-intake post-write to gate the Status=Ticketed transition; can also be invoked standalone for after-the-fact audits."
4
- allowed-tools: ["Skill", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
3
+ description: "Verifies that every requirement in a PRD (Notion or Confluence) is covered by at least one created JIRA ticket — no silent drops. Parses the PRD into atomic items (goals, user stories, functional/non-functional requirements, acceptance criteria, important notes), maps each to the created tickets, and produces a coverage matrix and verdict (COMPLETE / COMPLETE_WITH_SCOPE_CREEP / GAPS_FOUND / NO_TICKETS_FOUND). Used by notion-prd-intake / confluence-prd-intake post-write to gate the Ticketed transition; can also be invoked standalone for after-the-fact audits."
4
+ allowed-tools: ["Skill", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
5
5
  ---
6
6
 
7
7
  # PRD Ticket Coverage Audit: $ARGUMENTS
@@ -9,9 +9,16 @@ allowed-tools: ["Skill", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_
9
9
  `$ARGUMENTS` is one of:
10
10
 
11
11
  1. A PRD URL alone — auto-discover created tickets via the PRD's epic remote link.
12
- 2. A PRD URL plus an explicit list of ticket keys — `<PRD URL> tickets=[KEY-1,KEY-2,...]`. Use this when called from `lisa:notion-prd-intake` (which knows the keys it just created).
12
+ 2. A PRD URL plus an explicit list of ticket keys — `<PRD URL> tickets=[KEY-1,KEY-2,...]`. Use this when called from `lisa:notion-prd-intake` or `lisa:confluence-prd-intake` (which know the keys they just created).
13
13
 
14
- Verify that every atomic item in the PRD is covered by at least one of the listed/discovered JIRA tickets. The output gates whether the PRD's `Status` should remain `Ticketed` or revert to `Blocked`.
14
+ The PRD URL can be a **Notion page URL** or a **Confluence page URL**. Detect the vendor from the host:
15
+
16
+ - `notion.so` / `notion.site` → Notion. Fetch with `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) and `mcp__claude_ai_Notion__notion-get-comments`.
17
+ - Atlassian Confluence host (e.g. `*.atlassian.net/wiki/...`) → Confluence. Fetch with `mcp__atlassian__getConfluencePage`, `mcp__atlassian__getConfluencePageDescendants` (for child epic pages), `mcp__atlassian__getConfluencePageFooterComments`, `mcp__atlassian__getConfluencePageInlineComments`, and `mcp__atlassian__getConfluenceCommentChildren` for nested replies.
18
+
19
+ Both vendors produce the same downstream artifact-extraction and coverage-matrix logic — only the fetch surface differs. The rest of this skill is vendor-agnostic.
20
+
21
+ Verify that every atomic item in the PRD is covered by at least one of the listed/discovered JIRA tickets. The output gates whether the PRD's lifecycle should remain at `Ticketed` (Notion `Status = Ticketed`, Confluence `prd-ticketed` label) or revert to `Blocked`.
15
22
 
16
23
  ## Why this exists
17
24
 
@@ -22,12 +29,17 @@ Per-ticket gates (`lisa:jira-validate-ticket`) prove each created ticket is well
22
29
  ### Phase 1 — Resolve inputs
23
30
 
24
31
  1. Parse `$ARGUMENTS`:
25
- - PRD URL → extract page ID.
32
+ - PRD URL → detect vendor from host, extract page ID.
26
33
  - Optional `tickets=[...]` → list of explicit ticket keys.
27
- 2. Fetch the PRD via `notion-fetch` with `include_discussions: true`. Capture: title, body, child Epic pages, all comment threads.
28
- 3. If the PRD has child Epic sub-pages (a multi-epic PRD like Home revamp), fetch each in parallel with `include_discussions: true`. The audit walks the full PRD tree.
34
+ 2. Fetch the PRD using the vendor-appropriate tool surface:
35
+ - **Notion**: `notion-fetch` with `include_discussions: true`. Capture: title, body, child Epic pages, all comment threads.
36
+ - **Confluence**: `getConfluencePage` (capture title, body, labels), `getConfluencePageFooterComments` + `getConfluencePageInlineComments` (capture all comments; walk replies via `getConfluenceCommentChildren` for any thread with children).
37
+ 3. If the PRD has child Epic sub-pages (a multi-epic PRD), fetch each in parallel:
38
+ - **Notion**: `notion-fetch` per child page with `include_discussions: true`.
39
+ - **Confluence**: enumerate descendants via `getConfluencePageDescendants`, then `getConfluencePage` per child plus its comment streams.
40
+ The audit walks the full PRD tree.
29
41
  4. If `tickets=[...]` not provided, locate the JIRA epic by:
30
- - Looking for a JIRA URL in the PRD body, comments, or the PRD's most recent "Ticketed by Claude" comment posted by `lisa:notion-prd-intake`.
42
+ - Looking for a JIRA URL in the PRD body, comments, or the PRD's most recent "Ticketed by Claude" comment posted by `lisa:notion-prd-intake` / `lisa:confluence-prd-intake`.
31
43
  - Searching JIRA via `searchJiraIssuesUsingJql` for an epic whose summary or description references the PRD title or page ID.
32
44
  - If no epic found, return verdict `NO_TICKETS_FOUND` with a clear remediation — coverage cannot be assessed without the ticket set.
33
45
  5. Once the epic is known, fetch all child stories and sub-tasks via JQL: `"Epic Link" = <EPIC-KEY>` and recursively for sub-tasks.
@@ -115,9 +127,13 @@ Atomic PRD items extracted: <n>
115
127
  | ... | ... |
116
128
 
117
129
  ### Gaps (PRD items with zero ticket coverage — blocks Ticketed status)
118
- - <item-id> (<type>) — <text>
119
- - *Source:* <PRD section reference>
120
- - *Suggested fix:* <add a ticket scoped to X / extend ticket Y to cover this / clarify whether this is in scope>
130
+ - item: <item-id> (<type>)
131
+ text: <text>
132
+ prd_section: "<heading text from the PRD>"
133
+ prd_anchor: "<first ~10 chars>...<last ~10 chars>" # for selection_with_ellipsis; null if no specific section
134
+ category: <product-clarity|acceptance-criteria|design-ux|scope|dependency|data|technical|structural>
135
+ what: <plain-language description of the gap, no JIRA jargon — written for the product team>
136
+ recommendation: <1–3 candidate resolutions: add a ticket scoped to X / extend ticket Y to cover this / mark out-of-scope explicitly. Never "clarify this".>
121
137
 
122
138
  ### Scope creep (tickets without PRD trace — informational, does not block)
123
139
  - <ticket-key> — <summary>
@@ -128,6 +144,10 @@ Atomic PRD items extracted: <n>
128
144
  ### Scope-creep count: <n>
129
145
  ```
130
146
 
147
+ `prd_anchor` and `prd_section` are built the same way as in `lisa:notion-to-jira` / `lisa:confluence-to-jira`. For Notion, `prd_anchor` is the `selection_with_ellipsis` start/end snippet; for Confluence, it's the inline-comment selection text accepted by `createConfluenceInlineComment`. The downstream caller knows which vendor it's writing to and uses the right API; this skill just emits the anchor that vendor expects. Set both to `null` only when the gap is not anchored to any specific section (rare).
148
+
149
+ `category` is drawn from the same fixed taxonomy used by `lisa:jira-validate-ticket` so downstream callers can apply one consistent comment-formatting policy. Most coverage gaps map to `scope` (item not represented in any ticket) or `product-clarity` (item too vague to map). Use `acceptance-criteria` for missing pass/fail conditions and `design-ux` for missing visuals.
150
+
131
151
  ## Rules
132
152
 
133
153
  - Read-only — never write to JIRA, never write to Notion (callers do that based on the verdict).