@yeongjaeyou/claude-code-config 0.1.1 → 0.2.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/.claude/commands/gh/decompose-issue.md +5 -0
- package/.claude/commands/gh/init-project.md +88 -0
- package/.claude/commands/gh/post-merge.md +12 -2
- package/.claude/commands/gh/resolve-issue.md +22 -9
- package/.claude/commands/tm/convert-prd.md +127 -0
- package/.claude/commands/tm/post-merge.md +194 -0
- package/.claude/commands/tm/resolve-issue.md +267 -0
- package/.claude/commands/tm/sync-to-github.md +333 -0
- package/.claude/guideline/tm/prd-guide.md +36 -0
- package/README.md +17 -5
- package/bin/cli.js +143 -13
- package/package.json +1 -1
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
8. 깃허브에 마일스톤과 이슈를 생성할지 묻기: AskUserQuestion 도구로 사용자가 결정하도록 요청하기.
|
|
14
14
|
- 마일스톤 생성: `gh api repos/:owner/:repo/milestones -f title="마일스톤명" -f description="설명"`
|
|
15
15
|
- 이슈 생성 시 `--milestone` 옵션으로 할당
|
|
16
|
+
9. **GitHub Project에 이슈 추가 (선택)**
|
|
17
|
+
- `gh project list --owner <owner> --format json`으로 프로젝트 존재 여부 확인
|
|
18
|
+
- 프로젝트가 없으면: "프로젝트가 없습니다. `/gh:init-project`로 생성할 수 있습니다." 안내 후 스킵
|
|
19
|
+
- 프로젝트가 있으면: AskUserQuestion으로 추가 여부 질문
|
|
20
|
+
- 추가 원하면: 각 이슈에 대해 `gh project item-add <project-number> --owner <owner> --url <issue-url>`
|
|
16
21
|
|
|
17
22
|
## 마일스톤 description 작성 가이드
|
|
18
23
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: GitHub Project 보드 초기화 및 설정
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# GitHub Project 초기화
|
|
6
|
+
|
|
7
|
+
GitHub Project 보드를 생성하고 기본 필드를 설정합니다. `@CLAUDE.md`의 프로젝트 지침을 준수할 것.
|
|
8
|
+
|
|
9
|
+
## 사전 요구사항
|
|
10
|
+
|
|
11
|
+
`gh` CLI에 project 스코프가 필요합니다. 없으면 다음 명령어로 추가:
|
|
12
|
+
```bash
|
|
13
|
+
gh auth refresh -s project --hostname github.com
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 아규먼트
|
|
17
|
+
|
|
18
|
+
- 프로젝트 이름 (선택): 없으면 저장소 이름을 기본값으로 사용
|
|
19
|
+
|
|
20
|
+
## 작업 순서
|
|
21
|
+
|
|
22
|
+
1. **사전 확인**
|
|
23
|
+
- `gh auth status`로 project 스코프 확인
|
|
24
|
+
- 없으면 사용자에게 `gh auth refresh -s project --hostname github.com` 실행 안내
|
|
25
|
+
- `gh repo view --json nameWithOwner,owner -q ".owner.login"`로 owner 확인
|
|
26
|
+
|
|
27
|
+
2. **기존 프로젝트 확인**
|
|
28
|
+
- `gh project list --owner <owner> --format json`으로 기존 프로젝트 목록 확인
|
|
29
|
+
- 동일한 이름의 프로젝트가 있으면 AskUserQuestion으로 처리 방법 질문:
|
|
30
|
+
- 기존 프로젝트 사용
|
|
31
|
+
- 새 프로젝트 생성 (다른 이름으로)
|
|
32
|
+
- 작업 취소
|
|
33
|
+
|
|
34
|
+
3. **프로젝트 생성**
|
|
35
|
+
- `gh project create --owner <owner> --title "<프로젝트명>" --format json`
|
|
36
|
+
- 생성된 프로젝트 번호(number) 저장
|
|
37
|
+
|
|
38
|
+
4. **Status 필드 확인**
|
|
39
|
+
- `gh project field-list <project-number> --owner <owner> --format json`으로 필드 확인
|
|
40
|
+
- GitHub Project는 기본적으로 Status 필드 제공 (Todo, In Progress, Done)
|
|
41
|
+
- 기본 필드가 있으면 그대로 사용
|
|
42
|
+
|
|
43
|
+
5. **Priority 필드 생성 (선택)**
|
|
44
|
+
- AskUserQuestion으로 Priority 필드 생성 여부 질문
|
|
45
|
+
- 원하면 생성:
|
|
46
|
+
```bash
|
|
47
|
+
gh project field-create <project-number> --owner <owner> \
|
|
48
|
+
--name "Priority" \
|
|
49
|
+
--data-type "SINGLE_SELECT" \
|
|
50
|
+
--single-select-options "High,Medium,Low"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
6. **저장소에 프로젝트 링크**
|
|
54
|
+
- `gh repo view --json name -q .name`로 현재 저장소 이름 확인
|
|
55
|
+
- `gh project link <project-number> --owner <owner> --repo <repo>`로 연결
|
|
56
|
+
- 주의: `--repo`에는 저장소 이름만 지정 (owner/repo 형식 아님)
|
|
57
|
+
|
|
58
|
+
7. **결과 출력**
|
|
59
|
+
- 생성된 프로젝트 정보 요약
|
|
60
|
+
- 웹에서 확인할 수 있는 URL 제공: `gh project view <project-number> --owner <owner> --web`
|
|
61
|
+
|
|
62
|
+
## 출력 예시
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
GitHub Project 초기화 완료!
|
|
66
|
+
|
|
67
|
+
프로젝트: my-project
|
|
68
|
+
번호: 5
|
|
69
|
+
URL: https://github.com/users/<username>/projects/5
|
|
70
|
+
|
|
71
|
+
기본 필드:
|
|
72
|
+
- Status: Todo, In Progress, Done
|
|
73
|
+
- Priority: High, Medium, Low (선택적으로 추가됨)
|
|
74
|
+
|
|
75
|
+
연결된 저장소: owner/repo
|
|
76
|
+
|
|
77
|
+
다음 단계:
|
|
78
|
+
- 이슈 추가: gh project item-add 5 --owner <owner> --url <issue-url>
|
|
79
|
+
- 보드 확인: gh project view 5 --owner <owner> --web
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 작업 지침
|
|
83
|
+
|
|
84
|
+
- 한글로 답변
|
|
85
|
+
- 코드나 문서 작성 시 이모지 사용 금지
|
|
86
|
+
- 오류 발생 시 명확한 해결 방법 제시
|
|
87
|
+
- 프로젝트 번호는 이후 명령어에서 사용되므로 사용자에게 안내
|
|
88
|
+
- `@me`는 일부 명령어에서 동작하지 않으므로 실제 owner를 사용
|
|
@@ -35,7 +35,17 @@ PR이 머지된 후 브랜치 정리와 CLAUDE.md 업데이트를 수행합니
|
|
|
35
35
|
- AskUserQuestion으로 로컬 브랜치 삭제 여부 질문
|
|
36
36
|
- 삭제 원하면: `git branch -d <headRefName>`
|
|
37
37
|
|
|
38
|
-
5. **
|
|
38
|
+
5. **GitHub Project 상태 업데이트 (선택)**
|
|
39
|
+
- PR body에서 관련 이슈 번호 파악: `Closes #N`, `Fixes #N`, `Resolves #N` 패턴 검색
|
|
40
|
+
- `gh project list --owner <owner> --format json`으로 프로젝트 확인
|
|
41
|
+
- 프로젝트가 없으면 스킵 (경고 없이 진행)
|
|
42
|
+
- 프로젝트가 있으면:
|
|
43
|
+
- `gh project item-list`로 해당 이슈의 item-id 확인
|
|
44
|
+
- `gh project field-list`로 Status 필드 ID와 "Done" 옵션 ID 획득
|
|
45
|
+
- `gh project item-edit`로 Status를 "Done"으로 변경
|
|
46
|
+
- 이슈가 프로젝트에 없거나 Status 필드가 없으면 스킵
|
|
47
|
+
|
|
48
|
+
6. **CLAUDE.md 분석 및 업데이트**
|
|
39
49
|
- CLAUDE.md 존재 여부 확인
|
|
40
50
|
- 없으면: AskUserQuestion으로 생성 여부 또는 스킵 여부 질문
|
|
41
51
|
- 기존 내용 분석:
|
|
@@ -48,7 +58,7 @@ PR이 머지된 후 브랜치 정리와 CLAUDE.md 업데이트를 수행합니
|
|
|
48
58
|
- **수정 대상**: 오래되거나 부정확한 정보
|
|
49
59
|
- AskUserQuestion으로 제안 내용 확인 후 적용
|
|
50
60
|
|
|
51
|
-
|
|
61
|
+
7. **변경사항 커밋 (선택)**
|
|
52
62
|
- CLAUDE.md가 변경되었으면 AskUserQuestion으로 커밋 여부 질문
|
|
53
63
|
- 커밋 원하면: Conventional Commits 형식으로 커밋
|
|
54
64
|
|
|
@@ -13,20 +13,33 @@
|
|
|
13
13
|
2. **브랜치 생성**: `main` 또는 `master` 브랜치에서 `issue-$ISSUE_NUMBER` 형태로 새 브랜치를 생성하고 체크아웃합니다.
|
|
14
14
|
- **서브모듈 초기화**: Worktree 사용 시 `git submodule update --init --recursive` 실행 필요
|
|
15
15
|
|
|
16
|
-
3.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
3. **GitHub Project 상태 업데이트 (선택)**
|
|
17
|
+
- `gh project list --owner <owner> --format json`으로 프로젝트 확인
|
|
18
|
+
- 프로젝트가 없으면 스킵 (경고 없이 진행)
|
|
19
|
+
- 프로젝트가 있으면:
|
|
20
|
+
- `gh project item-list <project-number> --owner <owner> --format json`으로 이슈가 프로젝트에 있는지 확인
|
|
21
|
+
- 없으면 `gh project item-add`로 추가
|
|
22
|
+
- `gh project field-list <project-number> --owner <owner> --format json`으로 Status 필드 ID와 "In Progress" 옵션 ID 획득
|
|
23
|
+
- Status 필드를 "In Progress"로 변경:
|
|
24
|
+
```bash
|
|
25
|
+
gh project item-edit --project-id <project-id> --id <item-id> --field-id <status-field-id> --single-select-option-id <in-progress-option-id>
|
|
26
|
+
```
|
|
27
|
+
- Status 필드가 없으면 스킵
|
|
28
|
+
|
|
29
|
+
4. **코드베이스 분석**: 이슈 해결에 필요한 관련 파일과 구조를 파악하기 위해 서브에이전트를 활용하여 코드베이스를 병렬로 분석합니다.
|
|
30
|
+
|
|
31
|
+
5. **해결 계획 수립**: 분석 결과를 바탕으로 구체적인 해결 방안을 계획하고 작업 단계를 정의합니다.
|
|
32
|
+
|
|
33
|
+
6. **이슈 해결**: 서브에이전트를 생성하여 계획에 따라 코드를 수정하고 기능을 구현합니다.
|
|
21
34
|
- **실행 검증 필수**: Python 스크립트, 실행 파일, 또는 동작 가능한 코드의 경우 반드시 실제 실행하여 정상 동작을 확인합니다. 단순히 파일 존재나 이전 결과만으로 판단하지 않습니다.
|
|
22
35
|
|
|
23
|
-
|
|
36
|
+
7. **테스트 작성**: 파일별로 독립적인 서브에이전트를 생성하여 병렬로 단위 테스트를 작성하고 80% 이상의 커버리지를 확보합니다.
|
|
24
37
|
|
|
25
|
-
|
|
38
|
+
8. **검증**: 테스트 실행, 린트 검사, 빌드 확인을 각각 독립적인 서브에이전트로 병렬 실행하여 코드 품질을 검증합니다.
|
|
26
39
|
|
|
27
|
-
|
|
40
|
+
9. **PR 생성**: 해결된 이슈에 대한 풀 리퀘스트를 생성합니다.
|
|
28
41
|
|
|
29
|
-
|
|
42
|
+
10. **이슈 체크박스 업데이트**: 해당 이슈의 체크박스 항목들을 완료된 것으로 체크하여 업데이트합니다.
|
|
30
43
|
|
|
31
44
|
## 작업 지침
|
|
32
45
|
- 불명확한 요구사항이나 구현 방향이 여러 가지일 경우 AskUserQuestion 도구로 사용자에게 확인
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# PRD 초안 -> TaskMaster PRD 변환
|
|
2
|
+
|
|
3
|
+
초안 파일을 TaskMaster PRD 포맷으로 변환합니다.
|
|
4
|
+
|
|
5
|
+
**템플릿:** `.claude/guideline/tm/prd-guide.md` 복사해서 초안 작성
|
|
6
|
+
|
|
7
|
+
**원칙:**
|
|
8
|
+
- 원본 내용 유지 (임의로 늘리거나 줄이지 않음)
|
|
9
|
+
- 한글로 작성
|
|
10
|
+
- `.taskmaster/templates/example_prd.txt` 포맷 준수
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 아규먼트
|
|
15
|
+
|
|
16
|
+
`$ARGUMENTS`로 초안 파일 경로를 받습니다:
|
|
17
|
+
- 예: `/tm:convert-prd .taskmaster/docs/my-idea.md`
|
|
18
|
+
- 없으면 AskUserQuestion으로 경로 입력 요청
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 작업 순서
|
|
23
|
+
|
|
24
|
+
### 1. 초안 읽기
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cat $ARGUMENTS
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
파일이 없거나 내용이 비어있으면 작성 요청.
|
|
31
|
+
|
|
32
|
+
### 2. 타겟 포맷 확인
|
|
33
|
+
|
|
34
|
+
`.taskmaster/templates/example_prd.txt` 구조:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
<context>
|
|
38
|
+
# Overview
|
|
39
|
+
# Core Features
|
|
40
|
+
# User Experience
|
|
41
|
+
</context>
|
|
42
|
+
|
|
43
|
+
<PRD>
|
|
44
|
+
# Technical Architecture
|
|
45
|
+
# Development Roadmap
|
|
46
|
+
# Logical Dependency Chain
|
|
47
|
+
# Risks and Mitigations
|
|
48
|
+
# Appendix
|
|
49
|
+
</PRD>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 3. 변환
|
|
53
|
+
|
|
54
|
+
초안 내용을 위 포맷에 맞게 재배치:
|
|
55
|
+
|
|
56
|
+
| 초안 섹션 | PRD 섹션 |
|
|
57
|
+
|----------|----------|
|
|
58
|
+
| 뭘 만들고 싶은지 | Overview |
|
|
59
|
+
| 주요 기능 | Core Features |
|
|
60
|
+
| (UX 관련 내용) | User Experience |
|
|
61
|
+
| 기술 스택 | Technical Architecture |
|
|
62
|
+
| 만드는 순서 | Development Roadmap, Logical Dependency Chain |
|
|
63
|
+
| 기타 (걱정) | Risks and Mitigations |
|
|
64
|
+
| 기타 (참고) | Appendix |
|
|
65
|
+
|
|
66
|
+
**변환 규칙:**
|
|
67
|
+
- 원본에 없는 내용 추가 금지
|
|
68
|
+
- 섹션 내용이 없으면 "[추후 작성]" 표시
|
|
69
|
+
- 한글로 작성
|
|
70
|
+
- Development Roadmap은 Phase 단위로 구분
|
|
71
|
+
|
|
72
|
+
### 4. 결과 출력
|
|
73
|
+
|
|
74
|
+
변환된 PRD 전체 출력.
|
|
75
|
+
|
|
76
|
+
### 5. 저장
|
|
77
|
+
|
|
78
|
+
AskUserQuestion으로 확인 후 저장:
|
|
79
|
+
- 기본: `.taskmaster/docs/prd.md`
|
|
80
|
+
- 다른 경로 가능
|
|
81
|
+
|
|
82
|
+
### 6. 다음 단계 안내
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
[변환 완료]
|
|
86
|
+
|
|
87
|
+
다음 단계:
|
|
88
|
+
task-master parse-prd .taskmaster/docs/prd.md
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 출력 포맷
|
|
94
|
+
|
|
95
|
+
```markdown
|
|
96
|
+
<context>
|
|
97
|
+
# Overview
|
|
98
|
+
[뭘 만들고 싶은지 내용]
|
|
99
|
+
|
|
100
|
+
# Core Features
|
|
101
|
+
[주요 기능 내용]
|
|
102
|
+
|
|
103
|
+
# User Experience
|
|
104
|
+
[UX 관련 내용 또는 추후 작성]
|
|
105
|
+
</context>
|
|
106
|
+
|
|
107
|
+
<PRD>
|
|
108
|
+
# Technical Architecture
|
|
109
|
+
[기술 스택 내용]
|
|
110
|
+
|
|
111
|
+
# Development Roadmap
|
|
112
|
+
## Phase 1: [이름]
|
|
113
|
+
- [기능]
|
|
114
|
+
|
|
115
|
+
## Phase 2: [이름]
|
|
116
|
+
- [기능]
|
|
117
|
+
|
|
118
|
+
# Logical Dependency Chain
|
|
119
|
+
[만드는 순서 기반 의존성]
|
|
120
|
+
|
|
121
|
+
# Risks and Mitigations
|
|
122
|
+
[걱정되는 점]
|
|
123
|
+
|
|
124
|
+
# Appendix
|
|
125
|
+
[참고사항]
|
|
126
|
+
</PRD>
|
|
127
|
+
```
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# PR 머지 후 정리 (TaskMaster 연동)
|
|
2
|
+
|
|
3
|
+
PR이 머지된 후 브랜치 정리, TaskMaster 상태 업데이트, CLAUDE.md 업데이트를 수행합니다.
|
|
4
|
+
|
|
5
|
+
**중요 - ID 구분:**
|
|
6
|
+
- **GitHub PR/Issue**: `#1`, `#2` (GitHub 번호)
|
|
7
|
+
- **TaskMaster Task**: `task 1`, `task 1.1` (tasks.json 기준)
|
|
8
|
+
|
|
9
|
+
`@CLAUDE.md`의 프로젝트 지침을 준수할 것.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 아규먼트
|
|
14
|
+
|
|
15
|
+
- PR 번호 (선택): 없으면 대화 맥락에서 파악하거나 최근 머지된 PR 목록에서 선택 요청
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 작업 순서
|
|
20
|
+
|
|
21
|
+
### 1. PR 정보 확인
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 아규먼트로 PR 번호가 주어지면 해당 PR 사용
|
|
25
|
+
# 없으면 최근 머지 PR 목록 표시
|
|
26
|
+
gh pr list --state merged --limit 5
|
|
27
|
+
|
|
28
|
+
# PR 상세 정보 확인
|
|
29
|
+
gh pr view <PR번호> --json number,title,baseRefName,headRefName,body,state
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**확인 사항:**
|
|
33
|
+
- `state`가 `MERGED`인지 확인
|
|
34
|
+
- PR 본문에서 `Task Master 참조: task N` 추출
|
|
35
|
+
|
|
36
|
+
### 2. TaskMaster Task ID 추출
|
|
37
|
+
|
|
38
|
+
PR 본문 또는 연결된 Issue에서 TaskMaster ID 파악:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# PR 본문에서 추출
|
|
42
|
+
gh pr view <PR번호> --json body | grep -o "Task Master 참조: task [0-9.]*"
|
|
43
|
+
|
|
44
|
+
# 또는 연결된 Issue에서 추출
|
|
45
|
+
gh pr view <PR번호> --json closedIssues
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**추출 결과 예시:**
|
|
49
|
+
```
|
|
50
|
+
Task Master 참조: task 1
|
|
51
|
+
→ TaskMaster Task ID: 1
|
|
52
|
+
→ 관련 Subtasks: 1.1, 1.2, 1.3 (있는 경우)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3. TaskMaster 상태 업데이트
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# 메인 태스크 상태 확인
|
|
59
|
+
task-master show <TASK_ID>
|
|
60
|
+
|
|
61
|
+
# 모든 subtask가 done인지 확인
|
|
62
|
+
# subtask가 있고 모두 완료되었다면:
|
|
63
|
+
task-master set-status --id=<TASK_ID> --status=done
|
|
64
|
+
|
|
65
|
+
# subtask가 있고 일부만 완료된 경우:
|
|
66
|
+
# → 메인 태스크는 in-progress 유지
|
|
67
|
+
# → 완료된 subtask만 done 처리
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**상태 업데이트 규칙:**
|
|
71
|
+
|
|
72
|
+
| 상황 | 메인 태스크 상태 | Subtask 상태 |
|
|
73
|
+
|------|------------------|--------------|
|
|
74
|
+
| PR 머지 완료, subtask 없음 | done | N/A |
|
|
75
|
+
| PR 머지 완료, 모든 subtask 완료 | done | 모두 done |
|
|
76
|
+
| PR 머지 완료, 일부 subtask 남음 | in-progress | 완료분만 done |
|
|
77
|
+
|
|
78
|
+
### 4. 로컬 변경사항 확인
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git status --porcelain
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
변경사항이 있으면 AskUserQuestion으로 처리 방법 질문:
|
|
85
|
+
- **stash 후 진행**: `git stash push -m "post-merge: 임시 저장"`
|
|
86
|
+
- **변경사항 버리기**: `git checkout -- . && git clean -fd`
|
|
87
|
+
- **작업 중단**: 사용자가 직접 처리
|
|
88
|
+
|
|
89
|
+
### 5. 베이스 브랜치로 이동
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
git fetch origin
|
|
93
|
+
git checkout <baseRefName> # 보통 main
|
|
94
|
+
git pull origin <baseRefName>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 6. 이슈 브랜치 정리 (선택)
|
|
98
|
+
|
|
99
|
+
AskUserQuestion으로 로컬 브랜치 삭제 여부 질문:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# 삭제 원하면
|
|
103
|
+
git branch -d <headRefName> # 예: issue-1
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 7. 다음 태스크 확인
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# TaskMaster에서 다음 작업 가능한 태스크 확인
|
|
110
|
+
task-master next
|
|
111
|
+
|
|
112
|
+
# 출력 예시:
|
|
113
|
+
# Next task: Task 2 - 디자인 시스템 및 테마 구축
|
|
114
|
+
# Dependencies satisfied: Task 1 (done)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 8. CLAUDE.md 분석 및 업데이트
|
|
118
|
+
|
|
119
|
+
**분석 대상:**
|
|
120
|
+
- 해결된 Issue/Task 관련 임시 지침 (`#1`, `task 1` 언급)
|
|
121
|
+
- 오래되거나 부정확한 정보
|
|
122
|
+
- 새로 발견한 패턴/컨벤션
|
|
123
|
+
|
|
124
|
+
**업데이트 제안 작성 후 사용자 확인:**
|
|
125
|
+
- 삭제 대상: 해결된 이슈 관련 임시 메모
|
|
126
|
+
- 추가 대상: 작업 중 발견한 새 패턴
|
|
127
|
+
- 수정 대상: 변경된 정보
|
|
128
|
+
|
|
129
|
+
### 9. 변경사항 커밋 (선택)
|
|
130
|
+
|
|
131
|
+
CLAUDE.md가 변경되었으면 AskUserQuestion으로 커밋 여부 질문:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
git add CLAUDE.md
|
|
135
|
+
git commit -m "docs: CLAUDE.md 업데이트 (task $TASK_ID 완료 반영)"
|
|
136
|
+
git push origin main
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 결과 보고
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
[PR 머지 후 정리 완료]
|
|
145
|
+
|
|
146
|
+
PR 정보:
|
|
147
|
+
- PR: #<PR번호>
|
|
148
|
+
- 제목: <PR 제목>
|
|
149
|
+
- 브랜치: <headRefName> → <baseRefName>
|
|
150
|
+
|
|
151
|
+
TaskMaster 상태:
|
|
152
|
+
- Task ID: task <N>
|
|
153
|
+
- 상태: done
|
|
154
|
+
- Subtasks: 모두 완료 (1.1, 1.2, 1.3)
|
|
155
|
+
|
|
156
|
+
정리 작업:
|
|
157
|
+
- [x] 로컬 브랜치 삭제: issue-<N>
|
|
158
|
+
- [x] TaskMaster 상태 업데이트
|
|
159
|
+
- [ ] CLAUDE.md 업데이트 (변경 없음)
|
|
160
|
+
|
|
161
|
+
다음 작업:
|
|
162
|
+
- task-master next → Task <M>
|
|
163
|
+
- /tm:resolve-issue <M> 으로 시작
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 작업 지침
|
|
169
|
+
|
|
170
|
+
- 한글로 답변
|
|
171
|
+
- 코드나 문서 작성 시 이모지 사용 금지
|
|
172
|
+
- 불명확한 사항은 추측하지 말고 AskUserQuestion으로 질문
|
|
173
|
+
- TaskMaster 상태 변경, 브랜치 삭제 등은 항상 사용자 확인 필요
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## ID 참조 가이드
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
[이 커맨드에서 사용되는 ID들]
|
|
181
|
+
|
|
182
|
+
GitHub:
|
|
183
|
+
- PR 번호: #13, #14
|
|
184
|
+
- Issue 번호: #1, #2 (PR과 동일 네임스페이스)
|
|
185
|
+
- 브랜치: issue-1, issue-2
|
|
186
|
+
|
|
187
|
+
TaskMaster:
|
|
188
|
+
- 메인 태스크: task 1, task 2
|
|
189
|
+
- Subtask: task 1.1, task 1.2
|
|
190
|
+
|
|
191
|
+
연결:
|
|
192
|
+
- PR 본문의 "Task Master 참조: task N"
|
|
193
|
+
- PR 본문의 "Closes #N" (GitHub Issue 연결)
|
|
194
|
+
```
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# TaskMaster 기반 GitHub Issue 해결하기
|
|
2
|
+
|
|
3
|
+
GitHub Issue를 TaskMaster subtask 단위로 체계적으로 해결하고 PR을 생성합니다.
|
|
4
|
+
|
|
5
|
+
**중요**: 이 커맨드는 TaskMaster와 GitHub Issue를 연동합니다.
|
|
6
|
+
- **GitHub Issue 번호**: `#1`, `#2` 형태 (GitHub에서 생성된 번호)
|
|
7
|
+
- **TaskMaster Task ID**: `task 1`, `task 1.1` 형태 (tasks.json 기준)
|
|
8
|
+
|
|
9
|
+
`@CLAUDE.md`의 프로젝트 지침을 준수할 것.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 아규먼트
|
|
14
|
+
|
|
15
|
+
`$ARGUMENTS`로 다음 중 하나를 받습니다:
|
|
16
|
+
- GitHub Issue 번호 (예: `1`, `#1`)
|
|
17
|
+
- TaskMaster Task ID (예: `task 1`, `task:1`)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 작업 순서
|
|
22
|
+
|
|
23
|
+
### 1. 아규먼트 파싱 및 ID 매핑
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
입력값 분석:
|
|
27
|
+
- "#1" 또는 "1" → GitHub Issue 번호로 해석
|
|
28
|
+
- "task 1" 또는 "task:1" → TaskMaster Task ID로 해석
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**GitHub Issue 번호인 경우:**
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 1단계: Issue 정보 가져오기
|
|
35
|
+
gh issue view $ISSUE_NUMBER --json number,title,body,state
|
|
36
|
+
|
|
37
|
+
# 2단계: 본문에서 TaskMaster Task ID 추출
|
|
38
|
+
BODY=$(gh issue view $ISSUE_NUMBER --json body --jq '.body')
|
|
39
|
+
echo "$BODY" | grep -oP "Task Master 참조: task \K[0-9]+"
|
|
40
|
+
|
|
41
|
+
# 예상 출력: 1 (숫자만)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**추출 실패 시 (Task Master 참조가 없는 경우):**
|
|
45
|
+
```
|
|
46
|
+
→ Issue가 sync-to-github로 생성된 게 아닐 수 있음
|
|
47
|
+
→ 사용자에게 TaskMaster Task ID 직접 입력 요청
|
|
48
|
+
→ AskUserQuestion: "이 Issue에 해당하는 TaskMaster Task ID가 무엇인가요?"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**TaskMaster Task ID인 경우:**
|
|
52
|
+
```bash
|
|
53
|
+
# tasks.json에서 해당 태스크 확인
|
|
54
|
+
task-master show $TASK_ID
|
|
55
|
+
|
|
56
|
+
# 해당하는 GitHub Issue 찾기 (역방향 매핑)
|
|
57
|
+
gh issue list --search "in:body \"Task Master 참조: task $TASK_ID\"" --json number,title
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 2. 태스크 정보 확인
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# TaskMaster에서 태스크 상세 정보 확인
|
|
64
|
+
task-master show $TASK_ID
|
|
65
|
+
|
|
66
|
+
# 출력 예시:
|
|
67
|
+
# Task 1: Next.js 15 프로젝트 초기 설정
|
|
68
|
+
# Status: pending
|
|
69
|
+
# Dependencies: none
|
|
70
|
+
# Subtasks: (none)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**확인 사항:**
|
|
74
|
+
- [ ] 태스크 상태가 `pending` 또는 `in-progress`인지
|
|
75
|
+
- [ ] 의존성 태스크가 모두 완료되었는지 (`task-master show`로 dependencies 확인)
|
|
76
|
+
|
|
77
|
+
### 3. Subtask 확장 (필요시)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# subtask가 없는 경우에만 실행
|
|
81
|
+
task-master expand --id=$TASK_ID --research
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**확장 후 확인:**
|
|
85
|
+
```bash
|
|
86
|
+
task-master show $TASK_ID
|
|
87
|
+
# Subtasks:
|
|
88
|
+
# - 1.1: 프로젝트 생성 (pending)
|
|
89
|
+
# - 1.2: Shadcn/ui 초기화 (pending)
|
|
90
|
+
# - 1.3: 의존성 설치 (pending)
|
|
91
|
+
# ...
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 4. 브랜치 생성
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
# main 또는 master에서 새 브랜치 생성
|
|
98
|
+
git checkout main && git pull origin main
|
|
99
|
+
git checkout -b issue-$ISSUE_NUMBER
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**브랜치 명명 규칙:**
|
|
103
|
+
- `issue-1` (GitHub Issue #1 작업용)
|
|
104
|
+
- `issue-1-subtask-1.2` (특정 subtask만 작업 시, 선택사항)
|
|
105
|
+
|
|
106
|
+
### 5. Subtask 순차 처리
|
|
107
|
+
|
|
108
|
+
**처리 순서 결정:**
|
|
109
|
+
```bash
|
|
110
|
+
# subtask 목록과 의존성 확인
|
|
111
|
+
task-master show $TASK_ID
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**각 subtask별 처리 루프:**
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
[Subtask 1.1 시작]
|
|
118
|
+
1. task-master set-status --id=1.1 --status=in-progress
|
|
119
|
+
2. subtask 내용에 따라 코드 구현
|
|
120
|
+
3. 구현 완료 후 검증 (빌드, 린트, 테스트)
|
|
121
|
+
4. task-master set-status --id=1.1 --status=done
|
|
122
|
+
5. task-master update-subtask --id=1.1 --prompt="구현 완료: [간단한 설명]"
|
|
123
|
+
|
|
124
|
+
[Subtask 1.2 시작]
|
|
125
|
+
... 반복 ...
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**중요 원칙:**
|
|
129
|
+
- 한 번에 하나의 subtask만 `in-progress`
|
|
130
|
+
- 의존성이 있는 subtask는 선행 subtask 완료 후 처리
|
|
131
|
+
- 각 subtask 완료 시 즉시 상태 업데이트
|
|
132
|
+
|
|
133
|
+
### 6. 메인 태스크 완료 처리
|
|
134
|
+
|
|
135
|
+
모든 subtask가 `done` 상태가 되면:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# 메인 태스크 완료
|
|
139
|
+
task-master set-status --id=$TASK_ID --status=done
|
|
140
|
+
|
|
141
|
+
# 최종 확인
|
|
142
|
+
task-master show $TASK_ID
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 7. 커밋 및 푸시
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# 변경사항 확인
|
|
149
|
+
git status
|
|
150
|
+
git diff
|
|
151
|
+
|
|
152
|
+
# 커밋 (태스크 정보 포함)
|
|
153
|
+
git add .
|
|
154
|
+
git commit -m "feat: [Task $TASK_ID] 태스크 제목
|
|
155
|
+
|
|
156
|
+
- subtask 1.1: 완료 내용
|
|
157
|
+
- subtask 1.2: 완료 내용
|
|
158
|
+
...
|
|
159
|
+
|
|
160
|
+
Task Master 참조: task $TASK_ID
|
|
161
|
+
Closes #$ISSUE_NUMBER"
|
|
162
|
+
|
|
163
|
+
# 푸시
|
|
164
|
+
git push -u origin issue-$ISSUE_NUMBER
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 8. PR 생성
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
gh pr create \
|
|
171
|
+
--title "[Task $TASK_ID] 태스크 제목" \
|
|
172
|
+
--body "$(cat <<'EOF'
|
|
173
|
+
## 개요
|
|
174
|
+
GitHub Issue #$ISSUE_NUMBER 해결
|
|
175
|
+
|
|
176
|
+
## TaskMaster 태스크 정보
|
|
177
|
+
- **Task ID**: $TASK_ID
|
|
178
|
+
- **Task 제목**: [태스크 제목]
|
|
179
|
+
|
|
180
|
+
## 완료된 Subtask
|
|
181
|
+
- [x] subtask 1.1: [설명]
|
|
182
|
+
- [x] subtask 1.2: [설명]
|
|
183
|
+
- [x] subtask 1.3: [설명]
|
|
184
|
+
|
|
185
|
+
## 변경 사항
|
|
186
|
+
- [주요 변경 내용 요약]
|
|
187
|
+
|
|
188
|
+
## 테스트
|
|
189
|
+
- [ ] 빌드 성공
|
|
190
|
+
- [ ] 린트 통과
|
|
191
|
+
- [ ] 기능 테스트 완료
|
|
192
|
+
|
|
193
|
+
## 관련 이슈
|
|
194
|
+
Closes #$ISSUE_NUMBER
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
Task Master 참조: task $TASK_ID
|
|
198
|
+
EOF
|
|
199
|
+
)"
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 9. GitHub Issue 업데이트
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
# Issue에 진행 상황 코멘트 추가
|
|
206
|
+
gh issue comment $ISSUE_NUMBER --body "PR #[PR번호] 생성 완료. 코드리뷰 요청드립니다.
|
|
207
|
+
|
|
208
|
+
**완료된 작업:**
|
|
209
|
+
$(task-master show $TASK_ID | grep -A 100 'Subtasks:')"
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## ID 매핑 참조표
|
|
215
|
+
|
|
216
|
+
| 구분 | 형식 | 예시 | 설명 |
|
|
217
|
+
|------|------|------|------|
|
|
218
|
+
| GitHub Issue | `#N` | `#1`, `#12` | GitHub에서 자동 부여 |
|
|
219
|
+
| TaskMaster 메인 태스크 | `task N` | `task 1`, `task 12` | tasks.json의 id 필드 |
|
|
220
|
+
| TaskMaster Subtask | `task N.M` | `task 1.1`, `task 1.2` | 메인태스크.서브태스크 |
|
|
221
|
+
|
|
222
|
+
**매핑 규칙:**
|
|
223
|
+
- `sync-to-github` 실행 시 Issue 본문에 `Task Master 참조: task N` 포함됨
|
|
224
|
+
- 이를 통해 GitHub Issue ↔ TaskMaster Task 연결
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 주의사항
|
|
229
|
+
|
|
230
|
+
1. **ID 혼동 주의**
|
|
231
|
+
- GitHub Issue `#1`과 TaskMaster `task 1`은 다를 수 있음
|
|
232
|
+
- 항상 Issue 본문의 "Task Master 참조" 확인
|
|
233
|
+
|
|
234
|
+
2. **subtask 순서 준수**
|
|
235
|
+
- 의존성이 있는 subtask는 반드시 순서대로 처리
|
|
236
|
+
- `task-master show`로 dependencies 확인
|
|
237
|
+
|
|
238
|
+
3. **상태 업데이트 즉시 수행**
|
|
239
|
+
- subtask 완료 즉시 `set-status --status=done`
|
|
240
|
+
- 진행 상황이 tasks.json에 실시간 반영되어야 함
|
|
241
|
+
|
|
242
|
+
4. **커밋 메시지에 참조 포함**
|
|
243
|
+
- `Task Master 참조: task N` 포함
|
|
244
|
+
- `Closes #N` 또는 `Fixes #N` 포함
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 에러 처리
|
|
249
|
+
|
|
250
|
+
**의존성 미완료:**
|
|
251
|
+
```
|
|
252
|
+
Error: Task 1의 의존성 task 0이 완료되지 않았습니다.
|
|
253
|
+
→ 선행 태스크 먼저 완료 필요
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**subtask expand 실패:**
|
|
257
|
+
```
|
|
258
|
+
Error: expand 실패
|
|
259
|
+
→ task-master expand --id=$TASK_ID --force 시도
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**빌드/테스트 실패:**
|
|
263
|
+
```
|
|
264
|
+
→ 해당 subtask를 in-progress로 유지
|
|
265
|
+
→ 문제 해결 후 다시 진행
|
|
266
|
+
→ task-master update-subtask --id=N.M --prompt="이슈: [설명]"
|
|
267
|
+
```
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
# TaskMaster -> GitHub Issue 동기화
|
|
2
|
+
|
|
3
|
+
TaskMaster의 tasks.json을 읽어 GitHub Issue와 Milestone을 자동 생성합니다.
|
|
4
|
+
|
|
5
|
+
**중요 - ID 구분:**
|
|
6
|
+
- **GitHub Issue**: `#1`, `#2` (GitHub 자동 부여, 순차적)
|
|
7
|
+
- **TaskMaster Task ID**: `task 1`, `task 2` (tasks.json 기준)
|
|
8
|
+
- **동기화 후**: Issue 본문에 `Task Master 참조: task N` 포함되어 매핑됨
|
|
9
|
+
|
|
10
|
+
`@CLAUDE.md`의 프로젝트 지침을 준수할 것.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 구조 설계
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
GitHub TaskMaster
|
|
18
|
+
────── ──────────
|
|
19
|
+
Milestone: Phase 1 MVP ←── PRD Phase 1 (Task 1-4)
|
|
20
|
+
├── Issue #1 ←── task 1 (메인 태스크)
|
|
21
|
+
├── Issue #2 ←── task 2
|
|
22
|
+
├── Issue #3 ←── task 3
|
|
23
|
+
└── Issue #4 ←── task 4
|
|
24
|
+
|
|
25
|
+
Milestone: Phase 2 Core ←── PRD Phase 2 (Task 5-7)
|
|
26
|
+
├── Issue #5 ←── task 5
|
|
27
|
+
...
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**원칙:**
|
|
31
|
+
- **Milestone** = PRD Phase 단위 (4개)
|
|
32
|
+
- **Issue** = 메인 태스크 단위 (12개)
|
|
33
|
+
- **Subtask** = Issue 내 체크박스 + TaskMaster 내부 관리
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 작업 순서
|
|
38
|
+
|
|
39
|
+
### 1. 사전 확인
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# tasks.json 존재 확인
|
|
43
|
+
ls .taskmaster/tasks/tasks.json
|
|
44
|
+
|
|
45
|
+
# 저장소 라벨 확인
|
|
46
|
+
gh label list
|
|
47
|
+
|
|
48
|
+
# 기존 마일스톤 확인
|
|
49
|
+
gh milestone list
|
|
50
|
+
|
|
51
|
+
# 기존 Issue 확인 (번호 예측용)
|
|
52
|
+
gh issue list --state all --limit 1 --json number
|
|
53
|
+
# 예: [{"number": 5}] → 다음 Issue는 #6부터 시작
|
|
54
|
+
|
|
55
|
+
# TaskMaster 관련 Issue 이미 있는지 확인
|
|
56
|
+
gh issue list --search "in:body \"Task Master 참조\"" --state all --json number,title
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Issue 번호 예측:**
|
|
60
|
+
```
|
|
61
|
+
현재 최대 Issue 번호: #5
|
|
62
|
+
→ task 1 = Issue #6
|
|
63
|
+
→ task 2 = Issue #7
|
|
64
|
+
→ ...
|
|
65
|
+
→ task 12 = Issue #17
|
|
66
|
+
|
|
67
|
+
(주의: PR도 같은 번호 풀 사용하므로 중간에 PR 생성되면 번호 밀림)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 2. tasks.json 및 PRD 분석
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# 태스크 목록 확인
|
|
74
|
+
task-master list
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**PRD Phase 매핑 (prd.md 참조):**
|
|
78
|
+
|
|
79
|
+
| Phase | TaskMaster Task IDs | 설명 |
|
|
80
|
+
|-------|---------------------|------|
|
|
81
|
+
| Phase 1: MVP | task 1, 2, 3, 4 | 초기 설정, 디자인, 레이아웃, 인증 |
|
|
82
|
+
| Phase 2: Core Features | task 5, 6, 7 | 대시보드, VLM, VLM-CoT |
|
|
83
|
+
| Phase 3: UX Enhancement | task 8, 9, 10 | 애니메이션, 에러처리, 성능 |
|
|
84
|
+
| Phase 4: Deploy | task 11, 12 | CORS, Docker |
|
|
85
|
+
|
|
86
|
+
### 3. 변환 계획 수립 및 사용자 확인
|
|
87
|
+
|
|
88
|
+
아래 형식으로 변환 계획을 출력하고 **반드시 사용자 확인** 요청:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
[Milestone 생성 계획] (4개)
|
|
92
|
+
- Phase 1: MVP (task 1-4 포함)
|
|
93
|
+
- Phase 2: Core Features (task 5-7 포함)
|
|
94
|
+
- Phase 3: UX Enhancement (task 8-10 포함)
|
|
95
|
+
- Phase 4: Deploy (task 11-12 포함)
|
|
96
|
+
|
|
97
|
+
[Issue 생성 계획] (12개)
|
|
98
|
+
Phase 1: MVP 하위:
|
|
99
|
+
- Issue: [feature] task 1 - Next.js 15 프로젝트 초기 설정
|
|
100
|
+
- Issue: [feature] task 2 - 디자인 시스템 및 테마 구축
|
|
101
|
+
- Issue: [feature] task 3 - 공통 레이아웃 및 네비게이션 구현
|
|
102
|
+
- Issue: [feature] task 4 - 인증 시스템 및 보호된 라우트 구현
|
|
103
|
+
Phase 2: Core Features 하위:
|
|
104
|
+
...
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 4. Milestone 생성
|
|
108
|
+
|
|
109
|
+
Phase 단위로 Milestone 생성:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Phase 1
|
|
113
|
+
gh api repos/:owner/:repo/milestones \
|
|
114
|
+
-f title="Phase 1: MVP" \
|
|
115
|
+
-f description="초기 설정, 디자인 시스템, 레이아웃, 인증 구현 (task 1-4)"
|
|
116
|
+
|
|
117
|
+
# Phase 2
|
|
118
|
+
gh api repos/:owner/:repo/milestones \
|
|
119
|
+
-f title="Phase 2: Core Features" \
|
|
120
|
+
-f description="대시보드, VLM 분석, VLM-CoT 분석 구현 (task 5-7)"
|
|
121
|
+
|
|
122
|
+
# Phase 3, 4도 동일하게...
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 5. Issue 생성
|
|
126
|
+
|
|
127
|
+
메인 Task를 Issue로 변환:
|
|
128
|
+
|
|
129
|
+
#### 제목 형식
|
|
130
|
+
`[타입] 간결한 작업 설명`
|
|
131
|
+
|
|
132
|
+
#### 라벨 선택 (실제 저장소 라벨 사용)
|
|
133
|
+
**주의**: `gh label list` 결과에서 실제 존재하는 라벨만 사용
|
|
134
|
+
|
|
135
|
+
예시 (프로젝트에 따라 다름):
|
|
136
|
+
- **타입**: `type: feature`, `type: enhancement`, `type: bug`, `type: refactor`
|
|
137
|
+
- **영역**: `frontend`, `backend`, `api`, `ai`, `infrastructure`
|
|
138
|
+
- **난이도**: `complexity: easy`, `complexity: medium`, `complexity: hard`
|
|
139
|
+
|
|
140
|
+
#### 본문 템플릿
|
|
141
|
+
|
|
142
|
+
**중요**: `Task Master 참조` 섹션은 반드시 포함되어야 함 (resolve-issue에서 매핑에 사용)
|
|
143
|
+
|
|
144
|
+
```markdown
|
|
145
|
+
## 목적
|
|
146
|
+
[Task description에서 추출]
|
|
147
|
+
|
|
148
|
+
## 작업 내용
|
|
149
|
+
[details 필드를 체크박스로 변환]
|
|
150
|
+
- [ ] 구체적 요구사항 1
|
|
151
|
+
- [ ] 구체적 요구사항 2
|
|
152
|
+
- [ ] 구체적 요구사항 3
|
|
153
|
+
|
|
154
|
+
## 수정할 파일
|
|
155
|
+
[details 필드에서 파일 경로 추출, 없으면 "구현 시 결정"]
|
|
156
|
+
- `경로/파일명` - 변경 내용
|
|
157
|
+
|
|
158
|
+
## 기술 상세
|
|
159
|
+
[details 필드의 코드 예시나 상세 내용]
|
|
160
|
+
|
|
161
|
+
## 완료 조건
|
|
162
|
+
[testStrategy 필드에서 추출]
|
|
163
|
+
- [ ] 테스트 조건 1
|
|
164
|
+
- [ ] 테스트 조건 2
|
|
165
|
+
|
|
166
|
+
## 의존성
|
|
167
|
+
[dependencies 필드 → GitHub Issue 번호로 변환]
|
|
168
|
+
- 선행 작업: #N (task M) 또는 "없음"
|
|
169
|
+
|
|
170
|
+
## 참고 자료 (선택사항)
|
|
171
|
+
[관련 PR이나 문서가 있으면 추가, 없으면 섹션 생략]
|
|
172
|
+
- 관련 PR: #N - 설명
|
|
173
|
+
- 문서: [링크]
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
**Task Master 참조**: task [TASK_ID]
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**예시 (task 1의 경우):**
|
|
180
|
+
```markdown
|
|
181
|
+
## 목적
|
|
182
|
+
frontend/ 디렉토리에 Next.js 15 App Router 기반 프로젝트를 생성하고 핵심 의존성을 설정합니다.
|
|
183
|
+
|
|
184
|
+
## 작업 내용
|
|
185
|
+
- [ ] create-next-app으로 프로젝트 생성
|
|
186
|
+
- [ ] Shadcn/ui 초기화
|
|
187
|
+
- [ ] 필수 의존성 설치 (next-themes, framer-motion 등)
|
|
188
|
+
- [ ] Pretendard 폰트 설정
|
|
189
|
+
- [ ] tailwind.config.ts 커스터마이징
|
|
190
|
+
- [ ] ESLint/Prettier 설정
|
|
191
|
+
|
|
192
|
+
## 수정할 파일
|
|
193
|
+
- `frontend/` - 새 디렉토리 생성
|
|
194
|
+
- `frontend/tailwind.config.ts` - 커스텀 설정
|
|
195
|
+
- `frontend/app/layout.tsx` - Pretendard 폰트 설정
|
|
196
|
+
|
|
197
|
+
## 완료 조건
|
|
198
|
+
- [ ] npm run dev 정상 구동
|
|
199
|
+
- [ ] npm run build 성공
|
|
200
|
+
- [ ] localhost:3000 접속 확인
|
|
201
|
+
|
|
202
|
+
## 의존성
|
|
203
|
+
- 없음
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
**Task Master 참조**: task 1
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
#### Issue 생성 명령어
|
|
210
|
+
```bash
|
|
211
|
+
gh issue create \
|
|
212
|
+
--title "[타입] 제목" \
|
|
213
|
+
--body "본문 내용" \
|
|
214
|
+
--label "라벨1,라벨2" \
|
|
215
|
+
--milestone "마일스톤명"
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### 6. 의존성 연결 및 ID 매핑 기록
|
|
219
|
+
|
|
220
|
+
**Issue 생성 순서**: task 1부터 순서대로 생성하면 Issue 번호도 순차적
|
|
221
|
+
|
|
222
|
+
| TaskMaster ID | GitHub Issue | 제목 |
|
|
223
|
+
|---------------|--------------|------|
|
|
224
|
+
| task 1 | #1 | Next.js 15 프로젝트 초기 설정 |
|
|
225
|
+
| task 2 | #2 | 디자인 시스템 및 테마 구축 |
|
|
226
|
+
| ... | ... | ... |
|
|
227
|
+
|
|
228
|
+
**의존성 변환:**
|
|
229
|
+
- task 2의 dependencies: [1] → Issue #2 본문에 "선행 작업: #1 (task 1)"
|
|
230
|
+
|
|
231
|
+
### 7. 결과 보고 및 매핑 테이블 출력
|
|
232
|
+
|
|
233
|
+
**중요**: 실제 생성된 Issue 번호로 매핑 테이블 작성 (사전 확인에서 예측한 번호 기반)
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
[동기화 완료]
|
|
237
|
+
|
|
238
|
+
Milestones (4개):
|
|
239
|
+
- Phase 1: MVP
|
|
240
|
+
- Phase 2: Core Features
|
|
241
|
+
- Phase 3: UX Enhancement
|
|
242
|
+
- Phase 4: Deploy
|
|
243
|
+
|
|
244
|
+
Issues (12개):
|
|
245
|
+
| GitHub Issue | TaskMaster | 제목 | Milestone |
|
|
246
|
+
|--------------|------------|------|-----------|
|
|
247
|
+
| #N | task 1 | Next.js 15 프로젝트 초기 설정 | Phase 1: MVP |
|
|
248
|
+
| #N+1 | task 2 | 디자인 시스템 및 테마 구축 | Phase 1: MVP |
|
|
249
|
+
| #N+2 | task 3 | 공통 레이아웃 및 네비게이션 | Phase 1: MVP |
|
|
250
|
+
| #N+3 | task 4 | 인증 시스템 구현 | Phase 1: MVP |
|
|
251
|
+
| #N+4 | task 5 | 대시보드 홈 구현 | Phase 2: Core |
|
|
252
|
+
| ... | ... | ... | ... |
|
|
253
|
+
|
|
254
|
+
(N = 기존 최대 Issue/PR 번호 + 1)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**생성 후 검증:**
|
|
258
|
+
```bash
|
|
259
|
+
# 실제 생성된 Issue 확인
|
|
260
|
+
gh issue list --state open --json number,title --limit 20
|
|
261
|
+
|
|
262
|
+
# 매핑 확인
|
|
263
|
+
gh issue view <번호> --json body | grep "Task Master 참조"
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**다음 단계 안내:**
|
|
267
|
+
```
|
|
268
|
+
다음 단계: /tm:resolve-issue <GitHub Issue 번호> 또는 /tm:resolve-issue task 1
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 옵션 처리
|
|
274
|
+
|
|
275
|
+
### 아규먼트
|
|
276
|
+
- ARGUMENTS 비어있음: 전체 Task 동기화 (12개)
|
|
277
|
+
- ARGUMENTS가 Phase 번호: 해당 Phase만 (예: phase1, 1)
|
|
278
|
+
- ARGUMENTS가 Task ID: 해당 Task만 (예: task 1, 1,2,3)
|
|
279
|
+
|
|
280
|
+
### 상태 필터
|
|
281
|
+
- pending, in-progress 상태만 동기화
|
|
282
|
+
- done, cancelled는 건너뜀
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 주의사항
|
|
287
|
+
|
|
288
|
+
1. **중복 생성 방지**
|
|
289
|
+
|
|
290
|
+
동기화 전 반드시 기존 Issue 확인:
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
# 전체 Issue 목록 확인
|
|
294
|
+
gh issue list --state all --limit 100
|
|
295
|
+
|
|
296
|
+
# 특정 task가 이미 Issue로 생성되었는지 검색
|
|
297
|
+
gh issue list --search "Task Master 참조: task 1" --state all
|
|
298
|
+
|
|
299
|
+
# 또는 본문 내용으로 검색
|
|
300
|
+
gh issue list --search "in:body \"Task Master 참조\"" --state all
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**이미 존재하면**: 해당 task는 건너뛰고 사용자에게 알림
|
|
304
|
+
|
|
305
|
+
2. **사용자 확인 필수**
|
|
306
|
+
- Milestone/Issue 생성 전 반드시 계획 확인
|
|
307
|
+
- 라벨이 없으면 라벨 생성 여부 문의
|
|
308
|
+
|
|
309
|
+
3. **ID 매핑 기록 유지**
|
|
310
|
+
- 동기화 완료 후 매핑 테이블 출력
|
|
311
|
+
- 이후 resolve-issue에서 참조
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## ID 참조 가이드
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
[ID 형식 구분]
|
|
319
|
+
|
|
320
|
+
GitHub:
|
|
321
|
+
- Issue: #1, #2, #12 (# 접두어)
|
|
322
|
+
- PR: #13, #14 (Issue와 동일 네임스페이스)
|
|
323
|
+
- Milestone: "Phase 1: MVP" (이름으로 참조)
|
|
324
|
+
|
|
325
|
+
TaskMaster:
|
|
326
|
+
- 메인 태스크: task 1, task 2, task 12
|
|
327
|
+
- Subtask: task 1.1, task 1.2, task 2.1
|
|
328
|
+
- 상태: pending, in-progress, done
|
|
329
|
+
|
|
330
|
+
매핑:
|
|
331
|
+
- GitHub Issue #N ←→ TaskMaster task N (sync-to-github 실행 후)
|
|
332
|
+
- Issue 본문의 "Task Master 참조: task N"으로 연결
|
|
333
|
+
```
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# PRD 초안 템플릿
|
|
2
|
+
|
|
3
|
+
여기에 아이디어를 자유롭게 작성하세요.
|
|
4
|
+
`/tm:convert-prd` 커맨드로 TaskMaster PRD 포맷으로 변환됩니다.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 뭘 만들고 싶은지
|
|
9
|
+
|
|
10
|
+
(프로젝트 목적, 해결하려는 문제)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## 주요 기능
|
|
15
|
+
|
|
16
|
+
(만들고 싶은 기능들 나열)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
## 기술 스택
|
|
21
|
+
|
|
22
|
+
(사용할 기술, 프레임워크 등)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## 만드는 순서
|
|
27
|
+
|
|
28
|
+
(먼저 만들 것, 나중에 만들 것)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
## 기타
|
|
33
|
+
|
|
34
|
+
(걱정되는 점, 참고사항 등)
|
|
35
|
+
|
|
36
|
+
|
package/README.md
CHANGED
|
@@ -12,11 +12,15 @@ Claude Code CLI를 위한 커스텀 슬래시 커맨드, 에이전트, 스킬
|
|
|
12
12
|
│ ├── commit-and-push.md # Git 커밋 및 푸시 자동화
|
|
13
13
|
│ ├── edit-notebook.md # Jupyter Notebook 안전 편집
|
|
14
14
|
│ ├── plan.md # 구현 계획 수립 (코드 작성 전)
|
|
15
|
-
│
|
|
16
|
-
│
|
|
17
|
-
│
|
|
18
|
-
│
|
|
19
|
-
│
|
|
15
|
+
│ ├── gh/
|
|
16
|
+
│ │ ├── create-issue-label.md # GitHub 이슈 라벨 생성
|
|
17
|
+
│ │ ├── decompose-issue.md # 큰 작업을 이슈로 분해
|
|
18
|
+
│ │ ├── post-merge.md # PR 머지 후 정리 작업
|
|
19
|
+
│ │ └── resolve-issue.md # GitHub 이슈 해결 워크플로우
|
|
20
|
+
│ └── tm/
|
|
21
|
+
│ ├── post-merge.md # TaskMaster 연동 PR 머지 후 정리
|
|
22
|
+
│ ├── resolve-issue.md # TaskMaster 기반 이슈 해결
|
|
23
|
+
│ └── sync-to-github.md # TaskMaster -> GitHub 동기화
|
|
20
24
|
├── agents/ # 커스텀 에이전트
|
|
21
25
|
│ ├── web-researcher.md # 다중 플랫폼 웹 리서치
|
|
22
26
|
│ ├── python-pro.md # Python 전문가
|
|
@@ -54,6 +58,14 @@ Claude Code CLI를 위한 커스텀 슬래시 커맨드, 에이전트, 스킬
|
|
|
54
58
|
| `/gh/post-merge` | PR 머지 후 브랜치 정리 및 CLAUDE.md 업데이트 |
|
|
55
59
|
| `/gh/resolve-issue` | GitHub 이슈 번호를 받아 체계적으로 분석하고 해결 |
|
|
56
60
|
|
|
61
|
+
### TaskMaster 연동 커맨드 (`/tm/`)
|
|
62
|
+
|
|
63
|
+
| 커맨드 | 설명 |
|
|
64
|
+
|--------|------|
|
|
65
|
+
| `/tm/sync-to-github` | TaskMaster tasks.json을 GitHub Issue/Milestone으로 동기화 |
|
|
66
|
+
| `/tm/resolve-issue` | GitHub Issue를 TaskMaster subtask 단위로 체계적 해결 |
|
|
67
|
+
| `/tm/post-merge` | PR 머지 후 TaskMaster 상태 업데이트 및 브랜치 정리 |
|
|
68
|
+
|
|
57
69
|
## 에이전트
|
|
58
70
|
|
|
59
71
|
| 에이전트 | 설명 |
|
package/bin/cli.js
CHANGED
|
@@ -8,6 +8,9 @@ const readline = require('readline');
|
|
|
8
8
|
const pkg = require('../package.json');
|
|
9
9
|
const args = process.argv.slice(2);
|
|
10
10
|
|
|
11
|
+
// 설치 대상 폴더 (사용자 데이터가 아닌 것들만)
|
|
12
|
+
const INSTALL_FOLDERS = ['commands', 'agents', 'skills'];
|
|
13
|
+
|
|
11
14
|
// 옵션 파싱
|
|
12
15
|
const isGlobal = args.includes('--global') || args.includes('-g');
|
|
13
16
|
const showHelp = args.includes('--help') || args.includes('-h');
|
|
@@ -35,6 +38,14 @@ Claude Code Config v${pkg.version}
|
|
|
35
38
|
예시:
|
|
36
39
|
npx @yeongjaeyou/claude-code-config # 현재 프로젝트에 설치
|
|
37
40
|
npx @yeongjaeyou/claude-code-config --global # 전역 설치
|
|
41
|
+
|
|
42
|
+
설치되는 폴더:
|
|
43
|
+
- commands/ : 슬래시 커맨드
|
|
44
|
+
- agents/ : 커스텀 에이전트
|
|
45
|
+
- skills/ : 스킬 (재사용 가능한 도구 모음)
|
|
46
|
+
|
|
47
|
+
참고:
|
|
48
|
+
--global 설치 시 기존 사용자 데이터(settings.json, history.jsonl 등)는 보존됩니다.
|
|
38
49
|
`);
|
|
39
50
|
process.exit(0);
|
|
40
51
|
}
|
|
@@ -52,8 +63,8 @@ const dest = isGlobal
|
|
|
52
63
|
function askQuestion(question) {
|
|
53
64
|
// 비대화형 환경 감지 (CI/CD, 파이프라인 등)
|
|
54
65
|
if (!process.stdin.isTTY) {
|
|
55
|
-
console.log('비대화형 환경이 감지되었습니다. 기본값(
|
|
56
|
-
return Promise.resolve('');
|
|
66
|
+
console.log('비대화형 환경이 감지되었습니다. 기본값(merge)을 사용합니다.');
|
|
67
|
+
return Promise.resolve('merge');
|
|
57
68
|
}
|
|
58
69
|
|
|
59
70
|
const rl = readline.createInterface({
|
|
@@ -69,6 +80,91 @@ function askQuestion(question) {
|
|
|
69
80
|
});
|
|
70
81
|
}
|
|
71
82
|
|
|
83
|
+
/**
|
|
84
|
+
* 기존 설치 폴더 확인
|
|
85
|
+
* @returns {string[]} - 존재하는 폴더 목록
|
|
86
|
+
*/
|
|
87
|
+
function checkExistingFolders() {
|
|
88
|
+
const existing = [];
|
|
89
|
+
for (const folder of INSTALL_FOLDERS) {
|
|
90
|
+
const folderPath = path.join(dest, folder);
|
|
91
|
+
if (fs.existsSync(folderPath)) {
|
|
92
|
+
existing.push(folder);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return existing;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 폴더 복사 (재귀적)
|
|
100
|
+
* @param {string} src - 소스 경로
|
|
101
|
+
* @param {string} dst - 대상 경로
|
|
102
|
+
* @param {boolean} mergeMode - 병합 모드 여부
|
|
103
|
+
*/
|
|
104
|
+
function copyFolder(src, dst, mergeMode = false) {
|
|
105
|
+
if (!fs.existsSync(src)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// 대상 폴더 생성
|
|
110
|
+
if (!fs.existsSync(dst)) {
|
|
111
|
+
try {
|
|
112
|
+
fs.mkdirSync(dst, { recursive: true });
|
|
113
|
+
} catch (err) {
|
|
114
|
+
throw new Error(`폴더 생성 실패: ${dst} - ${err.message}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
119
|
+
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
const srcPath = path.join(src, entry.name);
|
|
122
|
+
const dstPath = path.join(dst, entry.name);
|
|
123
|
+
|
|
124
|
+
if (entry.isDirectory()) {
|
|
125
|
+
copyFolder(srcPath, dstPath, mergeMode);
|
|
126
|
+
} else {
|
|
127
|
+
// 병합 모드에서는 기존 파일 유지
|
|
128
|
+
if (mergeMode && fs.existsSync(dstPath)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
fs.copyFileSync(srcPath, dstPath);
|
|
133
|
+
} catch (err) {
|
|
134
|
+
throw new Error(`파일 복사 실패: ${srcPath} -> ${dstPath} - ${err.message}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* 설치 대상 폴더만 선택적으로 복사
|
|
142
|
+
* @param {string} mode - 'merge' | 'overwrite'
|
|
143
|
+
*/
|
|
144
|
+
function installFolders(mode) {
|
|
145
|
+
const mergeMode = mode === 'merge';
|
|
146
|
+
|
|
147
|
+
for (const folder of INSTALL_FOLDERS) {
|
|
148
|
+
const srcFolder = path.join(source, folder);
|
|
149
|
+
const dstFolder = path.join(dest, folder);
|
|
150
|
+
|
|
151
|
+
if (!fs.existsSync(srcFolder)) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 덮어쓰기 모드에서는 기존 폴더 삭제 후 복사
|
|
156
|
+
if (!mergeMode && fs.existsSync(dstFolder)) {
|
|
157
|
+
try {
|
|
158
|
+
fs.rmSync(dstFolder, { recursive: true });
|
|
159
|
+
} catch (err) {
|
|
160
|
+
throw new Error(`폴더 삭제 실패: ${dstFolder} - ${err.message}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
copyFolder(srcFolder, dstFolder, mergeMode);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
72
168
|
/**
|
|
73
169
|
* 메인 함수
|
|
74
170
|
*/
|
|
@@ -93,24 +189,58 @@ async function main() {
|
|
|
93
189
|
console.log(`설치 경로: ${dest}`);
|
|
94
190
|
console.log('');
|
|
95
191
|
|
|
96
|
-
// 대상
|
|
97
|
-
if (fs.existsSync(dest)) {
|
|
98
|
-
|
|
192
|
+
// 대상 폴더 생성 (없으면)
|
|
193
|
+
if (!fs.existsSync(dest)) {
|
|
194
|
+
try {
|
|
195
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
196
|
+
} catch (err) {
|
|
197
|
+
console.error(`오류: 대상 폴더를 생성할 수 없습니다: ${dest}`);
|
|
198
|
+
console.error(`상세: ${err.message}`);
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// 기존 설치 폴더 확인
|
|
204
|
+
const existingFolders = checkExistingFolders();
|
|
205
|
+
let installMode = 'overwrite';
|
|
99
206
|
|
|
100
|
-
|
|
207
|
+
if (existingFolders.length > 0) {
|
|
208
|
+
console.log('기존 설치 폴더가 발견되었습니다:');
|
|
209
|
+
existingFolders.forEach(folder => {
|
|
210
|
+
console.log(` - ${folder}/`);
|
|
211
|
+
});
|
|
212
|
+
console.log('');
|
|
101
213
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
214
|
+
if (isGlobal) {
|
|
215
|
+
console.log('(사용자 데이터는 보존됩니다: settings.json, history.jsonl 등)');
|
|
216
|
+
console.log('');
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
console.log('설치 옵션:');
|
|
220
|
+
console.log(' [m] merge - 새 파일만 추가 (기존 파일 유지)');
|
|
221
|
+
console.log(' [o] overwrite - 위 폴더들만 덮어쓰기');
|
|
222
|
+
console.log(' [c] cancel - 설치 취소');
|
|
223
|
+
console.log('');
|
|
224
|
+
|
|
225
|
+
const answer = await askQuestion('선택하세요 (m/o/c) [기본: m]: ');
|
|
226
|
+
|
|
227
|
+
if (answer === 'c' || answer === 'cancel') {
|
|
107
228
|
console.log('설치가 취소되었습니다.');
|
|
108
229
|
process.exit(0);
|
|
230
|
+
} else if (answer === 'o' || answer === 'overwrite') {
|
|
231
|
+
installMode = 'overwrite';
|
|
232
|
+
console.log('');
|
|
233
|
+
console.log('덮어쓰기 모드로 설치합니다...');
|
|
234
|
+
} else {
|
|
235
|
+
// 기본값: merge (빈 값, 'm', 'merge' 등)
|
|
236
|
+
installMode = 'merge';
|
|
237
|
+
console.log('');
|
|
238
|
+
console.log('병합 모드로 설치합니다 (기존 파일 유지)...');
|
|
109
239
|
}
|
|
110
240
|
}
|
|
111
241
|
|
|
112
|
-
// 폴더
|
|
113
|
-
|
|
242
|
+
// 폴더 설치
|
|
243
|
+
installFolders(installMode);
|
|
114
244
|
|
|
115
245
|
console.log('');
|
|
116
246
|
console.log('.claude/ 폴더가 성공적으로 설치되었습니다!');
|