@angar2/taskery 0.3.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,277 +7,70 @@ description: task 시작 — 워크트리 분기 + 6 섹션 빈 골격 + 헤더
7
7
 
8
8
  ## 개요
9
9
 
10
- 새 task 시작 시 호출. **워크트리 분기 + task.md 빈 골격 작성**.
10
+ 새 task 시작 시 호출. **워크트리 분기 + task.md 빈 골격 작성**. Requirements / Scope / Dev Plan / Test Plan 본문은 다음 단계 `/task-plan`에서 채운다.
11
11
 
12
- 멀티세션 0.1.2+ — 본 스킬은 *작업 격리 워크트리*를 dev에서 분기 (`~/.taskery/worktrees/<projectId>/TASK-NNN_<출처>_<슬러그>/`) + 빈 골격 `task.md`를 작성한다. Requirements / Scope / Dev Plan / Test Plan 본문은 다음 단계 `/task-plan`에서 채움.
12
+ > 메인 워크트리(dev 체크아웃)에서 호출. 채번·워크트리·브랜치 생성·골격 작성은 `task_init` 도구(fork)가 init 락 안에서 원자 수행한다.
13
13
 
14
- > **호출 위치**: 메인 워크트리(dev 체크아웃 상태)에서 호출. 다른 워크트리에서 호출 시 → 사용자 호출 + 중단.
14
+ ## 호출 시점 + 입력
15
15
 
16
- ## 호출 시점
16
+ - 새 task 시작 (*"~~ 추가해줘"* / *"~~ 버그 고쳐"* / *"~~ 리팩터링"*), 백로그 진행(*"BL-003 진행하자"*), 로드맵 진행(*"RM-002 시작"*).
17
+ - 인자 = (선택) 주제 / 유형 / 출처(BL-NNN, RM-NNN, DR) / 규모.
18
+ - **두 분기**: ① **제안** — 직전 맥락 명확 → *"이렇게 task 만들까요?"* + confirm. ② **인터뷰** — 맥락 부족 → 한 번에 한 질문씩.
19
+ - **자동 추정 진행 X** — confirm 또는 답 받기 전 워크트리/파일 생성 금지.
17
20
 
18
- - 새 task 시작 시 (사용자 발화: *"~~ 추가해줘"*, *"~~ 버그 고쳐"*, *"~~ 리팩터링"*).
19
- - 직전 대화로 작업 맥락 명확해진 직후.
20
- - 백로그 항목 진행 (사용자: *"BL-003 진행하자"*).
21
- - 로드맵 항목 진행 (사용자: *"로드맵 RM-002 시작"*).
21
+ ## Step 1 — 메타 수집
22
22
 
23
- ## 입력 처리
23
+ 직전 대화 정독 → 추정 가능하면 분기 1(제안), 불가하면 분기 2(인터뷰):
24
+ - Q1 *"무슨 작업? (한 줄로)"* / Q2 *"유형? (feature / bug / improvement / refactor / docs / chore)"* / Q3 *"출처? (백로그 BL-NNN / 로드맵 RM-NNN / 직접 요구사항 DR)"* / Q4 *"규모? (micro / small / medium / large)"* / (필요 시) Q5 *"plan `<NNN_slug>` 맞나요?"*
24
25
 
25
- 인자 = (선택) 주제 / 유형 / 출처(BL-NNN, RM-NNN, DR) / 규모. 예: `/task-init 로그인 기능` / `/task-init BL-003` / 인자 없이 호출.
26
+ 수집 항목(모두 확정 후 진행): 주제(한국어) · 유형 · 출처 · 규모 · plan(활성 plan — `status` 도구나 AGENT-GUIDE에서). 활성 plan 부재 시 *"`/plan-init` 먼저 실행할까요?"* 안내 + 중단.
26
27
 
27
- 두 분기:
28
- - **분기 1 (제안)**: 직전 맥락 명확 → 메인이 *"이렇게 task 만들까요?"* 제안 + 사용자 confirm.
29
- - **분기 2 (인터뷰)**: 직전 맥락 부족 → 한 번에 한 질문씩 인터뷰.
28
+ ## Step 2 — 출처별 메타 + 슬러그
30
29
 
