From alliance-jira
Use when asked to create, search, update, or transition Jira tickets. Use when user mentions KANBAN, SCRUM, AGRHELP, or MOD projects. Use when needing ticket status, assignments, or board views.
npx claudepluginhub alliance-genome/agr_claude_code --plugin alliance-jiraThis skill uses the workspace's default tool permissions.
Manage Jira tickets across all Alliance of Genome Resources projects.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
Manage Jira tickets across all Alliance of Genome Resources projects.
CRITICAL: DO NOT pipe curl output to python3, jq, or any other process. Piping causes intermittent empty-stdin failures that silently break JSON parsing. Always run curl commands standalone and read the raw JSON output directly.
CRITICAL: You MUST run this bash block when the skill is first loaded, before doing anything else. This is NOT optional. Always run it as the very first step when this skill initializes. Do not skip it or jump straight to Jira operations.
if [ -f ~/.alliance/jira/.env ]; then
source ~/.alliance/jira/.env
echo "Credentials loaded for: $JIRA_EMAIL"
else
echo "ERROR: Jira credentials not configured"
echo "Run the full setup guide"
fi
# Check for skill updates
PLUGIN_JSON=$(ls -t ~/.claude/plugins/cache/alliance-plugins/alliance-jira/*/.claude-plugin/plugin.json 2>/dev/null | head -1)
INSTALLED_VERSION=$(grep -o '"version": "[^"]*"' "$PLUGIN_JSON" 2>/dev/null | cut -d'"' -f4)
LATEST_VERSION=$(curl -sf --max-time 3 https://raw.githubusercontent.com/alliance-genome/agr_claude_code/main/plugins/alliance-jira/.claude-plugin/plugin.json 2>/dev/null | grep -o '"version": "[^"]*"' | cut -d'"' -f4)
if [ -z "$LATEST_VERSION" ]; then
echo "Skill version: ${INSTALLED_VERSION} (could not check for updates)"
elif [ "$INSTALLED_VERSION" != "$LATEST_VERSION" ]; then
echo "*** UPDATE AVAILABLE *** Installed v${INSTALLED_VERSION}, latest v${LATEST_VERSION}"
echo "Run: /plugin marketplace update alliance-plugins"
else
echo "Skill version: ${INSTALLED_VERSION} (up to date)"
fi
SECURITY: Never paste your API token into the chat. Edit files directly.
See setup.md for the complete guided setup process, which includes:
Need help? Contact Christopher Tabone (christopher.tabone@jax.org) or Slack.
When the skill is first loaded and credentials are verified, ask the user about API call permissions for the session using AskUserQuestion:
{
"questions": [{
"question": "I need to make Jira API calls. How would you like me to handle permissions for this session?",
"header": "Jira API",
"options": [
{"label": "Allow all Jira calls (Recommended)", "description": "Auto-approve all Jira API requests for this session"},
{"label": "Ask each time", "description": "I'll ask permission before each API call"}
],
"multiSelect": false
}]
}
If user selects "Allow all Jira calls": Proceed with all Jira API requests without further prompts. Before each API call, briefly state what you're doing (e.g., "Searching for Blue Team sprint tickets...") but don't ask for permission.
If user selects "Ask each time": Request permission before each curl command to Jira.
With session permission granted:
"Fetching current sprint tickets..."
[runs curl command]
"Found 15 tickets in the current sprint."
Without session permission:
"I need to run a curl command to fetch sprint tickets. May I proceed?"
[waits for approval]
[runs curl command]
Load these files only when needed for the specific task:
| Task | File |
|---|---|
| First-time setup | setup.md |
| Search with JQL | operations/search-tickets.md |
| Get/view a ticket | operations/read-tickets.md |
| Create a ticket | operations/create-tickets.md |
| Change status | operations/update-tickets.md |
| Add comments/links | operations/update-tickets.md |
| Projects & boards | reference/projects.md |
| Issue types & fields | reference/issue-types.md |
| Statuses & transitions | reference/statuses.md |
| Components | reference/components.md |
| Priorities | reference/priorities.md |
| Blue Team workflow | reference/blue-team.md |
<agent name>." (e.g., "Claude", "Codex"). Use ADF subsup mark with sub type for the attribution. This is non-negotiable — watchers and stakeholders need to know when a comment was AI-generated.| Purpose | Endpoint | Method |
|---|---|---|
| Search with JQL | /rest/api/3/search/jql | POST |
| Get issue count | /rest/api/3/search/approximate-count | POST |
| Get single issue | /rest/api/3/issue/{key} | GET |
| Bulk fetch issues | /rest/api/3/issue/bulkfetch | POST |
| Create issue | /rest/api/3/issue | POST |
| Update issue | /rest/api/3/issue/{key} | PUT |
| Transition issue | /rest/api/3/issue/{key}/transitions | POST |
| Add comment | /rest/api/3/issue/{key}/comment | POST |
| Board issues (via JQL) | /rest/api/3/search/jql | GET/POST |
All requests use Basic Auth:
-u "${JIRA_EMAIL}:${JIRA_API_KEY}"
source ~/.alliance/jira/.env
curl -s -X POST -u "${JIRA_EMAIL}:${JIRA_API_KEY}" \
"https://agr-jira.atlassian.net/rest/api/3/search/jql" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"jql": "project = KANBAN AND status = \"In Progress\" ORDER BY created DESC",
"maxResults": 20,
"fields": ["key", "summary", "status", "assignee", "priority"]
}'
source ~/.alliance/jira/.env
curl -s -u "${JIRA_EMAIL}:${JIRA_API_KEY}" \
"https://agr-jira.atlassian.net/rest/api/3/issue/KANBAN-123" \
-H "Accept: application/json"
source ~/.alliance/jira/.env
curl -s -X POST -u "${JIRA_EMAIL}:${JIRA_API_KEY}" \
"https://agr-jira.atlassian.net/rest/api/3/search/jql" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"jql": "project = KANBAN AND component = \"AI Curation\" ORDER BY updated DESC",
"maxResults": 20,
"fields": ["key", "summary", "status", "assignee", "priority"]
}'
source ~/.alliance/jira/.env
curl -s -X POST -u "${JIRA_EMAIL}:${JIRA_API_KEY}" \
"https://agr-jira.atlassian.net/rest/api/3/issue/KANBAN-123/transitions" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"transition": {"id": "21"}}'
See reference/statuses.md for all transition IDs.
| Board | ID | Project |
|---|---|---|
| Main Board | 61 | KANBAN |
| AI Curation | 169 | KANBAN |
| A-Team | 66 | SCRUM |
| Blue Team | 65 | SCRUM |
| Transition | ID |
|---|---|
| Backlog | 41 |
| To Do | 11 |
| In Progress | 21 |
| Ready for UAT | 51 |
| Release | 2 |
| Done | 31 |
| Type | ID |
|---|---|
| Task | 10000 |
| Story | 10003 |
| Bug | 10004 |
| Epic | 10002 |
| Priority | ID |
|---|---|
| Highest | 1 |
| High | 2 |
| Medium | 3 |
| Low | 4 |
| Lowest | 5 |
See reference files for complete lists.
Description and comment fields use ADF:
{
"type": "doc",
"version": 1,
"content": [
{
"type": "paragraph",
"content": [
{"type": "text", "text": "Your text here"}
]
}
]
}
See operations/create-tickets.md for full ADF examples.
| Mistake | Fix |
|---|---|
Piping curl output to python3 for JSON parsing | NEVER do this - causes intermittent empty-stdin failures. Read raw curl JSON output directly. |
| Plain text in description/comment fields | Use Atlassian Document Format (ADF) - see above |
| Transitioning to Done without resolution | Include "fields": {"resolution": {"name": "Done"}} |
| Modifying tickets not assigned to you | Always GET ticket first to verify assignee |
| Pasting API token in chat | Edit ~/.alliance/jira/.env directly |
Missing X-Atlassian-Token on attachments | Add header: X-Atlassian-Token: no-check |