skills/engineering/jira-ticket-manager/SKILL.md
Create, search/list, and edit Jira tickets using jira-cli (https://github.com/ankitpokhrel/jira-cli). Use when the user asks to create tickets/issues/stories/bugs/epics (Epic/Story/Bug/A/B Test, set to Backlog), list or search their Jira tickets (e.g. "what am I working on", "show my open bugs", filter by status/type/component or raw JQL), view a specific ticket by key, or edit/update an existing ticket's fields (summary, description, assignee, priority, labels, parent epic). Selects the most appropriate component from API/Projects/Proposals/Backends/Regression/AI for new tickets. Assumes jira-cli is already installed and configured (user has run 'jira init').
npx skillsauth add arctuition/skills jira-ticket-managerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create, search, view, and edit Jira tickets non-interactively using the jira-cli tool.
Focus on the problem being solved, not the technical implementation.
Tickets should clearly communicate what problem the user or business faces and what outcome is desired. Technical details (specific technologies, implementation approaches) belong in subtasks or comments — not in the ticket summary or description.
| Bad (Tech-focused) | Good (Problem-focused) | |---|---| | "Implement Redis caching for project queries" | "Reduce slow load times on project list page" | | "Add JWT-based authentication to API" | "Users need secure login for the platform" | | "Migrate database from PostgreSQL to DynamoDB" | "Improve scalability for growing user base" | | "Refactor proposal service to use async/await" | "Proposal page freezes when loading large datasets" | | "Add WebSocket support for notifications" | "Users miss important updates because notifications are delayed" |
Structure descriptions around the problem and acceptance criteria:
Avoid prescribing specific technical solutions in the description. Let the engineering team decide the best approach.
Before using this skill, ensure:
brew install jira-cli or download from releasesjira init and set up API tokenSelect the most appropriate component based on the ticket content:
Selection Examples:
To create a Jira ticket, use the jira-cli command with the following pattern:
jira issue create \
-t<TYPE> \
-s"<SUMMARY>" \
-b"<DESCRIPTION>" \
-C <COMPONENT> \
--no-input
Example:
jira issue create \
-tStory \
-s"Project list page takes too long to load for users with many projects" \
-b"Users with 50+ projects experience 10s+ load times on the project list page, causing frustration and drop-off. The page should load within 2 seconds regardless of project count." \
-C Backends \
--no-input
Epic - For large initiatives or themesStory - For user stories and featuresBug - For defects and issuesA/B Test - For A/B testing tasks (if configured in your Jira instance)For standard ticket creation without a parent epic:
jira issue create \
-tStory \
-s"Users need a secure way to access the platform" \
-b"Currently there is no authentication mechanism, so anyone with the URL can access the platform. Users need to be able to log in securely to protect their data." \
-C API \
--no-input
To link a story/bug to an epic, use the -P flag:
jira issue create \
-tStory \
-s"Team leads lack visibility into project health and progress" \
-b"Team leads have no centralized view of project status, making it hard to identify at-risk projects. They need a dashboard showing key metrics and recent activity at a glance." \
-P PROJ-123 \
-C Projects \
--no-input
jira issue create \
-tEpic \
-s"Enable AI-powered assistance across the platform" \
-b"Users frequently perform repetitive tasks that could be automated. AI-powered features would reduce manual effort and help users make better decisions faster." \
-C AI \
--no-input
jira issue create \
-tBug \
-s"Users on Safari cannot log in to the platform" \
-b"Safari users see 'Invalid credentials' when attempting to log in, even with correct credentials. This blocks all Safari users from accessing the platform." \
-C Regression \
--no-input
Important: Jira typically creates issues in the default initial status (usually "To Do" or "Open"). To move a newly created ticket to "Backlog" status:
# Step 1: Create the ticket and capture the issue key
ISSUE_KEY=$(jira issue create -tStory -s"Summary" -b"Description" \
-C Backends --no-input | grep -oE '[A-Z]+-[0-9]+' | head -1)
# Step 2: Move to Backlog status
jira issue move "$ISSUE_KEY" "Backlog"
Ask the Jira administrator to set "Backlog" as the default initial status for the project, eliminating the need for the move step.
After creating a ticket, jira-cli outputs the issue key (e.g., PROJ-123). To get the full URL:
jira open PROJ-123
jira issue view PROJ-123
The output includes the issue URL.
If you know your Jira domain:
https://your-domain.atlassian.net/browse/PROJ-123
When viewing issues in the interactive list:
ENTER to open in browserc to copy URL to clipboardUse jira issue list to find tickets. Always pass --plain for non-interactive,
parseable output (the default mode opens an interactive TUI).
jira issue list -a$(jira me) -s~Done -s~Closed --plain
The ~ prefix means "not equal". This shows your tickets that aren't Done/Closed.
When the user asks "what am I working on", "show my tickets", or "what's on my plate", this is the default query.
# Everything in progress
jira issue list -s"In Progress" --plain
# Everything in the backlog
jira issue list -sBacklog --plain
jira issue list -tBug --plain
jira issue list -tStory --plain
jira issue list -tEpic --plain
jira issue list -CBackends --plain
jira issue list -CAI --plain
Filters AND together. Example — "my open bugs in Backends":
jira issue list -a$(jira me) -tBug -CBackends -s~Done --plain
# Created in the last 7 days
jira issue list --created -7d --plain
# Updated in the last 24 hours
jira issue list --updated -1d --plain
For anything the flags don't cover, pass raw JQL with -q:
jira issue list -q "assignee = currentUser() AND priority = High AND status != Done ORDER BY updated DESC" --plain
When the user references a key directly (e.g. "show me PROJ-123", "what's the status of PROJ-456"):
jira issue view PROJ-123
The output includes summary, description, status, assignee, comments, and the issue URL. To open in the browser instead:
jira open PROJ-123
Use jira issue edit to update an existing ticket. The field flags mirror those
used by jira issue create. Always pass --no-input for non-interactive edits.
jira issue edit PROJ-123 -s"Clearer, problem-focused summary" --no-input
Always read the existing description before editing. Never blindly overwrite — decide which mode fits:
| Mode | When to use | |---|---| | Add | The existing description is good but incomplete — append new sections, acceptance criteria, or context | | Polish | The structure is right but the wording is unclear, inconsistent, or too technical — refine in place | | Revamp | The description is fundamentally wrong, empty, or so outdated it misleads — full rewrite |
jira issue view PROJ-123
Inspect the output. Is the description accurate? Missing information? Just rough?
Add (preserve existing, append new content):
# Build new_description by prepending existing text + new sections
jira issue edit PROJ-123 \
-b"<EXISTING CONTENT>
## Additional Context
<NEW SECTIONS ONLY>" \
--no-input
Polish (keep structure, improve wording):
jira issue edit PROJ-123 \
-b"<REFINED VERSION OF EXISTING CONTENT>" \
--no-input
Revamp (full rewrite — only when existing content is fundamentally wrong or empty):
jira issue edit PROJ-123 \
-b"<COMPLETELY NEW DESCRIPTION>" \
--no-input
When rewriting or polishing, follow the same problem-focused guidelines from the Writing Good Ticket Summaries & Descriptions section above — don't bake implementation details into the ticket.
# Assign to a specific user
jira issue edit PROJ-123 -a"username" --no-input
# Assign to yourself
jira issue edit PROJ-123 -a$(jira me) --no-input
# Unassign (the literal "x" clears the assignee)
jira issue edit PROJ-123 -ax --no-input
jira issue edit PROJ-123 -yHigh --no-input
Common values: Highest, High, Medium, Low, Lowest (verify in your Jira instance).
jira issue edit PROJ-123 -l"frontend" -l"urgent" --no-input
jira issue edit PROJ-123 -PPROJ-456 --no-input
jira issue edit PROJ-123 \
-s"Updated summary" \
-yHigh \
-l"urgent" \
--no-input
jira issue edit updates fields. To change status (To Do → In Progress
→ Done), use jira issue move:
jira issue move PROJ-123 "In Progress"
For complex workflows, you can create a helper script if needed:
#!/bin/bash
# create_jira_ticket.sh
TYPE=$1
SUMMARY=$2
DESCRIPTION=$3
COMPONENT=$4
jira issue create \
-t"$TYPE" \
-s"$SUMMARY" \
-b"$DESCRIPTION" \
-C "$COMPONENT" \
--no-input
Usage:
./create_jira_ticket.sh Story "Add authentication" "Implement JWT auth" API
Create a ticket with all required fields and get the URL:
# Step 1: Create the ticket (select appropriate component based on the task)
OUTPUT=$(jira issue create \
-tStory \
-s"Team leads need a way to monitor project health at a glance" \
-b"There is no centralized view for tracking project progress. Team leads must check each project individually, which is time-consuming and makes it easy to miss at-risk projects." \
-C Projects \
--no-input)
# Step 2: Extract the issue key
ISSUE_KEY=$(echo "$OUTPUT" | grep -oE '[A-Z]+-[0-9]+' | head -1)
# Step 3: Move to Backlog
jira issue move "$ISSUE_KEY" "Backlog"
# Step 4: Get and display the URL
echo "Ticket created: https://your-domain.atlassian.net/browse/$ISSUE_KEY"
# Or open directly in browser
jira open "$ISSUE_KEY"
For detailed guidance on selecting the appropriate component, see references/component_selection.md.
If you get authentication errors, reconfigure jira-cli:
jira init
If a component is not recognized:
jira component listIf "A/B Test" is not recognized, verify it's configured in your Jira project:
jira issue create and observe the type optionsjira issue create \
-tBug \
-s"Safari users cannot log in — login button is unresponsive" \
-b"Multiple users have reported that the login button does not respond on Safari, preventing them from accessing the platform entirely." \
-C Regression \
--no-input
jira issue create \
-tEpic \
-s"Help users work faster with AI-powered assistance" \
-b"Users spend significant time on repetitive tasks like drafting proposals and analyzing project data. AI-powered features could automate these workflows and surface actionable insights." \
-C AI \
--no-input
jira issue create \
-tStory \
-s"External partners need programmatic access to project analytics" \
-b"Partners currently request analytics reports manually via email, which is slow and error-prone. They need a self-service way to retrieve project analytics data on demand." \
-P PROJ-456 \
-C API \
--no-input
jira issue list -a$(jira me) -s~Done -s~Closed --plain
jira issue list -a$(jira me) -tBug -CBackends -s~Done --plain
jira issue view PROJ-123
jira issue edit PROJ-123 -a$(jira me) -yHigh --no-input
# Step 1: Read the existing description first
jira issue view PROJ-123
# Step 2: Based on what you see, choose add / polish / revamp (see Editing Tickets section)
# Example — polishing vague existing content:
jira issue edit PROJ-123 \
-b"Users with 50+ projects experience 10s+ load times on the project list page.
Target: page should load in under 2 seconds regardless of project count." \
--no-input
jira issue edit PROJ-123 -PPROJ-456 --no-input
data-ai
Wrap up the work you just did and open a PR for it — branch off main/master if needed, commit only the changes you made, push, open a pull request (following .github/PULL_REQUEST_TEMPLATE.md when present), and open the PR in the browser. Targets the `upstream` remote's default branch as the base when an `upstream` remote exists, otherwise `origin`. Use when the user says "sign off", "signoff", "ship it", "open a PR for this", "commit and PR", or "wrap this up".
development
Produce a single-file HTML "thread recap" artifact that captures what was discussed in an agent / pairing / chat conversation — the questions explored, the decisions made and their tradeoffs, the dead ends we walked into, the open questions left, and the artifacts produced — so a teammate who wasn't in the room can pick up the context. Use this skill whenever the user asks to summarize a conversation/thread/session, mentions sharing a thread with colleagues, says things like "把这个对话总结一下", "share this thread with the team", "write up what we decided", "decision log for this conversation", "document the tradeoffs we made", "recap of our pairing session", or wants to hand off a Claude/ChatGPT/agent transcript as context. Trigger even when "HTML" isn't said — the artifact format is the whole point. Input can be the current session's own conversation context OR a transcript the user pastes in.
development
Produce a single-file HTML "PR writeup" artifact that explains a pull request to its reviewers — motivation, before/after behavior, file-by-file tour with the reasoning, where to focus the review, test plan, and rollout. Use this skill whenever the user is about to open a PR, has just finished a branch, mentions writing a PR description, asks for a PR write-up, says things like "explain this change to my team", "help me pitch this PR", "write the PR description", "summarize what I'm shipping", or wants to make sure reviewers understand intent and risk before they read the diff. Trigger even when they don't say "HTML" — the artifact format is the whole point and the user should not have to ask for it by name.
development
Produce a single-file HTML "code review companion" artifact that helps a reviewer get oriented in someone else's pull request — a risk-coloured map of every file, an annotated diff with margin notes and severity tags, the call-graph that shows how the changed pieces fit together, and the questions worth asking the author. Use this skill whenever the user is about to review a PR, has been assigned one, mentions reviewing code they didn't write, says things like "help me review this", "I need to review PR