31
- **자동 추정 진행 X** — 사용자 confirm 또는 답 받기 전 워크트리 생성 / 파일 생성 금지.
30
+ - **BL**: `backlog_get` 도구(또는 `npx @angar2/taskery backlog-get BL-NNN`) → `{ blId, status, type, title, slug, summary, target, taskNums }`. 항목 없으면 에러 → 보고 + 중단. **개요/대상 영역은 task.md §1 Requirements 초안 시작점**으로 기억(본문은 task-plan에서). 슬러그 = 반환 `slug` 그대로(재현성 — 별도 변환 X).
31
+ - **RM**: `$MAIN_WT/.project/plans/<활성 plan>/ROADMAP.md`에서 `RM-NNN` 항목 메타 파싱. 슬러그 = ROADMAP에 박힌 그대로.
32
+ - **DR**: 사용자 발화에서 주제 그대로. 슬러그 = 한국어 제목 → 영어 kebab-case(3 단어 이내) → confirm.
32
33
 
33
- ## 단계
34
+ **이미 `[x]` BL 재진행 케이스** — `backlog_get` 결과 `status==='checked'` & `taskNums` 비어있지 않으면: 사용자 호출 *"BL-NNN은 ${taskNums}로 이미 처리된 적 있어. 새 task로 다시 진행할까?"* → OK면 새 TASK 진행(§4 마킹은 콤마 누적) / X면 중단.
34
35
 
35
- ### Step 1 — 사전 검증 (멀티세션 안전망)
36
+ ## Step 3 — 파일 vs 폴더 + confirm
36
37
 
37
- `bin/lib.js` 유틸 활용 — 메인 워크트리 + dev 검증.
38
+ - **파일 default**: 단일 `NNN_<slug>.md`. **폴더 승격은 *사용자 명시* 시에만**(*"폴더로 만들어줘"*) — 규모 large·자료 다수여도 자동 승격 X.
39
+ - spec-diffs / screenshots / mockup은 단일/폴더 무관 `.project/tasks/<NNN_slug>/{spec-diffs,screenshots,mockup}/` 공통(TASK_DOC_RULE §1.5).
40
+ - 사용자에게 브랜치 구성요소(`{타입}/{개발자}_TASK-???_{출처}_{슬러그}`, NNN은 fork가 확정) + 파일/폴더 confirm.
38
41
 
39
- 1. **메인 워크트리 검출**:
40
- ```sh
41
- MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
42
- ```
43
- - git ≥ 2.31 필요. 실패 시 *"git 버전 확인 — 2.31+ 필요"* 보고 + 중단.
44
- 2. **현재 cwd가 메인 워크트리인지 확인**:
45
- ```sh
46
- CURRENT_WT=$(git rev-parse --show-toplevel)
47
- [ "$CURRENT_WT" = "$MAIN_WT" ] || abort "메인 워크트리에서 호출해야 함 (현재: $CURRENT_WT)"
48
- ```
49
- 3. **dev 브랜치 존재 검증**:
50
- ```sh
51
- git -C "$MAIN_WT" rev-parse --verify dev || abort "dev 브랜치 부재. 사용자 결정 필요 (생성?)"
52
- ```
53
- 4. **메인 워크트리 = dev 검증**:
54
- ```sh
55
- CURRENT=$(git -C "$MAIN_WT" rev-parse --abbrev-ref HEAD)
56
- [ "$CURRENT" = "dev" ] || abort "메인 워크트리가 dev 아님 (현재: $CURRENT). taskery 정책 위배"
57
- ```
58
- 5. **stale 의심 감지** (`npx @angar2/taskery status`로 위임 가능):
59
- - 케이스 A (폴더 없는 워크트리): `git worktree prune` 제안 + 사용자 확인 후 실행
60
- - 케이스 B (N일↑ 미커밋 브랜치): 알림만
61
- - 케이스 C (워크트리 폴더 존재, N일↑ 비활성): 알림만
62
- - 케이스 D (rebase 잔여 상태 — 워크트리에 `.git/rebase-apply` 또는 `.git/rebase-merge` 존재): 사용자 호출 + 선택 (continue / abort)
63
- - N = `.taskery-manifest.json`의 `stale_days` (기본 30)
42
+ ## Step 4 — 분기 + 골격 생성 (`task_init`) + BL 마킹
64
43
 
