bmall-mcp 1.6.0 → 1.7.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.
- package/README.md +7 -0
- package/dist/tools/requirements/index.d.ts.map +1 -1
- package/dist/tools/requirements/index.js +25 -8
- package/dist/tools/requirements/index.js.map +1 -1
- package/dist/tools/requirements/requirement-processor.d.ts +9 -0
- package/dist/tools/requirements/requirement-processor.d.ts.map +1 -1
- package/dist/tools/requirements/requirement-processor.js +28 -0
- package/dist/tools/requirements/requirement-processor.js.map +1 -1
- package/docs/generate-requirements-usage.md +110 -21
- package/package.json +1 -1
- package/src/tools/requirements/index.ts +33 -8
- package/src/tools/requirements/requirement-processor.ts +34 -0
package/README.md
CHANGED
|
@@ -204,6 +204,13 @@ src/
|
|
|
204
204
|
|
|
205
205
|
## Changelog
|
|
206
206
|
|
|
207
|
+
### v1.7.0 (2026-03-16)
|
|
208
|
+
- ✅ 优化设计稿处理逻辑:统一保存设计稿内容到 design-doc.md
|
|
209
|
+
- ✅ 添加设计稿智能缓存:自动检测已保存的设计稿,避免重复读取
|
|
210
|
+
- ✅ 完善 Figma 设计稿处理流程:AI 先读取并保存,再重新调用工具使用缓存
|
|
211
|
+
- ✅ 更新使用文档:明确设计稿文档保存路径和缓存机制
|
|
212
|
+
- ✅ 统一文件管理:origin-requirement.md、design-doc.md、backend-doc.md、requirements.md
|
|
213
|
+
|
|
207
214
|
### v1.6.0 (2026-03-16)
|
|
208
215
|
- ✅ 优化 `generate_requirements` 工具 Prompt 模板
|
|
209
216
|
- ✅ 新增设计稿支持(Figma 链接和本地文件)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"AAQA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,0BAA0B;IAClC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAmCD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,iBAAiB,CAAC;QAClD,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC,CAwHD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
-
import { processRequirementDocument, tryReadSavedRequirement } from "./requirement-processor.js";
|
|
2
|
+
import { processRequirementDocument, tryReadSavedRequirement, tryReadSavedDesign } from "./requirement-processor.js";
|
|
3
3
|
/**
|
|
4
4
|
* 验证必填参数
|
|
5
5
|
*/
|
|
@@ -45,11 +45,28 @@ export async function generateRequirements(params) {
|
|
|
45
45
|
// 3. 检查设计稿
|
|
46
46
|
let designSourceInfo = "";
|
|
47
47
|
if (params.designSource) {
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
// 3.1 优先尝试读取已保存的设计稿
|
|
49
|
+
const savedDesign = await tryReadSavedDesign(params.featureName);
|
|
50
|
+
if (!savedDesign) {
|
|
51
|
+
// 3.2 没有缓存,处理设计稿
|
|
52
|
+
if (params.designSource.type === "file") {
|
|
53
|
+
const designResult = await processRequirementDocument(params.designSource, params.featureName, "design-doc.md");
|
|
54
|
+
if (!designResult.success) {
|
|
55
|
+
return {
|
|
56
|
+
success: false,
|
|
57
|
+
message: designResult.message,
|
|
58
|
+
needsAction: designResult.needsAction,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
designSourceInfo = `**设计稿位置**:.specs/requirements/${params.featureName}/design-doc.md\n`;
|
|
62
|
+
}
|
|
63
|
+
else if (params.designSource.type === "figma") {
|
|
64
|
+
designSourceInfo = `**设计稿链接**:${params.designSource.url || "Figma 链接未提供"}(请使用 Figma MCP 读取并保存到 .specs/requirements/${params.featureName}/design-doc.md)\n`;
|
|
65
|
+
}
|
|
50
66
|
}
|
|
51
|
-
else
|
|
52
|
-
|
|
67
|
+
else {
|
|
68
|
+
// 3.3 使用已保存的设计稿
|
|
69
|
+
designSourceInfo = `**设计稿位置**:.specs/requirements/${params.featureName}/design-doc.md\n`;
|
|
53
70
|
}
|
|
54
71
|
}
|
|
55
72
|
// 4. 处理后端文档
|
|
@@ -88,7 +105,7 @@ export async function generateRequirements(params) {
|
|
|
88
105
|
message,
|
|
89
106
|
needsAction: {
|
|
90
107
|
type: "analyze_content",
|
|
91
|
-
instruction: `分析 ${originDocPath}${params.designSource ? "
|
|
108
|
+
instruction: `分析 ${originDocPath}${params.designSource ? "、design-doc.md" : ""}${params.backendSource ? "、backend-doc.md" : ""},生成 ${outputPath}`,
|
|
92
109
|
},
|
|
93
110
|
};
|
|
94
111
|
}
|
|
@@ -114,8 +131,8 @@ function buildAnalysisPrompt(originDocPath, outputPath, designSource, backendSou
|
|
|
114
131
|
## 输入材料
|
|
115
132
|
|
|
116
133
|
1. **产品 PRD 文档**:\`${originDocPath}\`(包含项目背景、功能列表、系统流程、详细说明等)
|
|
117
|
-
2. **设计稿**:${designSource ?
|
|
118
|
-
3. **后端文档**:${backendSource ?
|
|
134
|
+
2. **设计稿**:${designSource ? `已保存到 .specs/requirements/${featureName}/design-doc.md${designSource.type === "figma" ? "(使用 Figma MCP 读取)" : ""}` : "未提供(如有设计稿,请使用 Figma MCP 工具读取)"}
|
|
135
|
+
3. **后端文档**:${backendSource ? `已保存到 .specs/requirements/${featureName}/backend-doc.md(包含接口定义、数据结构、后端逻辑等,可作为生成验收标准的参考)` : "未提供(如有后端文档,可作为生成验收标准的参考)"}
|
|
119
136
|
|
|
120
137
|
## 输出要求
|
|
121
138
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,5 +27,14 @@ export declare function processRequirementDocument(requirementSource: Requiremen
|
|
|
27
27
|
* 如果用户之前已经按照指令保存了文件,优先使用已保存的内容
|
|
28
28
|
*/
|
|
29
29
|
export declare function tryReadSavedRequirement(featureName: string): Promise<string | null>;
|
|
30
|
+
/**
|
|
31
|
+
* 保存设计稿内容到文件
|
|
32
|
+
* 用于保存从 Figma MCP 读取的设计稿内容
|
|
33
|
+
*/
|
|
34
|
+
export declare function saveDesignDocument(featureName: string, designContent: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* 尝试读取已保存的设计稿文档
|
|
37
|
+
*/
|
|
38
|
+
export declare function tryReadSavedDesign(featureName: string): Promise<string | null>;
|
|
30
39
|
export {};
|
|
31
40
|
//# sourceMappingURL=requirement-processor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-processor.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/requirement-processor.ts"],"names":[],"mappings":"AAGA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,iBAAiB,CAAC;QAClD,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,EAChD,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,MAAgC,GAC/C,OAAO,CAAC,aAAa,CAAC,CA4FxB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB"}
|
|
1
|
+
{"version":3,"file":"requirement-processor.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/requirement-processor.ts"],"names":[],"mappings":"AAGA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,iBAAiB,CAAC;QAClD,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,EAChD,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,MAAgC,GAC/C,OAAO,CAAC,aAAa,CAAC,CA4FxB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB"}
|
|
@@ -104,4 +104,32 @@ export async function tryReadSavedRequirement(featureName) {
|
|
|
104
104
|
}
|
|
105
105
|
return null;
|
|
106
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* 保存设计稿内容到文件
|
|
109
|
+
* 用于保存从 Figma MCP 读取的设计稿内容
|
|
110
|
+
*/
|
|
111
|
+
export async function saveDesignDocument(featureName, designContent) {
|
|
112
|
+
const designDocPath = `.specs/requirements/${featureName}/design-doc.md`;
|
|
113
|
+
const outputDir = designDocPath.substring(0, designDocPath.lastIndexOf("/"));
|
|
114
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
115
|
+
await fs.writeFile(designDocPath, designContent, "utf-8");
|
|
116
|
+
console.log(`✅ 设计稿已保存到: ${designDocPath}`);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* 尝试读取已保存的设计稿文档
|
|
120
|
+
*/
|
|
121
|
+
export async function tryReadSavedDesign(featureName) {
|
|
122
|
+
const savedDesignPath = `.specs/requirements/${featureName}/design-doc.md`;
|
|
123
|
+
try {
|
|
124
|
+
const savedContent = await fs.readFile(savedDesignPath, "utf-8");
|
|
125
|
+
if (savedContent) {
|
|
126
|
+
console.log(`✅ 使用已保存的设计稿: ${savedDesignPath}`);
|
|
127
|
+
return savedContent;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
// 文件不存在
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
107
135
|
//# sourceMappingURL=requirement-processor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-processor.js","sourceRoot":"","sources":["../../../src/tools/requirements/requirement-processor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"requirement-processor.js","sourceRoot":"","sources":["../../../src/tools/requirements/requirement-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,12 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
工具负责:
|
|
18
18
|
1. 统一保存原始文档到固定位置(origin-requirement.md)
|
|
19
|
-
2.
|
|
19
|
+
2. 如有设计稿,保存设计稿内容到固定位置(design-doc.md)
|
|
20
|
+
3. 如有后端文档,统一保存后端文档到固定位置(backend-doc.md)
|
|
21
|
+
4. 提供专业的前端需求分析提示词(指导 AI 如何生成 requirements.md)
|
|
20
22
|
|
|
21
23
|
AI 负责:
|
|
22
24
|
1. 读取原始文档
|
|
23
|
-
2.
|
|
24
|
-
3.
|
|
25
|
+
2. 如有设计稿,读取保存的设计稿内容
|
|
26
|
+
3. 如有后端文档,读取保存的后端文档作为生成验收标准的参考
|
|
25
27
|
4. 按照前端需求分析标准,生成高质量的需求文档
|
|
26
28
|
|
|
27
29
|
## 输出文档结构
|
|
@@ -61,7 +63,7 @@ AI 负责:
|
|
|
61
63
|
📝 需求文档已准备完毕
|
|
62
64
|
|
|
63
65
|
**原始文档位置**:.specs/requirements/voice-recording/origin-requirement.md
|
|
64
|
-
**设计稿链接**:https://figma.com/design/xxx/xxx?node-id=1-2
|
|
66
|
+
**设计稿链接**:https://figma.com/design/xxx/xxx?node-id=1-2(请使用 Figma MCP 读取并保存到 .specs/requirements/voice-recording/design-doc.md)
|
|
65
67
|
**后端文档位置**:.specs/requirements/voice-recording/backend-doc.md
|
|
66
68
|
**目标输出位置**:.specs/requirements/voice-recording/requirements.md
|
|
67
69
|
|
|
@@ -70,11 +72,13 @@ AI 负责:
|
|
|
70
72
|
```
|
|
71
73
|
|
|
72
74
|
**AI 执行**:
|
|
73
|
-
1.
|
|
74
|
-
2.
|
|
75
|
-
3. 读取 `.specs/requirements/voice-recording/
|
|
76
|
-
4.
|
|
77
|
-
5.
|
|
75
|
+
1. 使用 Figma MCP 工具读取设计稿,保存到 `.specs/requirements/voice-recording/design-doc.md`
|
|
76
|
+
2. 重新调用工具(工具会使用已保存的设计稿)
|
|
77
|
+
3. 读取 `.specs/requirements/voice-recording/origin-requirement.md`
|
|
78
|
+
4. 读取 `.specs/requirements/voice-recording/design-doc.md`
|
|
79
|
+
5. 读取 `.specs/requirements/voice-recording/backend-doc.md` 作为生成验收标准的参考
|
|
80
|
+
6. 按照 4 章节结构分析内容
|
|
81
|
+
7. 生成 `.specs/requirements/voice-recording/requirements.md`
|
|
78
82
|
|
|
79
83
|
---
|
|
80
84
|
|
|
@@ -100,10 +104,12 @@ AI 负责:
|
|
|
100
104
|
**返回**:同流程 1(无后端文档信息)
|
|
101
105
|
|
|
102
106
|
**AI 执行**:
|
|
103
|
-
1.
|
|
104
|
-
2.
|
|
105
|
-
3.
|
|
106
|
-
4.
|
|
107
|
+
1. 使用 Figma MCP 工具读取设计稿,保存到 `.specs/requirements/voice-recording/design-doc.md`
|
|
108
|
+
2. 重新调用工具(工具会使用已保存的设计稿)
|
|
109
|
+
3. 读取 `.specs/requirements/voice-recording/origin-requirement.md`
|
|
110
|
+
4. 读取 `.specs/requirements/voice-recording/design-doc.md`
|
|
111
|
+
5. 按照 4 章节结构分析内容
|
|
112
|
+
6. 生成 `.specs/requirements/voice-recording/requirements.md`
|
|
107
113
|
|
|
108
114
|
---
|
|
109
115
|
|
|
@@ -214,7 +220,56 @@ AI 负责:
|
|
|
214
220
|
|
|
215
221
|
---
|
|
216
222
|
|
|
217
|
-
### 流程
|
|
223
|
+
### 流程 5:PDF 文件 + Figma 设计稿 + 后端文档(无设计稿缓存)
|
|
224
|
+
|
|
225
|
+
**第 1 次调用**:
|
|
226
|
+
```json
|
|
227
|
+
{
|
|
228
|
+
"requirementSource": {
|
|
229
|
+
"type": "file",
|
|
230
|
+
"path": "prd.pdf"
|
|
231
|
+
},
|
|
232
|
+
"featureName": "voice-recording",
|
|
233
|
+
"designSource": {
|
|
234
|
+
"type": "figma",
|
|
235
|
+
"url": "https://figma.com/design/xxx/xxx?node-id=1-2"
|
|
236
|
+
},
|
|
237
|
+
"backendSource": {
|
|
238
|
+
"type": "file",
|
|
239
|
+
"path": "backend-api.md"
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**AI 执行**:
|
|
245
|
+
1. 使用 `mcp_pdf_reader_read_pdf_text` 读取 PRD PDF,保存到 `.specs/requirements/voice-recording/origin-requirement.md`
|
|
246
|
+
2. 使用 Figma MCP 工具读取设计稿,保存到 `.specs/requirements/voice-recording/design-doc.md`
|
|
247
|
+
3. 重新调用工具
|
|
248
|
+
|
|
249
|
+
**第 2 次调用**:
|
|
250
|
+
```json
|
|
251
|
+
{
|
|
252
|
+
"requirementSource": {
|
|
253
|
+
"type": "file",
|
|
254
|
+
"path": "prd.pdf"
|
|
255
|
+
},
|
|
256
|
+
"featureName": "voice-recording",
|
|
257
|
+
"designSource": {
|
|
258
|
+
"type": "figma",
|
|
259
|
+
"url": "https://figma.com/design/xxx/xxx?node-id=1-2"
|
|
260
|
+
},
|
|
261
|
+
"backendSource": {
|
|
262
|
+
"type": "file",
|
|
263
|
+
"path": "backend-api.md"
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**返回**:分析提示词(同流程 1,包含设计稿位置)
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
### 流程 6:网页 URL + Figma 设计稿 + 后端文档(无设计稿缓存)
|
|
218
273
|
|
|
219
274
|
**第 1 次调用**:
|
|
220
275
|
```json
|
|
@@ -239,19 +294,53 @@ AI 负责:
|
|
|
239
294
|
```
|
|
240
295
|
🌐 检测到网页 URL
|
|
241
296
|
|
|
242
|
-
请使用 Chrome DevTools MCP
|
|
297
|
+
请使用 Chrome DevTools MCP 读取 PRD 网页内容
|
|
243
298
|
保存到:.specs/requirements/voice-recording/origin-requirement.md
|
|
244
299
|
完成后重新调用本工具
|
|
245
300
|
```
|
|
246
301
|
|
|
247
302
|
**AI 执行**:
|
|
248
|
-
1. 使用 Chrome DevTools MCP 读取 PRD
|
|
249
|
-
2.
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
303
|
+
1. 使用 Chrome DevTools MCP 读取 PRD 网页,保存到 `.specs/requirements/voice-recording/origin-requirement.md`
|
|
304
|
+
2. 重新调用工具
|
|
305
|
+
|
|
306
|
+
**第 2 次调用**:
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"requirementSource": {
|
|
310
|
+
"type": "url",
|
|
311
|
+
"url": "https://wiki.jd.com/pages/viewpage.action?pageId=123456"
|
|
312
|
+
},
|
|
313
|
+
"featureName": "voice-recording",
|
|
314
|
+
"designSource": {
|
|
315
|
+
"type": "figma",
|
|
316
|
+
"url": "https://figma.com/design/xxx/xxx?node-id=1-2"
|
|
317
|
+
},
|
|
318
|
+
"backendSource": {
|
|
319
|
+
"type": "url",
|
|
320
|
+
"url": "https://wiki.jd.com/pages/viewpage.action?pageId=789012"
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**返回**:
|
|
326
|
+
```
|
|
327
|
+
📝 需求文档已准备完毕
|
|
328
|
+
|
|
329
|
+
**原始文档位置**:.specs/requirements/voice-recording/origin-requirement.md
|
|
330
|
+
**设计稿链接**:https://figma.com/design/xxx/xxx?node-id=1-2(请使用 Figma MCP 读取并保存到 .specs/requirements/voice-recording/design-doc.md)
|
|
331
|
+
**后端文档位置**:.specs/requirements/voice-recording/backend-doc.md
|
|
332
|
+
**目标输出位置**:.specs/requirements/voice-recording/requirements.md
|
|
333
|
+
|
|
334
|
+
# 产品 PRD 转需求文档
|
|
335
|
+
...(前端需求分析提示词)
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**AI 执行**:
|
|
339
|
+
1. 使用 Figma MCP 工具读取设计稿,保存到 `.specs/requirements/voice-recording/design-doc.md`
|
|
340
|
+
2. 使用 Chrome DevTools MCP 读取后端文档网页,保存到 `.specs/requirements/voice-recording/backend-doc.md`
|
|
341
|
+
3. 重新调用工具
|
|
253
342
|
|
|
254
|
-
**第
|
|
343
|
+
**第 3 次调用**:同流程 1(使用已保存的文档)
|
|
255
344
|
|
|
256
345
|
---
|
|
257
346
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
2
2
|
import {
|
|
3
3
|
processRequirementDocument,
|
|
4
|
-
tryReadSavedRequirement
|
|
4
|
+
tryReadSavedRequirement,
|
|
5
|
+
saveDesignDocument,
|
|
6
|
+
tryReadSavedDesign
|
|
5
7
|
} from "./requirement-processor.js";
|
|
6
8
|
|
|
7
9
|
interface RequirementSource {
|
|
@@ -101,10 +103,33 @@ export async function generateRequirements(
|
|
|
101
103
|
// 3. 检查设计稿
|
|
102
104
|
let designSourceInfo = "";
|
|
103
105
|
if (params.designSource) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
// 3.1 优先尝试读取已保存的设计稿
|
|
107
|
+
const savedDesign = await tryReadSavedDesign(params.featureName);
|
|
108
|
+
|
|
109
|
+
if (!savedDesign) {
|
|
110
|
+
// 3.2 没有缓存,处理设计稿
|
|
111
|
+
if (params.designSource.type === "file") {
|
|
112
|
+
const designResult = await processRequirementDocument(
|
|
113
|
+
params.designSource as any,
|
|
114
|
+
params.featureName,
|
|
115
|
+
"design-doc.md"
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
if (!designResult.success) {
|
|
119
|
+
return {
|
|
120
|
+
success: false,
|
|
121
|
+
message: designResult.message!,
|
|
122
|
+
needsAction: designResult.needsAction,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
designSourceInfo = `**设计稿位置**:.specs/requirements/${params.featureName}/design-doc.md\n`;
|
|
127
|
+
} else if (params.designSource.type === "figma") {
|
|
128
|
+
designSourceInfo = `**设计稿链接**:${params.designSource.url || "Figma 链接未提供"}(请使用 Figma MCP 读取并保存到 .specs/requirements/${params.featureName}/design-doc.md)\n`;
|
|
129
|
+
}
|
|
130
|
+
} else {
|
|
131
|
+
// 3.3 使用已保存的设计稿
|
|
132
|
+
designSourceInfo = `**设计稿位置**:.specs/requirements/${params.featureName}/design-doc.md\n`;
|
|
108
133
|
}
|
|
109
134
|
}
|
|
110
135
|
|
|
@@ -152,7 +177,7 @@ export async function generateRequirements(
|
|
|
152
177
|
message,
|
|
153
178
|
needsAction: {
|
|
154
179
|
type: "analyze_content",
|
|
155
|
-
instruction: `分析 ${originDocPath}${params.designSource ? "
|
|
180
|
+
instruction: `分析 ${originDocPath}${params.designSource ? "、design-doc.md" : ""}${params.backendSource ? "、backend-doc.md" : ""},生成 ${outputPath}`,
|
|
156
181
|
},
|
|
157
182
|
};
|
|
158
183
|
} catch (error) {
|
|
@@ -187,8 +212,8 @@ function buildAnalysisPrompt(
|
|
|
187
212
|
## 输入材料
|
|
188
213
|
|
|
189
214
|
1. **产品 PRD 文档**:\`${originDocPath}\`(包含项目背景、功能列表、系统流程、详细说明等)
|
|
190
|
-
2. **设计稿**:${designSource ?
|
|
191
|
-
3. **后端文档**:${backendSource ?
|
|
215
|
+
2. **设计稿**:${designSource ? `已保存到 .specs/requirements/${featureName}/design-doc.md${designSource.type === "figma" ? "(使用 Figma MCP 读取)" : ""}` : "未提供(如有设计稿,请使用 Figma MCP 工具读取)" }
|
|
216
|
+
3. **后端文档**:${backendSource ? `已保存到 .specs/requirements/${featureName}/backend-doc.md(包含接口定义、数据结构、后端逻辑等,可作为生成验收标准的参考)` : "未提供(如有后端文档,可作为生成验收标准的参考)" }
|
|
192
217
|
|
|
193
218
|
## 输出要求
|
|
194
219
|
|
|
@@ -144,3 +144,37 @@ export async function tryReadSavedRequirement(
|
|
|
144
144
|
}
|
|
145
145
|
return null;
|
|
146
146
|
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* 保存设计稿内容到文件
|
|
150
|
+
* 用于保存从 Figma MCP 读取的设计稿内容
|
|
151
|
+
*/
|
|
152
|
+
export async function saveDesignDocument(
|
|
153
|
+
featureName: string,
|
|
154
|
+
designContent: string
|
|
155
|
+
): Promise<void> {
|
|
156
|
+
const designDocPath = `.specs/requirements/${featureName}/design-doc.md`;
|
|
157
|
+
const outputDir = designDocPath.substring(0, designDocPath.lastIndexOf("/"));
|
|
158
|
+
await fs.mkdir(outputDir, { recursive: true });
|
|
159
|
+
await fs.writeFile(designDocPath, designContent, "utf-8");
|
|
160
|
+
console.log(`✅ 设计稿已保存到: ${designDocPath}`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* 尝试读取已保存的设计稿文档
|
|
165
|
+
*/
|
|
166
|
+
export async function tryReadSavedDesign(
|
|
167
|
+
featureName: string
|
|
168
|
+
): Promise<string | null> {
|
|
169
|
+
const savedDesignPath = `.specs/requirements/${featureName}/design-doc.md`;
|
|
170
|
+
try {
|
|
171
|
+
const savedContent = await fs.readFile(savedDesignPath, "utf-8");
|
|
172
|
+
if (savedContent) {
|
|
173
|
+
console.log(`✅ 使用已保存的设计稿: ${savedDesignPath}`);
|
|
174
|
+
return savedContent;
|
|
175
|
+
}
|
|
176
|
+
} catch (error) {
|
|
177
|
+
// 文件不存在
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|