@angar2/taskery 0.2.1 → 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.1",
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
 
@@ -134,7 +134,7 @@ docs: [TASK-{NNN}] CHANGELOG 업데이트
134
134
  - `-m` 옵션으로 커밋 메시지 지정 금지
135
135
  - **`--no-ff` 강제 (일반 타입)**: feature/bug/improvement/refactor 등 일반 작업 브랜치 → dev 병합 시 `git merge --no-ff {브랜치명}` 사용. fast-forward 병합 절대 금지. 머지 커밋이 없으면 작업 브랜치 삭제 후 분기 정보 영구 손실(90일 reflog GC 후 추적 불가).
136
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 신규/카피)에 한정 `--ff-only` 가능.
137
+ - **plan/roadmap 임시 docs 브랜치 예외**: plan-init 단계의 단일 커밋(plan 신규 생성 — PLAN/ROADMAP + 제품 관통 문서 delta)에 한정 `--ff-only` 가능.
138
138
  - **task 진행 중 ROADMAP/플랜 문서 갱신은 별도 `docs/*` 브랜치 분리 절대 금지**: 해당 task의 작업 브랜치 (`feature/*` / `improve/*` 등) 안에서 수정 + 다른 구현 커밋과 함께 `--no-ff` 머지로 dev 병합 (분기 정보 손실 방지).
139
139
 
140
140
  ---
@@ -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 단일 진실) |
@@ -59,7 +59,7 @@
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` 추가 (다회 진행 시 콤마).
@@ -68,6 +68,7 @@
68
68
  - **머지 여부를 직접 알아야 할 경우에만** 아래 순서로 작업 완료 여부를 확인한다:
69
69
  1. `taskery status` 진행중 목록에 그 TASK가 **있으면** → 아직 진행 중(dev 미머지)이므로 `git log dev --grep`이 비는 것이 정상이다. 재조회하지 않는다.
70
70
  2. 목록에 **없으면** → `git log dev --grep 'BL-NNN'` + 브랜치명으로 작업 완료 여부를 확인한다.
71
+ - **글로벌 `.project/BACKLOG.md`** (다음 기능 그룹 후보 카탈로그) 는 본 흐름 무관 — `/plan-init` 영역.
71
72
 
72
73
  상세: `.agents/skills/add-backlog/SKILL.md`.
73
74
 
@@ -129,14 +130,14 @@
129
130
 
130
131
  | 스킬 | 레벨 | 역할 |
131
132
  |------|------|------|
132
- | `/project-init` | project | PROJECT/AGENT-GUIDE/LINKED-REPOS/.env 골격 생성 (1회성) |
133
- | `/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 = 기능 그룹 단위) |
134
135
  | `/task-init` | task | task.md 빈 골격 + status=draft |
135
136
  | `/task-plan` | task | Requirements/Scope/Dev Plan/Test Plan 작성 (draft → planned) |
136
137
  | `/task-dev` | task | Phase 순서 구현 + self-check (planned → developed) |
137
138
  | `/task-test` | task | task-tester 서브에이전트 격리 검증 (developed → tested) |
138
139
  | `/task-close` | task | 검증 명령 게이트 + 커밋 + dev 병합 (tested → closed) |
139
- | `/add-backlog` | meta | 사용자 발화로 버전별 BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
140
+ | `/add-backlog` | meta | 사용자 발화로 활성 plan BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
140
141
  | `/log-friction` | meta | FRICTION_LOG.md에 사용자 불편 한 행 기록 |
141
142
 
142
143
  본문은 `.agents/skills/<스킬>/SKILL.md` 참조.
@@ -169,7 +170,7 @@
169
170
 
170
171
  > taskery는 *plan/ ↔ template/ 자동 빌드 X*. 사용자가 직접 정합 유지.
171
172
 
172
- - **`.project/plans/<vX.X>/` 변경 시** → 관련 task의 `spec-diffs/` 갱신 (`/task-plan` Phase 0 흐름 — 진행 중 task 있으면)
173
+ - **`.project/` 루트 제품 관통 문서 변경 시** → 관련 task의 `spec-diffs/` 갱신 (`/task-plan` Phase 0 흐름 — 진행 중 task 있으면)
173
174
  - **`AGENTS.md` 검증 명령 변경 시** → 모든 스킬 + hook이 그대로 따름. 별도 동기화 불필요
