claude/skills/jira/SKILL.md
Use jira CLI and MCP tools (mcp__jira__*) for Jira Cloud operations — issue management, project queries, JQL search, transitions, worklogs, plans, and more. Use when working with Jira issues, projects, sprints, boards, filters, dashboards, or any Jira Cloud resource via CLI or MCP.
npx skillsauth add lanej/dotfiles jiraInstall 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.
jira config init # interactive setup → ~/.config/jira-cli/config.toml
jira config validate # test connection
No env vars. JIRA_URL / JIRA_EMAIL / JIRA_API_TOKEN are intentionally ignored. Use CLI flags --url/--email/--token for one-off overrides.
--format table # default
--format json # array
--format jsonl # one object per line, auto-paginates all results
JSONL is preferred for scripting — pipe directly to jq.
The CLI is the full interface. MCP tools are a subset.
Most resources and verbs are only available via CLI. MCP exposes the most common read/write operations but does not cover: bulk operations, boards, sprints, development info, goals, screens, automations, audit log, or raw API access.
Default to CLI (jira <resource> <verb>) for any operation not explicitly listed in an MCP tool. Use MCP when an agent needs structured tool call semantics or is already in an MCP session.
All resources follow: jira <resource> <verb> [args] [flags]
Resources: issues, projects, comments, attachments, worklogs, versions, components, filters, dashboards, issuetypes, statuses, issuelinks, remotelinks, development, plans, users, boards, sprints, fields, goals, screens, automations, auditlog
Read references/commands.md for exact flags and syntax for every resource.
All parameters that previously required opaque IDs now accept human-readable names. Resolution is case-insensitive exact match; IDs pass through unchanged.
| Parameter | Accepts |
|---|---|
| transition (issues transition) | transition name or ID |
| user / accountId / assigneeAccountId / leadAccountId | email, display name, or account ID |
| fieldId (fields commands) | field name (e.g. "Story Points") or ID (e.g. customfield_12497) |
| --field "Name=Value" / customFields on create & update | field name as key; value resolved by type (see below) |
Custom field value resolution (--field on CLI, customFields on MCP):
Keys are resolved from field name → customfield_*. Values are resolved by field type:
option names → {value}, user names/emails → accountId, sprint names → sprint ID (all boards searched), numbers parsed from strings. Unknown types pass through; Jira surfaces errors.
Sprint name lookup searches all boards — may be slow on large instances. Error on non-unique sprint names across boards.
Non-unique match errors. If a name matches 2+ candidates, the call fails with a list of all matches and their IDs. Use an ID to be precise.
User resolution fallback. If searchUsers(query) returns no results, the value is treated as a raw account ID. Empty string always passes through (used to unassign).
204 empty response ≠ error. Mutating operations (assign, transition, delete) return HTTP 204. The MCP layer may surface this as an error. Always verify with a GET:
mcp__jira__jira_issues_assign(key="PROJ-1", user="[email protected]")
issue = mcp__jira__jira_issues_get(key="PROJ-1") # verify assignee
Development API needs numeric ID. jira development * and mcp__jira__jira_development_summary require the internal numeric issue ID, not the key:
ISSUE_ID=$(jira issues get PROJ-123 --format json | jq -r '.id')
jira development pull-requests $ISSUE_ID --application-type github
MCP returns minimal fields by default (~70% token reduction). Use fields param to request additional data.
Goals field cannot be set via REST API. customfield_10025 returns 204 No Content but the field is never updated — /editmeta exposes allowedValues: []. Known bug: JRACLOUD-97866. Link issues to goals through the Jira UI only.
Keep a local .md file in sync with a Jira issue description — same pattern as gspace docs sync.
jira issues pull PROJ-123 [file.md] # download description → local file (default: PROJ-123.md)
jira issues sync file.md # push local file → Jira description
File format — YAML frontmatter + markdown body:
---
jira:
key: PROJ-123
url: https://yourorg.atlassian.net/browse/PROJ-123
updated: "2026-05-13T08:00:00.000+0000"
summary: "Issue title"
duedate: 2026-12-31 # or ~ if unset
sprint: Sprint 42 # or ~ if unset
fix_versions:
- v2.0
assignee: Josh Lane # or ~ if unset
custom_fields: # editable custom fields only (filtered by edit screen)
strategic_alignment: 3
problem_classification: Operational Risk
---
Description body goes here.
Conflict detection: sync compares jira.updated against the remote timestamp. If remote is more than 60s newer, aborts with a message and suggests pull to refresh.
File locking: both commands acquire file.md.lock before any I/O. Stale locks (>60s) are overridden with a warning.
Local images:  in the markdown body is base64-encoded and embedded in the ADF on sync. On pull, base64 data URLs are decoded to ./images/{KEY}-img-{n}.png and referenced as relative paths.
What syncs: description, summary, duedate, sprint (name), fix_versions (list of version names), assignee (display name, ~ to unassign), and any editable custom fields in the custom_fields: block. Custom field keys are snake_case; values are pushed via the fields cache (direct field ID lookup — no name-ambiguity errors). Calculated/view-only fields may appear in custom_fields: if the Jira instance doesn't configure a separate edit screen; writes to such fields are silently ignored by Jira.
Mermaid diagrams: ```mermaid ``` blocks are automatically rendered to PNG via mmdc (Mermaid CLI) and uploaded as attachments. The Jira description shows the rendered image; the mermaid source block is preserved only in the local file. Install mmdc with npm install -g @mermaid-js/mermaid-cli. If mmdc is absent or fails, the sync completes without error and the diagram is omitted from Jira.
Known limitations:
code mark cannot be combined with other marks (bold/italic) — ADF spec constraint, Jira rejects it**bold _italic_**) emits redundant ** on pull — cosmetic, content preservedpull does not restore mermaid source blocks — local file is authoritative for mermaid contentAlways use remote links, never file attachments. File attachments do not render correctly in Jira — they appear as raw downloads. Remote links render as clickable chips with the correct application icon.
Google Drive URLs are auto-detected: Docs, Sheets, and Folders each get the correct icon. Non-Google URLs are linked as generic web links.
Never use jira attachments upload for documents — use jira remotelinks add instead. See references/commands.md for syntax.
# Search + stream to jq
jira issues search "project = PROJ AND status = Open" --format jsonl | jq '.fields.status.name'
# Count by status
jira issues search "project = PROJ" --format jsonl \
| jq -r '.fields.status.name' | sort | uniq -c | sort -rn
# Extract issue link edges (for dependency graphs)
jira issues search "issuelinktype is not EMPTY" --fields issuelinks --format jsonl \
| jq -r '.key as $k | .fields.issuelinks[]? |
if .outwardIssue then "\($k),\(.type.outward),\(.outwardIssue.key)"
else "\(.inwardIssue.key),\(.type.inward),\($k)" end'
# List active sprint issues on a board
BOARD_ID=$(jira boards list --format jsonl | jq -r 'select(.name=="My Board") | .id')
jira sprints list --board $BOARD_ID --state active --format jsonl \
| jq -r '.id' \
| xargs -I{} jira issues search "sprint = {}" --format jsonl
assignee = currentUser() AND status != Done
updated >= -7d ORDER BY updated DESC
type = Bug AND priority in (Highest, High)
sprint in openSprints() AND project = PROJ
issuelinktype is not EMPTY AND project = PROJ
Goals use a separate jira goals command group backed by the Atlassian GraphQL API — not Jira REST. Goal type ARIs are workspace-specific; run jira goals list-types to get them.
Hierarchy: Two levels only: GOAL → SUCCESS_MEASURE. A SUCCESS_MEASURE cannot have children.
See references/commands.md for full goal command syntax.
jira api GET "/rest/api/3/issue/PROJ-123?fields=summary,status"
jira api POST "/rest/api/3/search/jql" --data '{"jql":"project=PROJ","fields":["summary"]}'
jira api PUT "/rest/api/3/issue/PROJ-123" --data '{"fields":{"summary":"New title"}}'
Gotcha: /rest/api/3/search is removed — use POST /rest/api/3/search/jql with body {"jql":"...","fields":[...],"maxResults":50}.
devops
DORA engineering metrics project at ~/src/dora. Load when: querying DORA BigQuery views (deployment frequency, lead time, change failure rate, alerts, review time) from any project; joining against DORA.unified_identity or DORA_clean.* views from any project; running the data pipeline (just refresh, just download-*, just upload-*); making OpenTofu infrastructure changes to DORA tables or views; working with team attribution, team identity, or engineer roster data.
development
Data pipeline architecture patterns and best practices, including medallion/three-layer architecture (Raw/Staging/Enriched or Bronze/Silver/Gold), YAML-based schema management, and ETL workflow patterns. Use when designing or implementing data pipelines, working with data warehouse layers, or managing table schemas in YAML.
data-ai
Delegate research and context-gathering tasks to a sub-agent to protect the primary context window. Use when the user asks to "research X", "look into X", "find out about X", "gather context on X", or any investigative framing where answering requires 2+ searches or multiple sources. Also use proactively before starting substantive work when prior context is unknown. Never run research inline — always delegate.
documentation
--- name: qmd-math description: Math notation conventions for Quarto/EPQ documents rendered via lualatex. Use when: writing or adding a formula, equation, or mathematical expression to a .qmd file; asked about display math, inline math, or LaTeX notation in a QMD/Quarto context; defining a where-clause or variable definitions for an equation; converting prose variable descriptions into structured math notation; fixing math that renders badly in a PDF; using \lvert, \begin{aligned}, \tfrac, \text