@kood/claude-code 0.1.2 → 0.1.3
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/dist/index.js +12 -3
- package/package.json +2 -2
- package/templates/hono/CLAUDE.md +20 -2
- package/templates/hono/docs/architecture/architecture.md +909 -0
- package/templates/hono/docs/deployment/cloudflare.md +537 -190
- package/templates/hono/docs/deployment/docker.md +517 -0
- package/templates/hono/docs/deployment/index.md +181 -213
- package/templates/hono/docs/deployment/railway.md +416 -0
- package/templates/hono/docs/deployment/vercel.md +572 -0
- package/templates/hono/docs/git/git.md +285 -0
- package/templates/hono/docs/library/ai-sdk/index.md +427 -0
- package/templates/hono/docs/library/ai-sdk/openrouter.md +479 -0
- package/templates/hono/docs/library/ai-sdk/providers.md +468 -0
- package/templates/hono/docs/library/ai-sdk/streaming.md +447 -0
- package/templates/hono/docs/library/ai-sdk/structured-output.md +493 -0
- package/templates/hono/docs/library/ai-sdk/tools.md +513 -0
- package/templates/hono/docs/library/hono/env-setup.md +458 -0
- package/templates/hono/docs/library/hono/index.md +1 -0
- package/templates/hono/docs/library/pino/index.md +437 -0
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +503 -0
- package/templates/hono/docs/library/prisma/config.md +362 -0
- package/templates/hono/docs/library/prisma/index.md +86 -13
- package/templates/hono/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +125 -125
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +191 -191
- package/templates/npx/CLAUDE.md +309 -0
- package/templates/npx/docs/git/git.md +307 -0
- package/templates/npx/docs/library/commander/index.md +164 -0
- package/templates/npx/docs/library/fs-extra/index.md +171 -0
- package/templates/npx/docs/library/prompts/index.md +253 -0
- package/templates/npx/docs/mcp/index.md +60 -0
- package/templates/npx/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +134 -0
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +301 -0
- package/templates/tanstack-start/CLAUDE.md +43 -5
- package/templates/tanstack-start/docs/architecture/architecture.md +134 -4
- package/templates/tanstack-start/docs/deployment/cloudflare.md +234 -51
- package/templates/tanstack-start/docs/deployment/index.md +322 -32
- package/templates/tanstack-start/docs/deployment/nitro.md +201 -20
- package/templates/tanstack-start/docs/deployment/railway.md +305 -153
- package/templates/tanstack-start/docs/deployment/vercel.md +353 -78
- package/templates/tanstack-start/docs/git/{index.md → git.md} +81 -7
- package/templates/tanstack-start/docs/guides/best-practices.md +203 -1
- package/templates/tanstack-start/docs/guides/env-setup.md +450 -0
- package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +472 -0
- package/templates/tanstack-start/docs/library/ai-sdk/index.md +264 -0
- package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +371 -0
- package/templates/tanstack-start/docs/library/ai-sdk/providers.md +403 -0
- package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +320 -0
- package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +454 -0
- package/templates/tanstack-start/docs/library/ai-sdk/tools.md +473 -0
- package/templates/tanstack-start/docs/library/pino/index.md +320 -0
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +404 -0
- package/templates/tanstack-start/docs/library/prisma/config.md +377 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +3 -1
- package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +80 -2
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +138 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +186 -187
- package/templates/hono/docs/git/index.md +0 -180
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Commander.js 가이드
|
|
2
|
+
|
|
3
|
+
> Node.js CLI 프레임워크
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 기본 설정
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
|
|
12
|
+
const program = new Command();
|
|
13
|
+
|
|
14
|
+
program
|
|
15
|
+
.name('my-cli')
|
|
16
|
+
.description('CLI description')
|
|
17
|
+
.version('1.0.0');
|
|
18
|
+
|
|
19
|
+
program.parse();
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Options
|
|
25
|
+
|
|
26
|
+
### 기본 옵션
|
|
27
|
+
```typescript
|
|
28
|
+
program
|
|
29
|
+
.option('-t, --template <name>', 'template name')
|
|
30
|
+
.option('-f, --force', 'force overwrite')
|
|
31
|
+
.option('-v, --verbose', 'verbose output')
|
|
32
|
+
.action((options) => {
|
|
33
|
+
console.log(options.template); // string | undefined
|
|
34
|
+
console.log(options.force); // boolean | undefined
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 필수 옵션
|
|
39
|
+
```typescript
|
|
40
|
+
program
|
|
41
|
+
.requiredOption('-c, --config <path>', 'config file path')
|
|
42
|
+
.action((options) => {
|
|
43
|
+
// options.config는 항상 존재
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 기본값
|
|
48
|
+
```typescript
|
|
49
|
+
program
|
|
50
|
+
.option('-p, --port <number>', 'port number', '3000')
|
|
51
|
+
.option('-e, --env <name>', 'environment', 'development')
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 여러 값 수집
|
|
55
|
+
```typescript
|
|
56
|
+
program
|
|
57
|
+
.option('-i, --include <path...>', 'include paths')
|
|
58
|
+
.action((options) => {
|
|
59
|
+
console.log(options.include); // string[]
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// 사용: --include src lib tests
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Arguments
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
program
|
|
71
|
+
.argument('<source>', 'source file')
|
|
72
|
+
.argument('[destination]', 'destination file')
|
|
73
|
+
.action((source, destination, options) => {
|
|
74
|
+
console.log(source); // 필수
|
|
75
|
+
console.log(destination); // 선택
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Subcommands
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
program
|
|
85
|
+
.command('init')
|
|
86
|
+
.description('Initialize project')
|
|
87
|
+
.option('-t, --template <name>', 'template')
|
|
88
|
+
.action((options) => {
|
|
89
|
+
// init 명령어 처리
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
program
|
|
93
|
+
.command('build')
|
|
94
|
+
.description('Build project')
|
|
95
|
+
.action(() => {
|
|
96
|
+
// build 명령어 처리
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// 사용: my-cli init --template react
|
|
100
|
+
// 사용: my-cli build
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Async Action
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
program
|
|
109
|
+
.action(async (options) => {
|
|
110
|
+
try {
|
|
111
|
+
await doSomething();
|
|
112
|
+
} catch (error) {
|
|
113
|
+
console.error(error);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// await 필요
|
|
119
|
+
await program.parseAsync();
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Help 커스터마이징
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
program
|
|
128
|
+
.addHelpText('beforeAll', 'Custom header')
|
|
129
|
+
.addHelpText('afterAll', 'Custom footer');
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 전체 예시
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
#!/usr/bin/env node
|
|
138
|
+
import { Command } from 'commander';
|
|
139
|
+
|
|
140
|
+
const program = new Command();
|
|
141
|
+
|
|
142
|
+
program
|
|
143
|
+
.name('my-cli')
|
|
144
|
+
.description('My awesome CLI tool')
|
|
145
|
+
.version('1.0.0');
|
|
146
|
+
|
|
147
|
+
program
|
|
148
|
+
.option('-t, --template <name>', 'template name')
|
|
149
|
+
.option('-f, --force', 'overwrite existing files')
|
|
150
|
+
.option('--cwd <path>', 'working directory', process.cwd())
|
|
151
|
+
.action(async (options) => {
|
|
152
|
+
const { template, force, cwd } = options;
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
// 실행 로직
|
|
156
|
+
await init({ template, force, cwd });
|
|
157
|
+
} catch (error) {
|
|
158
|
+
console.error('Error:', error.message);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
program.parse();
|
|
164
|
+
```
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# fs-extra 가이드
|
|
2
|
+
|
|
3
|
+
> Node.js 파일 시스템 유틸리티 (fs 확장)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 기본 Import
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import fs from 'fs-extra';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 파일/디렉토리 존재 확인
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
// 존재 확인
|
|
20
|
+
const exists = await fs.pathExists('/path/to/file');
|
|
21
|
+
|
|
22
|
+
if (await fs.pathExists(targetDir)) {
|
|
23
|
+
// 이미 존재
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 디렉토리 생성
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// 재귀적 생성 (mkdir -p)
|
|
33
|
+
await fs.ensureDir('/path/to/nested/dir');
|
|
34
|
+
|
|
35
|
+
// 단일 생성
|
|
36
|
+
await fs.mkdir('/path/to/dir');
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 파일/디렉토리 복사
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
// 파일 복사
|
|
45
|
+
await fs.copy('/src/file.txt', '/dest/file.txt');
|
|
46
|
+
|
|
47
|
+
// 디렉토리 복사 (재귀)
|
|
48
|
+
await fs.copy('/src/dir', '/dest/dir');
|
|
49
|
+
|
|
50
|
+
// 옵션
|
|
51
|
+
await fs.copy(src, dest, {
|
|
52
|
+
overwrite: true, // 덮어쓰기 (기본: true)
|
|
53
|
+
errorOnExist: false, // 존재 시 에러 (기본: false)
|
|
54
|
+
filter: (src) => { // 필터링
|
|
55
|
+
return !src.includes('node_modules');
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 파일/디렉토리 삭제
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
// 삭제 (rm -rf)
|
|
66
|
+
await fs.remove('/path/to/dir');
|
|
67
|
+
|
|
68
|
+
// 빈 디렉토리만 삭제
|
|
69
|
+
await fs.rmdir('/path/to/empty-dir');
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 디렉토리 읽기
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// 파일/폴더 목록
|
|
78
|
+
const items = await fs.readdir('/path/to/dir');
|
|
79
|
+
// ['file1.txt', 'folder1', 'file2.txt']
|
|
80
|
+
|
|
81
|
+
// stat으로 타입 확인
|
|
82
|
+
for (const item of items) {
|
|
83
|
+
const itemPath = path.join(dir, item);
|
|
84
|
+
const stat = await fs.stat(itemPath);
|
|
85
|
+
|
|
86
|
+
if (stat.isDirectory()) {
|
|
87
|
+
// 디렉토리
|
|
88
|
+
} else {
|
|
89
|
+
// 파일
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 파일 읽기/쓰기
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// 읽기
|
|
100
|
+
const content = await fs.readFile('/path/to/file', 'utf-8');
|
|
101
|
+
|
|
102
|
+
// 쓰기
|
|
103
|
+
await fs.writeFile('/path/to/file', content, 'utf-8');
|
|
104
|
+
|
|
105
|
+
// JSON 읽기
|
|
106
|
+
const data = await fs.readJson('/path/to/file.json');
|
|
107
|
+
|
|
108
|
+
// JSON 쓰기
|
|
109
|
+
await fs.writeJson('/path/to/file.json', data, { spaces: 2 });
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 파일 정보
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
const stat = await fs.stat('/path/to/file');
|
|
118
|
+
|
|
119
|
+
stat.isFile(); // 파일 여부
|
|
120
|
+
stat.isDirectory(); // 디렉토리 여부
|
|
121
|
+
stat.size; // 파일 크기 (bytes)
|
|
122
|
+
stat.mtime; // 수정 시간
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 재귀 복사 패턴
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
const copyRecursive = async (
|
|
131
|
+
src: string,
|
|
132
|
+
dest: string,
|
|
133
|
+
): Promise<{ files: number; directories: number }> => {
|
|
134
|
+
const counter = { files: 0, directories: 0 };
|
|
135
|
+
|
|
136
|
+
const copy = async (s: string, d: string): Promise<void> => {
|
|
137
|
+
const stat = await fs.stat(s);
|
|
138
|
+
|
|
139
|
+
if (stat.isDirectory()) {
|
|
140
|
+
await fs.ensureDir(d);
|
|
141
|
+
counter.directories++;
|
|
142
|
+
|
|
143
|
+
const items = await fs.readdir(s);
|
|
144
|
+
for (const item of items) {
|
|
145
|
+
await copy(path.join(s, item), path.join(d, item));
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
await fs.copy(s, d);
|
|
149
|
+
counter.files++;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
await copy(src, dest);
|
|
154
|
+
return counter;
|
|
155
|
+
};
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## ESM에서 __dirname 사용
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
import { fileURLToPath } from 'url';
|
|
164
|
+
import path from 'path';
|
|
165
|
+
|
|
166
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
167
|
+
const __dirname = path.dirname(__filename);
|
|
168
|
+
|
|
169
|
+
// 사용
|
|
170
|
+
const templatesDir = path.resolve(__dirname, '../templates');
|
|
171
|
+
```
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# prompts 가이드
|
|
2
|
+
|
|
3
|
+
> Interactive CLI prompts
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 기본 Import
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import prompts from 'prompts';
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Text Input
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
const response = await prompts({
|
|
19
|
+
type: 'text',
|
|
20
|
+
name: 'name',
|
|
21
|
+
message: 'What is your name?',
|
|
22
|
+
initial: 'Anonymous',
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
console.log(response.name);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Confirm (Yes/No)
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
const response = await prompts({
|
|
34
|
+
type: 'confirm',
|
|
35
|
+
name: 'confirmed',
|
|
36
|
+
message: 'Continue?',
|
|
37
|
+
initial: true,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
if (response.confirmed) {
|
|
41
|
+
// Yes
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Select (단일 선택)
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
const response = await prompts({
|
|
51
|
+
type: 'select',
|
|
52
|
+
name: 'template',
|
|
53
|
+
message: 'Select a template:',
|
|
54
|
+
choices: [
|
|
55
|
+
{ title: 'React', description: 'React framework', value: 'react' },
|
|
56
|
+
{ title: 'Vue', description: 'Vue framework', value: 'vue' },
|
|
57
|
+
{ title: 'Angular', description: 'Angular framework', value: 'angular' },
|
|
58
|
+
],
|
|
59
|
+
initial: 0, // 첫 번째 선택
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
console.log(response.template); // 'react' | 'vue' | 'angular'
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Multiselect (다중 선택)
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
const response = await prompts({
|
|
71
|
+
type: 'multiselect',
|
|
72
|
+
name: 'features',
|
|
73
|
+
message: 'Select features:',
|
|
74
|
+
choices: [
|
|
75
|
+
{ title: 'TypeScript', value: 'typescript', selected: true },
|
|
76
|
+
{ title: 'ESLint', value: 'eslint' },
|
|
77
|
+
{ title: 'Prettier', value: 'prettier' },
|
|
78
|
+
],
|
|
79
|
+
min: 1, // 최소 1개 선택
|
|
80
|
+
max: 5, // 최대 5개 선택
|
|
81
|
+
hint: '- Space to select. Return to submit',
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
console.log(response.features); // ['typescript', 'eslint']
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Number Input
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
const response = await prompts({
|
|
93
|
+
type: 'number',
|
|
94
|
+
name: 'port',
|
|
95
|
+
message: 'Port number?',
|
|
96
|
+
initial: 3000,
|
|
97
|
+
min: 1,
|
|
98
|
+
max: 65535,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
console.log(response.port); // number
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Password Input
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const response = await prompts({
|
|
110
|
+
type: 'password',
|
|
111
|
+
name: 'secret',
|
|
112
|
+
message: 'Enter password:',
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
console.log(response.secret);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 취소 처리
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
const response = await prompts({
|
|
124
|
+
type: 'select',
|
|
125
|
+
name: 'template',
|
|
126
|
+
message: 'Select:',
|
|
127
|
+
choices: [...],
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Ctrl+C 또는 ESC 시 undefined
|
|
131
|
+
if (!response.template) {
|
|
132
|
+
console.log('Operation cancelled.');
|
|
133
|
+
process.exit(0);
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 연속 질문
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
const response = await prompts([
|
|
143
|
+
{
|
|
144
|
+
type: 'text',
|
|
145
|
+
name: 'name',
|
|
146
|
+
message: 'Project name?',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'select',
|
|
150
|
+
name: 'template',
|
|
151
|
+
message: 'Template?',
|
|
152
|
+
choices: [...],
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'confirm',
|
|
156
|
+
name: 'git',
|
|
157
|
+
message: 'Initialize git?',
|
|
158
|
+
},
|
|
159
|
+
]);
|
|
160
|
+
|
|
161
|
+
console.log(response.name);
|
|
162
|
+
console.log(response.template);
|
|
163
|
+
console.log(response.git);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 조건부 질문
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
const response = await prompts([
|
|
172
|
+
{
|
|
173
|
+
type: 'confirm',
|
|
174
|
+
name: 'useTypescript',
|
|
175
|
+
message: 'Use TypeScript?',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: (prev) => prev ? 'confirm' : null, // 이전 답변이 true일 때만
|
|
179
|
+
name: 'strict',
|
|
180
|
+
message: 'Enable strict mode?',
|
|
181
|
+
},
|
|
182
|
+
]);
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Autocomplete
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
const response = await prompts({
|
|
191
|
+
type: 'autocomplete',
|
|
192
|
+
name: 'package',
|
|
193
|
+
message: 'Search package:',
|
|
194
|
+
choices: [
|
|
195
|
+
{ title: 'react' },
|
|
196
|
+
{ title: 'react-dom' },
|
|
197
|
+
{ title: 'react-router' },
|
|
198
|
+
{ title: 'vue' },
|
|
199
|
+
{ title: 'angular' },
|
|
200
|
+
],
|
|
201
|
+
suggest: (input, choices) => {
|
|
202
|
+
return choices.filter((c) =>
|
|
203
|
+
c.title.toLowerCase().includes(input.toLowerCase())
|
|
204
|
+
);
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 전체 예시
|
|
212
|
+
|
|
213
|
+
```typescript
|
|
214
|
+
import prompts from 'prompts';
|
|
215
|
+
|
|
216
|
+
const run = async () => {
|
|
217
|
+
// 템플릿 선택
|
|
218
|
+
const { templates } = await prompts({
|
|
219
|
+
type: 'multiselect',
|
|
220
|
+
name: 'templates',
|
|
221
|
+
message: 'Select templates (space to select):',
|
|
222
|
+
choices: [
|
|
223
|
+
{ title: 'Hono', value: 'hono' },
|
|
224
|
+
{ title: 'TanStack Start', value: 'tanstack-start' },
|
|
225
|
+
],
|
|
226
|
+
min: 1,
|
|
227
|
+
hint: '- Space to select. Return to submit',
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
if (!templates || templates.length === 0) {
|
|
231
|
+
console.log('Cancelled.');
|
|
232
|
+
process.exit(0);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// 덮어쓰기 확인
|
|
236
|
+
const { overwrite } = await prompts({
|
|
237
|
+
type: 'confirm',
|
|
238
|
+
name: 'overwrite',
|
|
239
|
+
message: 'Files exist. Overwrite?',
|
|
240
|
+
initial: false,
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
if (!overwrite) {
|
|
244
|
+
console.log('Cancelled.');
|
|
245
|
+
process.exit(0);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// 실행
|
|
249
|
+
console.log('Selected:', templates);
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
run();
|
|
253
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# MCP 도구 사용 가이드
|
|
2
|
+
|
|
3
|
+
## ⛔ 프로젝트 시작 전 필수 확인
|
|
4
|
+
|
|
5
|
+
### 1. Serena - 프로젝트 활성화 확인
|
|
6
|
+
```
|
|
7
|
+
mcp__serena__get_current_config 호출하여 현재 프로젝트 확인
|
|
8
|
+
→ 프로젝트 미활성화 시: mcp__serena__activate_project 실행
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### 2. Sequential Thinking - 복잡한 문제 분석용
|
|
12
|
+
```
|
|
13
|
+
복잡한 로직, 아키텍처 설계, 디버깅 시 활용
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 3. sgrep - 코드베이스 검색용
|
|
17
|
+
```
|
|
18
|
+
❌ grep, rg 사용 금지
|
|
19
|
+
✅ sgrep 사용 필수
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 필수 MCP 도구
|
|
25
|
+
|
|
26
|
+
### sgrep (코드 검색)
|
|
27
|
+
```
|
|
28
|
+
❌ 금지: grep, rg, find
|
|
29
|
+
✅ 필수: sgrep
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**사용 상황**:
|
|
33
|
+
- 함수/클래스 정의 찾기
|
|
34
|
+
- 특정 패턴 검색
|
|
35
|
+
- 코드베이스 탐색
|
|
36
|
+
|
|
37
|
+
### Sequential Thinking (복잡한 분석)
|
|
38
|
+
**사용 상황**:
|
|
39
|
+
- 복잡한 로직 분석
|
|
40
|
+
- 아키텍처 설계
|
|
41
|
+
- 디버깅 및 문제 해결
|
|
42
|
+
- 멀티스텝 작업 계획
|
|
43
|
+
|
|
44
|
+
### Context7 (라이브러리 문서)
|
|
45
|
+
**사용 상황**:
|
|
46
|
+
- Commander 사용법 확인
|
|
47
|
+
- fs-extra API 확인
|
|
48
|
+
- prompts 옵션 확인
|
|
49
|
+
- 라이브러리 버전별 차이 확인
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 상황별 MCP 사용
|
|
54
|
+
|
|
55
|
+
| 상황 | 사용 MCP |
|
|
56
|
+
|------|----------|
|
|
57
|
+
| 코드 검색 | sgrep |
|
|
58
|
+
| 복잡한 분석 | Sequential Thinking |
|
|
59
|
+
| 라이브러리 문서 | Context7 |
|
|
60
|
+
| 프로젝트 컨텍스트 | Serena |
|