@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,7 +7,7 @@ description: task git 마무리 — 검증 게이트 + 커밋 순서 + 머지
7
7
 
8
8
  ## 개요
9
9
 
10
- `tested` 상태 task의 git 마무리. **호출 위치 자유** — 워크트리 cwd / 메인 워크트리 cwd / 다른 세션이 호출한 서브 세션 모두 동작 동일 (모든 git 명령이 `git -C <경로>` 형태라 cwd 무관). 사전 rebase → 충돌 해결 (3단계 에스컬레이션) → 머지 락 → 락 안 재 rebase → dev `--no-ff` 머지 → 워크트리 제거 + 작업 브랜치 자동 삭제.
10
+ `tested` 상태 task의 git 마무리. **호출 위치 자유** — 워크트리 cwd / 메인 워크트리 cwd / 다른 세션이 호출한 서브 세션 모두 동작 동일 (모든 git 명령이 `git -C <경로>` 형태라 cwd 무관). `close` CLI 결정적 준비(Phase 커밋·status=closed·문서 커밋·추적 마커) → 사전 rebase → 충돌 해결 (3단계 에스컬레이션) → 머지 락 → 락 안 재 rebase → dev `--no-ff` 머지 → 워크트리 제거 + 작업 브랜치 자동 삭제.
11
11
 
12
12
  **최종 게이트**: 모든 검증 명령 재실행 — 린트/타입체크/빌드 PASS여야 진행.
13
13
 
@@ -65,8 +65,8 @@ LOCK_FILE="$HOME/.taskery/${PROJECT_ID}.merge.lock"
65
65
  ```sh
66
66
  git -C "$WT_PATH" status --porcelain
67
67
  ```
68
- - 결과 *있음* = 정상 흐름 (taskery 정책: `/task-dev` = *git 작업 X*). 본 변경분은 Step 6-3에서 *task-close가 자동 Phase 커밋 생성*으로 처리.
69
- - 결과 *없음* = 변경분 0건 → Step 2 검증만 수행 후 Step 6-3 자동 커밋 단계 스킵. **단 6-7까지 거쳐도 워크트리 브랜치가 dev보다 앞선 커밋이 0개면 Step 6-8에서 추적 마커 빈커밋 1개 생성** (`.project` gitignore + docs/분석 전용 task → 채번 보존).
68
+ - 결과 *있음* = 정상 흐름 (taskery 정책: `/task-dev` = *git 작업 X*). 본 변경분은 Step 3 `close`가 *Dev Plan Phase 매핑 → Phase별 자동 커밋*으로 처리.
69
+ - 결과 *없음* = 변경분 0건 → Step 2 검증만 수행. **워크트리 브랜치가 dev보다 앞선 커밋이 0개면 Step 3 `close`가 추적 마커 빈커밋 1개 생성** (`.project` gitignore + docs/분석 전용 task → 채번 보존).
70
70
  - **차단 X** — 본 단계는 *상태 인지*용. close 중단 사유 X.
71
71
  4. **task 파일 + GIT_RULE 확인**:
72
72
  - task 문서 위치 분기 (`.gitignore` 케이스):
@@ -101,16 +101,32 @@ FAIL 시:
101
101
  - *"고쳐"* → status `developing`으로 되돌림 + `/task-dev` 안내 + close 중단.
102
102
  - *"OK 마무리"* → 결함 명시한 채 진행 (Result 섹션에 *"검증 명령 X FAIL 알려진 결함 — 사유: ..."* 추가).
103
103
 
