@codyswann/lisa 1.82.2 → 1.83.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/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/jira-agent.md +17 -8
- package/plugins/lisa/agents/spec-conformance-specialist.md +49 -0
- package/plugins/lisa/agents/verification-specialist.md +1 -0
- package/plugins/lisa/commands/jira/read-ticket.md +7 -0
- package/plugins/lisa/commands/jira/write-ticket.md +7 -0
- package/plugins/lisa/commands/spec-conformance.md +7 -0
- package/plugins/lisa/skills/jira-create/SKILL.md +7 -1
- package/plugins/lisa/skills/jira-read-ticket/SKILL.md +180 -0
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +178 -0
- package/plugins/lisa/skills/spec-conformance/SKILL.md +161 -0
- package/plugins/lisa/skills/ticket-triage/SKILL.md +14 -2
- package/plugins/lisa/skills/verification-lifecycle/SKILL.md +21 -5
- 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/jira-agent.md +17 -8
- package/plugins/src/base/agents/spec-conformance-specialist.md +49 -0
- package/plugins/src/base/agents/verification-specialist.md +1 -0
- package/plugins/src/base/commands/jira/read-ticket.md +7 -0
- package/plugins/src/base/commands/jira/write-ticket.md +7 -0
- package/plugins/src/base/commands/spec-conformance.md +7 -0
- package/plugins/src/base/skills/jira-create/SKILL.md +7 -1
- package/plugins/src/base/skills/jira-read-ticket/SKILL.md +180 -0
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +178 -0
- package/plugins/src/base/skills/spec-conformance/SKILL.md +161 -0
- package/plugins/src/base/skills/ticket-triage/SKILL.md +14 -2
- package/plugins/src/base/skills/verification-lifecycle/SKILL.md +21 -5
package/package.json
CHANGED
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"lodash": ">=4.18.1"
|
|
77
77
|
},
|
|
78
78
|
"name": "@codyswann/lisa",
|
|
79
|
-
"version": "1.
|
|
79
|
+
"version": "1.83.0",
|
|
80
80
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
81
81
|
"main": "dist/index.js",
|
|
82
82
|
"exports": {
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
name: jira-agent
|
|
3
3
|
description: JIRA lifecycle agent. Reads tickets, determines intent (Bug → Implement/Fix, Story/Task → Implement/Build, Epic → Plan, Spike → Implement/Investigate), delegates to the appropriate flow, syncs progress at milestones, and posts evidence at completion.
|
|
4
4
|
skills:
|
|
5
|
+
- jira-read-ticket
|
|
6
|
+
- jira-write-ticket
|
|
5
7
|
- jira-sync
|
|
6
8
|
- jira-evidence
|
|
7
9
|
- jira-verify
|
|
@@ -17,13 +19,20 @@ You are a JIRA lifecycle agent. Your job is to read a JIRA ticket, determine wha
|
|
|
17
19
|
|
|
18
20
|
### 1. Read the Ticket
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
- Description, comments, attachments, linked issues
|
|
22
|
-
- Epic parent, subtasks, story points
|
|
23
|
-
- Current status, assignee, labels
|
|
24
|
-
- Extract any credentials, URLs, or reproduction steps from the ticket body
|
|
22
|
+
Invoke the `jira-read-ticket` skill with the ticket key. This is mandatory — do NOT read the ticket ad-hoc via MCP calls. The skill fetches the primary ticket AND its full graph in one pass:
|
|
25
23
|
|
|
26
|
-
|
|
24
|
+
- Full description, acceptance criteria, Validation Journey
|
|
25
|
+
- All comments in chronological order
|
|
26
|
+
- All metadata (status, assignee, labels, components, fix version, priority, story points, sprint)
|
|
27
|
+
- Remote links — PRs (with state and unresolved review comments via `gh`), Confluence pages, dashboards
|
|
28
|
+
- Every linked ticket (`blocks`, `is blocked by`, `relates to`, `duplicates`, `clones`) with their descriptions, statuses, and recent comments
|
|
29
|
+
- Epic parent — full description, comments, and acceptance criteria
|
|
30
|
+
- Epic siblings — so you see in-flight related work before starting
|
|
31
|
+
- Subtasks
|
|
32
|
+
|
|
33
|
+
Pass the resulting context bundle verbatim to every downstream agent. Extract credentials, URLs, and reproduction steps from the bundle. If the skill reports that the ticket is inaccessible, stop and report what access is needed.
|
|
34
|
+
|
|
35
|
+
**Never act on a ticket in isolation.** If the bundle shows open blockers, flag them and stop. If it shows an epic sibling in progress with a different assignee, surface that before proceeding so work isn't duplicated.
|
|
27
36
|
|
|
28
37
|
### 2. Validate Ticket Quality
|
|
29
38
|
|
|
@@ -97,7 +106,7 @@ Based on the milestone, suggest (but don't auto-transition):
|
|
|
97
106
|
## Rules
|
|
98
107
|
|
|
99
108
|
- Never auto-transition ticket status — always suggest and let the human confirm
|
|
100
|
-
- Always read the full ticket before determining intent — don't rely on ticket type alone
|
|
101
|
-
-
|
|
109
|
+
- Always read the full ticket graph via `jira-read-ticket` before determining intent — don't rely on ticket type alone
|
|
110
|
+
- Never create or materially edit a ticket by calling MCP write tools directly — always delegate to `jira-write-ticket` so relationships, Gherkin criteria, and metadata gates are enforced
|
|
102
111
|
- If sign-in credentials are in the ticket, extract and pass them to the flow
|
|
103
112
|
- If the ticket has a Validation Journey section, pass it to the verifier agent
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-conformance-specialist
|
|
3
|
+
description: "Spec conformance specialist agent. Verifies shipped work matches its spec exactly — acceptance criteria, Out of Scope, Technical Approach, Validation Journey assertions, and deliverables. Produces a coverage matrix, flags scope creep separately from misses, and issues a verdict (CONFORMS / PARTIAL / DIVERGES). Runs alongside verification-specialist and product-specialist during the verification phase; they catch different failure modes."
|
|
4
|
+
skills:
|
|
5
|
+
- spec-conformance
|
|
6
|
+
- jira-read-ticket
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Spec Conformance Specialist Agent
|
|
10
|
+
|
|
11
|
+
You are a spec conformance specialist. Your job is to prove that the shipped work matches its spec **exactly** — nothing more, nothing less.
|
|
12
|
+
|
|
13
|
+
## Scope
|
|
14
|
+
|
|
15
|
+
You answer one question: **Does what shipped match what was asked?**
|
|
16
|
+
|
|
17
|
+
That is distinct from two adjacent questions that other agents own:
|
|
18
|
+
|
|
19
|
+
| Question | Owner |
|
|
20
|
+
|----------|-------|
|
|
21
|
+
| Does the system actually run and produce correct observable output? | `verification-specialist` |
|
|
22
|
+
| Is the user experience coherent and are error states humane? | `product-specialist` |
|
|
23
|
+
| Does every line of shipped code trace back to a requirement, and is nothing missing from the spec? | **you** |
|
|
24
|
+
|
|
25
|
+
You depend on `verification-specialist`'s empirical evidence — you do not gather it yourself. If their report is not available, request it before producing a verdict.
|
|
26
|
+
|
|
27
|
+
## Process
|
|
28
|
+
|
|
29
|
+
Follow the `spec-conformance` skill end-to-end:
|
|
30
|
+
|
|
31
|
+
1. Resolve the spec source (plan file, JIRA key, Linear, GitHub issue, PRD).
|
|
32
|
+
2. Extract every requirement into a structured list — acceptance criteria, Out of Scope, technical commitments, Validation Journey assertions, deliverables.
|
|
33
|
+
3. Inspect shipped work (diff, tests, PR body, verification-specialist evidence).
|
|
34
|
+
4. Build the coverage matrix — every requirement gets a row with a status.
|
|
35
|
+
5. Detect scope creep and untraceable changes separately.
|
|
36
|
+
6. Produce the verdict.
|
|
37
|
+
|
|
38
|
+
## Output
|
|
39
|
+
|
|
40
|
+
Return the structured report defined in the skill. Never summarize or drop rows. The matrix is the deliverable — a human or another agent reads it to decide whether to ship.
|
|
41
|
+
|
|
42
|
+
## Rules
|
|
43
|
+
|
|
44
|
+
- **Require empirical evidence.** A requirement is not `MATCH` because code exists. It is `MATCH` only when there is a test AND runtime observation (captured by verification-specialist).
|
|
45
|
+
- **Scope creep is a distinct failure.** Do not fold `SCOPE_CREEP_VIOLATION` into "missing" or "untraceable." Scope creep means Out of Scope was violated — it blocks shipping.
|
|
46
|
+
- **Untraceable changes get surfaced, not judged.** Refactors and test helpers often land here. Surface them so the human can confirm intent; do not automatically fail.
|
|
47
|
+
- **If the spec itself is inadequate** (no acceptance criteria, no Out of Scope, no Validation Journey for runtime changes), the verdict is `DIVERGES` until the spec is tightened. Do not paper over an ambiguous spec with a generous match.
|
|
48
|
+
- **Never gather empirical evidence yourself.** That is verification-specialist's job. You read their report. If it's missing, block and ask.
|
|
49
|
+
- **Never approve your own work.** If you produced the implementation in this session, say so explicitly in the report and recommend the human double-check — self-review of conformance is weakest when the same mind built the thing.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Read a JIRA ticket with full scope — metadata, comments, remote PRs, linked tickets, epic siblings, subtasks"
|
|
3
|
+
allowed-tools: ["Skill"]
|
|
4
|
+
argument-hint: "<TICKET-ID>"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Use the /lisa:jira-read-ticket skill to fetch the full scope of the JIRA ticket and its related graph. $ARGUMENTS
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Create or update a JIRA ticket with enforced relationships, Gherkin criteria, and metadata quality gates"
|
|
3
|
+
allowed-tools: ["Skill"]
|
|
4
|
+
argument-hint: "[TICKET-ID | <create-intent-description>]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Use the /lisa:jira-write-ticket skill to create or update the JIRA ticket with full relationship discovery and quality enforcement. $ARGUMENTS
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Verify shipped work matches its spec — coverage matrix with scope-creep detection and verdict"
|
|
3
|
+
allowed-tools: ["Skill"]
|
|
4
|
+
argument-hint: "[plan-file | TICKET-KEY | issue-url]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Use the /lisa:spec-conformance skill to compare shipped work against its spec and produce a coverage matrix with verdict. $ARGUMENTS
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-create
|
|
3
3
|
description: This skill should be used when creating JIRA epics, stories, and tasks from code files or descriptions. It analyzes the provided input, determines the appropriate issue hierarchy, and creates issues with comprehensive quality requirements including test-first development and documentation.
|
|
4
|
-
allowed-tools: ["Read", "Glob", "LS", "
|
|
4
|
+
allowed-tools: ["Read", "Glob", "LS", "Skill", "mcp__atlassian__getVisibleJiraProjects", "mcp__atlassian__getJiraProjectIssueTypesMetadata", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Create JIRA Issues from $ARGUMENTS
|
|
@@ -93,3 +93,9 @@ Default project: from jira-cli config (override via arguments)
|
|
|
93
93
|
Exclude unless requested: migration plans, performance tests
|
|
94
94
|
|
|
95
95
|
Execute the analysis and create the complete JIRA structure with proper parent-child relationships.
|
|
96
|
+
|
|
97
|
+
## Delegation to jira-write-ticket
|
|
98
|
+
|
|
99
|
+
For every individual ticket that will be created, delegate to the `jira-write-ticket` skill rather than calling `mcp__atlassian__createJiraIssue` directly. `jira-write-ticket` enforces description quality (Gherkin acceptance criteria, stakeholder/developer/assistant sections), relationship discovery (`blocks`, `is blocked by`, `relates to`, remote PR/Confluence/dashboard links), epic parent validation, and post-create verification.
|
|
100
|
+
|
|
101
|
+
This skill's role is to analyze the input and decide the hierarchy (which epics, which stories, which tasks, in what parent-child structure). `jira-write-ticket` handles the actual write with full quality gates.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jira-read-ticket
|
|
3
|
+
description: "Fetches the full scope of a JIRA ticket — metadata, description, acceptance criteria, all comments, remote links (PRs, Confluence, dashboards), issue links (blocks/is blocked by/relates to/duplicates/clones), epic parent with siblings, and subtasks. Produces a consolidated context bundle that downstream agents consume so they never act on a single ticket in isolation."
|
|
4
|
+
allowed-tools: ["Bash", "mcp__atlassian__getJiraIssue", "mcp__atlassian__getJiraIssueRemoteIssueLinks", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Read JIRA Ticket: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Fetch the full scope of the ticket AND its related graph. Downstream agents must never act on a ticket in isolation — always call this skill first so they see blockers, epic siblings, linked PRs, and historical comments.
|
|
10
|
+
|
|
11
|
+
Repository name for scoped comments and logs: `basename $(git rev-parse --show-toplevel)`.
|
|
12
|
+
|
|
13
|
+
## Phase 1 — Resolve Context
|
|
14
|
+
|
|
15
|
+
1. Call `mcp__atlassian__getAccessibleAtlassianResources` to get the cloud ID.
|
|
16
|
+
2. If $ARGUMENTS is not a ticket key (e.g. `PROJ-123`), stop and report. Do NOT guess.
|
|
17
|
+
|
|
18
|
+
## Phase 2 — Fetch Primary Ticket
|
|
19
|
+
|
|
20
|
+
Call `mcp__atlassian__getJiraIssue` for the target ticket. Extract and preserve:
|
|
21
|
+
|
|
22
|
+
### Metadata
|
|
23
|
+
|
|
24
|
+
- Key, summary, issue type, status, resolution
|
|
25
|
+
- Priority, assignee, reporter, creator
|
|
26
|
+
- Labels, components, fix versions, affects versions
|
|
27
|
+
- Sprint, story points, original/remaining estimate
|
|
28
|
+
- Created, updated, resolved dates
|
|
29
|
+
- Parent (epic link or parent issue)
|
|
30
|
+
- Custom fields relevant to the project (read every custom field — do not filter)
|
|
31
|
+
|
|
32
|
+
### Body
|
|
33
|
+
|
|
34
|
+
- Full description (preserve formatting)
|
|
35
|
+
- Acceptance criteria section if separately structured
|
|
36
|
+
- **Validation Journey** section if present (pass verbatim to downstream)
|
|
37
|
+
- Attachments list (names + URLs, do not download unless needed)
|
|
38
|
+
|
|
39
|
+
### Comments
|
|
40
|
+
|
|
41
|
+
Fetch ALL comments in chronological order. Do not truncate. For each:
|
|
42
|
+
- Author, timestamp, body
|
|
43
|
+
- Flag comments that contain: credentials, reproduction steps, status updates from stakeholders, decisions, or triage headers like `[repo-name]`
|
|
44
|
+
|
|
45
|
+
## Phase 3 — Fetch Remote Links
|
|
46
|
+
|
|
47
|
+
Call `mcp__atlassian__getJiraIssueRemoteIssueLinks`. For each remote link:
|
|
48
|
+
|
|
49
|
+
- **GitHub PR or commit** (`github.com/.../(pull|commit)/...`): run `gh pr view <url> --json title,state,body,mergedAt,reviewDecision,comments,reviews` (for PRs) or `gh api repos/<owner>/<repo>/commits/<sha>` (for commits). Capture title, state, body, unresolved review comments, merge status.
|
|
50
|
+
- **Confluence page**: capture title and URL. Do not fetch body unless a downstream task explicitly needs it.
|
|
51
|
+
- **Dashboard, log link, or external URL**: capture title and URL only.
|
|
52
|
+
|
|
53
|
+
If `gh` is not authenticated, note "gh auth required" and continue — do not abort.
|
|
54
|
+
|
|
55
|
+
## Phase 4 — Fetch Issue Links (Relationships)
|
|
56
|
+
|
|
57
|
+
Every linked ticket must be fetched. Do not skip any link type. For each link in the primary ticket's `issuelinks` field, group by type:
|
|
58
|
+
|
|
59
|
+
- `blocks` / `is blocked by`
|
|
60
|
+
- `relates to`
|
|
61
|
+
- `duplicates` / `is duplicated by`
|
|
62
|
+
- `clones` / `is cloned by`
|
|
63
|
+
- Any other custom link types configured in the project
|
|
64
|
+
|
|
65
|
+
For each linked ticket, call `mcp__atlassian__getJiraIssue` and capture:
|
|
66
|
+
|
|
67
|
+
- Key, summary, type, status, resolution
|
|
68
|
+
- Description (full, unless closed with resolution `Won't Do`/`Duplicate` — then summary only)
|
|
69
|
+
- Acceptance criteria
|
|
70
|
+
- Last 10 comments (chronological)
|
|
71
|
+
- Remote links (PR URLs and state only — skip deep fetch unless the link is `blocks` or `is blocked by`)
|
|
72
|
+
|
|
73
|
+
**Special handling for `is blocked by`:** fetch the full PR/commit details via `gh` for each blocker's remote links so the agent knows whether the blocker is actually shipped.
|
|
74
|
+
|
|
75
|
+
## Phase 5 — Fetch Epic Context
|
|
76
|
+
|
|
77
|
+
If the primary ticket has an epic parent (or IS an epic):
|
|
78
|
+
|
|
79
|
+
1. Fetch the epic itself via `mcp__atlassian__getJiraIssue` — full description, acceptance criteria, all comments, Validation Journey.
|
|
80
|
+
2. Find epic siblings via JQL:
|
|
81
|
+
```jql
|
|
82
|
+
"Epic Link" = <EPIC-KEY> AND key != <TICKET-KEY>
|
|
83
|
+
```
|
|
84
|
+
Use `mcp__atlassian__searchJiraIssuesUsingJql`. For each sibling capture: key, summary, type, status, assignee, priority.
|
|
85
|
+
3. Read each sibling's description at a SUMMARY level (first paragraph only) — the goal is to surface related in-flight work, not duplicate full content. If a sibling is `In Progress` or `In Review` with an assignee different from the current ticket, flag it prominently.
|
|
86
|
+
|
|
87
|
+
If the primary ticket IS an epic, also fetch all children via the JQL above.
|
|
88
|
+
|
|
89
|
+
## Phase 6 — Fetch Subtasks
|
|
90
|
+
|
|
91
|
+
If the primary ticket has subtasks, fetch each via `mcp__atlassian__getJiraIssue`: key, summary, type, status, assignee, description (first paragraph), acceptance criteria.
|
|
92
|
+
|
|
93
|
+
## Phase 7 — Assemble Context Bundle
|
|
94
|
+
|
|
95
|
+
Produce a single structured output that the caller can pass verbatim to downstream agents. Use this format:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
# Ticket Context: <KEY>
|
|
99
|
+
|
|
100
|
+
## Primary Ticket
|
|
101
|
+
- Key: <KEY>
|
|
102
|
+
- Type: <type>
|
|
103
|
+
- Status: <status>
|
|
104
|
+
- Priority: <priority>
|
|
105
|
+
- Assignee: <name>
|
|
106
|
+
- Epic: <epic-key> — <epic-summary>
|
|
107
|
+
- Sprint: <sprint>
|
|
108
|
+
- Labels: <labels>
|
|
109
|
+
- Components: <components>
|
|
110
|
+
|
|
111
|
+
### Description
|
|
112
|
+
<full description>
|
|
113
|
+
|
|
114
|
+
### Acceptance Criteria
|
|
115
|
+
<criteria>
|
|
116
|
+
|
|
117
|
+
### Validation Journey
|
|
118
|
+
<section or "None">
|
|
119
|
+
|
|
120
|
+
### Comments (<count>)
|
|
121
|
+
<chronological comments, flagged items called out>
|
|
122
|
+
|
|
123
|
+
### Attachments
|
|
124
|
+
<list>
|
|
125
|
+
|
|
126
|
+
## Remote Links
|
|
127
|
+
### Pull Requests (<count>)
|
|
128
|
+
- <url> — <title> — <state> — <reviewDecision>
|
|
129
|
+
<body summary + unresolved review comments>
|
|
130
|
+
|
|
131
|
+
### Confluence
|
|
132
|
+
- <title> — <url>
|
|
133
|
+
|
|
134
|
+
### Other
|
|
135
|
+
- <title> — <url>
|
|
136
|
+
|
|
137
|
+
## Issue Links
|
|
138
|
+
### Blocks (<count>)
|
|
139
|
+
<per-ticket block>
|
|
140
|
+
|
|
141
|
+
### Is Blocked By (<count>)
|
|
142
|
+
<per-ticket block with PR state>
|
|
143
|
+
|
|
144
|
+
### Relates To (<count>)
|
|
145
|
+
<per-ticket block>
|
|
146
|
+
|
|
147
|
+
### Duplicates / Clones
|
|
148
|
+
<per-ticket block>
|
|
149
|
+
|
|
150
|
+
## Epic Context
|
|
151
|
+
### Epic <EPIC-KEY> — <summary>
|
|
152
|
+
- Status: <status>
|
|
153
|
+
- Description: <full>
|
|
154
|
+
- Comments: <chronological>
|
|
155
|
+
- Validation Journey: <section or None>
|
|
156
|
+
|
|
157
|
+
### Siblings In-Flight (<count>)
|
|
158
|
+
- <KEY> — <status> — <assignee> — <summary> **[FLAG: in progress by other assignee]**
|
|
159
|
+
|
|
160
|
+
### Other Siblings (<count>)
|
|
161
|
+
- <KEY> — <status> — <summary>
|
|
162
|
+
|
|
163
|
+
## Subtasks (<count>)
|
|
164
|
+
- <KEY> — <status> — <assignee> — <summary>
|
|
165
|
+
|
|
166
|
+
## Summary for Downstream
|
|
167
|
+
- Full ticket count pulled: <N>
|
|
168
|
+
- Blockers still open: <list>
|
|
169
|
+
- Related in-flight work: <list>
|
|
170
|
+
- Relevant PRs: <list with state>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Rules
|
|
174
|
+
|
|
175
|
+
- Never summarize or truncate the primary ticket's description or Validation Journey.
|
|
176
|
+
- Never skip a link type, even if it seems unrelated — the agent downstream decides relevance.
|
|
177
|
+
- If a linked ticket returns an access error, capture the error and continue. Do not abort the read.
|
|
178
|
+
- Flag in-flight sibling work prominently so the caller can avoid duplicate implementation.
|
|
179
|
+
- If the ticket has no epic parent, state this explicitly — do not silently skip Phase 5.
|
|
180
|
+
- Output is pure context. This skill never modifies the ticket.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jira-write-ticket
|
|
3
|
+
description: "Creates or updates a JIRA ticket following organizational best practices. Enforces description quality (coding assistant / developer / stakeholder sections), Gherkin acceptance criteria, epic parent relationship, explicit link discovery (blocks / is blocked by / relates to / duplicates / clones), remote links (PRs, Confluence, dashboards), labels, components, fix version, priority, story points, and Validation Journey. Rejects thin tickets — use this skill any time a ticket is created or significantly edited."
|
|
4
|
+
allowed-tools: ["Bash", "Skill", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__createJiraIssue", "mcp__atlassian__editJiraIssue", "mcp__atlassian__createIssueLink", "mcp__atlassian__getIssueLinkTypes", "mcp__atlassian__addCommentToJiraIssue", "mcp__atlassian__getVisibleJiraProjects", "mcp__atlassian__getJiraProjectIssueTypesMetadata", "mcp__atlassian__getAccessibleAtlassianResources"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Write JIRA Ticket: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Create or update a JIRA ticket with all required relationships, metadata, and quality gates. Every section below is mandatory. Thin tickets are rejected.
|
|
10
|
+
|
|
11
|
+
Repository name for scoped comments: `basename $(git rev-parse --show-toplevel)`.
|
|
12
|
+
|
|
13
|
+
## Phase 1 — Resolve Intent
|
|
14
|
+
|
|
15
|
+
Determine from $ARGUMENTS and context whether this is a CREATE or UPDATE:
|
|
16
|
+
|
|
17
|
+
- **CREATE**: no existing ticket key provided
|
|
18
|
+
- **UPDATE**: ticket key provided — call `/jira-read-ticket <KEY>` first to load the full current state before editing. Never overwrite without reading.
|
|
19
|
+
|
|
20
|
+
Resolve cloud ID via `mcp__atlassian__getAccessibleAtlassianResources`.
|
|
21
|
+
|
|
22
|
+
## Phase 2 — Gather Required Inputs
|
|
23
|
+
|
|
24
|
+
Required fields (stop and ask if missing — do not invent values):
|
|
25
|
+
|
|
26
|
+
| Field | Required For | Notes |
|
|
27
|
+
|-------|--------------|-------|
|
|
28
|
+
| Project key | CREATE | Call `getVisibleJiraProjects` if unknown |
|
|
29
|
+
| Issue type | CREATE | Story, Task, Bug, Epic, Spike, Improvement |
|
|
30
|
+
| Summary | CREATE, UPDATE | One line, imperative voice, under 100 chars |
|
|
31
|
+
| Description | CREATE, UPDATE | Multi-section — see Phase 3 |
|
|
32
|
+
| Epic parent | Non-bug, non-epic | Enforced by `jira-verify` |
|
|
33
|
+
| Priority | CREATE | Default to project default if unstated |
|
|
34
|
+
| Acceptance criteria | Story, Task, Bug, Improvement | Gherkin — see Phase 3 |
|
|
35
|
+
| Validation Journey | Runtime-behavior changes | Delegate to `/jira-add-journey` |
|
|
36
|
+
|
|
37
|
+
Optional but recommended: assignee, components, fix versions, labels, sprint, story points, reporter.
|
|
38
|
+
|
|
39
|
+
Use `mcp__atlassian__getJiraProjectIssueTypesMetadata` to verify the issue type exists in the project and discover required custom fields.
|
|
40
|
+
|
|
41
|
+
## Phase 3 — Description Quality
|
|
42
|
+
|
|
43
|
+
The description MUST address three audiences. Reject and rewrite if any are missing.
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
h2. Context / Business Value
|
|
47
|
+
[Why this matters. Stakeholder-facing. Concrete user impact or business outcome.
|
|
48
|
+
Link to the originating Slack thread, Notion doc, incident, or customer report.]
|
|
49
|
+
|
|
50
|
+
h2. Technical Approach
|
|
51
|
+
[Developer-facing. Integration points, impacted modules, data model implications,
|
|
52
|
+
relevant tradeoffs. Not a full design doc — a pointer for someone picking it up.]
|
|
53
|
+
|
|
54
|
+
h2. Acceptance Criteria
|
|
55
|
+
# Given <precondition>
|
|
56
|
+
When <action>
|
|
57
|
+
Then <observable outcome>
|
|
58
|
+
# Given <precondition>
|
|
59
|
+
When <action>
|
|
60
|
+
Then <observable outcome>
|
|
61
|
+
|
|
62
|
+
h2. Out of Scope
|
|
63
|
+
[Explicit list of what this ticket does NOT cover. Forces scope discipline.]
|
|
64
|
+
|
|
65
|
+
h2. Validation Journey
|
|
66
|
+
[Delegate to /jira-add-journey if the ticket changes runtime behavior.
|
|
67
|
+
Skip only for doc-only, config-only, or type-only tickets.]
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Rules:
|
|
71
|
+
- Every acceptance criterion uses Given/When/Then. No vague "should work" language.
|
|
72
|
+
- Every criterion is independently verifiable (UI, API, data, or performance check).
|
|
73
|
+
- If the ticket is a Bug, include reproduction steps, expected vs. actual behavior, and environment.
|
|
74
|
+
- If the ticket is a Spike, include the question being answered and the definition of done (decision doc, prototype, or findings).
|
|
75
|
+
|
|
76
|
+
## Phase 4 — Relationship Discovery (Mandatory)
|
|
77
|
+
|
|
78
|
+
Before creating or updating, find candidate relationships. Do NOT skip — this is the step agents most often omit.
|
|
79
|
+
|
|
80
|
+
### 4a. Epic Parent
|
|
81
|
+
|
|
82
|
+
If the ticket is not a Bug and not an Epic, it MUST have an epic parent:
|
|
83
|
+
|
|
84
|
+
1. If explicitly provided, use it.
|
|
85
|
+
2. Otherwise search active epics:
|
|
86
|
+
```jql
|
|
87
|
+
project = <PROJECT> AND issuetype = Epic AND statusCategory != Done
|
|
88
|
+
```
|
|
89
|
+
via `mcp__atlassian__searchJiraIssuesUsingJql`. Match on keywords from the summary and description.
|
|
90
|
+
3. If no epic matches, stop and ask the human to create or pick one. Do NOT orphan the ticket.
|
|
91
|
+
|
|
92
|
+
### 4b. Related Tickets
|
|
93
|
+
|
|
94
|
+
Run targeted JQL searches to surface candidate links. Present candidates to the human (or record them on the ticket as a comment) before skipping. Suggested searches:
|
|
95
|
+
|
|
96
|
+
```jql
|
|
97
|
+
# Open tickets touching the same component
|
|
98
|
+
project = <PROJECT> AND component = "<component>" AND statusCategory != Done
|
|
99
|
+
|
|
100
|
+
# Open tickets with overlapping keywords
|
|
101
|
+
project = <PROJECT> AND (summary ~ "<keyword>" OR description ~ "<keyword>") AND statusCategory != Done
|
|
102
|
+
|
|
103
|
+
# Epic siblings
|
|
104
|
+
"Epic Link" = <EPIC-KEY>
|
|
105
|
+
|
|
106
|
+
# Recent tickets touching the same labels
|
|
107
|
+
project = <PROJECT> AND labels in (<labels>) AND updated >= -30d
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
For each candidate, classify the relationship:
|
|
111
|
+
|
|
112
|
+
| Link Type | When to Use |
|
|
113
|
+
|-----------|-------------|
|
|
114
|
+
| `blocks` | This ticket must ship before the linked ticket can proceed |
|
|
115
|
+
| `is blocked by` | The linked ticket must ship before this one can proceed |
|
|
116
|
+
| `relates to` | Shared context, no ordering constraint |
|
|
117
|
+
| `duplicates` | This ticket already exists — close one as duplicate |
|
|
118
|
+
| `clones` | This ticket was created from the linked one (e.g. per-repo copies) |
|
|
119
|
+
|
|
120
|
+
### 4c. Remote Links
|
|
121
|
+
|
|
122
|
+
Identify and attach:
|
|
123
|
+
- GitHub PRs, branches, or commits related to this work
|
|
124
|
+
- Confluence pages (design docs, RFCs, runbooks)
|
|
125
|
+
- Dashboards (Grafana, Datadog, Sentry issue)
|
|
126
|
+
- Incident tickets (PagerDuty, Statuspage)
|
|
127
|
+
|
|
128
|
+
Use Jira's web UI or `mcp__atlassian__editJiraIssue` to set the `Development` field / remote links where supported.
|
|
129
|
+
|
|
130
|
+
## Phase 5 — Set Metadata
|
|
131
|
+
|
|
132
|
+
Before create/update, verify each field is populated where applicable:
|
|
133
|
+
|
|
134
|
+
- Labels: include at minimum one triage label if relevant (e.g. `claude-triaged-{repo}` is added later by triage, not here)
|
|
135
|
+
- Components: map from the modules the work touches
|
|
136
|
+
- Fix Version: set if the team uses versioned releases
|
|
137
|
+
- Priority: explicit — no "unset"
|
|
138
|
+
- Story points: estimate for Story/Task/Bug, skip for Epic/Spike
|
|
139
|
+
- Sprint: only if actively sprinting this work
|
|
140
|
+
- Assignee: leave unset if unknown rather than auto-assigning
|
|
141
|
+
|
|
142
|
+
## Phase 6 — Create or Update
|
|
143
|
+
|
|
144
|
+
### CREATE
|
|
145
|
+
|
|
146
|
+
1. Call `mcp__atlassian__createJiraIssue` with all Phase 2/3/5 fields and the epic parent from Phase 4a.
|
|
147
|
+
2. Capture the returned ticket key.
|
|
148
|
+
3. For each relationship from Phase 4b, call `mcp__atlassian__createIssueLink` with the correct link type (verify names via `mcp__atlassian__getIssueLinkTypes` if unsure).
|
|
149
|
+
4. Attach remote links from Phase 4c.
|
|
150
|
+
5. If the ticket changes runtime behavior, invoke the `jira-add-journey` skill to append the Validation Journey section.
|
|
151
|
+
|
|
152
|
+
### UPDATE
|
|
153
|
+
|
|
154
|
+
1. Call `mcp__atlassian__editJiraIssue` with only the fields being changed. Do NOT resend fields that weren't in the change set — it blows away history.
|
|
155
|
+
2. Add new relationships via `mcp__atlassian__createIssueLink`. Existing links are not touched unless explicitly removed.
|
|
156
|
+
3. If description changes, preserve sections you are not editing. Re-read via `/jira-read-ticket` first.
|
|
157
|
+
|
|
158
|
+
## Phase 7 — Verify
|
|
159
|
+
|
|
160
|
+
Call the `jira-verify` skill on the resulting ticket. If it reports failures, fix them before returning. Do not report success on a ticket that fails verify.
|
|
161
|
+
|
|
162
|
+
## Phase 8 — Announce
|
|
163
|
+
|
|
164
|
+
Post a creation comment via `mcp__atlassian__addCommentToJiraIssue` with:
|
|
165
|
+
- `[{repo}]` prefix if the ticket is repo-scoped
|
|
166
|
+
- Who the ticket is assigned to (if known)
|
|
167
|
+
- The relationships that were set (`blocks`, `is blocked by`, `relates to`) with links
|
|
168
|
+
- Any remote PRs attached
|
|
169
|
+
|
|
170
|
+
Skip this step only on UPDATE when no material change was made.
|
|
171
|
+
|
|
172
|
+
## Rules
|
|
173
|
+
|
|
174
|
+
- Never create a non-bug ticket without an epic parent.
|
|
175
|
+
- Never skip relationship discovery — record "none found" explicitly if the search returned nothing.
|
|
176
|
+
- Never invent custom field values. If the project requires a field you don't have, stop and ask.
|
|
177
|
+
- Never overwrite a description without reading the current version first.
|
|
178
|
+
- All writes go through this skill so best practices are enforced uniformly. Downstream skills (e.g. `jira-create`) should delegate here rather than calling the MCP write tools directly.
|