@angar2/taskery 0.2.0 → 0.3.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.
package/README.md CHANGED
@@ -118,14 +118,16 @@ my-app/
118
118
  ├─ LINKED-REPOS.md # 관계 리포지토리 정보
119
119
  ├─ GLOSSARY.md # 도메인 용어집 (영문/한글 표기 일관성)
120
120
  ├─ .env # 사용자 설정 환경변수 (관계 리포지토리 환경변수 등)
121
+ ├─ SERVICE-POLICY.md / TECH-STACK.md / ARCHITECTURE.md # 제품 관통 문서 — 정적 (project-init 작성)
122
+ ├─ DATA-MODEL.md / API-SPEC.md / FEATURES.md / UX-UI.md # 제품 관통 문서 — 성장 (골격 → plan·task가 채움)
121
123
  ├─ rules/
122
124
  │ ├─ TASK_DOC_RULE.md # task 문서 작성 규칙
123
125
  │ ├─ GIT_RULE.md # 로컬 깃 운영 규칙
124
126
  │ ├─ CHANGELOG_RULE.md # CHANGELOG 작성 규칙
125
127
  │ ├─ MOCKUP_RULE.md # UX/UI HTML 목업 규칙
126
128
  │ └─ *.local.md # 사용자 오버라이드 규칙 (패키지 업데이트 대상 제외)
127
- ├─ plans/ # plan 문서
128
- ├─ tasks/ # task 문서 (vX.X/BACKLOG.md / spec-diffs / screenshots / mockup 포함)
129
+ ├─ plans/ # plan(기능 그룹)별 PLAN.md / ROADMAP.md (<NNN_slug>/)
130
+ ├─ tasks/ # task 문서 (<NNN_slug>/BACKLOG.md / spec-diffs / screenshots / mockup 포함)
129
131
  ├─ flows/ # 서비스 로직 플로우 정보
130
132
  ├─ changelog/ # 수정사항 정보
131
133
  ├─ shared/ # 관계 리포지토리 소통 메세지함
@@ -160,12 +162,12 @@ my-app/
160
162
 
161
163
  ## 백로그 메모
162
164
 
163
- 작업 흐름 중 발견되는 추가 기능과 버그를 *그 자리에서 짧게 적어 둔다*. 메인 세션이 사용자 발화를 받아 `/add-backlog`로 1건씩 활성 plan 버전의 `tasks/<vX.X>/BACKLOG.md`에 누적한다.
165
+ 작업 흐름 중 발견되는 추가 기능과 버그를 *그 자리에서 짧게 적어 둔다*. 메인 세션이 사용자 발화를 받아 `/add-backlog`로 1건씩 활성 plan(기능 그룹)의 `tasks/<NNN_slug>/BACKLOG.md`에 누적한다.
164
166
 
165
167
  - 항목 형식: 체크박스 + 식별자(BL-NNN) + 유형 + 제목 + 슬러그. 그 아래 *개요*(추정 원인 / 구상)와 *대상 영역*(관여할 파일·모듈) 2줄.
166
168
  - 시작 시점: 사용자가 *"BL-NNN 진행"*이라고 말하면 `/task-init`이 그 항목 메타로 task를 분기하고 BACKLOG.md 항목을 *확인* 마킹(`[x]`)하며 `- TASK: TASK-NNN`을 함께 남긴다. *완료*가 아니라 *task로 옮겼다*는 의미만 담는다.
167
169
  - 완료 추적: git 머지 히스토리와 `taskery status`. BACKLOG.md는 메모지 역할만 한다.
168
- - plan 후보 카탈로그(글로벌 `.project/BACKLOG.md`)는 다음 plan 버전 기획용으로 분리 관리한다.
170
+ - 다음 기능 그룹 후보 카탈로그(글로벌 `.project/BACKLOG.md`)는 다음 plan 기획용으로 분리 관리한다.
169
171
 
170
172
  ---
171
173
 
@@ -174,20 +176,20 @@ my-app/
174
176
  스킬은 호출 시점에 따라 4 카테고리(`project` / `plan` / `task` / `meta`)로 분류된다.
175
177
 
176
178
  - `project` — 프로젝트 첫 도입 시 1회만 호출
177
- - `plan` — 새 기획 버전 시작 시 호출
179
+ - `plan` — 새 기능 그룹(작업 묶음) 시작 시 호출
178
180
  - `task` — 새 task 작업 진행 단계에서 호출
179
181
  - `meta` — 그 외 taskery 관리
180
182
 
181
183
  | 스킬 | 레벨 | 역할 |
182
184
  |------|------|------|
183
- | `/project-init` | project | 프로젝트 첫 도입 시 메타 문서와 디렉토리 골격 생성 (1회성) |
184
- | `/plan-init` | plan | 새 기획 버전의 기획 문서 작성 |
185
+ | `/project-init` | project | 프로젝트 첫 도입 시 메타 문서 + 제품 관통 기획 문서(정책/스택/구조 작성, 데이터/API/기능/UI 골격) 생성 (1회성) |
186
+ | `/plan-init` | plan | 새 기능 그룹의 PLAN.md / ROADMAP.md + 제품 관통 문서(FEATURES/UX-UI)에 기능 의도 추가 |
185
187
  | `/task-init` | task | 새 task의 빈 문서 생성 |
186
188
  | `/task-plan` | task | task의 요구사항·범위·개발 계획·테스트 계획 작성 |
187
189
  | `/task-dev` | task | 계획에 따른 단계별 구현 + 자가 검증 |
188
190
  | `/task-test` | task | 별도 격리 세션에서 독립 검증 (메인 가정 차단) |
189
191
  | `/task-close` | task | 최종 검증 후 git 커밋 + dev 브랜치 `--no-ff` 병합 |
190
- | `/add-backlog` | meta | 사용자 발화로 버전별 `tasks/<vX.X>/BACKLOG.md`에 task 후보 1건씩 추가 (0.1.2+) |
192
+ | `/add-backlog` | meta | 사용자 발화로 plan(기능 그룹)별 `tasks/<NNN_slug>/BACKLOG.md`에 task 후보 1건씩 추가 (0.1.2+) |
191
193
  | `/log-friction` | meta | 사용자 불편을 `.project/FRICTION_LOG.md`에 한 행 기록 |
192
194
 
193
195
  각 스킬은 슬래시로 직접 호출하거나, 사용자 발화의 의미가 스킬의 frontmatter description과 매칭되면 메인 세션이 자동으로 발동시킨다.
@@ -196,9 +198,9 @@ my-app/
196
198
 
197
199
  | 스킬 | 생성 위치 | 생성 문서 |
198
200
  |------|---------|---------|