65
- 위 검증 1개라도 실패 시 → 사용자 호출 + 중단.
44
+ `task_init` 도구(또는 `npx @angar2/taskery fork <타입> <개발자> <출처> <슬러그> --size <규모> --title "<한국어 제목>" [--promote]`) 한 번으로 **채번 → 워크트리·브랜치 생성**(init 락 원자 — 병렬 task-init 번호 충돌·동일 출처 중복·동일 브랜치명을 코드가 차단)에 더해 **빈 골격 task.md 자동 생성**(생성일=오늘 · plan=활성 plan · 유형 자동매핑 `improve`→`improvement` · status=draft · `.gitignore` 케이스로 위치 자동 판정)까지 수행한다.
66
45
 
67
- ### Step 2 — active plan 버전 확인
46
+ - 반환 `{ taskNum, nnn, branch, wtPath, projectId, docPath, registered, promoted }`. 폴더 승격은 `--promote`/`promote:true`.
47
+ - 에러 시(*"… 이미 진행중"* / *"… 정책 위배"* — dev/메인WT 검증·SSoT를 fork가 강제) stderr 메시지 그대로 보고 + 중단.
48
+ - **BL 출처면** 직후 `backlog_mark` 도구(또는 `npx @angar2/taskery backlog-mark BL-NNN TASK-NNN`)로 `[ ]→[x]` + `- TASK:` 마크(콤마 누적, withMetaLock). RM/DR은 skip.
68
49
 
69
- 1. `$MAIN_WT/.project/AGENT-GUIDE.md` Read → *활성 plan* 추출 (예: `001_mvp` — `NNN_slug` 폴더명).
70
- 2. AGENT-GUIDE.md 없거나 활성 plan 누락 시 → 사용자에게 *"활성 plan 버전이 없는데 `/plan-init` 먼저 실행할까요?"* 묻고 중단.
71
- 3. `$MAIN_WT/.project/plans/<NNN_slug>/` 디렉토리 존재 확인. 없으면 동일하게 `/plan-init` 안내 + 중단.
50
+ ## Step 5 — 골격 확인 + 보고
72
51
 
73
- ### Step 3 — 분기 판단 + 메타 수집
52
+ 반환 `docPath`(절대 경로)를 Read해 헤더 5컬럼 + 6 섹션 placeholder + status=draft 확인만 한다. **본문 작성 금지** — Requirements / Scope / Dev Plan / Test Plan은 *반드시* `/task-plan`에서.
74
53
 