104
- ### Step 3 — 사전 rebase (락 외, UX용 조기 충돌 감지)
104
+ ### Step 3 — 결정적 준비 (`task_close` 도구)
105
+
106
+ `task_close` 도구 (또는 `npx @angar2/taskery close TASK-NNN`) 한 번으로 다음을 코드가 수행:
107
+ - **Phase 기능 커밋** — uncommitted 코드 변경분(`.project/` 외)을 task.md `### Phase N`의 `- 파일:` 필드에 매핑해 Phase 순서대로 자동 커밋 (GIT_RULE 메시지 형식, 태그 자동: feature→`feat:` / bug→`fix:` / improve→`improve:` / refactor→`refactor:` / docs·chore→`docs:`).
108
+ - **status → `closed`** — task 문서 헤더 (`.gitignore` 케이스 자동 판정 — 등록=메인WT / 미등록=워크트리).
109
+ - **flows/문서 커밋** (미등록 케이스) — 워크트리 안 `.project/flows/` + task 문서.
110
+ - **추적 마커 빈커밋** — dev보다 앞선 커밋이 0개(코드 0·`.project` gitignore인 docs/분석 task)면 채번 보존용 1개.
111
+
112
+ 반환 JSON `{ prepped, branch, wtPath, registered, commits, aheadOfDev }`.
113
+
114
+ **콜백 (반환 `blocked` 필드 / npx는 특수 exit — 메인이 LLM 판단 후 처리):**
115
+ - **`blocked:'mapping'`** (npx exit 2 — `{files, phases, reason}`): Dev Plan `- 파일:` 필드가 변경 파일을 못 덮음(미매핑) 또는 한 파일이 여러 Phase에 걸침. → 메인이 Dev Plan + `git -C "$WT_PATH" diff --name-only` 정독 후 **코드 변경분을 Phase별로 수동 커밋**(GIT_RULE 형식, 위 태그) → `task_close` 도구(또는 `npx ... close`) **재호출**. 코드가 이미 커밋돼 있으므로 close가 status=closed + 문서 커밋 + 마커를 자동 완료한다.
116
+ - **`blocked:'status'`** (npx exit 3 — `{current}`): status가 `tested`가 아님. Step 1~2 통과했다면 발생 X. 발생 시 사용자 보고 + 중단.
117
+
118
+ > **close 후 task 문서 수정 금지** — close가 status=`closed`로 잠갔다(`closed-immutable.sh` hook 차단). 이후 Step 4 충돌 해결 내역은 *task 문서가 아니라 rebase/머지 커밋 메시지*에 기록한다.
119
+
120
+ ### Step 4 — 사전 rebase + 충돌 자체 해결 (락 외, UX용 조기 감지)
121
+
122
+ `close`가 모든 변경을 커밋했으므로 rebase가 깨끗하게 replay된다.
105
123
 
106
124
  ```sh
107
125
  git -C "$WT_PATH" rebase dev
108
126
  ```
109
127
 
110
- - 충돌 없음 → Step 6으로 (커밋 순서).
111
- - 충돌 있음 → Step 4 (3단계 에스컬레이션).
112
-
113
- ### Step 4 — 충돌 자체 해결 (3단계 에스컬레이션)
128
+ - 충돌 없음 → Step 5 (머지).
129
+ - 충돌 있음 → 아래 3단계 에스컬레이션. 해결 내역은 *커밋 메시지*에 기록(문서는 closed라 수정 X).
114
130
 
115
131
  #### 4-a. 단순 충돌 → 자동 해결
116
132
 
@@ -136,132 +152,26 @@ git -C "$WT_PATH" rebase dev
136
152
  - 해결 방향 후보 제시 + 사용자 결정 후 재개.
137
153
  - 사용자가 중단 결정 시: `git -C "$WT_PATH" rebase --abort` 자동 + close 중단.
138
154
 
139
- ### Step 5 — 태스크 문서에 충돌 해결 내역 추가 (해당 시)
140
-
141
- 충돌 해결 1건이라도 발생했으면 task 문서에 기록.
142
-
143
- `.gitignore` 케이스 분기:
144
-
145
- | 케이스 | 위치 | 흐름 |
146
- |--------|------|------|
147
- | 미등록 | `$WT_PATH/.project/tasks/<NNN_slug>/...` | 워크트리 안 task 문서 수정 → Step 6 Phase 커밋에 *코드 + 문서 = 한 커밋*에 포함 |
148
- | 등록 | `$MAIN_WT/.project/tasks/<NNN_slug>/...` | 워크트리 안 코드만 한 커밋 + 메인 워크트리 절대 경로 task 문서를 **proper-lockfile**로 별도 수정 (`bin/lib.js` `withMetaLock` — 머지 커밋 미포함, 메인 로컬 보존) |
149
-
150
- 기록 형식 (task.md Result 섹션 안):
151
- ```markdown
152
- ### 충돌 해결 (close 직전 rebase)
153
- - 자료 우선순위: 태스크 문서 (다른 세션 TASK-XXX) / 커밋 메시지 / diff
154
- - 자료 한계 보고: (있으면 명시)
155
- - 해결 방향: <한 줄 요약>
156
- - 영향 파일: <목록>
157
- ```
158
-
159
- ### Step 6 — 머지 락 획득 + 락 안 재 rebase + 커밋 시퀀스
160
-
161
- #### 6-1. 머지 락 획득
155
+ ### Step 5 — 머지 락 + 락 안 재 rebase + dev 머지
162
156
 
