@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.
- package/dist/utils/postinstall-trampoline.d.ts +3 -1
- package/dist/utils/postinstall-trampoline.d.ts.map +1 -1
- package/dist/utils/postinstall-trampoline.js +9 -2
- package/dist/utils/postinstall-trampoline.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +63 -0
- package/plugins/lisa/commands/intake.md +3 -3
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +259 -0
- package/plugins/lisa/skills/confluence-to-jira/SKILL.md +318 -0
- package/plugins/lisa/skills/intake/SKILL.md +16 -4
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +53 -4
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +56 -13
- package/plugins/lisa/skills/notion-to-jira/SKILL.md +18 -1
- package/plugins/lisa/skills/plan/SKILL.md +3 -1
- package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +31 -11
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +63 -0
- package/plugins/src/base/commands/intake.md +3 -3
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +259 -0
- package/plugins/src/base/skills/confluence-to-jira/SKILL.md +318 -0
- package/plugins/src/base/skills/intake/SKILL.md +16 -4
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +53 -4
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +56 -13
- package/plugins/src/base/skills/notion-to-jira/SKILL.md +18 -1
- package/plugins/src/base/skills/plan/SKILL.md +3 -1
- 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
|
|
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
|
|
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
|
-
|
|
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
|
|
28
|
-
|
|
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>)
|
|
119
|
-
|
|
120
|
-
|
|
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).
|