75
- 직전 대화 정독:
76
- - 작업 주제 / 유형 / 출처 / 규모 추정 가능?
77
- - **추정 가능** → 분기 1 (제안):
78
- *"직전 맥락 보니 다음 task 만들까요? 주제: <X> / 유형: <Y> / 출처: <Z> / 규모: <W> / plan: <NNN_slug>. 어떠세요?"*
79
- 사용자 답 — *"OK"* / *"규모는 large야"* / *"유형은 bug야"* 등 부분 수정 받음.
80
- - **추정 불가** → 분기 2 (인터뷰): 한 번에 한 질문씩.
81
- - Q1: *"무슨 작업인가요? (한 줄로)"*
82
- - Q2: *"유형? (feature / bug / improvement / refactor / docs / chore)"*
83
- - Q3: *"출처? (백로그 BL-NNN / 로드맵 RM-NNN / 직접 요구사항 DR)"*
84
- - Q4: *"규모? (micro / small / medium / large) — 잘 모르겠으면 추정 알려드림."*
85
- - (필요 시) Q5: *"plan `<NNN_slug>` 맞나요?"*
86
-
87
- 수집 항목 (모두 확정되어야 진행):
88
- - 주제 (한국어 — kebab-slug 변환은 Step 4)
89
- - 유형: `feature` / `bug` / `improvement` / `refactor` / `docs` / `chore`
90
- - 출처: `BL-NNN` / `RM-NNN` / `DR`
91
- - 규모: `micro` / `small` / `medium` / `large`
92
- - plan: 활성 plan 그대로 (Step 2에서 가져온 `NNN_slug` 값)
93
-
94
- ### Step 4 — TASK 번호 결정 + 결정적 슬러그 + SSoT 안전망
95
-
96
- #### 4.1 다음 TASK-NNN 계산
97
-
98
- `bin/lib.js` `getNextTaskNumber(MAIN_WT)` 호출. 내부 동작:
99
- ```sh
100
- # 진행중 (SSoT) — TASK-* 패턴 작업 브랜치 전체. `--no-merged dev` 미사용:
101
- # 워크트리 분기 직후 브랜치는 dev와 동일 commit이라 `--no-merged dev`가 *완전 머지 상태*로
102
- # 처리 → 빈 결과 → getNextTaskNumber 충돌. 브랜치 존재 자체가 SSoT.
103
- A=$(git -C "$MAIN_WT" branch --list \
104
- 'feature/*_TASK-*' 'bug/*_TASK-*' 'improve/*_TASK-*' \
105
- 'refactor/*_TASK-*' 'docs/*_TASK-*' 'chore/*_TASK-*' \
106
- | grep -oE 'TASK-[0-9]+')
107
- # dev 머지 히스토리
108
- B=$(git -C "$MAIN_WT" log dev --grep='TASK-[0-9]\+' --extended-regexp --oneline \
109
- | grep -oE 'TASK-[0-9]+')
110
- # 합집합 최대 + 1
111
- MAX=$( (echo "$A"; echo "$B") | sort -uV | tail -1 | sed 's/TASK-//')
112
- NEXT=$((MAX + 1))
113
- ```
114
- - 3자리 zero-padded (`001`, `015`, `120`).
115
- - 합집합 비어 있으면 `001`.
116
-
117
- #### 4.2 메타 가져오기 (BL/RM)
118
-
119
- - BL: `$MAIN_WT/.project/tasks/<활성 plan>/BACKLOG.md` Read → `BL-NNN` 블록 파싱 → `{ status, type, title, slug, summary, target, taskNums }` (활성 plan은 `AGENT-GUIDE.md`에서 검출. `bin/lib.js`의 `parseBacklogItem(mainWtPath, blId)` 호출 권장). 개요 / 대상 영역 → task.md §1 Requirements 초안에 자동 복사 (얕은 분석이 task 문서 시작점)
120
- - RM: `$MAIN_WT/.project/plans/<활성 plan>/ROADMAP.md` Read → `RM-NNN` grep → 항목 메타 파싱
121
- - DR: 사용자 발화에서 주제 그대로
122
-
123
- #### 4.2.5 이미 `[x]` BL 재진행 케이스
124
-
125
- `parseBacklogItem` 결과 `status === 'checked'`이고 `taskNums` 비어 있지 않을 때:
126
- - 사용자 호출 + 결정: *"BL-NNN은 ${taskNums}로 이미 처리된 적 있어. 새 task로 다시 진행할까?"*
127
- - 사용자 OK → 새 TASK-NNN 진행. §7.5 (BL 확인 마킹) 단계에서 `- TASK:` 줄에 콤마로 추가 (덮어쓰기 X)
128
- - 사용자 X → task-init 중단
129
-
130
- #### 4.3 결정적 슬러그 산출
131
-
132
- - BL/RM: BACKLOG/ROADMAP에 박힌 슬러그 그대로 사용 (`parseBacklogItem` 결과의 `slug` 필드). task-init이 별도 변환 X — 재현성 보장
133
- - DR: 사용자 작명 또는 메시지에서 자동 산출 후 confirm
134
- - 한국어 → 영어 kebab-case. 짧고 명확하게 (3 단어 이내 권장).
135
- - 같은 항목이면 같은 슬러그 → 같은 브랜치명 → git이 동시 분기 자동 거부 (race 차단 1층).
136
-
137
- #### 4.4 SSoT 안전망 (race 차단 2층)
138
-
139
- ```sh
140
- git -C "$MAIN_WT" branch --no-merged dev --list \
141
- 'feature/*_TASK-*' 'bug/*_TASK-*' 'improve/*_TASK-*' \
142
- 'refactor/*_TASK-*' 'docs/*_TASK-*' 'chore/*_TASK-*' \
143
- | grep -E "_${SRC}_"
144
- ```
145
- - BL-NNN/RM-NNN이 *진행중*에 있으면 → 중단 + 사용자 알림 (*"BL-003은 이미 X 세션에서 진행 중"*).
146
- - DR은 본 안전망 검사 X (별도 ID 없음).
147
-
148
- ### Step 5 — 파일 vs 폴더 결정 + 브랜치명 산출
149
-
150
- 1. 파일 vs 폴더 분기 (기존 룰 유지):
151
- - **파일 default**: 단일 `NNN_<slug>.md`.
152
- - **폴더 승격 조건**: *사용자 명시* 시에만 (*"폴더로 만들어줘"* 류). 규모 large·추가 자료 다수여도 자동 승격하지 않는다 — 기본은 항상 단일 파일. 기능 자체는 유지(사용자가 원하면 그대로 사용).
153
- - **spec-diffs / screenshots / mockup은 `<NNN_slug>` 공통** — 단일/폴더 모두 `.project/tasks/<NNN_slug>/{spec-diffs,screenshots,mockup}/`에 위치. (TASK_DOC_RULE §1.5)
154
- 2. 브랜치명 산출 (멀티세션 형식):
155
- ```
156
- {타입}/{개발자}_TASK-NNN_{출처}_{슬러그}
157
- 예: feature/claude_TASK-007_BL-003_login-feature
158
- bug/angar2_TASK-012_DR_mobile-form-refresh
159
- ```
160
- - **타입**: feature → `feature`, bug → `bug`, improvement → `improve`, refactor → `refactor`, docs → `docs`, chore → `chore`
161
- - **개발자**: 메인 세션 = `claude`, 사용자 세션 = `angar2` 등
162
- 3. 사용자에게 브랜치명 + 파일/폴더 confirm.
163
-
164
- ### Step 6 — 워크트리 생성
165
-
166
- ```sh
167
- PROJECT_ID=$(jq -r '.projectId' "$MAIN_WT/.taskery-manifest.json")
168
- WORKTREES_ROOT="$HOME/.taskery/worktrees/$PROJECT_ID"
169
- WT_PATH="$WORKTREES_ROOT/TASK-${NNN}_${SRC}_${SLUG}"
170
- mkdir -p "$WORKTREES_ROOT"
171
- git -C "$MAIN_WT" worktree add "$WT_PATH" -b "$BRANCH" dev
172
- ```
173
-
174
- - git이 동일 브랜치명 자동 거부 (race 차단 1층).
175
- - 동시 충돌 시 *"브랜치 이미 존재 — 다른 세션이 같은 항목 진행 중"* 보고 + 중단.
176
-
177
- ### Step 7 — task 문서 위치 결정 + 빈 골격 작성
178
-
179
- `.gitignore` 케이스 분기 — task 문서를 *메인 워크트리에 직접 작성* vs *워크트리 안에 작성*:
180
-
181
- ```sh
182
- git -C "$MAIN_WT" check-ignore -q "$MAIN_WT/.project/dummy"
183
- ```
184
-
185
- | 결과 | 케이스 | 작성 위치 |
186
- |------|--------|----------|
187
- | exit 0 | **등록됨** (퍼블릭 리포 default) | **메인 워크트리** (`$MAIN_WT/.project/tasks/<NNN_slug>/`) — proper-lockfile로 안전 쓰기. 멀티세션 공유 단일 소스. dev untracked (git 자동 무시) |
188
- | exit 1 | **미등록** | **워크트리 안** (`$WT_PATH/.project/tasks/<NNN_slug>/`) — 워크트리 커밋 + 머지 시 dev에 반영 |
189
-
190
- 빈 골격 형식 (TASK_DOC_RULE §1.3 참조):
191
-
192
- ```markdown
193
- # TASK-<NNN> — <한국어 제목>
194
-
195
- | 생성일 | 플랜 | 유형 | 규모 | 상태 |
196
- |--------|------|------|------|------|
197
- | <YYYY-MM-DD> | <NNN_slug> | <유형> | <규모> | draft |
198
-
199
- ## Requirements
200
-
201
- (사용자 요구 + 메인 증폭 — `/task-plan`에서 채움)
202
-
203
- ## Scope
204
-
205
- (영향 범위 — `/task-plan`에서 채움)
206
-
207
- ## Dev Plan
208
-
209
- (Phase 1, 2, ... — `/task-plan`에서 채움)
210
-
211
- ## Test Plan
212
-
213
- (테스트 방법 + 검증 명령 — `/task-plan`에서 채움)
214
-
215
- ## Result
216
-
217
- (진행 + 테스트 결과 — `/task-dev`, `/task-test`에서 채움)
218
- ```
219
-
220
- - 6 섹션 placeholder는 *빈 헤딩 + 한 줄 안내*. 구체 내용 X.
221
- - 폴더 승격 시 `TASK-<NNN>_<slug>/task.md`로 동일 본문 작성.
222
-
223
- ### Step 7.5 — BL 출처 BACKLOG.md 확인 마킹 (BL일 때만)
224
-
225
- §4 출처 결정에서 *BL*이 선택된 경우만 실행. RM/DR은 skip.
226
-
227
- `bin/lib.js`의 `markBacklogChecked(mainWtPath, blId, taskNum)` 호출.
228
-
229
- 내부 흐름 (`withMetaLock` 안에서 원자성 보장):
230
- 1. 첫 줄 패턴 `- [ ] **BL-NNN**` → `- [x] **BL-NNN**`로 4번째 글자(체크박스) 치환
231
- 2. 같은 BL 블록 끝 (다음 `- ` 헤드 또는 파일 끝 직전, 빈 줄 건너뛴 위치) 에 ` - TASK: TASK-NNN` 한 줄 append
232
- 3. 이미 ` - TASK:` 줄 있으면 → 콤마로 추가 (`TASK-007, TASK-012`. 덮어쓰기 X)
233
-
234
- `[x]` 의미: *"이 항목은 task로 옮겼다"*. **dev 머지 완료 의미 X**. 완료 추적은 `git log dev --grep 'BL-NNN'` + 브랜치명 + `npx @angar2/taskery status`.
235
-
236
- > §4.2.5 (이미 `[x]` BL 재진행 케이스)에서 사용자 OK 받은 경우만 본 단계 진입. 사용자 X로 중단된 경우 본 Step 7.5도 skip.
237
-
238
- ### Step 8 — 결과 보고
54
+ > **폴백** (반환에 `docPath` 없이 `scaffoldError`만 있을 때만): TASK_DOC_RULE §1.3 형식으로 해당 위치에 직접 작성(생성일=오늘, status=draft, 단일=`<NNN>_<slug>.md` / 폴더=`TASK-<NNN>_<slug>/task.md`).
239
55
 