163
- `bin/lib.js` `withMergeLock(projectId, fn, opts)` 호출. 내부 동작:
157
+ 머지 락 안에서 [락 안 rebase → 메인WT 검증 → dev `--no-ff` 머지]를 직렬 수행한다 (`bin/lib.js` `withMergeLock(projectId, fn)` — 다른 세션 머지와 직렬화). Phase 커밋·status=closed·문서 커밋·추적마커는 Step 3 `close`가 이미 끝냈으므로 본 단계는 *락 + rebase + 머지*만 담당.
164
158
 
165
- ```js
166
- // proper-lockfile
167
- await lockfile.lock(LOCK_FILE, {
168
- stale: LOCK_TIMEOUT_MS,
169
- retries: { retries: 5, factor: 1, minTimeout: 1000, maxTimeout: 1000 },
170
- });
171
- ```
159
+ #### 5-1. 머지 락 획득
172
160
 
173
- 재시도 모두 실패 시 → 사용자 보고 + 중단.
161
+ `bin/lib.js` `withMergeLock(projectId, fn, opts)` (proper-lockfile, `stale=LOCK_TIMEOUT_MS`, retries 5). 재시도 모두 실패 시 → 사용자 보고 + 중단.
174
162
 
175
- #### 6-2. 락 안에서 rebase 재실행
163
+ #### 5-2. 락 안에서 rebase 재실행
176
164
 
177
165
  ```sh
178
166
  git -C "$WT_PATH" rebase dev
179
167
  ```
180
168
 
