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.
@@ -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
- * 功能:生成项目上下文文档,帮助 AI 理解项目的技术栈、架构和规范
7
- * 模式:指令生成器模式 - 返回详细的分析指南,由 AI 执行实际操作
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
- const PROMPT_TEMPLATE = `# 项目上下文初始化指南
13
-
14
- ## 🎯 任务目标
15
-
16
- \`{docs_dir}/\` 目录下生成 \`project-context.md\` 文件,记录项目的核心信息。
17
-
18
- **输出文件**: \`{docs_dir}/project-context.md\`
19
-
20
- **文件用途**: 记录项目的技术栈、架构模式、编码规范等核心信息,供后续功能开发时参考。
21
-
22
- ---
23
-
24
- ## 📋 执行步骤
25
-
26
- 请按照以下步骤分析项目并生成文档:
27
-
28
- ### 步骤 1: 分析技术栈
29
-
30
- **目标**: 识别项目使用的语言、框架和工具。
31
-
32
- **操作**:
33
- 1. 读取 \`package.json\` 文件
34
- 2. 从 \`dependencies\` 中识别主要框架:
35
- - React、Vue、Angular → 前端框架
36
- - Express、Koa、Fastify、NestJS → 后端框架
37
- - Next.js、Nuxt.js → 全栈框架
38
- - @modelcontextprotocol/sdk → MCP 服务器
39
- 3. \`devDependencies\` 中识别开发工具:
40
- - typescript TypeScript 项目
41
- - webpack、vite、rollup、esbuild 构建工具
42
- - jest、vitest、mocha → 测试框架
43
- - eslint、prettier 代码规范工具
44
- 4. 检查配置文件:
45
- - \`tsconfig.json\` TypeScript 配置
46
- - \`vite.config.js/ts\` Vite 项目
47
- - \`webpack.config.js\` Webpack 项目
48
- - \`.eslintrc.*\` → ESLint 配置
49
- - \`.prettierrc.*\` → Prettier 配置
50
-
51
- **记录**: 语言、框架、构建工具、测试框架、代码规范工具
52
-
53
- ---
54
-
55
- ### 步骤 2: 分析项目结构
56
-
57
- **目标**: 理解项目的目录组织方式。
58
-
59
- **操作**:
60
- 1. 列出项目根目录下的文件和文件夹
61
- 2. 重点关注以下目录:
62
- - \`src/\` → 源代码目录
63
- - \`lib/\` → 库代码目录
64
- - \`tests/\` \`__tests__/\` 测试目录
65
- - \`docs/\` 文档目录
66
- - \`build/\` 或 \`dist/\` → 构建输出目录
67
- 3. 识别入口文件:
68
- - \`src/index.ts\` \`src/index.js\`
69
- - \`src/main.ts\` \`src/main.js\`
70
- - \`src/app.ts\` \`src/app.js\`
71
- 4. 生成目录树(深度 2-3 层,忽略 node_modules、.git、dist、build)
72
-
73
- **记录**: 目录结构、入口文件、主要模块
74
-
75
- ---
76
-
77
- ### 步骤 3: 分析编码规范
78
-
79
- **目标**: 识别项目的代码风格和规范。
80
-
81
- **操作**:
82
- 1. 检查是否存在以下配置文件:
83
- - \`.eslintrc.*\` → ESLint 配置
84
- - \`.prettierrc.*\` → Prettier 配置
85
- - \`tsconfig.json\` → TypeScript 配置
86
- 2. 从现有代码中识别命名规范:
87
- - 文件命名: kebab-case / camelCase / PascalCase
88
- - 变量命名: camelCase
89
- - 常量命名: UPPER_SNAKE_CASE
90
- - 类/接口命名: PascalCase
91
- 3. 检查 TypeScript 配置:
92
- - \`strict\` 是否为 true
93
- - \`target\` \`module\` 设置
94
- - 其他重要配置项
95
-
96
- **记录**: 代码风格工具、命名规范、TypeScript 配置
97
-
98
- ---
99
-
100
- ### 步骤 4: 分析依赖
101
-
102
- **目标**: 列出项目的主要依赖。
103
-
104
- **操作**:
105
- 1. 从 \`package.json\` 读取 \`dependencies\`
106
- 2. \`package.json\` 读取 \`devDependencies\`
107
- 3. 识别关键依赖并说明用途
108
- 4. 统计依赖数量
109
-
110
- **记录**: 主要生产依赖(前 10 个)、主要开发依赖(前 10 个)、依赖总数
111
-
112
- ---
113
-
114
- ### 步骤 5: 分析开发流程
115
-
116
- **目标**: 识别项目的开发、构建、测试命令。
117
-
118
- **操作**:
119
- 1. 从 \`package.json\` 读取 \`scripts\` 字段
120
- 2. 识别常用命令:
121
- - \`dev\` 或 \`start\` → 开发启动命令
122
- - \`build\` → 构建命令
123
- - \`test\` 测试命令
124
- - \`lint\` 代码检查命令
125
-
126
- **记录**: 开发命令、构建命令、测试命令、其他重要命令
127
-
128
- ---
129
-
130
- ## 📝 文档模板
131
-
132
- 请在 \`{docs_dir}/project-context.md\` 中生成以下内容:
133
-
134
- \`\`\`markdown
135
- # 项目上下文
136
-
137
- > 本文档由 MCP Probe Kit 的 init_project_context 工具生成,记录项目的核心信息。
138
- > 用于帮助 AI 理解项目,生成更准确的代码和文档。
139
-
140
- ## 项目概览
141
-
142
- | 属性 | 值 |
143
- |------|-----|
144
- | 名称 | [从 package.json 的 name 字段读取] |
145
- | 版本 | [从 package.json 的 version 字段读取] |
146
- | 类型 | [分析得出: Web应用 / API服务 / CLI工具 / 库 / MCP服务器] |
147
- | 描述 | [从 package.json 的 description 字段读取] |
148
-
149
- ## 技术栈
150
-
151
- | 类别 | 技术 |
152
- |------|------|
153
- | 语言 | [JavaScript / TypeScript] |
154
- | 运行时 | [Node.js / Browser / Deno] |
155
- | 框架 | [识别的框架,如 React、Express、Next.js] |
156
- | 构建工具 | [识别的工具,如 TypeScript、Webpack、Vite] |
157
- | 包管理器 | [npm / yarn / pnpm] |
158
- | 测试框架 | [识别的测试框架,如 Jest、Vitest,或 "未配置"] |
159
-
160
- ## 项目结构
161
-
162
- \\\`\\\`\\\`
163
- [生成目录树,深度 2-3 层]
164
- [示例:]
165
- project/
166
- ├── src/
167
- │ ├── index.ts
168
- │ └── tools/
169
- │ ├── index.ts
170
- │ └── ...
171
- ├── docs/
172
- ├── package.json
173
- └── tsconfig.json
174
- \\\`\\\`\\\`
175
-
176
- ### 主要目录说明
177
-
178
- | 目录 | 用途 |
179
- |------|------|
180
- | src/ | [源代码目录,描述主要内容] |
181
- | docs/ | [文档目录] |
182
- | tests/ | [测试目录,如果存在] |
183
- | build/ | [构建输出目录,如果存在] |
184
-
185
- ### 入口文件
186
-
187
- - 主入口: \`[入口文件路径,如 src/index.ts]\`
188
-
189
- ## 架构模式
190
-
191
- - **项目类型**: [MCP服务器 / Web应用 / API服务 / 库]
192
- - **设计模式**: [识别的模式,如 工具模式、MVC、组件化、服务层]
193
- - **模块划分**: [主要模块说明]
194
-
195
- ## 编码规范
196
-
197
- ### 代码风格
198
-
199
- | 工具 | 状态 | 配置文件 |
200
- |------|------|----------|
201
- | ESLint | [已配置 / 未配置] | [配置文件路径] |
202
- | Prettier | [已配置 / 未配置] | [配置文件路径] |
203
-
204
- ### 命名规范
205
-
206
- | 类型 | 规范 | 示例 |
207
- |------|------|------|
208
- | 文件命名 | [kebab-case / camelCase / PascalCase] | [示例] |
209
- | 变量命名 | camelCase | userName |
210
- | 常量命名 | UPPER_SNAKE_CASE | MAX_COUNT |
211
- | 函数命名 | camelCase | getUserInfo |
212
- | 类/接口命名 | PascalCase | UserService |
213
-
214
- ### TypeScript 配置
215
-
216
- | 配置项 | 值 |
217
- |--------|-----|
218
- | strict | [true / false] |
219
- | target | [ES2020 / ES2022 / ...] |
220
- | module | [CommonJS / ESNext / Node16 / ...] |
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
- | \`npm run dev\` | [开发启动,描述具体行为] |
249
- | \`npm run build\` | [构建,描述输出位置] |
250
- | \`npm test\` | [测试,或 "未配置"] |
251
- | \`npm run lint\` | [代码检查,或 "未配置"] |
252
-
253
- ### 开发环境要求
254
-
255
- - Node.js: [版本要求,从 engines 字段读取或推断]
256
- - 包管理器: [npm / yarn / pnpm]
257
-
258
- ---
259
-
260
- *生成时间: [当前时间,格式: YYYY-MM-DD HH:mm:ss]*
261
- *生成工具: MCP Probe Kit - init_project_context*
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
- * @returns MCP 响应,包含项目分析指南
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", // 纯文本输入默认映射到 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
- const docsDir = getString(parsedArgs.docs_dir) || DEFAULT_DOCS_DIR;
318
- // 构建指南文本(替换占位符)
319
- const guide = PROMPT_TEMPLATE.replace(/{docs_dir}/g, docsDir);
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(`❌ 初始化项目上下文失败: ${errorMessage}`, errorData, {
623
+ return okStructured(errorGuide, errorData, {
365
624
  schema: (await import("../schemas/output/project-tools.js")).ProjectContextSchema,
366
625
  });
367
626
  }