240
56
  ```
241
57
  ✅ TASK-<NNN> 생성 완료
242
- - 워크트리: <WT_PATH>
243
- - 브랜치: <BRANCH>
244
- - task 문서: <TASK_DOC_PATH> (메인 워크트리 / 워크트리 안 — 위 케이스에 따라)
245
- - 헤더: <생성일> / <NNN_slug> / <유형> / <규모> / draft
246
- - BL 마킹: BL-<NNN> [x] (BL 출처 시. RM/DR이면 생략)
247
- - 다음: /task-plan TASK-<NNN> 으로 기획 채우기 (워크트리 폴더에서 새 세션 열어 진행 / 메인 세션 그대로 진행 / 메인이 서브 세션 spawn 등 운영 모델 자유)
58
+ - 워크트리: <wtPath> / 브랜치: <branch> / task 문서: <docPath>
59
+ - 헤더: <생성일> / <plan> / <유형> / <규모> / draft
60
+ - BL 마킹: BL-<NNN> [x] (BL 출처 시. RM/DR 생략)
61
+ - 다음: /task-plan TASK-<NNN> 으로 기획 채우기
248
62
  ```
249
63
 
250
- ## 도구 가이드
251
-
252
- - **Bash**: 메인 워크트리 검출 / 사전 검증 / `git worktree add` / SSoT 조회 / TASK-NNN 계산
253
- - **Read**: `$MAIN_WT/.project/AGENT-GUIDE.md` / `$MAIN_WT/.project/tasks/<활성 plan>/BACKLOG.md` / `$MAIN_WT/.project/plans/<활성 plan>/ROADMAP.md`
254
- - **Write**: task.md 빈 골격 작성 (위치는 .gitignore 케이스에 따라)
255
- - **AskUserQuestion**: 분기 2 인터뷰 (한 번에 한 질문)
256
-
257
64
  ## 주의사항
