binary-agents 1.0.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.
@@ -0,0 +1,423 @@
1
+ # Claude 서브에이전트 모음 (Subagents Collection)
2
+
3
+ React/TypeScript 코드베이스 분석을 위한 Claude 서브에이전트 모음입니다.
4
+
5
+ ## 📋 서브에이전트 개요
6
+
7
+ ### 기본 버전 (Basic) vs 고급 버전 (Advanced)
8
+
9
+ | 특징 | 기본 버전 | 고급 버전 |
10
+ |------|----------|----------|
11
+ | **모델** | Haiku (빠름, 저렴) | Sonnet (강력, 심층 분석) |
12
+ | **도구** | Read, Glob, Grep | Read, Glob, Grep, WebFetch, WebSearch |
13
+ | **속도** | ⚡⚡⚡ 매우 빠름 | ⚡⚡ 빠름 |
14
+ | **비용** | 💰 저렴 | 💰💰 보통 |
15
+ | **분석 깊이** | 기본적인 패턴 인식 | 심층 추론 + 웹 리서치 |
16
+ | **권장사항** | 코드 기반 | 업계 표준 비교 + 학습 리소스 |
17
+ | **사용 시기** | 빠른 스캔, 일상적 검토 | 심층 분석, 아키텍처 리뷰 |
18
+
19
+ ---
20
+
21
+ ## 🔍 사용 가능한 서브에이전트
22
+
23
+ ### 0. Subagent Builder (서브에이전트 빌더) 🛠️ **META**
24
+
25
+ #### [subagent-builder.md](subagent-builder.md) - 메타 에이전트 ⭐⭐⭐
26
+ ```yaml
27
+ 모델: sonnet
28
+ 도구: Read, Glob, Grep, Write, Edit, WebFetch, WebSearch
29
+ 설명: 서브에이전트를 생성, 수정, 커스터마이징하는 메타 에이전트
30
+ ```
31
+
32
+ **주요 기능:**
33
+ - 🆕 새로운 서브에이전트 생성
34
+ - ✏️ 기존 서브에이전트 수정 및 커스터마이징
35
+ - 🎯 프로젝트별 특화 (React → Vue, Next.js 등)
36
+ - ⚙️ 모델/도구 최적화
37
+ - 📋 템플릿 제공 및 검증
38
+ - 🌐 도메인 베스트 프랙티스 리서치
39
+
40
+ **언제 사용하나요?**
41
+ - ✅ 새로운 분석 에이전트가 필요할 때
42
+ - ✅ 기존 에이전트를 특정 프레임워크에 맞추고 싶을 때
43
+ - ✅ 회사/팀 내부 규칙을 추가하고 싶을 때
44
+ - ✅ 서브에이전트 성능 최적화 (모델, 도구 선택)
45
+ - ✅ 여러 프로젝트에 맞는 에이전트 관리
46
+
47
+ **사용 예시:**
48
+ ```bash
49
+ # 새로운 에이전트 생성
50
+ "subagent-builder를 사용해서 Vue 3 Composition API를
51
+ 검사하는 에이전트 만들어줘"
52
+
53
+ # 기존 에이전트 커스터마이징
54
+ "code-reviewer를 Next.js 14 App Router에 특화되도록 수정해줘"
55
+
56
+ # 팀 규칙 추가
57
+ "junior-friendly-checker에 우리 회사 코딩 컨벤션을 추가해줘"
58
+
59
+ # 성능 최적화
60
+ "이 에이전트를 더 빠르게 만들 수 있을까?"
61
+ ```
62
+
63
+ **출력물:**
64
+ - ✅ 새로운 `.md` 파일 생성
65
+ - ✅ 기존 파일 수정
66
+ - ✅ 설정 검증 및 최적화 제안
67
+ - ✅ 사용 가이드 및 예시
68
+
69
+ **📖 자세한 사용법은 [BUILDER_GUIDE.md](BUILDER_GUIDE.md)를 참고하세요!**
70
+
71
+ **실전 예시:**
72
+ - 🎯 Vue 3 전용 에이전트 만들기
73
+ - 🎯 팀 코딩 컨벤션 추가하기
74
+ - 🎯 보안 감사 에이전트 생성
75
+ - 🎯 성능 최적화
76
+ - 🎯 자동 수정 기능 추가
77
+
78
+ ---
79
+
80
+ ### 1. Code Quality Reviewers (코드 품질 리뷰어)
81
+
82
+ #### [code-reviewer.md](code-reviewer.md) - 기본 버전
83
+ ```yaml
84
+ 모델: haiku
85
+ 도구: Read, Glob, Grep
86
+ 설명: 함수형 프로그래밍, 클린 코드, 관심사 분리, 유지보수성 검토
87
+ ```
88
+
89
+ **평가 항목 (5개):**
90
+ - ✅ 함수형 프로그래밍 원칙
91
+ - ✅ 관심사의 분리
92
+ - ✅ 코드 가독성
93
+ - ✅ React 특화 패턴
94
+ - ✅ TypeScript 사용
95
+
96
+ **언제 사용하나요?**
97
+ - 빠른 코드 품질 체크
98
+ - PR 리뷰 전 자동 검사
99
+ - 일상적인 코드 검토
100
+
101
+ ---
102
+
103
+ #### [advanced-code-reviewer.md](advanced-code-reviewer.md) - 고급 버전 ⭐
104
+ ```yaml
105
+ 모델: sonnet
106
+ 도구: Read, Glob, Grep, WebFetch, WebSearch
107
+ 설명: 심층 아키텍처 분석 + 웹 기반 베스트 프랙티스 리서치
108
+ ```
109
+
110
+ **평가 항목 (7개):**
111
+ - ✅ 함수형 프로그래밍 원칙
112
+ - ✅ **아키텍처 & 디자인 패턴** (신규)
113
+ - ✅ 관심사의 분리
114
+ - ✅ 코드 가독성
115
+ - ✅ React 특화 패턴
116
+ - ✅ TypeScript 사용
117
+ - ✅ **성능 & 최적화** (신규)
118
+
119
+ **웹 리서치 기능:**
120
+ - 🌐 최신 베스트 프랙티스 검색 (2025)
121
+ - 🌐 공식 문서 참조 (React, TypeScript 등)
122
+ - 🌐 업계 표준과 비교 분석
123
+ - 🌐 학습 리소스 제공
124
+
125
+ **언제 사용하나요?**
126
+ - 아키텍처 리뷰가 필요할 때
127
+ - 최신 패턴 적용 여부 확인
128
+ - 심층적인 품질 분석
129
+ - 팀 온보딩 전 코드베이스 평가
130
+
131
+ ---
132
+
133
+ ### 2. Refactoring Analyzers (리팩토링 분석기)
134
+
135
+ #### [refactor-analyzer.md](refactor-analyzer.md) - 기본 버전
136
+ ```yaml
137
+ 모델: haiku
138
+ 도구: Read, Glob, Grep
139
+ 설명: 코드 중복, 복잡도, 추상화 기회, 코드 스멜, 성능 문제 식별
140
+ ```
141
+
142
+ **분석 영역 (5개):**
143
+ - 🔍 코드 중복
144
+ - 🔍 순환 복잡도 (Cyclomatic Complexity)
145
+ - 🔍 추상화 기회
146
+ - 🔍 코드 스멜
147
+ - 🔍 성능 기회
148
+
149
+ **언제 사용하나요?**
150
+ - 기술 부채 파악
151
+ - 리팩토링 우선순위 결정
152
+ - 코드 정리 작업 전
153
+
154
+ ---
155
+
156
+ #### [advanced-refactor-analyzer.md](advanced-refactor-analyzer.md) - 고급 버전 ⭐
157
+ ```yaml
158
+ 모델: sonnet
159
+ 도구: Read, Glob, Grep, WebFetch, WebSearch
160
+ 설명: 심층 리팩토링 분석 + 업계 패턴 리서치 + 아키텍처 권장사항
161
+ ```
162
+
163
+ **분석 영역 (6개):**
164
+ - 🔍 코드 중복
165
+ - 🔍 순환 복잡도
166
+ - 🔍 추상화 기회
167
+ - 🔍 코드 스멜
168
+ - 🔍 성능 기회
169
+ - 🔍 **아키텍처 부채** (신규)
170
+
171
+ **웹 리서치 기능:**
172
+ - 🌐 최신 리팩토링 패턴 검색
173
+ - 🌐 리팩토링 카탈로그 참조 (refactoring.guru 등)
174
+ - 🌐 마이그레이션 가이드 제공
175
+ - 🌐 업계 사례 연구
176
+ - 🌐 구체적인 코드 예제 제공
177
+
178
+ **추가 기능:**
179
+ - 📊 업계 벤치마크와 비교
180
+ - 📈 ROI(투자 대비 효과) 분석
181
+ - 🛣️ 단계별 마이그레이션 경로
182
+ - ⚠️ 리스크 평가 (낮음/중간/높음)
183
+
184
+ **언제 사용하나요?**
185
+ - 대규모 리팩토링 계획
186
+ - 아키텍처 현대화
187
+ - 레거시 코드 개선
188
+ - 최신 패턴 적용 검토
189
+
190
+ ---
191
+
192
+ ### 3. Junior Developer Readability Checkers (주니어 친화성 검사기)
193
+
194
+ #### [junior-friendly-checker.md](junior-friendly-checker.md) - 기본 버전
195
+ ```yaml
196
+ 모델: haiku
197
+ 도구: Read, Glob, Grep
198
+ 설명: 주니어 개발자 관점에서 네이밍, 복잡도, 주석, 구조, 타입 명확성 평가
199
+ ```
200
+
201
+ **평가 항목 (5개):**
202
+ - 👤 네이밍 명확성 (25%)
203
+ - 👤 함수 복잡도 (20%)
204
+ - 👤 주석 품질 (25%)
205
+ - 👤 코드 구조 (15%)
206
+ - 👤 타입 명확성 (15%)
207
+
208
+ **특징:**
209
+ - 온보딩 시나리오 시뮬레이션
210
+ - 학습 곡선 예측
211
+ - 주니어 관점의 장벽 식별
212
+
213
+ **언제 사용하나요?**
214
+ - 팀에 주니어 합류 예정
215
+ - 코드 가독성 개선
216
+ - 온보딩 시간 단축 목표
217
+
218
+ ---
219
+
220
+ #### [advanced-junior-checker.md](advanced-junior-checker.md) - 고급 버전 ⭐
221
+ ```yaml
222
+ 모델: sonnet
223
+ 도구: Read, Glob, Grep, WebFetch, WebSearch
224
+ 설명: 리서치 기반 권장사항 + 학습 리소스 큐레이션
225
+ ```
226
+
227
+ **평가 항목 (6개):**
228
+ - 👤 네이밍 명확성 (25%)
229
+ - 👤 함수 복잡도 (20%)
230
+ - 👤 주석 품질 (25%)
231
+ - 👤 코드 구조 (15%)
232
+ - 👤 타입 명확성 (10%)
233
+ - 👤 **학습 곡선 평가** (5%, 신규)
234
+
235
+ **웹 리서치 기능:**
236
+ - 🌐 효과적인 온보딩 사례 연구
237
+ - 🌐 개념별 학습 리소스 큐레이션
238
+ - 🌐 공식 문서 + 튜토리얼 제공
239
+ - 🌐 업계 온보딩 베스트 프랙티스
240
+ - 🌐 단계별 학습 경로 제안
241
+
242
+ **추가 기능:**
243
+ - 📚 큐레이션된 학습 리소스
244
+ - 🎯 개념별 난이도 평가
245
+ - 📖 문서화 템플릿 제공
246
+ - 🗺️ 단계별 학습 경로
247
+
248
+ **언제 사용하나요?**
249
+ - 체계적인 온보딩 프로그램 구축
250
+ - 주니어 교육 자료 개발
251
+ - 코드베이스 접근성 극대화
252
+ - 팀 성장 계획 수립
253
+
254
+ ---
255
+
256
+ ## 🎯 어떤 버전을 선택해야 하나요?
257
+
258
+ ### 기본 버전 (Haiku) 선택
259
+ - ✅ 빠른 피드백이 필요할 때
260
+ - ✅ 비용을 절감하고 싶을 때
261
+ - ✅ 일상적인 코드 검토
262
+ - ✅ 명확한 패턴 기반 분석
263
+ - ✅ CI/CD 파이프라인 자동화
264
+
265
+ ### 고급 버전 (Sonnet) 선택
266
+ - ⭐ 아키텍처 리뷰가 필요할 때
267
+ - ⭐ 최신 베스트 프랙티스 확인
268
+ - ⭐ 학습 리소스가 필요할 때
269
+ - ⭐ 심층 분석 및 추론이 필요할 때
270
+ - ⭐ 팀 온보딩 자료 개발
271
+ - ⭐ 대규모 리팩토링 계획
272
+
273
+ ---
274
+
275
+ ## ❓ 어떻게 사용하나요?
276
+
277
+ ### 🚨 중요: 자동 선택되지 않습니다!
278
+
279
+ Claude는 **명시적으로 요청**해야 해당 서브에이전트를 실행합니다.
280
+
281
+ ### 사용 방법
282
+
283
+ #### 방법 1: 직접 지정 (명확함)
284
+ ```bash
285
+ "code-reviewer를 사용해서 이 프로젝트 분석해줘"
286
+ → code-reviewer.md 실행 (Haiku, 빠름)
287
+
288
+ "advanced-code-reviewer를 사용해서 최신 패턴과 비교해줘"
289
+ → advanced-code-reviewer.md 실행 (Sonnet, 웹 리서치)
290
+ ```
291
+
292
+ #### 방법 2: 상황 설명 (추천)
293
+ Claude가 요청 내용을 보고 적절한 에이전트 선택:
294
+
295
+ ```bash
296
+ # 빠른 체크 → 기본 버전 선택
297
+ "빨리 코드 품질만 체크해줘"
298
+
299
+ # 심층 분석 → 고급 버전 선택
300
+ "최신 2025 React 베스트 프랙티스와 비교하고 학습 자료도 찾아줘"
301
+ ```
302
+
303
+ ### 워크플로우 예시
304
+
305
+ **단계 1: 빠른 스캔 (기본 버전)**
306
+ ```
307
+ "code-reviewer로 주요 문제점 빠르게 찾아줘"
308
+ → 5-10분, ~$0.05, 기본 이슈 15개 발견
309
+ ```
310
+
311
+ **단계 2: 심층 분석 (필요시 고급 버전)**
312
+ ```
313
+ "advanced-code-reviewer로 [발견된 이슈]에 대한
314
+ 최신 해결 방법과 학습 자료 찾아줘"
315
+ → 15-20분, ~$1.00, 상세 가이드 + 리소스
316
+ ```
317
+
318
+ **📖 자세한 비교는 [COMPARISON.md](COMPARISON.md)를 참고하세요!**
319
+
320
+ ---
321
+
322
+ ## 💡 사용 예시
323
+
324
+ ### 기본 리뷰 (빠른 체크)
325
+ ```bash
326
+ # code-reviewer 사용
327
+ "이 프로젝트의 코드 품질을 빠르게 검토해줘"
328
+ → 5-10분 내 기본 패턴 분석 완료
329
+ ```
330
+
331
+ ### 심층 분석 (아키텍처 리뷰)
332
+ ```bash
333
+ # advanced-code-reviewer 사용
334
+ "이 프로젝트를 최신 React 베스트 프랙티스와 비교해줘"
335
+ → 웹 리서치 포함 심층 분석 (15-20분)
336
+ → 학습 리소스 + 업계 벤치마크 제공
337
+ ```
338
+
339
+ ### 리팩토링 계획
340
+ ```bash
341
+ # refactor-analyzer 사용 (빠른 스캔)
342
+ "중복 코드와 복잡한 함수를 찾아줘"
343
+ → 기본 메트릭스 제공
344
+
345
+ # advanced-refactor-analyzer 사용 (심층 계획)
346
+ "대규모 리팩토링을 위한 우선순위와 마이그레이션 경로를 제시해줘"
347
+ → ROI 분석 + 단계별 가이드 + 웹 리소스
348
+ ```
349
+
350
+ ### 온보딩 준비
351
+ ```bash
352
+ # junior-friendly-checker 사용
353
+ "주니어 개발자가 이해하기 어려운 부분을 찾아줘"
354
+ → 기본 가독성 분석
355
+
356
+ # advanced-junior-checker 사용
357
+ "주니어 온보딩 프로그램을 위한 학습 자료와 개선 계획을 만들어줘"
358
+ → 큐레이션된 학습 리소스 + 단계별 경로 + 문서화 가이드
359
+ ```
360
+
361
+ ---
362
+
363
+ ## 🛠️ 도구 설명
364
+
365
+ ### Read, Glob, Grep (모든 버전)
366
+ - **Read**: 파일 내용 읽기
367
+ - **Glob**: 파일 패턴 매칭 (`**/*.ts`, `**/*.tsx`)
368
+ - **Grep**: 정규식 기반 코드 검색
369
+
370
+ ### WebFetch, WebSearch (고급 버전만)
371
+ - **WebFetch**: 특정 URL의 문서 가져오기
372
+ - 예: React 공식 문서, TypeScript 핸드북
373
+ - **WebSearch**: 웹에서 베스트 프랙티스 검색
374
+ - 예: "React hooks best practices 2025"
375
+
376
+ ---
377
+
378
+ ## 📊 성능 및 비용 비교
379
+
380
+ | 서브에이전트 | 평균 실행 시간 | 상대적 비용 | 웹 요청 수 |
381
+ |-------------|--------------|-----------|-----------|
382
+ | code-reviewer | 5-10분 | 💰 | 0 |
383
+ | **advanced-code-reviewer** | 15-20분 | 💰💰 | 5-7개 |
384
+ | refactor-analyzer | 5-10분 | 💰 | 0 |
385
+ | **advanced-refactor-analyzer** | 15-20분 | 💰💰 | 5-7개 |
386
+ | junior-friendly-checker | 5-10분 | 💰 | 0 |
387
+ | **advanced-junior-checker** | 15-20분 | 💰💰 | 5-7개 |
388
+
389
+ ---
390
+
391
+ ## 🎓 추가 정보
392
+
393
+ ### 왜 읽기 전용 도구만 사용하나요?
394
+ - 🔒 **안전성**: 코드를 분석만 하고 수정하지 않음
395
+ - ✅ **예측 가능성**: 파일 시스템 변경 없음
396
+ - 🎯 **목적**: 분석 결과를 보고하고, 사람이 결정
397
+
398
+ ### 웹 리서치는 어떻게 활용되나요?
399
+ - 📚 최신 베스트 프랙티스 확인
400
+ - 🔗 공식 문서 참조
401
+ - 💡 학습 리소스 제공
402
+ - 📊 업계 표준과 비교
403
+ - 🗺️ 마이그레이션 가이드
404
+
405
+ ### 향후 확장 가능성
406
+ 만약 자동 수정 기능이 필요하다면:
407
+ ```yaml
408
+ # 미래 버전 예시
409
+ name: auto-refactorer
410
+ model: sonnet
411
+ tools: Read, Glob, Grep, Edit, Bash
412
+ description: 분석 + 자동 리팩토링 + 테스트 실행
413
+ ```
414
+
415
+ ---
416
+
417
+ ## 📝 라이선스
418
+ 이 서브에이전트들은 학습 및 팀 내 사용을 위해 제공됩니다.
419
+
420
+ ---
421
+
422
+ ## 🤝 기여
423
+ 개선 제안이나 새로운 서브에이전트 아이디어가 있다면 이슈를 열어주세요!
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "binary-agents",
3
+ "version": "1.0.0",
4
+ "description": "Claude Code subagents collection with sync CLI tool",
5
+ "type": "module",
6
+ "main": "src/sync.js",
7
+ "bin": {
8
+ "binary-agents": "./bin/cli.js"
9
+ },
10
+ "scripts": {
11
+ "sync": "node bin/cli.js sync",
12
+ "list": "node bin/cli.js list"
13
+ },
14
+ "keywords": [
15
+ "claude",
16
+ "claude-code",
17
+ "subagents",
18
+ "sync",
19
+ "cli",
20
+ "code-review",
21
+ "refactoring"
22
+ ],
23
+ "author": "01-binary",
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/01-binary/binary-agents.git"
28
+ },
29
+ "files": [
30
+ "agents",
31
+ "bin",
32
+ "src",
33
+ "docs",
34
+ "README.md"
35
+ ],
36
+ "dependencies": {
37
+ "chalk": "^5.3.0",
38
+ "commander": "^12.0.0",
39
+ "ora": "^8.0.1"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ }
44
+ }
package/src/sync.js ADDED
@@ -0,0 +1,207 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ // 모노레포의 agents 디렉토리 경로
11
+ const REPO_AGENTS_DIR = path.join(__dirname, '..', 'agents');
12
+
13
+ /**
14
+ * 로컬 agents 디렉토리에서 서브에이전트 파일 목록 가져오기
15
+ */
16
+ async function fetchSubagentFiles() {
17
+ try {
18
+ const files = await fs.readdir(REPO_AGENTS_DIR);
19
+
20
+ // .md 파일만 필터링 (서브에이전트 파일들)
21
+ const subagentFiles = files.filter(file =>
22
+ file.endsWith('.md') &&
23
+ file.includes('-') // 하이픈이 있는 파일만 (서브에이전트 파일들)
24
+ );
25
+
26
+ return subagentFiles;
27
+ } catch (error) {
28
+ throw new Error(`Failed to read agents directory: ${error.message}`);
29
+ }
30
+ }
31
+
32
+ /**
33
+ * YAML frontmatter가 있는지 검증
34
+ */
35
+ function validateYamlFrontmatter(content) {
36
+ const frontmatterRegex = /^---\n([\s\S]*?)\n---/;
37
+ return frontmatterRegex.test(content);
38
+ }
39
+
40
+ /**
41
+ * 로컬에서 파일 읽기
42
+ */
43
+ async function readAgentFile(filename) {
44
+ const filePath = path.join(REPO_AGENTS_DIR, filename);
45
+ const content = await fs.readFile(filePath, 'utf-8');
46
+
47
+ // YAML frontmatter 검증
48
+ if (!validateYamlFrontmatter(content)) {
49
+ throw new Error(`Invalid YAML frontmatter in ${filename}`);
50
+ }
51
+
52
+ return content;
53
+ }
54
+
55
+ /**
56
+ * .claude/agents 디렉토리 생성
57
+ * @param {boolean} isGlobal - true면 ~/.claude/agents, false면 현재 디렉토리의 .claude/agents
58
+ */
59
+ async function ensureAgentsDirectory(isGlobal = false) {
60
+ let agentsDir;
61
+
62
+ if (isGlobal) {
63
+ // 전역 설치: ~/.claude/agents
64
+ const homeDir = process.env.HOME || process.env.USERPROFILE;
65
+ agentsDir = path.join(homeDir, '.claude', 'agents');
66
+ } else {
67
+ // 로컬 설치: 현재 디렉토리의 .claude/agents
68
+ agentsDir = path.join(process.cwd(), '.claude', 'agents');
69
+ }
70
+
71
+ try {
72
+ await fs.access(agentsDir);
73
+ } catch {
74
+ await fs.mkdir(agentsDir, { recursive: true });
75
+ }
76
+
77
+ return agentsDir;
78
+ }
79
+
80
+ /**
81
+ * 파일 저장
82
+ */
83
+ async function saveFile(agentsDir, filename, content) {
84
+ const filePath = path.join(agentsDir, filename);
85
+ await fs.writeFile(filePath, content, 'utf-8');
86
+ return filePath;
87
+ }
88
+
89
+ /**
90
+ * 서브에이전트 동기화 메인 함수
91
+ */
92
+ export async function syncSubagents(options = {}) {
93
+ const { filter = null, global = false } = options;
94
+
95
+ console.log(chalk.blue.bold('\n🤖 Binary Agents Sync\n'));
96
+
97
+ if (global) {
98
+ console.log(chalk.cyan('📍 Global mode: Installing to ~/.claude/agents\n'));
99
+ }
100
+
101
+ // 로컬 agents 디렉토리에서 파일 목록 가져오기
102
+ const fetchSpinner = ora('Reading subagent files from local repository...').start();
103
+ let allFiles;
104
+
105
+ try {
106
+ allFiles = await fetchSubagentFiles();
107
+ fetchSpinner.succeed(chalk.green(`Found ${allFiles.length} subagent files`));
108
+ } catch (error) {
109
+ fetchSpinner.fail(chalk.red(`Failed to read file list: ${error.message}`));
110
+ return { success: false, error: error.message };
111
+ }
112
+
113
+ // 필터링된 파일 목록
114
+ let filesToSync = allFiles;
115
+
116
+ if (filter === 'basic') {
117
+ filesToSync = allFiles.filter(f => !f.startsWith('advanced-'));
118
+ console.log(chalk.yellow(`📌 Syncing basic subagents only (${filesToSync.length} files)\n`));
119
+ } else if (filter === 'advanced') {
120
+ filesToSync = allFiles.filter(f => f.startsWith('advanced-'));
121
+ console.log(chalk.yellow(`📌 Syncing advanced subagents only (${filesToSync.length} files)\n`));
122
+ }
123
+
124
+ // .claude/agents 디렉토리 생성
125
+ const dirMessage = global ? 'Creating ~/.claude/agents directory...' : 'Creating .claude/agents directory...';
126
+ const dirSpinner = ora(dirMessage).start();
127
+ let agentsDir;
128
+
129
+ try {
130
+ agentsDir = await ensureAgentsDirectory(global);
131
+ const successMessage = global ? 'Created ~/.claude/agents directory' : 'Created .claude/agents directory';
132
+ dirSpinner.succeed(chalk.green(successMessage));
133
+ } catch (error) {
134
+ dirSpinner.fail(chalk.red(`Failed to create directory: ${error.message}`));
135
+ return { success: false, error: error.message };
136
+ }
137
+
138
+ // 각 파일 복사
139
+ const results = {
140
+ success: [],
141
+ failed: []
142
+ };
143
+
144
+ for (const filename of filesToSync) {
145
+ const fileSpinner = ora(`Copying ${filename}...`).start();
146
+
147
+ try {
148
+ // 로컬 파일 읽기
149
+ const content = await readAgentFile(filename);
150
+
151
+ // 저장
152
+ const filePath = await saveFile(agentsDir, filename, content);
153
+
154
+ fileSpinner.succeed(chalk.green(`✓ ${filename}`));
155
+ results.success.push(filename);
156
+ } catch (error) {
157
+ fileSpinner.fail(chalk.red(`✗ ${filename}: ${error.message}`));
158
+ results.failed.push({ filename, error: error.message });
159
+ }
160
+ }
161
+
162
+ // 결과 요약
163
+ console.log(chalk.blue.bold('\n📊 Sync Summary\n'));
164
+ console.log(chalk.green(`✓ Successful: ${results.success.length}/${filesToSync.length}`));
165
+
166
+ if (results.failed.length > 0) {
167
+ console.log(chalk.red(`✗ Failed: ${results.failed.length}/${filesToSync.length}`));
168
+ console.log(chalk.red('\nFailed files:'));
169
+ results.failed.forEach(({ filename, error }) => {
170
+ console.log(chalk.red(` - ${filename}: ${error}`));
171
+ });
172
+ }
173
+
174
+ console.log(chalk.cyan(`\n📁 Location: ${agentsDir}\n`));
175
+
176
+ return {
177
+ success: results.failed.length === 0,
178
+ results
179
+ };
180
+ }
181
+
182
+ /**
183
+ * 사용 가능한 서브에이전트 목록 표시
184
+ */
185
+ export async function listSubagents() {
186
+ console.log(chalk.blue.bold('\n🤖 Available Subagents\n'));
187
+
188
+ const spinner = ora('Reading subagent files from local repository...').start();
189
+
190
+ try {
191
+ const files = await fetchSubagentFiles();
192
+ spinner.succeed(chalk.green('Found subagent files'));
193
+
194
+ const basic = files.filter(f => !f.startsWith('advanced-'));
195
+ const advanced = files.filter(f => f.startsWith('advanced-'));
196
+
197
+ console.log(chalk.yellow('\nBasic (Haiku model):'));
198
+ basic.forEach(f => console.log(chalk.white(` • ${f}`)));
199
+
200
+ console.log(chalk.yellow('\nAdvanced (Sonnet model):'));
201
+ advanced.forEach(f => console.log(chalk.white(` • ${f}`)));
202
+
203
+ console.log(chalk.cyan(`\nTotal: ${files.length} subagents\n`));
204
+ } catch (error) {
205
+ spinner.fail(chalk.red(`Failed to read file list: ${error.message}`));
206
+ }
207
+ }