| name | jira-task-init |
| description | Fetch assigned high-priority Jira tasks and set up git worktrees for each (count, issue key, or natural language). Triggers: jira-task init, init sprint, setup tasks; ์์
ํ๊ฒฝ ์ธํ
, ์คํ๋ฆฐํธ ์ด๊ธฐํ, ํ ๋น๋ ์์
๊ฐ์ ธ์. |
| user-invocable | false |
| argument-hint | [count | ISSUE-KEY | ์์ฐ์ด์ค๋ช
] |
| allowed-tools | ["Read","Write","Edit","Bash","Glob","mcp__atlassian__jira_search","mcp__atlassian__jira_get_issue","mcp__atlassian__jira_add_comment","mcp__atlassian__jira_get_agile_boards","mcp__atlassian__jira_get_sprints_from_board"] |
jira-task-init: Bulk Sprint/Task Initialization
Language Rule: ํ๋ก์ ํธ CLAUDE.md์ Conventions ์น์
์ฐธ๊ณ (ํ๊ตญ์ด ์ถ๋ ฅ, Jira ์ฝ๋ฉํธ ์ ๋ชฉ์ ์์ด).
๋์๊ฒ ํ ๋น๋ Jira ํ์คํฌ๋ฅผ ์ฐ์ ์์ ์์ผ๋ก ๊ฐ์ ธ์์ ๊ฐ๊ฐ git worktree๋ฅผ ์์ฑํ๊ณ
์์
์ปจํ
์คํธ๋ฅผ ์ธํ
ํ๋ ์ผ๊ด ์ฒ๋ฆฌ ์ํฌํ๋ก์ฐ.
Prerequisites
- Jira MCP ์๋ฒ ์ฐ๊ฒฐ๋จ
- ํ์ฌ ๋๋ ํ ๋ฆฌ๊ฐ git repository ๋ด๋ถ
- ํ๊ฒฝ๋ณ์: JIRA_URL, JIRA_USERNAME, JIRA_API_TOKEN
Workflow
Step 0: Argument Parsing
์ธ์๋ฅผ ๋ถ์ํ์ฌ 3๊ฐ์ง ๋ชจ๋ ์ค ํ๋๋ก ๋ถ๋ฅํ๋ค:
- ์ซ์ (Count ๋ชจ๋): ์ธ์๊ฐ ์๊ฑฐ๋ ์ซ์๋ง ์์ผ๋ฉด โ ๊ธฐ์กด ๋์. Step 1๋ก ์งํ.
- ์ด์ ํค (Issue Key ๋ชจ๋): ์ธ์์ Jira ์ด์ ํค ํจํด(
[A-Z]+-\d+, ์: MAE-2, PROJ-123)์ด ํฌํจ๋๋ฉด โ Step 1-B๋ก ์งํ.
- ์:
"MAE-2", "MAE-2 ํ์์์
๋ถ์ํด์ ์ฐฉ์ ๊ฐ๋ฅํ ๊ฒ๋ง"
- ์์ฐ์ด ์์ ์ด์ ํค๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ์๋ ์ด์ ํค๋ฅผ ์ถ์ถํ์ฌ Issue Key ๋ชจ๋๋ก ์ฒ๋ฆฌ
- ์์ฐ์ด (์ด์ ํค ๋ฏธํฌํจ): ์ด์ ํค ํจํด์ด ์๋ ์์ฐ์ด๋ง ์์ผ๋ฉด โ ์ฌ์ฉ์์๊ฒ ์ด์ ํค๋ฅผ ํ์ธ ์์ฒญ. ์ด์ ํค๋ฅผ ๋ฐ์ผ๋ฉด Step 1-B, ์ซ์๋ฅผ ๋ฐ์ผ๋ฉด Step 1๋ก ์งํ.
Step 1: Fetch My Assigned Tasks (Count ๋ชจ๋)
์ฌ์ฉ์์๊ฒ ๋ช ๊ฐ์ ํ์คํฌ๋ฅผ ๊ฐ์ ธ์ฌ์ง ํ์ธ (๊ธฐ๋ณธ๊ฐ: 5).
JQL ์ฟผ๋ฆฌ๋ก ๋์๊ฒ ํ ๋น๋ ๊ณ ์ฐ์ ์์ ํ์คํฌ ์กฐํ.
JIRA_DEFAULT_PROJECT๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด ๋ฐ๋์ project = <JIRA_DEFAULT_PROJECT> ์กฐ๊ฑด์ ํฌํจํด์ผ ํ๋ค.
Use mcp__atlassian__jira_search with JQL:
project = <JIRA_DEFAULT_PROJECT> AND assignee = currentUser() AND status NOT IN (Done, Closed) ORDER BY priority DESC, created ASC
fields="summary,status,priority,issuetype,assignee"
limit=20
๋๋ ํ์ฑ ์คํ๋ฆฐํธ๊ฐ ์์ผ๋ฉด ์คํ๋ฆฐํธ ๊ธฐ๋ฐ์ผ๋ก ์กฐํ:
mcp__atlassian__jira_get_agile_boards๋ก ๋ณด๋ ๋ชฉ๋ก ํ์ธ
mcp__atlassian__jira_get_sprints_from_board๋ก ํ์ฑ ์คํ๋ฆฐํธ ํ์ธ (boardId ํ์)
- JQL:
project = <JIRA_DEFAULT_PROJECT> AND sprint = <active-sprint-id> AND assignee = currentUser() AND status NOT IN (Done, Closed) ORDER BY priority DESC
๊ฒฐ๊ณผ์์ ์์ N๊ฐ(๊ธฐ๋ณธ 5๊ฐ)๋ง ์ ํ. โ Step 2๋ก ์งํ.
Step 1-B: Fetch Sub-tasks by Issue Key (Issue Key ๋ชจ๋)
Step 0์์ ์ถ์ถํ ์ด์ ํค๋ก ํด๋น ์ด์์ ํ์์์
์ ์กฐํํ๊ณ ์์กด์ฑ์ ๋ถ์ํ๋ค.
์์ธ ์ ์ฐจ: Read skills/jira-task-init/refs/issue-key-mode.md
์์ฝ:
- ๋ถ๋ชจ ์ด์ ์กฐํ (
fields="summary,status,issuetype,priority", comment_limit=0)
- JQL๋ก ๋ฏธ์๋ฃ ํ์์์
์กฐํ (
parent = <ISSUE-KEY> AND status NOT IN (Done, Closed))
- ๊ฐ ํ์์์
์ issuelinks ๋ถ์ โ
is blocked by ๋ฏธ์๋ฃ ๋ธ๋ก์ปค ์์ผ๋ฉด blocked ์ฒ๋ฆฌ
- ์ฐฉ์ ๊ฐ๋ฅ ์์
๋ง ์ ๋ณํ์ฌ ์์กด์ฑ ํ ์ถ๋ ฅ โ Step 2๋ก ์ ๋ฌ
Step 2: Display Task List
๊ฐ์ ธ์จ ํ์คํฌ ๋ชฉ๋ก์ ํ
์ด๋ธ๋ก ํ์:
Found <N> tasks assigned to you:
| # | Key | Summary | Priority | Status | Type |
|---|-----|---------|----------|--------|------|
| 1 | PROJ-101 | ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ | Highest | To Do | Story |
| 2 | PROJ-102 | API ์๋ฌ ํธ๋ค๋ง | High | To Do | Task |
| 3 | PROJ-103 | ๋์๋ณด๋ UI | High | In Progress | Story |
| 4 | PROJ-104 | ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง | Medium | To Do | Task |
| 5 | PROJ-105 | ๋ฌธ์ ์
๋ฐ์ดํธ | Medium | To Do | Task |
์ฌ์ฉ์์๊ฒ ํ์ธ: "์ด ํ์คํฌ๋ค์ ๋ํด worktree๋ฅผ ์์ฑํ ๊น์? (์ ์ฒด ๋๋ ๋ฒํธ ์ ํ)"
Step 3: Detect Git Context
REPO_ROOT=$(git rev-parse --show-toplevel)
PROJECT_NAME=$(basename "$REPO_ROOT")
PARENT_DIR=$(dirname "$REPO_ROOT")
WORKTREE_BASE="$PARENT_DIR/${PROJECT_NAME}_worktree"
Base branch ๊ฐ์ง (์์๋๋ก ์๋):
git rev-parse --verify develop 2>/dev/null
git rev-parse --verify main 2>/dev/null
git rev-parse --verify master 2>/dev/null
Step 4: Ensure .gitignore
ํ๋ก์ ํธ์ .gitignore์ ์๋ ํญ๋ชฉ์ด ์์ผ๋ฉด bash๋ก ์ถ๊ฐ:
REPO_GITIGNORE="$REPO_ROOT/.gitignore"
if ! grep -qF ".jira-context.json" "$REPO_GITIGNORE" 2>/dev/null; then
printf '\n# Jira integration (local dev context)\n.jira-context.json\nTASK-README.md\n' >> "$REPO_GITIGNORE"
fi
์ด๋ฏธ ์กด์ฌํ๋ฉด ์คํต.
Step 5: Create Worktrees
์ ํ๋ ๊ฐ ํ์คํฌ์ ๋ํด ๋ธ๋์น/worktree ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ๋ค ์์ฑํ๊ณ , .gitignore๋ฅผ ๋๊ธฐํํ๋ค.
์์ธ ์ ์ฐจ: Read skills/jira-task-init/refs/worktree-creation.md
์์ฝ:
- ๋ธ๋์น+worktree ๋ชจ๋ ์์ผ๋ฉด โ "Already exists โ skipped"
- ๋ธ๋์น๋ง ์์ผ๋ฉด โ
git worktree add "$WORKTREE_BASE/<TASK-ID>" "feature/<TASK-ID>"
- ๋ ๋ค ์์ผ๋ฉด โ
git worktree add -b "feature/<TASK-ID>" "$WORKTREE_BASE/<TASK-ID>" <base-branch>
- ์์ฑ ํ worktree
.gitignore์ .jira-context.json / TASK-README.md ํญ๋ชฉ ์ถ๊ฐ (์์ผ๋ฉด)
- ์ค์: worktree๋ ๋ฐ๋์ ์๋ณธ ๋ ํฌ ์์ ๋๋ ํ ๋ฆฌ ์์ ์์ฑ (
<parent>/<project>_worktree/<TASK-ID>)
Step 5.5: Propagate MCP Config to Worktree
์ํฌํธ๋ฆฌ๋ ๋ณ๋์ ํ๋ก์ ํธ ๋ฃจํธ๋ก ์ธ์๋์ด MCP ์ค์ ์ด ์๋ ์์๋์ง ์๋๋ค.
scripts/propagate-mcp-config.sh๋ฅผ ํธ์ถํ์ฌ ๋ฉ์ธ ๋ ํฌ์ atlassian ์๋ฒ ์ค์ ์ ์ํฌํธ๋ฆฌ๋ก ์ ํํ๋ค.
์คํฌ๋ฆฝํธ ๊ฒฝ๋ก ๊ฒฐ์ ์ Read skills/_shared/script-lookup.md ํ lookup ๋ธ๋ก ์คํ:
REPO_ROOT_ABS="<REPO_ROOT ์ ๋๊ฒฝ๋ก>"
WORKTREE_ABS="<์ํฌํธ๋ฆฌ ์ ๋๊ฒฝ๋ก>"
SCRIPT_NAME="propagate-mcp-config.sh" OUT_VAR="PROPAGATE_SH"
if [ -n "$PROPAGATE_SH" ]; then
bash "$PROPAGATE_SH" "$REPO_ROOT_ABS" "$WORKTREE_ABS"
else
echo "propagate-mcp-config.sh not found โ skipping MCP propagation. Run /jira setup in the worktree if needed." >&2
fi
- ์ถ์ฒ ์ฐ์ ์์: project
.mcp.json > ~/.claude.json projects > ~/.claude.json top-level
atlassian ์๋ฒ๊ฐ ๋น ์ ธ ์์ผ๋ฉด ๊ฒฝ๊ณ ๋ง ์ถ๋ ฅํ๊ณ ์งํ
- ์ํฌํธ๋ฆฌ์์
.mcp.json์ ์ฒ์ ๋ก๋ํ๋ฉด ์ ๋ขฐ ์น์ธ ํ๋กฌํํธ๊ฐ ํ ๋ฒ ๋ฐ ์ ์๋ค
Step 6: Generate README for Each Worktree
๊ฐ worktree ๋๋ ํ ๋ฆฌ์ TASK-README.md ์์ฑ. ํฌํจ ํญ๋ชฉ:
- Issue Details (Key, Summary, Type, Priority, Status, Branch, Worktree, Initialized)
- Description (Jira ์ด์ ์ค๋ช
)
- Acceptance Criteria (์ค๋ช
์์ ์ถ์ถ)
- Workflow (
start โ test โ review โ done ๋ช
๋ น ์๋ด)
Step 7: Post Comments to Jira
๊ฐ ํ์คํฌ์ ์ฝ๋ฉํธ ๊ฒ์:
Use mcp__atlassian__jira_add_comment:
"๋ธ๋์น `feature/<TASK-ID>`์ worktree๊ฐ `<worktree-path>`์ ์ด๊ธฐํ๋์์ต๋๋ค."
Step 8: Save Context
๊ฐ worktree์ .jira-context.json ์์ฑ (์ธ์
์์ ์ hook์ด ์ฝ์ ์ ์๋๋ก):
{
"taskId": "PROJ-101",
"branch": "feature/PROJ-101",
"worktreePath": "<path>",
"repoRoot": "<REPO_ROOT ์ ๋๊ฒฝ๋ก>",
"baseBranch": "<detected base branch>",
"summary": "๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ",
"priority": "Highest",
"status": "To Do",
"completedSteps": ["init"],
"initializedAt": "<ISO timestamp>"
}
์๋ณธ ๋ ํฌ์๋ .jira-context.json ์ ์ฅ (์ ์ฒด ํ์คํฌ ๋ชฉ๋ก์ฉ). ๊ธฐ์กด aggregate๊ฐ ์์ผ๋ฉด ํต์งธ๋ก ๋ฎ์ด์ฐ์ง ๋ง๊ณ ๋ณํฉํ๋ค: ๊ธฐ์กด tasks[]์ ๊ฐ์ taskId ํญ๋ชฉ์ด ์์ผ๋ฉด ๊ทธ ํญ๋ชฉ์ completedStepsยทdeferredยทdeferredReasonยทํ์์คํฌํ๋ฅผ ๋ณด์กดํ๊ณ (์๋ ์ ๊ท ํ์คํฌ๋ง ์ถ๊ฐ), ์ต์์ ํ๋๋ ๊ฐฑ์ โ ์งํ ์ค ํ๋ฅผ ๋ฆฌ์
ํ๋ฉด loop/resume์ด ๊นจ์ง๋ค.
{
"initialized": "<ISO timestamp>",
"repoRoot": "<REPO_ROOT ์ ๋๊ฒฝ๋ก>",
"baseBranch": "<detected base branch>",
"worktreeBase": "<worktree base path>",
"tasks": [
{
"taskId": "PROJ-101",
"branch": "feature/PROJ-101",
"worktreePath": "<path>",
"repoRoot": "<REPO_ROOT ์ ๋๊ฒฝ๋ก>",
"summary": "๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ",
"priority": "Highest",
"status": "To Do"
}
]
}
Step 8.5: Dashboard Workspace Registration
์์ฑ๋ worktree๋ค์ด dashboard์ ์ฆ์ ๋ณด์ด๋๋ก, ๋ถ๋ชจ ๋ ํฌ($REPO_ROOT)๋ฅผ dashboard
workspace registry์ ๋ฑ๋กํ๋ค. (idempotent โ ์ด๋ฏธ ๋ฑ๋ก๋ผ ์์ผ๋ฉด lastSeenAt๋ง ๊ฐฑ์ .)
node "$CLAUDE_PLUGIN_ROOT/scripts/register-workspace.js" "$REPO_ROOT"
์คํจํด๋ ์ํฌํ๋ก๋ ์งํ (๋ฑ๋ก์ dashboard ๊ฐ์์ฑ์๋ง ์ํฅ).
Step 9: Completion Summary
.jira-context.json์ completedSteps์ "init" ์ถ๊ฐ.
๊ฒฐ๊ณผ๋ฅผ ํ
์ด๋ธ๋ก ํ์ํ ๋ค, ์๋ ํ์์ผ๋ก ์๋ฃ ์์ฝ ์ถ๋ ฅ:
| # | Task | Branch | Worktree Path | Status |
|---|------|--------|---------------|--------|
| 1 | PROJ-101 | feature/PROJ-101 | ../project_worktree/PROJ-101 | Created |
| 2 | PROJ-102 | feature/PROJ-102 | ../project_worktree/PROJ-102 | Created |
---
โ
**Init Complete**
- <N>๊ฐ worktree ์์ฑ๋จ
- Jira ์ฝ๋ฉํธ ๊ฒ์๋จ
- ์ปจํ
์คํธ `.jira-context.json`์ ์ ์ฅ๋จ
**Progress**: **init โ** โ start โ approach โ impl โ test โ review โ merge โ pr โ done
**Next**: `cd <worktree-path>` โ `/jira-task start <TASK-ID>`
---