@angar2/taskery 0.5.0 → 0.6.1
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.
- package/README.md +11 -5
- package/bin/close.js +2 -2
- package/bin/fork.js +5 -2
- package/bin/lib.js +128 -57
- package/bin/mcp.js +4 -3
- package/bin/status.js +6 -3
- package/package.json +1 -1
- package/template/.claude/hooks/closed-immutable.sh +5 -3
- package/template/.codex/agents/task-tester.toml +6 -3
- package/template/.codex/hooks/closed-immutable.sh +2 -2
- package/template/.project/TEST-GUIDE.md +11 -0
- package/template/.project/rules/GIT_RULE.md +32 -19
- package/template/.project/rules/TASK_DOC_RULE.md +12 -10
- package/template/AGENTS.md +16 -14
- package/template/CLAUDE.md +16 -14
- package/template/shared/skills/add-backlog/SKILL.md +1 -1
- package/template/shared/skills/plan-init/SKILL.md +2 -2
- package/template/shared/skills/project-init/SKILL.md +2 -2
- package/template/shared/skills/task-close/SKILL.md +53 -24
- package/template/shared/skills/task-dev/SKILL.md +33 -2
- package/template/shared/skills/task-init/SKILL.md +16 -16
- package/template/shared/skills/task-plan/SKILL.md +17 -10
- package/template/shared/skills/task-test/SKILL.md +64 -11
|
@@ -42,7 +42,7 @@ while IFS= read -r FILE_PATH; do
|
|
|
42
42
|
# 존재하는 파일만 (Add File 신규 생성은 통과)
|
|
43
43
|
[ -f "$FILE_PATH" ] || continue
|
|
44
44
|
|
|
45
|
-
# 헤더 status 추출
|
|
45
|
+
# 헤더 status 추출 — status는 헤더 표의 *마지막* 셀 (5컬럼 구 / 6컬럼 0.6.0+ 양쪽).
|
|
46
46
|
STATUS=$(TM="$FILE_PATH" python3 -c "
|
|
47
47
|
import os, re
|
|
48
48
|
try:
|
|
@@ -51,7 +51,7 @@ except Exception:
|
|
|
51
51
|
print('')
|
|
52
52
|
raise SystemExit(0)
|
|
53
53
|
WL = r'(draft|planned|developing|developed|testing|tested|closed)'
|
|
54
|
-
m = re.search(rf'^\|[^|]*\|
|
|
54
|
+
m = re.search(rf'^\|(?:[^|]*\|){{4,5}}\s*{WL}\s*\|\s*\$', content, re.MULTILINE)
|
|
55
55
|
print(m.group(1) if m else '')
|
|
56
56
|
" 2>/dev/null)
|
|
57
57
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
> 이 프로젝트에서 각 테스트 방식을 *실제로 어떻게 실행하나*의 단일 소스.
|
|
4
4
|
> **제품 관통 문서 아님 — 검증 방법 문서.** (제품 스펙은 `.project/` 루트 그룹 A/B 문서 참조.)
|
|
5
5
|
> `/task-test` 격리 세션이 task.md와 함께 이 파일을 읽어, 명세된 방식을 *이 프로젝트의 실제 경로*로 실행한다.
|
|
6
|
+
> **역할 구분**: 본 문서 = *어떻게 실행하나*(경로·명령·셋업). `.project/rules/TEST_RULE.local.md` = *무엇을 얼마나 검증하나*(범위·방식 정책, 옵션·로컬 전용). 둘을 섞어 적으면 어느 쪽에도 안 남는다.
|
|
6
7
|
|
|
7
8
|
**사용 규칙**:
|
|
8
9
|
- 처음엔 빈 골격 — 검증 방법을 아직 모름. `/task-plan`이 방식별 실행 경로를 *사용자에게 확인받은 즉시* 채운다.
|
|
@@ -44,6 +45,16 @@
|
|
|
44
45
|
|
|
45
46
|
---
|
|
46
47
|
|
|
48
|
+
## 테스트 실행 환경 (격리 실행 경로 — 화면·입력 점유 회피)
|
|
49
|
+
|
|
50
|
+
> 실제 앱을 띄워 UI를 자동 조작하는 스위트(XCUITest · headed 브라우저 E2E 등)를 **사용자의 화면·마우스·키보드를 뺏지 않고** 돌리는 경로. 여기에 경로가 적혀 있으면 자동 게이트·격리 세션이 그 경로로 자동 실행하고, 비어 있으면 자동 실행하지 않고 사용자 승인을 받는다 (`/task-dev` Step 6.5 · `/task-test` 격리 룰).
|
|
51
|
+
>
|
|
52
|
+
> 적을 수 있는 것: 창 숨김·헤드리스 플래그(예: 테스트 모드 환경변수로 창 표시·포커스 탈취 비활성) / 가상 디스플레이·컨테이너 / VM / CI 러너 위임 / 점유 스위트를 제외하는 한정 실행 옵션(번들·프로젝트·태그 지정).
|
|
53
|
+
|
|
54
|
+
<아직 미정 — 점유 스위트가 있는 프로젝트에서 `/task-dev`·`/task-test`가 사용자에게 확인 후 기록>
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
47
58
|
## 기타
|
|
48
59
|
|
|
49
60
|
> 위 분류에 안 맞는 프로젝트 고유 검증 방법.
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
- **git 작업은 메인 세션이 `/task-close` 스킬 또는 직접 수행**.
|
|
12
12
|
- **main, dev 직접 커밋 절대 금지**: 모든 작업은 태스크 브랜치에서 진행.
|
|
13
13
|
- **하나의 브랜치는 하나의 태스크만 담당**.
|
|
14
|
-
- **작업 브랜치는 *task-init
|
|
15
|
-
-
|
|
14
|
+
- **작업 브랜치는 *task-init 시점의 현재 브랜치*(= 부모 브랜치)에서 분기, *task-close 시점에* 그 부모 브랜치로 병합** (멀티세션 0.1.2+ / 부모 파라미터화 0.6.0+). 부모는 `dev` 고정이 아니라 서 있는 브랜치 — 개인 기본 `dev`, 회사/로드맵 `dev_feat_x`/`master` 등. task 헤더에 기록돼 close가 그 값으로 되병합한다.
|
|
15
|
+
- **부모 → 상위(dev/voyager/master 등) 병합은 사용자가 직접 수행** (로컬 또는 PR). taskery는 부모까지만 병합.
|
|
16
16
|
- **수동 git 작업 시 정합성 보장 X** — taskery 명령(스킬 호출 / `npx @angar2/taskery <서브>`)으로만 운영. 수동 `git worktree add` / `branch` / `merge` 시 SSoT·락·자동 정리 흐름이 깨질 수 있음.
|
|
17
17
|
|
|
18
18
|
---
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
| 브랜치 | 용도 |
|
|
23
23
|
|--------|------|
|
|
24
24
|
| `main` | 프로덕션 |
|
|
25
|
-
| `dev` | 통합 개발 (메인
|
|
25
|
+
| `dev` | 통합 개발 — 개인 기본 부모 브랜치 (메인 워크트리는 *현재 부모 브랜치* 고정, dev는 그 기본값) |
|
|
26
26
|
| `{타입}/{개발자}_TASK-NNN_{출처}_{슬러그}` | 태스크 작업 브랜치 (멀티세션 시스템 단일 식별자) |
|
|
27
27
|
|
|
28
28
|
### 브랜치 타입
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
| 출처 | 의미 | 채번 주체 |
|
|
52
52
|
|------|------|---------|
|
|
53
53
|
| `BL-NNN` | 백로그 항목 | `/add-backlog` 스킬 (0.1.2). plan(기능 그룹)별 `.project/tasks/<NNN_slug>/BACKLOG.md`에 누적 |
|
|
54
|
-
| `
|
|
54
|
+
| `ST-N` | 로드맵 Stage | 별도 채번 없음 — ROADMAP의 Stage 번호 그대로 (`ST-2` = Stage 2). Stage 하나에서 복수 task 정상(동일 출처 중복 게이트 미적용). 구형 `RM-NNN`은 호환 수용만 |
|
|
55
55
|
| `DR` | 직접 요구사항 (별도 ID 없음) | 사용자 발화 → `/task-init` |
|
|
56
56
|
|
|
57
57
|
### 브랜치 예시
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
```
|
|
60
60
|
feature/claude_TASK-007_BL-003_login-feature
|
|
61
61
|
bug/angar2_TASK-012_DR_mobile-form-refresh
|
|
62
|
-
refactor/claude_TASK-
|
|
62
|
+
refactor/claude_TASK-018_ST-2_api-cleanup
|
|
63
63
|
docs/claude_TASK-021_DR_readme-rewrite
|
|
64
64
|
```
|
|
65
65
|
|
|
@@ -112,10 +112,19 @@ feat: [TASK-001] Phase 1 - 사용자 인증 로직 구현
|
|
|
112
112
|
1. Phase별 기능 커밋 (각 Phase마다 1개)
|
|
113
113
|
2. 태스크 문서 커밋
|
|
114
114
|
3. CHANGELOG 커밋
|
|
115
|
-
4.
|
|
115
|
+
4. 부모 브랜치 병합 (--no-ff, 머지 락 직렬화)
|
|
116
116
|
5. 워크트리 자동 제거 + 작업 브랜치 자동 삭제 (멀티세션 0.1.2+ — §"작업 브랜치 삭제 정책" 면제 조항)
|
|
117
117
|
```
|
|
118
118
|
|
|
119
|
+
### Phase↔파일 매핑 규칙 (`close` 자동 커밋)
|
|
120
|
+
|
|
121
|
+
`close`가 코드 변경분을 Dev Plan Phase에 매핑해 Phase별 커밋을 자동 생성할 때 아래 규칙을 따른다 (한 파일 = 한 Phase가 성립하지 않는 정상 케이스의 blocked 반복 방지 — stash 6회·recordion 5회 마찰 반영):
|
|
122
|
+
|
|
123
|
+
- **한 파일이 여러 Phase에 걸치면 → 가장 이른 Phase 커밋에 편입** + 커밋 메시지에 `(Phase a·b 변경 포함)` 표기. 뒤 Phase가 앞 Phase의 타입·함수를 참조하므로 이른 쪽이 의존 방향과 일치한다.
|
|
124
|
+
- **Dev Plan에 없는 빌드 산출물**(`*.pbxproj` / `package-lock.json` 등 잠금파일 계열) **→ 마지막 Phase 커밋에 자동 편입** + `(빌드 산출물 자동 편입)` 표기. 산출물은 소스에 딸려 바뀌는 파생물이라 Phase 소속을 물을 대상이 아니다.
|
|
125
|
+
- **Dev Plan에 없는 일반 파일 → 자동 편입 없이 중단(blocked)** — 계획에 없던 작업일 수 있어 사람 판단으로 남긴다.
|
|
126
|
+
- **중간 커밋의 독립 빌드 가능성은 보장 대상이 아니다** — 다중 Phase 편입 시 어느 배치로도 중간 커밋 빌드는 성립하지 않을 수 있다(최종 트리 정상이면 충분). 이를 이유로 매핑을 수동 재배치하지 않는다.
|
|
127
|
+
|
|
119
128
|
### 태스크 문서 커밋 메시지
|
|
120
129
|
|
|
121
130
|
```
|
|
@@ -132,10 +141,10 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
|
|
|
132
141
|
|
|
133
142
|
- 머지 커밋 메시지는 git 기본 메시지 사용
|
|
134
143
|
- `-m` 옵션으로 커밋 메시지 지정 금지
|
|
135
|
-
- **`--no-ff` 강제 (일반 타입)**: feature/bug/improvement/refactor 등 일반 작업 브랜치 →
|
|
136
|
-
- **추적 변경 0 → 마커 빈커밋 (`--allow-empty` 금지의 유일 예외)**: 코드 변경 0 + `.project` gitignore로 작업 브랜치가
|
|
144
|
+
- **`--no-ff` 강제 (일반 타입)**: feature/bug/improvement/refactor 등 일반 작업 브랜치 → 부모 병합 시 `git merge --no-ff {브랜치명}` 사용. fast-forward 병합 절대 금지. 머지 커밋이 없으면 작업 브랜치 삭제 후 분기 정보 영구 손실(90일 reflog GC 후 추적 불가).
|
|
145
|
+
- **추적 변경 0 → 마커 빈커밋 (`--allow-empty` 금지의 유일 예외)**: 코드 변경 0 + `.project` gitignore로 작업 브랜치가 부모보다 앞선 커밋이 0개이면 `--no-ff`도 *Already up to date*가 되어 머지 커밋이 생성되지 않는다. 이 경우 `/task-close`가 추적 마커 빈커밋 1개(`--allow-empty`)를 생성해 분기·채번 정보를 보존한다 (상세: task-close Step 6-8). 그 외 빈커밋은 금지.
|
|
137
146
|
- **plan/roadmap 임시 docs 브랜치 예외**: plan-init 단계의 단일 커밋(plan 신규 생성 — PLAN/ROADMAP + 제품 관통 문서 delta)에 한정 `--ff-only` 가능.
|
|
138
|
-
- **task 진행 중 ROADMAP/플랜 문서 갱신은 별도 `docs/*` 브랜치 분리 절대 금지**: 해당 task의 작업 브랜치 (`feature/*` / `improve/*` 등) 안에서 수정 + 다른 구현 커밋과 함께 `--no-ff` 머지로
|
|
147
|
+
- **task 진행 중 ROADMAP/플랜 문서 갱신은 별도 `docs/*` 브랜치 분리 절대 금지**: 해당 task의 작업 브랜치 (`feature/*` / `improve/*` 등) 안에서 수정 + 다른 구현 커밋과 함께 `--no-ff` 머지로 부모 병합 (분기 정보 손실 방지).
|
|
139
148
|
|
|
140
149
|
---
|
|
141
150
|
|
|
@@ -144,7 +153,7 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
|
|
|
144
153
|
### 기본 (멀티세션 외 / 케이스 2 / 사용자 수동 작업)
|
|
145
154
|
|
|
146
155
|
작업 브랜치(feature/* / bug/* / improve/* / refactor/* / docs/* / chore/*)는 다음 조건 모두 만족 시에만 삭제한다:
|
|
147
|
-
1.
|
|
156
|
+
1. 부모 브랜치에 `--no-ff` 병합 완료 (머지 커밋이 부모에 기록됨)
|
|
148
157
|
2. 사용자 명시 승인 ("브랜치 삭제해" 등 직접 요청)
|
|
149
158
|
|
|
150
159
|
**메인 세션 룰**: 사용자 승인 없는 작업 브랜치 삭제 지시 절대 금지. 머지 후 자동 삭제 X. 사용자가 직접 요청 시에만 `git branch -d {브랜치명}` 실행. (단, plan/roadmap 임시 docs 브랜치는 단일 커밋 ff-only 머지 후 자동 삭제 가능.)
|
|
@@ -156,7 +165,7 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
|
|
|
156
165
|
| 동작 | 명령 | 면제 사유 |
|
|
157
166
|
|------|------|----------|
|
|
158
167
|
| 워크트리 제거 | `git -C "$MAIN_WT" worktree remove "$WT_PATH"` | task 완료 후 격리 폴더 정리 필요. 사전 안전 검증 (§"멀티세션 워크트리 정책" 참조) 후 진행 |
|
|
159
|
-
| 작업 브랜치 삭제 | `git -C "$MAIN_WT" branch -d "$BRANCH"` |
|
|
168
|
+
| 작업 브랜치 삭제 | `git -C "$MAIN_WT" branch -d "$BRANCH"` | 부모 `--no-ff` 머지 완료 후 안전 삭제 (-D 강제 X). 머지 커밋이 부모에 박혀 분기 정보 보존 |
|
|
160
169
|
|
|
161
170
|
#### 보존 키워드 (양쪽 다 보존)
|
|
162
171
|
|
|
@@ -172,7 +181,7 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
|
|
|
172
181
|
사용자 선택:
|
|
173
182
|
- 보존 → 워크트리 + 브랜치 모두 보존 (Step 12, 13 건너뜀)
|
|
174
183
|
- 삭제 → 정상 자동 흐름 (Step 12, 13 진행)
|
|
175
|
-
- 취소 → close 중단 (단,
|
|
184
|
+
- 취소 → close 중단 (단, 부모 브랜치 머지는 이미 완료된 상태)
|
|
176
185
|
|
|
177
186
|
#### 안전망 출력 (브랜치 삭제 직후)
|
|
178
187
|
|
|
@@ -189,11 +198,11 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
|
|
|
189
198
|
|
|
190
199
|
## 멀티세션 워크트리 정책 (0.1.2+)
|
|
191
200
|
|
|
192
|
-
### 메인 워크트리 =
|
|
201
|
+
### 메인 워크트리 = 부모 브랜치 고정
|
|
193
202
|
|
|
194
|
-
- 메인 워크트리는
|
|
203
|
+
- 메인 워크트리는 `/task-init` 시점에 서 있던 브랜치(= 그 task의 *부모 브랜치*)를 유지. 개인 기본 `dev`, 회사/로드맵 `dev_feat_x`/`master` 등 — taskery는 현재 브랜치를 부모로 삼는다(이름 고정 X).
|
|
195
204
|
- 모든 태스크 작업은 *예외 없이* 별도 워크트리에서 수행
|
|
196
|
-
-
|
|
205
|
+
- **진행 중 태스크가 있는 동안 메인 워크트리 HEAD를 옮기는 어떤 명령도 영구 금지**: `git checkout <task-branch>` / `git switch <task-branch>` / `git reset` HEAD 이동 / `git rebase` HEAD 이동 등. close가 부모로 되병합해야 하므로 부모에 서 있어야 한다. *"잠깐만 메인에서"* / *"테스트 한 번만"* 같은 예외 발화도 거부 (별도 워크트리로 처리). (부모 브랜치 자체 전환은 진행 중 태스크가 없을 때만.)
|
|
197
206
|
- **모호 발화 자의 해석 금지**: *"워크트리 없이"* / *"메인에서"* / *"이 자리에서"* 류 발화 = 본 규칙 충돌 신호 → 즉시 정지 + 규칙 명시 + 1줄 confirm 요청 (자의 해석 후 진행 영구 금지). 사용자 의도가 *오타/모호*일 가능성은 *워크트리 사용*으로 읽는 게 자연스러움
|
|
198
207
|
- `/task-init` / `/task-close` 시작 시 검증 (위배 시 사용자 호출 + 중단)
|
|
199
208
|
|
|
@@ -235,12 +244,12 @@ git ≥ 2.31 필요 (`--path-format=absolute` 옵션).
|
|
|
235
244
|
### SSoT 조회 (진행중 태스크)
|
|
236
245
|
|
|
237
246
|
```sh
|
|
238
|
-
git -C "$MAIN_WT" branch --
|
|
247
|
+
git -C "$MAIN_WT" branch --list \
|
|
239
248
|
'feature/*_TASK-*' 'bug/*_TASK-*' 'improve/*_TASK-*' \
|
|
240
249
|
'refactor/*_TASK-*' 'docs/*_TASK-*' 'chore/*_TASK-*'
|
|
241
250
|
```
|
|
242
251
|
|
|
243
|
-
`_TASK-*` 패턴 강제로 케이스 2(TASK 없는 브랜치) 자동 제외. 별도 상태 파일/락 운영 X — git 분산 락(동일 브랜치명 자동 거부) + 결정적 슬러그(백로그/로드맵 항목 제목 → kebab-case)가 race 차단 2층 안전망.
|
|
252
|
+
`_TASK-*` 패턴 강제로 케이스 2(TASK 없는 브랜치) 자동 제외. (부모 기준 `--no-merged` 미사용 — 분기 직후 브랜치는 부모와 동일 commit이라 완전 머지로 오판돼 채번이 충돌하기 때문. 브랜치 존재 자체가 SSoT. `bin/lib.js` `getActiveTasks` 참조.) 별도 상태 파일/락 운영 X — git 분산 락(동일 브랜치명 자동 거부) + 결정적 슬러그(백로그/로드맵 항목 제목 → kebab-case)가 race 차단 2층 안전망.
|
|
244
253
|
|
|
245
254
|
### 머지 직렬화 (head-to-head race 차단)
|
|
246
255
|
|
|
@@ -253,10 +262,12 @@ git -C "$MAIN_WT" branch --no-merged dev --list \
|
|
|
253
262
|
|
|
254
263
|
여러 세션이 병렬로 검수용 dev 서버·터널을 띄울 때 포트·프로세스가 충돌하지 않도록 task별로 자원을 독립 소유한다. CLI·라이브러리 등 검수 서버가 없는 프로젝트는 무관.
|
|
255
264
|
|
|
256
|
-
- **포트 격리 (결정적)**:
|
|
265
|
+
- **포트 격리 (결정적)**: 메인 세션(부모 브랜치) = 기준 포트, task 워크트리 = 기준 포트 + TASK번호. 기준 포트는 프로젝트가 `CLAUDE.md`(코덱스는 `AGENTS.md`) `## 검수 실행 명령`에 선언한다 (멀티 프로젝트 동시 운영 시 프로젝트마다 다른 기준 포트). TASK번호는 1부터라 offset 0(기준 포트)이 메인 몫으로 항상 비어 충돌하지 않는다.
|
|
257
266
|
- **터널 (필수 아님)**: 모바일 검수 등 필요한 task만, 자기 포트를 가리키는 별도 프로세스로 판다 → task별 독립 URL.
|
|
258
267
|
- **자기 것만 정리**: `/task-close` 시 본 task가 띄운 서버·터널(자기 포트 것)만 종료한다. **`pkill -f` 같은 광역 종료 금지** — 다른 세션의 서버까지 죽이는 원인.
|
|
259
268
|
- **검수 기동 (자동)**: 사용자가 결과를 *눈으로 검수*하는 시점에 위 포트로 서버를 백그라운드 기동하고 접속 URL을 보고한다 (사용자가 매번 실행을 지시하지 않게). 정확한 발동 지점은 각 스킬 참조 — `/task-dev`는 세션이 거기서 끝날 때(Step 9), `/task-test`는 UNCERTAIN 검수 직전(Step 5)·PASS 후 종료 시(Step 7). FAIL→수정 흐름에서는 기동하지 않는다. 단계가 *기능상* 서버를 요구하면(E2E 등) 검수 시점과 무관하게 띄운다.
|
|
269
|
+
- **중복 기동 방지**: 새로 띄우기 전에 해당 포트·프로세스가 이미 살아 있는지 확인한다. `Port … is in use` 류 경고는 *이미 떠 있다*는 신호이므로 무시하고 재기동하지 않는다. 종료 시에는 부모 프로세스만이 아니라 자식 프로세스(브라우저·렌더러 창 등)까지 확인해 정리한다.
|
|
270
|
+
- **화면·입력 점유 회피**: 실제 앱을 띄워 UI를 자동 조작하는 테스트 스위트는 사용자의 화면·마우스·키보드를 점유해 작업을 중단시킨다. 자동 게이트·격리 세션은 `.project/TEST-GUIDE.md` *테스트 실행 환경* 절에 선언된 격리 실행 경로(창 숨김·헤드리스 / 컨테이너 / VM / CI)로만 자동 실행하고, 선언이 없으면 비점유 부분만 실행하거나 사용자 승인을 받는다.
|
|
260
271
|
- **효과 (정직)**: 포트 충돌은 결정적으로 제거된다. 다른 세션의 종료·턴 경계 프로세스 소실은 위 규율·백그라운드 실행으로 완화되나 문서 규율이라 강제는 아니다(best-effort).
|
|
261
272
|
|
|
262
273
|
---
|
|
@@ -282,7 +293,7 @@ git -C "$MAIN_WT" branch --no-merged dev --list \
|
|
|
282
293
|
- 민감 정보 커밋 금지 (`.env`, API KEY, Secret Key 등)
|
|
283
294
|
- 여러 태스크를 하나의 브랜치에서 작업 금지
|
|
284
295
|
- 커밋 순서 임의 변경 금지
|
|
285
|
-
- 승인 없이
|
|
296
|
+
- 승인 없이 부모 브랜치 병합 금지
|
|
286
297
|
- **destructive 명령 사용자 승인 필수**: 다음 명령은 사용자 명시 승인 없이 절대 실행 금지:
|
|
287
298
|
- `git reset --hard ...`
|
|
288
299
|
- `git push --force ...`
|
|
@@ -307,3 +318,5 @@ git -C "$MAIN_WT" branch --no-merged dev --list \
|
|
|
307
318
|
| 2026-06-28 | 워크트리 생성 메커니즘 갱신 — `git worktree add` 직접 실행 → `npx @angar2/taskery fork`(init 락 안에서 채번+분기 원자 실행). 병렬 task-init 번호 충돌(레이스) 차단 |
|
|
308
319
|
| 2026-06-25 | §멀티세션 워크트리 정책에 "워크트리 실행 환경" 추가 — 워크트리에 의존성 심링크 금지(개발 서버 fs 접근 제한으로 로딩 실패), 실행·검수 task는 워크트리 안에 의존성 실제 마련. FRICTION 검토 F6 반영 |
|
|
309
320
|
| 2026-06-25 | §멀티세션 워크트리 정책에 "멀티세션 검수 환경" 추가 — task별 dev 서버 포트 격리(메인=기준 포트, task=기준+TASK번호) + 터널 독립 + close 시 자기 것만 종료(광역 종료 금지) + 사용자 검수 시점 서버 자동 기동(task-test UNCERTAIN/PASS·task-dev 종료, FAIL 제외). FRICTION 검토 F7 반영 |
|
|
321
|
+
| 2026-08-08 | 출처 표기 개편 — `RM-NNN`(로드맵 항목 채번, 미구현) → `ST-N`(ROADMAP Stage 번호 그대로, 채번 불요·동일 출처 중복 게이트 미적용). 구형 RM-NNN은 호환 수용만. + §커밋 순서에 "Phase↔파일 매핑 규칙" 신설 — 다중 Phase 파일=이른 Phase 편입+표기 / 빌드 산출물=마지막 Phase 자동 편입 / 일반 미매핑만 blocked / 중간 커밋 독립 빌드 비보장 명문화. stash·recordion FRICTION_LOG 반영 |
|
|
322
|
+
| 2026-08-08 | §멀티세션 검수 환경에 "중복 기동 방지"·"화면·입력 점유 회피" 2항 추가 — 검수 앱 중복 기동(부모만 종료해 창 잔존) 및 UI 자동조작 스위트의 화면·입력 강탈 마찰 반영. stash·recordion FRICTION_LOG |
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
|
|
8
8
|
## 1. 양식 Spec
|
|
9
9
|
|
|
10
|
-
### 1.1 헤더 표 —
|
|
10
|
+
### 1.1 헤더 표 — 6컬럼
|
|
11
11
|
|
|
12
|
-
| 생성일 | 플랜 | 유형 | 규모 | 상태 |
|
|
13
|
-
|
|
14
|
-
| 2026-05-08 | 001_mvp | feature | medium | developing |
|
|
12
|
+
| 생성일 | 플랜 | 유형 | 규모 | 부모 브랜치 | 상태 |
|
|
13
|
+
|--------|------|------|------|-------------|------|
|
|
14
|
+
| 2026-05-08 | 001_mvp | feature | medium | dev | developing |
|
|
15
15
|
|
|
16
16
|
- **생성일**: ISO 형식 (YYYY-MM-DD)
|
|
17
17
|
- **플랜**: 어느 plan(기능 그룹) 하위인지 (예: 001_mvp, 002_compare-products) — `tasks/<NNN_slug>/` 디렉토리 명과 일치
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
- `small` — 구현 파트 2-3개 (단순 기능)
|
|
22
22
|
- `medium` — 구현 파트 4-7개 (일반 기능 또는 새 모듈)
|
|
23
23
|
- `large` — 구현 파트 8개 이상 (또는 분리 검토 권장)
|
|
24
|
-
-
|
|
24
|
+
- **부모 브랜치**: 이 task를 분기한 기점 브랜치 = `/task-init` 시점의 메인 워크트리 현재 브랜치 (`dev` / `dev_feat_x` / `master` 등). `/task-close`가 이 브랜치로 되병합한다. `/task-init`이 자동 기록 — 수기 입력 아님. (0.6.0 이전 문서는 이 칸이 없으며, close 시 `dev`로 폴백.)
|
|
25
|
+
- **상태**: 7상태 머신 (1.2 참조) — 표의 *마지막* 컬럼(부모 브랜치가 그 앞)
|
|
25
26
|
|
|
26
27
|
### 1.2 상태 set — 7상태 (-ing/-ed 페어 일관성)
|
|
27
28
|
|
|
@@ -53,9 +54,9 @@ draft → planned → developing → developed → testing → tested → closed
|
|
|
53
54
|
```markdown
|
|
54
55
|
# TASK-NNN — <태스크 이름>
|
|
55
56
|
|
|
56
|
-
| 생성일 | 플랜 | 유형 | 규모 | 상태 |
|
|
57
|
-
|
|
58
|
-
| ... | ... | ... | ... | ... |
|
|
57
|
+
| 생성일 | 플랜 | 유형 | 규모 | 부모 브랜치 | 상태 |
|
|
58
|
+
|--------|------|------|------|-------------|------|
|
|
59
|
+
| ... | ... | ... | ... | ... | ... |
|
|
59
60
|
|
|
60
61
|
## Requirements
|
|
61
62
|
<요구사항 + 메인이 증폭/구체화한 내용>
|
|
@@ -121,11 +122,12 @@ draft → planned → developing → developed → testing → tested → closed
|
|
|
121
122
|
2. kebab-slug = 태스크 이름 한국어 → 영어 kebab-case (예: "로그인 기능 추가" → `login-feature`)
|
|
122
123
|
3. 파일명 = `NNN_kebab-slug.md` (예: `003_login-feature.md`). *사용자 명시 시* 폴더 승격 (`TASK-003_login-feature/task.md`) — 규모 large여도 자동 승격 X.
|
|
123
124
|
4. 파일 제목 작성: `# TASK-003 — 로그인 기능 추가`
|
|
124
|
-
5. 헤더 표 작성 (
|
|
125
|
+
5. 헤더 표 작성 (6컬럼 모두 채움):
|
|
125
126
|
- 생성일: 오늘 (YYYY-MM-DD)
|
|
126
127
|
- 플랜: 현재 active plan (예: 001_mvp — `NNN_slug` 폴더명)
|
|
127
128
|
- 유형: 사용자/메인 합의 (feature/bug/...)
|
|
128
129
|
- 규모: 사용자/메인 합의 (micro/small/medium/large)
|
|
130
|
+
- 부모 브랜치: `/task-init`(fork) 시점의 현재 브랜치 — 코드가 자동 기록(수기 X)
|
|
129
131
|
- 상태: `draft` (고정)
|
|
130
132
|
6. 6 섹션 placeholder 작성 (Requirements / Scope / Dev Plan / Test Plan / Result는 빈 헤딩만).
|
|
131
133
|
|
|
@@ -263,7 +265,7 @@ Test Plan 작성 완료 후 *반드시* 점검. *"누적/리셋 안 함"* 같은
|
|
|
263
265
|
### 3.1 일관성
|
|
264
266
|
|
|
265
267
|
- 양식 그대로 채워. 섹션 추가/삭제 금지.
|
|
266
|
-
- 헤더
|
|
268
|
+
- 헤더 6컬럼 모두 채움 — *"미정"* 같은 placeholder 금지 (의사결정 위임 X). 부모 브랜치는 코드 자동 기록.
|
|
267
269
|
- 상태 7개 외 단어 사용 금지.
|
|
268
270
|
|
|
269
271
|
### 3.2 자기완결성
|
package/template/AGENTS.md
CHANGED
|
@@ -29,26 +29,26 @@
|
|
|
29
29
|
1. **범위 준수** — 사용자가 명시한 범위/행동만 수행. 명시 외 자체 진입 영구 금지. 예: 사용자가 *"X부터 Y까지"* 지시 → Y 끝에서 정지 + 상태 보고 + 다음 단계 명시 호출 대기.
|
|
30
30
|
2. **Skill 정식 발동** — task 단계는 반드시 해당 스킬(`.agents/skills/<스킬>/SKILL.md`)을 정식 호출. 가이드 본문을 머릿속 절차로 대체 금지 (컴팩트 세션 / 시스템 리마인더 인지 상태에서도 동일).
|
|
31
31
|
3. **워크트리 자가 진단** — 세션 시작 시 현재 cwd가 *메인 워크트리*인지 *태스크 워크트리*인지 자가 판단 (`git rev-parse --show-toplevel` + `~/.taskery/worktrees/` 경로 비교). 태스크 워크트리면 *해당 진행중 태스크 컨텍스트*로 진입, 메인 워크트리면 *새 태스크 / 진행중 목록 인터뷰* 흐름.
|
|
32
|
-
4. **모호 발화 자의 해석 금지** — *"워크트리 없이"* / *"메인에서"* / *"이 자리에서 그냥"* 류로 읽히는 발화 = 코어 규칙(메인 워크트리 =
|
|
32
|
+
4. **모호 발화 자의 해석 금지** — *"워크트리 없이"* / *"메인에서"* / *"이 자리에서 그냥"* 류로 읽히는 발화 = 코어 규칙(메인 워크트리 = 부모 브랜치 고정, task는 워크트리에서) 충돌 신호. 즉시 정지 + 규칙 한 줄 명시 + 1줄 confirm 요청. 자의 해석 후 진행 영구 금지. 사용자 의도가 *오타/모호*일 가능성을 *워크트리 사용*으로 읽는 게 자연스러움.
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
36
36
|
## 멀티세션 워크트리 (0.1.2+)
|
|
37
37
|
|
|
38
|
-
> 멀티세션 = 같은 프로젝트에서 *여러 메인 세션이 독립 태스크를 병렬*로 진행. git worktree로 작업 폴더 격리,
|
|
38
|
+
> 멀티세션 = 같은 프로젝트에서 *여러 메인 세션이 독립 태스크를 병렬*로 진행. git worktree로 작업 폴더 격리, 부모 브랜치 머지 시 직렬화.
|
|
39
39
|
|
|
40
|
-
- **메인 워크트리 =
|
|
40
|
+
- **메인 워크트리 = 부모 브랜치 고정**: 메인 워크트리는 `/task-init` 시점에 체크아웃돼 있는 브랜치(= 그 task의 *부모 브랜치*)를 유지한다. 개인 기본은 `dev`, 회사/로드맵은 `dev_feat_x` / `master` 등 — taskery는 *현재 서 있는 브랜치*를 부모로 삼는다(특정 이름 고정 X). 모든 태스크 작업은 *예외 없이* 별도 워크트리에서 수행. 진행 중 태스크가 있는 동안 메인 워크트리 HEAD를 옮기는 어떤 작업(`git checkout <task-branch>` / `git switch` / `git reset` HEAD 이동 / `git rebase` HEAD 이동 등)도 영구 금지 — close가 부모로 되병합해야 하므로 부모에 서 있어야 한다. *"잠깐만 메인에서"* / *"테스트 한 번만 메인에서"* 같은 예외 발화도 거부 — 별도 워크트리에서 처리. (부모 브랜치 자체를 바꾸려면 진행 중 태스크가 없을 때 원하는 브랜치로 체크아웃 후 새 task 시작.)
|
|
41
41
|
- **워크트리 위치**: `~/.taskery/worktrees/<projectId>/TASK-NNN_<출처>_<슬러그>/`
|
|
42
42
|
- `<projectId>`: `.taskery-manifest.json` `projectId` (8자 hex)
|
|
43
|
-
- `<출처>`: `BL-NNN` / `
|
|
44
|
-
- **`/task-init`이 워크트리 생성** + **`/task-close`가
|
|
43
|
+
- `<출처>`: `BL-NNN`(백로그) / `ST-N`(로드맵 Stage) / `DR`(직접 요구사항)
|
|
44
|
+
- **`/task-init`이 부모 브랜치에서 워크트리 생성** + **`/task-close`가 부모 브랜치 머지 + 워크트리 자동 제거** (자동 흐름. 보존 키워드 `keep` / `브랜치 남겨` 등 발화 시 둘 다 보존).
|
|
45
45
|
- **메인 메타 접근**: 워크트리에서 `.project/`, `AGENTS.md` 등 접근 시 *메인 워크트리 절대 경로* 사용:
|
|
46
46
|
```sh
|
|
47
47
|
MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
48
48
|
```
|
|
49
49
|
- **수동 git 작업 시 정합성 보장 X** — taskery 명령(스킬 / `npx @angar2/taskery <서브>`)으로만 운영.
|
|
50
50
|
- **CLI 보조 명령**:
|
|
51
|
-
- `npx @angar2/taskery status` — 진행중 태스크 + 워크트리 +
|
|
51
|
+
- `npx @angar2/taskery status` — 진행중 태스크 + 워크트리 + 부모 머지 상태 요약
|
|
52
52
|
- `npx @angar2/taskery prune` — stale 워크트리 대화형 정리
|
|
53
53
|
|
|
54
54
|
상세: `.project/rules/GIT_RULE.md` "멀티세션 워크트리 정책" 섹션.
|
|
@@ -72,11 +72,11 @@
|
|
|
72
72
|
|
|
73
73
|
- **`/add-backlog`**: 사용자 *"~ 백로그에 추가"* 발화 → 얕은 분석(코드 탐색 X, 추정 수준) → BL-NNN 채번 → BACKLOG.md append (`[ ]` 대기).
|
|
74
74
|
- **`/task-init` 연동**: 사용자 *"백로그의 BL-NNN 진행"* 발화 → 해당 항목 *확인 마킹*. `[ ]` → `[x]` + `- TASK: TASK-NNN` 추가 (다회 진행 시 콤마).
|
|
75
|
-
- **체크박스 의미**: `[ ]` = 미확인 (task로 옮기지 않은 메모) / `[x]` = 확인 완료 (task로 옮김). `[x]`는 *task로 옮겼다*는 메모일 뿐,
|
|
76
|
-
- **`[x]` 항목이 실제로 완료된 작업인지 굳이 확인하려 들지 않는다.** 진행·완료 상태는 백로그가 아니라 `taskery status`(살아있는 브랜치) +
|
|
75
|
+
- **체크박스 의미**: `[ ]` = 미확인 (task로 옮기지 않은 메모) / `[x]` = 확인 완료 (task로 옮김). `[x]`는 *task로 옮겼다*는 메모일 뿐, 부모 머지·완료 여부와는 무관하다.
|
|
76
|
+
- **`[x]` 항목이 실제로 완료된 작업인지 굳이 확인하려 들지 않는다.** 진행·완료 상태는 백로그가 아니라 `taskery status`(살아있는 브랜치) + 부모 머지커밋이 판단한다.
|
|
77
77
|
- **머지 여부를 직접 알아야 할 경우에만** 아래 순서로 작업 완료 여부를 확인한다:
|
|
78
|
-
1. `taskery status` 진행중 목록에 그 TASK가 **있으면** → 아직 진행 중(
|
|
79
|
-
2. 목록에 **없으면** → `git log
|
|
78
|
+
1. `taskery status` 진행중 목록에 그 TASK가 **있으면** → 아직 진행 중(부모 미머지)이므로 `git log --all --grep`이 비는 것이 정상이다. 재조회하지 않는다.
|
|
79
|
+
2. 목록에 **없으면** → `git log --all --grep 'BL-NNN'` + 브랜치명으로 작업 완료 여부를 확인한다.
|
|
80
80
|
- **글로벌 `.project/BACKLOG.md`** (다음 기능 그룹 후보 카탈로그) 는 본 흐름 무관 — `/plan-init` 영역.
|
|
81
81
|
|
|
82
82
|
상세: `.agents/skills/add-backlog/SKILL.md`.
|
|
@@ -116,11 +116,11 @@
|
|
|
116
116
|
## 검수 실행 명령 (해당 시 — 앱 실행·검수가 필요한 프로젝트)
|
|
117
117
|
|
|
118
118
|
> `/task-dev`·`/task-test`가 검수 시점(세션 중단점)에 이 명령으로 서버를 *백그라운드* 기동하고 접속 URL을 보고한다.
|
|
119
|
-
> 멀티세션 포트 격리:
|
|
119
|
+
> 멀티세션 포트 격리: 메인 세션(부모 브랜치) = 기준 포트, task 워크트리 = 기준 포트 + TASK번호. 상세는 GIT_RULE "멀티세션 검수 환경" 섹션.
|
|
120
120
|
> CLI/라이브러리 등 검수 서버가 없는 프로젝트는 본 섹션 전체 삭제.
|
|
121
121
|
|
|
122
122
|
- 기준 포트: `<예: 5100>`
|
|
123
|
-
- 실행 명령: `<예: npm run dev -- --port <PORT>>` (`<PORT>` = 기준 포트 + TASK번호,
|
|
123
|
+
- 실행 명령: `<예: npm run dev -- --port <PORT>>` (`<PORT>` = 기준 포트 + TASK번호, 메인은 기준 포트)
|
|
124
124
|
- 터널 (모바일 검수 등 필요 시 — 선택): `<예: cloudflared tunnel --url http://localhost:<PORT>>`
|
|
125
125
|
|
|
126
126
|
---
|
|
@@ -129,10 +129,12 @@
|
|
|
129
129
|
|
|
130
130
|
| 룰 | 위치 | 역할 |
|
|
131
131
|
|----|------|------|
|
|
132
|
-
| TASK_DOC_RULE | `.project/rules/TASK_DOC_RULE.md` | task 문서 양식 (헤더
|
|
132
|
+
| TASK_DOC_RULE | `.project/rules/TASK_DOC_RULE.md` | task 문서 양식 (헤더 6컬럼 / 6 섹션 / 7 상태) |
|
|
133
133
|
| GIT_RULE | `.project/rules/GIT_RULE.md` (있으면) → 글로벌 `~/.claude/rules/GIT_RULE.md` (fallback) | git 정책 (브랜치 / 커밋 / 머지) |
|
|
134
134
|
| CHANGELOG_RULE | `.project/rules/CHANGELOG_RULE.md` | CHANGELOG 작성 정책 (위치 / 형식 / 필수 필드) |
|
|
135
135
|
| MOCKUP_RULE | `.project/rules/MOCKUP_RULE.md` | UX/UI task의 HTML 목업 위치 / 형식 / 네이밍 |
|
|
136
|
+
| DEV_RULE (옵션) | `.project/rules/DEV_RULE.local.md` | 이 프로젝트 고유의 구현·테스트 실행 정책. 있으면 `/task-dev`가 읽고 겹치는 조항은 로컬 우선 (코어 파일 없음 — 로컬 전용) |
|
|
137
|
+
| TEST_RULE (옵션) | `.project/rules/TEST_RULE.local.md` | 이 프로젝트 고유의 검증 범위·방식 정책. 있으면 `/task-dev`·`/task-test`·`/task-plan`이 읽고 겹치는 조항은 로컬 우선 (격리 세션에도 전달. 코어 파일 없음 — 로컬 전용) |
|
|
136
138
|
| `*.local.md` | `.project/rules/` | (옵션) 사용자 오버라이드 — `*.local.md` suffix는 npx 미터치 |
|
|
137
139
|
|
|
138
140
|
---
|
|
@@ -147,7 +149,7 @@
|
|
|
147
149
|
| `/task-plan` | task | Requirements/Scope/Dev Plan/Test Plan 작성 (draft → planned) |
|
|
148
150
|
| `/task-dev` | task | Phase 순서 구현 + self-check (planned → developed) |
|
|
149
151
|
| `/task-test` | task | task-tester 서브에이전트 격리 검증 (developed → tested) |
|
|
150
|
-
| `/task-close` | task | 검증 명령 게이트 + 커밋 +
|
|
152
|
+
| `/task-close` | task | 검증 명령 게이트 + 커밋 + 부모 브랜치 병합 (tested → closed) |
|
|
151
153
|
| `/add-backlog` | meta | 사용자 발화로 활성 plan BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
|
|
152
154
|
| `/log-friction` | meta | FRICTION_LOG.md에 사용자 불편 한 행 기록 |
|
|
153
155
|
|
package/template/CLAUDE.md
CHANGED
|
@@ -24,26 +24,26 @@
|
|
|
24
24
|
1. **범위 준수** — 사용자가 명시한 범위/행동만 수행. 명시 외 자체 진입 영구 금지. 예: 사용자가 *"X부터 Y까지"* 지시 → Y 끝에서 정지 + 상태 보고 + 다음 단계 명시 호출 대기.
|
|
25
25
|
2. **Skill 정식 발동** — task 단계는 반드시 Skill 도구로 정식 호출. 가이드 본문을 머릿속 절차로 대체 금지 (컴팩트 세션 / 시스템 리마인더 인지 상태에서도 동일).
|
|
26
26
|
3. **워크트리 자가 진단** — 세션 시작 시 현재 cwd가 *메인 워크트리*인지 *태스크 워크트리*인지 자가 판단 (`git rev-parse --show-toplevel` + `~/.taskery/worktrees/` 경로 비교). 태스크 워크트리면 *해당 진행중 태스크 컨텍스트*로 진입, 메인 워크트리면 *새 태스크 / 진행중 목록 인터뷰* 흐름.
|
|
27
|
-
4. **모호 발화 자의 해석 금지** — *"워크트리 없이"* / *"메인에서"* / *"이 자리에서 그냥"* 류로 읽히는 발화 = 코어 규칙(메인 워크트리 =
|
|
27
|
+
4. **모호 발화 자의 해석 금지** — *"워크트리 없이"* / *"메인에서"* / *"이 자리에서 그냥"* 류로 읽히는 발화 = 코어 규칙(메인 워크트리 = 부모 브랜치 고정, task는 워크트리에서) 충돌 신호. 즉시 정지 + 규칙 한 줄 명시 + 1줄 confirm 요청. 자의 해석 후 진행 영구 금지. 사용자 의도가 *오타/모호*일 가능성을 *워크트리 사용*으로 읽는 게 자연스러움.
|
|
28
28
|
|
|
29
29
|
---
|
|
30
30
|
|
|
31
31
|
## 멀티세션 워크트리 (0.1.2+)
|
|
32
32
|
|
|
33
|
-
> 멀티세션 = 같은 프로젝트에서 *여러 메인 세션이 독립 태스크를 병렬*로 진행. git worktree로 작업 폴더 격리,
|
|
33
|
+
> 멀티세션 = 같은 프로젝트에서 *여러 메인 세션이 독립 태스크를 병렬*로 진행. git worktree로 작업 폴더 격리, 부모 브랜치 머지 시 직렬화.
|
|
34
34
|
|
|
35
|
-
- **메인 워크트리 =
|
|
35
|
+
- **메인 워크트리 = 부모 브랜치 고정**: 메인 워크트리는 `/task-init` 시점에 체크아웃돼 있는 브랜치(= 그 task의 *부모 브랜치*)를 유지한다. 개인 기본은 `dev`, 회사/로드맵은 `dev_feat_x` / `master` 등 — taskery는 *현재 서 있는 브랜치*를 부모로 삼는다(특정 이름 고정 X). 모든 태스크 작업은 *예외 없이* 별도 워크트리에서 수행. 진행 중 태스크가 있는 동안 메인 워크트리 HEAD를 옮기는 어떤 작업(`git checkout <task-branch>` / `git switch` / `git reset` HEAD 이동 / `git rebase` HEAD 이동 등)도 영구 금지 — close가 부모로 되병합해야 하므로 부모에 서 있어야 한다. *"잠깐만 메인에서"* / *"테스트 한 번만 메인에서"* 같은 예외 발화도 거부 — 별도 워크트리에서 처리. (부모 브랜치 자체를 바꾸려면 진행 중 태스크가 없을 때 원하는 브랜치로 체크아웃 후 새 task 시작.)
|
|
36
36
|
- **워크트리 위치**: `~/.taskery/worktrees/<projectId>/TASK-NNN_<출처>_<슬러그>/`
|
|
37
37
|
- `<projectId>`: `.taskery-manifest.json` `projectId` (8자 hex)
|
|
38
|
-
- `<출처>`: `BL-NNN` / `
|
|
39
|
-
- **`/task-init`이 워크트리 생성** + **`/task-close`가
|
|
38
|
+
- `<출처>`: `BL-NNN`(백로그) / `ST-N`(로드맵 Stage) / `DR`(직접 요구사항)
|
|
39
|
+
- **`/task-init`이 부모 브랜치에서 워크트리 생성** + **`/task-close`가 부모 브랜치 머지 + 워크트리 자동 제거** (자동 흐름. 보존 키워드 `keep` / `브랜치 남겨` 등 발화 시 둘 다 보존).
|
|
40
40
|
- **메인 메타 접근**: 워크트리에서 `.project/`, `CLAUDE.md` 등 접근 시 *메인 워크트리 절대 경로* 사용:
|
|
41
41
|
```sh
|
|
42
42
|
MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
43
43
|
```
|
|
44
44
|
- **수동 git 작업 시 정합성 보장 X** — taskery 명령(스킬 / `npx @angar2/taskery <서브>`)으로만 운영.
|
|
45
45
|
- **CLI 보조 명령**:
|
|
46
|
-
- `npx @angar2/taskery status` — 진행중 태스크 + 워크트리 +
|
|
46
|
+
- `npx @angar2/taskery status` — 진행중 태스크 + 워크트리 + 부모 머지 상태 요약
|
|
47
47
|
- `npx @angar2/taskery prune` — stale 워크트리 대화형 정리
|
|
48
48
|
|
|
49
49
|
상세: `.project/rules/GIT_RULE.md` "멀티세션 워크트리 정책" 섹션.
|
|
@@ -71,11 +71,11 @@
|
|
|
71
71
|
|
|
72
72
|
- **`/add-backlog`**: 사용자 *"~ 백로그에 추가"* 발화 → 얕은 분석(코드 탐색 X, 추정 수준) → BL-NNN 채번 → BACKLOG.md append (`[ ]` 대기).
|
|
73
73
|
- **`/task-init` 연동**: 사용자 *"백로그의 BL-NNN 진행"* 발화 → 해당 항목 *확인 마킹*. `[ ]` → `[x]` + `- TASK: TASK-NNN` 추가 (다회 진행 시 콤마).
|
|
74
|
-
- **체크박스 의미**: `[ ]` = 미확인 (task로 옮기지 않은 메모) / `[x]` = 확인 완료 (task로 옮김). `[x]`는 *task로 옮겼다*는 메모일 뿐,
|
|
75
|
-
- **`[x]` 항목이 실제로 완료된 작업인지 굳이 확인하려 들지 않는다.** 진행·완료 상태는 백로그가 아니라 `taskery status`(살아있는 브랜치) +
|
|
74
|
+
- **체크박스 의미**: `[ ]` = 미확인 (task로 옮기지 않은 메모) / `[x]` = 확인 완료 (task로 옮김). `[x]`는 *task로 옮겼다*는 메모일 뿐, 부모 머지·완료 여부와는 무관하다.
|
|
75
|
+
- **`[x]` 항목이 실제로 완료된 작업인지 굳이 확인하려 들지 않는다.** 진행·완료 상태는 백로그가 아니라 `taskery status`(살아있는 브랜치) + 부모 머지커밋이 판단한다.
|
|
76
76
|
- **머지 여부를 직접 알아야 할 경우에만** 아래 순서로 작업 완료 여부를 확인한다:
|
|
77
|
-
1. `taskery status` 진행중 목록에 그 TASK가 **있으면** → 아직 진행 중(
|
|
78
|
-
2. 목록에 **없으면** → `git log
|
|
77
|
+
1. `taskery status` 진행중 목록에 그 TASK가 **있으면** → 아직 진행 중(부모 미머지)이므로 `git log --all --grep`이 비는 것이 정상이다. 재조회하지 않는다.
|
|
78
|
+
2. 목록에 **없으면** → `git log --all --grep 'BL-NNN'` + 브랜치명으로 작업 완료 여부를 확인한다.
|
|
79
79
|
- **글로벌 `.project/BACKLOG.md`** (다음 기능 그룹 후보 카탈로그) 는 본 흐름 무관 — `/plan-init` 영역.
|
|
80
80
|
|
|
81
81
|
상세: `.claude/skills/add-backlog/SKILL.md`.
|
|
@@ -115,11 +115,11 @@
|
|
|
115
115
|
## 검수 실행 명령 (해당 시 — 앱 실행·검수가 필요한 프로젝트)
|
|
116
116
|
|
|
117
117
|
> `/task-dev`·`/task-test`가 검수 시점(세션 중단점)에 이 명령으로 서버를 *백그라운드* 기동하고 접속 URL을 보고한다.
|
|
118
|
-
> 멀티세션 포트 격리:
|
|
118
|
+
> 멀티세션 포트 격리: 메인 세션(부모 브랜치) = 기준 포트, task 워크트리 = 기준 포트 + TASK번호. 상세는 GIT_RULE "멀티세션 검수 환경" 섹션.
|
|
119
119
|
> CLI/라이브러리 등 검수 서버가 없는 프로젝트는 본 섹션 전체 삭제.
|
|
120
120
|
|
|
121
121
|
- 기준 포트: `<예: 5100>`
|
|
122
|
-
- 실행 명령: `<예: npm run dev -- --port <PORT>>` (`<PORT>` = 기준 포트 + TASK번호,
|
|
122
|
+
- 실행 명령: `<예: npm run dev -- --port <PORT>>` (`<PORT>` = 기준 포트 + TASK번호, 메인은 기준 포트)
|
|
123
123
|
- 터널 (모바일 검수 등 필요 시 — 선택): `<예: cloudflared tunnel --url http://localhost:<PORT>>`
|
|
124
124
|
|
|
125
125
|
---
|
|
@@ -128,10 +128,12 @@
|
|
|
128
128
|
|
|
129
129
|
| 룰 | 위치 | 역할 |
|
|
130
130
|
|----|------|------|
|
|
131
|
-
| TASK_DOC_RULE | `.project/rules/TASK_DOC_RULE.md` | task 문서 양식 (헤더
|
|
131
|
+
| TASK_DOC_RULE | `.project/rules/TASK_DOC_RULE.md` | task 문서 양식 (헤더 6컬럼 / 6 섹션 / 7 상태) |
|
|
132
132
|
| GIT_RULE | `.project/rules/GIT_RULE.md` (있으면) → 글로벌 `~/.claude/rules/GIT_RULE.md` (fallback) | git 정책 (브랜치 / 커밋 / 머지) |
|
|
133
133
|
| CHANGELOG_RULE | `.project/rules/CHANGELOG_RULE.md` | CHANGELOG 작성 정책 (위치 / 형식 / 필수 필드) |
|
|
134
134
|
| MOCKUP_RULE | `.project/rules/MOCKUP_RULE.md` | UX/UI task의 HTML 목업 위치 / 형식 / 네이밍 |
|
|
135
|
+
| DEV_RULE (옵션) | `.project/rules/DEV_RULE.local.md` | 이 프로젝트 고유의 구현·테스트 실행 정책. 있으면 `/task-dev`가 읽고 겹치는 조항은 로컬 우선 (코어 파일 없음 — 로컬 전용) |
|
|
136
|
+
| TEST_RULE (옵션) | `.project/rules/TEST_RULE.local.md` | 이 프로젝트 고유의 검증 범위·방식 정책. 있으면 `/task-dev`·`/task-test`·`/task-plan`이 읽고 겹치는 조항은 로컬 우선 (격리 세션에도 전달. 코어 파일 없음 — 로컬 전용) |
|
|
135
137
|
| `*.local.md` | `.project/rules/` | (옵션) 사용자 오버라이드 — `*.local.md` suffix는 npx 미터치 |
|
|
136
138
|
|
|
137
139
|
---
|
|
@@ -146,7 +148,7 @@
|
|
|
146
148
|
| `/task-plan` | task | Requirements/Scope/Dev Plan/Test Plan 작성 (draft → planned) |
|
|
147
149
|
| `/task-dev` | task | Phase 순서 구현 + self-check (planned → developed) |
|
|
148
150
|
| `/task-test` | task | Task tool 격리 검증 (developed → tested) |
|
|
149
|
-
| `/task-close` | task | 검증 명령 게이트 + 커밋 +
|
|
151
|
+
| `/task-close` | task | 검증 명령 게이트 + 커밋 + 부모 브랜치 병합 (tested → closed) |
|
|
150
152
|
| `/add-backlog` | meta | 사용자 발화로 활성 plan BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
|
|
151
153
|
| `/log-friction` | meta | FRICTION_LOG.md에 사용자 불편 한 행 기록 |
|
|
152
154
|
| `/run-team` | meta · **Claude 전용** | agent teams로 다건 태스크를 팀원(독립 세션)에 분배해 자동 병렬 처리 — 트리거 발화 시에만 (실험 기능 전제). 위 "agent teams 자동 병렬" 섹션 참조 |
|
|
@@ -43,4 +43,4 @@ description: 사용자 발화로 *plan(기능 그룹)별* tasks/<NNN_slug>/BACKL
|
|
|
43
43
|
|
|
44
44
|
- **얕은 분석만** — 도메인 코드 Read · Grep 금지. 본격 분석은 `/task-plan`.
|
|
45
45
|
- **글로벌 `.project/BACKLOG.md`(plan 기획 후보)와 혼동 X** — 본 스킬은 *활성 plan별*만. 글로벌은 `/plan-init` 영역.
|
|
46
|
-
- **체크박스 의미** — `[ ]` = 미확인(메모) / `[x]` = 확인(task로 옮김).
|
|
46
|
+
- **체크박스 의미** — `[ ]` = 미확인(메모) / `[x]` = 확인(task로 옮김). 부모 머지·완료 여부와 무관 — 완료 추적은 `taskery status` + 부모 머지커밋.
|
|
@@ -92,9 +92,9 @@ PLAN.md는 *얇은 인덱스*다 — 이 기능 그룹이 건드린 루트 문
|
|
|
92
92
|
작성 산출물 목록 + 다음 단계:
|
|
93
93
|
- *"`<NNN_slug>/` plan 생성 완료 — PLAN/ROADMAP + FEATURES/UX-UI 의도 stub. AGENT-GUIDE 활성 plan `<NNN_slug>` 갱신. 다음은 `/task-init`으로 첫 task (스키마/엔드포인트 상세는 task 진행에서 구현 동반)."*
|
|
94
94
|
|
|
95
|
-
**commit 흐름** (GIT_RULE): dev 직접 commit *금지*(git-guard 차단). default 둘:
|
|
95
|
+
**commit 흐름** (GIT_RULE): 현재 브랜치(= 부모)가 dev/main이면 직접 commit *금지*(git-guard 차단). default 둘:
|
|
96
96
|
1. **첫 task에 묶기 (권장)**: `/project-init` 직후면 init 산출물과 같은 작업 브랜치(보통 TASK-001 부트스트랩 chore)에 함께. 새 기능 그룹이면 새 task 브랜치 또는 임시 docs 브랜치.
|
|
97
|
-
2. **임시 docs 브랜치**: `git checkout -b docs/{개발자}_plan-{NNN_slug}` → commit →
|
|
97
|
+
2. **임시 docs 브랜치**: `git checkout -b docs/{개발자}_plan-{NNN_slug}` → commit → **현재 브랜치(부모) `--no-ff` 머지**(부모가 dev면 dev, dev_feat_x면 dev_feat_x).
|
|
98
98
|
|
|
99
99
|
## 주의사항
|
|
100
100
|
|
|
@@ -287,9 +287,9 @@ git branch -a # main(또는 master) + dev
|
|
|
287
287
|
- *"PROJECT.md(초기 빌드 로드맵 포함) / AGENT-GUIDE.md / LINKED-REPOS.md / GLOSSARY.md / .env + 제품 관통 문서(그룹 A 작성: SERVICE-POLICY·TECH-STACK·ARCHITECTURE / 그룹 B 골격: DATA-MODEL·API-SPEC·FEATURES·UX-UI, 타입 해당분) 생성. (FRICTION_LOG.md / TEST-GUIDE.md(검증 방법 문서, 빈 골격) / 빈 골격 폴더는 npx init이 이미 카피한 것 그대로 — project-init이 생성 X). **빈 폴더 케이스라 git init + dev 분기까지 완료** (이미 git 리포면 건너뜀). 다음은 `/plan-init <기능그룹>`으로 첫 plan(MVP면 여러 기능 그룹을 묶은 큰 plan) 작성."*
|
|
288
288
|
|
|
289
289
|
**결과 commit 흐름** (GIT_RULE 정합):
|
|
290
|
-
- dev 직접 commit *금지* (git-guard.sh 차단). 두 가지 default 흐름:
|
|
290
|
+
- 현재 브랜치(= 부모, 기본 dev)가 dev/main이면 직접 commit *금지* (git-guard.sh 차단). 두 가지 default 흐름:
|
|
291
291
|
1. **첫 task에 묶기 (권장)**: `/plan-init` 끝나고 첫 `/task-init` (보통 TASK-001 부트스트랩 chore)으로 만든 작업 브랜치에서 init 산출물(PROJECT/AGENT-GUIDE/LINKED-REPOS/.env)도 함께 commit. task-close 단계의 "태스크 문서 커밋"에 자연스럽게 묶임.
|
|
292
|
-
2. **임시 docs 브랜치**: `git checkout -b docs/{개발자}_init-bootstrap` 후 commit →
|
|
292
|
+
2. **임시 docs 브랜치**: `git checkout -b docs/{개발자}_init-bootstrap` 후 commit → 현재 브랜치(부모)에 `--no-ff` 머지. 첫 task 생성 *전*에 init 결과를 깔끔히 기록하고 싶을 때.
|
|
293
293
|
|
|
294
294
|
## 도구 가이드
|
|
295
295
|
|