一键导入
dev10x-jira
Use when querying, linking, or fetching JIRA issues — so credentials, hook-safe curl patterns, and hierarchy gotchas are always at hand
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when querying, linking, or fetching JIRA issues — so credentials, hook-safe curl patterns, and hierarchy gotchas are always at hand
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
View and customize playbooks (step-by-step procedures) for any orchestration skill. List playbook-powered skills, inspect plays, edit steps through a guided flow, or reset to defaults. TRIGGER when: user wants to view, edit, or customize playbook workflows for skills. DO NOT TRIGGER when: executing a playbook-powered skill (handled automatically by Dev10x:work-on or other orchestrators).
Post-upgrade cleanup entry point — delegates to `Dev10x:plugin-maintenance` in `full` mode. Updates plugin version paths, ensures base permissions, migrates config files (including global playbook overrides from ~/.claude/memory/Dev10x/playbooks/ to ~/.config/Dev10x/playbooks/, and databases.yaml from legacy/backup skill directories to ~/.config/Dev10x/databases.yaml), generalizes session-specific args, enumerates MCP tool globs, refreshes script coverage, merges worktree rules, audits for friction-causing patterns, and cleans redundant rules from project settings files. TRIGGER when: plugin version changes, permission prompts keep appearing, config files are at old locations, or user asks to fix permission friction. DO NOT TRIGGER when: permissions are working correctly, or you only need a fast bootstrap subset (use `Dev10x:plugin-maintenance bootstrap` instead).
Validate all pre-merge conditions and execute PR merge. Checks unresolved threads, CI status, draft state, mergeability, working copy, fixup commits, Fixes-linked scope delivery, and review approval before merging. TRIGGER when: PR is ready to merge and needs pre-merge validation. DO NOT TRIGGER when: PR is still draft, CI is failing, or review comments are unaddressed.
Restructure, polish, and clean up git commit history in the current branch before merging. Creates atomic, well-organized commits that tell a clear story. TRIGGER when: branch is ready for merge and commit history needs cleanup (squash fixups, reorder, reword). DO NOT TRIGGER when: branch has clean history already, or splitting individual commits (use Dev10x:git-commit-split).
Start work on any input — ticket URL, PR link, Slack thread, Sentry issue, or free text. Classifies inputs, gathers context in parallel, builds a supervisor-approved task list, and executes adaptively with pause/resume support. TRIGGER when: user provides ticket URLs, PR links, Slack threads, Sentry issues, or free text to start structured work. DO NOT TRIGGER when: simple one-off tasks that don't need structured planning, or parallel fanout of independent items (use Dev10x:fanout).
Validate and respond to PR review comments. Handles single comment (with follow-up offer) or batch mode for all unaddressed comments on a PR/review. Orchestrates Dev10x:gh-pr-triage and Dev10x:gh-pr-fixup. TRIGGER when: PR has review comments that need responses or fixes. DO NOT TRIGGER when: no review comments exist, or user wants to create a new PR (use Dev10x:gh-pr-create).
| name | Dev10x:jira |
| description | Use when querying, linking, or fetching JIRA issues — so credentials, hook-safe curl patterns, and hierarchy gotchas are always at hand |
| user-invocable | false |
| allowed-tools | ["Bash(${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/:*)"] |
Announce: "Using Dev10x:jira to [purpose]."
Supply your Atlassian tenant name (e.g., mycompany for
mycompany.atlassian.net) one of two ways — there is no default:
--tenant <name> as the first
argument, e.g. jira-get.sh --tenant mycompany PROJ-100. The flag
binds the tenant as a command argument, so the
Bash(.../scripts/:*) allow rule still matches — no env-prefix
friction (GH-311).JIRA_TENANT env var (used as the
fallback when --tenant is absent).Store credentials in the system keyring:
secret-tool store --label "JIRA email" service jira key email
secret-tool store --label "JIRA API token" service jira key api_token
All scripts live in ${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/ and are
pre-approved via allowed-tools.
| Script | Purpose | Example |
|---|---|---|
jira-get.sh | Fetch issue by key | jira-get.sh PROJ-100 |
jira-search.sh | Search by JQL | jira-search.sh "text ~ 'wheel nut'" |
jira-link.sh | Link two issues | jira-link.sh PROJ-100 "Blocks" PROJ-200 |
jira-link-types.sh | List available link types | jira-link-types.sh |
jira-update.sh | Update issue from JSON file | jira-update.sh PROJ-100 /tmp/payload.json |
jira-comment.sh | Add a comment from a file | jira-comment.sh PROJ-100 /tmp/body.md |
No create script (GH-631). These scripts read, search, link,
update, and comment — there is intentionally no jira-create.sh.
JIRA issue creation goes through the Atlassian MCP
mcp__claude_ai_Atlassian__createJiraIssue tool (pre-approved via
the mcp-atlassian-write baseline group). Dev10x:ticket-create's
JIRA branch calls it directly; see that skill's Step 5.
A tenant wrapper skill (e.g. acme:jira) binds a fixed
JIRA_TENANT and delegates here. Do NOT bind the tenant with a
command-line env prefix:
# ❌ Anti-pattern — env prefix shifts the allow-rule prefix
JIRA_TENANT=acme ${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-get.sh PROJ-1
The leading JIRA_TENANT=acme shifts the effective Bash command
prefix, so no Bash(.../scripts/jira-get.sh:*) allow rule can
ever match — every call hits the permission gate. This is the same
prefix-shift class as the global "No env-var prefix on git" rule.
For one-off or multi-tenant calls, pass --tenant <name> as the
first argument (see Prerequisites) — the tenant binds as a command
argument, so the allow rule still matches and no wrapper is needed:
# ✅ Flag form — tenant is an argument, allow rule matches (GH-311)
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-get.sh --tenant acme PROJ-1
To bind a fixed tenant across many ops, ship a wrapper script that sets the tenant inside the command, so the wrapper's own path is what the allow rule matches:
# ✅ Wrapper script — tenant binding inside, one allow rule, no friction
~/.claude/skills/acme:jira/scripts/jira-get.sh PROJ-1
A copy-paste starting point lives at
templates/jira-wrap.sh.example.
Each thin wrapper export JIRA_TENANT=<tenant> then execs the
matching base script. Pre-approve the wrapper directory with one rule:
"Bash(~/.claude/skills/acme:jira/scripts/:*)"
This keeps the tenant binding inside the skill (not scattered across user settings) and covers every base op — get, search, link, update, comment — without a per-script allow rule or an env-var prefix.
The alternative — setting JIRA_TENANT in ~/.claude/settings.json
under env: — also removes the prefix, but binds a single tenant for
the whole session and so cannot serve multiple tenants. Prefer the
wrapper-script approach.
The PreToolUse hook blocks for loops in Bash commands. Always call scripts individually — one call per Bash tool use.
# ❌ Blocked by hook
for payload in '...' '...'; do curl ...; done
# ✅ Separate tool calls
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-link.sh PROJ-100 "1-Relates" PROJ-200
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-link.sh PROJ-100 "1-Relates" PROJ-300
Task → Task parent assignment fails with: "Given parent work item does not belong to appropriate hierarchy."
Tasks can only be children of Epics. Use issue links instead for same-level relationships:
| Need | Use |
|---|---|
| Group related tasks | 1-Relates link |
| Sequence work | Blocks link (inward blocks outward) |
| True parent/child | Create an Epic and use the parent field |
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-get.sh PROJ-100
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-search.sh "text ~ 'search term' ORDER BY created DESC"
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-link.sh PROJ-100 "1-Relates" PROJ-200
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-link.sh PROJ-100 "Blocks" PROJ-200
HTTP 201 = success.
# Write ADF payload to a file first, then update
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-update.sh PROJ-100 /tmp/claude/jira-payload.json
HTTP 204 = success.
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-comment.sh PROJ-100 /tmp/claude/comment-body.md
${CLAUDE_PLUGIN_ROOT}/skills/jira/scripts/jira-link-types.sh