@angar2/taskery 0.1.1 → 0.1.2

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.
@@ -11,6 +11,23 @@ description: task 격리 세션 검증 — Task tool 격리 호출 + Test Plan
11
11
 
12
12
  **왜 격리?** 메인 세션은 plan/dev 컨텍스트가 누적되어 *"잘 됐을 거야"* confirmation bias 작동. 격리 세션이 *코드와 동작만 신뢰*해서 가정 없이 검증.
13
13
 
14
+ ## 멀티세션 메타 위치 (0.1.2+)
15
+
16
+ 본 스킬은 워크트리에서 호출된다. 격리 세션 prompt에 넘기는 task 문서 + 검증/테스트 명령 출처:
17
+
18
+ ```sh
19
+ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
20
+ ```
21
+
22
+ `.gitignore` 케이스 분기:
23
+
24
+ | 케이스 | task 문서 위치 | 격리 세션 작업 디렉토리 |
25
+ |--------|--------------|---------------------|
26
+ | 등록 (퍼블릭 리포 default) | `$MAIN_WT/.project/tasks/<vX.X>/...` | `$WT_PATH` (워크트리 — 코드 변경 위치) |
27
+ | 미등록 | `$WT_PATH/.project/tasks/<vX.X>/...` (워크트리 안) | `$WT_PATH` (워크트리) |
28
+
29
+ 격리 세션은 *워크트리 안*에서 검증/테스트 명령 실행 (`$MAIN_WT/CLAUDE.md`의 `## 검증 명령` / `## 테스트 명령` 단일 진실 소스).
30
+
14
31
  ## 호출 시점
15
32
 
16
33
  - `/task-dev` 끝나고 self-check PASS 받은 직후.
@@ -53,39 +70,50 @@ Task tool로 sub-agent spawn. prompt는 *자기완결적* — task.md 경로 +
53
70
  파일 경로: <ABSOLUTE_PATH_TO_TASK_MD>
54
71
 
55
72
  이 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별 완료 기준을 정독하세요. 다른 문서 참조 X — task.md 하나만 봅니다.
73
+ (단 task.md가 `mockup/<task-doc-name>-mockup.html` 참조하면 해당 목업 파일도 직접 Read — 시각 USER 시나리오의 *기준*으로 사용. 자동 비교 X.)
56
74
 
57
75
  ## 수행 룰
58
76
 
