@angar2/taskery 0.1.0 → 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.
Files changed (30) hide show
  1. package/README.md +207 -65
  2. package/bin/init.js +45 -2
  3. package/bin/lib.js +397 -3
  4. package/bin/prune.js +189 -0
  5. package/bin/status.js +148 -0
  6. package/bin/taskery.js +25 -0
  7. package/bin/update.js +26 -2
  8. package/package.json +7 -3
  9. package/template/.claude/hooks/closed-immutable.sh +5 -4
  10. package/template/.claude/hooks/git-guard.sh +1 -1
  11. package/template/.claude/settings.json +1 -2
  12. package/template/.claude/skills/add-backlog/SKILL.md +117 -0
  13. package/template/.claude/skills/log-friction/SKILL.md +76 -0
  14. package/template/.claude/skills/{plan-init.md → plan-init/SKILL.md} +28 -4
  15. package/template/.claude/skills/{project-init.md → project-init/SKILL.md} +60 -7
  16. package/template/.claude/skills/task-close/SKILL.md +351 -0
  17. package/template/.claude/skills/{task-dev.md → task-dev/SKILL.md} +54 -8
  18. package/template/.claude/skills/task-init/SKILL.md +283 -0
  19. package/template/.claude/skills/{task-plan.md → task-plan/SKILL.md} +115 -18
  20. package/template/.claude/skills/{task-test.md → task-test/SKILL.md} +60 -18
  21. package/template/.project/FRICTION_LOG.md +6 -13
  22. package/template/.project/rules/CHANGELOG_RULE.md +91 -0
  23. package/template/.project/rules/GIT_RULE.md +119 -8
  24. package/template/.project/rules/MOCKUP_RULE.md +85 -0
  25. package/template/.project/rules/TASK_DOC_RULE.md +78 -76
  26. package/template/CLAUDE.md +77 -12
  27. package/template/.claude/hooks/pre-commit-verify.sh +0 -97
  28. package/template/.claude/skills/refine.md +0 -177
  29. package/template/.claude/skills/task-close.md +0 -178
  30. package/template/.claude/skills/task-init.md +0 -142
package/README.md CHANGED
@@ -1,117 +1,259 @@
1
1
  # taskery
2
2
 
3
- > Claude Code 메인 세션을 위한 *가벼운 task 시스템*.
4
- > **1 메인 세션 + 스킬 8종 + catastrophic hook 3종 + npx 배포**.
3
+ AI 코딩 에이전트의 자율 개발을 위한 Task 기반의 가드레일 시스템.
5
4
 
6
5
  ---
7
6
 
8
- ## 한 줄 정신
7
+ ## 해결하는 문제
9
8
 
10
- practice 영역(SW 개발)을 process로 강제하지 않는다.
9
+ - Task 단위 라이프사이클의 가이드를 제시한다.
10
+ - 메인 세션을 단독으로 운영할 때 자주 발생하는 사고를 사전 차단한다.
11
11
 
