jun-claude-code 0.0.14 → 0.0.16
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 +26 -1
- package/dist/init-context.js +41 -3
- package/package.json +1 -1
- package/templates/global/CLAUDE.md +4 -1
- package/templates/global/agents/context-collector.md +43 -34
- package/templates/global/agents/explore.md +20 -11
- package/templates/global/hooks/skill-forced-subagent.sh +82 -0
- package/templates/global/hooks/skill-forced.sh +67 -6
- package/templates/global/settings.json +10 -0
- package/templates/project/agents/context-generator.md +5 -6
- package/templates/project/agents/project-context-collector.md +146 -0
- package/templates/project/workflows/context-gen.yml +31 -4
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ Claude Code 설정 템플릿 CLI. 미리 정의된 Agents, Skills, Hooks, Workfl
|
|
|
21
21
|
| `architect` | 아키텍처 설계 |
|
|
22
22
|
| `designer` | UI/UX 스타일링 |
|
|
23
23
|
| `director` | 작업 총괄 디렉터 |
|
|
24
|
-
| `context-collector` | Context 수집 |
|
|
24
|
+
| `context-collector` | 소스 코드 기반 Context 수집 |
|
|
25
25
|
| `context-manager` | Context 문서 관리 |
|
|
26
26
|
|
|
27
27
|
### Skills (`templates/global/skills/`)
|
|
@@ -50,6 +50,7 @@ Claude Code 설정 템플릿 CLI. 미리 정의된 Agents, Skills, Hooks, Workfl
|
|
|
50
50
|
|-------|------|
|
|
51
51
|
| `project-task-manager` | GitHub Project 태스크 관리 |
|
|
52
52
|
| `context-generator` | Context 자동 생성 |
|
|
53
|
+
| `project-context-collector` | .claude/context/ 문서 기반 프로젝트 배경 수집 |
|
|
53
54
|
|
|
54
55
|
### Project Skills (`templates/project/skills/`)
|
|
55
56
|
|
|
@@ -73,6 +74,14 @@ npm install -g jun-claude-code
|
|
|
73
74
|
|
|
74
75
|
## 사용법
|
|
75
76
|
|
|
77
|
+
### 명령어 미리보기
|
|
78
|
+
|
|
79
|
+
| 명령어 | 설명 | 활성화되는 기능 |
|
|
80
|
+
|--------|------|----------------|
|
|
81
|
+
| `jun-claude-code` | 전역 설정 (`~/.claude/`) 설치 | Agents 13종, Skills 6종, Hooks 2종, Workflow |
|
|
82
|
+
| `jun-claude-code init-project` | GitHub Project 연동 | 세션 시작 시 태스크 자동 로드, 태스크 관리 Agent |
|
|
83
|
+
| `jun-claude-code init-context` | Context 자동 생성 설정 | PR 기반 Context 자동 생성, Codebase/Business 문서화, 별도 브랜치 PR |
|
|
84
|
+
|
|
76
85
|
### 기본 명령어: 설정 복사
|
|
77
86
|
|
|
78
87
|
`templates/global` 설정 파일을 `~/.claude`로 복사합니다.
|
|
@@ -99,6 +108,13 @@ jun-claude-code init-project
|
|
|
99
108
|
- Project Number
|
|
100
109
|
- Repository (owner/repo 형식)
|
|
101
110
|
|
|
111
|
+
**활성화되는 기능:**
|
|
112
|
+
|
|
113
|
+
| 기능 | 설명 |
|
|
114
|
+
|------|------|
|
|
115
|
+
| 세션 시작 시 태스크 자동 로드 | Claude Code 시작 시 `task-loader.sh`가 GitHub Project에서 할당된 태스크를 조회 |
|
|
116
|
+
| 태스크 관리 Agent | `project-task-manager` Agent를 통해 태스크 상태 변경, 코멘트 추가 가능 |
|
|
117
|
+
|
|
102
118
|
설정 후 생성되는 파일:
|
|
103
119
|
|
|
104
120
|
```
|
|
@@ -121,6 +137,15 @@ GitHub Actions를 통한 Context 문서 자동 생성을 설정합니다.
|
|
|
121
137
|
jun-claude-code init-context
|
|
122
138
|
```
|
|
123
139
|
|
|
140
|
+
**활성화되는 기능:**
|
|
141
|
+
|
|
142
|
+
| 기능 | 설명 |
|
|
143
|
+
|------|------|
|
|
144
|
+
| PR 기반 Context 자동 생성 | PR이 생성/업데이트되면 GitHub Actions가 코드 변경을 분석하여 Context 문서 생성 |
|
|
145
|
+
| Codebase Context | 모듈별 파일 경로, 함수명, 의존 관계를 `.claude/context/codebase/`에 정리 |
|
|
146
|
+
| Business Context | 기술 변경을 비즈니스 관점으로 변환하여 `.claude/context/business/`에 정리 |
|
|
147
|
+
| 별도 브랜치 PR 방식 | 생성된 Context를 `{브랜치명}-generated-context` 브랜치로 분리하여 선택적 머지 가능 |
|
|
148
|
+
|
|
124
149
|
설정 후 생성되는 파일:
|
|
125
150
|
|
|
126
151
|
```
|
package/dist/init-context.js
CHANGED
|
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.initContext = initContext;
|
|
40
40
|
const fs = __importStar(require("fs"));
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
|
+
const readline = __importStar(require("readline"));
|
|
42
43
|
const chalk_1 = __importDefault(require("chalk"));
|
|
43
44
|
/**
|
|
44
45
|
* Get the templates/project directory path (from package installation)
|
|
@@ -46,6 +47,22 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
46
47
|
function getTemplatesDir() {
|
|
47
48
|
return path.resolve(__dirname, '..', 'templates', 'project');
|
|
48
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Prompt user for confirmation using readline
|
|
52
|
+
*/
|
|
53
|
+
function askConfirmation(question) {
|
|
54
|
+
const rl = readline.createInterface({
|
|
55
|
+
input: process.stdin,
|
|
56
|
+
output: process.stdout,
|
|
57
|
+
});
|
|
58
|
+
return new Promise((resolve) => {
|
|
59
|
+
rl.question(question, (answer) => {
|
|
60
|
+
rl.close();
|
|
61
|
+
const normalized = answer.toLowerCase().trim();
|
|
62
|
+
resolve(normalized === 'y' || normalized === 'yes');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
49
66
|
/**
|
|
50
67
|
* Initialize context auto-generation with GitHub Actions
|
|
51
68
|
*/
|
|
@@ -57,7 +74,14 @@ async function initContext() {
|
|
|
57
74
|
const workflowDest = path.join(cwd, '.github', 'workflows', 'context-gen.yml');
|
|
58
75
|
fs.mkdirSync(path.dirname(workflowDest), { recursive: true });
|
|
59
76
|
if (fs.existsSync(workflowDest)) {
|
|
60
|
-
|
|
77
|
+
const shouldOverwrite = await askConfirmation(chalk_1.default.yellow(' ⚠ .github/workflows/context-gen.yml already exists. Overwrite? (y/N): '));
|
|
78
|
+
if (shouldOverwrite) {
|
|
79
|
+
fs.copyFileSync(templateSrc, workflowDest);
|
|
80
|
+
console.log(chalk_1.default.green(' ✓ Replaced .github/workflows/context-gen.yml'));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
console.log(chalk_1.default.gray(' Skipped: .github/workflows/context-gen.yml'));
|
|
84
|
+
}
|
|
61
85
|
}
|
|
62
86
|
else {
|
|
63
87
|
fs.copyFileSync(templateSrc, workflowDest);
|
|
@@ -68,7 +92,14 @@ async function initContext() {
|
|
|
68
92
|
const agentDest = path.join(cwd, '.claude', 'agents', 'context-generator.md');
|
|
69
93
|
fs.mkdirSync(path.dirname(agentDest), { recursive: true });
|
|
70
94
|
if (fs.existsSync(agentDest)) {
|
|
71
|
-
|
|
95
|
+
const shouldOverwrite = await askConfirmation(chalk_1.default.yellow(' ⚠ .claude/agents/context-generator.md already exists. Overwrite? (y/N): '));
|
|
96
|
+
if (shouldOverwrite) {
|
|
97
|
+
fs.copyFileSync(agentSrc, agentDest);
|
|
98
|
+
console.log(chalk_1.default.green(' ✓ Replaced .claude/agents/context-generator.md'));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.log(chalk_1.default.gray(' Skipped: .claude/agents/context-generator.md'));
|
|
102
|
+
}
|
|
72
103
|
}
|
|
73
104
|
else {
|
|
74
105
|
fs.copyFileSync(agentSrc, agentDest);
|
|
@@ -79,7 +110,14 @@ async function initContext() {
|
|
|
79
110
|
const skillDest = path.join(cwd, '.claude', 'skills', 'ContextGeneration', 'SKILL.md');
|
|
80
111
|
fs.mkdirSync(path.dirname(skillDest), { recursive: true });
|
|
81
112
|
if (fs.existsSync(skillDest)) {
|
|
82
|
-
|
|
113
|
+
const shouldOverwrite = await askConfirmation(chalk_1.default.yellow(' ⚠ .claude/skills/ContextGeneration/SKILL.md already exists. Overwrite? (y/N): '));
|
|
114
|
+
if (shouldOverwrite) {
|
|
115
|
+
fs.copyFileSync(skillSrc, skillDest);
|
|
116
|
+
console.log(chalk_1.default.green(' ✓ Replaced .claude/skills/ContextGeneration/SKILL.md'));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.log(chalk_1.default.gray(' Skipped: .claude/skills/ContextGeneration/SKILL.md'));
|
|
120
|
+
}
|
|
83
121
|
}
|
|
84
122
|
else {
|
|
85
123
|
fs.copyFileSync(skillSrc, skillDest);
|
package/package.json
CHANGED
|
@@ -13,7 +13,8 @@ Main Agent의 Context Window는 제한적입니다.
|
|
|
13
13
|
|------|-------|------|
|
|
14
14
|
| 코드베이스 탐색/검색 | `explore` | 파일 내용이 Main Context에 쌓이지 않음 |
|
|
15
15
|
| 여러 파일 읽기 | `explore`, `context-collector` | 탐색 결과만 요약해서 받음 |
|
|
16
|
-
|
|
|
16
|
+
| .claude/context/ 문서 수집 | `project-context-collector` | 프로젝트 배경 정보만 요약해서 받음 |
|
|
17
|
+
| 코드 패턴/구조 파악 | `context-collector` | 분석 결과만 받음 |
|
|
17
18
|
| 복잡한 계획 수립 | `task-planner` | 계획 결과만 받음 |
|
|
18
19
|
| 영향 분석 | `impact-analyzer` | 분석 결과만 받음 |
|
|
19
20
|
| 코드 리뷰 | `code-reviewer` | 리뷰 결과만 받음 |
|
|
@@ -30,6 +31,8 @@ Main Agent의 Context Window는 제한적입니다.
|
|
|
30
31
|
| 작업 | 전담 Agent |
|
|
31
32
|
|------|-----------|
|
|
32
33
|
| 파일 탐색 (Glob/Grep) | explore Agent가 전담 |
|
|
34
|
+
| .claude/context/ 문서 탐색 | project-context-collector가 전담 |
|
|
35
|
+
| 소스 코드 패턴/구조 파악 | context-collector가 전담 |
|
|
33
36
|
| 2개 이상 파일 읽기 | explore/context-collector가 전담 |
|
|
34
37
|
| 복잡한 분석/계획 | task-planner에 위임 |
|
|
35
38
|
| 파일 수정 | code-writer가 전담 |
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: context-collector
|
|
3
|
-
description:
|
|
4
|
-
keywords: [
|
|
5
|
-
model:
|
|
3
|
+
description: 실제 소스 코드에서 패턴/구현 방식/도메인 지식을 수집. Skill/Agent 식별, 코드 DEEP 탐색 전문.
|
|
4
|
+
keywords: [코드탐색, 패턴파악, Skill식별, 도메인지식, 아키텍처분석, DEEP탐색, 소스코드]
|
|
5
|
+
model: opus
|
|
6
6
|
color: blue
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -10,10 +10,10 @@ color: blue
|
|
|
10
10
|
|
|
11
11
|
<role>
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
소스 코드에서 패턴, 구현 방식, 도메인 지식을 수집하는 전문 Agent입니다.
|
|
14
14
|
|
|
15
|
-
1. **
|
|
16
|
-
2. **
|
|
15
|
+
1. **Skill 식별**: `.claude/skills/` 에서 필요한 Skill 확인
|
|
16
|
+
2. **Agent 식별**: `.claude/agents/` 에서 관련 Agent 확인
|
|
17
17
|
3. **코드 패턴 파악**: 기존 코드에서 유사한 구현 패턴 탐색
|
|
18
18
|
4. **도메인 지식 수집**: 관련 Entity, Service, Flow 파악
|
|
19
19
|
|
|
@@ -23,55 +23,54 @@ color: blue
|
|
|
23
23
|
|
|
24
24
|
## 수집 프로세스
|
|
25
25
|
|
|
26
|
-
### Step 1: 요청 분석
|
|
26
|
+
### Step 1: 요청 분석 및 탐색 전략 결정
|
|
27
|
+
|
|
28
|
+
요청을 분석하여 코드 탐색 전략을 결정합니다.
|
|
29
|
+
|
|
30
|
+
- 요청의 핵심 키워드와 도메인 영역을 식별
|
|
31
|
+
- 탐색 대상: Skill/Agent 문서 → 소스 코드 순서로 진행
|
|
32
|
+
- 탐색 범위를 판단하여 효율적으로 수집
|
|
33
|
+
|
|
34
|
+
### Step 2: Skill 및 Agent 탐색
|
|
27
35
|
|
|
28
36
|
```
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
- DB 변경이 필요한가? → database context 확인
|
|
32
|
-
- 도메인 로직인가? → domain context 확인
|
|
37
|
+
- .claude/skills/ 에서 작업에 필요한 Skill 확인
|
|
38
|
+
- .claude/agents/ 에서 관련 Agent 확인
|
|
33
39
|
```
|
|
34
40
|
|
|
35
|
-
### Step
|
|
41
|
+
### Step 3: 소스 코드 DEEP 탐색
|
|
42
|
+
|
|
43
|
+
실제 소스 코드를 직접 탐색하여 패턴과 구현 방식을 파악합니다.
|
|
36
44
|
|
|
37
45
|
```
|
|
38
46
|
- 유사한 기존 구현 찾기 (Grep, Glob 활용)
|
|
39
47
|
- Entity 구조 파악
|
|
40
48
|
- Service 패턴 확인
|
|
41
49
|
- Controller 구조 확인
|
|
50
|
+
- 함수명, 클래스명으로 사용처 검색
|
|
51
|
+
- import/export 관계 추적
|
|
42
52
|
```
|
|
43
53
|
|
|
44
|
-
### Step
|
|
45
|
-
|
|
46
|
-
```markdown
|
|
47
|
-
## 수집된 Context
|
|
48
|
-
|
|
49
|
-
### 관련 문서
|
|
50
|
-
- [ ] `.claude/context/xxx.md` - 관련 이유
|
|
51
|
-
|
|
52
|
-
### 활성화할 Skill
|
|
53
|
-
- [ ] `skill-name` - 필요 이유
|
|
54
|
+
### Step 4: Context 요약 출력
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
- `path/to/file.ts` - 유사 패턴 설명
|
|
57
|
-
|
|
58
|
-
### 도메인 지식
|
|
59
|
-
- 관련 Entity: ...
|
|
60
|
-
- 비즈니스 로직: ...
|
|
61
|
-
```
|
|
56
|
+
수집한 모든 정보를 output_format에 맞춰 정리합니다.
|
|
62
57
|
|
|
63
58
|
</instructions>
|
|
64
59
|
|
|
65
60
|
<output_format>
|
|
66
61
|
|
|
67
|
-
|
|
62
|
+
아래 형식으로 Context 수집 결과를 출력합니다:
|
|
68
63
|
|
|
69
64
|
```markdown
|
|
70
65
|
# Context 수집 결과
|
|
71
66
|
|
|
72
|
-
##
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
## 탐색 전략
|
|
68
|
+
- **탐색 범위**: (어떤 영역을 탐색했는지)
|
|
69
|
+
- **판단 근거**: (왜 이 범위를 탐색했는지)
|
|
70
|
+
|
|
71
|
+
## 1. 소스 코드 탐색 결과
|
|
72
|
+
| 파일 | 확인 내용 | 핵심 발견 |
|
|
73
|
+
|------|----------|----------|
|
|
75
74
|
| ... | ... | ... |
|
|
76
75
|
|
|
77
76
|
## 2. 필요한 Skill
|
|
@@ -79,7 +78,7 @@ color: blue
|
|
|
79
78
|
|-------|------|
|
|
80
79
|
| ... | ... |
|
|
81
80
|
|
|
82
|
-
## 3. 참고 코드
|
|
81
|
+
## 3. 참고 코드 패턴
|
|
83
82
|
| 파일 | 패턴 | 참고 이유 |
|
|
84
83
|
|------|------|----------|
|
|
85
84
|
| ... | ... | ... |
|
|
@@ -89,6 +88,16 @@ color: blue
|
|
|
89
88
|
|
|
90
89
|
## 5. 다음 단계 권장사항
|
|
91
90
|
- task-planner Agent로 TaskList 생성 권장
|
|
91
|
+
- 프로젝트 배경 정보가 필요하면 project-context-collector Agent 사용을 권장합니다.
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
</output_format>
|
|
95
|
+
|
|
96
|
+
<constraints>
|
|
97
|
+
|
|
98
|
+
## 제약사항
|
|
99
|
+
|
|
100
|
+
- `.claude/context/` 문서는 탐색하지 않습니다. 프로젝트 배경 정보가 필요하면 project-context-collector Agent를 안내합니다.
|
|
101
|
+
- 실제 소스 코드와 `.claude/skills/`, `.claude/agents/` 문서만 탐색합니다.
|
|
102
|
+
|
|
103
|
+
</constraints>
|
|
@@ -39,13 +39,21 @@ color: gray
|
|
|
39
39
|
- "~패턴의 파일들 목록"
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
###
|
|
42
|
+
### 다른 Agent가 적합한 경우
|
|
43
43
|
|
|
44
|
+
**project-context-collector** (프로젝트 배경 정보):
|
|
45
|
+
```
|
|
46
|
+
- .claude/context/ 문서에서 배경 정보 수집
|
|
47
|
+
- 비즈니스 규칙/도메인 용어 확인
|
|
48
|
+
- 모듈 구조/아키텍처 개요 파악
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**context-collector** (소스 코드 DEEP 탐색):
|
|
44
52
|
```
|
|
45
53
|
- 깊은 코드 분석 필요
|
|
46
|
-
- 비즈니스 로직 이해 필요
|
|
47
54
|
- 여러 파일 간 관계 파악
|
|
48
|
-
-
|
|
55
|
+
- Skill/Agent 식별
|
|
56
|
+
- 코드 패턴/구현 방식 분석
|
|
49
57
|
```
|
|
50
58
|
|
|
51
59
|
---
|
|
@@ -124,12 +132,13 @@ Glob: "src/module/*/index.ts"
|
|
|
124
132
|
|
|
125
133
|
---
|
|
126
134
|
|
|
127
|
-
##
|
|
135
|
+
## 관련 Agent 비교
|
|
128
136
|
|
|
129
|
-
| 항목 | explore | context-collector |
|
|
130
|
-
|
|
131
|
-
| 모델 | Haiku | Sonnet |
|
|
132
|
-
| 속도 | 빠름 | 보통 |
|
|
133
|
-
| 깊이 | 얕음 (위치만) | 깊음 (분석
|
|
134
|
-
| 비용 | 낮음 | 보통 |
|
|
135
|
-
|
|
|
137
|
+
| 항목 | explore | project-context-collector | context-collector |
|
|
138
|
+
|------|---------|--------------------------|-------------------|
|
|
139
|
+
| 모델 | Haiku | Sonnet | Opus |
|
|
140
|
+
| 속도 | 빠름 | 보통 | 느림 |
|
|
141
|
+
| 깊이 | 얕음 (위치만) | 중간 (문서 분석) | 깊음 (코드 분석) |
|
|
142
|
+
| 비용 | 낮음 | 보통 | 높음 |
|
|
143
|
+
| 대상 | 소스 코드 | .claude/context/ 문서 | 소스 코드 + Skill/Agent |
|
|
144
|
+
| 용도 | "어디 있지?" | "프로젝트 배경이 뭐지?" | "어떻게 동작하지?" |
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# .claude/hooks/skill-forced-subagent.sh
|
|
4
|
+
# Subagent용 Skill 평가 프로토콜 - SubagentStart hook
|
|
5
|
+
# Subagent가 작업 시작 전 관련 Skills를 평가하고 활성화하도록 유도
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
+
CLAUDE_DIR="$(dirname "$SCRIPT_DIR")"
|
|
9
|
+
GLOBAL_CLAUDE_DIR="$HOME/.claude"
|
|
10
|
+
PROJECT_CLAUDE_DIR="$(pwd)/.claude"
|
|
11
|
+
|
|
12
|
+
echo "✅ [Hook] Subagent Skill 평가 프로토콜 실행됨"
|
|
13
|
+
|
|
14
|
+
cat << 'EOF'
|
|
15
|
+
MANDATORY SKILL EVALUATION PROTOCOL (Subagent)
|
|
16
|
+
|
|
17
|
+
작업을 시작하기 전에 아래 단계를 완료하세요:
|
|
18
|
+
|
|
19
|
+
<phase name="Skill 평가">
|
|
20
|
+
|
|
21
|
+
## Skill 평가
|
|
22
|
+
|
|
23
|
+
Step 1 - Skill 평가: 각 Skill에 대해 다음을 명시하세요:
|
|
24
|
+
- Skill 이름
|
|
25
|
+
- YES 또는 NO (이 작업에 해당 Skill이 필요한가?)
|
|
26
|
+
- 한 줄 이유
|
|
27
|
+
|
|
28
|
+
Step 2 - Skill 활성화: YES로 표시된 모든 Skill의 SKILL.md를 읽으세요.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
### 사용 가능한 Skills (자동 탐색됨)
|
|
33
|
+
|
|
34
|
+
</phase>
|
|
35
|
+
EOF
|
|
36
|
+
|
|
37
|
+
# skills 폴더에서 SKILL.md 파일들의 frontmatter 자동 탐색
|
|
38
|
+
# 프로젝트 .claude/ 와 ~/.claude/ 양쪽에서 탐색 (프로젝트 우선, 중복 제거)
|
|
39
|
+
SEEN_SKILLS=""
|
|
40
|
+
for search_dir in "$PROJECT_CLAUDE_DIR" "$GLOBAL_CLAUDE_DIR"; do
|
|
41
|
+
if [ -d "$search_dir/skills" ]; then
|
|
42
|
+
for skill_dir in "$search_dir/skills"/*/; do
|
|
43
|
+
if [ -d "$skill_dir" ]; then
|
|
44
|
+
skill_name=$(basename "$skill_dir")
|
|
45
|
+
skill_file="$skill_dir/SKILL.md"
|
|
46
|
+
|
|
47
|
+
# 이미 탐색된 Skill은 건너뜀
|
|
48
|
+
case "$SEEN_SKILLS" in
|
|
49
|
+
*"|${skill_name}|"*) continue ;;
|
|
50
|
+
esac
|
|
51
|
+
SEEN_SKILLS="${SEEN_SKILLS}|${skill_name}|"
|
|
52
|
+
|
|
53
|
+
if [ -f "$skill_file" ]; then
|
|
54
|
+
# 출처 표시
|
|
55
|
+
if [ "$search_dir" = "$PROJECT_CLAUDE_DIR" ]; then
|
|
56
|
+
display_path=".claude/skills/$skill_name/SKILL.md"
|
|
57
|
+
else
|
|
58
|
+
display_path="~/.claude/skills/$skill_name/SKILL.md"
|
|
59
|
+
fi
|
|
60
|
+
echo "**[$skill_name]** \`$display_path\`"
|
|
61
|
+
echo '```yaml'
|
|
62
|
+
head -6 "$skill_file"
|
|
63
|
+
echo '```'
|
|
64
|
+
echo ""
|
|
65
|
+
fi
|
|
66
|
+
fi
|
|
67
|
+
done
|
|
68
|
+
fi
|
|
69
|
+
done
|
|
70
|
+
|
|
71
|
+
cat << 'EOF'
|
|
72
|
+
|
|
73
|
+
<phase name="구현">
|
|
74
|
+
|
|
75
|
+
## 구현
|
|
76
|
+
|
|
77
|
+
Step 3 - 구현: 관련 Skill을 확인한 후 작업을 시작하세요.
|
|
78
|
+
|
|
79
|
+
Skill의 규칙과 체크리스트를 준수하며 작업을 수행하세요.
|
|
80
|
+
|
|
81
|
+
</phase>
|
|
82
|
+
EOF
|
|
@@ -33,6 +33,8 @@ Main Agent의 Context Window는 제한적입니다.
|
|
|
33
33
|
| 작업 | 전담 Agent |
|
|
34
34
|
|------|-----------|
|
|
35
35
|
| 파일 탐색 (Glob/Grep) | explore Agent가 전담 |
|
|
36
|
+
| .claude/context/ 문서 탐색 | project-context-collector가 전담 |
|
|
37
|
+
| 소스 코드 패턴/구조 파악 | context-collector가 전담 |
|
|
36
38
|
| 2개 이상 파일 읽기 | explore/context-collector가 전담 |
|
|
37
39
|
| 복잡한 분석/계획 | task-planner에 위임 |
|
|
38
40
|
| 파일 수정 (3개 이상) | code-writer가 전담 |
|
|
@@ -126,14 +128,73 @@ cat << 'EOF'
|
|
|
126
128
|
|
|
127
129
|
<phase name="Context 확인">
|
|
128
130
|
|
|
129
|
-
## PART 1.5: CONTEXT
|
|
131
|
+
## PART 1.5: PROJECT CONTEXT (프로젝트 배경 정보)
|
|
130
132
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
+
아래는 이 프로젝트의 배경 정보입니다. 작업 판단 시 참고하세요.
|
|
134
|
+
상세 분석이 필요하면 아래 Agent에 위임하세요.
|
|
133
135
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
136
|
+
| 필요한 정보 | Agent | 호출 예시 |
|
|
137
|
+
|------------|-------|----------|
|
|
138
|
+
| 프로젝트 배경/도메인 지식 | project-context-collector | \`Task(subagent_type="project-context-collector", prompt="[작업]에 필요한 프로젝트 배경 정보를 수집해줘")\` |
|
|
139
|
+
| 소스 코드 패턴/구현 방식 | context-collector | \`Task(subagent_type="context-collector", prompt="[작업]에 필요한 코드 패턴을 수집해줘")\` |
|
|
140
|
+
|
|
141
|
+
두 Agent를 순차적으로 사용하면 가장 포괄적인 Context를 수집할 수 있습니다:
|
|
142
|
+
\`\`\`
|
|
143
|
+
1. project-context-collector → 프로젝트 배경 수집
|
|
144
|
+
2. context-collector → 소스 코드 패턴 수집
|
|
145
|
+
\`\`\`
|
|
146
|
+
|
|
147
|
+
EOF
|
|
148
|
+
|
|
149
|
+
# context 디렉토리에서 business/codebase context 동적 탐색
|
|
150
|
+
# 프로젝트 .claude/context/ 만 탐색 (글로벌 ~/.claude/context/는 탐색하지 않음)
|
|
151
|
+
CONTEXT_BASE_DIR="$PROJECT_CLAUDE_DIR/context"
|
|
152
|
+
HAS_CONTEXT=false
|
|
153
|
+
|
|
154
|
+
for context_type in "business" "codebase"; do
|
|
155
|
+
context_dir="$CONTEXT_BASE_DIR/$context_type"
|
|
156
|
+
if [ -d "$context_dir" ]; then
|
|
157
|
+
HAS_CONTEXT=true
|
|
158
|
+
|
|
159
|
+
# 헤더 출력
|
|
160
|
+
if [ "$context_type" = "business" ]; then
|
|
161
|
+
echo "---"
|
|
162
|
+
echo ""
|
|
163
|
+
echo "### Business Context"
|
|
164
|
+
echo ""
|
|
165
|
+
else
|
|
166
|
+
echo "---"
|
|
167
|
+
echo ""
|
|
168
|
+
echo "### Codebase Context"
|
|
169
|
+
echo ""
|
|
170
|
+
fi
|
|
171
|
+
|
|
172
|
+
# INDEX.md가 있으면 내용 출력
|
|
173
|
+
if [ -f "$context_dir/INDEX.md" ]; then
|
|
174
|
+
cat "$context_dir/INDEX.md"
|
|
175
|
+
echo ""
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
# INDEX.md 외의 .md 파일 목록을 상세 문서로 표시
|
|
179
|
+
has_detail_docs=false
|
|
180
|
+
for md_file in "$context_dir"/*.md; do
|
|
181
|
+
if [ -f "$md_file" ] && [ "$(basename "$md_file")" != "INDEX.md" ]; then
|
|
182
|
+
if [ "$has_detail_docs" = false ]; then
|
|
183
|
+
has_detail_docs=true
|
|
184
|
+
fi
|
|
185
|
+
echo "상세 문서: \`$(basename "$md_file")\`"
|
|
186
|
+
fi
|
|
187
|
+
done
|
|
188
|
+
echo ""
|
|
189
|
+
fi
|
|
190
|
+
done
|
|
191
|
+
|
|
192
|
+
if [ "$HAS_CONTEXT" = false ]; then
|
|
193
|
+
echo "프로젝트 context가 없습니다. (.claude/context/business/ 또는 .claude/context/codebase/ 디렉토리가 없음)"
|
|
194
|
+
echo ""
|
|
195
|
+
fi
|
|
196
|
+
|
|
197
|
+
cat << 'EOF'
|
|
137
198
|
|
|
138
199
|
</phase>
|
|
139
200
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: context-generator
|
|
3
3
|
description: GitHub Action에서 PR diff 기반으로 .claude/context/ 문서를 자동 생성/업데이트 (CI 전용)
|
|
4
4
|
keywords: [context, PR, diff, codebase, business, 문서생성]
|
|
5
|
-
model:
|
|
5
|
+
model: opus
|
|
6
6
|
color: green
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -52,12 +52,11 @@ git diff HEAD~1 --name-only
|
|
|
52
52
|
- 도메인별 `.md` 파일 생성/업데이트
|
|
53
53
|
- `business/INDEX.md` 업데이트
|
|
54
54
|
|
|
55
|
-
### 6.
|
|
55
|
+
### 6. 반영
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
```
|
|
57
|
+
- 생성된 context 문서는 `{브랜치명}-generated-context` 브랜치에 push됩니다.
|
|
58
|
+
- 원본 PR 브랜치로 별도 PR이 생성되어 선택적으로 머지할 수 있습니다.
|
|
59
|
+
- PR이 re-sync되면 context 브랜치가 force push로 업데이트됩니다.
|
|
61
60
|
|
|
62
61
|
## 제약사항
|
|
63
62
|
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: project-context-collector
|
|
3
|
+
description: 프로젝트 배경 정보 수집 시 호출. .claude/context/의 business/codebase 문서에서 도메인 지식, 아키텍처 정보를 수집하여 요약 제공.
|
|
4
|
+
keywords: [프로젝트배경, 문서탐색, business-context, codebase-context, 도메인지식, INDEX]
|
|
5
|
+
model: sonnet
|
|
6
|
+
color: blue
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Project Context Collector Agent
|
|
10
|
+
|
|
11
|
+
<role>
|
|
12
|
+
|
|
13
|
+
프로젝트의 `.claude/context/` 문서에서 배경 정보를 수집하는 전문 Agent입니다.
|
|
14
|
+
|
|
15
|
+
1. **Business Context 탐색**: `.claude/context/business/` 에서 도메인 규칙, 비즈니스 로직 파악
|
|
16
|
+
2. **Codebase Context 탐색**: `.claude/context/codebase/` 에서 모듈 구조, 아키텍처 파악
|
|
17
|
+
3. **INDEX 기반 탐색**: INDEX.md를 기점으로 관련 상세 문서를 단계적으로 확인
|
|
18
|
+
4. **요약 제공**: 수집한 배경 정보를 구조화하여 반환
|
|
19
|
+
|
|
20
|
+
</role>
|
|
21
|
+
|
|
22
|
+
## 특징
|
|
23
|
+
|
|
24
|
+
- **Sonnet 모델**: 문서 이해와 요약에 적합
|
|
25
|
+
- **문서 전용**: `.claude/context/` 디렉토리만 탐색, 소스 코드 탐색은 수행하지 않음
|
|
26
|
+
- **빠른 배경 파악**: INDEX.md 기반으로 필요한 문서만 선택적으로 확인
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 사용 시점
|
|
31
|
+
|
|
32
|
+
### 적합한 경우
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
- 프로젝트 배경 이해가 필요한 경우
|
|
36
|
+
- 도메인 규칙/비즈니스 로직 확인
|
|
37
|
+
- 모듈 구조/아키텍처 개요 파악
|
|
38
|
+
- 작업 시작 전 프로젝트 컨텍스트 수집
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### context-collector가 적합한 경우
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
- 실제 소스 코드 확인이 필요한 경우
|
|
45
|
+
- 코드 패턴/구현 방식 분석
|
|
46
|
+
- Skill/Agent 문서 식별
|
|
47
|
+
- 파일 간 의존성/호출 관계 추적
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
<instructions>
|
|
53
|
+
|
|
54
|
+
## 수집 프로세스
|
|
55
|
+
|
|
56
|
+
### Step 1: 요청 분석 및 탐색 카테고리 결정
|
|
57
|
+
|
|
58
|
+
요청을 분석하여 **탐색 카테고리**와 **탐색 깊이**를 결정합니다.
|
|
59
|
+
|
|
60
|
+
**탐색 카테고리 판단:**
|
|
61
|
+
|
|
62
|
+
| 요청 유형 | 우선 탐색 대상 | 예시 |
|
|
63
|
+
|----------|--------------|------|
|
|
64
|
+
| 도메인/비즈니스 규칙 관련 | `business/` | 결제 로직, 사용자 권한, 정책 |
|
|
65
|
+
| 코드 구조/기술 관련 | `codebase/` | 모듈 구조, API 설계, DB 스키마 |
|
|
66
|
+
| 기능 구현 (양쪽 모두 필요) | `business/` → `codebase/` | 새 기능 개발, 리팩토링 |
|
|
67
|
+
|
|
68
|
+
**탐색 깊이 판단:**
|
|
69
|
+
|
|
70
|
+
| 깊이 | 조건 | 설명 |
|
|
71
|
+
|------|------|------|
|
|
72
|
+
| Quick | 전체 개요만 필요 | INDEX.md만 확인 (빠른 오버뷰) |
|
|
73
|
+
| Standard | 특정 도메인/모듈 이해 필요 | INDEX.md → 관련 상세 문서 확인 |
|
|
74
|
+
|
|
75
|
+
### Step 2: INDEX.md 확인
|
|
76
|
+
|
|
77
|
+
`.claude/context/` 디렉토리가 존재하면 INDEX.md부터 확인합니다.
|
|
78
|
+
디렉토리가 존재하지 않으면 "프로젝트 Context 문서가 없습니다"를 반환합니다.
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
.claude/context/business/INDEX.md → 프로젝트 개요, 도메인 목록, 비즈니스 규칙 요약
|
|
82
|
+
.claude/context/codebase/INDEX.md → 모듈 구조, 기술 스택, 아키텍처 요약
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- INDEX.md에서 요청과 관련된 섹션/키워드를 식별
|
|
86
|
+
- 관련 상세 문서 경로를 추출
|
|
87
|
+
- Quick 깊이면 여기서 종료
|
|
88
|
+
|
|
89
|
+
### Step 3: 상세 문서 확인 (Standard 깊이)
|
|
90
|
+
|
|
91
|
+
INDEX.md에서 식별한 관련 문서를 읽습니다.
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
.claude/context/business/*.md → 비즈니스 규칙, 사용자 흐름, 도메인 용어
|
|
95
|
+
.claude/context/codebase/*.md → 모듈 관계, 핵심 워크플로우, API 명세
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
- 상세 문서에서 핵심 정보 추출
|
|
99
|
+
- 요청과 관련도가 높은 내용 우선 수집
|
|
100
|
+
|
|
101
|
+
### Step 4: Context 요약 출력
|
|
102
|
+
|
|
103
|
+
수집한 모든 정보를 output_format에 맞춰 정리합니다.
|
|
104
|
+
|
|
105
|
+
</instructions>
|
|
106
|
+
|
|
107
|
+
<output_format>
|
|
108
|
+
|
|
109
|
+
아래 형식으로 Context 수집 결과를 출력합니다:
|
|
110
|
+
|
|
111
|
+
```markdown
|
|
112
|
+
# Project Context 수집 결과
|
|
113
|
+
|
|
114
|
+
## 탐색 전략
|
|
115
|
+
- **카테고리**: business / codebase / 양쪽 모두
|
|
116
|
+
- **탐색 깊이**: Quick / Standard
|
|
117
|
+
- **판단 근거**: (왜 이 깊이까지 탐색했는지)
|
|
118
|
+
|
|
119
|
+
## 1. Business Context (해당시)
|
|
120
|
+
| 문서 | 관련성 | 핵심 내용 |
|
|
121
|
+
|------|--------|----------|
|
|
122
|
+
| ... | ... | ... |
|
|
123
|
+
|
|
124
|
+
## 2. Codebase Context (해당시)
|
|
125
|
+
| 문서 | 관련성 | 핵심 내용 |
|
|
126
|
+
|------|--------|----------|
|
|
127
|
+
| ... | ... | ... |
|
|
128
|
+
|
|
129
|
+
## 3. 핵심 요약
|
|
130
|
+
- ...
|
|
131
|
+
|
|
132
|
+
## 4. 다음 단계 권장사항
|
|
133
|
+
- 실제 코드 확인이 필요하면 context-collector Agent 사용을 권장합니다.
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
</output_format>
|
|
137
|
+
|
|
138
|
+
<constraints>
|
|
139
|
+
|
|
140
|
+
## 제약사항
|
|
141
|
+
|
|
142
|
+
- `.claude/context/` 디렉토리의 문서만 탐색합니다.
|
|
143
|
+
- 실제 소스 코드(`src/`, `lib/` 등)는 탐색하지 않습니다. 소스 코드 확인이 필요하면 context-collector Agent를 안내합니다.
|
|
144
|
+
- `.claude/skills/`나 `.claude/agents/` 문서는 탐색하지 않습니다. Skill/Agent 식별이 필요하면 context-collector Agent를 안내합니다.
|
|
145
|
+
|
|
146
|
+
</constraints>
|
|
@@ -40,7 +40,7 @@ jobs:
|
|
|
40
40
|
with:
|
|
41
41
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
42
42
|
show_full_output: true
|
|
43
|
-
claude_args: '--allowedTools "Bash(git:*),Bash(ls:*),Bash(mkdir:*),Read,Write,Edit,Glob,Grep"'
|
|
43
|
+
claude_args: '--model opus --allowedTools "Bash(git:*),Bash(ls:*),Bash(mkdir:*),Read,Write,Edit,Glob,Grep"'
|
|
44
44
|
prompt: |
|
|
45
45
|
# 에이전트 정의
|
|
46
46
|
${{ steps.read-skills.outputs.agent_def }}
|
|
@@ -63,13 +63,40 @@ jobs:
|
|
|
63
63
|
- 위 스킬 가이드에 명시된 정확한 형식 따르기
|
|
64
64
|
- 커밋하지 마세요. 파일 생성/수정만 하세요.
|
|
65
65
|
|
|
66
|
-
- name: Push context
|
|
66
|
+
- name: Push context to separate branch and create PR
|
|
67
67
|
run: |
|
|
68
68
|
git config user.name "github-actions[bot]"
|
|
69
69
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
70
70
|
git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}.git"
|
|
71
|
+
|
|
71
72
|
git add .claude/context/
|
|
72
|
-
git diff --staged --quiet
|
|
73
|
-
|
|
73
|
+
if git diff --staged --quiet; then
|
|
74
|
+
echo "No context changes detected"
|
|
75
|
+
exit 0
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
CONTEXT_BRANCH="${{ github.head_ref }}-generated-context"
|
|
79
|
+
git commit -m "docs: context 문서 자동 업데이트"
|
|
80
|
+
git push --force origin HEAD:refs/heads/${CONTEXT_BRANCH}
|
|
81
|
+
|
|
82
|
+
# 기존 PR이 있으면 스킵, 없으면 생성
|
|
83
|
+
EXISTING_PR=$(gh pr list --head "${CONTEXT_BRANCH}" --base "${{ github.head_ref }}" --json number --jq '.[0].number')
|
|
84
|
+
if [ -z "$EXISTING_PR" ]; then
|
|
85
|
+
gh pr create \
|
|
86
|
+
--head "${CONTEXT_BRANCH}" \
|
|
87
|
+
--base "${{ github.head_ref }}" \
|
|
88
|
+
--title "docs: context 문서 자동 업데이트" \
|
|
89
|
+
--body "$(cat <<'PREOF'
|
|
90
|
+
## Auto-generated Context
|
|
91
|
+
|
|
92
|
+
PR의 코드 변경을 분석하여 자동 생성된 context 문서입니다.
|
|
93
|
+
선택적으로 머지하여 반영할 수 있습니다.
|
|
94
|
+
|
|
95
|
+
> 이 PR은 re-sync 시 force push로 업데이트됩니다.
|
|
96
|
+
PREOF
|
|
97
|
+
)"
|
|
98
|
+
else
|
|
99
|
+
echo "PR #${EXISTING_PR} already exists, force-pushed updates"
|
|
100
|
+
fi
|
|
74
101
|
env:
|
|
75
102
|
GITHUB_TOKEN: ${{ github.token }}
|