@codyswann/lisa 2.21.0 → 2.23.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 +3 -2
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/confluence-prd-intake.md +11 -9
- package/plugins/lisa/agents/github-agent.md +18 -10
- package/plugins/lisa/agents/github-build-intake.md +10 -8
- package/plugins/lisa/agents/github-prd-intake.md +11 -9
- package/plugins/lisa/agents/jira-agent.md +12 -8
- package/plugins/lisa/agents/jira-build-intake.md +9 -7
- package/plugins/lisa/agents/linear-agent.md +15 -9
- package/plugins/lisa/agents/linear-build-intake.md +13 -11
- package/plugins/lisa/agents/linear-prd-intake.md +11 -9
- package/plugins/lisa/agents/notion-prd-intake.md +11 -9
- package/plugins/lisa/commands/setup/atlassian.md +7 -0
- package/plugins/lisa/commands/setup/confluence.md +7 -0
- package/plugins/lisa/commands/setup/jira.md +7 -0
- package/plugins/lisa/commands/setup/notion.md +7 -0
- package/plugins/lisa/rules/base-rules.md +2 -2
- package/plugins/lisa/rules/config-resolution.md +242 -24
- package/plugins/lisa/rules/repo-scope-split.md +41 -0
- package/plugins/lisa/rules/verification.md +13 -0
- package/plugins/lisa/skills/atlassian-access/SKILL.md +260 -0
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +167 -82
- package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +39 -26
- package/plugins/lisa/skills/git-submit-pr/SKILL.md +1 -1
- package/plugins/lisa/skills/github-add-journey/SKILL.md +1 -0
- package/plugins/lisa/skills/github-build-intake/SKILL.md +104 -40
- package/plugins/lisa/skills/github-evidence/SKILL.md +22 -5
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +87 -51
- package/plugins/lisa/skills/github-to-tracker/SKILL.md +2 -2
- package/plugins/lisa/skills/github-validate-issue/SKILL.md +11 -1
- package/plugins/lisa/skills/jira-add-journey/SKILL.md +1 -0
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +110 -45
- package/plugins/lisa/skills/jira-create/SKILL.md +5 -3
- package/plugins/lisa/skills/jira-evidence/SKILL.md +19 -2
- package/plugins/lisa/skills/jira-journey/SKILL.md +3 -1
- package/plugins/lisa/skills/jira-read-ticket/SKILL.md +10 -8
- package/plugins/lisa/skills/jira-sync/SKILL.md +11 -5
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +22 -10
- package/plugins/lisa/skills/jira-verify/SKILL.md +5 -3
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +16 -14
- package/plugins/lisa/skills/linear-add-journey/SKILL.md +1 -0
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +90 -32
- package/plugins/lisa/skills/linear-evidence/SKILL.md +22 -5
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +92 -57
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +10 -0
- package/plugins/lisa/skills/notion-access/SKILL.md +193 -0
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +105 -46
- package/plugins/lisa/skills/notion-to-tracker/SKILL.md +7 -5
- package/plugins/lisa/skills/setup-atlassian/SKILL.md +316 -0
- package/plugins/lisa/skills/setup-confluence/SKILL.md +245 -0
- package/plugins/lisa/skills/setup-jira/SKILL.md +198 -0
- package/plugins/lisa/skills/setup-notion/SKILL.md +283 -0
- package/plugins/lisa/skills/task-decomposition/SKILL.md +2 -0
- package/plugins/lisa/skills/ticket-triage/SKILL.md +4 -1
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +1 -0
- package/plugins/lisa/skills/verification-lifecycle/SKILL.md +2 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +11 -9
- package/plugins/src/base/agents/github-agent.md +18 -10
- package/plugins/src/base/agents/github-build-intake.md +10 -8
- package/plugins/src/base/agents/github-prd-intake.md +11 -9
- package/plugins/src/base/agents/jira-agent.md +12 -8
- package/plugins/src/base/agents/jira-build-intake.md +9 -7
- package/plugins/src/base/agents/linear-agent.md +15 -9
- package/plugins/src/base/agents/linear-build-intake.md +13 -11
- package/plugins/src/base/agents/linear-prd-intake.md +11 -9
- package/plugins/src/base/agents/notion-prd-intake.md +11 -9
- package/plugins/src/base/commands/setup/atlassian.md +7 -0
- package/plugins/src/base/commands/setup/confluence.md +7 -0
- package/plugins/src/base/commands/setup/jira.md +7 -0
- package/plugins/src/base/commands/setup/notion.md +7 -0
- package/plugins/src/base/rules/base-rules.md +2 -2
- package/plugins/src/base/rules/config-resolution.md +242 -24
- package/plugins/src/base/rules/repo-scope-split.md +41 -0
- package/plugins/src/base/rules/verification.md +13 -0
- package/plugins/src/base/skills/atlassian-access/SKILL.md +260 -0
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +167 -82
- package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +39 -26
- package/plugins/src/base/skills/git-submit-pr/SKILL.md +1 -1
- package/plugins/src/base/skills/github-add-journey/SKILL.md +1 -0
- package/plugins/src/base/skills/github-build-intake/SKILL.md +104 -40
- package/plugins/src/base/skills/github-evidence/SKILL.md +22 -5
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +87 -51
- package/plugins/src/base/skills/github-to-tracker/SKILL.md +2 -2
- package/plugins/src/base/skills/github-validate-issue/SKILL.md +11 -1
- package/plugins/src/base/skills/jira-add-journey/SKILL.md +1 -0
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +110 -45
- package/plugins/src/base/skills/jira-create/SKILL.md +5 -3
- package/plugins/src/base/skills/jira-evidence/SKILL.md +19 -2
- package/plugins/src/base/skills/jira-journey/SKILL.md +3 -1
- package/plugins/src/base/skills/jira-read-ticket/SKILL.md +10 -8
- package/plugins/src/base/skills/jira-sync/SKILL.md +11 -5
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +22 -10
- package/plugins/src/base/skills/jira-verify/SKILL.md +5 -3
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +16 -14
- package/plugins/src/base/skills/linear-add-journey/SKILL.md +1 -0
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +90 -32
- package/plugins/src/base/skills/linear-evidence/SKILL.md +22 -5
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +92 -57
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +10 -0
- package/plugins/src/base/skills/notion-access/SKILL.md +193 -0
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +105 -46
- package/plugins/src/base/skills/notion-to-tracker/SKILL.md +7 -5
- package/plugins/src/base/skills/setup-atlassian/SKILL.md +316 -0
- package/plugins/src/base/skills/setup-confluence/SKILL.md +245 -0
- package/plugins/src/base/skills/setup-jira/SKILL.md +198 -0
- package/plugins/src/base/skills/setup-notion/SKILL.md +283 -0
- package/plugins/src/base/skills/task-decomposition/SKILL.md +2 -0
- package/plugins/src/base/skills/ticket-triage/SKILL.md +4 -1
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +1 -0
- package/plugins/src/base/skills/verification-lifecycle/SKILL.md +2 -0
- package/scripts/check-plugins-sync.sh +45 -0
|
@@ -20,7 +20,7 @@ This skill is the GitHub counterpart of `lisa:notion-to-tracker` / `lisa:conflue
|
|
|
20
20
|
|
|
21
21
|
## What "PRD" means in GitHub Issues
|
|
22
22
|
|
|
23
|
-
GitHub Issues has no native "PRD" entity. This skill treats a single GitHub Issue (carrying the `prd-ready`
|
|
23
|
+
GitHub Issues has no native "PRD" entity. This skill treats a single GitHub Issue (carrying the configured `ready` PRD label — `github.labels.prd.ready`, default `prd-ready`) as the PRD container:
|
|
24
24
|
|
|
25
25
|
- **Issue body** (markdown) is the PRD body — equivalent to a Notion page body, a Confluence page body, or a Linear project description.
|
|
26
26
|
- **Sub-issues** (native GitHub sub-issues, traversable via `gh api graphql`) act as the candidate set for Epics or User Stories — the same role child Epic pages play in a Notion/Confluence PRD.
|
|
@@ -92,7 +92,7 @@ A GitHub issue ref. The PRD is expected to have:
|
|
|
92
92
|
- An issue body containing context, problems, and (optionally) a list of user stories.
|
|
93
93
|
- One or more sub-issues that act as candidate Epics or user stories (optional — single-issue PRDs are valid).
|
|
94
94
|
- Issue comments capturing engineering notes and product decisions.
|
|
95
|
-
- The `prd-ready`
|
|
95
|
+
- The configured `ready` PRD label (`github.labels.prd.ready`, default `prd-ready` — if invoked from `lisa:github-prd-intake`; for ad-hoc / direct invocation the label is informational, not gating).
|
|
96
96
|
|
|
97
97
|
URL parsing — accept either:
|
|
98
98
|
|
|
@@ -88,6 +88,7 @@ Each gate is tagged with a fixed `category` and a `product_relevant` boolean. Ca
|
|
|
88
88
|
| S11 Validation Journey | `acceptance-criteria` | true |
|
|
89
89
|
| S12 Source Precedence | `design-ux` | true |
|
|
90
90
|
| S13 Relationship Search | `dependency` | true |
|
|
91
|
+
| S14 Evidence manifest binding (leaf work units) | `acceptance-criteria` | true |
|
|
91
92
|
| F1 Issue type label exists in repo | `structural` | false |
|
|
92
93
|
| F2 Parent sub-issue exists and is the right type | `structural` | false |
|
|
93
94
|
| F3 Linked issues exist | `structural` | false |
|
|
@@ -189,6 +190,14 @@ The issue must EITHER have at least one entry in `links`, OR the body must conta
|
|
|
189
190
|
|
|
190
191
|
An issue with zero links and no documented search: FAIL.
|
|
191
192
|
|
|
193
|
+
#### S14 — Evidence manifest binding (leaf work units)
|
|
194
|
+
|
|
195
|
+
When `issue_type ∈ {Bug, Task, Sub-task, Improvement}` AND `runtime_behavior_change = true`, the `## Validation Journey` must declare at least one `[EVIDENCE: name]` marker. Each marker name must be kebab-case and unique within the issue. These markers are the work unit's **evidence manifest** — the exact, enumerated set of artifacts that must be captured and attached before the issue may be closed (see the "Per-Work-Unit Evidence Contract" section of the `verification` rule, the Definition of Done in `verification-lifecycle`, and the evidence-manifest gate in `tracker-evidence`).
|
|
196
|
+
|
|
197
|
+
FAIL when the Validation Journey is present but declares zero `[EVIDENCE: name]` markers, or when any marker name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one marker passes but the remediation should recommend adding the error/edge case.
|
|
198
|
+
|
|
199
|
+
This gate depends on S11. It is `N/A` for Epic / Story / Spike (coordination containers, not work units) and for leaf units with `runtime_behavior_change = false` (doc-only / config-only / type-only). If S11 fails because the Validation Journey is absent, S14 also FAILs (there is no manifest to bind) with remediation pointing back to `lisa:github-add-journey`.
|
|
200
|
+
|
|
192
201
|
### Feasibility Gates (require GitHub lookups; skip in `--spec-only`)
|
|
193
202
|
|
|
194
203
|
#### F1 — Issue type label exists in repo
|
|
@@ -248,6 +257,7 @@ Output is a single fenced text block. Callers parse it; do not add free-form pro
|
|
|
248
257
|
- [PASS|FAIL|N/A] S11 Validation Journey — <one-line reason>
|
|
249
258
|
- [PASS|FAIL|N/A] S12 Source Precedence — <one-line reason>
|
|
250
259
|
- [PASS|FAIL|N/A] S13 Relationship Search — <one-line reason>
|
|
260
|
+
- [PASS|FAIL|N/A] S14 Evidence manifest binding — <one-line reason>
|
|
251
261
|
|
|
252
262
|
### Feasibility Gates (omit this section when --spec-only)
|
|
253
263
|
- [PASS|FAIL|N/A] F1 Issue type label exists in repo — <one-line reason>
|
|
@@ -273,7 +283,7 @@ The verdict is `PASS` if every applicable gate is `PASS`. Any `FAIL` makes the v
|
|
|
273
283
|
|
|
274
284
|
Same shape and meaning as `lisa:jira-validate-ticket` so downstream PRD-intake skills (Notion, Confluence, Linear, GitHub) can format comments uniformly:
|
|
275
285
|
|
|
276
|
-
- **gate**: the gate ID (`S1`–`
|
|
286
|
+
- **gate**: the gate ID (`S1`–`S14`, `F1`–`F4`).
|
|
277
287
|
- **category**: the gate's fixed category from the table.
|
|
278
288
|
- **product_relevant**: matches the gate's table entry. `false` means the failure is an internal data-quality problem the caller should fix without bothering product.
|
|
279
289
|
- **what**: plain-language, product-readable.
|
|
@@ -95,6 +95,7 @@ h3. Assertions
|
|
|
95
95
|
4. **Evidence names in kebab-case** — `api-response`, `schema-check`, `rate-limit-hit`
|
|
96
96
|
5. **Assertions are measurable** — "Returns 200 with `{status: ok}`" not "API works correctly"
|
|
97
97
|
6. **Cover happy path and error path** — At minimum, one success and one failure evidence marker
|
|
98
|
+
7. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every `[EVIDENCE: name]` here is the ticket's evidence manifest: validation gate S14 requires at least one, and the ticket cannot be closed until each named artifact is captured and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it.
|
|
98
99
|
|
|
99
100
|
### Step 6: Present to User for Approval
|
|
100
101
|
|
|
@@ -1,21 +1,78 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-build-intake
|
|
3
|
-
description: "Symmetric counterpart to notion-prd-intake on the JIRA side. Scans a JIRA project (or JQL filter) for tickets in
|
|
4
|
-
allowed-tools: ["Skill", "Bash"
|
|
3
|
+
description: "Symmetric counterpart to notion-prd-intake on the JIRA side. Scans a JIRA project (or JQL filter) for tickets in the configured `ready` status, claims each by transitioning to the configured `claimed` status, runs the implementation/build flow via jira-agent, and transitions to the configured `done` status on completion. The `ready` status is the human-flipped signal that a TODO ticket is truly ready for development — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
|
|
4
|
+
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# JIRA Build Intake: $ARGUMENTS
|
|
8
8
|
|
|
9
|
+
All Atlassian operations in this skill go through `lisa:atlassian-access`. Do not call MCP tools or `acli` directly.
|
|
10
|
+
|
|
9
11
|
`$ARGUMENTS` is one of:
|
|
10
12
|
|
|
11
|
-
1. A JIRA project key (e.g. `SE`) — scans that project for
|
|
12
|
-
2. A full JQL filter (e.g. `project = SE AND component = "frontend" AND Status = Ready`) — used as-is. The skill will not append a `Status =
|
|
13
|
+
1. A JIRA project key (e.g. `SE`) — scans that project for tickets in the configured `ready` status.
|
|
14
|
+
2. A full JQL filter (e.g. `project = SE AND component = "frontend" AND Status = Ready`) — used as-is. The skill will not append a `Status = <ready>` clause if the JQL already names a status, so callers can intentionally widen.
|
|
15
|
+
|
|
16
|
+
Run one build-intake cycle. Each ready ticket is claimed, built via the `lisa:jira-agent` flow, and transitioned to the configured `done` status (env-aware — see below). The cycle is the symmetric mirror of `lisa:notion-prd-intake`: humans flip the ready status, agents pick up and progress.
|
|
17
|
+
|
|
18
|
+
## Workflow resolution
|
|
13
19
|
|
|
14
|
-
|
|
20
|
+
Status names are read from `.lisa.config.json` `jira.workflow.*`, falling back to defaults documented in the `config-resolution` rule. Bash pattern:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Read role with default fallback. Local overrides global per-key.
|
|
24
|
+
read_role() {
|
|
25
|
+
local role="$1" default="$2"
|
|
26
|
+
local local_v global_v
|
|
27
|
+
local_v=$(jq -r ".jira.workflow.${role} // empty" .lisa.config.local.json 2>/dev/null)
|
|
28
|
+
global_v=$(jq -r ".jira.workflow.${role} // empty" .lisa.config.json 2>/dev/null)
|
|
29
|
+
echo "${local_v:-${global_v:-$default}}"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
READY=$(read_role ready "Ready")
|
|
33
|
+
CLAIMED=$(read_role claimed "In Progress")
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
For env-keyed `done`, resolve the env first, then look up `done[<env>]`:
|
|
37
|
+
|
|
38
|
+
1. Explicit caller arg (`target_env=staging`) wins.
|
|
39
|
+
2. Otherwise, infer the env from the PR's base branch via `deploy.branches` (reverse lookup: if base is `staging`, env is `staging`).
|
|
40
|
+
3. If `done` in config is a **string** (not a map), use it directly regardless of env.
|
|
41
|
+
4. If `done` is a **map** and env cannot be resolved, **fail loudly** — do not pick arbitrarily.
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Resolve env, then DONE.
|
|
45
|
+
TARGET_ENV="${target_env:-}" # from caller args if supplied
|
|
46
|
+
if [ -z "$TARGET_ENV" ] && [ -n "$PR_BASE_BRANCH" ]; then
|
|
47
|
+
TARGET_ENV=$(jq -r --arg b "$PR_BASE_BRANCH" \
|
|
48
|
+
'.deploy.branches // {} | to_entries[] | select(.value == $b) | .key' \
|
|
49
|
+
.lisa.config.json 2>/dev/null | head -1)
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
DONE_RAW=$(jq -r '.jira.workflow.done // empty' .lisa.config.json 2>/dev/null)
|
|
53
|
+
DONE_TYPE=$(jq -r '.jira.workflow.done | type' .lisa.config.json 2>/dev/null)
|
|
54
|
+
if [ "$DONE_TYPE" = "string" ]; then
|
|
55
|
+
DONE="$DONE_RAW"
|
|
56
|
+
elif [ "$DONE_TYPE" = "object" ]; then
|
|
57
|
+
[ -z "$TARGET_ENV" ] && { echo "ERROR: jira.workflow.done is env-keyed but env not resolvable"; exit 1; }
|
|
58
|
+
DONE=$(jq -r --arg e "$TARGET_ENV" '.jira.workflow.done[$e] // empty' .lisa.config.json)
|
|
59
|
+
[ -z "$DONE" ] && { echo "ERROR: jira.workflow.done has no entry for env '$TARGET_ENV'"; exit 1; }
|
|
60
|
+
else
|
|
61
|
+
# Default: env-keyed map matching legacy hardcoded names.
|
|
62
|
+
case "$TARGET_ENV" in
|
|
63
|
+
dev) DONE="On Dev" ;;
|
|
64
|
+
staging) DONE="On Stg" ;;
|
|
65
|
+
production) DONE="Done" ;;
|
|
66
|
+
*) echo "ERROR: cannot resolve done status without env"; exit 1 ;;
|
|
67
|
+
esac
|
|
68
|
+
fi
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Run one build-intake cycle. Each ticket in `$READY` is claimed by transitioning to `$CLAIMED`, built via the `lisa:jira-agent` flow, and transitioned to `$DONE` on completion.
|
|
15
72
|
|
|
16
73
|
## Confirmation policy
|
|
17
74
|
|
|
18
|
-
Do NOT ask the caller whether to proceed. Once invoked with a project key or JQL, run the cycle to completion — claim, dispatch each ticket through `lisa:jira-agent`, transition successful builds to
|
|
75
|
+
Do NOT ask the caller whether to proceed. Once invoked with a project key or JQL, run the cycle to completion — claim, dispatch each ticket through `lisa:jira-agent`, transition successful builds to `$DONE`, write the summary. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background batch.
|
|
19
76
|
|
|
20
77
|
Specifically forbidden:
|
|
21
78
|
|
|
@@ -27,46 +84,45 @@ Specifically forbidden:
|
|
|
27
84
|
The only legitimate reasons to stop early:
|
|
28
85
|
|
|
29
86
|
- Missing project key / JQL or required configuration. Surface the missing value and exit.
|
|
30
|
-
- Workflow misconfigured (pre-flight check finds `
|
|
31
|
-
- Empty
|
|
87
|
+
- Workflow misconfigured (pre-flight check finds `$CLAIMED` or `$DONE` not reachable, or `$READY` status absent). Surface and exit.
|
|
88
|
+
- Empty ready set. Exit cleanly with `"No tickets with Status=$READY. Nothing to do."`
|
|
32
89
|
|
|
33
90
|
## Lifecycle assumed
|
|
34
91
|
|
|
35
|
-
The JIRA workflow has these statuses (
|
|
92
|
+
The JIRA workflow has these statuses (configured per project — see Workflow resolution above for how role names map to actual workflow values):
|
|
36
93
|
|
|
37
94
|
```text
|
|
38
|
-
TODO →
|
|
39
|
-
(PM/
|
|
40
|
-
human)
|
|
95
|
+
TODO → ready → claimed → done(env-keyed) → On QA → archive
|
|
96
|
+
(PM/ (us claim) (us done; (downstream)
|
|
97
|
+
human) PR ready)
|
|
41
98
|
```
|
|
42
99
|
|
|
43
|
-
This skill ONLY transitions
|
|
100
|
+
This skill ONLY transitions `$READY → $CLAIMED` on claim, and `$CLAIMED → $DONE` on completion. It never touches `TODO`, post-`done` statuses, or any blocked/closed states.
|
|
44
101
|
|
|
45
|
-
**Pre-flight check**: at start of each cycle,
|
|
102
|
+
**Pre-flight check**: at start of each cycle, attempt the `$CLAIMED` and `$DONE` transitions against a sample ready ticket via `lisa:atlassian-access` `operation: transition key: <K> to: "<status>"` (in a probe / dry-run sense — or fetch transition metadata if the access skill exposes that). If the transitions are unreachable, stop and report the workflow misconfiguration to the caller — do not invent transitions.
|
|
46
103
|
|
|
47
104
|
## Phases
|
|
48
105
|
|
|
49
106
|
### Phase 1 — Resolve the query
|
|
50
107
|
|
|
51
108
|
1. Parse `$ARGUMENTS`:
|
|
52
|
-
- Project key: build JQL `project = <KEY> AND Status = "
|
|
53
|
-
- Full JQL: use as-is. If it does not include a `Status` clause, append `AND Status = "
|
|
54
|
-
2.
|
|
109
|
+
- Project key: build JQL `project = <KEY> AND Status = "$READY" ORDER BY priority DESC, created ASC`.
|
|
110
|
+
- Full JQL: use as-is. If it does not include a `Status` clause, append `AND Status = "$READY"`.
|
|
111
|
+
2. Confirm the configured Atlassian site by invoking `lisa:atlassian-access` `operation: list-sites` (it enforces connection match against `.lisa.config.json`).
|
|
55
112
|
|
|
56
|
-
### Phase 2 — Find
|
|
113
|
+
### Phase 2 — Find ready tickets
|
|
57
114
|
|
|
58
|
-
|
|
115
|
+
Invoke `lisa:atlassian-access` `operation: search-issues jql: "<JQL>"`. Capture each ticket's: key, summary, issue type, priority, assignee, parent (epic), labels, components.
|
|
59
116
|
|
|
60
|
-
If empty, report `"No tickets with Status
|
|
117
|
+
If empty, report `"No tickets with Status=$READY. Nothing to do."` and exit. This is the common idle case.
|
|
61
118
|
|
|
62
|
-
### Phase 3 — Process each
|
|
119
|
+
### Phase 3 — Process each ready ticket (serial)
|
|
63
120
|
|
|
64
121
|
#### 3a. Claim
|
|
65
122
|
|
|
66
|
-
Transition the ticket from `
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
- This is the idempotency lock — a re-entrant cycle's `Status = Ready` filter will not see this ticket again.
|
|
123
|
+
Transition the ticket from `$READY` to `$CLAIMED` by invoking `lisa:atlassian-access` `operation: transition key: <TICKET> to: "$CLAIMED"`.
|
|
124
|
+
- Post a `[claude-build-intake]` comment via `lisa:atlassian-access` `operation: comment key: <TICKET> body: "Claimed by Claude. Starting build."`
|
|
125
|
+
- This is the idempotency lock — a re-entrant cycle's `Status = $READY` filter will not see this ticket again.
|
|
70
126
|
|
|
71
127
|
If the transition fails (permission, missing transition, race), log under "Errors" in the cycle summary and skip this ticket. **Do not invoke the build flow on a ticket you didn't successfully claim.**
|
|
72
128
|
|
|
@@ -83,21 +139,21 @@ Invoke the `lisa:jira-agent` (existing per-ticket lifecycle agent) with the tick
|
|
|
83
139
|
Wait for `lisa:jira-agent` to return. Capture its outcome:
|
|
84
140
|
- **Success** — PR is ready (open or merged); evidence posted; ready for next status.
|
|
85
141
|
- **Blocked by jira-verify pre-flight gate** — `lisa:jira-agent` itself transitions the ticket to `Blocked` and reassigns to Reporter. This is correct and expected — let it stand. Record the outcome and move on.
|
|
86
|
-
- **Blocked by ticket-triage ambiguities** — `lisa:jira-agent` posts findings and stops. The ticket stays in
|
|
87
|
-
- **Errored** — exception, missing config, etc. Leave the ticket in `
|
|
142
|
+
- **Blocked by ticket-triage ambiguities** — `lisa:jira-agent` posts findings and stops. The ticket stays in `$CLAIMED`. Surface to human; do not auto-transition. Record under "Errors" with reason `"Triage found ambiguities — see comments on <ticket-key>"`.
|
|
143
|
+
- **Errored** — exception, missing config, etc. Leave the ticket in `$CLAIMED` for human investigation. Record under "Errors" with the exception summary.
|
|
88
144
|
|
|
89
|
-
#### 3c. Transition to
|
|
145
|
+
#### 3c. Transition to $DONE (only on Success)
|
|
90
146
|
|
|
91
147
|
If `lisa:jira-agent` returned Success:
|
|
92
|
-
1.
|
|
93
|
-
2.
|
|
94
|
-
3. Post a `[claude-build-intake]` comment: `"Build complete. PR <URL>. Transitioned to
|
|
148
|
+
1. Resolve `$DONE` for this ticket's PR base branch using the Workflow resolution algorithm above. If env can't be resolved and `done` is env-keyed, record an Error and skip this transition — never guess.
|
|
149
|
+
2. Invoke `lisa:atlassian-access` `operation: transition key: <TICKET> to: "$DONE"`.
|
|
150
|
+
3. Post a `[claude-build-intake]` comment via `lisa:atlassian-access` `operation: comment key: <TICKET> body: "Build complete. PR <URL>. Transitioned to $DONE."`
|
|
95
151
|
|
|
96
|
-
For any non-Success outcome, do NOT transition. The ticket sits in `
|
|
152
|
+
For any non-Success outcome, do NOT transition. The ticket sits in `$CLAIMED` (or wherever `lisa:jira-agent` left it for the Blocked case) — the cycle's job is done; humans take it from there.
|
|
97
153
|
|
|
98
154
|
#### 3d. Continue
|
|
99
155
|
|
|
100
|
-
Move to the next
|
|
156
|
+
Move to the next ready ticket. One ticket failing does not stop others.
|
|
101
157
|
|
|
102
158
|
### Phase 4 — Summary report
|
|
103
159
|
|
|
@@ -109,7 +165,7 @@ Cycle started: <ISO timestamp>
|
|
|
109
165
|
Cycle completed: <ISO timestamp>
|
|
110
166
|
|
|
111
167
|
Tickets processed: <n>
|
|
112
|
-
-
|
|
168
|
+
- $DONE (build complete, PR ready): <n>
|
|
113
169
|
- <ticket-key> <summary> → PR <URL>
|
|
114
170
|
- Blocked (pre-flight verify failed): <n>
|
|
115
171
|
- <ticket-key> <summary> — see ticket comments
|
|
@@ -123,32 +179,41 @@ Total PRs opened: <n>
|
|
|
123
179
|
|
|
124
180
|
## Idempotency & safety
|
|
125
181
|
|
|
126
|
-
- **Claim-first ordering**: `
|
|
127
|
-
- **No writes outside the lifecycle**: this skill only transitions
|
|
182
|
+
- **Claim-first ordering**: `$CLAIMED` set BEFORE `lisa:jira-agent` invocation — no double-pickup.
|
|
183
|
+
- **No writes outside the lifecycle**: this skill only transitions `$READY → $CLAIMED` and `$CLAIMED → $DONE`. Every other status change is owned by `lisa:jira-agent` (which suggests transitions but only auto-transitions on the verify-FAIL path).
|
|
128
184
|
- **Failure isolation**: per-ticket exceptions caught and recorded; the cycle continues.
|
|
129
185
|
- **Single cycle per query**: do not run two `lisa:jira-build-intake` cycles in parallel against overlapping queries — concurrent claims could race. The scheduling layer (when added) is responsible for serialization.
|
|
130
|
-
- **Never invent a transition**: if `
|
|
186
|
+
- **Never invent a transition**: if `$CLAIMED` or `$DONE` aren't valid transitions in the project's workflow, stop and report rather than guessing alternative names.
|
|
131
187
|
|
|
132
188
|
## Configuration
|
|
133
189
|
|
|
134
|
-
Reads `atlassian.cloudId` and `jira.
|
|
190
|
+
Reads `atlassian.cloudId`, `jira.project`, and `jira.workflow.{ready,claimed,done}` from `.lisa.config.json` (with `.lisa.config.local.json` overriding per key). The project key is also accepted as `$ARGUMENTS` for ad-hoc invocations.
|
|
191
|
+
|
|
192
|
+
Status role names default to:
|
|
193
|
+
- `ready` → `"Ready"`
|
|
194
|
+
- `claimed` → `"In Progress"`
|
|
195
|
+
- `done` → env-keyed map `{ "dev": "On Dev", "staging": "On Stg", "production": "Done" }`
|
|
196
|
+
|
|
197
|
+
If a project uses different names (e.g. `Open` instead of `TODO`, `In Development` instead of `In Progress`, `Code Review` for terminal), override the relevant key in `.lisa.config.json` `jira.workflow.*`. The setup skills (`/lisa:setup:jira`) handle this interactively.
|
|
135
198
|
|
|
136
|
-
|
|
199
|
+
Per-invocation overrides via `$ARGUMENTS` (e.g. `claim_status="In Development"`) are accepted as a secondary escape hatch but `.lisa.config.json` is the canonical source.
|
|
137
200
|
|
|
138
|
-
If a
|
|
201
|
+
If a ready-equivalent status does not exist in the JIRA project's workflow, this skill cannot run. The remediation is to add it to the project workflow scheme — JIRA admin task, not something this skill can do.
|
|
139
202
|
|
|
140
203
|
| Field / variable | Default | Purpose |
|
|
141
204
|
|------------------|---------|---------|
|
|
142
205
|
| `.lisa.config.json` `jira.project` | (from `$ARGUMENTS`) | Project key for the default JQL |
|
|
143
206
|
| `.lisa.config.json` `atlassian.cloudId` | — | Atlassian Cloud site UUID (required) |
|
|
144
|
-
|
|
|
145
|
-
|
|
|
146
|
-
|
|
|
207
|
+
| `.lisa.config.json` `jira.workflow.ready` | `Ready` | The status that signals "human says this is buildable" |
|
|
208
|
+
| `.lisa.config.json` `jira.workflow.claimed` | `In Progress` | The intermediate status the agent sets on pickup |
|
|
209
|
+
| `.lisa.config.json` `jira.workflow.done` | env-keyed map (`dev`/`staging`/`production`) or string | The status set after a successful build; env-aware |
|
|
210
|
+
| `.lisa.config.json` `deploy.branches` | — | Reverse-lookup map for env inference from PR base branch |
|
|
147
211
|
|
|
148
212
|
## Rules
|
|
149
213
|
|
|
150
|
-
- Never transition a ticket the cycle didn't claim. The `
|
|
214
|
+
- Never transition a ticket the cycle didn't claim. The `$CLAIMED` transition is the signature of cycle ownership.
|
|
151
215
|
- Never bypass `lisa:jira-agent` to do build work directly. `lisa:jira-agent` owns the per-ticket lifecycle (read, verify, triage, route, sync, evidence). This skill is the dispatcher, not the builder.
|
|
152
|
-
- Never auto-transition past
|
|
216
|
+
- Never auto-transition past `$DONE`. Downstream statuses are owned by QA / product / a future verification-intake skill — not this one.
|
|
153
217
|
- If the ticket has no Validation Journey or no sign-in credentials in its description, `lisa:jira-agent`'s pre-flight verify will catch it and transition to `Blocked` — **don't try to fix the ticket from here**. Pre-flight gating is `lisa:jira-agent`'s job; running build work on a thin ticket produces broken work.
|
|
154
218
|
- On any unexpected response from `lisa:jira-agent` (status it doesn't claim, missing PR URL on success, etc.), record as Error and surface — never assume.
|
|
219
|
+
- Never pick an arbitrary env for `$DONE` resolution. If `done` is a map and env is ambiguous, fail loudly.
|
|
@@ -1,12 +1,14 @@
|
|
|
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", "Skill"
|
|
4
|
+
allowed-tools: ["Read", "Glob", "LS", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Create JIRA Issues from $ARGUMENTS
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
All Atlassian operations in this skill go through `lisa:atlassian-access`. Do not call MCP tools or `acli` directly.
|
|
10
|
+
|
|
11
|
+
Analyze the provided file(s) and plan a JIRA hierarchy. **This skill plans structure only — every individual ticket write is delegated to `lisa:jira-write-ticket`.** Do not invoke `lisa:atlassian-access` write operations directly from this skill — all writes go through `lisa:jira-write-ticket`.
|
|
10
12
|
|
|
11
13
|
## Process
|
|
12
14
|
|
|
@@ -110,7 +112,7 @@ Exclude unless requested: migration plans, performance tests
|
|
|
110
112
|
|
|
111
113
|
## Delegation to jira-write-ticket
|
|
112
114
|
|
|
113
|
-
**Mandatory.** Every ticket created by this skill MUST go through `lisa:jira-write-ticket`. This skill never
|
|
115
|
+
**Mandatory.** Every ticket created by this skill MUST go through `lisa:jira-write-ticket`. This skill never invokes `lisa:atlassian-access` write operations itself — all writes are delegated so the gate cannot be bypassed.
|
|
114
116
|
|
|
115
117
|
`lisa:jira-write-ticket` enforces things this skill does not, and which determine ticket quality:
|
|
116
118
|
- 3-audience description (Context / Technical Approach / Acceptance Criteria)
|
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-evidence
|
|
3
|
-
description: "Upload text evidence to GitHub pr-assets release, update PR description, post JIRA comment with code blocks, and move ticket to
|
|
3
|
+
description: "Upload text evidence to GitHub pr-assets release, update PR description, post JIRA comment with code blocks, and move ticket to the configured code-review status. Reusable by any skill that captures evidence and generates evidence/comment.txt + evidence/comment.md."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# JIRA Evidence Posting
|
|
7
7
|
|
|
8
|
+
## Workflow resolution
|
|
9
|
+
|
|
10
|
+
The post-build review status is read from `.lisa.config.json` `jira.workflow.review` (or `jira.workflow.code_review`), falling back to `Code Review`. JIRA does not have a separate `review` role in the canonical config schema (the build lifecycle stays in `claimed` until `done`); this skill uses the project's actual post-build review status when one exists. If the configured status is not a valid transition from the ticket's current state, log a warning and skip the transition — the human will handle it.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
REVIEW="Code Review"
|
|
14
|
+
if [ -f .lisa.config.json ]; then
|
|
15
|
+
_cfg=$(jq -r '.jira.workflow.review // .jira.workflow.code_review // empty' .lisa.config.json 2>/dev/null)
|
|
16
|
+
[ -n "$_cfg" ] && REVIEW="$_cfg"
|
|
17
|
+
fi
|
|
18
|
+
if [ -f .lisa.config.local.json ]; then
|
|
19
|
+
_local=$(jq -r '.jira.workflow.review // .jira.workflow.code_review // empty' .lisa.config.local.json 2>/dev/null)
|
|
20
|
+
[ -n "$_local" ] && REVIEW="$_local"
|
|
21
|
+
fi
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
|
|
8
25
|
Upload captured evidence and generated templates to GitHub PR description and JIRA ticket. This skill is the posting step — it assumes evidence files and comment templates already exist in the evidence directory.
|
|
9
26
|
|
|
10
27
|
## Arguments
|
|
@@ -43,7 +60,7 @@ bash .claude/skills/jira-evidence/scripts/post-evidence.sh PROJ-123 ./evidence 4
|
|
|
43
60
|
2. **Upload to GitHub `pr-assets` release** — Uploads evidence files via `gh release upload --clobber`
|
|
44
61
|
3. **Update PR description** — Replaces or appends the `## Evidence` section in the PR body
|
|
45
62
|
4. **Post JIRA comment** — Posts `comment.txt` as a new comment (wiki markup with code blocks)
|
|
46
|
-
5. **Move ticket to
|
|
63
|
+
5. **Move ticket to the configured review status** — Transitions the JIRA ticket to `$REVIEW` (default: `Code Review`).
|
|
47
64
|
|
|
48
65
|
## Evidence Naming Convention
|
|
49
66
|
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-journey
|
|
3
3
|
description: "Parse a JIRA ticket's Validation Journey section, execute the verification steps using appropriate tools (curl, test commands, database queries), capture evidence, and post to JIRA + GitHub PR using the jira-evidence skill."
|
|
4
|
-
allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"
|
|
4
|
+
allowed-tools: ["Bash", "Read", "Glob", "Grep", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# JIRA Validation Journey (TypeScript)
|
|
8
8
|
|
|
9
|
+
All Atlassian operations in this skill go through `lisa:atlassian-access`. Do not call MCP tools or `acli` directly. Note: the helper scripts (`scripts/parse-plan.py`, `scripts/jira-evidence/post-evidence.sh`) currently use direct API calls and are pending migration to route through `atlassian-access`.
|
|
10
|
+
|
|
9
11
|
Parse a JIRA ticket's Validation Journey, execute the verification steps using the appropriate tools for the change type, capture evidence at each `[EVIDENCE: name]` marker, and post to JIRA + GitHub PR.
|
|
10
12
|
|
|
11
13
|
## Arguments
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-read-ticket
|
|
3
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", "
|
|
4
|
+
allowed-tools: ["Bash", "Skill"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Read JIRA Ticket: $ARGUMENTS
|
|
8
8
|
|
|
9
|
+
All Atlassian operations in this skill go through `lisa:atlassian-access`. Do not call MCP tools or `acli` directly.
|
|
10
|
+
|
|
9
11
|
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
12
|
|
|
11
13
|
Repository name for scoped comments and logs: `basename $(git rev-parse --show-toplevel)`.
|
|
12
14
|
|
|
13
15
|
## Phase 1 — Resolve Context
|
|
14
16
|
|
|
15
|
-
1.
|
|
17
|
+
1. Invoke `lisa:atlassian-access` via the Skill tool with `operation: list-sites` to confirm the configured site is reachable and resolve the cloud ID.
|
|
16
18
|
2. If $ARGUMENTS is not a ticket key (e.g. `PROJ-123`), stop and report. Do NOT guess.
|
|
17
19
|
|
|
18
20
|
## Phase 2 — Fetch Primary Ticket
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
Invoke `lisa:atlassian-access` via the Skill tool with `operation: read-ticket key: <TICKET-KEY>` for the target ticket. Extract and preserve:
|
|
21
23
|
|
|
22
24
|
### Metadata
|
|
23
25
|
|
|
@@ -60,7 +62,7 @@ Fetch ALL comments in chronological order. Do not truncate. For each:
|
|
|
60
62
|
|
|
61
63
|
## Phase 3 — Fetch Remote Links
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
The primary ticket payload returned by `lisa:atlassian-access` `operation: read-ticket` includes the issue's remote links. If the substrate returns remote links separately, request them via `lisa:atlassian-access` with `operation: read-ticket key: <K>` (the operation MUST return remote links — extend `atlassian-access` if it doesn't). For each remote link:
|
|
64
66
|
|
|
65
67
|
- **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.
|
|
66
68
|
- **Confluence page**: capture title and URL. Do not fetch body unless a downstream task explicitly needs it.
|
|
@@ -78,7 +80,7 @@ Every linked ticket must be fetched. Do not skip any link type. For each link in
|
|
|
78
80
|
- `clones` / `is cloned by`
|
|
79
81
|
- Any other custom link types configured in the project
|
|
80
82
|
|
|
81
|
-
For each linked ticket,
|
|
83
|
+
For each linked ticket, invoke `lisa:atlassian-access` with `operation: read-ticket key: <LINKED-KEY>` and capture:
|
|
82
84
|
|
|
83
85
|
- Key, summary, type, status, resolution
|
|
84
86
|
- Description (full, unless closed with resolution `Won't Do`/`Duplicate` — then summary only)
|
|
@@ -92,19 +94,19 @@ For each linked ticket, call `mcp__atlassian__getJiraIssue` and capture:
|
|
|
92
94
|
|
|
93
95
|
If the primary ticket has an epic parent (or IS an epic):
|
|
94
96
|
|
|
95
|
-
1. Fetch the epic itself via `
|
|
97
|
+
1. Fetch the epic itself via `lisa:atlassian-access` `operation: read-ticket key: <EPIC-KEY>` — full description, acceptance criteria, all comments, Validation Journey.
|
|
96
98
|
2. Find epic siblings via JQL:
|
|
97
99
|
```jql
|
|
98
100
|
"Epic Link" = <EPIC-KEY> AND key != <TICKET-KEY>
|
|
99
101
|
```
|
|
100
|
-
|
|
102
|
+
Invoke `lisa:atlassian-access` with `operation: search-issues jql: "<above-JQL>"`. For each sibling capture: key, summary, type, status, assignee, priority.
|
|
101
103
|
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.
|
|
102
104
|
|
|
103
105
|
If the primary ticket IS an epic, also fetch all children via the JQL above.
|
|
104
106
|
|
|
105
107
|
## Phase 6 — Fetch Subtasks
|
|
106
108
|
|
|
107
|
-
If the primary ticket has subtasks, fetch each via `
|
|
109
|
+
If the primary ticket has subtasks, fetch each via `lisa:atlassian-access` `operation: read-ticket key: <SUBTASK-KEY>`: key, summary, type, status, assignee, description (first paragraph), acceptance criteria.
|
|
108
110
|
|
|
109
111
|
## Phase 7 — Assemble Context Bundle
|
|
110
112
|
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-sync
|
|
3
3
|
description: "Syncs plan progress to a linked JIRA ticket. Posts plan contents, progress updates, branch links, and PR links at key milestones. Use this skill throughout the plan lifecycle to keep tickets in sync."
|
|
4
|
-
allowed-tools: ["
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# JIRA Ticket Sync
|
|
8
8
|
|
|
9
|
+
All Atlassian operations in this skill go through `lisa:atlassian-access`. Do not call MCP tools or `acli` directly.
|
|
10
|
+
|
|
9
11
|
Sync current plan progress to JIRA ticket: $ARGUMENTS
|
|
10
12
|
|
|
11
13
|
If no argument provided, search for a ticket URL in the active plan file (most recently modified `.md` in `plans/`).
|
|
@@ -15,7 +17,7 @@ If no argument provided, search for a ticket URL in the active plan file (most r
|
|
|
15
17
|
### Step 1: Identify Ticket and Context
|
|
16
18
|
|
|
17
19
|
1. **Parse ticket ID** from `$ARGUMENTS` or extract from the active plan file
|
|
18
|
-
2. **Fetch current ticket state** via
|
|
20
|
+
2. **Fetch current ticket state** by invoking `lisa:atlassian-access` via the Skill tool with `operation: read-ticket key: <TICKET-ID>`
|
|
19
21
|
3. **Determine current milestone** by checking:
|
|
20
22
|
- Does a plan file exist? → Plan created
|
|
21
23
|
- Is there a working branch? → Implementation started
|
|
@@ -36,11 +38,15 @@ Based on the current milestone:
|
|
|
36
38
|
|
|
37
39
|
### Step 3: Post Update
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
Before adding a comment, check for an existing milestone comment to avoid duplicates (idempotency):
|
|
42
|
+
|
|
43
|
+
1. **Fetch existing comments** by invoking `lisa:atlassian-access` with `operation: search-issues jql: "..."` or by reading the ticket's comments. Look for a comment whose body contains a stable milestone marker (e.g., the heading `## Plan Created`, `## Implementation in Progress`, `## PR Ready`, or `## PR Merged`) that matches the current milestone.
|
|
44
|
+
2. **If a matching comment already exists**, skip posting and proceed to field updates — idempotent re-runs must not create duplicates.
|
|
45
|
+
3. **If no matching comment exists**, add a new comment by invoking `lisa:atlassian-access` with `operation: comment key: <TICKET-ID> body: "..."`.
|
|
46
|
+
4. **Update ticket fields** if applicable:
|
|
41
47
|
- Add branch name to a custom field or comment
|
|
42
48
|
- Add PR link to a custom field or comment
|
|
43
|
-
|
|
49
|
+
5. **Report** what was synced to the user
|
|
44
50
|
|
|
45
51
|
### Step 4: Suggest Status Transition
|
|
46
52
|
|