174
175
  - **룰(`*.md` in `.project/rules/`) 변경 시** → 스킬 instruction이 다음 호출부터 변경 반영
175
176
  - **`*.local.md` 사용자 오버라이드** → `npx @angar2/taskery update`가 미터치. 코어 룰 갱신 시 `*.bak` 백업 후 사용자 confirm
@@ -190,5 +191,5 @@
190
191
 
191
192
  1. 본 파일(`AGENTS.md`) 정독 — 검증 명령 + 룰 위치 + 스킬 목록 파악
192
193
  2. `.project/AGENT-GUIDE.md` 정독 — 활성 plan 버전 + 폴더 구조 + 작업 흐름
193
- 3. `.project/plans/<활성버전>/PLAN.md` 정독 — 기획 문서 인덱스 + 진행 상태
194
+ 3. `.project/` 루트 제품 관통 문서(FEATURES / ARCHITECTURE 등) + `.project/plans/<활성 plan>/PLAN.md` 정독 — 활성 plan 인덱스 + 진행 상태
194
195
  4. 사용자 발화 받기 → 적절한 스킬 호출 또는 직접 작업
@@ -54,7 +54,7 @@
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` 추가 (다회 진행 시 콤마).
@@ -63,7 +63,7 @@
63
63
  - **머지 여부를 직접 알아야 할 경우에만** 아래 순서로 작업 완료 여부를 확인한다:
64
64
  1. `taskery status` 진행중 목록에 그 TASK가 **있으면** → 아직 진행 중(dev 미머지)이므로 `git log dev --grep`이 비는 것이 정상이다. 재조회하지 않는다.
65
65
  2. 목록에 **없으면** → `git log dev --grep 'BL-NNN'` + 브랜치명으로 작업 완료 여부를 확인한다.
66
- - **글로벌 `.project/BACKLOG.md`** (plan 기획 후보 카탈로그) 는 본 흐름 무관 — `/plan-init` 영역.
66
+ - **글로벌 `.project/BACKLOG.md`** (다음 기능 그룹 후보 카탈로그) 는 본 흐름 무관 — `/plan-init` 영역.
67
67
 
68
68
  상세: `.claude/skills/add-backlog/SKILL.md`.
69
69
 
@@ -125,14 +125,14 @@
125
125
 
126
126
  | 스킬 | 레벨 | 역할 |
127
127
  |------|------|------|
128
- | `/project-init` | project | PROJECT/AGENT-GUIDE/LINKED-REPOS/.env 골격 생성 (1회성) |
129
- | `/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 = 기능 그룹 단위) |
130
130
  | `/task-init` | task | task.md 빈 골격 + status=draft |
131
131
  | `/task-plan` | task | Requirements/Scope/Dev Plan/Test Plan 작성 (draft → planned) |
132
132
  | `/task-dev` | task | Phase 순서 구현 + self-check (planned → developed) |
133
133
  | `/task-test` | task | Task tool 격리 검증 (developed → tested) |
134
134
  | `/task-close` | task | 검증 명령 게이트 + 커밋 + dev 병합 (tested → closed) |
135
- | `/add-backlog` | meta | 사용자 발화로 버전별 BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
135
+ | `/add-backlog` | meta | 사용자 발화로 활성 plan BACKLOG.md에 항목 1건 추가 (얕은 분석 + BL-NNN 채번 — 0.1.2+) |
136
136
  | `/log-friction` | meta | FRICTION_LOG.md에 사용자 불편 한 행 기록 |
137
137
 
138
138
  본문은 `.claude/skills/<스킬>/SKILL.md` 참조.
@@ -163,7 +163,7 @@
163
163
 
164
164
  > taskery는 *plan/ ↔ template/ 자동 빌드 X*. 사용자가 직접 정합 유지.
165
165
 
