From liferay-headless
Close LPD Jira tickets whose work has already merged into brianchandotcom/liferay-portal. Use when asked to close, resolve, or clean up WIP tickets that are done.
How this skill is triggered — by the user, by Claude, or both
Slash command
/liferay-headless:close-jira-tickets [ticket key(s) or a JQL filter][ticket key(s) or a JQL filter]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Close LPD tickets whose code already reached `brianchandotcom/liferay-portal`
Close LPD tickets whose code already reached brianchandotcom/liferay-portal
master using ../../rules/jira-rest-api.md.
A ticket is "merged by Brian" when its commits are in the master branch of the
remote tracking brianchandotcom/liferay-portal. Forwarding rewrites commit SHAs, so match by commit message, after fetching the latest version.
All commits matching means the work landed. The PR may show as CLOSED (the CI
bot closes it on forward) rather than merged.
The PR URL lives in the Git Pull Request field (customfield_10201). A
Task records the PR on its Technical Task subtask, while a Bug or
Technical Task records it on itself. Read that field together with
subtasks and issuetype, then grep brian/master for the ID of whichever
ticket actually holds the work.
brianchandotcom PRThe Git Pull Request field often points at a personal or team fork PR (e.g.
liferay-headless/liferay-portal), not the brianchandotcom/liferay-portal PR
that actually forwards to master. The fork PR is not evidence on its own.
When the field PR is not a brianchandotcom/liferay-portal PR, find the real
brian PR in the fork PR's GitHub comments: the CI forwarding bot posts the
brianchandotcom/liferay-portal/pull/<n> link there. Read the fork PR's body
and comments and pull that link out.
Always report the resolved brianchandotcom PR as the evidence, never the fork
PR. If the field already points at a brianchandotcom PR, use it directly.
Transition IDs and screen fields vary by issue type and current status, so never
hardcode them. Fetch the issue transitions expanded with their fields, pick the
one whose to.name is Closed, then post that transition ID with the
type-specific fields below. A successful transition returns HTTP 204.
Once you have confirmed which tickets merged and located the ticket carrying each PR, list every ticket you are about to close and stop for the user's explicit confirmation before transitioning anything. For each ticket show:
https://liferay.atlassian.net/browse/<KEY>), andbrianchandotcom/liferay-portal PR (see
Resolve the Real brianchandotcom PR), not the fork PR from the field.Do not transition any ticket until the user confirms. If the user drops some tickets from the list, close only the ones they keep.
The allowed resolutions and required fields differ per type. A Bug uses
Fixed; a Task and a Technical Task reject Fixed and use Completed.
| Issue Type | Resolution | Other Required Fields |
|---|---|---|
| Technical Task | Completed | None |
| Task | Completed | None |
| Bug | Fixed | customfield_10979 (Cross Cutting Properties) as an array, e.g. [{"value": "None"}]; a Fix version, e.g. {"name": "Master"} |
The Bug Fix version is enforced by a transition validator even though the field
metadata marks it optional. Ask the user which version to set; use Master for
master-only work.
A parent Task exposes the Closed transition only once every Technical Task subtask is already Closed. Close the subtasks first, then refetch the parent's transitions and close it.
Never close a Story, even when its code has merged. Close its merged Technical Task subtask, but leave the Story for the product manager. Report the Story as skipped.
Refetch the closed keys and confirm each reports status Closed with the
expected resolution.
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub liferay-headless/liferay-headless --plugin liferay-headless