mcp-probe-kit 2.0.2 → 2.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/README.md +39 -3
- package/build/lib/analysis-tasks.d.ts +35 -0
- package/build/lib/analysis-tasks.js +788 -0
- package/build/lib/document-templates.d.ts +14 -0
- package/build/lib/document-templates.js +248 -0
- package/build/lib/project-detector.d.ts +19 -0
- package/build/lib/project-detector.js +344 -0
- package/build/lib/response.js +1 -0
- package/build/lib/task-generator.d.ts +11 -0
- package/build/lib/task-generator.js +109 -0
- package/build/lib/template-generator.d.ts +14 -0
- package/build/lib/template-generator.js +62 -0
- package/build/lib/templates/backend-templates.d.ts +8 -0
- package/build/lib/templates/backend-templates.js +26 -0
- package/build/schemas/output/project-tools.d.ts +6 -0
- package/build/schemas/output/project-tools.js +5 -0
- package/build/tools/__tests__/start_ui.unit.test.js +2 -2
- package/build/tools/init_project_context.d.ts +2 -1
- package/build/tools/init_project_context.js +586 -327
- package/docs/data/tools.js +15 -7
- package/docs/pages/all-tools.html +1 -1
- package/docs/specs/project-context-modular/example-output.md +123 -0
- package/docs/specs/project-context-modular/implementation-v2.md +275 -0
- package/docs/specs/project-context-modular/tasks.md +104 -9
- package/package.json +4 -4
|
@@ -1,367 +1,626 @@
|
|
|
1
1
|
import { parseArgs, getString } from "../utils/parseArgs.js";
|
|
2
2
|
import { okStructured } from "../lib/response.js";
|
|
3
|
+
import { detectProjectType } from "../lib/project-detector.js";
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
3
6
|
/**
|
|
4
7
|
* init_project_context 工具
|
|
5
8
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
9
|
+
* 功能:生成面向任务的项目上下文文档
|
|
10
|
+
*
|
|
11
|
+
* 设计原则:
|
|
12
|
+
* - 始终生成索引文件 project-context.md 作为入口
|
|
13
|
+
* - 根据项目类型生成 4-5 个实用文档
|
|
14
|
+
* - 提供清晰的模板和直接的填写指导
|
|
15
|
+
* - 强调从项目中提取真实示例
|
|
8
16
|
*/
|
|
9
17
|
// 默认文档目录
|
|
10
18
|
const DEFAULT_DOCS_DIR = "docs";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
|
207
|
-
|
|
208
|
-
|
|
|
209
|
-
|
|
|
210
|
-
|
|
|
211
|
-
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
- [ ] 文件已创建: \`{docs_dir}/project-context.md\`
|
|
271
|
-
- [ ] 项目概览完整(名称、版本、类型、描述都已填写)
|
|
272
|
-
- [ ] 技术栈准确(语言、框架、构建工具正确识别)
|
|
273
|
-
- [ ] 目录结构清晰(树形结构正确,深度适当)
|
|
274
|
-
- [ ] 入口文件正确(主入口文件已识别)
|
|
275
|
-
- [ ] 架构模式已识别(项目类型、设计模式)
|
|
276
|
-
- [ ] 编码规范完整(ESLint、Prettier、命名规范已记录)
|
|
277
|
-
- [ ] TypeScript 配置已记录(如果是 TS 项目)
|
|
278
|
-
- [ ] 依赖列表完整(主要依赖已列出并说明用途)
|
|
279
|
-
- [ ] 开发命令正确(dev、build、test 命令已记录)
|
|
280
|
-
- [ ] 所有占位符已替换(没有 [xxx] 格式的占位符)
|
|
281
|
-
- [ ] Markdown 格式正确(表格、代码块格式正确)
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
## 📌 注意事项
|
|
286
|
-
|
|
287
|
-
1. **如果某项信息无法获取**,请填写 "未配置" 或 "无",不要留空
|
|
288
|
-
2. **目录树生成时**,忽略 \`node_modules\`、\`.git\`、\`dist\`、\`build\`、\`coverage\` 等目录
|
|
289
|
-
3. **依赖说明**,只列出主要依赖(前 10 个),其他可省略
|
|
290
|
-
4. **时间格式**,使用 YYYY-MM-DD HH:mm:ss 格式
|
|
291
|
-
5. **如果 docs 目录不存在**,请先创建该目录
|
|
292
|
-
|
|
293
|
-
---
|
|
294
|
-
|
|
295
|
-
*指南版本: 1.0.0*
|
|
296
|
-
*工具: MCP Probe Kit - init_project_context*
|
|
19
|
+
/**
|
|
20
|
+
* 获取项目基本信息
|
|
21
|
+
*/
|
|
22
|
+
function getProjectInfo(projectRoot) {
|
|
23
|
+
try {
|
|
24
|
+
const pkgPath = path.join(projectRoot, 'package.json');
|
|
25
|
+
if (fs.existsSync(pkgPath)) {
|
|
26
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
27
|
+
return {
|
|
28
|
+
name: pkg.name || 'Unknown Project',
|
|
29
|
+
version: pkg.version || '0.0.0',
|
|
30
|
+
description: pkg.description || ''
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
// Ignore errors
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
name: 'Unknown Project',
|
|
39
|
+
version: '0.0.0',
|
|
40
|
+
description: ''
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 获取文档列表(根据项目类型)
|
|
45
|
+
*/
|
|
46
|
+
function getDocumentList(category) {
|
|
47
|
+
const commonDocs = [
|
|
48
|
+
{ file: 'tech-stack.md', title: '技术栈', purpose: '项目使用的语言、框架、工具' },
|
|
49
|
+
{ file: 'architecture.md', title: '架构设计', purpose: '项目结构、目录说明、设计模式' }
|
|
50
|
+
];
|
|
51
|
+
const categoryDocs = {
|
|
52
|
+
'backend-api': [
|
|
53
|
+
{ file: 'how-to-add-api.md', title: '如何添加新接口', purpose: '添加 API 接口的完整步骤' },
|
|
54
|
+
{ file: 'how-to-database.md', title: '如何操作数据库', purpose: '数据库连接、查询、迁移' },
|
|
55
|
+
{ file: 'how-to-auth.md', title: '如何处理认证', purpose: '用户认证和授权机制' }
|
|
56
|
+
],
|
|
57
|
+
'frontend-spa': [
|
|
58
|
+
{ file: 'how-to-new-page.md', title: '如何创建新页面', purpose: '创建页面组件的完整步骤' },
|
|
59
|
+
{ file: 'how-to-call-api.md', title: '如何调用 API', purpose: 'API 调用方式和错误处理' },
|
|
60
|
+
{ file: 'how-to-state.md', title: '如何管理状态', purpose: '状态管理工具的使用方法' }
|
|
61
|
+
],
|
|
62
|
+
'fullstack': [
|
|
63
|
+
{ file: 'how-to-new-feature.md', title: '如何开发新功能', purpose: '前后端联动开发新功能' },
|
|
64
|
+
{ file: 'how-to-add-api.md', title: '如何添加新接口', purpose: '添加 API 接口的完整步骤' },
|
|
65
|
+
{ file: 'how-to-new-page.md', title: '如何创建新页面', purpose: '创建页面组件的完整步骤' }
|
|
66
|
+
],
|
|
67
|
+
'library': [
|
|
68
|
+
{ file: 'how-to-add-tool.md', title: '如何添加新工具', purpose: '添加新功能/工具的步骤' },
|
|
69
|
+
{ file: 'how-to-test.md', title: '如何编写测试', purpose: '测试框架和测试编写规范' }
|
|
70
|
+
],
|
|
71
|
+
'cli': [
|
|
72
|
+
{ file: 'how-to-add-command.md', title: '如何添加新命令', purpose: '添加 CLI 命令的步骤' },
|
|
73
|
+
{ file: 'how-to-test.md', title: '如何编写测试', purpose: '测试框架和测试编写规范' }
|
|
74
|
+
]
|
|
75
|
+
};
|
|
76
|
+
const specificDocs = categoryDocs[category] || [
|
|
77
|
+
{ file: 'how-to-develop.md', title: '如何开发', purpose: '开发新功能的基本步骤' },
|
|
78
|
+
{ file: 'how-to-test.md', title: '如何编写测试', purpose: '测试框架和测试编写规范' }
|
|
79
|
+
];
|
|
80
|
+
return [...commonDocs, ...specificDocs];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 生成开发指南部分
|
|
84
|
+
*/
|
|
85
|
+
function generateDevGuide(docs) {
|
|
86
|
+
const guides = {
|
|
87
|
+
'添加新功能': [],
|
|
88
|
+
'修改现有代码': [],
|
|
89
|
+
'调试问题': [],
|
|
90
|
+
'编写测试': [],
|
|
91
|
+
'部署上线': []
|
|
92
|
+
};
|
|
93
|
+
// 根据文档类型分类
|
|
94
|
+
docs.forEach(doc => {
|
|
95
|
+
if (doc.file.includes('add-api') || doc.file.includes('add-tool') || doc.file.includes('add-command')) {
|
|
96
|
+
guides['添加新功能'].push(`- **${doc.title}**: [${doc.file}](./project-context/${doc.file})`);
|
|
97
|
+
}
|
|
98
|
+
if (doc.file.includes('new-page') || doc.file.includes('new-feature')) {
|
|
99
|
+
guides['添加新功能'].push(`- **${doc.title}**: [${doc.file}](./project-context/${doc.file})`);
|
|
100
|
+
}
|
|
101
|
+
if (doc.file.includes('database') || doc.file.includes('auth') || doc.file.includes('call-api') || doc.file.includes('state')) {
|
|
102
|
+
guides['修改现有代码'].push(`- **${doc.title}**: [${doc.file}](./project-context/${doc.file})`);
|
|
103
|
+
}
|
|
104
|
+
if (doc.file.includes('architecture')) {
|
|
105
|
+
guides['调试问题'].push(`- **${doc.title}**: [${doc.file}](./project-context/${doc.file}) - 了解项目结构`);
|
|
106
|
+
}
|
|
107
|
+
if (doc.file.includes('tech-stack')) {
|
|
108
|
+
guides['调试问题'].push(`- **${doc.title}**: [${doc.file}](./project-context/${doc.file}) - 了解使用的技术`);
|
|
109
|
+
}
|
|
110
|
+
if (doc.file.includes('test')) {
|
|
111
|
+
guides['编写测试'].push(`- **${doc.title}**: [${doc.file}](./project-context/${doc.file})`);
|
|
112
|
+
}
|
|
113
|
+
if (doc.file.includes('deploy')) {
|
|
114
|
+
guides['部署上线'].push(`- **${doc.title}**: [${doc.file}](./project-context/${doc.file})`);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
let result = '';
|
|
118
|
+
for (const [category, items] of Object.entries(guides)) {
|
|
119
|
+
if (items.length > 0) {
|
|
120
|
+
result += `\n### ${category}\n${items.join('\n')}\n`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return result || '\n### 开发指南\n查看上面的文档导航,根据需要选择对应的文档。\n';
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 生成项目上下文文档指导
|
|
127
|
+
*/
|
|
128
|
+
async function generateProjectContext(docsDir, projectRoot = process.cwd()) {
|
|
129
|
+
try {
|
|
130
|
+
// 检测项目类型
|
|
131
|
+
const detection = detectProjectType(projectRoot);
|
|
132
|
+
const projectInfo = getProjectInfo(projectRoot);
|
|
133
|
+
const docs = getDocumentList(detection.category);
|
|
134
|
+
// 生成指导文本
|
|
135
|
+
const guide = generateGuideText(detection, projectInfo, docs, docsDir);
|
|
136
|
+
// 构建结构化数据
|
|
137
|
+
const structuredData = {
|
|
138
|
+
summary: `生成 ${detection.category} 项目的上下文文档(${docs.length + 1} 个文件)`,
|
|
139
|
+
mode: "modular",
|
|
140
|
+
projectOverview: {
|
|
141
|
+
name: projectInfo.name,
|
|
142
|
+
description: projectInfo.description,
|
|
143
|
+
techStack: detection.framework ? [detection.framework] : [],
|
|
144
|
+
architecture: detection.category
|
|
145
|
+
},
|
|
146
|
+
documentation: [
|
|
147
|
+
{
|
|
148
|
+
path: `${docsDir}/project-context.md`,
|
|
149
|
+
purpose: '项目上下文索引文件(入口)'
|
|
150
|
+
},
|
|
151
|
+
...docs.map(doc => ({
|
|
152
|
+
path: `${docsDir}/project-context/${doc.file}`,
|
|
153
|
+
purpose: doc.purpose
|
|
154
|
+
}))
|
|
155
|
+
]
|
|
156
|
+
};
|
|
157
|
+
return okStructured(guide, structuredData, {
|
|
158
|
+
schema: (await import("../schemas/output/project-tools.js")).ProjectContextSchema,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
163
|
+
throw new Error(`项目上下文初始化失败: ${errorMessage}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 生成指导文本
|
|
168
|
+
*/
|
|
169
|
+
function generateGuideText(detection, projectInfo, docs, docsDir) {
|
|
170
|
+
const timestamp = new Date().toISOString();
|
|
171
|
+
return `# 项目上下文文档生成指导
|
|
172
|
+
|
|
173
|
+
## 📊 项目信息
|
|
174
|
+
|
|
175
|
+
- **项目名称**: ${projectInfo.name}
|
|
176
|
+
- **版本**: ${projectInfo.version}
|
|
177
|
+
- **语言**: ${detection.language}
|
|
178
|
+
- **框架**: ${detection.framework || '未检测到'}
|
|
179
|
+
- **类型**: ${detection.category}
|
|
180
|
+
- **置信度**: ${detection.confidence}%
|
|
181
|
+
|
|
182
|
+
## 📋 需要生成的文档
|
|
183
|
+
|
|
184
|
+
请按照以下结构生成 **${docs.length + 1}** 个文档:
|
|
185
|
+
|
|
186
|
+
\`\`\`
|
|
187
|
+
${docsDir}/
|
|
188
|
+
├── project-context.md # 索引文件(必须首先生成)
|
|
189
|
+
└── project-context/ # 分类文档目录
|
|
190
|
+
${docs.map(doc => ` ├── ${doc.file.padEnd(28)} # ${doc.title}`).join('\n')}
|
|
191
|
+
\`\`\`
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 🎯 生成步骤
|
|
196
|
+
|
|
197
|
+
### 第一步:生成索引文件(最重要!)
|
|
198
|
+
|
|
199
|
+
**文件**: \`${docsDir}/project-context.md\`
|
|
200
|
+
|
|
201
|
+
这是项目上下文的**灵魂**,必须首先生成。它是所有文档的入口和导航中心。
|
|
202
|
+
|
|
203
|
+
**模板**:
|
|
204
|
+
|
|
205
|
+
\`\`\`markdown
|
|
206
|
+
# ${projectInfo.name} - 项目上下文
|
|
207
|
+
|
|
208
|
+
> 本文档是项目上下文的索引文件,提供项目概览和文档导航。
|
|
209
|
+
|
|
210
|
+
## 📊 项目概览
|
|
211
|
+
|
|
212
|
+
| 属性 | 值 |
|
|
213
|
+
|------|-----|
|
|
214
|
+
| 项目名称 | ${projectInfo.name} |
|
|
215
|
+
| 版本 | ${projectInfo.version} |
|
|
216
|
+
| 语言 | ${detection.language} |
|
|
217
|
+
| 框架 | ${detection.framework || '无'} |
|
|
218
|
+
| 类型 | ${detection.category} |
|
|
219
|
+
| 描述 | ${projectInfo.description || '待补充'} |
|
|
220
|
+
|
|
221
|
+
## 📚 文档导航
|
|
222
|
+
|
|
223
|
+
${docs.map(doc => `### [${doc.title}](./project-context/${doc.file})
|
|
224
|
+
${doc.purpose}
|
|
225
|
+
`).join('\n')}
|
|
226
|
+
|
|
227
|
+
## 🚀 快速开始
|
|
228
|
+
|
|
229
|
+
1. 阅读 [技术栈](./project-context/tech-stack.md) 了解项目使用的技术
|
|
230
|
+
2. 阅读 [架构设计](./project-context/architecture.md) 了解项目结构
|
|
231
|
+
3. 根据需要查看具体的操作指南
|
|
232
|
+
|
|
233
|
+
## 💡 开发时查看对应文档
|
|
234
|
+
|
|
235
|
+
根据你要做的事情,查看对应的文档:
|
|
236
|
+
|
|
237
|
+
${generateDevGuide(docs)}
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
*生成时间: ${timestamp}*
|
|
241
|
+
*生成工具: MCP Probe Kit - init_project_context v2.1*
|
|
242
|
+
\`\`\`
|
|
243
|
+
|
|
244
|
+
**使用 fsWrite 创建此文件**
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
### 第二步:生成分类文档
|
|
249
|
+
|
|
250
|
+
${docs.map((doc, index) => generateDocTemplate(doc, index + 2, projectInfo, detection, docsDir)).join('\n\n---\n\n')}
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## ✅ 完成标准
|
|
255
|
+
|
|
256
|
+
请确认:
|
|
257
|
+
|
|
258
|
+
- [ ] 已使用 fsWrite 创建 **${docs.length + 1}** 个文件
|
|
259
|
+
- [ ] 索引文件 \`project-context.md\` 已创建(最重要!)
|
|
260
|
+
- [ ] 所有文档都包含**真实的文件路径**(不是 [xxx] 占位符)
|
|
261
|
+
- [ ] 所有文档都包含**实际的代码示例**(从项目中复制)
|
|
262
|
+
- [ ] 所有步骤都具体可操作
|
|
263
|
+
- [ ] 所有示例都来自项目实际代码
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
**重要提示**:
|
|
268
|
+
1. **必须从项目中提取真实示例** - 不要编造代码
|
|
269
|
+
2. **路径必须真实存在** - 检查文件是否存在
|
|
270
|
+
3. **步骤必须具体** - 不要写"根据需要修改"这种模糊的话
|
|
271
|
+
4. **代码必须完整** - 不要用 ... 省略
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
*工具: MCP Probe Kit - init_project_context*
|
|
276
|
+
*版本: 2.1.0*
|
|
297
277
|
`;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* 生成单个文档的模板
|
|
281
|
+
*/
|
|
282
|
+
function generateDocTemplate(doc, step, projectInfo, detection, docsDir) {
|
|
283
|
+
const timestamp = new Date().toISOString();
|
|
284
|
+
// 根据文档类型生成不同的模板
|
|
285
|
+
const templates = {
|
|
286
|
+
'tech-stack.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
287
|
+
|
|
288
|
+
**用途**: ${doc.purpose}
|
|
289
|
+
|
|
290
|
+
**模板**:
|
|
291
|
+
|
|
292
|
+
\`\`\`markdown
|
|
293
|
+
# 技术栈
|
|
294
|
+
|
|
295
|
+
> 本文档描述 ${projectInfo.name} 的技术栈信息。
|
|
296
|
+
|
|
297
|
+
## 基本信息
|
|
298
|
+
|
|
299
|
+
| 属性 | 值 |
|
|
300
|
+
|------|-----|
|
|
301
|
+
| 项目名称 | ${projectInfo.name} |
|
|
302
|
+
| 版本 | ${projectInfo.version} |
|
|
303
|
+
| 语言 | ${detection.language} |
|
|
304
|
+
| 框架 | ${detection.framework || '无'} |
|
|
305
|
+
|
|
306
|
+
## 技术栈详情
|
|
307
|
+
|
|
308
|
+
### 核心技术
|
|
309
|
+
|
|
310
|
+
| 类别 | 技术 | 版本 |
|
|
311
|
+
|------|------|------|
|
|
312
|
+
| 语言 | [从 package.json 或配置文件中提取] | [版本] |
|
|
313
|
+
| 运行时 | [Node.js/Python/Java 等] | [版本] |
|
|
314
|
+
| 框架 | [主要框架] | [版本] |
|
|
315
|
+
|
|
316
|
+
### 开发工具
|
|
317
|
+
|
|
318
|
+
| 类别 | 工具 | 用途 |
|
|
319
|
+
|------|------|------|
|
|
320
|
+
| 构建工具 | [如 TypeScript, Webpack] | [用途] |
|
|
321
|
+
| 测试框架 | [如 Jest, Vitest] | [用途] |
|
|
322
|
+
| 代码检查 | [如 ESLint, Prettier] | [用途] |
|
|
323
|
+
|
|
324
|
+
### 主要依赖
|
|
325
|
+
|
|
326
|
+
列出 5-10 个最重要的依赖包及其用途。
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
330
|
+
\`\`\`
|
|
331
|
+
|
|
332
|
+
**填写指导**:
|
|
333
|
+
1. 读取 \`package.json\` 获取依赖信息
|
|
334
|
+
2. 读取 \`tsconfig.json\` 或其他配置文件
|
|
335
|
+
3. 列出最重要的 5-10 个依赖包
|
|
336
|
+
4. 说明每个依赖的用途`,
|
|
337
|
+
'architecture.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
338
|
+
|
|
339
|
+
**用途**: ${doc.purpose}
|
|
340
|
+
|
|
341
|
+
**模板**:
|
|
342
|
+
|
|
343
|
+
\`\`\`markdown
|
|
344
|
+
# 架构设计
|
|
345
|
+
|
|
346
|
+
> 本文档描述 ${projectInfo.name} 的架构和项目结构。
|
|
347
|
+
|
|
348
|
+
## 项目结构
|
|
349
|
+
|
|
350
|
+
\`\`\`
|
|
351
|
+
[使用 listDirectory 工具生成目录树,深度 2-3 层]
|
|
352
|
+
\`\`\`
|
|
353
|
+
|
|
354
|
+
## 主要目录说明
|
|
355
|
+
|
|
356
|
+
| 目录 | 用途 |
|
|
357
|
+
|------|------|
|
|
358
|
+
| [目录名] | [从实际项目中分析得出] |
|
|
359
|
+
|
|
360
|
+
## 入口文件
|
|
361
|
+
|
|
362
|
+
- **主入口**: \`[实际的入口文件路径,如 src/index.ts]\`
|
|
363
|
+
- **配置文件**: \`[如 package.json, tsconfig.json]\`
|
|
364
|
+
|
|
365
|
+
## 架构模式
|
|
366
|
+
|
|
367
|
+
- **项目类型**: ${detection.category}
|
|
368
|
+
- **设计模式**: [从代码中识别,如 MVC, 工具集合, 插件系统等]
|
|
369
|
+
- **模块划分**: [说明主要模块及其职责]
|
|
370
|
+
|
|
371
|
+
## 核心模块
|
|
372
|
+
|
|
373
|
+
### [模块名称]
|
|
374
|
+
- **位置**: \`[实际路径]\`
|
|
375
|
+
- **职责**: [模块功能]
|
|
376
|
+
- **主要文件**: [列出 2-3 个关键文件]
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
380
|
+
\`\`\`
|
|
381
|
+
|
|
382
|
+
**填写指导**:
|
|
383
|
+
1. 使用 listDirectory 工具查看项目结构
|
|
384
|
+
2. 读取主要目录下的文件
|
|
385
|
+
3. 识别项目的组织方式
|
|
386
|
+
4. 找出核心模块和关键文件`,
|
|
387
|
+
'how-to-add-api.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
388
|
+
|
|
389
|
+
**用途**: ${doc.purpose}
|
|
390
|
+
|
|
391
|
+
**模板**:
|
|
392
|
+
|
|
393
|
+
\`\`\`markdown
|
|
394
|
+
# 如何添加新接口
|
|
395
|
+
|
|
396
|
+
> 本文档指导如何在 ${projectInfo.name} 中添加新的 API 接口。
|
|
397
|
+
|
|
398
|
+
## 第一步:找到路由定义位置
|
|
399
|
+
|
|
400
|
+
项目的路由定义在:\`[实际路径,如 src/routes/, src/api/]\`
|
|
401
|
+
|
|
402
|
+
**现有示例**(从项目中找一个真实的路由文件):
|
|
403
|
+
\`\`\`[语言]
|
|
404
|
+
[复制一个实际的路由定义代码]
|
|
405
|
+
\`\`\`
|
|
406
|
+
|
|
407
|
+
## 第二步:创建新路由
|
|
408
|
+
|
|
409
|
+
1. 在 \`[路径]\` 目录下创建文件 \`[命名规范].ts\`
|
|
410
|
+
2. 定义路由:
|
|
411
|
+
|
|
412
|
+
\`\`\`[语言]
|
|
413
|
+
[基于项目实际代码风格的示例]
|
|
414
|
+
\`\`\`
|
|
415
|
+
|
|
416
|
+
## 第三步:实现业务逻辑
|
|
417
|
+
|
|
418
|
+
业务逻辑通常在:\`[实际路径,如 src/controllers/, src/services/]\`
|
|
419
|
+
|
|
420
|
+
**现有示例**:
|
|
421
|
+
\`\`\`[语言]
|
|
422
|
+
[复制一个实际的 controller/service 代码]
|
|
423
|
+
\`\`\`
|
|
424
|
+
|
|
425
|
+
## 第四步:数据验证
|
|
426
|
+
|
|
427
|
+
项目使用 [验证库名称] 进行数据验证。
|
|
428
|
+
|
|
429
|
+
**示例**:
|
|
430
|
+
\`\`\`[语言]
|
|
431
|
+
[从项目中找一个验证示例]
|
|
432
|
+
\`\`\`
|
|
433
|
+
|
|
434
|
+
## 第五步:注册路由
|
|
435
|
+
|
|
436
|
+
在 \`[实际文件路径]\` 中注册新路由:
|
|
437
|
+
|
|
438
|
+
\`\`\`[语言]
|
|
439
|
+
[实际的路由注册代码]
|
|
440
|
+
\`\`\`
|
|
441
|
+
|
|
442
|
+
## 第六步:测试
|
|
443
|
+
|
|
444
|
+
运行测试命令:\`[实际命令,如 npm test]\`
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
448
|
+
\`\`\`
|
|
449
|
+
|
|
450
|
+
**填写指导**:
|
|
451
|
+
1. 搜索 src/routes, src/api, src/controllers 等目录
|
|
452
|
+
2. 找 2-3 个现有的 API 接口作为参考
|
|
453
|
+
3. 复制实际的代码示例(不要编造)
|
|
454
|
+
4. 说明项目特定的命名和组织方式`,
|
|
455
|
+
'how-to-new-page.md': `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
456
|
+
|
|
457
|
+
**用途**: ${doc.purpose}
|
|
458
|
+
|
|
459
|
+
**模板**:
|
|
460
|
+
|
|
461
|
+
\`\`\`markdown
|
|
462
|
+
# 如何创建新页面
|
|
463
|
+
|
|
464
|
+
> 本文档指导如何在 ${projectInfo.name} 中创建新的页面组件。
|
|
465
|
+
|
|
466
|
+
## 第一步:找到页面目录
|
|
467
|
+
|
|
468
|
+
项目的页面组件在:\`[实际路径,如 src/pages/, src/views/, app/]\`
|
|
469
|
+
|
|
470
|
+
**现有示例**(从项目中找一个真实的页面):
|
|
471
|
+
\`\`\`[语言]
|
|
472
|
+
[复制一个实际的页面组件代码]
|
|
473
|
+
\`\`\`
|
|
474
|
+
|
|
475
|
+
## 第二步:创建页面文件
|
|
476
|
+
|
|
477
|
+
1. 在 \`[路径]\` 目录下创建 \`[命名规范].tsx\`
|
|
478
|
+
2. 定义组件:
|
|
479
|
+
|
|
480
|
+
\`\`\`[语言]
|
|
481
|
+
[基于项目实际代码风格的示例]
|
|
482
|
+
\`\`\`
|
|
483
|
+
|
|
484
|
+
## 第三步:配置路由
|
|
485
|
+
|
|
486
|
+
项目使用 [路由库名称]。
|
|
487
|
+
|
|
488
|
+
**路由配置位置**: \`[实际文件路径]\`
|
|
489
|
+
|
|
490
|
+
**示例**:
|
|
491
|
+
\`\`\`[语言]
|
|
492
|
+
[从项目中找路由配置示例]
|
|
493
|
+
\`\`\`
|
|
494
|
+
|
|
495
|
+
## 第四步:获取数据
|
|
496
|
+
|
|
497
|
+
项目使用 [数据获取方式,如 useEffect, getServerSideProps, loader]。
|
|
498
|
+
|
|
499
|
+
**示例**:
|
|
500
|
+
\`\`\`[语言]
|
|
501
|
+
[从项目中找数据获取示例]
|
|
502
|
+
\`\`\`
|
|
503
|
+
|
|
504
|
+
## 第五步:编写样式
|
|
505
|
+
|
|
506
|
+
项目使用 [样式方案,如 CSS Modules, Tailwind, styled-components]。
|
|
507
|
+
|
|
508
|
+
**示例**:
|
|
509
|
+
\`\`\`[语言]
|
|
510
|
+
[从项目中找样式示例]
|
|
511
|
+
\`\`\`
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
515
|
+
\`\`\`
|
|
516
|
+
|
|
517
|
+
**填写指导**:
|
|
518
|
+
1. 搜索 src/pages, src/views, app 等目录
|
|
519
|
+
2. 找 1-2 个现有页面作为参考
|
|
520
|
+
3. 复制实际的组件代码
|
|
521
|
+
4. 说明路由配置方式`
|
|
522
|
+
};
|
|
523
|
+
// 如果没有特定模板,使用通用模板
|
|
524
|
+
const template = templates[doc.file] || `**文件**: \`${docsDir}/project-context/${doc.file}\`
|
|
525
|
+
|
|
526
|
+
**用途**: ${doc.purpose}
|
|
527
|
+
|
|
528
|
+
**模板**:
|
|
529
|
+
|
|
530
|
+
\`\`\`markdown
|
|
531
|
+
# ${doc.title}
|
|
532
|
+
|
|
533
|
+
> 本文档描述 ${projectInfo.name} 的 ${doc.title.toLowerCase()}。
|
|
534
|
+
|
|
535
|
+
## 概述
|
|
536
|
+
|
|
537
|
+
[简要说明本文档的内容]
|
|
538
|
+
|
|
539
|
+
## 详细步骤
|
|
540
|
+
|
|
541
|
+
### 第一步:[步骤名称]
|
|
542
|
+
|
|
543
|
+
[具体说明]
|
|
544
|
+
|
|
545
|
+
**示例**:
|
|
546
|
+
\`\`\`[语言]
|
|
547
|
+
[从项目中提取的实际代码]
|
|
548
|
+
\`\`\`
|
|
549
|
+
|
|
550
|
+
### 第二步:[步骤名称]
|
|
551
|
+
|
|
552
|
+
[具体说明]
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
*返回索引: [../project-context.md](../project-context.md)*
|
|
556
|
+
\`\`\`
|
|
557
|
+
|
|
558
|
+
**填写指导**:
|
|
559
|
+
1. 分析项目相关代码
|
|
560
|
+
2. 提取真实示例
|
|
561
|
+
3. 编写具体步骤`;
|
|
562
|
+
return `### 第${step}步:${doc.title}
|
|
563
|
+
|
|
564
|
+
${template}
|
|
565
|
+
|
|
566
|
+
**使用 fsWrite 创建此文件**`;
|
|
567
|
+
}
|
|
298
568
|
/**
|
|
299
569
|
* init_project_context 工具实现
|
|
300
570
|
*
|
|
301
571
|
* @param args - 工具参数
|
|
302
572
|
* @param args.docs_dir - 文档目录,默认 "docs"
|
|
303
|
-
* @
|
|
573
|
+
* @param args.project_root - 项目根目录,默认当前目录
|
|
574
|
+
* @returns MCP 响应,包含文档生成指导
|
|
304
575
|
*/
|
|
305
576
|
export async function initProjectContext(args) {
|
|
577
|
+
let docsDir = DEFAULT_DOCS_DIR;
|
|
578
|
+
let projectRoot = process.cwd();
|
|
306
579
|
try {
|
|
307
580
|
// 智能参数解析,支持自然语言输入
|
|
308
581
|
const parsedArgs = parseArgs(args, {
|
|
309
582
|
defaultValues: {
|
|
310
583
|
docs_dir: DEFAULT_DOCS_DIR,
|
|
584
|
+
project_root: process.cwd()
|
|
311
585
|
},
|
|
312
|
-
primaryField: "docs_dir",
|
|
586
|
+
primaryField: "docs_dir",
|
|
313
587
|
fieldAliases: {
|
|
314
588
|
docs_dir: ["dir", "output", "directory", "目录", "文档目录"],
|
|
589
|
+
project_root: ["root", "path", "项目路径"]
|
|
315
590
|
},
|
|
316
591
|
});
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
const structuredData = {
|
|
322
|
-
summary: "生成项目上下文文档",
|
|
323
|
-
projectOverview: {
|
|
324
|
-
name: "待分析",
|
|
325
|
-
description: "待分析",
|
|
326
|
-
techStack: [],
|
|
327
|
-
architecture: "待分析"
|
|
328
|
-
},
|
|
329
|
-
codingStandards: [
|
|
330
|
-
"分析 ESLint 配置",
|
|
331
|
-
"分析 Prettier 配置",
|
|
332
|
-
"分析命名规范",
|
|
333
|
-
"分析 TypeScript 配置"
|
|
334
|
-
],
|
|
335
|
-
workflows: [
|
|
336
|
-
{
|
|
337
|
-
name: "开发流程",
|
|
338
|
-
description: "分析 package.json scripts",
|
|
339
|
-
steps: ["npm run dev", "npm run build", "npm test"]
|
|
340
|
-
}
|
|
341
|
-
],
|
|
342
|
-
documentation: [
|
|
343
|
-
{
|
|
344
|
-
path: `${docsDir}/project-context.md`,
|
|
345
|
-
purpose: "项目上下文文档"
|
|
346
|
-
}
|
|
347
|
-
]
|
|
348
|
-
};
|
|
349
|
-
return okStructured(guide, structuredData, {
|
|
350
|
-
schema: (await import("../schemas/output/project-tools.js")).ProjectContextSchema,
|
|
351
|
-
});
|
|
592
|
+
docsDir = getString(parsedArgs.docs_dir) || DEFAULT_DOCS_DIR;
|
|
593
|
+
projectRoot = getString(parsedArgs.project_root) || process.cwd();
|
|
594
|
+
// 生成项目上下文
|
|
595
|
+
return await generateProjectContext(docsDir, projectRoot);
|
|
352
596
|
}
|
|
353
597
|
catch (error) {
|
|
354
598
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
599
|
+
// 构建友好的错误提示
|
|
600
|
+
let errorGuide = `❌ 初始化项目上下文失败\n\n`;
|
|
601
|
+
errorGuide += `**错误信息**: ${errorMessage}\n\n`;
|
|
602
|
+
errorGuide += `**当前参数**:\n`;
|
|
603
|
+
errorGuide += `- 文档目录: ${docsDir}\n`;
|
|
604
|
+
errorGuide += `- 项目路径: ${projectRoot}\n\n`;
|
|
605
|
+
errorGuide += `**使用建议**:\n`;
|
|
606
|
+
errorGuide += `1. 检查项目路径是否正确\n`;
|
|
607
|
+
errorGuide += `2. 确保项目包含可识别的配置文件(package.json, requirements.txt 等)\n`;
|
|
608
|
+
errorGuide += `3. 确保有文件系统读写权限\n\n`;
|
|
609
|
+
errorGuide += `**示例**:\n`;
|
|
610
|
+
errorGuide += `- 默认: {}\n`;
|
|
611
|
+
errorGuide += `- 自定义目录: { "docs_dir": "documentation" }\n`;
|
|
612
|
+
errorGuide += `- 指定项目: { "project_root": "/path/to/project" }\n`;
|
|
355
613
|
const errorData = {
|
|
356
614
|
summary: "项目上下文初始化失败",
|
|
615
|
+
mode: "modular",
|
|
357
616
|
projectOverview: {
|
|
358
617
|
name: "",
|
|
359
|
-
description:
|
|
618
|
+
description: errorMessage,
|
|
360
619
|
techStack: [],
|
|
361
620
|
architecture: ""
|
|
362
621
|
}
|
|
363
622
|
};
|
|
364
|
-
return okStructured(
|
|
623
|
+
return okStructured(errorGuide, errorData, {
|
|
365
624
|
schema: (await import("../schemas/output/project-tools.js")).ProjectContextSchema,
|
|
366
625
|
});
|
|
367
626
|
}
|