| name | jira-task-create |
| description | Interactively create a new Jira issue (and optional sub-tasks) from conversation context โ gathers details via dialog and creates in Jira. Triggers: jira-task create, create task, new task; Jira ์ด์ ๋ง๋ค์ด, ํ์คํฌ ๋ฑ๋ก, ์ด์ ์์ฑ. |
| user-invocable | false |
| argument-hint | [์ด๊ธฐ ํํธ / ์์ฐ์ด ์ค๋ช
] |
| allowed-tools | ["Read","Bash","AskUserQuestion"] |
jira-task-create: Create New Jira Issue (with Sub-tasks & Dependencies)
Language Rule: ํ๋ก์ ํธ CLAUDE.md์ Conventions ์น์
์ฐธ๊ณ (ํ๊ตญ์ด ์ถ๋ ฅ). ์ถ๊ฐ: AskUserQuestion ์ง๋ฌธ/์ ํ์ง, ์์ฑ ์ด์ ๋ณธ๋ฌธ(summary/description)๋ ํ๊ตญ์ด. ์ด์ ํค, ํ๋๋ช
(priority/labels), JSON ํค๋ ์์ด ์ ์ง.
Jira ํธ์ถ: Read skills/_shared/jira-cli.md โ ๋ชจ๋ Jira ํธ์ถ์ python3 "<scripts>/jira-cli.py" โฆ Bash ํธ์ถ. ํธ์ถ prompt๊ฐ <scripts>/ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์คฌ์ผ๋ฉด ๊ทธ๋๋ก, ์์ผ๋ฉด skills/_shared/script-lookup.md๋ก SCRIPT_NAME="jira-cli.py" 1ํ ํด์.
์ค์: Read skills/jira-task-create/refs/mcp-schema.md โ create JSON ๊ท์น, ํด๋ฐฑ ์ ๋ต, ๋งํฌ ๋ฐฉํฅ์ฑ ์ฃผ์์ฌํญ์ ๋ฐ๋์ ์์ง ํ Step 6์ ์งํํ๋ค.
Overview
์ ๊ท Jira ์ด์ ์์ฑ ๋จ๊ณ (PDCA์ init ์ด์ ). ์๋ฃ ํ /jira-task init <parent-key> ๋๋ start <key>๋ก ํฉ๋ฅ.
ํต์ฌ:
- ์ปจํ
์คํธ ์ฐ์ : ๋ํ์ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ง๋ฌธ ์ต์ํ, ๋ถ์กฑํ๋ฉด
AskUserQuestion ๋ฐฐ์น ์ง๋ฌธ
- ์๋ ์๋ธํ์คํฌ ํ๋จ: ์คํฌ์ด ๋ถํด ํ์ ์ฌ๋ถ ํ๋จ โ ์ด์ ์ ์ โ ์ฌ์ฉ์ ํ์ธ
- ์์กด์ฑ: ์๋ธํ์คํฌ ๊ฐ
Blocks ์ด์ ๋งํฌ (์์ผ๋ฉด ๋ณ๋ ฌ, jira-task-init์ ์ฐฉ์ ๋ถ์๊ณผ ํธํ)
- ์ํฝ ์ฐ๊ฒฐ: ์์ ์ด์๋ฅผ ๊ธฐ์กด ์ํฝ์ ์ฐ๊ฒฐ ๊ฐ๋ฅ
Prerequisites
jira-cli.py whoami ์ฑ๊ณต (์๊ฒฉ์ฆ๋ช
์ ํจ) โ ์คํจ ์ /jira setup ์๋ด ํ ์ข
๋ฃ
JIRA_DEFAULT_PROJECT ํ๊ฒฝ๋ณ์๊ฐ ์์ผ๋ฉด ํ๋ก์ ํธ ํค๋ก ์ฌ์ฉ(CLI create๋ "project" ์๋ต ์ ์๋ ์ฌ์ฉ), ์์ผ๋ฉด Step 2์์ ์ฌ์ฉ์์๊ฒ ๋ฌป๋๋ค
.jira-epic.json(Epic ์ค์ฝํ)์ด ์์ผ๋ฉด ์์ฑ ์ด์์ Epic ๋งํฌ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉ. ์์ผ๋ฉด ์ง๊ธ๊น์ง์ฒ๋ผ Epic ์์ด ์์ฑ
Workflow
Step 0: Parse Argument & Check Connection
$ARGUMENTS์์ ํ ํฐ์ ์ถ์ถํ๋ค.
--from-requirements <path> ํ ํฐ์ ๋จผ์ ์ธ์ํ๋ค (์์น ๋ฌด๊ด, ๋จ ํ ๋ฒ๋ง ํ์ฉ).
- ํ ํฐ์ ๋ฐ๊ฒฌํ๋ฉด
importMode = true, importPath = <path>๋ก ์ค์ ํ๋ค.
<path>๊ฐ ๋๋ฝ๋์๊ฑฐ๋ ๋ค์ ํ ํฐ์ด ๋ ๋ค๋ฅธ ํ๋๊ทธ/์ต์
์ด๋ฉด E1(๊ฒฝ๋ก ๋๋ฝ)์ผ๋ก ์ฒ๋ฆฌํ๋ค.
- ๋๋จธ์ง ํ
์คํธ๋ ์์ฐ์ด ํํธ(
topic)๋ก ๋ณด์กดํ๋ค (๋น์ด ์์ด๋ OK).
- ์ธ์ ์ถฉ๋ ์ฒ๋ฆฌ:
importMode = true์ด๋ฉด์ ์์ฐ์ด ํํธ๊ฐ ๋์์ ์กด์ฌํ๋ ๊ฒฝ์ฐ, import๋ฅผ ์ฐ์ ํ๋ค.
- ์์ฐ์ด ํํธ๋ Epic description์ ์ถ๊ฐ ์ปจํ
์คํธ๋ก๋ง ์ฌ์ฉํ๋ค.
- ์๋ ์๋ธํ์คํฌ ๋ถํด(Step 3/4)๋ import ๋ชจ๋์์ ์ ๋ ๋์ํ์ง ์๋๋ค (ํ๊ท ๊ธ์ง).
- Jira ์ฐ๊ฒฐ ํ์ธ:
python3 "<scripts>/jira-cli.py" whoami ํธ์ถ. ์คํจํ๋ฉด "/jira setup์ ๋จผ์ ์คํํ์ธ์" ์๋ด ํ ์ข
๋ฃ.
- Epic ์ค์ฝํ ๋ก๋:
Read skills/_shared/epic-scope.md ํ ๊ฒฝ๋ก ๊ฒฐ์ + ์ฝ๊ธฐ ๋ธ๋ก์ ์คํํด epicScope๋ฅผ ์ธํ
ํ๋ค (ํ์ผ ์๊ฑฐ๋ ํ์ฑ ์คํจ โ null, ์งํ์๋ ์ํฅ ์์). ๋ก๋๋๋ฉด ์ฌ์ฉ์์๊ฒ 1์ค ์๋ฆฐ๋ค:
๐ Epic ์ค์ฝํ ์ ์ฉ: MAE-100 (v1.0 ๋ฆด๋ฆฌ์ค)
์ฐ์ ์์: ๋ํ์์ ์ฌ์ฉ์๊ฐ Epic์ ๋ช
์ํ์ผ๋ฉด ๊ทธ ๊ฐ์ด epicScope๋ณด๋ค ์ฐ์ ํ๋ค. ํ์ผ์ ๊ธฐ๋ณธ๊ฐ์ผ ๋ฟ์ด๋ค.
importMode ํ๋๊ทธ๋ ์ดํ ๋จ๊ณ ์งํ ํ๋ฆ์ ๋ถ๊ธฐ์ ์ด๋ค. importMode = true์ด๋ฉด Step 1.5๋ฅผ ๊ฑฐ์ณ Step 1~4๋ฅผ skipํ๊ณ Step 5๋ก ์งํํ๋ค.
--from-requirements ์ธ์ ํ์:
- ํ์:
/jira-task create --from-requirements <path>
<path>: ์๊ตฌ์ฌํญ ๋ฌธ์์ ์๋ ๋๋ ์ ๋ ๊ฒฝ๋ก (์: docs/requirements/sample.requirements.md)
- ์๋ ๊ฒฝ๋ก๋ ์ํฌํธ๋ฆฌ/๋ฆฌํฌ ๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์ํ๋ค.
Step 1.5: Parse Requirements Document (โ
import ๋ชจ๋ ์ ์ฉ)
์คํ ์กฐ๊ฑด: importMode = true. importMode = false์ด๋ฉด ๋ณธ ๋จ๊ณ๋ฅผ skipํ๊ณ Step 1๋ก ์ด๋ํ๋ค.
ํ์: Read skills/jira-task-create/refs/from-requirements-mode.md โ ํ์ผ ๊ฒ์ฆยท์น์
์ถ์ถยทํธ๋ฆฌ ํ์ฑยทImportPayload ๊ตฌ์ฑยทTreeโIssue Mapping ํ ์ ์ฒด๋ฅผ ์ด ํ์ผ์์ ํ์ธํ๋ค.
ํ์ฑ ์ฑ๊ณต ์ Step 5(Final Preview)๋ก ์ ํํ๋ค. Step 1~4๋ skipํ๋ค.
Step 1: Assess Context Sufficiency
import ๋ชจ๋์์๋ ๋ณธ ๋จ๊ณ๋ฅผ skipํ๊ณ Step 5๋ก ์งํํ๋ค.
ํ์ฌ ๋ํ ์ปจํ
์คํธ + ์ด๊ธฐ ํํธ๋ฅผ ํฉ์ณ์ ์๋ ํ์ ์ ๋ณด๋ฅผ ์ฑ์ธ ์ ์๋์ง ํ๊ฐํ๋ค:
ํ์ ์ ๋ณด:
ํ๋จ ๊ธฐ์ค:
- ํ์ ์ ๋ณด ์ค 2๊ฐ ์ด์ ๋ถ์กฑ ๋๋ description์ด ํ ์ค ์์ฝ ์์ค โ Step 2๋ก ์งํ
- ํ์ ์ ๋ณด๊ฐ ๋๋ถ๋ถ ์ถฉ์กฑ โ Step 3๋ก ์งํํ๊ณ , ๋ถ์กฑํ ๊ฒ๋ง ๊ฐ๋จ ํ์ธ
Step 2: Gather Missing Info via AskUserQuestion (์กฐ๊ฑด๋ถ)
import ๋ชจ๋์์๋ ๋ณธ ๋จ๊ณ๋ฅผ skipํ๋ค.
Phase A โ ์์ ์ด์ ํต์ฌ ์ ๋ณด (AskUserQuestion 1ํ, ์ฌ๋ฌ question ๋ฐฐ์น)
๋ถ์กฑํ ๊ฒ๋ง ์ ํ์ ์ผ๋ก ํฌํจ:
- ์์ฝ(Summary): ์ด์ ํ ์ค ์ ๋ชฉ
- ์ด์ ํ์
:
Task / Story / Bug / Epic (๊ธฐ๋ณธ ์ถ์ฒ: ๊ธฐ๋ฅโStory, ๋จ์ผโTask, ๋ฒ๊ทธโBug)
- Priority:
Highest / High / Medium / Low / Lowest (๊ธฐ๋ณธ: Medium)
- ํ๋ก์ ํธ ํค (
JIRA_DEFAULT_PROJECT ์์ ๋๋ง): python3 "<scripts>/jira-cli.py" projects ๋ชฉ๋ก์์ ์ ํ
Phase B โ ์ค๋ช
๋ณด๊ฐ (A ๋ต๋ณ ํ ์ค๋ช
์ด ์ฌ์ ํ ๋ถ์กฑํ๋ฉด)
AskUserQuestion์ผ๋ก ๋ฐฐ๊ฒฝยทAC ํํธยท๊ธฐ์ ์ ๊ทผยท์ ์ธ ๋ฒ์ ์ค ํ์ํ ๊ฒ๋ง ์ง๋ฌธ.
Phase C โ ์ ํ ์ ๋ณด (A/B ์๋ฃ ํ)
Epic ์ฐ๊ฒฐ ์ฌ๋ถ, Labels, Components, Assignee๋ฅผ ๋ฐฐ์น ์ง๋ฌธ.
epicScope๊ฐ ์์ผ๋ฉด Epic ์ฐ๊ฒฐ ์ง๋ฌธ๊ณผ ์๋ ์ ํ ์๋ธ ํ๋ก์ฐ๋ฅผ ํต์งธ๋ก skipํ๋ค โ ์ด๋ฏธ ์ ํด์ง ๊ฐ์ด๋ฏ๋ก ๋ค์ ๋ฌป์ง ์๋๋ค. ๋ค๋ฅธ Epic์ผ๋ก ๋ฐ๊พธ๋ ค๋ฉด /jira-task epic set <ํค>.
Epic ์ ํ ์๋ธ ํ๋ก์ฐ (์ฌ์ฉ์๊ฐ "๊ธฐ์กด ์ํฝ ์ ํ"ํ ๊ฒฝ์ฐ):
python3 "<scripts>/jira-cli.py" search "issuetype = Epic AND status != Done ORDER BY created DESC" --limit 10 (project = ์กฐ๊ฑด์ JIRA_DEFAULT_PROJECT๊ฐ ์์ผ๋ฉด CLI๊ฐ ์๋ ์ฝ์
, ์์ผ๋ฉด project = <PROJECT_KEY> AND๋ฅผ ์์ ๋ถ์ธ๋ค)
- ์์ 10๊ฐ ํ
์ด๋ธ ํ์ ํ
AskUserQuestion์ผ๋ก ์ํฝ ํค ์ ํ
Step 3: Decide Sub-task Split (์คํฌ ์๋ ํ๋จ)
import ๋ชจ๋์์๋ ๋ณธ ๋จ๊ณ๋ฅผ skipํ๊ณ Step 4.9(Granularity Check)๋ก ๊ฐ๋ค. ํธ๋ฆฌ๋ ์ด๋ฏธ ์ ํด์ ธ ์์ผ๋ฏ๋ก ํ์ ์ฌ๋ถ๋ฅผ ๋ค์ ํ๋จํ์ง ์์ง๋ง, ๋ถํด ์ ๋๋ Step 4.9์์ ๊ฒ์ฌํ๋ค.
์์ง๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์คํฌ์ด ์ง์ ์๋ธํ์คํฌ ํ์ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
ํ๋จ ์์๋ discover์ ๋์ผํ๊ฒ ํ์ผ๊ตฐ์ด ๋จผ์ ๋ค. ์๊ตฌ์ฌํญ ํญ๋ชฉ์์ ์๋ธํ์คํฌ๋ก ๊ณง์ฅ ๋ด๋ ค๊ฐ์ง ์๋๋ค.
- ์ด ์ผ์ ๋๋ด๋ ค๋ฉด ์ด๋ค ํ์ผ/๋ชจ๋์ ๊ณ ์ณ์ผ ํ๋์ง ๋จผ์ ๋์ดํ๋ค.
- ๊ฐ์ด ๊ณ ์ณ์ผ ๋ง์ด ๋๋ ํ์ผ๋ค์ ํ ๋ฉ์ด๋ฆฌ๋ก ๋ฌถ๋๋ค.
- ๋ฉ์ด๋ฆฌ๊ฐ 2๊ฐ ์ด์์ผ ๋๋ง ์๋ธํ์คํฌ๋ฅผ ๋ง๋ ๋ค. ๋ฉ์ด๋ฆฌ 1๊ฐ๋ฉด ๋จ์ผ ์ด์๋ค.
| ์๋ธํ์คํฌ ํ์ | ์๋ธํ์คํฌ ๋ถํ์ |
|---|
| ํ์ผ๊ตฐ ๋ฉ์ด๋ฆฌ 2๊ฐ ์ด์ (์๋ฒ/ํ๋ฉด, ๊ณ์ฝ/๊ตฌํ ๋ฑ) | ๋จ์ผ ํ์ผ/ํจ์ ์์ |
| ๋ฉ์ด๋ฆฌ๋ผ๋ฆฌ ์์ฐจ ์์กด์ด ๋ช
ํ | ๋ฒ๊ทธ ์์ (๋จ์ผ ์์ธ) |
| ๋ฉ์ด๋ฆฌ๋ณ๋ก ๋ฐ๋ก ๋จธ์งํด๋ ์ ์ฅ์๊ฐ ๋ง์ด ๋จ | ์๊ท๋ชจ ๋ฆฌํฉํ ๋ง / ๋ฌธ์ ์
๋ฐ์ดํธ |
"๊ฒ์ฆ ๋จ์๊ฐ ์ฌ๋ฌ ๊ฐ"๋ ๋ถํด ๊ทผ๊ฑฐ๊ฐ ์๋๋ค. ๊ฒ์ฆ ๋จ์์ ๋จธ์ง ๋จ์๋ ๋ค๋ฅด๋ค. ํ ๋ฒ์ ์์ ์ผ๋ก ์ฌ๋ฌ ์๊ตฌ์ฌํญ์ด ๋์์ ์ถฉ์กฑ๋๋ ์ผ์ด ํํ๋ค.
์๋ธํ์คํฌ๋ฅผ ๋ง๋ค๊ธฐ๋ก ํ๋ค๋ฉด ๊ฐ์๊ฐ ์๋๋ผ ๊ฒฝ๊ณ๋ฅผ ์ ํ๋ค. ์๋ธํ์คํฌ ํ๋๋ worktree ํ๋(jira-task-init)์ด๋ฏ๋ก, ๊ฐ์ ํ์ผ์ ๊ฑด๋๋ฆฌ๋ ํญ๋ชฉ์ ๋๋๋ฉด ๋ณ๋ ฌ ์งํ์ด ๋งํ๊ณ ๋ฆฌ๋ฒ ์ด์ค๋ง ๋์ด๋๋ค. ์ ํจํ ๊ฒฝ๊ณ๋ ๋๊ฐ [์๋ฒ] / [ํ๋ฉด] ๋๋ ๊ณ์ฝ / ๊ตฌํ ํ ์ค์ด๋ค.
ํ๋จ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ ์๋ธํ์คํฌ์ ํ์ผ๊ตฐ๊ณผ ํจ๊ป ์ฌ์ฉ์์๊ฒ ํฌ๋ช
ํ๊ฒ ๊ณต์ ํ Step 4 ๋๋ Step 5๋ก ์งํ.
Step 4: Propose Sub-task Breakdown (๋ถํด ํ์ํ ๊ฒฝ์ฐ)
import ๋ชจ๋์์๋ ๋ณธ ๋จ๊ณ๋ฅผ skipํ๊ณ Step 5๋ก ์งํํ๋ค.
์ด์ ํ
์ด๋ธ ํ์ (# / Summary / ๋ฒ์(ํ์ผ/๋ชจ๋) / Type / Priority / Depends on / Parallel?).
์ค๊ณ ๊ท์ฝ:
๋ฒ์ ์นธ์ ํ์๋ค. Step 3์์ ๋ฌถ์ ํ์ผ๊ตฐ ๋ฉ์ด๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์ฎ๊ธด๋ค. ์ฑ์ธ ์ ์๋ ํญ๋ชฉ์ ์๋ธํ์คํฌ๊ฐ ์๋๋ฏ๋ก ์๋ค์ ํฉ์น๋ค
Depends on์ด ๋น์ด ์์ผ๋ฉด Parallel โ
- ์์กด์ฑ์
Blocks ์ด์ ๋งํฌ๋ก ์ ์ฅ๋จ (init <parent-key>๊ฐ ์ฐฉ์ ๊ฐ๋ฅ ๋ถ์์ ํ์ฉ)
๋ฒ์ ๊ฐ์ ๊ฐ ์๋ธํ์คํฌ description ๋ณธ๋ฌธ์๋ ๋ฒ์: <๊ฐ> ํ ์ค๋ก ํฌํจ์ํจ๋ค
์ฌ์ฉ์ ํ์ธ (AskUserQuestion): ๊ทธ๋๋ก ์งํ / ์์ ์์ฒญ / ์๋ธํ์คํฌ ์์ด ๋จ์ผ ์ด์๋ก / ์ทจ์
Step 4.9: Granularity Check
์คํ ์กฐ๊ฑด: ์๋ธํ์คํฌ๊ฐ 2๊ฑด ์ด์์ธ ๋ชจ๋ ๊ฒฝ๋ก.
- import ๋ชจ๋:
breakdownLevel์ด L2 ๋๋ L3. L1์ด๋ฉด skip. ํ์ ์
๋ ฅ์ ๊ฐ Subtask์ scope ํ๋(from-requirements-mode.md ์ฐธ๊ณ ).
- default ๋ชจ๋: Step 4์์ ์๋ธํ์คํฌ ์ด์์ ๋ง๋ ๊ฒฝ์ฐ. ํ์ ์
๋ ฅ์ ์ด์ ํ
์ด๋ธ์
๋ฒ์ ์นธ.
import ๋ชจ๋๋ Step 3/4์ ๋ถํด ํ๋จ์ ๊ฑด๋๋ฐ๊ณ , default ๋ชจ๋๋ ์คํฌ์ด ๋ฐฉ๊ธ ์๊ธฐ๊ฐ ์ด ์ด์์ ๊ทธ๋๋ก ๋ฐ๊ณ ๋๊ฐ๋ค. ์ด๋ ์ชฝ์ด๋ ๊ณผ๋ถํด๋ ํธ๋ฆฌ๊ฐ Jira์ ๋ฐํ๋ ๊ฒฝ๋ก๊ฐ ์ด๋ ค ์๋ค. ๋ณธ ๋จ๊ณ๊ฐ ๋ง์ง๋ง ๋ฐฉ์ด์ ์ด๋ค.
๊ฐ์๋ ๊ฒ์ฌํ์ง ์๋๋ค. ์๋ธํ์คํฌ๊ฐ ๋ช ๊ฑด์ด์ด์ผ ํ๋์ง๋ ์ผ์ ํฌ๊ธฐ๊ฐ ์ ํ๋ฉฐ, 15๊ฑด์ด ๋ง๋ ์์
๋ ์๋ค. ์ฌ๊ธฐ์ ๋ณด๋ ๊ฒ์ ํ์ผ ๋
์ ์ด ๊นจ์ก๋์ง ํ๋๋ค โ ์ธ๊ณผ๊ฐ ๋ถ๋ช
ํ๊ณ (๊ฐ์ ํ์ผ โ ๊ฐ์ worktree โ ์ถฉ๋) ๋ฌธ์ ํ
์คํธ๋ง์ผ๋ก ํ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ Story(๋๋ ๊ฐ์ ๋ถ๋ชจ) ์์์ ๋ฒ์/scope๊ฐ ๊ฒน์น๋ Sub-task ์์ ์ฐพ๋๋ค. ๊ฒฝ๋ก ๋ฌธ์์ด์ด ๊ฐ๊ฑฐ๋, ํ์ชฝ์ด ๋ค๋ฅธ ์ชฝ์ ๋๋ ํฐ๋ฆฌ ์์์ด๊ฑฐ๋, ๊ฐ์ ๋ชจ๋๋ช
์ ๊ฐ๋ฆฌํค๋ฉด ๊ฒน์นจ์ผ๋ก ๋ณธ๋ค.
๋ฒ์/scope๊ฐ ๋น์ด ์๋ Sub-task๋ ํ์ ๋์์์ ์ ์ธํ๋ค. ์ ์ธ๋ ๊ฑด์ด 1๊ฑด์ด๋ผ๋ ์์ผ๋ฉด ์กฐ์ฉํ ํต๊ณผ์ํค์ง ์๊ณ ์ฌ์ฉ์์๊ฒ 1์ค ์๋ฆฐ๋ค:
โน๏ธ Sub-task N๊ฑด์ ๋ฒ์(ํ์ผ/๋ชจ๋)๊ฐ ๋น์ด ์์ด ๊ณผ๋ถํด ๊ฒ์ฌ๋ฅผ ๊ฑด๋๋ฐ์์ต๋๋ค.
๊ฒน์น๋ ์์ด ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ์ถ๋ ฅํ์ง ์๊ณ Step 5๋ก ๊ฐ๋ค. ์์ผ๋ฉด Step 5 Preview์ ## Merge Suggestion ๋ธ๋ก์ ํฌํจํ๋ค:
## Merge Suggestion
์๋ธํ์คํฌ ํ๋๋ worktree ํ๋์
๋๋ค. ์๋ ํญ๋ชฉ์ ๊ฐ์ ํ์ผ์ ๊ฑด๋๋ ค
๋๋ ๋๋ฉด ๋ณ๋ ฌ ์งํ์ด ๋งํ๊ณ ๋ฆฌ๋ฒ ์ด์ค๋ง ๋์ด๋ฉ๋๋ค.
- Story 1: [1.1, 1.2, 1.3] โ 1๊ฑด (์ ๋ถ contract/entities/*.ts)
- Story 2: [2.1, 2.2] โ 1๊ฑด (๋ ๋ค ensureCandidate.ts)
๋ณํฉ ์: Sub-task 17๊ฑด โ 10๊ฑด
๊ฒน์น๋ ๊ทผ๊ฑฐ(์ด๋ ํ์ผ์ธ์ง)๋ฅผ ๋ฐ๋์ ํจ๊ป ์ ๋๋ค. ๊ทผ๊ฑฐ ์์ด "๋ง์ ๋ณด์ธ๋ค"๋ก ๋ณํฉ์ ์ ์ํ์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ Step 5 ์ต์ข
ํ์ธ์ ์ ํ์ง์ ๋ณํฉ์๋๋ก ์์ฑ ์ ์ถ๊ฐํ๊ณ ์ด๋ฅผ ์ฒซ ๋ฒ์งธ(๊ถ์ฅ) ์ต์
์ผ๋ก ๋๋ค. ์ ํ์ง๋ ๋ณํฉ์๋๋ก ์์ฑ / ์์๋๋ก ์์ฑ / ์์ / ์ทจ์ 4๋ถ๊ธฐ๊ฐ ๋๋ค.
๋ณํฉ์๋๋ก ์์ฑ์ ๊ณ ๋ฅด๋ฉด ๋ณํฉ๋ ํธ๋ฆฌ๋ก Step 6์ ์งํํ๋ค. ์ฌ๋ผ์ง ๋
ธ๋์ ์ค๋ช
๋ณธ๋ฌธ์ ๋จ๋ ๋
ธ๋์ description์ ์์ ๋ชฉ์ผ๋ก ํฉ์ณ ์ ๋ณด๋ฅผ ์์ง ์๋๋ค.
Step 5: Final Preview
์์ฑ ์ง์ ์ ์ ์ฒด ๊ณํ์ ํ ๋ฒ ๋ ์์ฝํ๋ค.
epicScope๋ก Epic์ด ์ ํด์ง ๊ฒฝ์ฐ Epic Link ๊ฐ ๋ค์ ์ถ์ฒ๋ฅผ ๋ถ์ธ๋ค โ MAE-100 (v1.0 ๋ฆด๋ฆฌ์ค) โ .jira-epic.json. ๋ํ์์ ๋ช
์๋ ๊ฐ์ด๋ฉด ์ถ์ฒ ํ๊ธฐ ์์.
Default ๋ชจ๋:
๐ฆ ์์ฑ ์์ ์ด์
## Parent Issue
- Project / Summary / Type / Priority / Epic Link / Labels / Components / Assignee
- Description: (์์ฝ 3~5์ค)
## Sub-tasks (N๊ฐ) โ ๊ฐ ํญ๋ชฉ์ ๋ฒ์(ํ์ผ/๋ชจ๋) ํ์ / Issue Links (M๊ฐ)
# Step 4.9 ์ ํธ๊ฐ ์์ ๋๋ง: ## Merge Suggestion
Import ๋ชจ๋ (--from-requirements):
Preview ์ถ๋ ฅ ์ง์ ์ ๋ชจ๋ ๋
ธ๋ summary๋ฅผ ์ผ๊ด JQL(jira-cli.py search "summary ~ โฆ")๋ก ์ค๋ณต ๊ฒ์ฌ. ์ผ์น ์ ## Duplicate Warning ๋ธ๋ก ํฌํจ.
breakdownLevel(L1 | L2 | L3)์ Preview ์๋จ์ 1์ค๋ก ๋ช
์ํ๋ค.
Step 4.9์์ ๊ณผ๋ถํด ์ ํธ๊ฐ ์กํ์ผ๋ฉด ## Merge Suggestion ๋ธ๋ก์ ํฌํจํ๋ค.
๐ฆ ์์ฑ ์์ ์ด์ (import)
Source: docs/requirements/<slug>.requirements.md
Breakdown Level: <L1 Single | L2 Story-only | L3 Epic+Stories+Subtasks>
# epicScope๊ฐ ์์ ๋๋ง: Epic Scope: MAE-100 (v1.0 ๋ฆด๋ฆฌ์ค) โ .jira-epic.json
# L3 + epicScope: ๋ฌธ์์ Epic ๋
ธ๋๋ ์์ฑํ์ง ์๊ณ Story๋ฅผ MAE-100 ์๋์ ๋ถ์
๋๋ค
# L1: ## Task (๋จ๊ฑด)
# L2: ## Story / ## Sub-tasks (M๊ฐ) / ## Issue Links (K๊ฐ)
# L3: ## Epic / ## Stories (N๊ฐ) / ## Sub-tasks (M๊ฐ) / ## Issue Links (K๊ฐ)
# Step 4.9 ์ ํธ๊ฐ ์์ ๋๋ง: ## Merge Suggestion
์ต์ข
ํ์ธ (AskUserQuestion):
- Step 4.9 ์ ํธ ์์:
์์ฑ ์งํ / ์์ / ์ทจ์
- Step 4.9 ์ ํธ ์์:
๋ณํฉ์๋๋ก ์์ฑ(๊ถ์ฅ) / ์์๋๋ก ์์ฑ / ์์ / ์ทจ์
Step 6: Create in Jira
๋ชจ๋๋ณ ํธ์ถ ์ํ์ค:
- default: 6-1 (Parent) โ 6-2 (Epic ์ฐ๊ฒฐ ๊ฒ์ฆ) โ 6-3 (Subtask ๋ฃจํ) โ 6-4 (๋งํฌ) โ 6-5 (๊ฒ์ฆ)
- import L1 Single: 6-1 (Task ๋จ๊ฑด) โ 6-5 (๊ฒ์ฆ). 6-1b/6-3/6-4 skip.
- import L2 Story-only: 6-1b (Story 1๊ฑด, parent ์์) โ 6-3 (Subtask ๋ฃจํ) โ 6-4 (๋งํฌ) โ 6-5 (๊ฒ์ฆ). 6-1/6-2 skip (Epic ์์ฑยท์ฐ๊ฒฐ ์์).
- import L3 Tree: 6-1 (Epic ์์ฑ) โ 6-2 skip โ 6-1b (Story ๋ฃจํ) โ 6-3 (Subtask ๋ฃจํ) โ 6-4 (๋งํฌ) โ 6-5 (๊ฒ์ฆ).
epicScope๊ฐ ์์ ๋์ ์ํ์ค ๋ณ๊ฒฝ โ ์์ ๊ฐ๋
์์ ์ด๋ฏธ ์ ํด์ง Epic์ ๋ฐ๋ผ๊ฐ๋ค:
| ๋ชจ๋ | ๋ณ๊ฒฝ |
|---|
| default / import L1 | ์์ ์ด์์ epicScope.epicKey๋ฅผ Epic ๋งํฌ๋ก ์ฃผ์
(6-1) |
| import L2 | Story์ parent = epicScope.epicKey (6-1b). Epic ๋ถ์ฌ ์ ์ ๊ฐ ํด์๋๋ฏ๋ก parent๋ฅผ ์ค์ ํ๋ค |
| import L3 | 6-1์ Epic ์์ฑ์ skipํ๊ณ epic.created_key ์๋ฆฌ์ epicScope.epicKey๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ. Story ๋ฃจํ(6-1b)๋ ๊ทธ๋๋ก ๊ทธ ํค๋ฅผ parent๋ก ์ด๋ค. ๋ฌธ์์ Epic ๋
ธ๋ summary/description์ ๋ฒ๋ฆฌ์ง ์๊ณ , ์์ฑ ํ ์ค์ฝํ Epic์ ์ฝ๋ฉํธ๋ก ๋จ๊ธธ์ง Step 7์์ ํ๋จํ๋ค |
Epic์ ์ค์ฒฉ ์์ฑํ์ง ์๋๋ค โ Jira๊ฐ Epic ์๋ Epic์ ์ ๋๋ก ์ง์ํ์ง ์๋๋ค.
6-1. ์์ ์ด์ ์์ฑ (default ๋๋ import L1/L3์์ ํธ์ถ)
์ด์ 1๊ฑด๋น JSON 1๊ฐ๋ฅผ scratchpad ํ์ผ๋ก ์ฐ๊ณ python3 "<scripts>/jira-cli.py" create @<ํ์ผ> ํธ์ถ. ํค: project/summary/issuetype/description(markdown)/parent/labels/priority/assignee. Epic ์ฐ๊ฒฐ์ "parent": "<EPIC-KEY>". priority ๊ธฐ๋ณธ๊ฐ์ Medium (from-requirements-mode.md Step 1.5-5์ ์ถ์ถ ๊ท์น๊ณผ ๋์ผ). ์ถ๋ ฅ {"key","id"}์ key๋ฅผ ๋์ ํ๋ค.
ํด๋ฐฑ ๊ท์น์ ํธ์ถ ๋ชจ๋๋ณ๋ก ๋ฐ๋ ์ผ์ด์ค๊ฐ ๋ค๋ฅด๋ค โ from-requirements-mode.md์ TreeโIssue Mapping ํ๊ฐ ๋จ์ผ ์ง์ค. ๋ณธ ์ ์ ์์ฝ๋ง ๋๋ค:
- default / import L1: Task ๋๋ Story ํ์
์๋. Story ์คํจ โ
Task (default ๋ชจ๋๋ + parent=Epic-KEY if Epic ์ฐ๊ฒฐ, L1์ epicScope ์์ผ๋ฉด ๊ทธ ํค๋ฅผ parent๋ก).
- import L3 Epic ์์ฑ: Epic ํ์
์คํจ โ
Task + label epic-substitute.
- Subtask ํ์
์คํจ:
Task + parent=Story-KEY (6-3 ์์ญ โ ๋ณธ ์ ๋น๋์).
- import L2 Story ์์ฑ: ๋ณธ ์ ์ด ์๋๋ผ 6-1b๊ฐ ๋ด๋น (Epic ๋ถ์ฌ๋ก parent ์๋ต).
ํด๋ฐฑ ์ฌ์ฉ ์ ์ฌ์ฉ์์๊ฒ ์ฆ์ ์๋ฆฐ๋ค.
6-1b. Story ์์ฑ ๋ฃจํ (โ
import ๋ชจ๋ ์ ์ฉ)
- L3 Tree: ๊ฐ Story์
parent = epic.created_key ์ค์ . ํด๋ฐฑ: Story ์คํจ โ Task + parent=Epic-KEY.
- L2 Story-only: Story 1๊ฑด๋ง ์์ฑ.
parent๋ ์ค์ ํ์ง ์์(Epic ๋ถ์ฌ) โ ๋จ epicScope๊ฐ ์์ผ๋ฉด parent = epicScope.epicKey. ํด๋ฐฑ: Story ์คํจ โ Task (parent ๊ท์น ๋์ผ).
์์ฑ ์งํ (story.index โ story.created_key) ๋์ .
6-2. ์ํฝ ์ฐ๊ฒฐ ๊ฒ์ฆ (default ๋ชจ๋ + epicScope๊ฐ ์ ์ฉ๋ import L1)
python3 "<scripts>/jira-cli.py" get <KEY>๋ก ์ฌ์กฐํ โ ์ถ๋ ฅ parent๊ฐ Epic ํค๊ฐ ์๋๋ฉด python3 "<scripts>/jira-cli.py" epic-link <KEY> <EPIC-KEY> ํด๋ฐฑ โ ์ด๊ฒ๋ ์คํจ ์ ๊ฒฝ๊ณ ํ ๊ณ์.
6-3. ์๋ธํ์คํฌ ์์ฑ (์์ฐจ ๋ฃจํ)
๊ฐ ์๋ธํ์คํฌ์ create @<ํ์ผ> ๊ฐ๋ณ ํธ์ถ ("issuetype": "Subtask", "parent": "<PARENT_KEY>"). import ๋ชจ๋์์ PARENT_KEY = ํด๋น Story์ created_key.
6-4. ์์กด์ฑ ๋งํฌ ์์ฑ
python3 "<scripts>/jira-cli.py" link-types๋ก "Blocks" ํ์
๋ช
ํ์ธ ํ python3 "<scripts>/jira-cli.py" link Blocks <blocker> <blocked> ํธ์ถ.
๋ฐฉํฅ์ฑ: "A๊ฐ B๋ฅผ ๋ธ๋ก" โ link Blocks A B (OUTWARD=A, INWARD=B).
Import ๋ชจ๋์ (blocks: <ref>) ๋ณํ: <N> โ Story ํค, <N>.<M> โ Subtask ํค. E7 ์๋ฐ ์ ํด๋น ๋งํฌ skip + ๊ฒฝ๊ณ .
6-5. ๊ฒฐ๊ณผ ๊ฒ์ฆ
๋ชจ๋ ์ด์๋ฅผ python3 "<scripts>/jira-cli.py" get <KEY> --fields issuelinks๋ก ์ฌ์กฐํ (์์ถ ์ถ๋ ฅ์ summary/issuetype/priority/parent/labels/status + issuelinks). ๋ถ์ผ์น ์ ๊ฒฝ๊ณ .
Step 7: Post Creation Comment (์ ํ)
์์ ์ด์์ ์์ฝ ์ฝ๋ฉํธ ๊ฒ์ (์๋ธํ์คํฌ ๊ฐ์, ๋งํฌ ๊ฐ์, ๋ณ๋ ฌ ๊ฐ๋ฅ ๊ฐ์, Next ์๋ด) โ ๋ณธ๋ฌธ์ scratchpad md ํ์ผ๋ก ์ฐ๊ณ python3 "<scripts>/jira-cli.py" comment <KEY> @<ํ์ผ>. ์๋ธํ์คํฌ์๋ ์ฝ๋ฉํธ ์๋ต.
Step 8: Completion Summary
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
Create Complete
**Parent Issue**: <JIRA_URL>/browse/PROJ-NEW โ <summary> [Type, Priority]
**Sub-tasks** (N๊ฐ): ๊ฐ ์ด์ ํค + summary + ๋ณ๋ ฌ/๋ธ๋ก ํ์
**Links ๋ฑ๋ก**: Blocks ๋งํฌ M๊ฐ
**Next Steps:**
- `/jira-task init PROJ-NEW` โ ์๋ธํ์คํฌ ๊ธฐ๋ฐ worktree ์ธํ
- ๋๋ `/jira-task start PROJ-NEW` โ ๋ถ๋ชจ ์ด์ ์์
๋ฐ๋ก ์์
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
.jira-context.json์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค (์ ์ด์๋ ์์ง ํ์ฑ ์์
์ด ์๋).
Error Handling
๊ณตํต: whoami ์คํจ โ Step 0 ์ข
๋ฃ + /jira setup ์๋ด. create ์คํจ(exit 1, stderr jira-cli: <code> <reason>) โ ํ์
๋ฏธ์กด์ฌ ์ Task ํด๋ฐฑ, 401/403 ์ ํ ํฐ ๋ง๋ฃ ์๋ด, ํ๋ ์ค๋ฅ ์ ์๋ณธ ๋ฉ์์ง ํ์. ์๋ธํ์คํฌ ์ผ๋ถ ์คํจ โ ์ฑ๊ณต ๊ฒ ์ ์ง, ์คํจ ๋ชฉ๋ก ํ์, ์ฌ์๋ confirm (์๋ ๋กค๋ฐฑ ์์).
| # | ์๋๋ฆฌ์ค | ์ฒ๋ฆฌ |
|---|
| E1 | --from-requirements ๊ฒฝ๋ก ๋๋ฝ | AskUserQuestion์ผ๋ก ๊ฒฝ๋ก ์์ฒญ |
| E2 | ์ง์ ๊ฒฝ๋ก ํ์ผ ๋ถ์ฌ | ์๋ฌ + ์ข
๋ฃ |
| E3 | ๋น ํ์ผ | ์๋ฌ + ์ข
๋ฃ |
| E4 | Proposed Issue Breakdown ์น์
๋ถ์ฌ | ์์ฐ์ด ๋ชจ๋ ํด๋ฐฑ ์ ์ (AskUserQuestion) |
| E5 | ํธ๋ฆฌ ๋
ธ๋ 0๊ฐ | ๋ณด๊ฐ ์
๋ ฅ ์์ฒญ ๋๋ ์ข
๋ฃ |
| E6 | Epic ์์ด Story๋ง ์กด์ฌ | L2 Story-only๋ก ์งํ (์๋ Epic ์์ฑํ์ง ์์) |
| E7 | sibling ์ธ (blocks: ...) ์ฐธ์กฐ | ํด๋น ๋งํฌ skip + ๊ฒฝ๊ณ |
| E8 | ๋์ผ summary ์ด์ ์กด์ฌ | Preview์ ## Duplicate Warning + ์งํ/์ทจ์ confirm |
| E9 | Epic/Story ํ์
๋นํ์ฑ | Task + parent ๋๋ + label epic-substitute ํด๋ฐฑ, ์ฆ์ ์๋ฆผ |
| E10 | ํธ๋ฆฌ ๋ค์ฌ์ฐ๊ธฐ ํผ์ฉ | ๊ฒฝ๊ณ + ์ฒซ ์์ ๊ธฐ์ค ์งํ (๋ถ๊ฐ ์ ์ข
๋ฃ) |
| E11 | ๋ฃจํธ ๋
ธ๋ ํ ํฐ ์๋ณ ์คํจ (์์
/Story/Epic ์ด๋ ์ชฝ๋ ์๋) | ์์ฐ์ด ๋ชจ๋ ํด๋ฐฑ ์ ์ (AskUserQuestion) |
| E12 | .jira-epic.json ํ์ฑ ์คํจ / ์ค์ฝํ Epic ์กฐํ ์คํจ | ๊ฒฝ๊ณ 1์ค + epicScope = null๋ก ์งํ (Epic ์์ด ์์ฑ). ์ค๋จํ์ง ์๋๋ค |
| E13 | ์ค์ฝํ Epic์ ํ๋ก์ ํธ๊ฐ ์์ฑ ๋์ ํ๋ก์ ํธ์ ๋ค๋ฆ | ๊ฒฝ๊ณ + AskUserQuestion(Epic ์์ด ์งํ / ์ทจ์) |
Non-goals: worktree/branch ์์ฑ, .jira-context.json ์์ , ๊ตฌํ/ํ
์คํธ/๋ฆฌ๋ทฐ ์ํ, ๊ธฐ์กด ์ด์ ์์ .