mcp-probe-kit 2.0.0 → 2.0.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.
@@ -0,0 +1,722 @@
1
+ # 设计文档:project-context-modular
2
+
3
+ ## 概述
4
+
5
+ 本设计文档描述 `project-context-modular` 功能的技术实现方案。该功能将 `init_project_context` 工具从单文件模式扩展为支持模块化文档生成,通过将项目信息分类存放到多个独立文件中,优化 AI 开发时的上下文加载效率。
6
+
7
+ **设计目标**:
8
+ - 保持向后兼容,默认使用单文件模式
9
+ - 提供模块化模式,生成索引文件和 5 个分类文档
10
+ - 每个文档独立完整,可单独阅读
11
+ - 使用清晰的文件夹结构组织文档
12
+
13
+ ---
14
+
15
+ ## 技术方案
16
+
17
+ ### 技术选型
18
+
19
+ | 类别 | 选择 | 理由 |
20
+ |------|------|------|
21
+ | 实现语言 | TypeScript | 项目统一使用 TypeScript |
22
+ | 文件操作 | Node.js fs/promises | 内置模块,无需额外依赖 |
23
+ | 参数解析 | parseArgs 工具 | 项目现有工具,支持自然语言输入 |
24
+ | 输出格式 | okStructured | 项目现有工具,支持结构化输出 |
25
+ | 模板引擎 | 字符串模板 | 简单直接,无需引入模板库 |
26
+
27
+ ### 架构设计
28
+
29
+ ```
30
+ ┌─────────────────────────────────────────────────────────────┐
31
+ │ init_project_context │
32
+ │ │
33
+ │ ┌──────────────┐ ┌──────────────┐ │
34
+ │ │ 参数解析 │─────▶│ 模式判断 │ │
35
+ │ │ parseArgs │ │ single/ │ │
36
+ │ └──────────────┘ │ modular │ │
37
+ │ └──────┬───────┘ │
38
+ │ │ │
39
+ │ ┌──────────┴──────────┐ │
40
+ │ │ │ │
41
+ │ ┌───────▼────────┐ ┌───────▼────────┐ │
42
+ │ │ 单文件模式 │ │ 模块化模式 │ │
43
+ │ │ (现有逻辑) │ │ (新增逻辑) │ │
44
+ │ └───────┬────────┘ └───────┬────────┘ │
45
+ │ │ │ │
46
+ │ │ ┌────────▼────────┐ │
47
+ │ │ │ 项目信息分析 │ │
48
+ │ │ │ - package.json │ │
49
+ │ │ │ - tsconfig.json │ │
50
+ │ │ │ - 目录结构 │ │
51
+ │ │ └────────┬────────┘ │
52
+ │ │ │ │
53
+ │ │ ┌────────▼────────┐ │
54
+ │ │ │ 生成分类文档 │ │
55
+ │ │ │ - tech-stack │ │
56
+ │ │ │ - architecture │ │
57
+ │ │ │ - coding-stds │ │
58
+ │ │ │ - dependencies │ │
59
+ │ │ │ - workflows │ │
60
+ │ │ └────────┬────────┘ │
61
+ │ │ │ │
62
+ │ │ ┌────────▼────────┐ │
63
+ │ │ │ 生成索引文件 │ │
64
+ │ │ │ project-context │ │
65
+ │ │ └────────┬────────┘ │
66
+ │ │ │ │
67
+ │ └──────────┬──────────┘ │
68
+ │ │ │
69
+ │ ┌────────▼────────┐ │
70
+ │ │ 结构化输出 │ │
71
+ │ │ okStructured │ │
72
+ │ └─────────────────┘ │
73
+ └─────────────────────────────────────────────────────────────┘
74
+ ```
75
+
76
+ ---
77
+
78
+ ## 数据模型
79
+
80
+ ### 参数接口
81
+
82
+ ```typescript
83
+ interface InitProjectContextArgs {
84
+ docs_dir?: string; // 文档目录,默认 "docs"
85
+ mode?: "single" | "modular"; // 生成模式,默认 "single"
86
+ }
87
+ ```
88
+
89
+ ### 项目信息接口
90
+
91
+ ```typescript
92
+ interface ProjectInfo {
93
+ // 基本信息
94
+ name: string;
95
+ version: string;
96
+ description: string;
97
+ type: string; // "MCP服务器" | "Web应用" | "库" | "CLI工具"
98
+
99
+ // 技术栈
100
+ techStack: {
101
+ language: string;
102
+ runtime: string;
103
+ frameworks: string[];
104
+ buildTools: string[];
105
+ testFramework: string;
106
+ packageManager: string;
107
+ };
108
+
109
+ // 架构
110
+ architecture: {
111
+ projectType: string;
112
+ designPatterns: string[];
113
+ entryFile: string;
114
+ directoryTree: string;
115
+ mainDirectories: Record<string, string>;
116
+ };
117
+
118
+ // 编码规范
119
+ codingStandards: {
120
+ eslint: { enabled: boolean; configFile?: string };
121
+ prettier: { enabled: boolean; configFile?: string };
122
+ namingConventions: Record<string, string>;
123
+ typescript?: {
124
+ strict: boolean;
125
+ target: string;
126
+ module: string;
127
+ };
128
+ };
129
+
130
+ // 依赖
131
+ dependencies: {
132
+ production: Array<{ name: string; version: string; purpose: string }>;
133
+ development: Array<{ name: string; version: string; purpose: string }>;
134
+ totalCount: number;
135
+ };
136
+
137
+ // 工作流
138
+ workflows: {
139
+ commands: Record<string, string>;
140
+ nodeVersion?: string;
141
+ };
142
+ }
143
+ ```
144
+
145
+ ### 输出结构
146
+
147
+ ```typescript
148
+ interface ModularContextOutput extends ProjectContext {
149
+ files: Array<{
150
+ path: string;
151
+ purpose: string;
152
+ size: number;
153
+ }>;
154
+ mode: "single" | "modular";
155
+ }
156
+ ```
157
+
158
+ ---
159
+
160
+ ## 文件结构
161
+
162
+ ### 模块化模式输出
163
+
164
+ ```
165
+ docs/
166
+ ├── project-context.md # 索引文件(包含 AI 引导)
167
+ └── project-context/ # 分类文档目录
168
+ ├── tech-stack.md # 技术栈
169
+ ├── architecture.md # 架构
170
+ ├── coding-standards.md # 编码规范
171
+ ├── dependencies.md # 依赖
172
+ └── workflows.md # 工作流
173
+ ```
174
+
175
+ ### 单文件模式输出(保持不变)
176
+
177
+ ```
178
+ docs/
179
+ └── project-context.md # 单一文件
180
+ ```
181
+
182
+ ### 代码文件结构
183
+
184
+ ```
185
+ src/
186
+ └── tools/
187
+ ├── init_project_context.ts # 主文件(修改)
188
+ └── templates/ # 新增模板目录
189
+ ├── index-template.ts # 索引文件模板(包含 AI 引导)
190
+ ├── tech-stack-template.ts # 技术栈模板
191
+ ├── architecture-template.ts # 架构模板
192
+ ├── coding-standards-template.ts # 编码规范模板
193
+ ├── dependencies-template.ts # 依赖模板
194
+ └── workflows-template.ts # 工作流模板
195
+ ```
196
+
197
+ ---
198
+
199
+ ## 核心实现
200
+
201
+ ### 1. 参数解析
202
+
203
+ ```typescript
204
+ const parsedArgs = parseArgs<InitProjectContextArgs>(args, {
205
+ defaultValues: {
206
+ docs_dir: "docs",
207
+ mode: "single",
208
+ },
209
+ primaryField: "docs_dir",
210
+ fieldAliases: {
211
+ docs_dir: ["dir", "output", "directory", "目录"],
212
+ mode: ["type", "format", "模式"],
213
+ },
214
+ });
215
+
216
+ const docsDir = getString(parsedArgs.docs_dir) || "docs";
217
+ const mode = getString(parsedArgs.mode) || "single";
218
+ ```
219
+
220
+ ### 2. 模式分发
221
+
222
+ ```typescript
223
+ if (mode === "modular") {
224
+ return await generateModularContext(docsDir);
225
+ } else {
226
+ return await generateSingleContext(docsDir);
227
+ }
228
+ ```
229
+
230
+ ### 3. 项目信息分析
231
+
232
+ ```typescript
233
+ async function analyzeProject(): Promise<ProjectInfo> {
234
+ // 读取 package.json
235
+ const packageJson = await readPackageJson();
236
+
237
+ // 分析技术栈
238
+ const techStack = analyzeTechStack(packageJson);
239
+
240
+ // 分析架构
241
+ const architecture = await analyzeArchitecture();
242
+
243
+ // 分析编码规范
244
+ const codingStandards = await analyzeCodingStandards();
245
+
246
+ // 分析依赖
247
+ const dependencies = analyzeDependencies(packageJson);
248
+
249
+ // 分析工作流
250
+ const workflows = analyzeWorkflows(packageJson);
251
+
252
+ return {
253
+ name: packageJson.name,
254
+ version: packageJson.version,
255
+ description: packageJson.description,
256
+ type: inferProjectType(packageJson),
257
+ techStack,
258
+ architecture,
259
+ codingStandards,
260
+ dependencies,
261
+ workflows,
262
+ };
263
+ }
264
+ ```
265
+
266
+ ### 4. 模板渲染
267
+
268
+ ```typescript
269
+ function renderTemplate(template: string, data: ProjectInfo): string {
270
+ return template
271
+ .replace(/\{name\}/g, data.name)
272
+ .replace(/\{version\}/g, data.version)
273
+ .replace(/\{description\}/g, data.description)
274
+ // ... 更多替换
275
+ ;
276
+ }
277
+ ```
278
+
279
+ ### 5. 文件生成
280
+
281
+ ```typescript
282
+ async function generateModularContext(docsDir: string) {
283
+ const projectInfo = await analyzeProject();
284
+
285
+ // 创建目录
286
+ const contextDir = path.join(docsDir, "project-context");
287
+ await fs.mkdir(contextDir, { recursive: true });
288
+
289
+ // 生成分类文档
290
+ const files = [
291
+ { name: "tech-stack.md", template: techStackTemplate },
292
+ { name: "architecture.md", template: architectureTemplate },
293
+ { name: "coding-standards.md", template: codingStandardsTemplate },
294
+ { name: "dependencies.md", template: dependenciesTemplate },
295
+ { name: "workflows.md", template: workflowsTemplate },
296
+ ];
297
+
298
+ for (const file of files) {
299
+ const content = renderTemplate(file.template, projectInfo);
300
+ const filePath = path.join(contextDir, file.name);
301
+ await fs.writeFile(filePath, content, "utf-8");
302
+ }
303
+
304
+ // 生成索引文件
305
+ const indexContent = renderTemplate(indexTemplate, projectInfo);
306
+ const indexPath = path.join(docsDir, "project-context.md");
307
+ await fs.writeFile(indexPath, indexContent, "utf-8");
308
+
309
+ return okStructured(/* ... */);
310
+ }
311
+ ```
312
+
313
+ ---
314
+
315
+ ## 模板设计
316
+
317
+ ### 设计原则
318
+
319
+ **MCP 工具的职责**:
320
+ - 提供文件列表(要生成哪些文档)
321
+ - 提供格式模板(每个文档的结构框架)
322
+ - 使用占位符标记需要填充的内容
323
+
324
+ **AI 的职责**:
325
+ - 决定分析哪些项目文件
326
+ - 决定提取什么信息
327
+ - 决定如何填充模板
328
+
329
+ ### 工具返回内容
330
+
331
+ 当用户执行 `init_project_context mode=modular` 时,工具返回:
332
+
333
+ ```markdown
334
+ ✅ 请生成以下项目上下文文档
335
+
336
+ ## 📋 需要生成的文档
337
+
338
+ ### 文件结构
339
+ \`\`\`
340
+ docs/
341
+ ├── project-context.md # 索引文件
342
+ └── project-context/ # 分类文档
343
+ ├── tech-stack.md # 技术栈
344
+ ├── architecture.md # 架构
345
+ ├── coding-standards.md # 编码规范
346
+ ├── dependencies.md # 依赖
347
+ └── workflows.md # 工作流
348
+ \`\`\`
349
+
350
+ ---
351
+
352
+ ## 📄 文档模板
353
+
354
+ ### 1. docs/project-context.md(索引文件)
355
+
356
+ **文件用途**: 项目上下文的唯一入口,提供概览和导航
357
+
358
+ **模板格式**:
359
+ \`\`\`markdown
360
+ # 项目上下文
361
+
362
+ > 本文档是项目上下文的索引文件,提供项目概览和导航链接。
363
+
364
+ ## 项目概览
365
+
366
+ | 属性 | 值 |
367
+ |------|-----|
368
+ | 名称 | [项目名称] |
369
+ | 版本 | [版本号] |
370
+ | 类型 | [项目类型] |
371
+ | 描述 | [项目描述] |
372
+
373
+ ## 📚 文档导航
374
+
375
+ ### [技术栈](./project-context/tech-stack.md)
376
+ 了解项目使用的语言、框架、构建工具等技术选型。
377
+
378
+ ### [架构设计](./project-context/architecture.md)
379
+ 了解项目的目录结构、入口文件、模块划分和设计模式。
380
+
381
+ ### [编码规范](./project-context/coding-standards.md)
382
+ 了解项目的代码风格、命名规范和 TypeScript 配置。
383
+
384
+ ### [依赖管理](./project-context/dependencies.md)
385
+ 了解项目的依赖包及其用途。
386
+
387
+ ### [开发流程](./project-context/workflows.md)
388
+ 了解项目的开发、构建、测试等命令。
389
+
390
+ ---
391
+ *生成时间: [时间戳]*
392
+ *生成工具: MCP Probe Kit - init_project_context (modular mode)*
393
+ \`\`\`
394
+
395
+ ---
396
+
397
+ ### 2. docs/project-context/tech-stack.md
398
+
399
+ **文件用途**: 记录项目使用的语言、框架、构建工具等技术选型
400
+
401
+ **模板格式**:
402
+ \`\`\`markdown
403
+ # 技术栈
404
+
405
+ > 本文档描述 [项目名称] 的技术栈信息。
406
+
407
+ ## 项目信息
408
+
409
+ | 属性 | 值 |
410
+ |------|-----|
411
+ | 项目名称 | [项目名称] |
412
+ | 版本 | [版本号] |
413
+
414
+ ## 技术栈
415
+
416
+ | 类别 | 技术 |
417
+ |------|------|
418
+ | 语言 | [填写] |
419
+ | 运行时 | [填写] |
420
+ | 框架 | [填写] |
421
+ | 构建工具 | [填写] |
422
+ | 包管理器 | [填写] |
423
+ | 测试框架 | [填写] |
424
+
425
+ ## 技术选型说明
426
+
427
+ [根据项目实际情况填写技术选型的原因和说明]
428
+
429
+ ---
430
+ *生成时间: [时间戳]*
431
+ *返回索引: [../project-context.md](../project-context.md)*
432
+ \`\`\`
433
+
434
+ ---
435
+
436
+ ### 3. docs/project-context/architecture.md
437
+
438
+ **文件用途**: 记录项目的目录结构、入口文件、模块划分和设计模式
439
+
440
+ **模板格式**:
441
+ \`\`\`markdown
442
+ # 架构设计
443
+
444
+ > 本文档描述 [项目名称] 的架构和项目结构。
445
+
446
+ ## 项目信息
447
+
448
+ | 属性 | 值 |
449
+ |------|-----|
450
+ | 项目名称 | [项目名称] |
451
+ | 版本 | [版本号] |
452
+
453
+ ## 项目结构
454
+
455
+ \`\`\`
456
+ [生成目录树]
457
+ \`\`\`
458
+
459
+ ## 主要目录说明
460
+
461
+ | 目录 | 用途 |
462
+ |------|------|
463
+ | [目录名] | [用途说明] |
464
+
465
+ ## 入口文件
466
+
467
+ - 主入口: [入口文件路径]
468
+
469
+ ## 架构模式
470
+
471
+ - **项目类型**: [项目类型]
472
+ - **设计模式**: [使用的设计模式]
473
+ - **模块划分**: [模块划分说明]
474
+
475
+ ---
476
+ *生成时间: [时间戳]*
477
+ *返回索引: [../project-context.md](../project-context.md)*
478
+ \`\`\`
479
+
480
+ ---
481
+
482
+ ### 4. docs/project-context/coding-standards.md
483
+
484
+ **文件用途**: 记录项目的代码风格、命名规范和配置
485
+
486
+ **模板格式**:
487
+ \`\`\`markdown
488
+ # 编码规范
489
+
490
+ > 本文档描述 [项目名称] 的编码规范。
491
+
492
+ ## 项目信息
493
+
494
+ | 属性 | 值 |
495
+ |------|-----|
496
+ | 项目名称 | [项目名称] |
497
+ | 版本 | [版本号] |
498
+
499
+ ## 代码风格
500
+
501
+ | 工具 | 状态 | 配置文件 |
502
+ |------|------|----------|
503
+ | ESLint | [启用/未配置] | [配置文件路径] |
504
+ | Prettier | [启用/未配置] | [配置文件路径] |
505
+
506
+ ## 命名规范
507
+
508
+ | 类型 | 规范 | 示例 |
509
+ |------|------|------|
510
+ | 文件命名 | [规范] | [示例] |
511
+ | 变量命名 | camelCase | userName |
512
+ | 常量命名 | UPPER_SNAKE_CASE | MAX_COUNT |
513
+ | 函数命名 | camelCase | getUserInfo |
514
+ | 类/接口命名 | PascalCase | UserService |
515
+
516
+ ## TypeScript 配置
517
+
518
+ [如果是 TypeScript 项目,填写相关配置信息]
519
+
520
+ ---
521
+ *生成时间: [时间戳]*
522
+ *返回索引: [../project-context.md](../project-context.md)*
523
+ \`\`\`
524
+
525
+ ---
526
+
527
+ ### 5. docs/project-context/dependencies.md
528
+
529
+ **文件用途**: 记录项目的依赖包及其用途
530
+
531
+ **模板格式**:
532
+ \`\`\`markdown
533
+ # 依赖管理
534
+
535
+ > 本文档描述 [项目名称] 的依赖管理。
536
+
537
+ ## 项目信息
538
+
539
+ | 属性 | 值 |
540
+ |------|-----|
541
+ | 项目名称 | [项目名称] |
542
+ | 版本 | [版本号] |
543
+
544
+ ## 主要生产依赖
545
+
546
+ | 依赖 | 版本 | 用途 |
547
+ |------|------|------|
548
+ | [依赖名] | [版本号] | [用途说明] |
549
+
550
+ ## 主要开发依赖
551
+
552
+ | 依赖 | 版本 | 用途 |
553
+ |------|------|------|
554
+ | [依赖名] | [版本号] | [用途说明] |
555
+
556
+ ## 依赖统计
557
+
558
+ - 生产依赖: [数量] 个
559
+ - 开发依赖: [数量] 个
560
+ - 总计: [数量] 个
561
+
562
+ ---
563
+ *生成时间: [时间戳]*
564
+ *返回索引: [../project-context.md](../project-context.md)*
565
+ \`\`\`
566
+
567
+ ---
568
+
569
+ ### 6. docs/project-context/workflows.md
570
+
571
+ **文件用途**: 记录项目的开发、构建、测试等命令
572
+
573
+ **模板格式**:
574
+ \`\`\`markdown
575
+ # 开发流程
576
+
577
+ > 本文档描述 [项目名称] 的开发流程和命令。
578
+
579
+ ## 项目信息
580
+
581
+ | 属性 | 值 |
582
+ |------|-----|
583
+ | 项目名称 | [项目名称] |
584
+ | 版本 | [版本号] |
585
+
586
+ ## 常用命令
587
+
588
+ | 命令 | 用途 |
589
+ |------|------|
590
+ | [命令] | [用途说明] |
591
+
592
+ ## 开发环境要求
593
+
594
+ - Node.js: [版本要求]
595
+ - 包管理器: [包管理器名称]
596
+
597
+ ---
598
+ *生成时间: [时间戳]*
599
+ *返回索引: [../project-context.md](../project-context.md)*
600
+ \`\`\`
601
+ ```
602
+
603
+ ### 模板使用说明
604
+
605
+ 1. **占位符约定**:
606
+ - `[填写]` - 需要 AI 填充的内容
607
+ - `[项目名称]` - 从项目信息中提取
608
+ - `[时间戳]` - 生成时的时间戳
609
+
610
+ 2. **AI 的工作**:
611
+ - 分析项目文件(package.json、tsconfig.json、目录结构等)
612
+ - 提取相关信息
613
+ - 按照模板格式填充内容
614
+ - 生成最终的 Markdown 文件
615
+
616
+ 3. **模板特点**:
617
+ - 只定义结构,不指导分析
618
+ - 使用标准 Markdown 格式
619
+ - 每个文档独立完整
620
+ - 包含返回索引的链接
621
+
622
+ ---
623
+
624
+ ## 设计决策
625
+
626
+ ### 决策 1: 文件夹命名
627
+
628
+ **问题**: 分类文档应该放在哪个目录?
629
+
630
+ **选项**:
631
+ 1. `docs/context/` - 简短的名称
632
+ 2. `docs/project-context/` - 与索引文件名称一致
633
+ 3. `docs/.context/` - 隐藏目录
634
+
635
+ **决策**: 选择 `docs/project-context/`
636
+
637
+ **理由**:
638
+ - 与索引文件 `project-context.md` 名称一致,易于理解
639
+ - 不使用隐藏目录,保持透明性
640
+ - 符合项目现有的文档组织方式
641
+
642
+ ### 决策 2: 默认模式
643
+
644
+ **问题**: 默认应该使用哪种模式?
645
+
646
+ **选项**:
647
+ 1. `single` - 单文件模式
648
+ 2. `modular` - 模块化模式
649
+
650
+ **决策**: 选择 `single`
651
+
652
+ **理由**:
653
+ - 保持向后兼容,不影响现有用户
654
+ - 单文件模式更简单,适合小型项目
655
+ - 用户可以根据需要选择模块化模式
656
+
657
+ ### 决策 3: 模板实现方式
658
+
659
+ **问题**: 如何实现文档模板?
660
+
661
+ **选项**:
662
+ 1. 使用模板引擎(如 Handlebars、EJS)
663
+ 2. 使用字符串模板和简单替换
664
+ 3. 使用函数生成
665
+
666
+ **决策**: 选择字符串模板和简单替换
667
+
668
+ **理由**:
669
+ - 无需引入额外依赖
670
+ - 模板逻辑简单,不需要复杂的条件和循环
671
+ - 易于维护和调试
672
+
673
+ ### 决策 4: 错误处理策略
674
+
675
+ **问题**: 当某些信息无法获取时如何处理?
676
+
677
+ **选项**:
678
+ 1. 抛出错误,停止生成
679
+ 2. 使用默认值或"未配置"标记
680
+ 3. 跳过该部分内容
681
+
682
+ **决策**: 选择使用默认值或"未配置"标记
683
+
684
+ **理由**:
685
+ - 保证文档生成的完整性
686
+ - 提供明确的信息缺失提示
687
+ - 不影响其他部分的生成
688
+
689
+ ---
690
+
691
+ ## 风险评估
692
+
693
+ | 风险 | 影响 | 概率 | 缓解措施 |
694
+ |------|------|------|----------|
695
+ | 文件路径冲突 | 中 | 低 | 生成前检查文件是否存在,提供覆盖选项 |
696
+ | 大型项目分析慢 | 中 | 中 | 限制目录树深度,忽略大型目录 |
697
+ | 模板维护成本 | 低 | 高 | 模板代码模块化,易于扩展 |
698
+ | 向后兼容性破坏 | 高 | 低 | 默认使用单文件模式,充分测试 |
699
+
700
+ ---
701
+
702
+ ## 性能优化
703
+
704
+ 1. **并行文件写入**: 使用 `Promise.all` 并行写入多个文件
705
+ 2. **缓存项目信息**: 分析一次,多次使用
706
+ 3. **限制目录扫描深度**: 避免扫描 `node_modules` 等大型目录
707
+ 4. **延迟加载模板**: 只在需要时加载对应的模板
708
+
709
+ ---
710
+
711
+ ## 测试策略
712
+
713
+ 1. **单元测试**: 测试每个分析函数和模板渲染函数
714
+ 2. **集成测试**: 测试完整的文档生成流程
715
+ 3. **契约测试**: 验证结构化输出符合 Schema 定义
716
+ 4. **兼容性测试**: 验证单文件模式保持不变
717
+
718
+ ---
719
+
720
+ *设计版本: 1.0.0*
721
+ *创建时间: 2026-01-27*
722
+ *维护者: MCP Probe Kit Team*