166
- - **`.project/plans/<vX.X>/` 변경 시** → 관련 task의 `spec-diffs/` 갱신 (`/task-plan` Phase 0 흐름 — 진행 중 task 있으면)
166
+ - **`.project/` 루트 제품 관통 문서 변경 시** → 관련 task의 `spec-diffs/` 갱신 (`/task-plan` Phase 0 흐름 — 진행 중 task 있으면)
167
167
  - **`CLAUDE.md` 검증 명령 변경 시** → 모든 스킬 + hook이 그대로 따름. 별도 동기화 불필요
168
168
  - **룰(`*.md` in `.project/rules/`) 변경 시** → 스킬 instruction이 다음 호출부터 변경 반영
169
169
  - **`*.local.md` 사용자 오버라이드** → `npx @angar2/taskery update`가 미터치. 코어 룰 갱신 시 `*.bak` 백업 후 사용자 confirm
@@ -184,5 +184,5 @@
184
184
 
185
185
  1. 본 파일(`CLAUDE.md`) 정독 — 검증 명령 + 룰 위치 + 스킬 목록 파악
186
186
  2. `.project/AGENT-GUIDE.md` 정독 — 활성 plan 버전 + 폴더 구조 + 작업 흐름
187
- 3. `.project/plans/<활성버전>/PLAN.md` 정독 — 기획 문서 인덱스 + 진행 상태
187
+ 3. `.project/` 루트 제품 관통 문서(FEATURES / ARCHITECTURE 등) + `.project/plans/<활성 plan>/PLAN.md` 정독 — 활성 plan 인덱스 + 진행 상태
188
188
  4. 사용자 발화 받기 → 적절한 스킬 호출 또는 직접 작업
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: add-backlog
3
- description: 사용자 발화로 *버전별* tasks/<vX.X>/BACKLOG.md에 task 후보 1건 추가 — 얕은 분석(개요/대상 영역) + BL-NNN 채번 + withMetaLock 직렬화 (0.1.2+)
3
+ description: 사용자 발화로 *plan(기능 그룹)별* tasks/<NNN_slug>/BACKLOG.md에 task 후보 1건 추가 — 얕은 분석(개요/대상 영역) + BL-NNN 채번 + withMetaLock 직렬화 (0.1.2+)
4
4
  ---
5
5
 
6
6
  # /add-backlog
7
7
 
8
8
  ## 개요
9
9
 
10
- `/add-backlog`는 사용자 발화를 받아 *버전별 백로그* `.project/tasks/<vX.X>/BACKLOG.md`에 task 후보를 1건씩 누적한다. 멀티세션 환경에서 `withMetaLock`으로 동시 쓰기 직렬화. **얕은 분석**만 — 코드 직접 탐색 X, 추정 수준. 본격 분석은 다음 단계 `/task-plan`에서.
10
+ `/add-backlog`는 사용자 발화를 받아 *plan(기능 그룹)별 백로그* `.project/tasks/<NNN_slug>/BACKLOG.md`에 task 후보를 1건씩 누적한다. 멀티세션 환경에서 `withMetaLock`으로 동시 쓰기 직렬화. **얕은 분석**만 — 코드 직접 탐색 X, 추정 수준. 본격 분석은 다음 단계 `/task-plan`에서.
11
11
 
12
12
  글로벌 `.project/BACKLOG.md` (plan 기획 후보 카탈로그) 는 `/plan-init` 영역으로 본 스킬 무관.
13
13
 
@@ -30,8 +30,8 @@ description: 사용자 발화로 *버전별* tasks/<vX.X>/BACKLOG.md에 task 후
30
30
  MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
31
31
  ```
32
32
  - 메인 워크트리 dev 체크아웃 검증 — 위배 시 사용자 호출 + 중단
33
- - 활성 버전 검출 — `$MAIN_WT/.project/AGENT-GUIDE.md` `## 활성 plan 버전` 섹션 다음 비어 있지 않은 첫 줄에서 `vX.X` 패턴 추출
34
- - BACKLOG.md 경로 = `$MAIN_WT/.project/tasks/<vX.X>/BACKLOG.md`. 부재 시 사용자 호출: *"`/plan-init` 먼저 호출해 활성 버전 디렉토리 + 빈 BACKLOG.md 생성 필요"* + 중단
33
+ - 활성 plan 검출 — `$MAIN_WT/.project/AGENT-GUIDE.md` `## 활성 plan 버전` 섹션 다음 비어 있지 않은 첫 줄에서 활성 plan 식별자(첫 토큰 — `NNN_slug` 폴더명) 추출
34
+ - BACKLOG.md 경로 = `$MAIN_WT/.project/tasks/<NNN_slug>/BACKLOG.md`. 부재 시 사용자 호출: *"`/plan-init` 먼저 호출해 활성 plan 디렉토리 + 빈 BACKLOG.md 생성 필요"* + 중단
35
35
 