199
- | `/project-init` | `.project/` | PROJECT.md / AGENT-GUIDE.md / LINKED-REPOS.md / .env |
200
- | `/plan-init` | `.project/plans/<plan-name>/` | 9 기획 문서 — PLAN.md / SERVICE-POLICY.md / FEATURES.md / UX-UI.md / TECH-STACK.md / ARCHITECTURE.md / DATA-MODEL.md / API-SPEC.md / ROADMAP.md (프로젝트 타입에 따라 일부 제외) |
201
- | `/task-init` | `.project/tasks/<plan-name>/` | `<NNN>_<slug>.md` (단일 파일) 또는 `TASK-<NNN>_<slug>/task.md` (규모 `large` 시 폴더 승격) |
201
+ | `/project-init` | `.project/` | PROJECT.md / AGENT-GUIDE.md / LINKED-REPOS.md / GLOSSARY.md / .env + 제품 관통 문서(SERVICE-POLICY / TECH-STACK / ARCHITECTURE 작성, DATA-MODEL / API-SPEC / FEATURES / UX-UI 골격 — 타입 해당분) |
202
+ | `/plan-init` | `.project/plans/<NNN_slug>/` | PLAN.md / ROADMAP.md + 제품 관통 문서 FEATURES/UX-UI에 기능 그룹 의도 추가 (제품 관통 문서 전체를 한꺼번에 만들지는 않음) |
203
+ | `/task-init` | `.project/tasks/<NNN_slug>/` | `<NNN>_<slug>.md` (단일 파일) 또는 `TASK-<NNN>_<slug>/task.md` (사용자 명시 시 폴더 승격) |
202
204
 