181
- 락 외 rebase 이후 *다른 세션이 dev 머지했을 수 있음* — 락 안 rebase로 흡수.
182
- - 재충돌 발견 시 Step 4 에스컬레이션 재실행 + Step 5 문서 기록 재실행.
183
-
184
- #### 6-3. Phase 기능 커밋 (Dev Plan 각 Phase마다 1개 — task-close가 자동 생성)
185
-
186
- > **책임 영역**: taskery 정책상 `/task-dev` = *git 작업 X* (워크트리 코드만 수정). 본 단계가 *task-close가 uncommitted 변경분 정독 → task.md `## Dev Plan` Phase 진행 [x] 매핑 → Phase별 commit 자동 생성*하는 단일 진입점이다.
187
-
188
- 자동 생성 절차:
189
-
190
- 1. **uncommitted 변경분 정독**:
191
- ```sh
192
- git -C "$WT_PATH" status --porcelain
193
- git -C "$WT_PATH" diff --name-only
194
- ```
195
- 2. **task.md `## Dev Plan` 정독** — Phase별 `진행: [x]` + 파일 매핑 추출.
196
- 3. **Phase ↔ 변경 파일 매핑**:
197
- - 한 Phase가 단독 파일 영역이면 → Phase별 1 커밋.
198
- - 같은 파일이 여러 Phase에 걸쳐 있으면 → *단일 통합 커밋 1개*로 묶음 (Phase 번호 표기는 *Phase X+Y*).
199
- - 매핑 모호 / Dev Plan 본문 추적 불가 시 → 사용자 호출 + 결정 (자동 진행 X).
200
- - 메시지 형식 (GIT_RULE.md):
201
- ```
202
- {태그}: [TASK-<NNN>] Phase <N> - <작업 요약>
203
-
204
- - <처리 내용 1>
205
- - <처리 내용 2>
206
- - 사유: <변경 이유>
207
- ```
208
- - 태그: feature → `feat:`, bug → `fix:`, improvement → `improve:`, refactor → `refactor:`, docs/chore → `docs:`, 테스트 → `test:`
209
-
210
- > **GIT_RULE 풍부 메시지** — 본 메시지는 *충돌 해결 자료 2순위*로 쓰인다. 의도 한 줄 압축.
211
-
212
- > **자동 분리 로직 코드 구현**은 본 SKILL.md 영역 외 — 메인 세션이 본 절차를 따라 *수동/대화형* 진행. 향후 `bin/lib.js`에 `splitUncommittedByPhase(wtPath, taskMd)` 영역 별도 라운드.
213
-
214
- #### 6-4. flows/ 모듈 커밋 (해당 시)
215
-
216
- `$WT_PATH/.project/flows/<module>.md` 변경분 있으면 별도 커밋:
217
- ```
218
- docs: [TASK-<NNN>] flows/<module>.md 갱신
219
- ```
220
-
221
- - **`.gitignore` 미등록 케이스 한정** — 등록 케이스는 *워크트리 외부* 메인 워크트리 직접 수정 + `withMetaLock`.
222
-
223
- #### 6-5. task 파일 status → `closed` Edit
224
-
225
- closed-immutable.sh hook *허용* 영역 (status=closed 적용된 *후* 재수정이 차단).
226
-
227
- - **.gitignore 등록 케이스**: 메인 워크트리 task 문서를 `withMetaLock`으로 status=`closed` 갱신.
228
- - **.gitignore 미등록 케이스**: 워크트리 안 task 문서를 Edit.
229
-
230
- #### 6-6. 태스크 문서 커밋 (미등록 케이스 한정)
231
-
232
- ```
233
- docs: [TASK-<NNN>] 태스크 문서 완료
234
- ```
235
-
236
- - 대상: `$WT_PATH/.project/tasks/<NNN_slug>/<NNN>_<slug>.md` (단일) 또는 `.../TASK-<NNN>_<slug>/task.md` (폴더 승격) + spec-diffs / screenshots / mockup (`<NNN_slug>` 공통, TASK_DOC_RULE §1.5).
237
- - **등록 케이스**: Step 6-5에서 메인 워크트리 직접 수정으로 처리 — 별도 커밋 X (워크트리 머지에 포함 X).
238
-
239
- #### 6-7. CHANGELOG 커밋 (해당 시)
240
-
241
- `$MAIN_WT/.project/rules/CHANGELOG_RULE.md` 정독 후 형식 / 위치 준수.
242
-
243
- - 위치 분기:
244
- - 미등록 — 워크트리 안 `$WT_PATH/.project/changelog/<YYYY-MM>.md` 갱신 + 커밋
245
- - 등록 — `$MAIN_WT/.project/changelog/<YYYY-MM>.md` `withMetaLock` 갱신 (커밋 X)
246
- - 본 task에서 변경분 없으면 본 단계 *완전히 스킵* (빈 commit 금지).
247
-
248
- #### 6-8. 추적 마커 빈커밋 (폴백 — 머지 커밋 미생성 케이스 한정)
169
+ 락 외(Step 4) rebase 이후 *다른 세션이 dev 머지했을 수 있음* — 락 안 rebase로 흡수.
170
+ - 재충돌 발견 시 Step 4 에스컬레이션 재실행 (해결 내역은 커밋 메시지 — 문서 closed).
249
171
 
250
- > **조건**: 6-3 ~ 6-7을 모두 거쳤는데도 워크트리 브랜치가 dev보다 앞선 커밋이 **0개**인 경우에만 발동.
251
- > **발생 케이스**: `.project`가 gitignore된 프로젝트에서 *코드 변경 0 + 산출물이 메인 워크트리 직접 수정 task 문서뿐*인 docs/분석 전용 task. 워크트리에 추적 가능한 변경이 없어 6-3 ~ 6-7이 전부 스킵된 상태.
252
- > **이유**: 이대로 Step 8 `--no-ff` 머지를 하면 브랜치가 dev와 동일 커밋이라 *Already up to date* → 머지 커밋이 생성되지 않는다. 그러면 dev 히스토리에 `TASK-NNN` 흔적이 남지 않고, 이후 작업 브랜치가 자동 삭제(Step 13)되면 `getNextTaskNumber`가 진행중 브랜치·dev 머지 양쪽에서 번호를 찾지 못해 **다음 task가 같은 번호를 재사용/충돌**한다.
172
+ > Phase 커밋 · flows/문서 커밋 · status=closed · 추적 마커는 **Step 3 `close`가 이미 완료**했다. 본 단계는 머지 락 안에서 *재 rebase + 메인WT 검증 + dev 머지*만 수행한다.
253
173
 