12
- - **Process는 자동화 OK, Practice는 자유롭게 + 사용자 판단 신뢰** — 결정적 영역(린트/타입/빌드)만 강제, 휴리스틱은 강제 X
13
- - **Catastrophic만 hook 차단, 형식 위반은 instruction + 대화** — 합리적 변형 차단 사고 회피
14
- - **Top-down 선제적 작성 금지, bottoms-up** — 진짜 데이터 모이면 그때 추가 (PLAYBOOK 카탈로그 + FRICTION_LOG 패턴 ≥ 3회 트리거)
12
+ | 문제 | taskery 대응 |
13
+ |------|------------|
14
+ | AI 협업 작업이 매번 즉흥적이라 일관된 체계가 없음 | task 단위 라이프사이클로 작업 흐름 구조화 — 단계별 자동화 가능 |
15
+ | 작업 컨텍스트가 휘발되어 이전 결정·사유를 추적하기 어려움 | task 문서로 컨텍스트와 히스토리 기록 — 작업 중 참조 가능 |
16
+ | 에이전트가 catastrophic 사고를 일으킬 수 있음 | 필수 hook으로 차단 — 정상 흐름에는 무간섭 |
17
+ | 에이전트가 작성한 코드의 자가검증으로 인해 문제를 놓침 (confirmation bias) | 테스트 시 별도 격리 세션 호출(`/task-test`) — 메인 세션의 가정 없이 독립 검증 |
18
+ | 단일 메인 세션 운영으로 인해 task를 직렬로 진행해야 하는 병목 | 같은 프로젝트에서 여러 메인 세션이 독립 작업 폴더(worktree)로 병렬 진행 — 머지 시점에 직렬화로 정합성 유지 |
19
+
20
+ > catastrophic 사고 예시 — git 운영 정책 위반, 검증 우회, 완료된 task 문서 재수정 등
21
+
22
+ ---
23
+
24
+ ## 워크플로우
25
+
26
+ task 단위 라이프사이클은 7 상태로 구성된다.
27
+
28
+ **task 상태**
29
+
30
+ ```
31
+ draft → planned → developing → developed → testing → tested → closed
32
+ ```
33
+
34
+ | 상태 | 의미 |
35
+ |------|------|
36
+ | `draft` | 새 task 생성 직후 |
37
+ | `planned` | 작업 기획 완료 |
38
+ | `developing` | 구현 진행 중 |
39
+ | `developed` | 구현 완료 (자가 검증 통과) |
40
+ | `testing` | 독립 검증 진행 중 |
41
+ | `tested` | 독립 검증 완료 |
42
+ | `closed` | git 커밋 + dev 병합 완료 |
43
+
44
+ > 상태별 전이 조건과 task 문서 양식은 [TASK-DOC.md](https://github.com/angar2/taskery/blob/main/plan/TASK-DOC.md)에서 확인 가능
15
45
 
16
46
  ---
17
47
 
18
48
  ## 빠른 시작
19
49
 
50
+ > **요구 사항**: Node.js ≥ 18, git ≥ 2.31 (멀티세션 워크트리 기능 사용 시).
51
+
52
+ ### npx
53
+
54
+ 특정 프로젝트에 일회성 다운로드 방식.
55
+
20
56
  ```bash
21
57
  # 새 프로젝트
22
58
  npx -p @angar2/taskery create-taskery <project-name>
23
59
 
24
- # 기존 프로젝트에 설치
25
- cd <your-project>
60
+ # 기존 프로젝트에 도입
61
+ cd <project-name>
26
62
  npx @angar2/taskery init
27
63
 
28
- # 최신 버전 동기화
64
+ # 최신 버전 머지 갱신
29
65
  npx @angar2/taskery update
66
+
67
+ # 멀티세션 보조 명령
68
+ npx @angar2/taskery status # 진행중 태스크 / 워크트리 / 머지 락 현황
69
+ npx @angar2/taskery prune # stale 워크트리 / 브랜치 대화형 정리
70
+ ```
71
+
72
+ ### 글로벌 npm install
73
+
74
+
75
+ ```bash
76
+ # 글로벌 설치
77
+ npm install -g @angar2/taskery
78
+
79
+ # 새 프로젝트
80
+ create-taskery <project-name>
81
+
82
+ # 기존 프로젝트에 도입
83
+ cd <project-name>
84
+ taskery init
85
+
86
+ # 최신 버전 머지 갱신
87
+ taskery update
88
+
89
+ # 멀티세션 보조 명령
90
+ taskery status
91
+ taskery prune
92
+ ```
93
+
94
+ ---
95
+
96
+ ## 패키지 디렉토리 구조
97
+
98
+ `taskery init` 직후 골격:
99
+
100
+ ```
101
+ my-app/
102
+ ├─ CLAUDE.md # AI 에이전트 진입 문서
103
+ ├─ .taskery-manifest.json # 패키지 업데이트 추적
104
+ ├─ .gitignore
105
+ ├─ .claude/
106
+ │ ├─ settings.json # hook 등록 (PreToolUse 매칭)
107
+ │ ├─ skills/<skill-name>/SKILL.md # 9 skill
108
+ │ └─ hooks/<hook-name>.sh # 2 hook
109
+ └─ .project/
110
+ ├─ PROJECT.md # 프로젝트 개요
111
+ ├─ AGENT-GUIDE.md # AI 에이전트 가이드
112
+ ├─ LINKED-REPOS.md # 관계 리포지토리 정보
113
+ ├─ GLOSSARY.md # 도메인 용어집 (영문/한글 표기 일관성)
114
+ ├─ .env # 사용자 설정 환경변수 (관계 리포지토리 환경변수 등)
115
+ ├─ rules/
116
+ │ ├─ TASK_DOC_RULE.md # task 문서 작성 규칙
117
+ │ ├─ GIT_RULE.md # 로컬 깃 운영 규칙
118
+ │ ├─ CHANGELOG_RULE.md # CHANGELOG 작성 규칙
119
+ │ ├─ MOCKUP_RULE.md # UX/UI HTML 목업 규칙
120
+ │ └─ *.local.md # 사용자 오버라이드 규칙 (패키지 업데이트 대상 제외)
121
+ ├─ plans/ # plan 문서
122
+ ├─ tasks/ # task 문서 (vX.X/BACKLOG.md / spec-diffs / screenshots / mockup 포함)
123
+ ├─ flows/ # 서비스 로직 플로우 정보
124
+ ├─ changelog/ # 수정사항 정보
125
+ ├─ shared/ # 관계 리포지토리 소통 메세지함
126
+ │ ├─ sent/completed/
127
+ │ └─ received/completed/
128
+ └─ FRICTION_LOG.md # taskery 불편사항 누적 로그
30
129
  ```
31
130
 
32
- > 글로벌 install (`npm install -g @angar2/taskery`) 후엔 `taskery init` / `create-taskery <name>` 단축 명령 사용 가능.
131
+ ---
132
+
133
+ ## 멀티세션 (병렬 작업)
33
134
 
34
- 요구 사항: Node.js >=18, Claude Code (CLI / VS Code / JetBrains).
135
+ 같은 프로젝트에서 여러 메인 세션을 동시에 운영해 독립 task를 병렬로 진행한다.
136
+
137
+ - 새 task를 시작하면(`/task-init`) 작업 폴더(`~/.taskery/worktrees/<projectId>/TASK-NNN_<출처>_<슬러그>/`)와 작업 브랜치를 함께 분기한다.
138
+ - 사용자는 그 작업 폴더에서 새 메인 세션을 열어 task를 진행한다. 메인 워크트리(원본 폴더)는 `dev` 전용 상태로 유지된다.
139
+ - task 완료(`/task-close`) 시 머지 락으로 직렬화한 후 dev에 `--no-ff` 병합한다. 다른 세션이 먼저 머지해 충돌이 발생하면 본 세션이 단순/의미적/판단 불가 3단계로 해결을 시도한다.
140
+ - 머지 직후 작업 폴더와 작업 브랜치는 자동 정리된다(보존 키워드 사용 시 양쪽 유지). 안전망으로 복구 명령이 함께 출력된다.
141
+
142
+ 요건: git ≥ 2.31. 보조 명령 `npx @angar2/taskery status` / `prune`로 진행 현황과 stale 정리를 확인한다.
35
143
 
36
144
  ---
37
145
 
38
- ## 스킬 8종 — project > plan > task 위계 + 회고
146
+ ## 백로그 메모
147
+
148
+ 작업 흐름 중 발견되는 추가 기능과 버그를 *그 자리에서 짧게 적어 둔다*. 메인 세션이 사용자 발화를 받아 `/add-backlog`로 1건씩 활성 plan 버전의 `tasks/<vX.X>/BACKLOG.md`에 누적한다.
149
+
150
+ - 항목 형식: 체크박스 + 식별자(BL-NNN) + 유형 + 제목 + 슬러그. 그 아래 *개요*(추정 원인 / 구상)와 *대상 영역*(관여할 파일·모듈) 2줄.
151
+ - 시작 시점: 사용자가 *"BL-NNN 진행"*이라고 말하면 `/task-init`이 그 항목 메타로 task를 분기하고 BACKLOG.md 항목을 *확인* 마킹(`[x]`)하며 `- TASK: TASK-NNN`을 함께 남긴다. *완료*가 아니라 *task로 옮겼다*는 의미만 담는다.
152
+ - 완료 추적: git 머지 히스토리와 `taskery status`. BACKLOG.md는 메모지 역할만 한다.
153
+ - plan 후보 카탈로그(글로벌 `.project/BACKLOG.md`)는 다음 plan 버전 기획용으로 분리 관리한다.
154
+
155
+ ---
156
+
157
+ ## Skills
158
+
159
+ 스킬은 호출 시점에 따라 4 카테고리(`project` / `plan` / `task` / `meta`)로 분류된다.
160
+
161
+ - `project` — 프로젝트 첫 도입 시 1회만 호출
162
+ - `plan` — 새 기획 버전 시작 시 호출
163
+ - `task` — 새 task 작업 진행 단계에서 호출
164
+ - `meta` — 그 외 taskery 관리
39
165
 
40
166
  | 스킬 | 레벨 | 역할 |
41
167
  |------|------|------|
42
- | `/project-init` | project | PROJECT/AGENT-GUIDE/LINKED-REPOS/.env 골격 생성 (1회성) |
43
- | `/plan-init` | plan | `.project/plans/<vX.X>/` 안 기획 문서 작성 |
44
- | `/task-init` | task | task.md 빈 골격 + status=draft |
45
- | `/task-plan` | task | Requirements/Scope/Dev Plan/Test Plan 작성 |
46
- | `/task-dev` | task | Phase 순서 구현 + self-check |
47
- | `/task-test` | task | 격리 세션 검증 (confirmation bias 회피) |
48
- | `/task-close` | task | 검증 명령 게이트 + 커밋 + dev 병합 |
49
- | `/refine` | meta | FRICTION_LOG 정독 + 패턴 감지 + bottoms-up 보강 제안 |
168
+ | `/project-init` | project | 프로젝트 첫 도입 시 메타 문서와 디렉토리 골격 생성 (1회성) |
169
+ | `/plan-init` | plan | 새 기획 버전의 기획 문서 작성 |
170
+ | `/task-init` | task | 새 task의 빈 문서 생성 |
171
+ | `/task-plan` | task | task의 요구사항·범위·개발 계획·테스트 계획 작성 |
172
+ | `/task-dev` | task | 계획에 따른 단계별 구현 + 자가 검증 |
173
+ | `/task-test` | task | 별도 격리 세션에서 독립 검증 (메인 가정 차단) |
174
+ | `/task-close` | task | 최종 검증 후 git 커밋 + dev 브랜치 `--no-ff` 병합 |
175
+ | `/add-backlog` | meta | 사용자 발화로 버전별 `tasks/<vX.X>/BACKLOG.md`에 task 후보 1건씩 추가 (0.1.2+) |
176
+ | `/log-friction` | meta | 사용자 불편을 `.project/FRICTION_LOG.md`에 한 행 기록 |
177
+
178
+ 각 스킬은 슬래시로 직접 호출하거나, 사용자 발화의 의미가 스킬의 frontmatter description과 매칭되면 메인 세션이 자동으로 발동시킨다.
179
+
180
+ `/project-init`, `/plan-init`, `/task-init` 세 스킬은 호출 시 다음 문서를 생성한다.
181
+
182
+ | 스킬 | 생성 위치 | 생성 문서 |
183
+ |------|---------|---------|
184
+ | `/project-init` | `.project/` | PROJECT.md / AGENT-GUIDE.md / LINKED-REPOS.md / .env |
185
+ | `/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 (프로젝트 타입에 따라 일부 제외) |
186
+ | `/task-init` | `.project/tasks/<plan-name>/` | `<NNN>_<slug>.md` (단일 파일) 또는 `TASK-<NNN>_<slug>/task.md` (규모 `large` 시 폴더 승격) |
50
187
 
51
- 명령어 직접 호출(`/task-init` 등) 또는 메인 세션이 frontmatter description 매칭으로 자동 발동.
188
+ > 각 스킬의 호출 시점, 입력 처리 방식, 단계별 절차, 주의사항은 [SKILLS.md](https://github.com/angar2/taskery/blob/main/plan/SKILLS.md)에서 확인 가능
52
189
 
53
190
  ---
54
191
 
55
- ## Catastrophic Hook 3종
192
+ ## Hooks
56
193
 
57
- | Hook | 영역 | 잡는 것 |
58
- |------|------|--------|
59
- | `git-guard.sh` | PreToolUse(Bash) | main/dev 직접 커밋 / `--force` / `--no-verify` / `branch -D` / `reset --hard` |
60
- | `pre-commit-verify.sh` | PreToolUse(Bash) | `git commit` 시 검증 명령(린트/타입/빌드/테스트) 모두 PASS 게이트 |
61
- | `closed-immutable.sh` | PreToolUse(Write\|Edit) | `closed` 상태 task.md 본 파일 재수정 차단 |
194
+ | Hook | 작동 시점 | 차단 대상 |
195
+ |------|---------|---------|
196
+ | `git-guard.sh` | git 명령 실행 직전 | 주력 브랜치 직접 커밋 / `--force` / `--no-verify` / 강제 브랜치 삭제 / `reset --hard` / `clean -fd` |
197
+ | `closed-immutable.sh` | 파일 수정 직전 | 완료(`closed`)된 task.md 본 파일 재수정 (관련 spec-diff·스크린샷은 자유) |
62
198
 
63
- **잘 지키면 hook 작동 0회 (무해). catastrophic만 차단.**
199
+ hook은 catastrophic 사고만 차단한다. 정상 흐름에는 간섭하지 않는다.
200
+
201
+ > 각 hook의 영역 분리 정신, 등록 매칭, 차단 정책, 예외 처리 절차는 [HOOKS.md](https://github.com/angar2/taskery/blob/main/plan/HOOKS.md)에서 확인 가능
64
202
 
65
203
  ---
66
204
 
67
- ## 디렉토리 구조 (사용자 프로젝트 — `npx @angar2/taskery init` 후)
205
+ ## 워크플로우 예시
68
206
 
207
+ ```bash
208
+ # 사용자 프로젝트 첫 셋업
209
+ cd <project-name>
210
+ npx @angar2/taskery init
69
211
  ```
70
- my-app/
71
- ├─ CLAUDE.md # 메인 세션 진입점
72
- ├─ .taskery-manifest.json # 자산 manifest (npx 자동 갱신)
73
- ├─ .claude/
74
- │ ├─ settings.json # hook 등록
75
- │ ├─ skills/ # 8 스킬
76
- │ └─ hooks/ # 3 catastrophic 안전망
77
- └─ .project/
78
- ├─ PROJECT.md # /project-init 생성
79
- ├─ AGENT-GUIDE.md # /project-init 생성
80
- ├─ rules/
81
- │ ├─ TASK_DOC_RULE.md # task 양식
82
- │ └─ GIT_RULE.md # git 정책
83
- ├─ plans/ # /plan-init 생성
84
- ├─ tasks/ # /task-init 생성
85
- ├─ flows/ # /task-dev 갱신
86
- ├─ changelog/ # /task-close 갱신
87
- ├─ shared/ # 멀티리포 메시지
88
- └─ FRICTION_LOG.md # 짜증 누적
212
+
213
+ 이후 메인 세션에 진입(`CLAUDE.md` 자동 정독)하여 다음 시퀀스로 호출한다. task 5 스킬은 호출과 동시에 상태를 전이시킨다.
214
+
215
+ ```
216
+ /project-init # 진입 메타 문서와 디렉토리 골격 생성
217
+ /plan-init v1.0 # v1.0 기획 문서 작성
218
+ /task-init # draft : 첫 task의 빈 문서 생성
219
+ /task-plan TASK-001 # draft → planned : 요구사항·범위·개발 계획·테스트 계획 작성
220
+ /task-dev TASK-001 # planned → developed : 단계별 구현과 자체 검증
221
+ /task-test TASK-001 # developed → tested : 별도 격리 세션으로 독립 검증
222
+ /task-close TASK-001 # tested → closed : 최종 검증 후 git 커밋과 dev 병합
223
+
224
+ # 불편 발생 시 등록
225
+ /log-friction # 사용자 불편 한 행 기록
89
226
  ```
90
227
 
91
- ---
228
+ **자동 발동 예시** — 사용자 발화 의미가 스킬 description과 매칭되면 메인이 슬래시 직접 호출 없이 다음 스킬을 자동 발동한다.
92
229
 
93
- ## 상세 문서
230
+ - *"로그인 기능 추가해줘"* / *"이 버그 고쳐줘"* → `/task-init` 자동 발동 (새 task 시작 의도)
231
+ - *"기획 다 됐으니 이제 구현 시작해"* → `/task-dev` 자동 발동 (planned task의 다음 단계)
232
+ - *"이 부분도 백로그에 추가해줘"* / *"나중에 할 일로 적어둬"* → `/add-backlog` 자동 발동 (백로그 추가 의도)
233
+ - *"이거 진짜 불편하다"* / *"이 부분 답답하네"* → `/log-friction` 자동 발동 (불만 발화 캐치)
94
234
 
95
- > 본 리포 spec 문서는 npm 패키지에 포함되지 않으므로 GitHub에서 정독.
235
+ **실패·불확정 분기** — `/task-test`가 FAIL 또는 UNCERTAIN을 반환하면 메인 세션이 사용자에게 판단을 묻고, 사용자의 자연어 답변에서 의도를 해석해 다음 흐름을 *자동 발동*한다(별도 슬래시 호출 없이 진행됨).
96
236
 
97
- - [plan/OVERVIEW.md](https://github.com/angar2/taskery/blob/main/plan/OVERVIEW.md) — 진입 + 큰 그림 + 단일 진실 소스
98
- - [plan/SKILLS.md](https://github.com/angar2/taskery/blob/main/plan/SKILLS.md) — 스킬 8종 명세 + 흐름
99
- - [plan/TASK-DOC.md](https://github.com/angar2/taskery/blob/main/plan/TASK-DOC.md) — 태스크 양식 + 7 상태
100
- - [plan/HOOKS.md](https://github.com/angar2/taskery/blob/main/plan/HOOKS.md) — 3 catastrophic hook 정책
101
- - [plan/DISTRIBUTION.md](https://github.com/angar2/taskery/blob/main/plan/DISTRIBUTION.md) — npx 배포 + manifest
102
- - [plan/DECISIONS.md](https://github.com/angar2/taskery/blob/main/plan/DECISIONS.md) — 핵심 의사결정
103
- - [plan/PLAYBOOK.md](https://github.com/angar2/taskery/blob/main/plan/PLAYBOOK.md) — 미래 옵션 카탈로그
237
+ - 사용자가 재구현을 요청하면 → `testing` → `developing`으로 회귀해 `/task-dev`가 자동 발동된다.
238
+ - 사용자가 결함을 인지한 채 종결을 지시하면 → `testing` → `tested`로 진행하고 결함을 명시한 후 `/task-close`로 이행된다.
239
+ - UNCERTAIN(자동 검증이 불가능한 시나리오)은 사용자가 직접 검수한 결과를 답하면 메인 세션이 PASS/FAIL로 해석해 위 두 흐름 중 하나로 합류시킨다.
104
240
 
105
241
  ---
106
242
 
107
- ## 라이선스
243
+ ## 상세 문서
108
244
 
109
- [MIT](LICENSE)
245
+ spec 문서는 GitHub에서 참고할 수 있다.
246
+
247
+ - [OVERVIEW.md](https://github.com/angar2/taskery/blob/main/plan/OVERVIEW.md) — 시스템 진입 가이드와 전체 구조 개요.
248
+ - [SKILLS.md](https://github.com/angar2/taskery/blob/main/plan/SKILLS.md) — 스킬 9종의 상세 명세와 호출 흐름.
249
+ - [TASK-DOC.md](https://github.com/angar2/taskery/blob/main/plan/TASK-DOC.md) — task 문서의 작성 양식과 7 상태 머신의 동작 정의.
250
+ - [HOOKS.md](https://github.com/angar2/taskery/blob/main/plan/HOOKS.md) — catastrophic hook 2종의 정책과 예외 처리 절차.
251
+ - [DISTRIBUTION.md](https://github.com/angar2/taskery/blob/main/plan/DISTRIBUTION.md) — npx 배포 메커니즘과 자산 갱신 로직.
252
+ - [DECISIONS.md](https://github.com/angar2/taskery/blob/main/plan/DECISIONS.md) — 시스템 설계의 핵심 의사결정과 변경 이력.
253
+ - [PLAYBOOK.md](https://github.com/angar2/taskery/blob/main/plan/PLAYBOOK.md) — 향후 도입 가능한 기능 후보 목록.
110
254
 
111
255
  ---
112
256
 
113
- ## 수정 이력
257
+ ## 라이센스
114
258
 
115
- | 날짜 | 변경 사항 |
116
- |------|----------|
117
- | 2026-05-09 | 신규 작성 — npm 페이지 진입 문서 |
259
+ [MIT](LICENSE)
package/bin/init.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * 1. cwd에 .taskery-manifest.json 이미 있으면 경고 + confirm
8
8
  * 2. template/ 안 *모든 파일* cwd로 카피 (디렉토리 자동 생성)
9
9
  * 3. *.local.md 사용자 오버라이드 충돌 검사 (덮어쓰지 X)
10
- * 4. .taskery-manifest.json 박음 (version + installed_at + files{path,hash,core,managed} 맵)
10
+ * 4. .taskery-manifest.json 작성 (version + installed_at + files{path,hash,core,managed} 맵)
11
11
  * 5. 결과 요약 출력 + 다음 단계 안내 (`/project-init`)
12
12
  */
13
13
 
@@ -24,6 +24,9 @@ const {
24
24
  readManifest,
25
25
  getPackageVersion,
26
26
  isLocalOverride,
27
+ generateProjectId,
28
+ DEFAULT_STALE_DAYS,
29
+ DEFAULT_LOCK_TIMEOUT_MS,
27
30
  } = require('./lib');
28
31
 
29
32
  async function confirm(msg) {
@@ -93,14 +96,54 @@ async function main() {
93
96
  console.log(` copy: ${rel}`);
94
97
  }
95
98
 
96
- // 4. manifest 박음
99
+ // 4. manifest 작성 — 멀티세션(0.1.2+): projectId / stale_days / lock_timeout_ms 포함
97
100
  const manifest = {
98
101
  version: getPackageVersion(),
99
102
  installed_at: new Date().toISOString(),
103
+ projectId: generateProjectId(),
104
+ stale_days: DEFAULT_STALE_DAYS,
105
+ lock_timeout_ms: DEFAULT_LOCK_TIMEOUT_MS,
100
106
  files: manifestFiles,
101
107
  };
102
108
  writeManifest(manifest, manifestPath);
103
109
 
110
+ // 4.5. .gitignore prompt (stash FRICTION_LOG #26 반영)
111
+ // 공개 repo면 내부 워크플로 파일 노출 회피 — taskery 내부 영역 .gitignore 등록 제안.
112
+ // 사용자 NO면 패스 (그대로 둠). 이미 등록되어 있으면 스킵.
113
+ const gitignorePath = path.join(cwd, '.gitignore');
114
+ const taskeryPatterns = [
115
+ '.project/',
116
+ '.claude/',
117
+ 'CLAUDE.md',
118
+ '.taskery-manifest.json',
119
+ ];
120
+ const addGitignore = await confirm(
121
+ `\ntaskery 내부 파일(.project/, .claude/, CLAUDE.md, .taskery-manifest.json)을 .gitignore에 등록할까?\n (공개 repo면 권장 — 내부 워크플로 파일 노출 회피)`,
122
+ );
123
+ if (addGitignore) {
124
+ const existing = fs.existsSync(gitignorePath)
125
+ ? fs.readFileSync(gitignorePath, 'utf8').split('\n')
126
+ : [];
127
+ const existingSet = new Set(existing.map((l) => l.trim()));
128
+ const newPatterns = taskeryPatterns.filter((p) => !existingSet.has(p));
129
+ if (newPatterns.length > 0) {
130
+ const needsLeadingNewline =
131
+ existing.length > 0 && existing[existing.length - 1] !== '';
132
+ const block = [
133
+ needsLeadingNewline ? '' : null,
134
+ '# taskery 내부 파일',
135
+ ...newPatterns,
136
+ '',
137
+ ].filter((l) => l !== null);
138
+ fs.appendFileSync(gitignorePath, block.join('\n'));
139
+ console.log(` .gitignore 갱신 — ${newPatterns.length}개 패턴 추가`);
140
+ } else {
141
+ console.log(` .gitignore — taskery 패턴 이미 등록됨, 스킵`);
142
+ }
143
+ } else {
144
+ console.log(` .gitignore — 사용자 선택으로 패스`);
145
+ }
146
+
104
147
  // 5. 결과 보고
105
148
  console.log(`\n✅ taskery init 완료`);
106
149
  console.log(` 카피: ${copied}개 / 스킵: ${skipped}개`);