add-ai-tools 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.
package/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # add-ai-tools
2
+
3
+ Install AI agent resources (Skills, Rules, Agents) from various sources with a single command.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g add-ai-tools
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### Install from GitHub
14
+
15
+ ```bash
16
+ # Using GitHub shorthand
17
+ npx add-ai-tools owner/repo
18
+
19
+ # Using GitHub URL
20
+ npx add-ai-tools https://github.com/owner/repo
21
+
22
+ # Install specific resource
23
+ npx add-ai-tools https://github.com/owner/repo/tree/main/skills/my-skill
24
+ ```
25
+
26
+ ### Interactive Mode
27
+
28
+ ```bash
29
+ npx add-ai-tools
30
+ ```
31
+
32
+ Follow the prompts to select agent, resource type, and resources to install.
33
+
34
+ ### Export as ZIP
35
+
36
+ ```bash
37
+ # Export from GitHub source (with prompts)
38
+ npx add-ai-tools owner/repo --zip
39
+
40
+ # Interactive source input
41
+ npx add-ai-tools --zip
42
+
43
+ # Export all resources without prompts
44
+ npx add-ai-tools owner/repo --zip -y
45
+ ```
46
+
47
+ ## Supported Sources
48
+
49
+ | Format | Example |
50
+ |--------|---------|
51
+ | GitHub shorthand | `owner/repo` |
52
+ | GitHub URL | `https://github.com/owner/repo` |
53
+ | GitHub URL with path | `https://github.com/owner/repo/tree/main/skills/my-skill` |
54
+ | GitLab URL | `https://gitlab.com/owner/repo` |
55
+ | Git SSH | `git@github.com:owner/repo.git` |
56
+
57
+ ## Options
58
+
59
+ | Option | Description | Default |
60
+ |--------|-------------|---------|
61
+ | `--agent <agent>` | Target agent (`claude-code`, `cursor`, `github-copilot`, `antigravity`) | `claude-code` |
62
+ | `--scope <scope>` | Installation scope (`project`, `global`) | `project` |
63
+ | `-y, --yes` | Skip confirmation prompts | `false` |
64
+ | `--zip` | Export resources as ZIP | `false` |
65
+
66
+ ## Supported Agents
67
+
68
+ | Agent | Skills | Rules | Agents |
69
+ |-------|:------:|:-----:|:------:|
70
+ | Claude Code | ✓ | ✓ | ✓ |
71
+ | Cursor | ✓ | ✓ | - |
72
+ | GitHub Copilot | ✓ | ✓ | - |
73
+ | Antigravity | ✓ | ✓ | - |
74
+
75
+ ## Installation Paths
76
+
77
+ Resources are installed to the appropriate location for each agent:
78
+
79
+ | Agent | Project Scope | Global Scope |
80
+ |-------|---------------|--------------|
81
+ | Claude Code | `.claude/` | `~/.claude/` |
82
+ | Cursor | `.cursor/` | `~/.cursor/` |
83
+ | GitHub Copilot | `.github/` | `~/.copilot/` |
84
+ | Antigravity | `.agent/` | `~/.gemini/antigravity/` |
85
+
86
+ ## Duplicate Handling
87
+
88
+ When a resource already exists, you can choose to:
89
+
90
+ - **Skip** - Keep existing file
91
+ - **Overwrite** - Replace with new version
92
+ - **Rename** - Save as new name (e.g., `skill-2`)
93
+ - **Backup** - Backup existing file before replacing
94
+ - **Compare** - View diff and decide
95
+
96
+ Identical content is automatically skipped.
97
+
98
+ ## Examples
99
+
100
+ ```bash
101
+ # Install all resources from a repo to Claude Code
102
+ npx add-ai-tools vercel-labs/ai-chatbot
103
+
104
+ # Install to Cursor with global scope
105
+ npx add-ai-tools owner/repo --agent cursor --scope global
106
+
107
+ # Install without prompts
108
+ npx add-ai-tools owner/repo -y
109
+
110
+ # Interactive mode
111
+ npx add-ai-tools
112
+
113
+ # Export resources as ZIP from GitHub
114
+ npx add-ai-tools owner/repo --zip
115
+
116
+ # Export all resources without prompts
117
+ npx add-ai-tools owner/repo --zip -y
118
+ ```
119
+
120
+ ## License
121
+
122
+ MIT
@@ -0,0 +1,501 @@
1
+ #!/usr/bin/env node
2
+
3
+ //#region src/types.d.ts
4
+ /**
5
+ * 리소스 타입 (복수형으로 통일)
6
+ */
7
+ type ResourceType = 'skills' | 'rules' | 'agents';
8
+ /**
9
+ * 지원하는 Agent 키
10
+ */
11
+ type AgentKey = 'claude-code' | 'cursor' | 'github-copilot' | 'antigravity';
12
+ /**
13
+ * Agent 경로 정의
14
+ */
15
+ interface AgentPaths {
16
+ skills: string;
17
+ rules: string;
18
+ agents: string | null;
19
+ }
20
+ /**
21
+ * Agent 설정
22
+ */
23
+ interface AgentConfig {
24
+ name: string;
25
+ supportedTypes: ResourceType[];
26
+ paths: {
27
+ project: AgentPaths;
28
+ global: AgentPaths;
29
+ };
30
+ }
31
+ /**
32
+ * Agent Registry 타입
33
+ */
34
+ type AgentRegistry = Record<AgentKey, AgentConfig>;
35
+ /**
36
+ * 파싱된 소스 정보
37
+ * 다양한 소스 포맷(GitHub, GitLab, Git URL 등)을 통일된 구조로 표현
38
+ */
39
+ interface ParsedSource {
40
+ /** 소스 유형 */
41
+ type: 'github' | 'gitlab' | 'git' | 'direct-url';
42
+ /** 정규화된 URL */
43
+ url?: string;
44
+ /** 레포지토리 내 서브 경로 (예: skills/frontend-design) */
45
+ subpath?: string;
46
+ /** Git 브랜치/태그/커밋 참조 */
47
+ ref?: string;
48
+ /** GitHub/GitLab owner (조직 또는 사용자) */
49
+ owner?: string;
50
+ /** 레포지토리 이름 */
51
+ repo?: string;
52
+ /** 원본 입력 문자열 */
53
+ raw: string;
54
+ }
55
+ /**
56
+ * 중복 처리 전략
57
+ */
58
+ type DuplicateAction = 'skip' | 'overwrite' | 'rename' | 'backup' | 'compare' | 'fail';
59
+ /**
60
+ * 소스 파일 정보
61
+ */
62
+ interface SourceFile {
63
+ path: string;
64
+ content: string;
65
+ isDirectory: boolean;
66
+ /** Sibling files in the same resource directory (scripts/, references/, etc.) */
67
+ siblingFiles?: SourceFile[];
68
+ }
69
+ /**
70
+ * 리소스 정보
71
+ */
72
+ interface Resource {
73
+ name: string;
74
+ type: ResourceType;
75
+ description: string;
76
+ path: string;
77
+ content: string;
78
+ metadata: {
79
+ author?: string;
80
+ version?: string;
81
+ license?: string;
82
+ category?: string;
83
+ };
84
+ directory?: {
85
+ files: SourceFile[];
86
+ };
87
+ }
88
+ /**
89
+ * 설치 요청
90
+ */
91
+ interface InstallRequest {
92
+ resource: Resource;
93
+ agent: AgentKey;
94
+ scope: 'project' | 'global';
95
+ onDuplicate: DuplicateAction;
96
+ }
97
+ /**
98
+ * 설치 결과
99
+ */
100
+ interface InstallResult {
101
+ resourceName: string;
102
+ agent: AgentKey;
103
+ success: boolean;
104
+ action: 'created' | 'skipped' | 'overwritten' | 'renamed' | 'backed-up' | 'failed';
105
+ path: string;
106
+ backupPath?: string;
107
+ renamedTo?: string;
108
+ error?: string;
109
+ }
110
+ /**
111
+ * ZIP 내보내기 결과
112
+ */
113
+ interface ZipResult {
114
+ success: boolean;
115
+ outputPath: string;
116
+ resourceCount: number;
117
+ error?: string;
118
+ }
119
+ //#endregion
120
+ //#region src/install/InstallManager.d.ts
121
+ /**
122
+ * InstallManager
123
+ *
124
+ * Handles resource installation with duplicate detection and handling strategies:
125
+ * - Skip: Keep existing file
126
+ * - Overwrite: Replace existing file
127
+ * - Rename: Create new file with incremented number (skill-2, skill-3)
128
+ * - Backup: Create .backup file before overwriting
129
+ * - Auto-skip: Automatically skip if content is identical
130
+ */
131
+ declare class InstallManager {
132
+ private pathResolver;
133
+ private duplicateHandler;
134
+ constructor();
135
+ /**
136
+ * Install multiple resources
137
+ */
138
+ install(requests: InstallRequest[]): Promise<InstallResult[]>;
139
+ /**
140
+ * Install single resource
141
+ */
142
+ private installOne;
143
+ /**
144
+ * Copy sibling files to target directory
145
+ */
146
+ private copySiblingFiles;
147
+ /**
148
+ * Resolve target installation path
149
+ */
150
+ private resolveTargetPath;
151
+ /**
152
+ * Check if file exists and get duplicate info
153
+ */
154
+ private checkDuplicate;
155
+ /**
156
+ * Handle duplicate file
157
+ */
158
+ private handleDuplicate;
159
+ }
160
+ //#endregion
161
+ //#region src/install/DuplicateHandler.d.ts
162
+ /**
163
+ * DuplicateHandler
164
+ *
165
+ * Handles various duplicate resolution strategies for resource installation:
166
+ * - skip: Do nothing, keep existing file
167
+ * - overwrite: Replace existing file with new content
168
+ * - rename: Create new file with incremented number (skill-2, skill-3)
169
+ * - backup: Create .backup file before overwriting
170
+ */
171
+ declare class DuplicateHandler {
172
+ /**
173
+ * Handle rename - Find next available number
174
+ * Examples: skill-2, skill-3, skill-4
175
+ *
176
+ * @param targetPath - The original target path (e.g., /path/to/my-skill/SKILL.md)
177
+ * @param content - The new content to write
178
+ * @returns The new path where the file was written
179
+ */
180
+ rename(targetPath: string, content: string): Promise<string>;
181
+ /**
182
+ * Handle backup - Create .backup file and overwrite
183
+ *
184
+ * If .backup already exists, creates numbered backups: .backup.1, .backup.2, etc.
185
+ *
186
+ * @param targetPath - The target path to backup and overwrite
187
+ * @param content - The new content to write
188
+ * @returns The backup path where the original content was saved
189
+ */
190
+ backup(targetPath: string, content: string): Promise<string>;
191
+ /**
192
+ * Skip - Do nothing
193
+ */
194
+ skip(): Promise<void>;
195
+ /**
196
+ * Overwrite - Replace file
197
+ *
198
+ * @param targetPath - The target path to overwrite
199
+ * @param content - The new content to write
200
+ */
201
+ overwrite(targetPath: string, content: string): Promise<void>;
202
+ /**
203
+ * Handle compare - Show diff and let user choose action
204
+ *
205
+ * Displays unified diff between existing and new content,
206
+ * then prompts user to choose skip, overwrite, or backup.
207
+ *
208
+ * @param targetPath - The target file path
209
+ * @param existingContent - Current content of the file
210
+ * @param newContent - New content to potentially install
211
+ * @param resourceName - Name of the resource for display
212
+ * @returns The chosen action: 'skip', 'overwrite', or 'backup'
213
+ */
214
+ compare(targetPath: string, existingContent: string, newContent: string, resourceName: string): Promise<'skip' | 'overwrite' | 'backup'>;
215
+ /**
216
+ * Prompt user for single duplicate action
217
+ *
218
+ * Displays interactive menu for handling a single duplicate file.
219
+ *
220
+ * @param resourceName - Name of the resource
221
+ * @param existingPath - Path where file already exists
222
+ * @returns The chosen duplicate action
223
+ */
224
+ promptForAction(resourceName: string, existingPath: string): Promise<DuplicateAction>;
225
+ }
226
+ //#endregion
227
+ //#region src/install/BatchHandler.d.ts
228
+ /**
229
+ * Batch action types for handling multiple duplicates at once
230
+ */
231
+ type BatchAction = 'ask-each' | 'skip-all' | 'overwrite-all' | 'backup-all';
232
+ /**
233
+ * Result summary structure
234
+ */
235
+ interface ResultSummary {
236
+ created: number;
237
+ skipped: number;
238
+ overwritten: number;
239
+ renamed: number;
240
+ backedUp: number;
241
+ failed: number;
242
+ }
243
+ /**
244
+ * BatchHandler
245
+ *
246
+ * Handles batch operations for multiple install requests:
247
+ * - Apply batch actions to all requests
248
+ * - Summarize installation results
249
+ */
250
+ declare class BatchHandler {
251
+ /**
252
+ * Apply batch action to all requests
253
+ * Converts batch action to individual duplicate actions
254
+ */
255
+ applyBatchAction(requests: InstallRequest[], batchAction: BatchAction): InstallRequest[];
256
+ /**
257
+ * Group and count results by action type
258
+ */
259
+ summarizeResults(results: InstallResult[]): ResultSummary;
260
+ /**
261
+ * Format summary as human-readable string
262
+ */
263
+ formatSummary(summary: ResultSummary): string;
264
+ /**
265
+ * Check if any results have failed
266
+ */
267
+ hasFailures(results: InstallResult[]): boolean;
268
+ /**
269
+ * Get failed results only
270
+ */
271
+ getFailedResults(results: InstallResult[]): InstallResult[];
272
+ /**
273
+ * Get successful results only
274
+ */
275
+ getSuccessfulResults(results: InstallResult[]): InstallResult[];
276
+ }
277
+ //#endregion
278
+ //#region src/utils/diff.d.ts
279
+ /**
280
+ * Generate unified diff between two contents
281
+ */
282
+ declare function generateDiff(oldContent: string, newContent: string, filename?: string): string;
283
+ /**
284
+ * Format diff with colors
285
+ */
286
+ declare function formatDiff(diffText: string): string;
287
+ /**
288
+ * Display diff to console
289
+ */
290
+ declare function displayDiff(oldContent: string, newContent: string, filename: string): void;
291
+ //#endregion
292
+ //#region src/path/PathResolver.d.ts
293
+ /**
294
+ * PathResolver - Agent별 경로 해석 및 지원 타입 관리
295
+ *
296
+ * 주요 기능:
297
+ * - Agent가 지원하는 리소스 타입 조회
298
+ * - Agent별 설치 경로 해석 (project/global scope)
299
+ * - 타입 지원 여부 확인
300
+ */
301
+ declare class PathResolver {
302
+ private agents;
303
+ constructor();
304
+ /**
305
+ * Agent가 지원하는 리소스 타입 목록 반환
306
+ * @param agent - 대상 에이전트
307
+ * @returns 지원하는 리소스 타입 배열
308
+ */
309
+ getSupportedTypes(agent: AgentKey): ResourceType[];
310
+ /**
311
+ * Agent별 설치 경로 해석
312
+ * @param agent - 대상 에이전트
313
+ * @param type - 리소스 타입
314
+ * @param scope - 설치 범위 (project | global)
315
+ * @returns 설치 경로 또는 null (미지원)
316
+ */
317
+ resolveAgentPath(agent: AgentKey, type: ResourceType, scope: 'project' | 'global'): string | null;
318
+ /**
319
+ * 타입이 Agent에서 지원되는지 확인
320
+ * @param agent - 대상 에이전트
321
+ * @param type - 확인할 리소스 타입
322
+ * @returns 지원 여부
323
+ */
324
+ isTypeSupported(agent: AgentKey, type: ResourceType): boolean;
325
+ /**
326
+ * 모든 Agent 목록 반환
327
+ * @returns Agent 키 배열
328
+ */
329
+ getAgents(): AgentKey[];
330
+ /**
331
+ * Agent 설정 전체 반환
332
+ * @param agent - 대상 에이전트
333
+ * @returns Agent 설정 객체
334
+ */
335
+ getAgentConfig(agent: AgentKey): AgentConfig;
336
+ /**
337
+ * Agent 표시 이름 반환
338
+ * @param agent - 대상 에이전트
339
+ * @returns 표시용 이름
340
+ */
341
+ getAgentName(agent: AgentKey): string;
342
+ /**
343
+ * ~ 를 $HOME으로 확장
344
+ * @param path - 경로 문자열
345
+ * @returns 확장된 경로
346
+ */
347
+ private expandTilde;
348
+ }
349
+ declare const pathResolver: PathResolver;
350
+ //#endregion
351
+ //#region src/commands/CommandHandler.d.ts
352
+ /**
353
+ * CLI 실행 옵션
354
+ */
355
+ interface CommandOptions {
356
+ source?: string;
357
+ agent?: string;
358
+ scope?: 'project' | 'global';
359
+ yes?: boolean;
360
+ }
361
+ /**
362
+ * CommandHandler - 외부 소스 기반 설치
363
+ *
364
+ * 지원 소스 포맷:
365
+ * - GitHub shorthand: owner/repo
366
+ * - GitHub URL: https://github.com/owner/repo
367
+ * - GitHub URL with path: https://github.com/owner/repo/tree/main/skills/frontend-design
368
+ * - GitLab URL: https://gitlab.com/owner/repo
369
+ * - Git URL: git@github.com:owner/repo.git
370
+ * - Direct URL: https://raw.githubusercontent.com/.../SKILL.md
371
+ */
372
+ declare class CommandHandler {
373
+ private installManager;
374
+ private logger;
375
+ constructor();
376
+ /**
377
+ * CLI 실행 진입점
378
+ */
379
+ run(options?: CommandOptions): Promise<void>;
380
+ /**
381
+ * 소스가 제공된 경우 실행
382
+ */
383
+ private runWithSource;
384
+ /**
385
+ * 인터랙티브 모드 실행
386
+ */
387
+ private runInteractive;
388
+ /**
389
+ * 파싱된 소스 정보 로깅 (디버깅용)
390
+ */
391
+ private logParsedSource;
392
+ /**
393
+ * 설치 결과 출력
394
+ */
395
+ private printResults;
396
+ }
397
+ declare const commandHandler: CommandHandler;
398
+ //#endregion
399
+ //#region src/export/ZipExporter.d.ts
400
+ /**
401
+ * ZipExporter - 리소스를 ZIP으로 내보내기
402
+ *
403
+ * ZIP 구조:
404
+ * frontend/skills/my-skill/
405
+ * SKILL.md
406
+ * scripts/
407
+ * references/
408
+ */
409
+ declare class ZipExporter {
410
+ /**
411
+ * 리소스를 ZIP으로 내보내기
412
+ */
413
+ export(resources: Resource[], outputPath: string): Promise<ZipResult>;
414
+ /**
415
+ * 리소스의 기본 경로 추출
416
+ * 예: /path/to/registry/frontend/skills/my-skill → frontend/skills/my-skill
417
+ */
418
+ private getResourceBasePath;
419
+ /**
420
+ * 리소스 타입별 메인 파일명
421
+ */
422
+ private getMainFileName;
423
+ }
424
+ declare const zipExporter: ZipExporter;
425
+ //#endregion
426
+ //#region src/commands/ZipHandler.d.ts
427
+ /**
428
+ * ZipHandler 옵션
429
+ */
430
+ interface ZipHandlerOptions {
431
+ source?: string;
432
+ yes?: boolean;
433
+ }
434
+ /**
435
+ * ZipHandler - ZIP 내보내기 워크플로우 오케스트레이션
436
+ */
437
+ declare class ZipHandler {
438
+ private logger;
439
+ constructor();
440
+ /**
441
+ * ZIP 내보내기 실행
442
+ */
443
+ run(options?: ZipHandlerOptions): Promise<void>;
444
+ /**
445
+ * 소스 입력 프롬프트
446
+ */
447
+ private promptSource;
448
+ /**
449
+ * 출력 파일 경로 생성
450
+ */
451
+ private generateOutputPath;
452
+ /**
453
+ * 결과 출력
454
+ */
455
+ private printResult;
456
+ }
457
+ declare const zipHandler: ZipHandler;
458
+ //#endregion
459
+ //#region src/source/SourceParser.d.ts
460
+ /**
461
+ * 입력이 직접 SKILL.md URL인지 확인
462
+ * 예: https://raw.githubusercontent.com/.../SKILL.md
463
+ */
464
+ declare function isDirectSkillUrl(input: string): boolean;
465
+ /**
466
+ * 소스 문자열을 파싱하여 ParsedSource 객체로 변환
467
+ *
468
+ * 지원하는 소스 포맷:
469
+ * - GitHub shorthand: owner/repo
470
+ * - GitHub URL: https://github.com/owner/repo
471
+ * - GitHub URL with path: https://github.com/owner/repo/tree/main/skills/frontend-design
472
+ * - GitLab URL: https://gitlab.com/owner/repo
473
+ * - Git URL: git@github.com:owner/repo.git
474
+ * - Direct URL: https://raw.githubusercontent.com/.../SKILL.md
475
+ */
476
+ declare function parseSource(input: string): ParsedSource;
477
+ /**
478
+ * ParsedSource에서 owner/repo 식별자 추출 (텔레메트리용)
479
+ */
480
+ declare function getOwnerRepo(parsed: ParsedSource): string | null;
481
+ /**
482
+ * ParsedSource가 특정 스킬/리소스를 직접 가리키는지 확인
483
+ */
484
+ declare function isDirectResourcePath(parsed: ParsedSource): boolean;
485
+ /**
486
+ * 소스 유형에 따른 표시 문자열 반환
487
+ */
488
+ declare function getSourceDisplayName(parsed: ParsedSource): string;
489
+ //#endregion
490
+ //#region src/data/agents.d.ts
491
+ /**
492
+ * Agent 설정 데이터
493
+ * 각 AI 코딩 어시스턴트의 리소스 설치 경로 및 지원 타입 정의
494
+ */
495
+ declare const agents: AgentRegistry;
496
+ //#endregion
497
+ //#region src/index.d.ts
498
+ declare function main(): Promise<void>;
499
+ //#endregion
500
+ export { type AgentConfig, type AgentKey, type AgentPaths, type AgentRegistry, type BatchAction, BatchHandler, CommandHandler, type DuplicateAction, DuplicateHandler, InstallManager, type InstallRequest, type InstallResult, type ParsedSource, PathResolver, type Resource, type ResourceType, type ResultSummary, type SourceFile, ZipExporter, ZipHandler, agents, commandHandler, displayDiff, formatDiff, generateDiff, getOwnerRepo, getSourceDisplayName, isDirectResourcePath, isDirectSkillUrl, main, parseSource, pathResolver, zipExporter, zipHandler };
501
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/install/InstallManager.ts","../src/install/DuplicateHandler.ts","../src/install/BatchHandler.ts","../src/utils/diff.ts","../src/path/PathResolver.ts","../src/commands/CommandHandler.ts","../src/export/ZipExporter.ts","../src/commands/ZipHandler.ts","../src/source/SourceParser.ts","../src/data/agents.ts","../src/index.ts"],"mappings":"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"}