254
- ```sh
255
- if [ "$(git -C "$WT_PATH" rev-list --count dev..HEAD)" -eq 0 ]; then
256
- git -C "$WT_PATH" commit --allow-empty \
257
- -m "docs: [TASK-<NNN>] 추적 마커 — 코드 0·.project gitignore (채번 보존)"
258
- fi
259
- ```
260
-
261
- - 마커 커밋으로 브랜치가 dev보다 1커밋 앞서게 되어, Step 8 `--no-ff` 머지가 정상 머지 커밋을 생성한다 (머지 커밋 메시지의 브랜치명에 `TASK-NNN`이 포함되어 grep 추적 가능).
262
- - 추적 변경이 하나라도 있는 일반 task는 조건(`-eq 0`)에 걸리지 않아 발동하지 않는다 — 기존 동작 그대로.
263
-
264
- ### Step 7 — 메인 워크트리 uncommitted 검증 (머지 직전)
174
+ #### 5-3. 메인 워크트리 uncommitted 검증 (머지 직전)
265
175
 
266
176
  ```sh
267
177
  git -C "$MAIN_WT" status --porcelain
@@ -270,7 +180,7 @@ git -C "$MAIN_WT" status --porcelain
270
180
  - 변경 있으면 → 사용자 호출 + 결정 (stash / 중단).
271
181
  - 등록 케이스에서 task 문서 직접 수정이 *.gitignore 차단으로 status에 안 잡힘* — 정상.
272
182
 
273
- ### Step 8 — dev 머지
183
+ #### 5-4. dev `--no-ff` 머지
274
184
 
275
185
  ```sh
276
186
  git -C "$MAIN_WT" merge --no-ff "$BRANCH"
@@ -278,12 +188,13 @@ git -C "$MAIN_WT" merge --no-ff "$BRANCH"
278
188
 
279
189
  - `-m` 옵션 금지 (git 기본 메시지).
280
190
  - 머지 커밋 해시 캡처: `MERGE_COMMIT=$(git -C "$MAIN_WT" rev-parse HEAD)`
191
+ - 브랜치가 dev보다 1커밋 이상 앞서야 머지 커밋이 생성된다 — Step 3 `close`의 추적 마커가 docs/분석 task의 0-커밋 케이스를 이미 보장(채번 보존).
281
192
 
282
- ### Step 9 — 머지 락 해제
193
+ #### 5-5. 머지 락 해제
283
194
 
284
195
  `withMergeLock` 콜백 종료 시 자동 release.
285
196
 
286
- ### Step 10 — 마찰 신호 자체 감지 (`/log-friction` 발동 후보)
197
+ ### Step 6 — 마찰 신호 자체 감지 (`/log-friction` 발동 후보)
287
198
 
288
199
  본 task 진행 중 *마찰 신호* 누적 여부를 검사. 감지 시 `/log-friction` 등록을 사용자에게 제안.
289
200
 
@@ -297,7 +208,9 @@ git -C "$MAIN_WT" merge --no-ff "$BRANCH"
297
208
  - 감지 신호 있음 → *"이번 task에서 X 부분이 마찰이었어 보여 — `/log-friction`으로 등록할까?"* OK 시 자동 발동.
298
209
  - 없음 → prompt X.
299
210
 
300
- ### Step 11 — worktree remove 사전 검증
211
+ ### Step 7 — 워크트리 / 브랜치 정리 (비가역 — git-guard 면제 조항)
212
+
213
+ #### 7-1. worktree remove 사전 검증
301
214
 
302
215
  ```sh
303
216
  git -C "$WT_PATH" status --porcelain # unstaged
@@ -305,30 +218,28 @@ git -C "$WT_PATH" ls-files --others --exclude-standard # 추적 X 파일
305
218
  ```
306
219
 
307
220
  - 발견 시 사용자 호출 + 결정:
308
- - 보존 → Step 12, 13 모두 건너뜀 (브랜치도 보존 — 정합)
309
- - 삭제 → Step 12 진행
221
+ - 보존 → 7-2, 7-3 모두 건너뜀 (브랜치도 보존 — 정합)
222
+ - 삭제 → 7-2 진행
310
223
  - 취소 → close 중단 (dev 머지는 이미 완료)
311
224
 
312
- ### Step 12 — 워크트리 제거
225
+ #### 7-2. 워크트리 제거
313
226
 
314
227
  ```sh
315
228
  git -C "$MAIN_WT" worktree remove "$WT_PATH"
316
229
  ```
317
230
 
