@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.
- package/README.md +207 -65
- package/bin/init.js +45 -2
- package/bin/lib.js +397 -3
- package/bin/prune.js +189 -0
- package/bin/status.js +148 -0
- package/bin/taskery.js +25 -0
- package/bin/update.js +26 -2
- package/package.json +7 -3
- package/template/.claude/hooks/closed-immutable.sh +5 -4
- package/template/.claude/hooks/git-guard.sh +1 -1
- package/template/.claude/settings.json +1 -2
- package/template/.claude/skills/add-backlog/SKILL.md +117 -0
- package/template/.claude/skills/log-friction/SKILL.md +76 -0
- package/template/.claude/skills/{plan-init.md → plan-init/SKILL.md} +28 -4
- package/template/.claude/skills/{project-init.md → project-init/SKILL.md} +60 -7
- package/template/.claude/skills/task-close/SKILL.md +351 -0
- package/template/.claude/skills/{task-dev.md → task-dev/SKILL.md} +54 -8
- package/template/.claude/skills/task-init/SKILL.md +283 -0
- package/template/.claude/skills/{task-plan.md → task-plan/SKILL.md} +115 -18
- package/template/.claude/skills/{task-test.md → task-test/SKILL.md} +60 -18
- package/template/.project/FRICTION_LOG.md +6 -13
- package/template/.project/rules/CHANGELOG_RULE.md +91 -0
- package/template/.project/rules/GIT_RULE.md +119 -8
- package/template/.project/rules/MOCKUP_RULE.md +85 -0
- package/template/.project/rules/TASK_DOC_RULE.md +78 -76
- package/template/CLAUDE.md +77 -12
- package/template/.claude/hooks/pre-commit-verify.sh +0 -97
- package/template/.claude/skills/refine.md +0 -177
- package/template/.claude/skills/task-close.md +0 -178
- package/template/.claude/skills/task-init.md +0 -142
package/README.md
CHANGED
|
@@ -1,117 +1,259 @@
|
|
|
1
1
|
# taskery
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
> **1 메인 세션 + 스킬 8종 + catastrophic hook 3종 + npx 배포**.
|
|
3
|
+
AI 코딩 에이전트의 자율 개발을 위한 Task 기반의 가드레일 시스템.
|
|
5
4
|
|
|
6
5
|
---
|
|
7
6
|
|
|
8
|
-
##
|
|
7
|
+
## 해결하는 문제
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
- Task 단위 라이프사이클의 가이드를 제시한다.
|
|
10
|
+
- 메인 세션을 단독으로 운영할 때 자주 발생하는 사고를 사전 차단한다.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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 <
|
|
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
|
-
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 멀티세션 (병렬 작업)
|
|
33
134
|
|
|
34
|
-
|
|
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
|
-
##
|
|
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 |
|
|
43
|
-
| `/plan-init` | plan |
|
|
44
|
-
| `/task-init` | task | task
|
|
45
|
-
| `/task-plan` | task |
|
|
46
|
-
| `/task-dev` | task |
|
|
47
|
-
| `/task-test` | task | 격리
|
|
48
|
-
| `/task-close` | task | 검증
|
|
49
|
-
| `/
|
|
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
|
-
|
|
188
|
+
> 각 스킬의 호출 시점, 입력 처리 방식, 단계별 절차, 주의사항은 [SKILLS.md](https://github.com/angar2/taskery/blob/main/plan/SKILLS.md)에서 확인 가능
|
|
52
189
|
|
|
53
190
|
---
|
|
54
191
|
|
|
55
|
-
##
|
|
192
|
+
## Hooks
|
|
56
193
|
|
|
57
|
-
| Hook |
|
|
58
|
-
|
|
59
|
-
| `git-guard.sh` |
|
|
60
|
-
| `
|
|
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
|
-
|
|
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
|
-
##
|
|
205
|
+
## 워크플로우 예시
|
|
68
206
|
|
|
207
|
+
```bash
|
|
208
|
+
# 사용자 프로젝트 첫 셋업
|
|
209
|
+
cd <project-name>
|
|
210
|
+
npx @angar2/taskery init
|
|
69
211
|
```
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
235
|
+
**실패·불확정 분기** — `/task-test`가 FAIL 또는 UNCERTAIN을 반환하면 메인 세션이 사용자에게 판단을 묻고, 사용자의 자연어 답변에서 의도를 해석해 다음 흐름을 *자동 발동*한다(별도 슬래시 호출 없이 진행됨).
|
|
96
236
|
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
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
|
-
|
|
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
|
|
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}개`);
|