@kood/claude-code 0.1.0 → 0.1.1
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
CHANGED
|
@@ -166,26 +166,31 @@ var init = async (options) => {
|
|
|
166
166
|
logger.error("No templates found. Package may be corrupted.");
|
|
167
167
|
process.exit(1);
|
|
168
168
|
}
|
|
169
|
-
let
|
|
170
|
-
if (
|
|
169
|
+
let templates = options.templates || [];
|
|
170
|
+
if (templates.length === 0) {
|
|
171
171
|
const response = await prompts({
|
|
172
|
-
type: "
|
|
173
|
-
name: "
|
|
174
|
-
message: "Select
|
|
172
|
+
type: "multiselect",
|
|
173
|
+
name: "templates",
|
|
174
|
+
message: "Select templates (space to select, enter to confirm):",
|
|
175
175
|
choices: availableTemplates.map((t) => ({
|
|
176
176
|
title: t,
|
|
177
177
|
description: TEMPLATE_DESCRIPTIONS[t] || "",
|
|
178
178
|
value: t
|
|
179
|
-
}))
|
|
179
|
+
})),
|
|
180
|
+
min: 1,
|
|
181
|
+
hint: "- Space to select. Return to submit"
|
|
180
182
|
});
|
|
181
|
-
if (!response.
|
|
183
|
+
if (!response.templates || response.templates.length === 0) {
|
|
182
184
|
logger.warn("Operation cancelled.");
|
|
183
185
|
process.exit(0);
|
|
184
186
|
}
|
|
185
|
-
|
|
187
|
+
templates = response.templates;
|
|
186
188
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
+
const invalidTemplates = templates.filter(
|
|
190
|
+
(t) => !availableTemplates.includes(t)
|
|
191
|
+
);
|
|
192
|
+
if (invalidTemplates.length > 0) {
|
|
193
|
+
logger.error(`Templates not found: ${invalidTemplates.join(", ")}`);
|
|
189
194
|
logger.info(`Available templates: ${availableTemplates.join(", ")}`);
|
|
190
195
|
process.exit(1);
|
|
191
196
|
}
|
|
@@ -205,80 +210,104 @@ var init = async (options) => {
|
|
|
205
210
|
process.exit(0);
|
|
206
211
|
}
|
|
207
212
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
try {
|
|
213
|
-
const result = await copyTemplate(template, targetDir);
|
|
214
|
-
logger.success(`${result.files} files copied`);
|
|
215
|
-
logger.success(`${result.directories} directories created`);
|
|
213
|
+
let totalFiles = 0;
|
|
214
|
+
let totalDirectories = 0;
|
|
215
|
+
const allSkills = [];
|
|
216
|
+
for (const template of templates) {
|
|
216
217
|
logger.blank();
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
218
|
+
logger.info(`Installing ${template} template...`);
|
|
219
|
+
logger.step(`Target: ${targetDir}`);
|
|
220
|
+
logger.blank();
|
|
221
|
+
try {
|
|
222
|
+
const result = await copyTemplate(template, targetDir);
|
|
223
|
+
totalFiles += result.files;
|
|
224
|
+
totalDirectories += result.directories;
|
|
225
|
+
logger.success(`${template}: ${result.files} files copied`);
|
|
226
|
+
const availableSkills = await listAvailableSkills(template);
|
|
227
|
+
if (availableSkills.length > 0) {
|
|
228
|
+
for (const skill of availableSkills) {
|
|
229
|
+
if (!allSkills.includes(skill)) {
|
|
230
|
+
allSkills.push(skill);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
} catch (error) {
|
|
235
|
+
logger.error(
|
|
236
|
+
`Failed to install ${template}: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
237
|
+
);
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
logger.blank();
|
|
242
|
+
logger.success(`Total: ${totalFiles} files, ${totalDirectories} directories`);
|
|
243
|
+
if (allSkills.length > 0) {
|
|
244
|
+
let installSkills = options.skills;
|
|
245
|
+
if (installSkills === void 0) {
|
|
246
|
+
logger.blank();
|
|
247
|
+
const response = await prompts({
|
|
248
|
+
type: "confirm",
|
|
249
|
+
name: "installSkills",
|
|
250
|
+
message: `Install Claude Code skills? (${allSkills.join(", ")})`,
|
|
251
|
+
initial: true
|
|
252
|
+
});
|
|
253
|
+
installSkills = response.installSkills;
|
|
254
|
+
}
|
|
255
|
+
if (installSkills) {
|
|
256
|
+
const existingSkills = await checkExistingSkills(targetDir, allSkills);
|
|
257
|
+
if (existingSkills.length > 0 && !options.force) {
|
|
258
|
+
logger.warn("The following skills already exist:");
|
|
259
|
+
existingSkills.forEach((s) => logger.step(s));
|
|
260
|
+
logger.blank();
|
|
221
261
|
const response = await prompts({
|
|
222
262
|
type: "confirm",
|
|
223
|
-
name: "
|
|
224
|
-
message:
|
|
225
|
-
initial:
|
|
263
|
+
name: "overwrite",
|
|
264
|
+
message: "Overwrite existing skills?",
|
|
265
|
+
initial: false
|
|
226
266
|
});
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (installSkills) {
|
|
230
|
-
const existingSkills = await checkExistingSkills(
|
|
231
|
-
targetDir,
|
|
232
|
-
availableSkills
|
|
233
|
-
);
|
|
234
|
-
if (existingSkills.length > 0 && !options.force) {
|
|
235
|
-
logger.warn("The following skills already exist:");
|
|
236
|
-
existingSkills.forEach((s) => logger.step(s));
|
|
237
|
-
logger.blank();
|
|
238
|
-
const response = await prompts({
|
|
239
|
-
type: "confirm",
|
|
240
|
-
name: "overwrite",
|
|
241
|
-
message: "Overwrite existing skills?",
|
|
242
|
-
initial: false
|
|
243
|
-
});
|
|
244
|
-
if (!response.overwrite) {
|
|
245
|
-
logger.info("Skipping skills installation.");
|
|
246
|
-
} else {
|
|
247
|
-
const skillsResult = await copySkills(
|
|
248
|
-
template,
|
|
249
|
-
targetDir
|
|
250
|
-
);
|
|
251
|
-
logger.success(
|
|
252
|
-
`Skills installed: ${skillsResult.skills.join(", ")}`
|
|
253
|
-
);
|
|
254
|
-
logger.step(`Location: .claude/skills/`);
|
|
255
|
-
}
|
|
267
|
+
if (!response.overwrite) {
|
|
268
|
+
logger.info("Skipping skills installation.");
|
|
256
269
|
} else {
|
|
257
|
-
|
|
258
|
-
logger.success(`Skills installed: ${skillsResult.skills.join(", ")}`);
|
|
259
|
-
logger.step(`Location: .claude/skills/`);
|
|
270
|
+
await installAllSkills(templates, targetDir);
|
|
260
271
|
}
|
|
261
|
-
|
|
272
|
+
} else {
|
|
273
|
+
await installAllSkills(templates, targetDir);
|
|
262
274
|
}
|
|
275
|
+
logger.blank();
|
|
263
276
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
277
|
+
}
|
|
278
|
+
logger.success("Claude Code documentation installed!");
|
|
279
|
+
logger.blank();
|
|
280
|
+
logger.info("Installed templates:");
|
|
281
|
+
templates.forEach((t) => logger.step(t));
|
|
282
|
+
logger.blank();
|
|
283
|
+
logger.info("Next steps:");
|
|
284
|
+
logger.step("Read CLAUDE.md for project guidelines");
|
|
285
|
+
logger.step("Explore docs/ for detailed documentation");
|
|
286
|
+
logger.blank();
|
|
287
|
+
};
|
|
288
|
+
var installAllSkills = async (templates, targetDir) => {
|
|
289
|
+
const installedSkills = [];
|
|
290
|
+
for (const template of templates) {
|
|
291
|
+
const skillsResult = await copySkills(template, targetDir);
|
|
292
|
+
for (const skill of skillsResult.skills) {
|
|
293
|
+
if (!installedSkills.includes(skill)) {
|
|
294
|
+
installedSkills.push(skill);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (installedSkills.length > 0) {
|
|
299
|
+
logger.success(`Skills installed: ${installedSkills.join(", ")}`);
|
|
300
|
+
logger.step(`Location: .claude/skills/`);
|
|
275
301
|
}
|
|
276
302
|
};
|
|
277
303
|
|
|
278
304
|
// src/index.ts
|
|
279
305
|
var program = new Command();
|
|
280
306
|
program.name("claude-code").description("Claude Code documentation installer for projects").version("1.0.0");
|
|
281
|
-
program.option(
|
|
307
|
+
program.option(
|
|
308
|
+
"-t, --template <names>",
|
|
309
|
+
"template names (comma-separated: tanstack-start,hono)"
|
|
310
|
+
).option("-f, --force", "overwrite existing files without prompting").option("-s, --skills", "install Claude Code skills").option("--no-skills", "skip skills installation").option("--cwd <path>", "target directory (default: current directory)").option("--list", "list available templates").action(async (options) => {
|
|
282
311
|
banner();
|
|
283
312
|
if (options.list) {
|
|
284
313
|
const templates = await listAvailableTemplates();
|
|
@@ -288,7 +317,7 @@ program.option("-t, --template <name>", "template name (tanstack-start, hono)").
|
|
|
288
317
|
return;
|
|
289
318
|
}
|
|
290
319
|
await init({
|
|
291
|
-
|
|
320
|
+
templates: options.template?.split(",").map((t) => t.trim()),
|
|
292
321
|
force: options.force,
|
|
293
322
|
cwd: options.cwd,
|
|
294
323
|
skills: options.skills
|
package/package.json
CHANGED
|
@@ -1,94 +1,176 @@
|
|
|
1
|
-
# MCP
|
|
1
|
+
# MCP (Model Context Protocol)
|
|
2
2
|
|
|
3
|
-
> Claude Code
|
|
3
|
+
> Claude Code 작업 효율성을 높이는 MCP 서버 활용 가이드
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## ⛔ 프로젝트 시작 전 필수 확인
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
**작업 시작 전 반드시 아래 3가지 MCP가 활성화되어 있는지 확인하세요:**
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
1. Serena - 프로젝트 활성화 확인
|
|
13
|
+
→ mcp__serena__get_current_config 호출
|
|
14
|
+
→ 프로젝트 미활성화 시: mcp__serena__activate_project
|
|
15
|
+
|
|
16
|
+
2. Sequential Thinking - 복잡한 문제 분석용
|
|
17
|
+
→ 사용 가능 여부 확인
|
|
18
|
+
|
|
19
|
+
3. sgrep - 코드베이스 검색용
|
|
20
|
+
→ grep/rg 대신 반드시 sgrep 사용
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 🚨 필수 사용 규칙
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
✅ 프로젝트 시작 전 → Serena 활성화 확인 (필수!)
|
|
29
|
+
✅ 코드베이스 검색 → sgrep 사용 (grep/rg 금지)
|
|
30
|
+
✅ 복잡한 분석/디버깅 → Sequential Thinking 사용
|
|
31
|
+
✅ 라이브러리 문서 조회 → Context7 사용
|
|
32
|
+
✅ 세션 컨텍스트 유지 → Serena 메모리 활용
|
|
33
|
+
✅ 도구 조합: sgrep로 위치 파악 → Sequential로 분석 → Context7로 문서 확인
|
|
34
|
+
```
|
|
14
35
|
|
|
15
36
|
---
|
|
16
37
|
|
|
17
|
-
##
|
|
38
|
+
## 🚀 Quick Reference
|
|
39
|
+
|
|
40
|
+
### Serena - 프로젝트 컨텍스트 관리 (필수)
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
프로젝트 시작 시 (필수):
|
|
44
|
+
1. get_current_config → 현재 상태 확인
|
|
45
|
+
2. activate_project → 프로젝트 활성화
|
|
46
|
+
3. check_onboarding_performed → 온보딩 확인
|
|
47
|
+
|
|
48
|
+
사용 시점:
|
|
49
|
+
- 프로젝트 시작/재개 시 (필수)
|
|
50
|
+
- 심볼 탐색/수정
|
|
51
|
+
- 세션 간 컨텍스트 유지 (메모리)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Sequential Thinking - 복잡한 문제 해결
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
사용 시점:
|
|
58
|
+
- 버그 분석 및 디버깅
|
|
59
|
+
- 아키텍처 설계
|
|
60
|
+
- 복잡한 로직 구현
|
|
61
|
+
- 코드 리팩토링 계획
|
|
62
|
+
- 성능 최적화 분석
|
|
63
|
+
|
|
64
|
+
사용법: 문제를 단계별로 분해하여 체계적으로 해결
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### sgrep - 코드베이스 검색 (필수)
|
|
18
68
|
|
|
19
|
-
|
|
69
|
+
```
|
|
70
|
+
사용 시점:
|
|
71
|
+
- 코드 위치 파악
|
|
72
|
+
- 자연어 검색
|
|
73
|
+
- 심볼 참조 찾기
|
|
74
|
+
|
|
75
|
+
주의: grep/rg 대신 반드시 sgrep 사용!
|
|
76
|
+
```
|
|
20
77
|
|
|
21
|
-
###
|
|
22
|
-
- 코드베이스에서 패턴 검색
|
|
23
|
-
- 함수/클래스 사용처 찾기
|
|
24
|
-
- 특정 패턴의 코드 찾기
|
|
78
|
+
### Context7 - 라이브러리 문서 조회
|
|
25
79
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
80
|
+
```
|
|
81
|
+
사용 시점:
|
|
82
|
+
- API 사용법 확인
|
|
83
|
+
- 라이브러리 최신 문법 확인
|
|
84
|
+
- 공식 문서 기반 구현
|
|
85
|
+
- 버전별 변경사항 확인
|
|
86
|
+
|
|
87
|
+
사용법:
|
|
88
|
+
1. resolve-library-id로 라이브러리 ID 조회
|
|
89
|
+
2. get-library-docs로 문서 가져오기
|
|
90
|
+
```
|
|
30
91
|
|
|
31
92
|
---
|
|
32
93
|
|
|
33
|
-
##
|
|
94
|
+
## 📁 문서 구조
|
|
34
95
|
|
|
35
|
-
|
|
96
|
+
```
|
|
97
|
+
docs/mcp/
|
|
98
|
+
├── index.md # 이 문서 (개요)
|
|
99
|
+
├── serena.md # Serena 프로젝트 관리 (필수)
|
|
100
|
+
├── sgrep.md # 코드베이스 검색 (필수)
|
|
101
|
+
├── sequential-thinking.md # Sequential Thinking 상세 (필수)
|
|
102
|
+
└── context7.md # Context7 상세
|
|
103
|
+
```
|
|
36
104
|
|
|
37
|
-
|
|
38
|
-
- 복잡한 버그 디버깅
|
|
39
|
-
- 아키텍처 분석/설계
|
|
40
|
-
- 성능 병목 분석
|
|
41
|
-
- 리팩토링 계획 수립
|
|
105
|
+
---
|
|
42
106
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
107
|
+
## 📋 도구 목록
|
|
108
|
+
|
|
109
|
+
| 도구 | 용도 | 필수 여부 |
|
|
110
|
+
|-----|------|----------|
|
|
111
|
+
| [Serena](./serena.md) | 프로젝트 컨텍스트 관리 | ⭐ 필수 |
|
|
112
|
+
| [sgrep](./sgrep.md) | 코드베이스 검색 | ⭐ 필수 |
|
|
113
|
+
| [Sequential Thinking](./sequential-thinking.md) | 체계적 문제 해결 | ⭐ 필수 |
|
|
114
|
+
| [Context7](./context7.md) | 라이브러리 문서 | 권장 |
|
|
47
115
|
|
|
48
116
|
---
|
|
49
117
|
|
|
50
|
-
##
|
|
118
|
+
## ⚡ 작업별 MCP 선택 가이드
|
|
51
119
|
|
|
52
|
-
|
|
120
|
+
### 프로젝트 시작 (필수)
|
|
121
|
+
```
|
|
122
|
+
1. Serena: get_current_config로 상태 확인
|
|
123
|
+
2. Serena: activate_project로 프로젝트 활성화
|
|
124
|
+
3. Serena: list_memories로 이전 컨텍스트 확인
|
|
125
|
+
```
|
|
53
126
|
|
|
54
|
-
###
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
127
|
+
### 버그 수정
|
|
128
|
+
```
|
|
129
|
+
1. sgrep로 관련 코드 위치 파악
|
|
130
|
+
2. Sequential Thinking으로 문제 분석
|
|
131
|
+
3. 원인 파악 후 Context7로 관련 API 확인
|
|
132
|
+
4. 수정 구현
|
|
133
|
+
```
|
|
58
134
|
|
|
59
|
-
###
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
135
|
+
### 새 기능 구현
|
|
136
|
+
```
|
|
137
|
+
1. sgrep로 기존 패턴 검색
|
|
138
|
+
2. Sequential Thinking으로 구현 계획 수립
|
|
139
|
+
3. Context7로 사용할 라이브러리 문서 확인
|
|
140
|
+
4. 단계별 구현
|
|
141
|
+
5. Serena: write_memory로 주요 결정 저장
|
|
142
|
+
```
|
|
64
143
|
|
|
65
|
-
### 사용
|
|
144
|
+
### 라이브러리 사용
|
|
66
145
|
```
|
|
67
|
-
Context7로
|
|
68
|
-
|
|
69
|
-
Context7로 Prisma transaction 문서 조회
|
|
146
|
+
1. Context7로 공식 문서 조회
|
|
147
|
+
2. 필요시 Sequential Thinking으로 복잡한 통합 분석
|
|
70
148
|
```
|
|
71
149
|
|
|
72
|
-
|
|
150
|
+
### 성능 최적화
|
|
151
|
+
```
|
|
152
|
+
1. sgrep로 병목 의심 코드 검색
|
|
153
|
+
2. Sequential Thinking으로 병목 분석
|
|
154
|
+
3. Context7로 최적화 관련 API 확인
|
|
155
|
+
4. 개선 구현
|
|
156
|
+
```
|
|
73
157
|
|
|
74
|
-
|
|
158
|
+
### 코드베이스 탐색
|
|
159
|
+
```
|
|
160
|
+
1. sgrep로 자연어 쿼리 검색
|
|
161
|
+
2. 관련 코드 위치 파악
|
|
162
|
+
3. 필요시 Sequential Thinking으로 흐름 분석
|
|
163
|
+
```
|
|
75
164
|
|
|
165
|
+
### 세션 종료
|
|
76
166
|
```
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
└─ No
|
|
80
|
-
├─ 복잡한 분석이 필요한가?
|
|
81
|
-
│ ├─ Yes → Sequential Thinking 사용
|
|
82
|
-
│ └─ No
|
|
83
|
-
│ └─ 라이브러리 문서가 필요한가?
|
|
84
|
-
│ ├─ Yes → Context7 사용
|
|
85
|
-
│ └─ No → 일반 도구 사용
|
|
167
|
+
1. Serena: write_memory로 진행 상황 저장
|
|
168
|
+
2. 다음 세션에서 read_memory로 복구
|
|
86
169
|
```
|
|
87
170
|
|
|
88
171
|
---
|
|
89
172
|
|
|
90
|
-
## 관련 문서
|
|
173
|
+
## 🔗 관련 문서
|
|
91
174
|
|
|
92
|
-
- [
|
|
93
|
-
- [
|
|
94
|
-
- [Context7 상세](./context7.md)
|
|
175
|
+
- [Hono](../library/hono/index.md) - Web Framework
|
|
176
|
+
- [Zod](../library/zod/index.md) - Validation
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Serena MCP Server
|
|
2
|
+
|
|
3
|
+
> **Purpose**: 시맨틱 코드 이해, 프로젝트 메모리, 세션 지속성을 위한 MCP 서버
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 프로젝트 시작 전 필수 확인
|
|
8
|
+
|
|
9
|
+
프로젝트 작업을 시작하기 전에 **반드시** Serena가 활성화되어 있는지 확인해야 합니다.
|
|
10
|
+
|
|
11
|
+
### 1. 현재 설정 확인
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
mcp__serena__get_current_config
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**확인 사항:**
|
|
18
|
+
- `Active project`: 현재 작업할 프로젝트명이 표시되는지 확인
|
|
19
|
+
- 프로젝트가 `Available projects` 목록에 있는지 확인
|
|
20
|
+
|
|
21
|
+
### 2. 프로젝트 활성화
|
|
22
|
+
|
|
23
|
+
프로젝트가 활성화되지 않은 경우:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
mcp__serena__activate_project({ project: "프로젝트명" })
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 3. 온보딩 확인
|
|
30
|
+
|
|
31
|
+
새 프로젝트의 경우 온보딩이 필요할 수 있습니다:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
mcp__serena__check_onboarding_performed
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
온보딩이 필요한 경우:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
mcp__serena__onboarding
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 핵심 기능
|
|
46
|
+
|
|
47
|
+
### 심볼 탐색 (Symbol Navigation)
|
|
48
|
+
|
|
49
|
+
파일 내 심볼(클래스, 함수, 변수 등) 개요 확인:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
mcp__serena__get_symbols_overview({ relative_path: "src/index.ts" })
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
특정 심볼 검색:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
mcp__serena__find_symbol({
|
|
59
|
+
name_path_pattern: "MyClass/myMethod",
|
|
60
|
+
include_body: true,
|
|
61
|
+
depth: 1
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
심볼 참조 찾기:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
mcp__serena__find_referencing_symbols({
|
|
69
|
+
name_path: "MyClass",
|
|
70
|
+
relative_path: "src/my-class.ts"
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 코드 수정 (Code Modification)
|
|
75
|
+
|
|
76
|
+
심볼 본문 교체:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
mcp__serena__replace_symbol_body({
|
|
80
|
+
name_path: "MyClass/myMethod",
|
|
81
|
+
relative_path: "src/my-class.ts",
|
|
82
|
+
body: "새로운 코드 본문"
|
|
83
|
+
})
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
심볼 뒤에 코드 삽입:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
mcp__serena__insert_after_symbol({
|
|
90
|
+
name_path: "MyClass",
|
|
91
|
+
relative_path: "src/my-class.ts",
|
|
92
|
+
body: "\n\nexport const newFunction = () => {}"
|
|
93
|
+
})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
심볼 앞에 코드 삽입:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
mcp__serena__insert_before_symbol({
|
|
100
|
+
name_path: "MyClass",
|
|
101
|
+
relative_path: "src/my-class.ts",
|
|
102
|
+
body: "import { Something } from './something'\n\n"
|
|
103
|
+
})
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
심볼 이름 변경 (전체 코드베이스):
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
mcp__serena__rename_symbol({
|
|
110
|
+
name_path: "oldFunctionName",
|
|
111
|
+
relative_path: "src/utils.ts",
|
|
112
|
+
new_name: "newFunctionName"
|
|
113
|
+
})
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 파일 탐색 (File Navigation)
|
|
117
|
+
|
|
118
|
+
디렉토리 목록:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
mcp__serena__list_dir({
|
|
122
|
+
relative_path: "src",
|
|
123
|
+
recursive: false
|
|
124
|
+
})
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
파일 검색:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
mcp__serena__find_file({
|
|
131
|
+
file_mask: "*.ts",
|
|
132
|
+
relative_path: "src"
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
패턴 검색:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
mcp__serena__search_for_pattern({
|
|
140
|
+
substring_pattern: "createServerFn",
|
|
141
|
+
relative_path: "src/services",
|
|
142
|
+
context_lines_before: 2,
|
|
143
|
+
context_lines_after: 2
|
|
144
|
+
})
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 메모리 관리 (Memory Management)
|
|
148
|
+
|
|
149
|
+
프로젝트 관련 정보를 메모리에 저장하여 세션 간 유지:
|
|
150
|
+
|
|
151
|
+
메모리 목록 확인:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
mcp__serena__list_memories
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
메모리 읽기:
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
mcp__serena__read_memory({ memory_file_name: "architecture.md" })
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
메모리 작성:
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
mcp__serena__write_memory({
|
|
167
|
+
memory_file_name: "decisions.md",
|
|
168
|
+
content: "# 주요 결정 사항\n\n- API 설계: REST 대신 Server Functions 사용"
|
|
169
|
+
})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
메모리 수정:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
mcp__serena__edit_memory({
|
|
176
|
+
memory_file_name: "decisions.md",
|
|
177
|
+
needle: "REST 대신",
|
|
178
|
+
repl: "REST API 대신",
|
|
179
|
+
mode: "literal"
|
|
180
|
+
})
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
메모리 삭제:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
mcp__serena__delete_memory({ memory_file_name: "outdated.md" })
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 사고 도구 (Thinking Tools)
|
|
190
|
+
|
|
191
|
+
수집된 정보 검토:
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
mcp__serena__think_about_collected_information
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
작업 목표 준수 확인:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
mcp__serena__think_about_task_adherence
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
작업 완료 여부 확인:
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
mcp__serena__think_about_whether_you_are_done
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 사용 시나리오
|
|
212
|
+
|
|
213
|
+
### 시나리오 1: 새 프로젝트 시작
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
1. get_current_config → 현재 상태 확인
|
|
217
|
+
2. activate_project → 프로젝트 활성화
|
|
218
|
+
3. check_onboarding_performed → 온보딩 필요 여부 확인
|
|
219
|
+
4. onboarding → 필요시 온보딩 진행
|
|
220
|
+
5. list_memories → 기존 메모리 확인
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 시나리오 2: 기존 프로젝트 재개
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
1. get_current_config → 프로젝트 활성화 확인
|
|
227
|
+
2. list_memories → 이전 세션 컨텍스트 확인
|
|
228
|
+
3. read_memory → 필요한 메모리 읽기
|
|
229
|
+
4. 작업 진행
|
|
230
|
+
5. write_memory → 중요 결정/진행 상황 저장
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 시나리오 3: 대규모 리팩토링
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
1. get_symbols_overview → 파일 구조 파악
|
|
237
|
+
2. find_symbol → 수정할 심볼 찾기
|
|
238
|
+
3. find_referencing_symbols → 영향받는 코드 확인
|
|
239
|
+
4. replace_symbol_body → 심볼 수정
|
|
240
|
+
5. rename_symbol → 필요시 이름 변경
|
|
241
|
+
6. think_about_whether_you_are_done → 완료 확인
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Best Practices
|
|
247
|
+
|
|
248
|
+
### 1. 항상 프로젝트 활성화 확인
|
|
249
|
+
|
|
250
|
+
작업 시작 전 `get_current_config`로 올바른 프로젝트가 활성화되어 있는지 확인하세요.
|
|
251
|
+
|
|
252
|
+
### 2. 심볼 도구 우선 사용
|
|
253
|
+
|
|
254
|
+
전체 파일을 읽지 말고, `get_symbols_overview`와 `find_symbol`을 사용하여 필요한 부분만 확인하세요.
|
|
255
|
+
|
|
256
|
+
### 3. 메모리 적극 활용
|
|
257
|
+
|
|
258
|
+
중요한 결정, 아키텍처 정보, 작업 진행 상황을 메모리에 저장하여 세션 간 컨텍스트를 유지하세요.
|
|
259
|
+
|
|
260
|
+
### 4. 사고 도구 활용
|
|
261
|
+
|
|
262
|
+
복잡한 작업 중에는 `think_about_*` 도구를 사용하여 진행 상황을 검토하세요.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 참고 자료
|
|
267
|
+
|
|
268
|
+
- [Serena GitHub](https://github.com/oraios/serena)
|
|
269
|
+
- [MCP Protocol](https://modelcontextprotocol.io)
|
|
@@ -4,12 +4,32 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## ⛔ 프로젝트 시작 전 필수 확인
|
|
8
|
+
|
|
9
|
+
**작업 시작 전 반드시 아래 3가지 MCP가 활성화되어 있는지 확인하세요:**
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
1. Serena - 프로젝트 활성화 확인
|
|
13
|
+
→ mcp__serena__get_current_config 호출
|
|
14
|
+
→ 프로젝트 미활성화 시: mcp__serena__activate_project
|
|
15
|
+
|
|
16
|
+
2. Sequential Thinking - 복잡한 문제 분석용
|
|
17
|
+
→ 사용 가능 여부 확인
|
|
18
|
+
|
|
19
|
+
3. sgrep - 코드베이스 검색용
|
|
20
|
+
→ grep/rg 대신 반드시 sgrep 사용
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
7
25
|
## 🚨 필수 사용 규칙
|
|
8
26
|
|
|
9
27
|
```
|
|
28
|
+
✅ 프로젝트 시작 전 → Serena 활성화 확인 (필수!)
|
|
10
29
|
✅ 코드베이스 검색 → sgrep 사용 (grep/rg 금지)
|
|
11
30
|
✅ 복잡한 분석/디버깅 → Sequential Thinking 사용
|
|
12
31
|
✅ 라이브러리 문서 조회 → Context7 사용
|
|
32
|
+
✅ 세션 컨텍스트 유지 → Serena 메모리 활용
|
|
13
33
|
✅ 도구 조합: sgrep로 위치 파악 → Sequential로 분석 → Context7로 문서 확인
|
|
14
34
|
```
|
|
15
35
|
|
|
@@ -17,6 +37,20 @@
|
|
|
17
37
|
|
|
18
38
|
## 🚀 Quick Reference
|
|
19
39
|
|
|
40
|
+
### Serena - 프로젝트 컨텍스트 관리 (필수)
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
프로젝트 시작 시 (필수):
|
|
44
|
+
1. get_current_config → 현재 상태 확인
|
|
45
|
+
2. activate_project → 프로젝트 활성화
|
|
46
|
+
3. check_onboarding_performed → 온보딩 확인
|
|
47
|
+
|
|
48
|
+
사용 시점:
|
|
49
|
+
- 프로젝트 시작/재개 시 (필수)
|
|
50
|
+
- 심볼 탐색/수정
|
|
51
|
+
- 세션 간 컨텍스트 유지 (메모리)
|
|
52
|
+
```
|
|
53
|
+
|
|
20
54
|
### Sequential Thinking - 복잡한 문제 해결
|
|
21
55
|
|
|
22
56
|
```
|
|
@@ -30,6 +64,17 @@
|
|
|
30
64
|
사용법: 문제를 단계별로 분해하여 체계적으로 해결
|
|
31
65
|
```
|
|
32
66
|
|
|
67
|
+
### sgrep - 코드베이스 검색 (필수)
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
사용 시점:
|
|
71
|
+
- 코드 위치 파악
|
|
72
|
+
- 자연어 검색
|
|
73
|
+
- 심볼 참조 찾기
|
|
74
|
+
|
|
75
|
+
주의: grep/rg 대신 반드시 sgrep 사용!
|
|
76
|
+
```
|
|
77
|
+
|
|
33
78
|
### Context7 - 라이브러리 문서 조회
|
|
34
79
|
|
|
35
80
|
```
|
|
@@ -51,8 +96,9 @@
|
|
|
51
96
|
```
|
|
52
97
|
docs/mcp/
|
|
53
98
|
├── index.md # 이 문서 (개요)
|
|
54
|
-
├──
|
|
55
|
-
├──
|
|
99
|
+
├── serena.md # Serena 프로젝트 관리 (필수)
|
|
100
|
+
├── sgrep.md # 코드베이스 검색 (필수)
|
|
101
|
+
├── sequential-thinking.md # Sequential Thinking 상세 (필수)
|
|
56
102
|
└── context7.md # Context7 상세
|
|
57
103
|
```
|
|
58
104
|
|
|
@@ -60,16 +106,24 @@ docs/mcp/
|
|
|
60
106
|
|
|
61
107
|
## 📋 도구 목록
|
|
62
108
|
|
|
63
|
-
| 도구 | 용도 |
|
|
109
|
+
| 도구 | 용도 | 필수 여부 |
|
|
64
110
|
|-----|------|----------|
|
|
65
|
-
| [
|
|
66
|
-
| [
|
|
67
|
-
| [
|
|
111
|
+
| [Serena](./serena.md) | 프로젝트 컨텍스트 관리 | ⭐ 필수 |
|
|
112
|
+
| [sgrep](./sgrep.md) | 코드베이스 검색 | ⭐ 필수 |
|
|
113
|
+
| [Sequential Thinking](./sequential-thinking.md) | 체계적 문제 해결 | ⭐ 필수 |
|
|
114
|
+
| [Context7](./context7.md) | 라이브러리 문서 | 권장 |
|
|
68
115
|
|
|
69
116
|
---
|
|
70
117
|
|
|
71
118
|
## ⚡ 작업별 MCP 선택 가이드
|
|
72
119
|
|
|
120
|
+
### 프로젝트 시작 (필수)
|
|
121
|
+
```
|
|
122
|
+
1. Serena: get_current_config로 상태 확인
|
|
123
|
+
2. Serena: activate_project로 프로젝트 활성화
|
|
124
|
+
3. Serena: list_memories로 이전 컨텍스트 확인
|
|
125
|
+
```
|
|
126
|
+
|
|
73
127
|
### 버그 수정
|
|
74
128
|
```
|
|
75
129
|
1. sgrep로 관련 코드 위치 파악
|
|
@@ -84,6 +138,7 @@ docs/mcp/
|
|
|
84
138
|
2. Sequential Thinking으로 구현 계획 수립
|
|
85
139
|
3. Context7로 사용할 라이브러리 문서 확인
|
|
86
140
|
4. 단계별 구현
|
|
141
|
+
5. Serena: write_memory로 주요 결정 저장
|
|
87
142
|
```
|
|
88
143
|
|
|
89
144
|
### 라이브러리 사용
|
|
@@ -107,6 +162,12 @@ docs/mcp/
|
|
|
107
162
|
3. 필요시 Sequential Thinking으로 흐름 분석
|
|
108
163
|
```
|
|
109
164
|
|
|
165
|
+
### 세션 종료
|
|
166
|
+
```
|
|
167
|
+
1. Serena: write_memory로 진행 상황 저장
|
|
168
|
+
2. 다음 세션에서 read_memory로 복구
|
|
169
|
+
```
|
|
170
|
+
|
|
110
171
|
---
|
|
111
172
|
|
|
112
173
|
## 🔗 관련 문서
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Serena MCP Server
|
|
2
|
+
|
|
3
|
+
> **Purpose**: 시맨틱 코드 이해, 프로젝트 메모리, 세션 지속성을 위한 MCP 서버
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 프로젝트 시작 전 필수 확인
|
|
8
|
+
|
|
9
|
+
프로젝트 작업을 시작하기 전에 **반드시** Serena가 활성화되어 있는지 확인해야 합니다.
|
|
10
|
+
|
|
11
|
+
### 1. 현재 설정 확인
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
mcp__serena__get_current_config
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**확인 사항:**
|
|
18
|
+
- `Active project`: 현재 작업할 프로젝트명이 표시되는지 확인
|
|
19
|
+
- 프로젝트가 `Available projects` 목록에 있는지 확인
|
|
20
|
+
|
|
21
|
+
### 2. 프로젝트 활성화
|
|
22
|
+
|
|
23
|
+
프로젝트가 활성화되지 않은 경우:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
mcp__serena__activate_project({ project: "프로젝트명" })
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 3. 온보딩 확인
|
|
30
|
+
|
|
31
|
+
새 프로젝트의 경우 온보딩이 필요할 수 있습니다:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
mcp__serena__check_onboarding_performed
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
온보딩이 필요한 경우:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
mcp__serena__onboarding
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 핵심 기능
|
|
46
|
+
|
|
47
|
+
### 심볼 탐색 (Symbol Navigation)
|
|
48
|
+
|
|
49
|
+
파일 내 심볼(클래스, 함수, 변수 등) 개요 확인:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
mcp__serena__get_symbols_overview({ relative_path: "src/index.ts" })
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
특정 심볼 검색:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
mcp__serena__find_symbol({
|
|
59
|
+
name_path_pattern: "MyClass/myMethod",
|
|
60
|
+
include_body: true,
|
|
61
|
+
depth: 1
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
심볼 참조 찾기:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
mcp__serena__find_referencing_symbols({
|
|
69
|
+
name_path: "MyClass",
|
|
70
|
+
relative_path: "src/my-class.ts"
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 코드 수정 (Code Modification)
|
|
75
|
+
|
|
76
|
+
심볼 본문 교체:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
mcp__serena__replace_symbol_body({
|
|
80
|
+
name_path: "MyClass/myMethod",
|
|
81
|
+
relative_path: "src/my-class.ts",
|
|
82
|
+
body: "새로운 코드 본문"
|
|
83
|
+
})
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
심볼 뒤에 코드 삽입:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
mcp__serena__insert_after_symbol({
|
|
90
|
+
name_path: "MyClass",
|
|
91
|
+
relative_path: "src/my-class.ts",
|
|
92
|
+
body: "\n\nexport const newFunction = () => {}"
|
|
93
|
+
})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
심볼 앞에 코드 삽입:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
mcp__serena__insert_before_symbol({
|
|
100
|
+
name_path: "MyClass",
|
|
101
|
+
relative_path: "src/my-class.ts",
|
|
102
|
+
body: "import { Something } from './something'\n\n"
|
|
103
|
+
})
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
심볼 이름 변경 (전체 코드베이스):
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
mcp__serena__rename_symbol({
|
|
110
|
+
name_path: "oldFunctionName",
|
|
111
|
+
relative_path: "src/utils.ts",
|
|
112
|
+
new_name: "newFunctionName"
|
|
113
|
+
})
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 파일 탐색 (File Navigation)
|
|
117
|
+
|
|
118
|
+
디렉토리 목록:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
mcp__serena__list_dir({
|
|
122
|
+
relative_path: "src",
|
|
123
|
+
recursive: false
|
|
124
|
+
})
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
파일 검색:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
mcp__serena__find_file({
|
|
131
|
+
file_mask: "*.ts",
|
|
132
|
+
relative_path: "src"
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
패턴 검색:
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
mcp__serena__search_for_pattern({
|
|
140
|
+
substring_pattern: "createServerFn",
|
|
141
|
+
relative_path: "src/services",
|
|
142
|
+
context_lines_before: 2,
|
|
143
|
+
context_lines_after: 2
|
|
144
|
+
})
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 메모리 관리 (Memory Management)
|
|
148
|
+
|
|
149
|
+
프로젝트 관련 정보를 메모리에 저장하여 세션 간 유지:
|
|
150
|
+
|
|
151
|
+
메모리 목록 확인:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
mcp__serena__list_memories
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
메모리 읽기:
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
mcp__serena__read_memory({ memory_file_name: "architecture.md" })
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
메모리 작성:
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
mcp__serena__write_memory({
|
|
167
|
+
memory_file_name: "decisions.md",
|
|
168
|
+
content: "# 주요 결정 사항\n\n- API 설계: REST 대신 Server Functions 사용"
|
|
169
|
+
})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
메모리 수정:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
mcp__serena__edit_memory({
|
|
176
|
+
memory_file_name: "decisions.md",
|
|
177
|
+
needle: "REST 대신",
|
|
178
|
+
repl: "REST API 대신",
|
|
179
|
+
mode: "literal"
|
|
180
|
+
})
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
메모리 삭제:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
mcp__serena__delete_memory({ memory_file_name: "outdated.md" })
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 사고 도구 (Thinking Tools)
|
|
190
|
+
|
|
191
|
+
수집된 정보 검토:
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
mcp__serena__think_about_collected_information
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
작업 목표 준수 확인:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
mcp__serena__think_about_task_adherence
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
작업 완료 여부 확인:
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
mcp__serena__think_about_whether_you_are_done
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 사용 시나리오
|
|
212
|
+
|
|
213
|
+
### 시나리오 1: 새 프로젝트 시작
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
1. get_current_config → 현재 상태 확인
|
|
217
|
+
2. activate_project → 프로젝트 활성화
|
|
218
|
+
3. check_onboarding_performed → 온보딩 필요 여부 확인
|
|
219
|
+
4. onboarding → 필요시 온보딩 진행
|
|
220
|
+
5. list_memories → 기존 메모리 확인
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 시나리오 2: 기존 프로젝트 재개
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
1. get_current_config → 프로젝트 활성화 확인
|
|
227
|
+
2. list_memories → 이전 세션 컨텍스트 확인
|
|
228
|
+
3. read_memory → 필요한 메모리 읽기
|
|
229
|
+
4. 작업 진행
|
|
230
|
+
5. write_memory → 중요 결정/진행 상황 저장
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 시나리오 3: 대규모 리팩토링
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
1. get_symbols_overview → 파일 구조 파악
|
|
237
|
+
2. find_symbol → 수정할 심볼 찾기
|
|
238
|
+
3. find_referencing_symbols → 영향받는 코드 확인
|
|
239
|
+
4. replace_symbol_body → 심볼 수정
|
|
240
|
+
5. rename_symbol → 필요시 이름 변경
|
|
241
|
+
6. think_about_whether_you_are_done → 완료 확인
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Best Practices
|
|
247
|
+
|
|
248
|
+
### 1. 항상 프로젝트 활성화 확인
|
|
249
|
+
|
|
250
|
+
작업 시작 전 `get_current_config`로 올바른 프로젝트가 활성화되어 있는지 확인하세요.
|
|
251
|
+
|
|
252
|
+
### 2. 심볼 도구 우선 사용
|
|
253
|
+
|
|
254
|
+
전체 파일을 읽지 말고, `get_symbols_overview`와 `find_symbol`을 사용하여 필요한 부분만 확인하세요.
|
|
255
|
+
|
|
256
|
+
### 3. 메모리 적극 활용
|
|
257
|
+
|
|
258
|
+
중요한 결정, 아키텍처 정보, 작업 진행 상황을 메모리에 저장하여 세션 간 컨텍스트를 유지하세요.
|
|
259
|
+
|
|
260
|
+
### 4. 사고 도구 활용
|
|
261
|
+
|
|
262
|
+
복잡한 작업 중에는 `think_about_*` 도구를 사용하여 진행 상황을 검토하세요.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 참고 자료
|
|
267
|
+
|
|
268
|
+
- [Serena GitHub](https://github.com/oraios/serena)
|
|
269
|
+
- [MCP Protocol](https://modelcontextprotocol.io)
|