318
- ### Step 13 — 브랜치 자동 삭제 / 보존
231
+ #### 7-3. 브랜치 자동 삭제 / 보존
319
232
 
320
- - **보존 키워드 감지** (`keep` / `--keep-branch` / `브랜치 남겨` / `브랜치 보존` / `브랜치 유지`) → 보존 + 워크트리도 보존 (Step 11~13 건너뛴 것과 정합).
233
+ - **보존 키워드 감지** (`keep` / `--keep-branch` / `브랜치 남겨` / `브랜치 보존` / `브랜치 유지`) → 보존 + 워크트리도 보존 (7-1~7-3 건너뛴 것과 정합).
321
234
  - **그 외** → `git -C "$MAIN_WT" branch -d "$BRANCH"`
322
235
 
323
- ### Step 14 — 안전망 출력
236
+ ### Step 8 — 안전망 출력 + 결과 보고
324
237
 
325
238
  ```
326
239
  삭제됨: $BRANCH
327
240
  복구: git -C "$MAIN_WT" branch $BRANCH $MERGE_COMMIT
328
241
  ```
329
242
 
330
- ### Step 15 — 결과 보고
331
-
332
243
  ```
333
244
  ✅ TASK-<NNN> closed
334
245
  - 작업 브랜치: <BRANCH> (삭제 / 보존)
@@ -342,10 +253,10 @@ git -C "$MAIN_WT" worktree remove "$WT_PATH"
342
253
 
343
254
  ## 도구 가이드
344
255
 
345
- - **Read**: GIT_RULE / task 파일 / CLAUDE.md 검증 명령 정독
346
- - **Bash**: git 명령 (`branch`, `rebase`, `merge`, `worktree`) + 검증 명령 재실행. **유일하게 git 사용 허가된 스킬**
347
- - **Edit / Write**: task 파일 갱신, CHANGELOG (메타 위치는 `.gitignore` 케이스에 따라)
348
- - **bin/lib.js**: `withMergeLock` (머지 락) / `withMetaLock` (메타 파일 쓰기 락)
256
+ - **Read**: GIT_RULE / task 파일 / CLAUDE.md 검증 명령 정독 / `task_close` 반환 JSON
257
+ - **Bash / 도구**: `task_close` 도구(또는 `npx @angar2/taskery close TASK-NNN`) 결정적 준비 + git 명령 (`rebase`, `merge`, `worktree`, `branch`) + 검증 명령 재실행. **유일하게 git 사용 허가된 스킬**
258
+ - **Edit / Write**: (매핑 콜백 시) 수동 Phase 커밋용 staging / CHANGELOG 내용 (close가 커밋). **close 후 task 문서는 closed라 수정 X**
259
+ - **bin/lib.js**: `withMergeLock` (머지 락 — Step 5)
349
260
 
350
261
  ## 주의사항
351
262
 
@@ -358,7 +269,7 @@ git -C "$MAIN_WT" worktree remove "$WT_PATH"
358
269
  - **자료 한계 보고** — 충돌 분석 시 *2/3순위 fallback 사용했음*을 사용자에게 명시. 묵묵히 진행 X.
359
270
  - **destructive 명령 사용자 승인 필수** — `git reset --hard` / `git push --force` / `git branch -D` / `git clean -fd` 사용자 명시 승인 없이 절대 실행 X. (단 `/task-close` 자동 흐름 `git branch -d` + `worktree remove`는 §"작업 브랜치 삭제 정책 — 자동 삭제 면제 조항" 면제)
360
271
  - **민감 정보 staging X** — `.env` / `credentials.json` / API key 등 staging 절대 X.
361
- - **빈 commit 금지 (예외 1건)** — CHANGELOG 변경 없으면 6-7 단계 스킵, `--allow-empty` 사용 금지. **단 Step 6-8 추적 마커 빈커밋만 예외** — 워크트리 브랜치가 dev보다 앞선 커밋이 0개일 때 채번 보존용으로 1개 허용.
272
+ - **빈 commit 금지 (예외 1건)** — `close`가 변경 없는 영역은 빈 commit을 만들지 않는다. **단 Step 3 `close`의 추적 마커 빈커밋만 예외** — 워크트리 브랜치가 dev보다 앞선 커밋이 0개일 때 채번 보존용으로 1개 허용.
362
273
  - **`-m` 옵션 머지 커밋에 사용 금지** — git 기본 메시지 사용.
363
274
  - **검수 서버/터널 정리는 자기 것만** — 본 task가 검수용으로 띄운 서버·터널(자기 포트 것)만 종료. `pkill -f` 류 광역 종료 금지 (다른 세션 프로세스까지 죽임). 상세: GIT_RULE "멀티세션 검수 환경".
364
275
 
@@ -375,5 +286,5 @@ git -C "$MAIN_WT" worktree remove "$WT_PATH"
375
286
  - **머지 락** — `~/.taskery/<projectId>.merge.lock` 단일. 모든 세션 직렬화.
376
287
  - **task 문서 단일 진실 소스** — `.gitignore` 케이스에 따라 메인 워크트리 또는 워크트리. 다른 세션의 충돌 해결 자료 정독 시 *SSoT 조회 → 워크트리 경로 산출* (미등록 케이스) 또는 *메인 워크트리 절대 경로* (등록 케이스).
377
288
  - **워크트리 + 브랜치 자동 제거** — GIT_RULE.md "작업 브랜치 삭제 정책" 면제 조항 (taskery 한정). 보존 키워드 시 양쪽 보존.
378
- - **safety net** — Step 14 복구 명령 출력. 사용자가 잘못 삭제 인지 시 즉시 복구 가능.
289
+ - **safety net** — Step 8 복구 명령 출력. 사용자가 잘못 삭제 인지 시 즉시 복구 가능.
379
290
  - **BACKLOG.md 무관** — `.project/tasks/<NNN_slug>/BACKLOG.md` 체크 마킹은 `/task-init` Step 7.5가 처리(`[ ]` → `[x]` + `- TASK: TASK-NNN`). `[x]` = *task로 옮김* 의미라 close 시점에 추가 마킹 X. 완료 추적은 `npx @angar2/taskery status`(진행 중이면 dev 미머지가 정상) → 목록에 없을 때만 `git log dev --grep 'BL-NNN'` 순.
@@ -62,7 +62,7 @@ self-check 명령은 워크트리(`$WT_PATH`)에서 실행 — 코드 변경이
62
62
 
63
63
  ### Step 2 — status 전환 (planned → developing)
64
64
 
65
- 진입 시 `planned`인 경우만 헤더 status를 `developing`으로 Edit.
65
+ `set_status` 도구로 `developing` 전이 (또는 `npx @angar2/taskery set-status TASK-<NNN> developing`) — 진입 시 `planned`이면 `developing`으로. 이미 `developing`(이어가기)이면 idempotent no-op. (유효전이 코드 검증.)
66
66
 
67
67
  ### Step 3 — Phase 순서대로 구현
68
68
 
@@ -156,7 +156,7 @@ stash FRICTION_LOG #14+19 / #25 반영 — 유닛 테스트는 본 단계에서
156
156
 
157
157
  ### Step 8 — status 전환 + 결과 보고
158
158
 
159
- 1. 헤더 status → `developed` Edit.
159
+ 1. `set_status` 도구로 `developed` 전이 (또는 `npx @angar2/taskery set-status TASK-<NNN> developed`) — self-check + 테스트 PASS 후. (유효전이 코드 검증.)
160
160
  2. 결과 보고:
161
161
 
162
162
  ```
@@ -179,8 +179,8 @@ stash FRICTION_LOG #14+19 / #25 반영 — 유닛 테스트는 본 단계에서
179
179
  ## 도구 가이드
180
180
 
181
181
  - **Read**: task 파일 / `CLAUDE.md` 검증 명령 / 관련 코드 정독
182
- - **Edit / Write**: 코드 작성 + Phase 체크박스 갱신 + Result 섹션 갱신 + status 전환
183
- - **Bash**: 검증 명령 실행 (린트/타입/빌드/단위테스트). **git 명령 절대 X — `/task-close`만 git 담당**
182
+ - **Edit / Write**: 코드 작성 + Phase 체크박스 갱신 + Result 섹션 갱신
183
+ - **Bash / 도구**: 검증 명령 실행 (린트/타입/빌드/단위테스트) / `set_status` 도구(또는 `npx @angar2/taskery set-status`) status 전이. **git 명령 절대 X — `/task-close`만 git 담당**
184
184
  - **Grep / Glob**: 추가 코드 탐색 (Phase 진행 중 인접 영향 발견 시)
185
185
 
186
186
  ## 주의사항