| name | acli |
| description | Use acli CLI for Atlassian operations — primarily Jira work item management, project operations, sprint tracking, and board management with JQL search. Also covers Confluence page/space/blog operations and a CQL search fallback (acli has no native Confluence search). |
Atlassian CLI (acli) - Jira Workflow Skill
You are an Atlassian CLI specialist. This skill provides comprehensive guidance for managing Jira work items, projects, sprints, and boards using the acli jira command-line tool.
Sandbox (MANDATORY)
Every acli invocation via the Bash tool MUST set dangerouslyDisableSandbox: true on the FIRST attempt. Do not try sandboxed first.
acli reads and writes OAuth credentials via the macOS Keychain / credential helpers. The default Claude Code sandbox blocks those reads, and the failure mode is deceptive:
acli jira auth status → failed to retrieve authenticated status
acli jira workitem search ... → failed to parse JQL (even for valid JQL)
acli jira project list → failed to list projects
These look like syntax or auth problems, but they are sandbox problems. The fix is always the same: rerun the exact command with dangerouslyDisableSandbox: true.
This applies to every acli subcommand: auth, workitem, project, board, sprint, filter, field, dashboard. No exceptions.
Bash(command="acli jira workitem view FOO-123", dangerouslyDisableSandbox=true)
Bash(command="acli jira workitem search --jql 'project = FOO'", dangerouslyDisableSandbox=true)
Core Principles
Output Formats
Standard formats available:
- Default: Human-readable table format
--json: JSON output for scripting and automation
--csv: CSV output for data export (available on search commands)
--web: Open results in web browser
Best practices:
- Use
--json for scripting and parsing
- Use
--csv for exporting to spreadsheets
- Use
--web for quick visual inspection
- Use default format for human review
Pagination and Limits
acli jira workitem search --jql "project = TEAM" --limit 50
acli jira workitem search --jql "project = TEAM" --paginate
acli jira workitem search --jql "project = TEAM" --count
Authentication
Initial Setup
acli jira auth login
acli jira auth status
acli jira auth switch
acli jira auth logout
Work Items (Issues)
Searching for Work Items
acli jira workitem search --jql "project = TEAM"
acli jira workitem search --jql "project = TEAM" --fields "key,summary,assignee"
acli jira workitem search --jql "project = TEAM" --paginate
acli jira workitem search --jql "project = TEAM" --count
acli jira workitem search --jql "project = TEAM" --csv
acli jira workitem search --jql "project = TEAM" --json
acli jira workitem search --filter 10001
acli jira workitem search --jql "project = TEAM" --web
acli jira workitem search --jql "project = TEAM" --limit 50
Common JQL patterns:
acli jira workitem search --jql "assignee = currentUser()"
acli jira workitem search --jql "project = TEAM AND status != Done"
acli jira workitem search --jql "updated >= -7d"
acli jira workitem search --jql "priority = High AND status = Open"
acli jira workitem search --jql "project = TEAM AND assignee = currentUser() AND status in (Open, 'In Progress')"
acli jira workitem search --jql "project = TEAM AND issuetype = Bug"
acli jira workitem search --jql "labels = production AND status != Closed"
Viewing Work Items
acli jira workitem view KEY-123
acli jira workitem view KEY-123 --fields "summary,description,comment"
acli jira workitem view KEY-123 --fields "*all"
acli jira workitem view KEY-123 --fields "*navigable"
acli jira workitem view KEY-123 --fields "*navigable,-comment"
acli jira workitem view KEY-123 --json
acli jira workitem view KEY-123 --web
Creating Work Items
Available CLI flags for acli jira workitem create:
| Flag | Description |
|---|
--summary / -s | Work item title |
--project / -p | Project key |
--type / -t | Issue type (Epic, Story, Task, Bug) |
--assignee / -a | Email or @me (NOT raw account IDs) |
--description / -d | Plain text or ADF JSON |
--description-file | Read description from file |
--label / -l | Comma-separated labels |
--parent | Parent issue key (e.g., epic key) |
--from-json | Create from JSON file |
--from-file / -f | Read summary/description from file |
--editor / -e | Open text editor |
--json | Return JSON output |
There is no --component, --sprint, or --story-points flag. To set
components, sprint, story points, or any other custom/non-standard field, you
MUST use the --from-json approach.
acli jira workitem create \
--summary "New feature request" \
--project "TEAM" \
--type "Story"
acli jira workitem create \
--summary "Fix login bug" \
--project "TEAM" \
--type "Bug" \
--assignee "user@example.com"
acli jira workitem create \
--summary "Research task" \
--project "TEAM" \
--type "Task" \
--assignee "@me"
acli jira workitem create \
--summary "Sub-task" \
--project "TEAM" \
--type "Story" \
--parent "TEAM-100"
acli jira workitem create \
--summary "Urgent bug fix" \
--project "TEAM" \
--type "Bug" \
--label "production,urgent,bug"
Creating with Custom Fields (components, sprint, story points)
Use --from-json when you need to set fields not available as CLI flags. The
JSON format is acli's own format, NOT the raw Jira REST API format.
Generate the template to see the schema:
acli jira workitem create --generate-json
The JSON schema is:
{
"summary": "Title",
"projectKey": "PROJ",
"type": "Story",
"parentIssueId": "PROJ-100",
"assignee": "@me",
"labels": ["label1", "label2"],
"description": {
"type": "doc",
"version": 1,
"content": [
{
"type": "paragraph",
"content": [{"type": "text", "text": "Description text"}]
}
]
},
"additionalAttributes": {
"components": [{"id": "12345"}],
"customfield_10003": 5,
"customfield_10701": 16378
}
}
Key fields in additionalAttributes:
components — Array of {"id": "..."} objects (use component ID, not name)
- Sprint custom field (e.g.,
customfield_10701) — Set to the sprint ID (integer)
- Story points custom field (e.g.,
customfield_10003) — Set to a number
Important notes about --from-json:
- Use
projectKey (not project.key)
- Use
parentIssueId (not parent.key) — this is the parent issue key string
assignee accepts @me or an email address — NOT raw Jira account IDs
description must be in Atlassian Document Format (ADF), not plain text
- Custom field IDs vary per Jira instance — discover them by viewing an existing
issue with
--fields "*all" --json and inspecting the customfield_* keys
acli jira workitem create --from-json /path/to/workitem.json --json
Assignment Gotchas
Some projects restrict who can be assigned issues during creation. If you get
a "cannot be assigned issues" error:
- Create the issue without an assignee
- Assign separately using
acli jira workitem assign:
acli jira workitem create \
--summary "New task" \
--project "TEAM" \
--type "Story" \
--json
acli jira workitem assign --key "TEAM-456" --assignee "user@example.com"
acli jira workitem assign --key "TEAM-456" --assignee "@me"
The assign subcommand often succeeds where create --assignee fails because
they use different Jira API permission checks.
Editing Work Items
acli jira workitem edit --key "KEY-123" --summary "Updated summary"
acli jira workitem edit --key "KEY-123,KEY-124,KEY-125" --assignee "@me"
acli jira workitem edit \
--jql "project = TEAM AND status = Open" \
--assignee "user@example.com"
acli jira workitem edit --filter 10001 --labels "reviewed"
acli jira workitem edit --key "KEY-123" --description "Updated description"
acli jira workitem edit --key "KEY-123" --description-file "desc.txt"
acli jira workitem edit --key "KEY-123" --type "Epic"
acli jira workitem edit --key "KEY-123" --labels "backend,api"
acli jira workitem edit --key "KEY-123" --remove-labels "old-label"
acli jira workitem edit --key "KEY-123" --remove-assignee
acli jira workitem edit --key "KEY-123" --summary "New" --yes
acli jira workitem edit \
--jql "project = TEAM" \
--assignee "@me" \
--ignore-errors
acli jira workitem edit --generate-json
acli jira workitem edit --from-json "update.json"
acli jira workitem edit --key "KEY-123" --summary "New" --json
Transitioning Work Items
acli jira workitem transition --key "KEY-123" --status "In Progress"
acli jira workitem transition \
--key "KEY-123,KEY-124" \
--status "Done"
acli jira workitem transition \
--jql "project = TEAM AND assignee = currentUser()" \
--status "In Review"
acli jira workitem transition \
--filter 10001 \
--status "Closed"
acli jira workitem transition \
--key "KEY-123" \
--status "Done" \
--yes
acli jira workitem transition \
--jql "project = TEAM" \
--status "Done" \
--ignore-errors
acli jira workitem transition \
--key "KEY-123" \
--status "Done" \
--json
Common status transitions:
To Do / Open - New work
In Progress - Active work
In Review / Code Review - Under review
Testing / QA - Being tested
Done / Closed / Resolved - Completed
Assigning Work Items
acli jira workitem assign \
--key "KEY-123" \
--assignee "user@example.com"
acli jira workitem assign --key "KEY-123" --assignee "@me"
acli jira workitem assign --key "KEY-123" --assignee "default"
acli jira workitem assign \
--key "KEY-123,KEY-124,KEY-125" \
--assignee "@me"
Comments
acli jira workitem comment create \
--key "KEY-123" \
--body "This is a comment"
acli jira workitem comment create \
--key "KEY-123" \
--body-file "comment.txt"
acli jira workitem comment create \
--key "KEY-123" \
--editor
acli jira workitem comment create \
--jql "project = TEAM AND status = Open" \
--body "Bulk comment"
acli jira workitem comment create \
--key "KEY-123" \
--body "Updated comment" \
--edit-last
acli jira workitem comment create \
--jql "project = TEAM" \
--body "Comment" \
--ignore-errors
acli jira workitem comment list --key "KEY-123"
acli jira workitem comment update \
--key "KEY-123" \
--comment-id "10001" \
--body "Updated comment text"
acli jira workitem comment delete \
--key "KEY-123" \
--comment-id "10001"
acli jira workitem comment visibility --key "KEY-123"
Attachments
acli jira workitem attachment --help
Linking Work Items
acli jira workitem link --help
Cloning Work Items
acli jira workitem clone \
--key "KEY-123" \
--summary "Cloned issue"
Archiving and Deleting
acli jira workitem archive --key "KEY-123"
acli jira workitem archive --key "KEY-123,KEY-124,KEY-125"
acli jira workitem unarchive --key "KEY-123"
acli jira workitem delete --key "KEY-123"
acli jira workitem delete --key "KEY-123,KEY-124"
Watchers
acli jira workitem watcher --help
Bulk Operations
acli jira workitem create-bulk --from-json "bulk-issues.json"
acli jira workitem create-bulk --generate-json
Projects
Listing Projects
acli jira project list
acli jira project list --limit 50
acli jira project list --paginate
acli jira project list --recent
acli jira project list --json
Viewing Projects
acli jira project view --key "TEAM"
acli jira project view --key "TEAM" --json
Creating Projects
acli jira project create
Updating Projects
acli jira project update --key "TEAM"
Archiving Projects
acli jira project archive --key "TEAM"
acli jira project restore --key "TEAM"
Deleting Projects
acli jira project delete --key "TEAM"
Sprints and Boards
Finding the Active Sprint for a Project
The fastest way to find the active sprint is via JQL, not the board API. Search for
any issue in the project's open sprint and read the sprint custom field from the
JSON response:
acli jira workitem search \
--jql "project = PROJ AND sprint in openSprints()" \
--fields "key" --limit 1 --json
acli jira workitem view PROJ-123 --fields "*all" --json \
| jq '
.fields | to_entries[]
| select(.value | type == "array" and length > 0)
| select(.value[0] | type == "object" and has("state"))
| .value[] | select(.state == "active")
'
The sprint object contains id, name, boardId, startDate, endDate, and
state. Use id when assigning a sprint to a new issue via additionalAttributes
in the --from-json creation flow (see "Creating with Custom Fields" below).
Do NOT try to find the sprint by paginating through acli jira board search —
there can be hundreds of boards and the project's board may not appear on early pages.
Board Commands
acli jira board search
acli jira board get --id 123
acli jira board list-sprints --id 123
Sprint Work Items
acli jira sprint list-workitems --id 456
Filters
Managing Filters
acli jira filter list
acli jira filter search
acli jira filter get --id 10001
acli jira filter add-favourite --id 10001
acli jira filter change-owner --id 10001
acli jira filter get-columns --id 10001
acli jira filter reset-columns --id 10001
Fields
Field Management
acli jira field --help
Dashboards
Dashboard Management
acli jira dashboard --help
Complete Workflows
Workflow 1: Create and Track Bug
acli jira workitem create \
--summary "Fix login validation" \
--project "TEAM" \
--type "Bug" \
--assignee "@me" \
--label "production,high-priority"
acli jira workitem transition --key "KEY-123" --status "In Progress"
acli jira workitem comment create \
--key "KEY-123" \
--body "Found root cause, implementing fix"
acli jira workitem transition --key "KEY-123" --status "Done"
acli jira workitem comment create \
--key "KEY-123" \
--body "Fixed validation logic in LoginController"
Workflow 2: Bulk Update Sprint Items
acli jira workitem search \
--jql "sprint = 'Sprint 23' AND status = 'To Do'" \
--fields "key,summary"
acli jira workitem transition \
--jql "sprint = 'Sprint 23' AND status = 'To Do'" \
--status "In Progress" \
--yes
acli jira workitem edit \
--jql "sprint = 'Sprint 23' AND assignee is EMPTY" \
--assignee "@me" \
--yes
Workflow 3: Create Epic with Stories
acli jira workitem create \
--summary "User Authentication Redesign" \
--project "TEAM" \
--type "Epic" \
--assignee "@me"
acli jira workitem create \
--summary "Design new login UI" \
--project "TEAM" \
--type "Story" \
--parent "TEAM-100"
acli jira workitem create \
--summary "Implement OAuth2 integration" \
--project "TEAM" \
--type "Story" \
--parent "TEAM-100"
acli jira workitem create \
--summary "Add multi-factor authentication" \
--project "TEAM" \
--type "Story" \
--parent "TEAM-100"
Workflow 4: Daily Standup Report
acli jira workitem search \
--jql "assignee = currentUser() AND status in ('In Progress', 'In Review')" \
--fields "key,summary,status"
acli jira workitem search \
--jql "assignee = currentUser() AND status changed TO Done AFTER -1d" \
--fields "key,summary"
Workflow 5: Review and Triage New Bugs
acli jira workitem search \
--jql "project = TEAM AND type = Bug AND assignee is EMPTY" \
--fields "key,summary,priority,created"
acli jira workitem edit \
--jql "project = TEAM AND type = Bug AND priority = Highest AND assignee is EMPTY" \
--assignee "senior-dev@example.com" \
--yes
acli jira workitem edit \
--jql "project = TEAM AND type = Bug AND created >= -1d" \
--labels "needs-triage" \
--yes
Workflow 6: Sprint Cleanup
acli jira workitem search \
--jql "sprint = 'Sprint 22' AND status != Done" \
--fields "key,summary,assignee,status"
acli jira workitem edit \
--jql "sprint = 'Sprint 22' AND status != Done" \
--yes
acli jira workitem comment create \
--jql "sprint = 'Sprint 22' AND status != Done" \
--body "Carried over to Sprint 23 due to dependencies"
Workflow 7: Export Issues for Reporting
acli jira workitem search \
--jql "project = TEAM AND created >= -30d" \
--fields "key,issuetype,assignee,priority,status,summary,created,resolved" \
--csv > issues-last-30-days.csv
acli jira workitem search \
--jql "project = TEAM AND status = Done AND resolved >= -7d" \
--json > completed-this-week.json
Best Practices
JQL Query Design
- Be specific: Use precise field matching
- Use operators:
AND, OR, NOT, IN, IS, WAS
- Date functions:
startOfDay(), endOfDay(), startOfWeek()
- User functions:
currentUser(), membersOf()
- Test first: Use
--count to verify query before bulk operations
Bulk Operations Safety
- Always test JQL: Run search first to verify matching items
- Use --yes carefully: Only with confirmed queries
- Use --ignore-errors: For large bulk operations
- Check limits: Use
--paginate for operations on many items
- Verify results: Check a sample after bulk updates
Field Selection
- Default fields: Use for quick overview
- Minimal fields: Use
--fields "key,summary" for performance
- All fields: Use
--fields "*all" only when needed
- Exclude fields: Use
--fields "*navigable,-comment" to reduce noise
Output Format Selection
- Human review: Use default table format
- Scripting: Use
--json for parsing
- Spreadsheets: Use
--csv for export
- Quick check: Use
--web to open in browser
- Count only: Use
--count for metrics
Assignment Best Practices
- Use @me: For self-assignment
- Use email: For specific users
- Use default: For project default assignee
- Verify users exist: Before bulk assignment
- Unassign when needed: Use
--remove-assignee
Common Patterns
Pattern 1: Find My Open Work
acli jira workitem search \
--jql "assignee = currentUser() AND status != Done" \
--fields "key,summary,status,priority"
Pattern 2: Track Team Velocity
acli jira workitem search \
--jql "sprint = 'Sprint 23' AND status = Done" \
--count
acli jira workitem search \
--jql "sprint = 'Sprint 23' AND status = 'In Progress'" \
--count
Pattern 3: Find Stale Issues
acli jira workitem search \
--jql "status = 'In Progress' AND updated <= -14d" \
--fields "key,summary,assignee,updated"
Pattern 4: Label Management
acli jira workitem edit \
--jql "project = TEAM AND created >= -7d" \
--labels "new-this-week" \
--yes
acli jira workitem edit \
--jql "labels = 'new-this-week' AND created <= -7d" \
--remove-labels "new-this-week" \
--yes
Pattern 5: Priority Triage
acli jira workitem search \
--jql "project = TEAM AND priority is EMPTY" \
--fields "key,summary,created"
acli jira workitem edit \
--jql "project = TEAM AND priority is EMPTY" \
--priority "Medium" \
--yes
Discovering Custom Field IDs
Jira custom field IDs (customfield_*) vary per instance. To find the correct
IDs for sprint, story points, components, etc., inspect an existing issue that
already has those fields set:
acli jira workitem search \
--jql "project = PROJ AND sprint in openSprints()" \
--fields "key" --limit 1 --json
acli jira workitem view PROJ-123 --fields "*all" --json \
| jq -r '
.fields | to_entries[]
| select(.value != null and .value != "" and .value != {} and .value != [])
| "\(.key): \(.value | tostring | .[:200])"
'
What to look for:
- Sprint: A
customfield_* containing a list of objects with boardId,
state, startDate, endDate keys
- Story points: A
customfield_* containing a plain number (e.g., 5)
- Components: Standard field
components (not a custom field) — array of
{"id": "...", "name": "..."} objects
You can also list all available fields:
acli jira field --help
Troubleshooting
Issue: JQL Syntax Error
acli jira workitem search --jql "project = TEAM" --count
acli jira workitem search --jql "project = TEAM AND status = Open" --count
acli jira workitem search \
--jql "project = TEAM AND status = Open AND assignee = currentUser()" \
--count
Issue: No Results from Search
acli jira project list | grep "TEAM"
acli jira filter get --id 10001
acli jira workitem search --jql "project = TEAM" --count
Issue: Bulk Operation Too Slow
acli jira workitem search --jql "project = TEAM" --count
acli jira workitem edit \
--jql "project = TEAM AND created >= -7d" \
--labels "batch1" \
--yes
acli jira workitem edit \
--jql "project = TEAM AND created < -7d AND created >= -14d" \
--labels "batch2" \
--yes
Issue: Authentication Expired
acli jira auth status
acli jira auth login
acli jira auth switch
Issue: Permission Denied
acli jira workitem view KEY-123
acli jira project view --key "TEAM"
Advanced Usage
Combining with Other Tools
acli jira workitem search \
--jql "project = TEAM" \
--json | jq '.[] | {key: .key, summary: .fields.summary}'
acli jira workitem search \
--jql "project = TEAM" \
--csv | xsv select key,summary,assignee
acli jira workitem search \
--jql "project = TEAM" \
--fields "key,summary" | grep "authentication"
Scripting Examples
while IFS= read -r summary; do
acli jira workitem create \
--summary "$summary" \
--project "TEAM" \
--type "Task" \
--assignee "@me"
done < tasks.txt
for key in KEY-{100..110}; do
acli jira workitem transition \
--key "$key" \
--status "Done" \
--yes 2>/dev/null
done
Quick Reference
acli jira auth login
acli jira auth status
acli jira workitem search --jql "JQL_QUERY"
acli jira workitem search --jql "JQL_QUERY" --fields "key,summary"
acli jira workitem search --filter FILTER_ID
acli jira workitem view KEY-123
acli jira workitem view KEY-123 --web
acli jira workitem create --summary "Title" --project "TEAM" --type "Task"
acli jira workitem edit --key "KEY-123" --summary "New title"
acli jira workitem edit --jql "JQL_QUERY" --assignee "@me"
acli jira workitem transition --key "KEY-123" --status "Done"
acli jira workitem comment create --key "KEY-123" --body "Comment"
acli jira project list
acli jira project view --key "TEAM"
acli jira workitem search --jql "JQL_QUERY" --csv > export.csv
acli jira workitem search --jql "JQL_QUERY" --json > export.json
Confluence
acli confluence is thinner than acli jira. It supports:
acli confluence page view --id <ID> — fetch a page (supports --json, --body-format, --include-labels, etc.)
acli confluence space list|view|create|update|archive|restore
acli confluence blog list|view|create
acli confluence auth login|status|switch|logout
There is no search subcommand. To search Confluence (CQL), use the companion script confluence-search.sh bundled with this skill, then hand the IDs to acli confluence page view --id <ID>.
Search with confluence-search.sh
The script sits alongside this SKILL.md. It reads an Atlassian API token from ~/.netrc and runs CQL against the Confluence REST API. Output is TSV (id\ttitle\turl) by default.
confluence-search.sh "BFF client"
confluence-search.sh --space SBP "pagination"
confluence-search.sh --cql 'label = "bff" AND type = page ORDER BY lastmodified DESC'
confluence-search.sh --json "BFF" | jq '.results'
id=$(confluence-search.sh "BFF Client Integration Guide" | head -1 | cut -f1)
acli confluence page view --id "$id" --json
Setup (one-time)
- Create an Atlassian API token at https://id.atlassian.com/manage-profile/security/api-tokens
- Add to
~/.netrc:
machine thescore.atlassian.net
login your@email.com
password <API-TOKEN>
chmod 600 ~/.netrc
Override the host with CONFLUENCE_HOST=othersite.atlassian.net confluence-search.sh ....
Sandbox note for Claude Code
~/.netrc is in Claude Code's default sandbox deny list, so the script can't read it from a sandboxed Bash call. Set dangerouslyDisableSandbox: true when invoking:
Bash(command="confluence-search.sh 'BFF client'", dangerouslyDisableSandbox=true)
This is the same rule already in force for all acli invocations — different reason (acli hits Keychain; the script hits ~/.netrc), same fix.
Why not reuse acli's stored token?
~/.config/acli/confluence_config.yaml stores the token as !!binary ciphertext, decrypted at runtime via a key stored in the macOS Keychain. Reversing that encryption is fragile and version-dependent. A dedicated API token in ~/.netrc is the clean path.
Summary
Primary directives:
- Always authenticate first using
acli jira auth login
- Test JQL queries before bulk operations
- Use --yes flag carefully to avoid unintended changes
- Select appropriate output format (default, json, csv, web)
- Use pagination for large result sets
- Verify permissions before attempting operations
- Use --ignore-errors for resilient bulk operations
Most common operations:
acli jira workitem search --jql "..." - Find work items
acli jira workitem view KEY-123 - View details
acli jira workitem create - Create new work item
acli jira workitem edit - Update work items
acli jira workitem transition - Change status
acli jira workitem comment create - Add comments
acli jira project list - List projects
Key features:
- Powerful JQL search capabilities
- Bulk operations with safety controls
- Multiple output formats (table, JSON, CSV, web)
- Pagination for large datasets
- Integration-friendly JSON output