59
- 1. ## Test Plan 시나리오를 *순서대로* 그대로 수행. 임의 추가 / 스킵 / 변형 금지.
60
- 2. 각 시나리오마다 *실제 명령 실행* — 실행 없이 pass 처리 절대 금지.
61
- 3. 검증 명령 (린트/타입/빌드/테스트) 모두 직접 실행.
62
- 4. 코드와 동작만 신뢰. *"잘 될 거야"* / *"문제 없을 듯"* 같은 가정 일체 금지.
63
- 5. UI/브라우저 시나리오는 가능한 범위에서 자동화 (Playwright 사용 가능). 자동화 불가능 시 UNCERTAIN으로 표기 + 사용자검수 필요 안내.
64
- 6. 코드 파일 직접 수정 절대 금지. 임시 파일(테스트 스크립트 등) 생성 시 종료 후 삭제.
77
+ 1. **본질 — Test Plan 시나리오 기반 실질 동작 검증**. 본 task에서 구현한 *요구사항이 정상 동작하는지* 검증이 목적. 단위 테스트 수치(카운트 +N / 모든 PASS) 자체로 task PASS 단정 절대 X — Test Plan에 명시된 *각 시나리오*가 PASS인지가 본질.
78
+ 2. ## Test Plan 시나리오를 *순서대로* 그대로 수행. 임의 추가 / 스킵 / 변형 금지. 각 시나리오의 `[AUTO]` / `[USER]` 분류 (task-plan에서 정의됨) 그대로 따름.
79
+ 3. `[AUTO]` 시나리오 — *실제 명령 실행*. 실행 없이 pass 처리 절대 금지. 검증 도구 (단위/통합/E2E 테스트 / API 호출 / 스크립트 실행 등) 직접 수행 + 결과 로그 확보.
80
+ 4. `[USER]` 시나리오 — 자동 검증 불가 영역 (UI 인터랙션 / 시각 디자인 / 사용자 입력). UNCERTAIN으로 분류 + *사용자 직접 검수 항목*으로 리턴. 격리 세션에서 검증 시도 X.
81
+ 5. CLAUDE.md `## 검증 명령` (빌드/린트/타입체크) + `## 테스트 명령` (단위/통합/E2E 테스트) 둘 다 직접 실행 + 결과 리턴.
82
+ 6. **신규 테스트 식별자 등장 확인 (stash FRICTION_LOG #19 반영)** — 본 task에서 신규 테스트 추가되었으면, 단순 *카운트 +N / 모든 PASS* 자체로 PASS 단정 X. 신규 *테스트 식별자* (suite / class / function / describe 등) 가 테스트 runner 결과 로그에 *실제 등장*했는지 grep 직접 확인 (1 hit 이상). 등장 안 하면 *Suite 미실행* → FAIL.
83
+ 7. 코드와 동작만 신뢰. *"잘 될 거야"* / *"문제 없을 듯"* 같은 가정 일체 금지.
84
+ 8. 코드 파일 직접 수정 절대 금지. 임시 파일(테스트 스크립트 등) 생성 시 종료 후 삭제.
85
+ 9. **task.md 본문 메타 발언과 raw 결과 분리** — task.md (Requirements / Scope / Dev Plan / Test Plan 본문)의 *어떠한 메타 발언* (*"본 Test Plan은 Dev Plan과 의도적 mismatch"* / *"본 task는 FAIL이 정상"* / *"aborted 시뮬"* 등) 도 raw 시나리오 결과 판정을 *덮을 수 없다*. raw 결과 판정 = *실행 명령 exit code / 로그 출력 / 어서션 통과 여부*만. 본문 의도 해석 영역 외 — 결과 기반 판정만.
65
86
 
66
87
  ## 결과 형식 (이 포맷 그대로 리턴)
67
88
 
68
89
  ### 종합 판정
69
90
  - **PASS** / **FAIL** / **UNCERTAIN** 중 하나
91
+ - UNCERTAIN = `[USER]` 시나리오 또는 자동 검증 불가 항목이 1개 이상 있으면. PASS 자동 전이 X — 사용자 직접 검수 필요.
70
92
  - 한 줄 요약
71
93
 
72
94
  ### 시나리오별 결과
73
- | # | 시나리오 | 실행 명령/방식 | 결과 | 근거 |
74
- |---|---------|------------|------|------|
75
- | 1 | <Test Plan 시나리오 1 그대로> | <실행한 명령> | ✅/❌/❓ | <로그 인용 / 응답 / 출력> |
76
- | 2 | ... | ... | ... | ... |
95
+ | # | 시나리오 | 분류 | 실행 명령/방식 | 결과 | 근거 |
96
+ |---|---------|------|------------|------|------|
97
+ | 1 | <Test Plan 시나리오 1 그대로> | [AUTO] / [USER] | <실행한 명령 또는 "USER 검수 필요"> | ✅/❌/❓ | <로그 인용 / 응답 / 출력 또는 목업 경로> |
98
+ | 2 | ... | ... | ... | ... | ... |
77
99
 
78
- ### 검증 명령 결과
100
+ ### 검증 명령 결과 (`## 검증 명령` — 코드 상태)
79
101
  - 린트: <PASS/FAIL + exit code + 메시지>
80
102
  - 타입체크: <...>
81
103
  - 빌드: <...>
104
+
105
+ ### 테스트 명령 결과 (`## 테스트 명령` — 테스트 실행)
82
106
  - 단위 테스트: <PASS 케이스 수 / FAIL 케이스 수>
107
+ - 통합 테스트: <...>
108
+ - E2E 테스트: <...>
109
+ - 신규 식별자 등장 확인: <suite/class/function 명 + grep 결과 hit 수>
83
110
 
84
111
  ### 실패 / 불확정 상세 (해당 시)
85
112
  - <어느 시나리오 / 무엇이 깨졌는지 / 어느 로그가 그 증거인지>
86
113
 
87
- ### 사용자검수 필요 항목 (해당 시)
88
- - <자동화 불가능한 시나리오 — 스크린샷 경로 또는 수동 검수 가이드>
114
+ ### USER 검수 필요 항목 (UNCERTAIN — 해당 시)
115
+ - <시나리오 N: 검수 항목 한 줄>
116
+ - <목업 파일 경로 — 있을 시 시각 영역 기준으로 참조>
89
117
 
90
118
  ## 종료 조건
91
119
 
@@ -150,13 +178,26 @@ Task tool로 sub-agent spawn. prompt는 *자기완결적* — task.md 경로 +
150
178
  ```
151
179
  3. 사용자 *"고쳐"* → 헤더 status `testing` → `developing` Edit + `/task-dev` 안내. 사용자 *"OK 마무리"* → status `testing` → `tested` Edit (단 Result 섹션에 *"알려진 결함 있음"* 명시) + `/task-close` 안내.
152
180
 
153
- #### UNCERTAIN 분기
181
+ #### UNCERTAIN 분기 (USER 검수 흐름)
182
+
183
+ 격리 세션이 `[USER]` 시나리오 또는 자동화 불가능한 시나리오(UI 인터랙션 / 시각 디자인 / 사용자 입력 등) 발견 시. **자동 PASS 전이 X — 사용자 직접 검수 PASS 받은 후에만 `tested` 전이**.
154
184
 
155
- 격리 세션이 자동화 불가능한 시나리오(예: 모바일 사파리 / 외부 결제 / 시각 디자인) 발견 시:
185
+ 1. 메인이 사용자에게 *체크리스트 형식*으로 항목 보고 (stash FRICTION_LOG #14+19 반영):
186
+
187
+ ```
188
+ USER 검수 — N 항목 (목업 기준: <mockup path — 있을 시>)
189
+
190
+ [ ] <시나리오 1>
191
+ [ ] <시나리오 2 (목업 §X 참조)>
192
+ ...
193
+
194
+ 각 항목 ✓/✗ 응답
195
+ ```
156
196
 
157
- 1. 사용자검수 필요 항목 사용자에게 표시 + 스크린샷 경로 (있으면).
158
- 2. 사용자에게 *"이 부분 직접 검수 부탁. 결과 어땠어?"* 묻기.
159
- 3. 사용자 *"PASS"* → PASS 분기로. 사용자 *"FAIL"* → FAIL 분기로.
197
+ 2. **시각 영역 fix 사이클 사전 예고** — 시각 영역 항목 있으면 *"시각 영역은 한 사이클로 100% 일치 보장 X. fix 사이클 1~2회 예상. ✗ 발견 시 정상."* 안내. 사용자 기대치 사전 정렬, 부정 반응 누적 방지.
198
+ 3. 사용자 응답 받음:
199
+ - 모두 ✓ → PASS 분기로 (`tested` 전이).
200
+ - ✗ 1개 이상 → FAIL 분기로 (`developing` 회귀 + ✗ 항목별 fix).
160
201
 
161
202
  ### Step 6 — 결과 보고 (위 분기별 메시지)
162
203
 
@@ -0,0 +1,91 @@
1
+ # CHANGELOG_RULE
2
+
3
+ > 본 파일은 taskery 시스템 권장 프로젝트별 CHANGELOG 정책이다.
4
+ > 우선순위: **이 파일** (`.project/rules/CHANGELOG_RULE.md`) → 메인 판단.
5
+ > 프로젝트별 변형이 필요하면 `.project/rules/CHANGELOG_RULE.local.md` 생성 (npx update 미터치).
6
+
7
+ ---
8
+
9
+ ## 1. 파일 위치 / 기본 구조
10
+
11
+ - **경로**: `.project/changelog/CHANGELOG.md` (단일 파일) 또는 `.project/changelog/<YYYY-MM>.md` (월별 분할, 선호)
12
+ - **형식**: Markdown. 각 항목 = `## [TASK-NNN] <한 줄 요약>` 시작
13
+ - **정렬**: 최신 항목이 *맨 위* (Reverse chronological order)
14
+
15
+ ---
16
+
17
+ ## 2. 항목 형식
18
+
19
+ 각 task close 시 새 항목 1개 추가:
20
+
21
+ ```markdown
22
+ ## [TASK-NNN] <한 줄 요약>
23
+
24
+ - **날짜**: YYYY-MM-DD
25
+ - **타입**: feature / bug / improvement / refactor / docs / chore
26
+ - **변경 요약**: <2-3 줄>
27
+ - **영향 파일**: <주요 파일 경로 리스트>
28
+ - **사유**: <변경 이유 한 줄>
29
+ ```
30
+
31
+ ### 필수 필드
32
+
33
+ 1. 헤더 `## [TASK-NNN] <한 줄 요약>` (한 줄)
34
+ 2. **날짜** (`YYYY-MM-DD`)
35
+ 3. **타입** (커밋 태그와 동일 — `feat` / `fix` / `improve` / `refactor` / `docs` / `chore`)
36
+ 4. **변경 요약** (2-3 줄)
37
+
38
+ ### 선택 필드
39
+
40
+ - 영향 파일 (참고용)
41
+ - 사유 (참고용)
42
+ - 관련 PR / 이슈 링크 (있을 시)
43
+
44
+ ---
45
+
46
+ ## 3. 삽입 위치 (중요)
47
+
48
+ - **최신 항목이 맨 위** — 기존 첫 `##` 항목 *바로 위*에 삽입
49
+ - 메인 세션이 CHANGELOG.md Edit 시 *파일 전체 구조 확인 후* 정확한 위치에 삽입 의무
50
+ - 중간 삽입 / 끝 삽입 금지
51
+
52
+ ---
53
+
54
+ ## 4. task-close 흐름과의 정합
55
+
56
+ `/task-close` Step 4-4 (CHANGELOG 커밋) 단계에서 본 RULE 참조:
57
+
58
+ 1. 본 RULE 정독
59
+ 2. 신규 항목 형식대로 작성
60
+ 3. *최신 위치 (맨 위)* 에 삽입
61
+ 4. 커밋 — 메시지 형식: `docs: [TASK-NNN] CHANGELOG 업데이트`
62
+
63
+ ---
64
+
65
+ ## 5. 예시
66
+
67
+ ```markdown
68
+ ## [TASK-042] 사용자 인증 OAuth 2.0 지원 추가
69
+
70
+ - **날짜**: 2026-06-15
71
+ - **타입**: feature
72
+ - **변경 요약**: Google / GitHub OAuth provider 추가. 기존 이메일·비밀번호 흐름 유지.
73
+ - **영향 파일**: `src/auth/oauth.ts`, `src/routes/auth.ts`, `migrations/0042_oauth.sql`
74
+ - **사유**: 외부 서비스 연동 요구 누적 — 인증 흐름 다변화
75
+
76
+ ## [TASK-041] 로그인 페이지 입력 검증 fix
77
+
78
+ - **날짜**: 2026-06-12
79
+ - **타입**: bug
80
+ - **변경 요약**: 이메일 형식 검증 누락으로 빈 입력 통과되던 버그 fix.
81
+ - **영향 파일**: `src/components/LoginForm.tsx`
82
+ - **사유**: TASK-038 신고 — 빈 이메일로 로그인 시도 시 서버 오류
83
+ ```
84
+
85
+ ---
86
+
87
+ ## 6. 수정 이력
88
+
89
+ | 날짜 | 변경 사항 |
90
+ |------|----------|
91
+ | 2026-05-30 | 신규 작성 — 위치 / 형식 / 필수 필드 / task-close 정합 (stash FRICTION_LOG #8+9 반영) |
@@ -11,8 +11,9 @@
11
11
  - **git 작업은 메인 세션이 `/task-close` 스킬 또는 직접 수행**.
12
12
  - **main, dev 직접 커밋 절대 금지**: 모든 작업은 태스크 브랜치에서 진행.
13
13
  - **하나의 브랜치는 하나의 태스크만 담당**.
14
- - **작업 브랜치는 dev에서 분기, dev로 병합**.
14
+ - **작업 브랜치는 *task-init 시점에* dev에서 분기, *task-close 시점에* dev로 병합** (멀티세션 0.1.2+).
15
15
  - **dev → main 병합은 사용자가 직접 수행**.
16
+ - **수동 git 작업 시 정합성 보장 X** — taskery 명령(스킬 호출 / `npx @angar2/taskery <서브>`)으로만 운영. 수동 `git worktree add` / `branch` / `merge` 시 SSoT·락·자동 정리 흐름이 깨질 수 있음.
16
17
 
17
18
  ---
18
19
 
@@ -21,8 +22,8 @@
21
22
  | 브랜치 | 용도 |
22
23
  |--------|------|
23
24
  | `main` | 프로덕션 |
24
- | `dev` | 통합 개발 |
25
- | `{타입}/{개발자}_{TASK-NNN}_{kebab-slug}` | 태스크 작업 브랜치 |
25
+ | `dev` | 통합 개발 (메인 워크트리 = dev 전용) |
26
+ | `{타입}/{개발자}_TASK-NNN_{출처}_{슬러그}` | 태스크 작업 브랜치 (멀티세션 시스템 단일 식별자) |
26
27
 
27
28
  ### 브랜치 타입
28
29
 
@@ -45,14 +46,27 @@
45
46
  | Claude | `claude` |
46
47
  | 기타 AI | 해당 AI 이름 (예: `gpt`, `gemini`) |
47
48
 
49
+ ### 출처 (Source — 멀티세션 0.1.2+)
50
+
51
+ | 출처 | 의미 | 채번 주체 |
52
+ |------|------|---------|
53
+ | `BL-NNN` | 백로그 항목 | `/add-backlog` 스킬 (0.1.2). 버전별 `.project/tasks/<vX.X>/BACKLOG.md`에 누적 |
54
+ | `RM-NNN` | 로드맵 항목 | `/plan-init` (RM-NNN 채번 자동화는 후속 — 1차는 사용자 수동 명시) |
55
+ | `DR` | 직접 요구사항 (별도 ID 없음) | 사용자 발화 → `/task-init` |
56
+
48
57
  ### 브랜치 예시
49
58
 
50
59
  ```
51
- feature/claude_TASK-001_user-auth
52
- bug/angar2_TASK-002_login-crash
53
- refactor/gpt_TASK-003_cleanup-api
60
+ feature/claude_TASK-007_BL-003_login-feature
61
+ bug/angar2_TASK-012_DR_mobile-form-refresh
62
+ refactor/claude_TASK-018_RM-002_api-cleanup
63
+ docs/claude_TASK-021_DR_readme-rewrite
54
64
  ```
55
65
 
66
+ ### 케이스 2 — TASK 없는 작업 브랜치 (시스템 밖)
67
+
68
+ `TASK-NNN` 없는 작업 브랜치(`feature/claude_simple-config-fix` 등)는 *taskery 멀티세션 시스템 밖*에서 진행되는 단순/긴급 작업. SSoT 조회(`/task-init` 다음 번호 계산 / 진행중 목록)에서 자동 제외. **사용자 명시 운영 한정** — 메인 세션 자체 진입 금지.
69
+
56
70
  ---
57
71
 
58
72
  ## 커밋 태그
@@ -98,7 +112,8 @@ feat: [TASK-001] Phase 1 - 사용자 인증 로직 구현
98
112
  1. Phase별 기능 커밋 (각 Phase마다 1개)
99
113
  2. 태스크 문서 커밋
100
114
  3. CHANGELOG 커밋
101
- 4. dev 브랜치 병합 (--no-ff)
115
+ 4. dev 브랜치 병합 (--no-ff, 머지 락 직렬화)
116
+ 5. 워크트리 자동 제거 + 작업 브랜치 자동 삭제 (멀티세션 0.1.2+ — §"작업 브랜치 삭제 정책" 면제 조항)
102
117
  ```
103
118
 
104
119
  ### 태스크 문서 커밋 메시지
@@ -118,18 +133,111 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
118
133
  - 머지 커밋 메시지는 git 기본 메시지 사용
119
134
  - `-m` 옵션으로 커밋 메시지 지정 금지
120
135
  - **`--no-ff` 강제 (일반 타입)**: feature/bug/improvement/refactor 등 일반 작업 브랜치 → dev 병합 시 `git merge --no-ff {브랜치명}` 사용. fast-forward 병합 절대 금지. 머지 커밋이 없으면 작업 브랜치 삭제 후 분기 정보 영구 손실(90일 reflog GC 후 추적 불가).
121
- - **plan/roadmap 임시 docs 브랜치 예외**: 단일 커밋이라 `--ff-only` 가능.
136
+ - **plan/roadmap 임시 docs 브랜치 예외**: plan-init 단계의 단일 커밋(plan 신규/카피)에 한정 `--ff-only` 가능.
137
+ - **task 진행 중 ROADMAP/플랜 문서 갱신은 별도 `docs/*` 브랜치 분리 절대 금지**: 해당 task의 작업 브랜치 (`feature/*` / `improve/*` 등) 안에서 수정 + 다른 구현 커밋과 함께 `--no-ff` 머지로 dev 병합 (분기 정보 손실 방지).
122
138
 
123
139
  ---
124
140
 
125
141
  ## 작업 브랜치 삭제 정책
126
142
 
143
+ ### 기본 (멀티세션 외 / 케이스 2 / 사용자 수동 작업)
144
+
127
145
  작업 브랜치(feature/* / bug/* / improve/* / refactor/* / docs/* / chore/*)는 다음 조건 모두 만족 시에만 삭제한다:
128
146
  1. dev 브랜치에 `--no-ff` 병합 완료 (머지 커밋이 dev에 기록됨)
129
147
  2. 사용자 명시 승인 ("브랜치 삭제해" 등 직접 요청)
130
148
 
131
149
  **메인 세션 룰**: 사용자 승인 없는 작업 브랜치 삭제 지시 절대 금지. 머지 후 자동 삭제 X. 사용자가 직접 요청 시에만 `git branch -d {브랜치명}` 실행. (단, plan/roadmap 임시 docs 브랜치는 단일 커밋 ff-only 머지 후 자동 삭제 가능.)
132
150
 
151
+ ### `/task-close` 자동 삭제 면제 조항 (멀티세션 0.1.2+)
152
+
153
+ `/task-close` 마지막 단계의 *작업 브랜치 자동 삭제 + 워크트리 자동 제거*는 본 정책의 *사용자 명시 승인 룰* 면제 — 사용자가 `/task-close` 호출 자체로 *사전 승인*한 것으로 간주.
154
+
155
+ | 동작 | 명령 | 면제 사유 |
156
+ |------|------|----------|
157
+ | 워크트리 제거 | `git -C "$MAIN_WT" worktree remove "$WT_PATH"` | task 완료 후 격리 폴더 정리 필요. 사전 안전 검증 (§"멀티세션 워크트리 정책" 참조) 후 진행 |
158
+ | 작업 브랜치 삭제 | `git -C "$MAIN_WT" branch -d "$BRANCH"` | dev `--no-ff` 머지 완료 후 안전 삭제 (-D 강제 X). 머지 커밋이 dev에 박혀 분기 정보 보존 |
159
+
160
+ #### 보존 키워드 (양쪽 다 보존)
161
+
162
+ 사용자 발화에서 다음 키워드 감지 시 **워크트리 + 브랜치 모두 보존** (Step 11~13 건너뜀):
163
+ - `keep` / `--keep-branch` / `브랜치 남겨` / `브랜치 보존` / `브랜치 유지`
164
+
165
+ #### 사전 안전 검증 (자동 흐름 차단 트리거)
166
+
167
+ `/task-close` Step 11에서 다음 조건 발견 시 *자동 흐름 차단 + 사용자 호출*:
168
+ - 워크트리 안 미커밋 변경 (`git status --porcelain` 결과 있음)
169
+ - 워크트리 안 추적 X 파일 (`git ls-files --others --exclude-standard` 결과 있음)
170
+
171
+ 사용자 선택:
172
+ - 보존 → 워크트리 + 브랜치 모두 보존 (Step 12, 13 건너뜀)
173
+ - 삭제 → 정상 자동 흐름 (Step 12, 13 진행)
174
+ - 취소 → close 중단 (단, dev 머지는 이미 완료된 상태)
175
+
176
+ #### 안전망 출력 (브랜치 삭제 직후)
177
+
178
+ ```
179
+ 삭제됨: {브랜치명}
180
+ 복구: git -C "$MAIN_WT" branch {브랜치명} {머지 커밋 해시}
181
+ ```
182
+
183
+ #### 면제 범위 한정
184
+
185
+ 본 면제는 *`/task-close` 마지막 단계 자동 흐름 한정*. 그 외 모든 destructive 명령(`git reset --hard` / `git push --force` / `git branch -D` / `git clean -fd`)은 §"금지 사항" 그대로 사용자 명시 승인 필수.
186
+
187
+ ---
188
+
189
+ ## 멀티세션 워크트리 정책 (0.1.2+)
190
+
191
+ ### 메인 워크트리 = dev 전용
192
+
193
+ - 메인 워크트리는 항상 dev 체크아웃 상태 유지
194
+ - 모든 태스크 작업은 *별도 워크트리*에서 수행
195
+ - `/task-init` / `/task-close` 시작 시 검증 (위배 시 사용자 호출 + 중단)
196
+
197
+ ### 워크트리 위치
198
+
199
+ ```
200
+ ~/.taskery/worktrees/<projectId>/TASK-NNN_<출처>_<슬러그>/
201
+ ```
202
+
203
+ - `<projectId>`: `.taskery-manifest.json`의 `projectId` 필드 (8자 hex, taskery init 자동 생성)
204
+ - 부모 디렉토리는 `/task-init`이 자동 `mkdir -p`
205
+
206
+ ### 워크트리 생성 / 제거
207
+
208
+ | 작업 | 명령 | 주체 |
209
+ |------|------|------|
210
+ | 생성 | `git -C "$MAIN_WT" worktree add "$WT_PATH" -b "$BRANCH" dev` | `/task-init` |
211
+ | 제거 | `git -C "$MAIN_WT" worktree remove "$WT_PATH"` | `/task-close` (자동 흐름 + 안전 검증) |
212
+ | stale 정리 | `git -C "$MAIN_WT" worktree prune` | `npx @angar2/taskery prune` (사용자 확인 후) |
213
+
214
+ ### 메인 워크트리 절대 경로 검출
215
+
216
+ 워크트리 안에서 메인 워크트리 메타(`.project/`, `CLAUDE.md`)에 접근할 때 사용:
217
+
218
+ ```sh
219
+ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
220
+ ```
221
+
222
+ git ≥ 2.31 필요 (`--path-format=absolute` 옵션).
223
+
224
+ ### SSoT 조회 (진행중 태스크)
225
+
226
+ ```sh
227
+ git -C "$MAIN_WT" branch --no-merged dev --list \
228
+ 'feature/*_TASK-*' 'bug/*_TASK-*' 'improve/*_TASK-*' \
229
+ 'refactor/*_TASK-*' 'docs/*_TASK-*' 'chore/*_TASK-*'
230
+ ```
231
+
232
+ `_TASK-*` 패턴 강제로 케이스 2(TASK 없는 브랜치) 자동 제외. 별도 상태 파일/락 운영 X — git 분산 락(동일 브랜치명 자동 거부) + 결정적 슬러그(백로그/로드맵 항목 제목 → kebab-case)가 race 차단 2층 안전망.
233
+
234
+ ### 머지 직렬화 (head-to-head race 차단)
235
+
236
+ `/task-close` Step 6에서 `proper-lockfile` 기반 머지 락 (`~/.taskery/<projectId>.merge.lock`) 획득 후 rebase + 머지 시퀀스 실행:
237
+ - stale: manifest `lock_timeout_ms` (기본 30000ms)
238
+ - retries: 5회, 1초 간격
239
+ - 락 외 *사전 rebase* (UX용 조기 충돌 감지) → 락 안 *재 rebase*로 락 외에서 발생한 다른 세션 머지 흡수
240
+
133
241
  ---
134
242
 
135
243
  ## Hook 안전망 — `git-guard.sh`
@@ -167,3 +275,6 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
167
275
  | 2026-05-07 | `--no-ff` 강제 + 작업 브랜치 삭제 정책 + destructive 명령 사용자 승인 필수 룰 추가 |
168
276
  | 2026-05-08 | git 작업은 메인 세션이 `/task-close` 스킬 또는 직접 수행으로 단일화. git-guard.sh hook 안전망 명시 추가 |
169
277
  | 2026-05-09 | 표현 정제 — 인명 / 경박 표현 / 스킬 용어 / 이전 버전 비교 단락 정리 |
278
+ | 2026-05-30 | docs/* 브랜치 ff-only 예외 명시 — plan-init 단일 커밋 한정. task 진행 중 ROADMAP/플랜 갱신은 작업 브랜치 + --no-ff 명시 추가 (stash FRICTION_LOG #4 반영) |
279
+ | 2026-05-31 | 멀티세션 0.1.2 오버라이드 — 브랜치명에 출처(BL/RM/DR) 추가 / 케이스 2(TASK 없는 브랜치) 시스템 외 명시 / `/task-close` 자동 삭제 + 워크트리 제거 면제 조항 / 멀티세션 워크트리 정책 섹션 신규 (메인=dev 전용 / SSoT 조회 / 머지 락 직렬화) |
280
+ | 2026-05-31 | 0.1.2 백로그 스킬 추가 정합 — 출처 표 `BL-NNN` 채번 주체 `/backlog-add` → `/add-backlog`로 갱신 + 버전별 경로(`.project/tasks/<vX.X>/BACKLOG.md`) 명시 |
@@ -0,0 +1,85 @@
1
+ # MOCKUP_RULE
2
+
3
+ > 본 파일은 taskery 시스템 권장 UX/UI 구현 task의 HTML 목업 정책이다.
4
+ > 우선순위: **이 파일** (`.project/rules/MOCKUP_RULE.md`) → 메인 판단.
5
+ > 프로젝트별 변형이 필요하면 `.project/rules/MOCKUP_RULE.local.md` 생성 (npx update 미터치).
6
+
7
+ ---
8
+
9
+ ## 1. 목적
10
+
11
+ UX/UI 구현 task의 *시각 영역 사전 정합* + *task-test 시 USER 검수 기준 확보*. stash FRICTION_LOG #14+19 반영 — UX/UI 검증의 시각 fix 사이클 반복 마찰 사전 차단.
12
+
13
+ **효과**:
14
+ - 사용자가 *눈으로 보고* 의도 확인 → 인지 불일치 사전 차단
15
+ - 메인이 *시각 기준* 확보 → 구현 시 디자인 정합 검증 기준
16
+ - task-test USER 시각 시나리오의 *기준 파일* 역할
17
+
18
+ ---
19
+
20
+ ## 2. 적용 대상 task
21
+
22
+ **적용**:
23
+ - UX/UI 구현 포함 task (페이지 / 컴포넌트 신규 / 시각 변경 / 인터랙션 신규)
24
+ - `/task-plan` Step 2 Requirements 인터뷰 결과로 *UX/UI 구현 포함* 판단되면 Step 4.5 목업 프로세스 진입
25
+
26
+ **미적용**:
27
+ - 백엔드 / CLI / 인프라 / 설정 변경 등 시각 영역 없는 task
28
+ - UX/UI 포함이지만 사용자가 *"NO"* 응답한 task (Step 4.5에서 confirm)
29
+
30
+ ---
31
+
32
+ ## 3. 파일 위치 / 네이밍
33
+
34
+ - **경로**: `.project/tasks/<vX.X>/mockup/<task-doc-name>-mockup.html`
35
+ - **네이밍**: task 문서 파일명 + `-mockup.html`
36
+ - 예 1: `001_login-form.md` → `001_login-form-mockup.html`
37
+ - 예 2: 폴더 승격 `TASK-007_payment-flow/task.md` → `TASK-007_payment-flow-mockup.html`
38
+ - **task 1개 = 목업 1개** — multi-file 예외 영구 X. 복잡해도 한 파일 안 섹션 분리 (`<section id="popover">` 등)
39
+
40
+ ---
41
+
42
+ ## 4. 파일 형식
43
+
44
+ - 정적 HTML (외부 라이브러리 X)
45
+ - 단일 파일 안 inline `<style>` + 필요 시 vanilla `<script>`
46
+ - 시각 영역 (레이아웃 / 색상 / 간격 / 타이포 / 호버 효과) 본질 표현
47
+ - 인터랙션 가능 범위 (클릭 / 호버 시뮬) — 구현 정확도 ↑
48
+
49
+ ---
50
+
51
+ ## 5. 생성 흐름 (`/task-plan` Step 4.5 정합)
52
+
53
+ 1. UX/UI 구현 task 판단 (Step 2 Requirements 인터뷰 결과)
54
+ 2. 사용자에게 *"HTML 목업 만들까?"* 한 줄 confirm
55
+ 3. OK → 메인이 정적 HTML 생성 → 사용자 시각 승인 (✓ → 진행 / ✗ → 수정 재승인)
56
+ 4. 승인된 목업 = task-test의 *시각 영역 USER 검수 기준*
57
+
58
+ ---
59
+
60
+ ## 6. 두 시점 활용
61
+
62
+ | 시점 | 활용 |
63
+ |------|------|
64
+ | `/task-dev` | 메인이 *직접 Read* (sub-agent 위임 X) 후 구현. 구현 = 목업 기준 (역방향 X — 코드 편의로 목업 어김 절대 X) |
65
+ | `/task-test` | 격리 세션 prompt에서 *목업 파일 정독 후 시각 USER 시나리오 기준*으로 사용. 자동 비교 X. 사용자 검수 보고 시 *체크리스트 + 목업 경로 명시* |
66
+
67
+ ---
68
+
69
+ ## 7. 시각 fix 사이클 사전 예고
70
+
71
+ 시각 영역은 한 사이클로 100% 일치 보장 X. `/task-plan` Test Plan 작성 시 + `/task-test` 결과 보고 시 *"fix 사이클 1~2회 예상"* 사용자 안내 (기대치 사전 정렬, 부정 반응 누적 방지).
72
+
73
+ ---
74
+
75
+ ## 8. 디자인 산출 정독 의무
76
+
77
+ 목업 = 디자인 산출. 메인이 *직접 Read* 후 구현 (sub-agent 위임 X — 요약만 받아 시각 정합 깨짐 함정 회피). stash FRICTION_LOG #12 일반화.
78
+
79
+ ---
80
+
81
+ ## 9. 수정 이력
82
+
83
+ | 날짜 | 변경 사항 |
84
+ |------|----------|
85
+ | 2026-05-30 | 신규 작성 — UX/UI task HTML 목업 위치 / 형식 / 생성 흐름 / 두 시점 활용 / 시각 fix 사이클 예고 / 디자인 정독 의무 정의 (stash FRICTION_LOG #14+19 / #12 반영) |