mcp-feature-doc-generator 1.0.0

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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { PROMPT_NAME, PROMPT_DESCRIPTION, buildPromptMessages, } from "./prompts/generate-feature-doc.js";
6
+ import { getTemplateContent } from "./resources/template.js";
7
+ const server = new McpServer({
8
+ name: "feature-doc-generator",
9
+ version: "1.0.0",
10
+ });
11
+ // 注册 prompt
12
+ server.prompt(PROMPT_NAME, PROMPT_DESCRIPTION, { featurePath: z.string().describe("功能路径,如 project/pmbasupplierevaluation 或 pm/ba/PmBaRentcontractSettle") }, ({ featurePath }) => ({
13
+ messages: buildPromptMessages(featurePath),
14
+ }));
15
+ // 注册 resource:功能说明模板
16
+ server.resource("doc-template", "template://feature-doc", { description: "功能说明文档模板(开发规范/功能说明模板.md)", mimeType: "text/markdown" }, () => ({
17
+ contents: [
18
+ {
19
+ uri: "template://feature-doc",
20
+ mimeType: "text/markdown",
21
+ text: getTemplateContent(),
22
+ },
23
+ ],
24
+ }));
25
+ async function main() {
26
+ const transport = new StdioServerTransport();
27
+ await server.connect(transport);
28
+ }
29
+ main().catch((err) => {
30
+ console.error("MCP server failed to start:", err);
31
+ process.exit(1);
32
+ });
@@ -0,0 +1,9 @@
1
+ export declare const PROMPT_NAME = "generate_feature_doc";
2
+ export declare const PROMPT_DESCRIPTION = "\u4E3A\u6307\u5B9A\u7684 Vue 3 \u4E1A\u52A1\u529F\u80FD\u8DEF\u5F84\u751F\u6210\u529F\u80FD\u8BF4\u660E\u6587\u6863";
3
+ export declare function buildPromptMessages(featurePath: string): {
4
+ role: "user";
5
+ content: {
6
+ type: "text";
7
+ text: string;
8
+ };
9
+ }[];
@@ -0,0 +1,256 @@
1
+ import { getTemplateContent } from "../resources/template.js";
2
+ export const PROMPT_NAME = "generate_feature_doc";
3
+ export const PROMPT_DESCRIPTION = "为指定的 Vue 3 业务功能路径生成功能说明文档";
4
+ export function buildPromptMessages(featurePath) {
5
+ const templateContent = getTemplateContent();
6
+ const promptText = `# 任务说明
7
+
8
+ ## 任务
9
+ 根据**我指定的功能路径**,为 \`src/views/${featurePath}\` 下对应的业务功能生成功能说明文档。
10
+
11
+ **仅处理我明确提供的功能路径,不自动扫描整个 \`src/views/\`,不按目录逐个遍历。**
12
+
13
+ 但如果**指定功能的 \`index.vue\`、\`form.vue\` 或其他核心页面文件中引入了其他业务功能页面/功能模块**,则需要将这些被引用的相关功能一并纳入分析说明范围。
14
+
15
+ ---
16
+
17
+ ## 模板要求
18
+ 严格按照下方「功能说明模板」的 8 个章节结构输出:
19
+
20
+ 1. 功能概述(核心作用 + 业务场景)
21
+ 2. 前置数据(数据来源表格 + 前置条件)
22
+ 3. 业务流程(\`mermaid graph LR\` 流程图)
23
+ 4. 核心业务逻辑(数据联动、计算规则、状态流转等,按需增减子章节)
24
+ 5. 后续数据使用(生成的数据表格 + 后续使用场景)
25
+ 6. 引用组件说明(关键公共/私有组件及配置)
26
+ 7. 注意事项
27
+ 8. 总结
28
+
29
+ ---
30
+
31
+ ## 功能路径输入规则
32
+ - 功能生成以**我指定的路径**为准
33
+ - 指定路径为 \`src/views/\` 下的具体功能目录
34
+ - 示例:
35
+ - \`src/views/pm/ba/PmBaRentcontractSettle/\`
36
+ - \`src/views/admin/dict/dictItem/\`
37
+ - 一次可输入一个或多个功能路径
38
+ - **优先分析我输入的功能路径本身**
39
+ - **不自动扫描整个 \`src/views/\`**
40
+ - **不按"叶子目录"规则批量遍历所有功能**
41
+ - 如果指定路径不是有效功能目录,需明确提示原因,例如:
42
+ - 路径不存在
43
+ - 缺少核心页面文件
44
+ - 属于非业务目录
45
+ - 实际为父级目录而非具体功能目录
46
+
47
+ ---
48
+
49
+ ## 功能依赖扩展规则
50
+ 如果指定功能目录下的以下文件中:
51
+
52
+ - \`index.vue\`
53
+ - \`form.vue\`
54
+ - 其他核心业务页面文件
55
+
56
+ 存在对**其他业务功能页面/业务功能模块**的引入、嵌套、弹窗承载、抽屉承载、tab 承载、步骤流承载或局部业务集成,则需要将这些被引用功能纳入说明范围。
57
+
58
+ ### 判定原则
59
+ 以下情况视为"需要一并说明的功能":
60
+
61
+ - 引入的是其他业务功能页面或业务子模块,而非普通基础组件
62
+ - 引入后承担独立业务职责,如:
63
+ - 明细维护
64
+ - 子表管理
65
+ - 审批处理
66
+ - 选择业务对象
67
+ - 合同/订单/费用等关联业务处理
68
+ - 弹窗表单、抽屉表单、嵌套列表、tab 子页签等
69
+ - 虽然文件不在当前目录下,但在业务上属于当前功能流程的一部分
70
+
71
+ 以下情况**不单独视为功能说明对象**:
72
+
73
+ - 通用基础组件
74
+ - 纯展示组件
75
+ - 公共 UI 组件
76
+ - 通用 hooks / utils / constants
77
+ - 无独立业务语义的局部片段组件
78
+ - \`microme-operator\`、\`upload-file\`、\`process\`、\`CustomQuery\`、\`TableColumnDrawer\`、\`ExportExcel\`、\`CirculationForm\` 这些组件**强制忽略,不进行分析,不进行说明,不得出现在最终文档任意章节、表格、流程图、注意事项、总结中**
79
+
80
+ ### 补充约束
81
+ - 上述强制忽略组件的优先级**高于"功能依赖扩展规则"**
82
+ - 即使这些组件在 \`index.vue\`、\`form.vue\` 或其他核心页面中被引入、注册、渲染、调用,也**不得视为需要一并说明的功能**
83
+ - 对这些组件,只允许在分析阶段忽略,**不允许在输出中以"使用了某组件""通过某组件实现某能力"等方式间接提及**
84
+
85
+ ### 处理方式
86
+ - 对于被当前功能引用的相关业务功能:
87
+ - 需要在当前文档中说明其作用、触发方式、数据关系、交互关系
88
+ - 如果该被引用功能本身已经构成一个**独立业务功能单元**,则需要:
89
+ - 在当前功能文档中说明其与主功能的关系
90
+ - 同时对该引用功能自身补充对应的功能说明内容
91
+ - 说明范围以"**当前指定功能直接引用到的业务功能**"为主
92
+ - **不继续无限递归扩展**
93
+ - 默认最多向下扩展 **1 层业务功能依赖**
94
+ - 如果存在更深层级引用,仅在当前文档中简要说明,不再继续拆解生成
95
+
96
+ ---
97
+
98
+ ## 非业务目录过滤规则
99
+ 若我指定的路径属于以下目录,则跳过并说明原因:
100
+
101
+ - \`error/\`
102
+ - \`login/\`
103
+ - \`demo/\`
104
+ - \`i18n/\`
105
+ - \`components/\`
106
+
107
+ ---
108
+
109
+ ## 分析要求
110
+ 读取**指定功能目录及其直接引用的相关业务功能文件**,包括但不限于:
111
+
112
+ - \`index.vue\`
113
+ - \`form.vue\`
114
+ - \`options.ts\`
115
+ - 其他与功能相关的 \`ts\`、\`vue\`、\`js\` 文件
116
+
117
+ 如果主功能页面引入了其他业务功能模块,也要同步分析这些文件中的:
118
+
119
+ - API 接口调用
120
+ - \`defineProps\` / \`defineEmits\`
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
+ - 权限控制仅表现为按钮权限标识、\`v-hasPermi\`、权限码、通用按钮显隐
153
+ - 按钮禁用条件仅表现为:
154
+ - 选中 0 条 / 多条
155
+ - 非创建人
156
+ - 状态不允许
157
+ - 流程中 / 已完成等通用限制
158
+
159
+ ### 仅在以下情况才允许写入
160
+ 只有当这些内容同时满足"与当前功能强相关且具有明确业务语义"时,才允许写入文档,例如:
161
+
162
+ - 状态流转体现了该功能独有的业务阶段
163
+ - 状态变化由当前功能特有字段、计算结果或业务动作触发
164
+ - 权限控制不是通用按钮权限,而是与当前业务对象、业务身份、业务规则强绑定
165
+ - 状态或权限会直接影响核心业务数据处理结果
166
+
167
+ ### 输出要求
168
+ - 不要单独输出"单据状态流转""操作权限控制"这类通用小节
169
+ - 不要输出通用状态表格
170
+ - 不要输出通用权限标识表格
171
+ - 若代码中仅存在项目通用状态 / 权限封装,但无当前功能特有业务含义,则直接忽略,不进行说明
172
+
173
+ ---
174
+
175
+ ## 输出规则
176
+ - 输出到 \`开发规范/views/\` 目录下
177
+ - 保持与源码相同的模块子目录结构
178
+ - 示例:
179
+ - 源码目录:\`src/views/pm/ba/PmBaRentcontractSettle/\`
180
+ - 输出文件:\`开发规范/views/pm/ba/PmBaRentcontractSettle-README.md\`
181
+ - 文件命名规则:
182
+ - \`{功能目录名}-README.md\`
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
+ - 若 \`index.vue\` 引入了其他业务功能,必须在文档中说明:
208
+ - 引入了什么功能
209
+ - 在什么场景下触发
210
+ - 与当前主功能的数据关系
211
+ - 是否共享状态、回传数据、联动刷新
212
+ - 若发现该路径更适合作为"父级容器"而非独立功能,需明确说明,不擅自扫描生成所有子功能
213
+ - 生成内容必须基于代码实际实现,不得臆造业务逻辑
214
+ - 即使代码中存在通用状态、通用权限、通用流程封装,也只有在体现当前功能特有业务语义时才可写入;否则忽略
215
+ - 若部分逻辑无法从当前代码直接判断,应在文档中标注"待确认"
216
+ - 对项目通用能力进行过滤:若某些内容仅属于公共列表页 / 表单页 / 流程页的通用机制,而非当前功能特有业务逻辑,则不写入文档
217
+ - 这类通用能力包括但不限于:通用单据状态、通用状态流转、通用提交流程、通用按钮权限、通用新增/编辑/查看/删除/提交按钮控制、通用选中条数限制、通用创建人限制、通用状态禁用条件
218
+ - 仅当状态流转或权限控制明确体现当前功能特有业务语义、业务阶段、业务规则、业务身份约束时,才允许写入;否则忽略
219
+ - 不单独输出"单据状态流转""操作权限控制""权限标识"这类公共说明小节
220
+
221
+ ---
222
+
223
+ ## 输出前自检
224
+ 在最终输出前,必须检查结果中是否包含以下关键词:
225
+
226
+ - \`microme-operator\`
227
+ - \`upload-file\`
228
+ - \`process\`
229
+ - \`CustomQuery\`
230
+ - \`TableColumnDrawer\`
231
+ - \`ExportExcel\`
232
+ - \`CirculationForm\`
233
+
234
+ 如果包含,则删除相关描述后再输出。
235
+ **最终文档中,上述关键词出现次数必须为 0。**
236
+
237
+ ---
238
+
239
+ # 功能说明模板
240
+
241
+ 以下是功能说明文档的标准模板结构,请严格遵循:
242
+
243
+ \`\`\`markdown
244
+ ${templateContent}
245
+ \`\`\`
246
+ `;
247
+ return [
248
+ {
249
+ role: "user",
250
+ content: {
251
+ type: "text",
252
+ text: promptText,
253
+ },
254
+ },
255
+ ];
256
+ }
@@ -0,0 +1 @@
1
+ export declare function getTemplateContent(): string;
@@ -0,0 +1,135 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ const EMBEDDED_TEMPLATE = `# {功能中文名} ({功能目录名})
4
+
5
+ > **模块路径**: \`{一级模块}/{二级模块}/{功能目录名}\`
6
+ > **组件名称**: \`{列表页组件名}\` (列表页) / \`{表单页组件名}\` (表单页)
7
+ > **所属业务域**: {一级业务域} → {二级业务域} → {功能名称}
8
+
9
+ ---
10
+
11
+ ## 1. 功能概述
12
+
13
+ {用 2-3 句话描述本功能的核心作用,说明"做什么"和"为什么做"。}
14
+
15
+ **业务场景**: {描述实际的使用场景,说明谁在什么情况下使用本功能。}
16
+
17
+ ---
18
+
19
+ ## 2. 前置数据
20
+
21
+ ### 2.1 数据来源
22
+
23
+ | 数据类型 | 来源 | 用途 |
24
+ | -------- | ---- | ---- |
25
+ | {数据类型1} | {来源模块} | {在本功能中的用途说明} |
26
+ | {数据类型2} | {来源模块} | {在本功能中的用途说明} |
27
+
28
+ ### 2.2 前置条件
29
+
30
+ - {条件1:如"存在有效的XX合同"}
31
+ - {条件2:如"XX已完成审批流程"}
32
+
33
+ ---
34
+
35
+ ## 3. 业务流程
36
+
37
+ \`\`\`mermaid
38
+ graph LR
39
+ A["{步骤1}"] -->|{操作}| B["{步骤2}"]
40
+ B --> C["{步骤3}"]
41
+ C --> D{"{判断条件}"}
42
+ D -->|{分支1}| E["{结果1}"]
43
+ D -->|{分支2}| F["{结果2}"]
44
+ \`\`\`
45
+
46
+ ---
47
+
48
+ ## 4. 核心业务逻辑
49
+
50
+ ### 4.1 数据选择联动
51
+
52
+ {描述页面上各选择器之间的联动关系,如"选择A后自动带入B、C字段,同时清空D"。}
53
+
54
+ \`\`\`
55
+ 选择{实体A}
56
+
57
+ ├── 筛选条件:{字段} = {值}
58
+ ├── 赋值字段:{field1}, {field2}, {field3}
59
+ └── 联动影响:{清空/重置哪些数据}
60
+
61
+
62
+ 选择{实体B}(基于已选{实体A}过滤)
63
+
64
+ ├── 校验:{调用什么接口做什么校验}
65
+ ├── 自动回填字段:{field4}, {field5}, ...
66
+ └── {其他联动操作}
67
+ \`\`\`
68
+
69
+ ### 4.2 计算规则
70
+
71
+ {描述本功能涉及的计算逻辑,如金额计算、数量汇总等。如无计算逻辑可删除本节。}
72
+
73
+ | 字段 | 说明 | 计算方式 |
74
+ | ---- | ---- | -------- |
75
+ | \`{字段名}\` | {字段含义} | {计算公式或数据来源} |
76
+
77
+ #### 计算触发时机
78
+
79
+ | 触发操作 | 调用链 |
80
+ | -------- | ------ |
81
+ | {用户操作1} | \`{函数A}()\` → \`{函数B}()\` |
82
+ | {用户操作2} | \`{函数C}()\` → \`{函数D}()\` |
83
+
84
+ ### 4.3 {其他核心逻辑}
85
+
86
+ {根据功能实际情况补充,如日期联动、状态流转、模式切换等。每个独立逻辑点作为一个子章节。}
87
+
88
+ ---
89
+
90
+ ## 5. 后续数据使用
91
+
92
+ ### 5.1 生成的数据
93
+
94
+ | 数据类型 | 存储位置 | 用途 |
95
+ | -------- | -------- | ---- |
96
+ | {主表数据} | {数据库表名} | {存储什么信息} |
97
+ | {子表数据} | {数据库表名} | {存储什么信息} |
98
+
99
+ ### 5.2 后续使用场景
100
+
101
+ - **{场景1}**:{说明下游模块如何使用本功能产出的数据}
102
+ - **{场景2}**:{说明}
103
+
104
+ ---
105
+
106
+ ## 6. 引用组件说明
107
+
108
+ {列出本功能使用的关键公共组件/私有组件,说明用途和关键配置。如组件较多可使用子章节分列。}
109
+
110
+ ### 6.1 {组件名} — {组件用途}
111
+
112
+ {简要说明该组件在本功能中的使用方式、关键传参或特殊配置。}
113
+
114
+ ---
115
+
116
+ ## 7. 注意事项
117
+
118
+ 1. **{要点1标题}**:{详细说明}
119
+ 2. **{要点2标题}**:{详细说明}
120
+
121
+ ---
122
+
123
+ ## 8. 总结
124
+
125
+ {用 1-2 段话概括本功能的业务价值,说明它在整个系统中的定位和意义。}`;
126
+ export function getTemplateContent() {
127
+ // 优先从项目本地读取(支持用户自定义模板),找不到则使用内嵌模板
128
+ try {
129
+ const localPath = resolve(process.cwd(), "开发规范/功能说明模板.md");
130
+ return readFileSync(localPath, "utf-8");
131
+ }
132
+ catch {
133
+ return EMBEDDED_TEMPLATE;
134
+ }
135
+ }
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "mcp-feature-doc-generator",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for generating Vue 3 feature documentation via prompt template",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "mcp-feature-doc-generator": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "start": "node dist/index.js"
16
+ },
17
+ "keywords": [
18
+ "mcp",
19
+ "vue3",
20
+ "documentation",
21
+ "feature-doc"
22
+ ],
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.12.0",
26
+ "zod": "^3.25.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^20.0.0",
30
+ "typescript": "^5.4.0"
31
+ }
32
+ }