203
205
  > 각 스킬의 호출 시점, 입력 처리 방식, 단계별 절차, 주의사항은 [SKILLS.md](https://github.com/angar2/taskery/blob/main/plan/SKILLS.md)에서 확인 가능
204
206
 
@@ -229,7 +231,7 @@ npx @angar2/taskery init
229
231
 
230
232
  ```
231
233
  /project-init # 진입 메타 문서와 디렉토리 골격 생성
232
- /plan-init v1.0 # v1.0 기획 문서 작성
234
+ /plan-init mvp # 첫 plan(기능 그룹) — PLAN/ROADMAP + 제품 문서에 기능 의도 추가
233
235
  /task-init # draft : 첫 task의 빈 문서 생성
234
236
  /task-plan TASK-001 # draft → planned : 요구사항·범위·개발 계획·테스트 계획 작성
235
237
  /task-dev TASK-001 # planned → developed : 단계별 구현과 자체 검증
package/bin/init.js CHANGED
@@ -172,7 +172,7 @@ async function main() {
172
172
  if (platforms.includes('codex')) {
173
173
  console.log(` 2. Codex 최초 1회 '/hooks'로 hook trust 승인 (.codex/config.toml — git-guard / closed-immutable)`);
174
174
  }
175
- console.log(` 3. 에이전트 진입 → '/project-init' → '/plan-init <vX.X>' → '/task-init'\n`);
175
+ console.log(` 3. 에이전트 진입 → '/project-init' → '/plan-init <기능그룹>' → '/task-init'\n`);
176
176
  }
177
177
 
178
178
  main().catch((e) => {
package/bin/lib.js CHANGED
@@ -27,8 +27,8 @@
27
27
  * - assertDevExists(mainWtPath): dev 브랜치 존재 검증
28
28
  *
29
29
  * 백로그 (0.1.2+):
30
- * - getActiveVersion(mainWtPath): .project/AGENT-GUIDE.md에서 활성 plan 버전(vX.X) 추출
31
- * - getBacklogPath(mainWtPath, activeVersion?): .project/tasks/<vX.X>/BACKLOG.md 절대 경로
30
+ * - getActiveVersion(mainWtPath): .project/AGENT-GUIDE.md에서 활성 plan 식별자(버전 또는 기능 그룹명) 추출
31
+ * - getBacklogPath(mainWtPath, activeVersion?): .project/tasks/<활성 plan>/BACKLOG.md 절대 경로
32
32
  * - parseBacklogItem(mainWtPath, blId): BL-NNN 항목 메타 파싱 ({ status, type, title, slug, summary, target, taskNums })
33
33
  * - appendBacklogItem(mainWtPath, meta): withMetaLock + BL-NNN 채번 + 항목 append (placeholder 치환 우선)
34
34
  * - markBacklogChecked(mainWtPath, blId, taskNum): withMetaLock + [ ] → [x] + TASK 마크 (다회 진행 시 콤마 추가)
@@ -369,13 +369,35 @@ function getNextTaskNumber(mainWtPath) {
369
369
  return Math.max(...all) + 1;
370
370
  }
371
371
 
372
+ function computeNextPlanNumber(mainWtPath) {
373
+ // .project/plans/ 하위 'NNN_<slug>' 디렉토리 스캔 → NNN max+1, 3자리 zero-pad 문자열 반환.
374
+ // plan = 기능 그룹 단위, 폴더명 앞 3자리 채번(TASK-NNN과 결 맞춤). slug은 호출측(plan-init)이 결합.
375
+ // legacy 가드: 'NNN_' 패턴이 아닌 폴더(구버전 vX.X 등)는 legacyDirs로 수집 → plan-init이
376
+ // 새 plan 생성 전 경고·수동 이전 안내에 사용(채번 공존 시 활성 plan 갈림 = 원 문제 재발 차단).
377
+ const plansDir = path.join(mainWtPath, '.project', 'plans');
378
+ if (!fs.existsSync(plansDir)) {
379
+ return { next: '001', legacyDirs: [] };
380
+ }
381
+ const nums = [];
382
+ const legacyDirs = [];
383
+ for (const ent of fs.readdirSync(plansDir, { withFileTypes: true })) {
384
+ if (!ent.isDirectory()) continue;
385
+ const m = ent.name.match(/^(\d{3})_/);
386
+ if (m) nums.push(parseInt(m[1], 10));
387
+ else legacyDirs.push(ent.name);
388
+ }
389
+ const next = nums.length === 0 ? 1 : Math.max(...nums) + 1;
390
+ return { next: String(next).padStart(3, '0'), legacyDirs };
391
+ }
392
+
372
393
  // ─── 백로그 (0.1.2+) ────────────────────────────────────────────────
373
394
 
374
395
  const BACKLOG_PLACEHOLDER =
375
396
  '(사용자 발화 또는 task-close 직후 메인 감지로 한 행씩 추가. 빈 상태 default.)';
376
397
 
377
398
  function getActiveVersion(mainWtPath) {
378
- // .project/AGENT-GUIDE.md '## 활성 plan 버전' 섹션 다음 비어 있지 않은 첫 줄에서 vX.X 추출
399
+ // .project/AGENT-GUIDE.md '## 활성 plan 버전' 섹션 다음 비어 있지 않은 첫 줄에서 활성 plan 식별자 추출.
400
+ // plan = 기능 그룹 단위 → 식별자는 vX.X 버전명 또는 기능 그룹 slug(compare-products 등) 모두 가능.
379
401
  const guidePath = path.join(mainWtPath, '.project', 'AGENT-GUIDE.md');
380
402
  if (!fs.existsSync(guidePath)) {
381
403
  throw new Error(`.project/AGENT-GUIDE.md 부재. /project-init 먼저 호출.`);
@@ -385,13 +407,14 @@ function getActiveVersion(mainWtPath) {
385
407
  if (!sec) {
386
408
  throw new Error(`.project/AGENT-GUIDE.md '## 활성 plan 버전' 섹션 부재.`);
387
409
  }
388
- const m = sec[1].match(/\bv[\d.]+(?:[-\w]*)?/);
389
- if (!m) {
410
+ // 첫 토큰 = plan 폴더 이름(' — 설명' 앞부분). '<예: ...>' 자리표시자는 미설정으로 간주.
411
+ const firstLine = sec[1].trim();
412
+ if (!firstLine || firstLine.startsWith('<')) {
390
413
  throw new Error(
391
- `'## 활성 plan 버전' 값에서 vX.X 패턴 추출 실패: ${sec[1].trim()} — /plan-init으로 활성 버전 갱신 필요.`,
414
+ `'## 활성 plan 버전' 값 미설정(${firstLine || '빈 줄'}) — /plan-init으로 활성 plan 갱신 필요.`,
392
415
  );
393
416
  }
394
- return m[0];
417
+ return firstLine.split(/\s+/)[0];
395
418
  }
396
419
 
397
420
  function getBacklogPath(mainWtPath, activeVersion) {
@@ -573,6 +596,7 @@ module.exports = {
573
596
  parseBranchName,
574
597
  getActiveTasks,
575
598
  getNextTaskNumber,
599
+ computeNextPlanNumber,
576
600
  // 백로그 (0.1.2+)
577
601
  BACKLOG_PLACEHOLDER,
578
602
  getActiveVersion,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angar2/taskery",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Lightweight task system for Claude Code & Codex — 1 메인 세션(또는 멀티세션) + 스킬 9종 + catastrophic hook 안전망 2종",
5
5
  "bin": {
6
6
  "taskery": "bin/taskery.js",
@@ -3,14 +3,14 @@
3
3
  # PreToolUse(Write|Edit) 훅 — closed 상태 task.md 재수정 차단
4
4
  #
5
5
  # 잡는 것 (단순화 — task.md 본 파일만 보호):
6
- # 1. .project/tasks/<vX.X>/<NNN>_<slug>.md (단일 파일)
7
- # 2. .project/tasks/<vX.X>/TASK-<NNN>_<slug>/task.md (폴더 승격)
6
+ # 1. .project/tasks/<NNN_slug>/<NNN>_<slug>.md (단일 파일)
7
+ # 2. .project/tasks/<NNN_slug>/TASK-<NNN>_<slug>/task.md (폴더 승격)
8
8
  # → 헤더 status가 'closed'면 차단
9
9
  #
10
10
  # 차단 안 함 (의도적):
11
- # - .project/tasks/<vX.X>/spec-diffs/*.md — 역사적 자료, 자유 수정
12
- # - .project/tasks/<vX.X>/screenshots/* — 자유
13
- # - .project/tasks/<vX.X>/mockup/*.html — UX/UI 목업, 자유 수정 (vX.X 공통)
11
+ # - .project/tasks/<NNN_slug>/spec-diffs/*.md — 역사적 자료, 자유 수정
12
+ # - .project/tasks/<NNN_slug>/screenshots/* — 자유
13
+ # - .project/tasks/<NNN_slug>/mockup/*.html — UX/UI 목업, 자유 수정 (<NNN_slug> 공통)
14
14
  # - 폴더 승격 task 폴더 안 추가 자료 (서브 문서 등) — 자유
15
15
  # - 코드 영역 — closed task 코드 재수정은 *새 task로 처리*가 정상 흐름
16
16
  #
@@ -33,10 +33,10 @@ except Exception:
33
33
  " 2>/dev/null)
34
34
 
35
35
  # task.md 본 파일 매칭 (단일 + 폴더 승격)
36
- # - 단일: .project/tasks/v*/<NNN>_<slug>.md (NNN_<slug> 패턴 — vX.X 직속, spec-diffs/screenshots/mockup 하위 X)
37
- # - 폴더: .project/tasks/v*/TASK-<NNN>_<slug>/task.md
38
- # spec-diffs/ + screenshots/ + mockup/ 직속 파일은 매칭 안 됨 (보호 대상 X)
39
- if ! echo "$FILE_PATH" | grep -qE '\.project/tasks/v[^/]+/([0-9]+_[^/]+\.md|TASK-[^/]+/task\.md)$'; then
36
+ # - 단일: .project/tasks/<NNN_slug>/<NNN>_<slug>.md (NNN_<slug> 패턴 — plan 폴더 직속, spec-diffs/screenshots/mockup 하위 X)
37
+ # - 폴더: .project/tasks/<NNN_slug>/TASK-<NNN>_<slug>/task.md
38
+ # plan 폴더명은 한 세그먼트([^/]+)면 무엇이든 매칭 (NNN_slug 신규 / 구버전 vX.X 모두). spec-diffs/screenshots/mockup 직속 파일은 추가 세그먼트라 매칭 안 됨 (보호 대상 X)
39
+ if ! echo "$FILE_PATH" | grep -qE '\.project/tasks/[^/]+/([0-9]+_[^/]+\.md|TASK-[^/]+/task\.md)$'; then
40
40
  exit 0
41
41
  fi
42
42
 
@@ -10,8 +10,8 @@
10
10
  # 경로를 정규식 추출해 각각 검사한다. matcher = "apply_patch".
11
11
  #
12
12
  # 잡는 것:
13
- # 1. .project/tasks/<vX.X>/<NNN>_<slug>.md (단일 파일)
14
- # 2. .project/tasks/<vX.X>/TASK-<NNN>_<slug>/task.md (폴더 승격)
13
+ # 1. .project/tasks/<NNN_slug>/<NNN>_<slug>.md (단일 파일)
14
+ # 2. .project/tasks/<NNN_slug>/TASK-<NNN>_<slug>/task.md (폴더 승격)
15
15
  # → 헤더 status가 'closed'면 차단 (exit 2)
16
16
  #
17
17
  # 차단 안 함 (의도적): spec-diffs / screenshots / mockup — 역사적 자료 자유 수정.
@@ -38,7 +38,7 @@ PATHS=$(echo "$CMD" | grep -oE '^\*\*\* (Update|Add) File: .+$' | sed -E 's/^\*\
38
38
 
39
39
  while IFS= read -r FILE_PATH; do
40
40
  # task.md 본 파일 패턴만 검사 (spec-diffs/screenshots/mockup 직속은 보호 대상 X)
41
- echo "$FILE_PATH" | grep -qE '\.project/tasks/v[^/]+/([0-9]+_[^/]+\.md|TASK-[^/]+/task\.md)$' || continue
41
+ echo "$FILE_PATH" | grep -qE '\.project/tasks/[^/]+/([0-9]+_[^/]+\.md|TASK-[^/]+/task\.md)$' || continue
42
42
  # 존재하는 파일만 (Add File 신규 생성은 통과)
43
43
  [ -f "$FILE_PATH" ] || continue
44
44
 
@@ -50,7 +50,7 @@
50
50
 
51
51
  | 출처 | 의미 | 채번 주체 |
52
52
  |------|------|---------|
53
- | `BL-NNN` | 백로그 항목 | `/add-backlog` 스킬 (0.1.2). 버전별 `.project/tasks/<vX.X>/BACKLOG.md`에 누적 |
53
+ | `BL-NNN` | 백로그 항목 | `/add-backlog` 스킬 (0.1.2). plan(기능 그룹)별 `.project/tasks/<NNN_slug>/BACKLOG.md`에 누적 |
54
54
  | `RM-NNN` | 로드맵 항목 | `/plan-init` (RM-NNN 채번 자동화는 후속 — 1차는 사용자 수동 명시) |
55
55
  | `DR` | 직접 요구사항 (별도 ID 없음) | 사용자 발화 → `/task-init` |
56
56
 
@@ -133,7 +133,8 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
133
133
  - 머지 커밋 메시지는 git 기본 메시지 사용
134
134
  - `-m` 옵션으로 커밋 메시지 지정 금지
135
135
  - **`--no-ff` 강제 (일반 타입)**: feature/bug/improvement/refactor 등 일반 작업 브랜치 → dev 병합 시 `git merge --no-ff {브랜치명}` 사용. fast-forward 병합 절대 금지. 머지 커밋이 없으면 작업 브랜치 삭제 후 분기 정보 영구 손실(90일 reflog GC 후 추적 불가).
136
- - **plan/roadmap 임시 docs 브랜치 예외**: plan-init 단계의 단일 커밋(plan 신규/카피)에 한정 `--ff-only` 가능.
136
+ - **추적 변경 0 → 마커 빈커밋 (`--allow-empty` 금지의 유일 예외)**: 코드 변경 0 + `.project` gitignore로 작업 브랜치가 dev보다 앞선 커밋이 0개이면 `--no-ff`도 *Already up to date*가 되어 머지 커밋이 생성되지 않는다. 이 경우 `/task-close`가 추적 마커 빈커밋 1개(`--allow-empty`)를 생성해 분기·채번 정보를 보존한다 (상세: task-close Step 6-8). 그 외 빈커밋은 금지.
137
+ - **plan/roadmap 임시 docs 브랜치 예외**: plan-init 단계의 단일 커밋(plan 신규 생성 — PLAN/ROADMAP + 제품 관통 문서 delta)에 한정 `--ff-only` 가능.
137
138
  - **task 진행 중 ROADMAP/플랜 문서 갱신은 별도 `docs/*` 브랜치 분리 절대 금지**: 해당 task의 작업 브랜치 (`feature/*` / `improve/*` 등) 안에서 수정 + 다른 구현 커밋과 함께 `--no-ff` 머지로 dev 병합 (분기 정보 손실 방지).
138
139
 
139
140
  ---
@@ -213,6 +214,14 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
213
214
  | 제거 | `git -C "$MAIN_WT" worktree remove "$WT_PATH"` | `/task-close` (자동 흐름 + 안전 검증) |
214
215
  | stale 정리 | `git -C "$MAIN_WT" worktree prune` | `npx @angar2/taskery prune` (사용자 확인 후) |
215
216
 
217
+ ### 워크트리 실행 환경 (의존성 — 앱 실행·검수 시)
218
+
219
+ 새 워크트리에는 의존성·빌드 산출물이 없다(생태계마다 형태 상이). 이를 메인 워크트리에서 **심링크로 끌어오지 않는다.**
220
+
221
+ - 심링크는 실제 경로가 메인 워크트리를 가리켜, *파일 접근을 워크트리 내부로 제한하는 도구*(개발 서버 등)에서 로딩 실패(예: 빈 화면)를 일으킨다.
222
+ - 빌드·테스트는 이 제한을 거치지 않아 심링크로도 통과하므로 "코드는 정상인데 실행만 깨짐"으로 오진하기 쉽다.
223
+ - 해당 task에서 앱을 **실행·검수**해야 한다면 심링크 대신 워크트리 안에 의존성을 실제로 마련한다(프로젝트 고유의 설치 명령 사용). 실행·검수가 필요 없는 task는 무관하다.
224
+
216
225
  ### 메인 워크트리 절대 경로 검출
217
226
 
218
227
  워크트리 안에서 메인 워크트리 메타(`.project/`, `CLAUDE.md`)에 접근할 때 사용:
@@ -240,6 +249,16 @@ git -C "$MAIN_WT" branch --no-merged dev --list \
240
249
  - retries: 5회, 1초 간격
241
250
  - 락 외 *사전 rebase* (UX용 조기 충돌 감지) → 락 안 *재 rebase*로 락 외에서 발생한 다른 세션 머지 흡수
242
251
 
252
+ ### 멀티세션 검수 환경 (dev 서버 · 터널 — 검수 서버를 띄우는 프로젝트 한정)
253
+
254
+ 여러 세션이 병렬로 검수용 dev 서버·터널을 띄울 때 포트·프로세스가 충돌하지 않도록 task별로 자원을 독립 소유한다. CLI·라이브러리 등 검수 서버가 없는 프로젝트는 무관.
255
+
256
+ - **포트 격리 (결정적)**: 메인/dev 세션 = 기준 포트, task 워크트리 = 기준 포트 + TASK번호. 기준 포트는 프로젝트가 `CLAUDE.md`(코덱스는 `AGENTS.md`) `## 검수 실행 명령`에 선언한다 (멀티 프로젝트 동시 운영 시 프로젝트마다 다른 기준 포트). TASK번호는 1부터라 offset 0(기준 포트)이 메인 몫으로 항상 비어 충돌하지 않는다.
257
+ - **터널 (필수 아님)**: 모바일 검수 등 필요한 task만, 자기 포트를 가리키는 별도 프로세스로 판다 → task별 독립 URL.
258
+ - **자기 것만 정리**: `/task-close` 시 본 task가 띄운 서버·터널(자기 포트 것)만 종료한다. **`pkill -f` 같은 광역 종료 금지** — 다른 세션의 서버까지 죽이는 원인.
259
+ - **검수 기동 (자동)**: 사용자가 결과를 *눈으로 검수*하는 시점에 위 포트로 서버를 백그라운드 기동하고 접속 URL을 보고한다 (사용자가 매번 실행을 지시하지 않게). 정확한 발동 지점은 각 스킬 참조 — `/task-dev`는 세션이 거기서 끝날 때(Step 9), `/task-test`는 UNCERTAIN 검수 직전(Step 5)·PASS 후 종료 시(Step 7). FAIL→수정 흐름에서는 기동하지 않는다. 단계가 *기능상* 서버를 요구하면(E2E 등) 검수 시점과 무관하게 띄운다.
260
+ - **효과 (정직)**: 포트 충돌은 결정적으로 제거된다. 다른 세션의 종료·턴 경계 프로세스 소실은 위 규율·백그라운드 실행으로 완화되나 문서 규율이라 강제는 아니다(best-effort).
261
+
243
262
  ---
244
263
 
245
264
  ## Hook 안전망 — `git-guard.sh`
@@ -284,3 +303,6 @@ git -C "$MAIN_WT" branch --no-merged dev --list \
284
303
  | 2026-05-31 | 멀티세션 0.1.2 오버라이드 — 브랜치명에 출처(BL/RM/DR) 추가 / 케이스 2(TASK 없는 브랜치) 시스템 외 명시 / `/task-close` 자동 삭제 + 워크트리 제거 면제 조항 / 멀티세션 워크트리 정책 섹션 신규 (메인=dev 전용 / SSoT 조회 / 머지 락 직렬화) |
285
304
  | 2026-05-31 | 0.1.2 백로그 스킬 추가 정합 — 출처 표 `BL-NNN` 채번 주체 `/backlog-add` → `/add-backlog`로 갱신 + 버전별 경로(`.project/tasks/<vX.X>/BACKLOG.md`) 명시 |
286
305
  | 2026-06-02 | 0.1.3 F2·F3 정합 — §멀티세션 워크트리 정책 *메인 HEAD 떼기 금지* + *모호 발화 자의 해석 금지* / §git-guard.sh 5종 변형 인식 (-C / --git-dir / --work-tree) + 셸 prefix 금지 명시. stash FRICTION_LOG 2026-06-01 반영 |
306
+ | 2026-06-25 | 추적 변경 0(코드 0 · `.project` gitignore) close 시 마커 빈커밋으로 분기·채번 정보 보존 — `--no-ff` 머지 커밋 미생성 케이스의 `--allow-empty` 유일 예외 명시 (상세: task-close Step 6-8). FRICTION 검토 F1 반영 |
307
+ | 2026-06-25 | §멀티세션 워크트리 정책에 "워크트리 실행 환경" 추가 — 워크트리에 의존성 심링크 금지(개발 서버 fs 접근 제한으로 로딩 실패), 실행·검수 task는 워크트리 안에 의존성 실제 마련. FRICTION 검토 F6 반영 |
308
+ | 2026-06-25 | §멀티세션 워크트리 정책에 "멀티세션 검수 환경" 추가 — task별 dev 서버 포트 격리(메인=기준 포트, task=기준+TASK번호) + 터널 독립 + close 시 자기 것만 종료(광역 종료 금지) + 사용자 검수 시점 서버 자동 기동(task-test UNCERTAIN/PASS·task-dev 종료, FAIL 제외). FRICTION 검토 F7 반영 |
@@ -31,7 +31,7 @@ UX/UI 구현 task의 *시각 영역 사전 정합* + *task-test 시 USER 검수
31
31
 
32
32
  ## 3. 파일 위치 / 네이밍
33
33
 
34
- - **경로**: `.project/tasks/<vX.X>/mockup/<task-doc-name>-mockup.html`
34
+ - **경로**: `.project/tasks/<NNN_slug>/mockup/<task-doc-name>-mockup.html`
35
35
  - **네이밍**: task 문서 파일명 + `-mockup.html`
36
36
  - 예 1: `001_login-form.md` → `001_login-form-mockup.html`
37
37
  - 예 2: 폴더 승격 `TASK-007_payment-flow/task.md` → `TASK-007_payment-flow-mockup.html`
@@ -11,10 +11,10 @@
11
11
 
12
12
  | 생성일 | 플랜 | 유형 | 규모 | 상태 |
13
13
  |--------|------|------|------|------|
14
- | 2026-05-08 | v1.0 | feature | medium | developing |
14
+ | 2026-05-08 | 001_mvp | feature | medium | developing |
15
15
 
16
16
  - **생성일**: ISO 형식 (YYYY-MM-DD)
17
- - **플랜**: 어느 plan 버전 하위인지 (예: v1.0, v2.0, alpha) — `tasks/<vX.X>/` 디렉토리 명과 일치
17
+ - **플랜**: 어느 plan(기능 그룹) 하위인지 (예: 001_mvp, 002_compare-products) — `tasks/<NNN_slug>/` 디렉토리 명과 일치
18
18
  - **유형**: `feature` / `bug` / `improvement` / `refactor` / `docs` / `chore` (git 브랜치 타입과 직결)
19
19
  - **규모**:
20
20
  - `micro` — 구현 파트 1개 (단일 함수/설정 수정)
@@ -93,16 +93,17 @@ draft → planned → developing → developed → testing → tested → closed
93
93
 
94
94
  | 항목 | 위치 | 작성 주체 |
95
95
  |------|------|---------|
96
- | 단일 파일 task | `.project/tasks/<vX.X>/<NNN>_<slug>.md` (예: `001_login-feature.md`) | `/task-init` |
97
- | 폴더 승격 task | `.project/tasks/<vX.X>/TASK-<NNN>_<slug>/task.md` | `/task-init` (규모 large 또는 사용자 명시 또는 추가 자료 다수) |
98
- | spec-diffs (변경된 plan 문서 추적) | `.project/tasks/<vX.X>/spec-diffs/<NNN>_<slug>_spec-diff.md` (**vX.X 공통** — 단일/폴더 모두) | `/task-plan` Step 6 (Phase 0 변경 시) |
99
- | screenshots (UI 작업 자료) | `.project/tasks/<vX.X>/screenshots/<NNN>_*.png` (**vX.X 공통**) | `/task-test` 격리 세션 또는 메인 |
100
- | mockup (UX/UI HTML 목업) | `.project/tasks/<vX.X>/mockup/<task-doc-name>-mockup.html` (**vX.X 공통** — 단일/폴더 모두) | `/task-plan` Step 4.5 (UX/UI task 한정) — 단일 진실 소스 `MOCKUP_RULE.md` |
96
+ | 단일 파일 task | `.project/tasks/<NNN_slug>/<NNN>_<slug>.md` (예: `001_login-feature.md`) | `/task-init` |
97
+ | 폴더 승격 task | `.project/tasks/<NNN_slug>/TASK-<NNN>_<slug>/task.md` | `/task-init` (*사용자 명시 시에만* — 규모 large여도 자동 승격 X) |
98
+ | spec-diffs (변경된 제품 문서(루트) 추적) | `.project/tasks/<NNN_slug>/spec-diffs/<NNN>_<slug>_spec-diff.md` (**`<NNN_slug>` 공통** — 단일/폴더 모두) | `/task-plan` Step 6 (Phase 0 변경 시) |
99
+ | screenshots (UI 작업 자료) | `.project/tasks/<NNN_slug>/screenshots/<NNN>_*.png` (**`<NNN_slug>` 공통**) | `/task-test` 격리 세션 또는 메인 |
100
+ | mockup (UX/UI HTML 목업) | `.project/tasks/<NNN_slug>/mockup/<task-doc-name>-mockup.html` (**`<NNN_slug>` 공통** — 단일/폴더 모두) | `/task-plan` Step 4.5 (UX/UI task 한정) — 단일 진실 소스 `MOCKUP_RULE.md` |
101
101
  | 폴더 승격 task의 추가 자료 (서브 문서 등) | `TASK-<NNN>_<slug>/` 안 자유 | 메인 / `/task-dev` |
102
102
 
103
103
  **원칙**:
104
- - spec-diffs / screenshots / mockup은 *vX.X 공통* — 파일명 NNN prefix 또는 task 문서 파일명으로 task 식별. 폴더 승격 task도 동일 (별도 spec-diffs/screenshots/mockup 만들지 X).
105
- - vX.X 공통 디렉토리는 `/plan-init` Step 5가 mkdir.
104
+ - spec-diffs / screenshots / mockup은 *`<NNN_slug>` 공통* — 파일명 NNN prefix 또는 task 문서 파일명으로 task 식별. 폴더 승격 task도 동일 (별도 spec-diffs/screenshots/mockup 만들지 X).
105
+ - `<NNN_slug>` 공통 디렉토리는 `/plan-init`이 mkdir.
106
+ - **spec-diff = per-task 기록** — 그 task가 어느 *제품 문서(`.project/` 루트)*를 NEW/MOD/DEL 했는지의 task 산출물. 제품 문서의 *정식 변경 이력은 git*이 단일 진실이며, 별도 전역 변경 인덱스는 두지 않는다.
106
107
  - 폴더 승격은 *task의 추가 자료*용 (서브 문서 / 디자인 자료 등) — *spec-diffs / screenshots / mockup 위치 X*.
107
108
 
108
109
  **closed-immutable hook 보호 범위** — task.md 본 파일만 (단일 파일 또는 폴더 승격 task.md). spec-diffs / screenshots / mockup / 폴더 승격 추가 자료는 *역사적 자료*로 자유 수정.
@@ -113,13 +114,13 @@ draft → planned → developing → developed → testing → tested → closed
113
114
 
114
115
  ### 2.1 헤더 작성 (`/task-init`)
115
116
 
116
- 1. `tasks/<vX.X>/` 디렉토리 안 가장 큰 NNN+1로 task 번호 결정 (예: 기존 002까지 있으면 003)
117
+ 1. `tasks/<NNN_slug>/` 디렉토리 안 가장 큰 NNN+1로 task 번호 결정 (예: 기존 002까지 있으면 003)
117
118
  2. kebab-slug = 태스크 이름 한국어 → 영어 kebab-case (예: "로그인 기능 추가" → `login-feature`)
118
- 3. 파일명 = `NNN_kebab-slug.md` (예: `003_login-feature.md`). 큰 작업이면 폴더 승격 (`TASK-003_login-feature/task.md`).
119
+ 3. 파일명 = `NNN_kebab-slug.md` (예: `003_login-feature.md`). *사용자 명시 시* 폴더 승격 (`TASK-003_login-feature/task.md`) — 규모 large여도 자동 승격 X.
119
120
  4. 파일 제목 작성: `# TASK-003 — 로그인 기능 추가`
120
121
  5. 헤더 표 작성 (5컬럼 모두 채움):
121
122
  - 생성일: 오늘 (YYYY-MM-DD)
122
- - 플랜: 현재 active plan 버전 (예: v1.0)
123
+ - 플랜: 현재 active plan (예: 001_mvp — `NNN_slug` 폴더명)
123
124
  - 유형: 사용자/메인 합의 (feature/bug/...)
124
125
  - 규모: 사용자/메인 합의 (micro/small/medium/large)
125
126
  - 상태: `draft` (고정)
@@ -285,7 +286,7 @@ Test Plan 작성 완료 후 *반드시* 점검. *"누적/리셋 안 함"* 같은
285
286
 
286
287
  | 생성일 | 플랜 | 유형 | 규모 | 상태 |
287
288
  |--------|------|------|------|------|
288
- | 2026-05-08 | v1.0 | feature | small | planned |
289
+ | 2026-05-08 | 001_mvp | feature | small | planned |
289
290
  ```
290
291
 
291
292
  ### 4.2 Requirements
@@ -403,7 +404,7 @@ Test Plan 작성 완료 후 *반드시* 점검. *"누적/리셋 안 함"* 같은
403
404
 
404
405
  | 생성일 | 플랜 | 유형 | 규모 | 상태 |
405
406
  |--------|------|------|------|------|
406
- | 2026-05-08 | v1.0 | chore | micro | closed |
407
+ | 2026-05-08 | 001_mvp | chore | micro | closed |
407
408
 
408
409
  ## Requirements
409
410
  사용자 요구:
@@ -449,7 +450,7 @@ Test Plan 작성 완료 후 *반드시* 점검. *"누적/리셋 안 함"* 같은
449
450
 
450
451
  | 생성일 | 플랜 | 유형 | 규모 | 상태 |
451
452
  |--------|------|------|------|------|
452
- | 2026-05-08 | v1.0 | feature | medium | tested |
453
+ | 2026-05-08 | 001_mvp | feature | medium | tested |
453
454
 
454
455
  ## Requirements
455
456
  사용자 요구:
@@ -566,7 +567,7 @@ Test Plan 작성 완료 후 *반드시* 점검. *"누적/리셋 안 함"* 같은
566
567
 
567
568
  | 생성일 | 플랜 | 유형 | 규모 | 상태 |
568
569
  |--------|------|------|------|------|
569
- | 2026-05-08 | v1.0 | bug | small | tested |
570
+ | 2026-05-08 | 001_mvp | bug | small | tested |
570
571
 
571
572
  ## Requirements
572
573
  사용자 보고:
@@ -638,3 +639,4 @@ Test Plan 작성 완료 후 *반드시* 점검. *"누적/리셋 안 함"* 같은
638
639
  | 2026-05-09 | 표현 정제 — 인명 / 경박 표현 / 스킬 용어 / 이전 버전 비교 단락 정리 |
639
640
  | 2026-05-30 | stash FRICTION_LOG 기반 정합 — §1.5 mockup 행 추가 (vX.X 공통, 단일 진실 소스 MOCKUP_RULE) + §2.5 Test Plan 본질 재정의 (실질 동작 시나리오 + `[AUTO]` / `[USER]` 분류 강제 + 카탈로그 7방식 + UX/UI 영역 분리 매트릭스 + 시각 fix 사이클 사전 예고 + 검증 / 테스트 명령 두 섹션 참조) + §4.5 / §5 완성 예시 3개 Test Plan 형식 갱신 (분류 표 + PASS 기준 명시. 기존 번호 매김 시나리오 + 검증 명령 나열은 옛 형식). (stash FRICTION_LOG #14+19 / #25 정합) |
640
641
  | 2026-06-02 | 0.1.3 F5 정합 — §2.5 가이드라인 안티패턴 3종 추가 (grep/Read-only 보조용 / 요구사항당 end-to-end 1개 이상 / 무거운 검증 회피 금지) + 요구사항 ↔ 시나리오 커버리지 점검 단계 신설 (stash FRICTION_LOG 2026-06-01 Test Plan 동어반복 + 누락 마찰 반영) |
642
+ | 2026-06-27 | PLAYBOOK §13 정합 — plan = 기능 그룹. 헤더 *플랜* 컬럼 = `NNN_slug` 폴더명(예: 001_mvp). §1.5 경로 `tasks/<NNN_slug>/`, *`<NNN_slug>` 공통*으로 통일. spec-diff 정의 = *변경된 제품 문서(루트) 추적*(per-task 기록, 정식 변경 이력은 git 단일 진실) |
@@ -1,7 +1,7 @@
1
1
  # AGENTS.md
2
2
 
3
3
  > 이 파일은 Codex 세션이 *매 세션 시작 시 자동 로드*하는 단일 진입점이다.
4
- > 프로젝트 메타 + 검증 명령 + 룰 참조 + 스킬 9종 + 동기화 룰만 포함한다.
4
+ > 프로젝트 메타 + 검증/테스트/검수 명령 + 룰 참조 + 스킬 9종 + 동기화 룰만 포함한다.
5
5
  > 사람용 도메인 설명은 `.project/PROJECT.md`, 진입 가이드는 `.project/AGENT-GUIDE.md` 참조.
6
6
  >
7
7
  > Codex 환경 차이 (Claude와 다른 점만):
@@ -59,11 +59,16 @@
59
59
 
60
60
  ## 백로그 (0.1.2+)
61
61
 
62
- > `.project/tasks/<vX.X>/BACKLOG.md` = *버전별 task 후보 누적*. 사용자 발화로 1건씩 얕은 분석(개요 / 대상 영역) 곁들여 추가.
62
+ > `.project/tasks/<NNN_slug>/BACKLOG.md` = *plan(기능 그룹)별 task 후보 누적*. 사용자 발화로 1건씩 얕은 분석(개요 / 대상 영역) 곁들여 추가.
63
63
 
64
64
  - **`/add-backlog`**: 사용자 *"~ 백로그에 추가"* 발화 → 얕은 분석(코드 탐색 X, 추정 수준) → BL-NNN 채번 → BACKLOG.md append (`[ ]` 대기).
65
65
  - **`/task-init` 연동**: 사용자 *"백로그의 BL-NNN 진행"* 발화 → 해당 항목 *확인 마킹*. `[ ]` → `[x]` + `- TASK: TASK-NNN` 추가 (다회 진행 시 콤마).
66
- - **체크박스 의미**: `[ ]` = 미확인 (task로 옮기지 않은 메모) / `[x]` = 확인 완료 (task로 옮김). **dev 머지 완료 의미 X** — 완료 여부는 `git log dev --grep 'BL-NNN'` + 브랜치명 추적 + `taskery status`.
66
+ - **체크박스 의미**: `[ ]` = 미확인 (task로 옮기지 않은 메모) / `[x]` = 확인 완료 (task로 옮김). `[x]`는 *task로 옮겼다*는 메모일 뿐, dev 머지·완료 여부와는 무관하다.
67
+ - **`[x]` 항목이 실제로 완료된 작업인지 굳이 확인하려 들지 않는다.** 진행·완료 상태는 백로그가 아니라 `taskery status`(살아있는 브랜치) + dev 머지커밋이 판단한다.
68
+ - **머지 여부를 직접 알아야 할 경우에만** 아래 순서로 작업 완료 여부를 확인한다:
69
+ 1. `taskery status` 진행중 목록에 그 TASK가 **있으면** → 아직 진행 중(dev 미머지)이므로 `git log dev --grep`이 비는 것이 정상이다. 재조회하지 않는다.
70
+ 2. 목록에 **없으면** → `git log dev --grep 'BL-NNN'` + 브랜치명으로 작업 완료 여부를 확인한다.
71
+ - **글로벌 `.project/BACKLOG.md`** (다음 기능 그룹 후보 카탈로그) 는 본 흐름 무관 — `/plan-init` 영역.
67
72
 
68
73
  상세: `.agents/skills/add-backlog/SKILL.md`.
69
74
 
@@ -97,6 +102,18 @@
97
102
 
98
103
  ---
99
104
 
105
+ ## 검수 실행 명령 (해당 시 — 앱 실행·검수가 필요한 프로젝트)
106
+
107
+ > `/task-dev`·`/task-test`가 검수 시점(세션 중단점)에 이 명령으로 서버를 *백그라운드* 기동하고 접속 URL을 보고한다.
108
+ > 멀티세션 포트 격리: 메인/dev 세션 = 기준 포트, task 워크트리 = 기준 포트 + TASK번호. 상세는 GIT_RULE "멀티세션 검수 환경" 섹션.
109
+ > CLI/라이브러리 등 검수 서버가 없는 프로젝트는 본 섹션 전체 삭제.
110
+
111
+ - 기준 포트: `<예: 5100>`
112
+ - 실행 명령: `<예: npm run dev -- --port <PORT>>` (`<PORT>` = 기준 포트 + TASK번호, 메인/dev는 기준 포트)
113
+ - 터널 (모바일 검수 등 필요 시 — 선택): `<예: cloudflared tunnel --url http://localhost:<PORT>>`
114
+
115
+ ---
116
+
100
117
  ## 룰 문서 참조
101
118
 
102
119
  | 룰 | 위치 | 역할 |
@@ -113,14 +130,14 @@
113
130
 
114
131
  | 스킬 | 레벨 | 역할 |
115
132
  |------|------|------|
116
- | `/project-init` | project | PROJECT/AGENT-GUIDE/LINKED-REPOS/.env 골격 생성 (1회성) |
117
- | `/plan-init` | plan | `.project/plans/<vX.X>/` 안 기획 문서 작성 |
133
+ | `/project-init` | project | 진입 문서(PROJECT/AGENT-GUIDE/LINKED-REPOS/GLOSSARY/.env) + 제품 관통 문서(그룹 A 작성 / 그룹 B 골격, `.project/` 루트) 생성 (1회성) |
134
+ | `/plan-init` | plan | `.project/plans/<NNN_slug>/` PLAN/ROADMAP + 제품 관통 문서 FEATURES/UX-UI에 의도 추가 (plan = 기능 그룹 단위) |
118
135
  | `/task-init` | task | task.md 빈 골격 + status=draft |
119
136
  | `/task-plan` | task | Requirements/Scope/Dev Plan/Test Plan 작성 (draft → planned) |
120
137
  | `/task-dev` | task | Phase 순서 구현 + self-check (planned → developed) |
121
138
  | `/task-test` | task | task-tester 서브에이전트 격리 검증 (developed → tested) |
122
139
  | `/task-close` | task | 검증 명령 게이트 + 커밋 + dev 병합 (tested → closed) |
123
- | `/add-backlog` | meta | 사용자 발화로 버전별 BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
140
+ | `/add-backlog` | meta | 사용자 발화로 활성 plan BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
124
141
  | `/log-friction` | meta | FRICTION_LOG.md에 사용자 불편 한 행 기록 |
125
142
 
126
143
  본문은 `.agents/skills/<스킬>/SKILL.md` 참조.
@@ -153,7 +170,7 @@
153
170
 
154
171
  > taskery는 *plan/ ↔ template/ 자동 빌드 X*. 사용자가 직접 정합 유지.
155
172
 
156
- - **`.project/plans/<vX.X>/` 변경 시** → 관련 task의 `spec-diffs/` 갱신 (`/task-plan` Phase 0 흐름 — 진행 중 task 있으면)
173
+ - **`.project/` 루트 제품 관통 문서 변경 시** → 관련 task의 `spec-diffs/` 갱신 (`/task-plan` Phase 0 흐름 — 진행 중 task 있으면)
157
174
  - **`AGENTS.md` 검증 명령 변경 시** → 모든 스킬 + hook이 그대로 따름. 별도 동기화 불필요
158
175
  - **룰(`*.md` in `.project/rules/`) 변경 시** → 스킬 instruction이 다음 호출부터 변경 반영
159
176
  - **`*.local.md` 사용자 오버라이드** → `npx @angar2/taskery update`가 미터치. 코어 룰 갱신 시 `*.bak` 백업 후 사용자 confirm
@@ -174,5 +191,5 @@
174
191
 
175
192
  1. 본 파일(`AGENTS.md`) 정독 — 검증 명령 + 룰 위치 + 스킬 목록 파악
176
193
  2. `.project/AGENT-GUIDE.md` 정독 — 활성 plan 버전 + 폴더 구조 + 작업 흐름
177
- 3. `.project/plans/<활성버전>/PLAN.md` 정독 — 기획 문서 인덱스 + 진행 상태
194
+ 3. `.project/` 루트 제품 관통 문서(FEATURES / ARCHITECTURE 등) + `.project/plans/<활성 plan>/PLAN.md` 정독 — 활성 plan 인덱스 + 진행 상태
178
195
  4. 사용자 발화 받기 → 적절한 스킬 호출 또는 직접 작업
@@ -1,7 +1,7 @@
1
1
  # CLAUDE.md
2
2
 
3
3
  > 이 파일은 메인 세션이 *매 세션 시작 시 자동 로드*하는 단일 진입점이다.
4
- > 프로젝트 메타 + 검증 명령 + 룰 참조 + 스킬 9종 + 동기화 룰만 포함한다.
4
+ > 프로젝트 메타 + 검증/테스트/검수 명령 + 룰 참조 + 스킬 9종 + 동기화 룰만 포함한다.
5
5
  > 사람용 도메인 설명은 `.project/PROJECT.md`, 진입 가이드는 `.project/AGENT-GUIDE.md` 참조.
6
6
 
7
7
  ---
@@ -54,12 +54,16 @@
54
54
 
55
55
  ## 백로그 (0.1.2+)
56
56
 
57
- > `.project/tasks/<vX.X>/BACKLOG.md` = *버전별 task 후보 누적*. 사용자 발화로 1건씩 얕은 분석(개요 / 대상 영역) 곁들여 추가.
57
+ > `.project/tasks/<NNN_slug>/BACKLOG.md` = *plan(기능 그룹)별 task 후보 누적*. 사용자 발화로 1건씩 얕은 분석(개요 / 대상 영역) 곁들여 추가.
58
58
 
59
59
  - **`/add-backlog`**: 사용자 *"~ 백로그에 추가"* 발화 → 얕은 분석(코드 탐색 X, 추정 수준) → BL-NNN 채번 → BACKLOG.md append (`[ ]` 대기).
60
60
  - **`/task-init` 연동**: 사용자 *"백로그의 BL-NNN 진행"* 발화 → 해당 항목 *확인 마킹*. `[ ]` → `[x]` + `- TASK: TASK-NNN` 추가 (다회 진행 시 콤마).
61
- - **체크박스 의미**: `[ ]` = 미확인 (task로 옮기지 않은 메모) / `[x]` = 확인 완료 (task로 옮김). **dev 머지 완료 의미 X** — 완료 여부는 `git log dev --grep 'BL-NNN'` + 브랜치명 추적 + `taskery status`.
62
- - **글로벌 `.project/BACKLOG.md`** (plan 기획 후보 카탈로그) 는 본 흐름 무관 — `/plan-init` 영역.
61
+ - **체크박스 의미**: `[ ]` = 미확인 (task로 옮기지 않은 메모) / `[x]` = 확인 완료 (task로 옮김). `[x]`는 *task로 옮겼다*는 메모일 뿐, dev 머지·완료 여부와는 무관하다.
62
+ - **`[x]` 항목이 실제로 완료된 작업인지 굳이 확인하려 들지 않는다.** 진행·완료 상태는 백로그가 아니라 `taskery status`(살아있는 브랜치) + dev 머지커밋이 판단한다.
63
+ - **머지 여부를 직접 알아야 할 경우에만** 아래 순서로 작업 완료 여부를 확인한다:
64
+ 1. `taskery status` 진행중 목록에 그 TASK가 **있으면** → 아직 진행 중(dev 미머지)이므로 `git log dev --grep`이 비는 것이 정상이다. 재조회하지 않는다.
65
+ 2. 목록에 **없으면** → `git log dev --grep 'BL-NNN'` + 브랜치명으로 작업 완료 여부를 확인한다.
66
+ - **글로벌 `.project/BACKLOG.md`** (다음 기능 그룹 후보 카탈로그) 는 본 흐름 무관 — `/plan-init` 영역.
63
67
 
64
68
  상세: `.claude/skills/add-backlog/SKILL.md`.
65
69
 
@@ -93,6 +97,18 @@
93
97
 
94
98
  ---
95
99
 
100
+ ## 검수 실행 명령 (해당 시 — 앱 실행·검수가 필요한 프로젝트)
101
+
102
+ > `/task-dev`·`/task-test`가 검수 시점(세션 중단점)에 이 명령으로 서버를 *백그라운드* 기동하고 접속 URL을 보고한다.
103
+ > 멀티세션 포트 격리: 메인/dev 세션 = 기준 포트, task 워크트리 = 기준 포트 + TASK번호. 상세는 GIT_RULE "멀티세션 검수 환경" 섹션.
104
+ > CLI/라이브러리 등 검수 서버가 없는 프로젝트는 본 섹션 전체 삭제.
105
+
106
+ - 기준 포트: `<예: 5100>`
107
+ - 실행 명령: `<예: npm run dev -- --port <PORT>>` (`<PORT>` = 기준 포트 + TASK번호, 메인/dev는 기준 포트)
108
+ - 터널 (모바일 검수 등 필요 시 — 선택): `<예: cloudflared tunnel --url http://localhost:<PORT>>`
109
+
110
+ ---
111
+
96
112
  ## 룰 문서 참조
97
113
 
98
114
  | 룰 | 위치 | 역할 |
@@ -109,14 +125,14 @@
109
125
 
110
126
  | 스킬 | 레벨 | 역할 |
111
127
  |------|------|------|
112
- | `/project-init` | project | PROJECT/AGENT-GUIDE/LINKED-REPOS/.env 골격 생성 (1회성) |
113
- | `/plan-init` | plan | `.project/plans/<vX.X>/` 안 기획 문서 작성 |
128
+ | `/project-init` | project | 진입 문서(PROJECT/AGENT-GUIDE/LINKED-REPOS/GLOSSARY/.env) + 제품 관통 문서(그룹 A 작성 / 그룹 B 골격, `.project/` 루트) 생성 (1회성) |
129
+ | `/plan-init` | plan | `.project/plans/<NNN_slug>/` PLAN/ROADMAP + 제품 관통 문서 FEATURES/UX-UI에 의도 추가 (plan = 기능 그룹 단위) |
114
130
  | `/task-init` | task | task.md 빈 골격 + status=draft |
115
131
  | `/task-plan` | task | Requirements/Scope/Dev Plan/Test Plan 작성 (draft → planned) |
116
132
  | `/task-dev` | task | Phase 순서 구현 + self-check (planned → developed) |
117
133
  | `/task-test` | task | Task tool 격리 검증 (developed → tested) |
118
134
  | `/task-close` | task | 검증 명령 게이트 + 커밋 + dev 병합 (tested → closed) |
119
- | `/add-backlog` | meta | 사용자 발화로 버전별 BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
135
+ | `/add-backlog` | meta | 사용자 발화로 활성 plan BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
120
136
  | `/log-friction` | meta | FRICTION_LOG.md에 사용자 불편 한 행 기록 |
121
137
 
122
138
  본문은 `.claude/skills/<스킬>/SKILL.md` 참조.
@@ -147,7 +163,7 @@
147
163
 
148
164
  > taskery는 *plan/ ↔ template/ 자동 빌드 X*. 사용자가 직접 정합 유지.
149
165
 
150
- - **`.project/plans/<vX.X>/` 변경 시** → 관련 task의 `spec-diffs/` 갱신 (`/task-plan` Phase 0 흐름 — 진행 중 task 있으면)
166
+ - **`.project/` 루트 제품 관통 문서 변경 시** → 관련 task의 `spec-diffs/` 갱신 (`/task-plan` Phase 0 흐름 — 진행 중 task 있으면)
151
167
  - **`CLAUDE.md` 검증 명령 변경 시** → 모든 스킬 + hook이 그대로 따름. 별도 동기화 불필요
152
168
  - **룰(`*.md` in `.project/rules/`) 변경 시** → 스킬 instruction이 다음 호출부터 변경 반영
153
169
  - **`*.local.md` 사용자 오버라이드** → `npx @angar2/taskery update`가 미터치. 코어 룰 갱신 시 `*.bak` 백업 후 사용자 confirm
@@ -168,5 +184,5 @@
168
184
 
169
185
  1. 본 파일(`CLAUDE.md`) 정독 — 검증 명령 + 룰 위치 + 스킬 목록 파악
170
186
  2. `.project/AGENT-GUIDE.md` 정독 — 활성 plan 버전 + 폴더 구조 + 작업 흐름
171
- 3. `.project/plans/<활성버전>/PLAN.md` 정독 — 기획 문서 인덱스 + 진행 상태
187
+ 3. `.project/` 루트 제품 관통 문서(FEATURES / ARCHITECTURE 등) + `.project/plans/<활성 plan>/PLAN.md` 정독 — 활성 plan 인덱스 + 진행 상태
172
188
  4. 사용자 발화 받기 → 적절한 스킬 호출 또는 직접 작업