36
36
  ### Step 2 — 백로그 항목 후보 추출
37
37
 
@@ -82,7 +82,7 @@ const blNum = await lib.appendBacklogItem(MAIN_WT, {
82
82
  ### Step 6 — 결과 보고
83
83
 
84
84
  ```
85
- ✅ BL-<NNN> [<유형>] <제목> — <vX.X> 백로그 추가됐어.
85
+ ✅ BL-<NNN> [<유형>] <제목> — <NNN_slug> 백로그 추가됐어.
86
86
  - 개요: <개요>
87
87
  - 대상 영역: <대상 영역>
88
88
  - 슬러그: <slug>
@@ -92,7 +92,7 @@ const blNum = await lib.appendBacklogItem(MAIN_WT, {
92
92
  ## 도구 가이드
93
93
 
94
94
  - **Bash**: 메인 워크트리 검출 / dev 체크아웃 검증
95
- - **Read**: `$MAIN_WT/.project/AGENT-GUIDE.md` (활성 버전 검출) / 기존 BACKLOG.md 정독 (중복 / 유사 항목 사전 확인)
95
+ - **Read**: `$MAIN_WT/.project/AGENT-GUIDE.md` (활성 plan 검출) / 기존 BACKLOG.md 정독 (중복 / 유사 항목 사전 확인)
96
96
  - **bin/lib.js**: `getActiveVersion` / `getBacklogPath` / `appendBacklogItem` 호출
97
97
  - **AskUserQuestion**: 유형 모호 시 confirm — 한 번에 한 질문
98
98
 
@@ -101,9 +101,9 @@ const blNum = await lib.appendBacklogItem(MAIN_WT, {
101
101
  - **얕은 분석만** — 본 스킬에서 도메인 코드 Read · Grep 금지. 본격 분석은 `/task-plan`
102
102
  - **유형 자동 추정 + 모호 시 confirm** — *"메뉴 검색 개선"* 같이 feature/improve 모호 시 사용자 결정 받기
103
103
  - **메인 워크트리 dev 검증 누락 X** — 위배 시 즉시 중단. 워크트리 안에서 호출돼도 메인 절대 경로의 BACKLOG.md에 쓰기
104
- - **활성 버전 부재 시 즉시 중단** — `AGENT-GUIDE.md` 부재 / `## 활성 plan 버전` 섹션 부재 / vX.X 패턴 추출 실패 모두 명확한 에러 메시지 후 사용자 호출
104
+ - **활성 plan 부재 시 즉시 중단** — `AGENT-GUIDE.md` 부재 / `## 활성 plan 버전` 섹션 부재 / plan 식별자 미설정(`<예: …>` 자리표시자) 모두 명확한 에러 메시지 후 사용자 호출
105
105
  - **결정적 슬러그 best-effort** — LLM 비결정성 수용. race 차단 본체는 SSoT 2층(`/task-init` §4.4)이 담당. 슬러그 변형 발생 시 사용자 confirm
106
- - **글로벌 BACKLOG.md (plan 기획 후보)** 와 혼동 X — 본 스킬은 *버전별*만 다룸. 글로벌은 `/plan-init` 영역
106
+ - **글로벌 BACKLOG.md (plan 기획 후보)** 와 혼동 X — 본 스킬은 *활성 plan(기능 그룹)별*만 다룸. 글로벌은 `/plan-init` 영역
107
107
  - **자동 추정 진행 X** — 유형 / 제목 / 개요 / 대상 영역 모두 사용자 OK 또는 명백한 발화 매칭 후에만 BACKLOG.md 쓰기
108
108
 
109
109
  ## 상태 전이