258
65
 
259
- - **워크트리 생성 + task 문서 작성만 담당** — 본문 채우기 금지. Requirements / Scope / Dev Plan / Test Plan 본문은 *반드시* `/task-plan`에서.
260
- - **단계 경계 — 허용/금지 명시 (stash FRICTION_LOG #11 반영)**:
261
- - **허용 (화이트리스트)**: `$MAIN_WT/.project/plans/<활성 plan>/ROADMAP.md` §4(다음 작업 영역) 확인 / SSoT 조회 / TASK-NNN 계산 / 빈 골격 Write
262
- - **금지 (블랙리스트)**: ARCHITECTURE.md / API-SPEC.md / FEATURES.md 등 `.project/` 루트 제품 관통 문서 본문 Read / 도메인 코드 Read · Grep / 기존 task 본문 Read
263
- - 본문 정보 수집은 *다음 단계 `/task-plan`*에서 수행.
264
- - **자동 추정 진행 X** — 직전 맥락 명확해도 *제안 + 사용자 OK* 거친 후 워크트리/파일 생성.
265
- - **상태는 `draft` 고정** — `/task-init` 끝의 상태는 `draft` 외 작성 금지.
266
- - **NNN 충돌 회피** — SSoT 조회로 진행중 + dev 머지 히스토리 합집합 확인.
267
- - **slug 한국어 잔존 X** — 영어 kebab-case로 변환.
268
- - **헤더 5컬럼 모두 채움** — *"미정"* placeholder 작성 금지.
269
- - **메인 워크트리 검출 실패 시 즉시 중단** — git 버전 / 정책 위배 / dev 부재 등 안전망. 묵묵히 진행 X.
270
- - **race 발생 시 사용자 호출** — `git worktree add` 실패(같은 브랜치명) → SSoT 재조회 + 사용자에게 *"X 세션이 같은 항목 진행 중"* 알림.
66
+ - **워크트리 생성 + 골격 작성만** — 본문 채우기 금지. Requirements / Scope / Dev Plan / Test Plan은 *반드시* `/task-plan`.
67
+ - **단계 경계** — 허용: ROADMAP §4 확인 / SSoT 조회 / `task_init` 호출 / 빈 골격 확인. 금지: ARCHITECTURE/API-SPEC/FEATURES 등 루트 제품 관통 문서 본문 Read · 도메인 코드 Read·Grep · 기존 task 본문 Read (그건 `/task-plan` 영역).
68
+ - **자동 추정 진행 X** — 맥락 명확해도 *제안 + OK* 후 생성.
69
+ - **상태는 `draft` 고정** · **slug 영어 kebab-case** · **헤더 5컬럼 모두 채움**(*"미정"* placeholder X — 코드가 채움).
70
+ - **fork 실패(같은 브랜치명 / 같은 출처 진행중) → 사용자 호출** + 중단(*"다른 세션이 같은 항목 진행 중"*).
271
71
 
272
72
  ## 상태 전이
273
73
 
274
74
  | 진입 시 | 종료 시 |
275
75
  |--------|--------|
276
76
  | (없음 — 신규 생성) | `draft` |
277
-
278
- ## 멀티세션 정합
279
-
280
- - **다른 세션 진행중 태스크** = SSoT (git branch --no-merged) 단일 진실 소스
281
- - **워크트리 정리**: 본 스킬은 *생성*만. 제거는 `/task-close` 또는 `npx @angar2/taskery prune`
282
- - **머지 락**: 본 스킬은 머지 안 함 — 락 불필요
283
- - **충돌 자체 해결**: 본 스킬 영역 X — `/task-close`에서 처리
@@ -340,7 +340,7 @@ Test Plan 작성 완료 후 *반드시* 점검 단계 수행. *"누적/리셋
340
340
  2. 사용자 *"OK"* / *"수정해줘"* 응답:
341
341
  - **OK** → Step 8 진행.
342
342
  - **수정 요청** → 해당 섹션 수정 후 다시 합의. 한도 없이 반복 OK (반복 잦으면 task 분리/규모 재조정 검토).
343
- 3. 합의 완료 후 헤더 status → `planned`로 Edit.
343
+ 3. 합의 완료 후 `set_status` 도구로 `planned` 전이 (또는 `npx @angar2/taskery set-status TASK-<NNN> planned`) — 헤더 상태 전이(유효전이 코드 검증). (Test Plan 보수 모드는 `testing` 유지 — 전이 호출 X.)
344
344
 
345
345
  ### Step 8 — 결과 보고
346
346
 
@@ -357,7 +357,8 @@ Test Plan 작성 완료 후 *반드시* 점검 단계 수행. *"누적/리셋
357
357
 
358
358
  - **Read**: task 파일 / `.project/` 루트 제품 관통 문서 / 관련 코드 정독
359
359
  - **Grep / Glob**: Scope 코드 서치 (관련 함수/파일 탐색)
360
- - **Edit**: task 파일 4 섹션 채우기 + status 전환
360
+ - **Edit**: task 파일 4 섹션 채우기
361
+ - **Bash / 도구**: `set_status` 도구(또는 `npx @angar2/taskery set-status`) status 전이 (유효전이 코드 검증)
361
362
  - **Write**: spec-diff 파일 (Phase 0 변경 시)
362
363
  - **AskUserQuestion**: Requirements 증폭 confirm / 합의 단계 / Phase 분할 검토
363
364
 
@@ -56,7 +56,7 @@ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
56
56
 
57
57
  ### Step 2 — status 전환 (developed → testing)
58
58
 
59
- 진입 시 `developed`인 경우만 헤더 status를 `testing`으로 Edit.
59
+ `set_status` 도구로 `testing` 전이 (또는 `npx @angar2/taskery set-status TASK-<NNN> testing`) — 진입 시 `developed`이면 `testing`으로. 이미 `testing`(이어가기)이면 idempotent no-op. (유효전이 코드 검증.)
60
60
 
61
61
  ### Step 3 — 격리 세션 호출 (Task tool)
62
62
 
@@ -172,7 +172,7 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
172
172
 
173
173
  #### PASS 분기
174
174
 
175
- 1. 헤더 status → `tested` Edit.
175
+ 1. `set_status` 도구로 `tested` 전이 (또는 `npx @angar2/taskery set-status TASK-<NNN> tested`) — PASS 전이 (유효전이 코드 검증).
176
176
  2. 결과 보고:
177
177
  ```
178
178
  ✅ TASK-<NNN> 격리 검증 PASS
@@ -195,7 +195,7 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
195
195
  1. "고쳐" — 메인이 status를 developing으로 되돌림 + /task-dev 재진입
196
196
  2. "OK 마무리" — 실패 알면서 /task-close 진행 (위험: 알려진 결함 채로 closed)
197
197
  ```
198
- 3. 사용자 *"고쳐"* → 헤더 status `testing` → `developing` Edit + `/task-dev` 안내. 사용자 *"OK 마무리"* → status `testing` → `tested` Edit (단 Result 섹션에 *"알려진 결함 있음"* 명시) + `/task-close` 안내.
198
+ 3. 사용자 *"고쳐"* → `set_status` 도구로 `developing` 전이(또는 `npx @angar2/taskery set-status TASK-<NNN> developing`) + `/task-dev` 안내. 사용자 *"OK 마무리"* → `set_status`로 `tested` 전이 (Result 섹션에 *"알려진 결함 있음"* 명시) + `/task-close` 안내.
199
199
  4. **시각 어긋남 FAIL의 경우** — 격리 세션이 준 *어긋남 목록*을 그대로 보고에 실어, 사용자 *"고쳐"* 시 `/task-dev`가 그 목록을 **한 번에 배치로** 수정하도록 안내(흠을 사용자가 직접 찾지 않음 — test가 찾아줌). **재검사 라운드 상한 = 3회** (기본값, 프로젝트별 조정 가능): dev↔test를 3회 돌고도 어긋남이 남으면 멈추고 *현 상태 + 남은 어긋남*을 사용자에게 보고해 판단을 받는다. (전이는 매 라운드 사용자 *"고쳐"* 발화로 진행 — 무인 자동 루프 아님.)
200
200
 
201
201
  #### UNCERTAIN(검증 불가) 분기 — 시험문제 결함 → Test Plan 보수
@@ -250,7 +250,8 @@ USER 검수 — N 항목 (목업 기준: <mockup path — 있을 시>)
250
250
  ## 도구 가이드
251
251
 
252
252
  - **Read**: task 파일 / `## Test Plan` + `## Dev Plan` 정독
253
- - **Edit**: status 전환 + Result 섹션 기록
253
+ - **Edit**: Result 섹션 기록
254
+ - **Bash / 도구**: `set_status` 도구(또는 `npx @angar2/taskery set-status`) status 전이 (유효전이 코드 검증)
254
255
  - **Task tool**: 격리 세션 호출 (Step 3 prompt 사용)
255
256
  - **AskUserQuestion**: FAIL/UNCERTAIN 시 사용자 판단 받기
256
257