Use the `untaped jira` command to work with Jira Data Center or Server issues (search with JQL, read, create, edit, assign, comment on, link and transition issues, and list projects, boards and sprints). Use when the user mentions Jira, a ticket or issue key such as OPS-123, JQL, a sprint or board, or moving an issue to another status.
Install
npx skillscat add alexisbeaulieu97/untaped/untaped-jira Install via the SkillsCat registry.
SKILL.md
Untaped Jira
Use this skill when the user wants an agent to operate the untaped jira CLI for Jira Data Center issue workflows.
Setup
- The command is
untaped jira. It ships with the unifieduntapedCLI (no separate install). untaped jiratargets Jira Data Center and self-hosted Jira, not Jira Cloud REST v3.- Settings live under
profiles.<name>.jira:base_url,token,assigned_jql, and optional defaults such asdefault_board_id. - Use
untaped config set jira.token --promptor--stdinfor personal access tokens, or setjira.token_commandto an argv list that prints the token; without either,JIRA_API_TOKENis used. A rejected token (HTTP 401) prints that command as a hint and exits 4. - Set the base URL with
untaped config set jira.base_url https://HOST.
Command Patterns
- Use
untaped jira --helpand subcommand--helpoutput to confirm the available commands and flags before acting. - Commands:
whoami,issues get|search|assigned|create|patch|comment|transitions|transition,issues comments list,issues links create,projects list|get,boards list,sprints list. - Jira platform calls use
/rest/api/2; Jira Software board and sprint calls use/rest/agile/1.0. - Use
untaped jira issues assignedto list issues assigned to the authenticated Jira user. It always appliesjira.assigned_jql;--jqland the shortcut flags narrow it (ANDed), and anORDER BYin--jqlreplaces the defaultupdated DESCorder. For an unrestricted query (not limited to your assigned issues) useuntaped jira issues search --jql ...instead. untaped jira issues searchwith no--jqlor shortcut flags falls back tojira.assigned_jql.--sprintaccepts a sprint id, a sprint name, oropenSprints()/futureSprints()/closedSprints()(rendered assprint in openSprints()).- Use
untaped jira issues get KEYto fetch one issue with its detail fields (summary,status,assignee,updated_at,url,api_url, plusissue_type,priority,reporter,labels,created_at,resolution,description,links, andcomments, which isnullunless--commentsfetched them).linksis always a list (empty when none) of{key, summary, status, type, direction, relation, url}:directionisoutwardorinwardfrom this issue's side andrelationis Jira's phrase for it (blocks,is blocked by); linked issues are not fetched, soissues gettheir keys for details. Search rows keep onlykey,summary,status,assignee,updated_at,url, andapi_url.urlis the browser link andapi_urlthe REST link. Timestamps render in UTC as2026-01-02T03:04:05Z. issues getandissues transitionaccept several keys, or--stdinwith bare keys or--format piperecords of kindjira.issue/jira.issue_outcome(any other kind exits 2). Each failing key printserror: KEY: …and the command exits with the most severe failure (1 for a missing issue, 4 for a rejected token or a permission error, 5 when Jira is unavailable).issues comments list KEYemitsjira.commentrecords (id,issue_key,author,created_at,updated_at,body,api_url).- Assign with
issues patch KEY --assignee USER(@meis the authenticated user) or clear it with--unassign. Assignment uses the dedicatedPUT issue/KEY/assigneeendpoint, so it works even when the assignee field is not on the edit screen; combined with other field changes it sends the field edit first, then the assignment (if only the assignment fails, the error says the fields were already updated). The flags override afields.assigneein--fields-file. issues transition --resolution NAME --comment TEXTsets a resolution and adds a comment with the transition.issues links create KEY TYPE OTHERlinks two issues; it reads "KEY OTHER" (OPS-1 Blocks OPS-2: OPS-1 blocks OPS-2).jira.confirmdecides which writes ask first:destructive(default),always, ornever. Destructive writes areissues transitionand anissues patchthat sets a field, changes the assignee, or has anupdateoperation other thanadd;issues create,issues comment,issues links createand add-only patches are sent without asking unless the policy isalways. A write that asks shows a readable preview first (METHOD path, thenfield: old → newlines; patches and transitions read the issue's current values for it). Pass--yesto skip the prompt; without a terminal and without--yes, a write that must ask exits 2.--dry-runprints the same preview on stderr, emits aplannedoutcome, sends nothing, and wins over--yesand the policy; patch and transition dry runs read the issue, so they need working credentials (a patch dry run fails if the issue cannot be read; a transition preview shows(unknown), or(not available from this status)for an--idthe issue does not offer).issues create/issues patchset arbitrary fields with--set KEY=VALUEand--set-json KEY=JSON(both repeatable), on top of an optional Jira-shaped YAML/JSON document from--fields-file FILE(fieldsandupdate).issues comment --body-file FILEreads the comment text.- Writes emit a
jira.issue_outcomerecord:action(created,updated,commented,transitioned,linked, orplanned),key,id,url,api_url,transition_id,comment_id,link_type,linked_key. - Prefer JSON output for issue, board, sprint, transition, project, and search workflows.
- Single-entity commands (
whoami,issues get KEY, the writes on one key,projects get) render a vertical key:value detail view under--format tableand a bare JSON object under--format json; list/search commands and multi-key calls render tables and JSON arrays. - Usage mistakes exit 2: an issue key that is neither
PROJECT-123nor a numeric id, or a project key that is neitherPROJECTnor a numeric id (keys are case-insensitive and sent uppercase), a blank--jql, both or neither of--to/--id,sprints listwithout--board-idorjira.default_board_id,--limit 0. - The JQL
issues search/issues assignedPOST is treated as idempotent and retries transient429/503automatically; mutating commands are never auto-retried. - Use
--format pipeto chain into another untaped command: it emits one self-describing record per line, each tagged with akind(jira.issue,jira.issue_outcome,jira.comment,jira.project,jira.board,jira.sprint,jira.user,jira.transition). --profile <name>works in any token position (e.g.untaped --profile work jira whoami).- Use configured defaults only after checking effective config with
untaped config list --format raw --columns key --columns value.
Agent Guidance
- Keep stdout data-only; parse
--format jsonrather than table output. - Read the exit code before retrying:
1the request itself failed (missing issue, invalid field, no such transition),2fix the command line,4fix the environment (jira.*settings, a rejected token, missing permission),5Jira was unavailable (network, timeout, 5xx, 429): retry later. With--format json|yaml|pipe(orUNTAPED_DIAGNOSTICS=json) stderr is JSON Lines; each error hascategory,system(jira,local, …),retryableandhint. - Do not assume Jira Cloud authentication or endpoints.
- Treat issue mutations such as transitions or comments as explicit user intent: preview with
--dry-run(even whenjira.confirmwould not ask), then pass--yesonly once the user has approved. - Never echo tokens or raw authorization headers.