bmall-mcp 1.5.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 CHANGED
@@ -51,6 +51,7 @@ npx -y bmall-mcp
51
51
  | `mta_implementation` | 生成埋点管理类代码 | `生成埋点代码 34747` |
52
52
  | `mta_integration` | 埋点业务集成指导 | `集成埋点 34747` |
53
53
  | `analyze_appfreeze` | 鸿蒙AppFreeze分析 | `分析AppFreeze日志 /path/to/freeze.log` |
54
+ | `generate_requirements` | 需求文档生成 | `生成需求文档` |
54
55
 
55
56
  ### 工具详情
56
57
 
@@ -139,6 +140,38 @@ npx -y bmall-mcp
139
140
  - 项目根目录下的 `harmonyos-appfreeze-guide.md` 包含完整的分析规则和典型案例
140
141
  </details>
141
142
 
143
+ <details>
144
+ <summary><b>generate_requirements</b> - 需求文档生成</summary>
145
+
146
+ 从产品 PRD 文档(支持 Markdown/PDF/网页)、可选的设计稿(Figma/文件)和后端文档(文件/网页)生成结构化的前端需求文档。
147
+
148
+ **参数:**
149
+ - `requirementSource`: 需求文档来源(必填)
150
+ - `type`: "file" | "url"
151
+ - `path`: 文件路径(.md/.pdf),type=file 时必填
152
+ - `url`: 网页 URL,type=url 时必填
153
+ - `featureName`: 功能名称(必填),用于生成输出路径
154
+ - `designSource`: 设计稿来源(可选)
155
+ - `type`: "figma" | "file"
156
+ - `url`: Figma 链接,type=figma 时必填
157
+ - `path`: 设计稿文件路径,type=file 时必填
158
+ - `backendSource`: 后端文档来源(可选)
159
+ - `type`: "file" | "url"
160
+ - `path`: 后端文档路径(.md/.pdf),type=file 时必填
161
+ - `url`: 后端文档网页 URL,type=url 时必填
162
+
163
+ **输出文档结构:**
164
+ 1. 介绍:功能概述、核心价值、涉及范围、核心指标、术语表
165
+ 2. 功能需求:用户故事 + 验收标准(3-6 条)
166
+ 3. 交互细节:视觉反馈、动画效果、错误处理、确认弹窗
167
+ 4. 技术要求与限制:性能需求、可用性需求、兼容性需求、限制说明
168
+
169
+ **核心约束:**
170
+ - 从用户视角描述功能,避免技术细节
171
+ - 必须覆盖 10 个前端开发重点
172
+ - 验收标准必须可测试、具体明确
173
+ </details>
174
+
142
175
  ## 项目架构
143
176
 
144
177
  ```
@@ -171,6 +204,22 @@ src/
171
204
 
172
205
  ## Changelog
173
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
+
214
+ ### v1.6.0 (2026-03-16)
215
+ - ✅ 优化 `generate_requirements` 工具 Prompt 模板
216
+ - ✅ 新增设计稿支持(Figma 链接和本地文件)
217
+ - ✅ 新增后端文档支持(文件和网页 URL)
218
+ - ✅ 完善输出文档结构(4 个章节:介绍、功能需求、交互细节、技术要求与限制)
219
+ - ✅ 强化核心约束:用户视角、10 个前端开发重点、可测试的验收标准
220
+ - ✅ 支持多输入源:PRD + 设计稿 + 后端文档组合生成
221
+ - ✅ 更新使用文档:新增完整流程示例和最佳实践
222
+
174
223
  ### v1.5.0 (2026-02-12)
175
224
  - ✅ 新增 `generate_requirements` 工具:从需求文档生成结构化的 requirements.md
176
225
  - ✅ 支持 Markdown、PDF、网页 URL 三种输入格式
@@ -28,6 +28,8 @@ export declare const toolDefinitions: ({
28
28
  outputPath?: undefined;
29
29
  requirementSource?: undefined;
30
30
  featureName?: undefined;
31
+ designSource?: undefined;
32
+ backendSource?: undefined;
31
33
  };
32
34
  required?: undefined;
33
35
  };
@@ -61,6 +63,8 @@ export declare const toolDefinitions: ({
61
63
  outputPath?: undefined;
62
64
  requirementSource?: undefined;
63
65
  featureName?: undefined;
66
+ designSource?: undefined;
67
+ backendSource?: undefined;
64
68
  };
65
69
  required?: undefined;
66
70
  };
@@ -86,6 +90,8 @@ export declare const toolDefinitions: ({
86
90
  outputPath?: undefined;
87
91
  requirementSource?: undefined;
88
92
  featureName?: undefined;
93
+ designSource?: undefined;
94
+ backendSource?: undefined;
89
95
  };
90
96
  required?: undefined;
91
97
  };
@@ -115,6 +121,8 @@ export declare const toolDefinitions: ({
115
121
  outputPath?: undefined;
116
122
  requirementSource?: undefined;
117
123
  featureName?: undefined;
124
+ designSource?: undefined;
125
+ backendSource?: undefined;
118
126
  };
119
127
  required: string[];
120
128
  };
@@ -143,6 +151,8 @@ export declare const toolDefinitions: ({
143
151
  outputPath?: undefined;
144
152
  requirementSource?: undefined;
145
153
  featureName?: undefined;
154
+ designSource?: undefined;
155
+ backendSource?: undefined;
146
156
  };
147
157
  required: string[];
148
158
  };
@@ -171,6 +181,8 @@ export declare const toolDefinitions: ({
171
181
  outputPath?: undefined;
172
182
  requirementSource?: undefined;
173
183
  featureName?: undefined;
184
+ designSource?: undefined;
185
+ backendSource?: undefined;
174
186
  };
175
187
  required: string[];
176
188
  };
@@ -199,6 +211,8 @@ export declare const toolDefinitions: ({
199
211
  businessCodePath?: undefined;
200
212
  requirementSource?: undefined;
201
213
  featureName?: undefined;
214
+ designSource?: undefined;
215
+ backendSource?: undefined;
202
216
  };
203
217
  required: string[];
204
218
  };
@@ -232,6 +246,44 @@ export declare const toolDefinitions: ({
232
246
  type: string;
233
247
  description: string;
234
248
  };
249
+ designSource: {
250
+ type: string;
251
+ description: string;
252
+ properties: {
253
+ type: {
254
+ type: string;
255
+ enum: string[];
256
+ description: string;
257
+ };
258
+ url: {
259
+ type: string;
260
+ description: string;
261
+ };
262
+ path: {
263
+ type: string;
264
+ description: string;
265
+ };
266
+ };
267
+ };
268
+ backendSource: {
269
+ type: string;
270
+ description: string;
271
+ properties: {
272
+ type: {
273
+ type: string;
274
+ enum: string[];
275
+ description: string;
276
+ };
277
+ path: {
278
+ type: string;
279
+ description: string;
280
+ };
281
+ url: {
282
+ type: string;
283
+ description: string;
284
+ };
285
+ };
286
+ };
235
287
  ide?: undefined;
236
288
  rulesType?: undefined;
237
289
  message?: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmK3B,CAAC"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyM3B,CAAC"}
@@ -132,7 +132,7 @@ export const toolDefinitions = [
132
132
  },
133
133
  {
134
134
  name: "generate_requirements",
135
- description: "需求文档生成:从需求文档(PRD/文件/网页)生成结构化的 requirements.md。输出路径固定为 .specs/requirements/{featureName}/requirements.md。触发词:生成需求文档、需求分析、requirements",
135
+ description: "需求文档生成:从需求文档(PRD/文件/网页)和可选的设计稿、后端文档生成结构化的 requirements.md。输出路径固定为 .specs/requirements/{featureName}/requirements.md。触发词:生成需求文档、需求分析、requirements",
136
136
  inputSchema: {
137
137
  type: "object",
138
138
  properties: {
@@ -160,6 +160,44 @@ export const toolDefinitions = [
160
160
  type: "string",
161
161
  description: "功能名称(必填),用于生成输出路径 .specs/requirements/{featureName}/requirements.md",
162
162
  },
163
+ designSource: {
164
+ type: "object",
165
+ description: "设计稿来源(可选,支持 Figma 或文件)",
166
+ properties: {
167
+ type: {
168
+ type: "string",
169
+ enum: ["figma", "file"],
170
+ description: "设计稿类型",
171
+ },
172
+ url: {
173
+ type: "string",
174
+ description: "Figma 链接,当 type 为 figma 时必填",
175
+ },
176
+ path: {
177
+ type: "string",
178
+ description: "设计稿文件路径,当 type 为 file 时必填",
179
+ },
180
+ },
181
+ },
182
+ backendSource: {
183
+ type: "object",
184
+ description: "后端文档来源(可选,支持文件或网页)",
185
+ properties: {
186
+ type: {
187
+ type: "string",
188
+ enum: ["file", "url"],
189
+ description: "文件或网页",
190
+ },
191
+ path: {
192
+ type: "string",
193
+ description: "文件路径(.md/.pdf),当 type 为 file 时必填",
194
+ },
195
+ url: {
196
+ type: "string",
197
+ description: "网页 URL,当 type 为 url 时必填",
198
+ },
199
+ },
200
+ },
163
201
  },
164
202
  required: ["requirementSource", "featureName"],
165
203
  },
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/server/tools.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,16 @@ interface RequirementSource {
6
6
  interface GenerateRequirementsParams {
7
7
  requirementSource: RequirementSource;
8
8
  featureName: string;
9
+ designSource?: {
10
+ type: "figma" | "file";
11
+ url?: string;
12
+ path?: string;
13
+ };
14
+ backendSource?: {
15
+ type: "file" | "url";
16
+ path?: string;
17
+ url?: string;
18
+ };
9
19
  }
10
20
  export declare function generateRequirements(params: GenerateRequirementsParams): Promise<{
11
21
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"AAMA,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;CACrB;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,CAyDD"}
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
  */
@@ -42,19 +42,70 @@ export async function generateRequirements(params) {
42
42
  }
43
43
  // 2.2.2 需求文档已读取并保存(Markdown 文件)
44
44
  }
45
- // 3. 生成分析提示词
45
+ // 3. 检查设计稿
46
+ let designSourceInfo = "";
47
+ if (params.designSource) {
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
+ }
66
+ }
67
+ else {
68
+ // 3.3 使用已保存的设计稿
69
+ designSourceInfo = `**设计稿位置**:.specs/requirements/${params.featureName}/design-doc.md\n`;
70
+ }
71
+ }
72
+ // 4. 处理后端文档
73
+ let backendSourceInfo = "";
74
+ if (params.backendSource) {
75
+ const backendResult = await processRequirementDocument(params.backendSource, params.featureName, "backend-doc.md");
76
+ if (!backendResult.success) {
77
+ return {
78
+ success: false,
79
+ message: backendResult.message,
80
+ needsAction: backendResult.needsAction,
81
+ };
82
+ }
83
+ if (params.backendSource.type === "file") {
84
+ backendSourceInfo = `**后端文档位置**:.specs/requirements/${params.featureName}/backend-doc.md\n`;
85
+ }
86
+ else if (params.backendSource.type === "url") {
87
+ backendSourceInfo = `**后端文档位置**:.specs/requirements/${params.featureName}/backend-doc.md\n`;
88
+ }
89
+ }
90
+ // 5. 生成分析提示词
46
91
  const outputPath = `.specs/requirements/${params.featureName}/requirements.md`;
47
92
  const originDocPath = `.specs/requirements/${params.featureName}/origin-requirement.md`;
48
93
  let message = "📝 需求文档已准备完毕\n\n";
49
94
  message += `**原始文档位置**:${originDocPath}\n`;
95
+ if (designSourceInfo) {
96
+ message += designSourceInfo;
97
+ }
98
+ if (backendSourceInfo) {
99
+ message += backendSourceInfo;
100
+ }
50
101
  message += `**目标输出位置**:${outputPath}\n\n`;
51
- message += buildAnalysisPrompt(originDocPath, outputPath);
102
+ message += buildAnalysisPrompt(originDocPath, outputPath, params.designSource, params.backendSource);
52
103
  return {
53
104
  success: false,
54
105
  message,
55
106
  needsAction: {
56
107
  type: "analyze_content",
57
- instruction: `分析 ${originDocPath},生成 ${outputPath}`,
108
+ instruction: `分析 ${originDocPath}${params.designSource ? "、design-doc.md" : ""}${params.backendSource ? "、backend-doc.md" : ""},生成 ${outputPath}`,
58
109
  },
59
110
  };
60
111
  }
@@ -65,42 +116,155 @@ export async function generateRequirements(params) {
65
116
  throw new McpError(-32603, `生成需求文档失败: ${error instanceof Error ? error.message : String(error)}`);
66
117
  }
67
118
  }
68
- function buildAnalysisPrompt(originDocPath, outputPath) {
69
- let prompt = `# 需求分析任务
119
+ function buildAnalysisPrompt(originDocPath, outputPath, designSource, backendSource) {
120
+ const featureName = outputPath.split('/')[2];
121
+ let prompt = `# 产品 PRD 转需求文档
122
+
123
+ ## 角色定义
124
+
125
+ 你是一位资深的前端需求分析专家,擅长从产品 PRD 中提取并转化为前端开发可执行的需求文档。
126
+
127
+ ## 任务目标
70
128
 
71
- ## 📄 输入材料
129
+ 根据产品 PRD 文档${designSource ? "、设计稿" : ""}${backendSource ? "和后端文档" : ""},生成一份高质量的需求文档,确保前端开发人员能够清晰理解用户需求,准确实现功能。
72
130
 
73
- **原始需求文档**:\`${originDocPath}\`
131
+ ## 输入材料
74
132
 
75
- ## 📝 输出要求
133
+ 1. **产品 PRD 文档**:\`${originDocPath}\`(包含项目背景、功能列表、系统流程、详细说明等)
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(包含接口定义、数据结构、后端逻辑等,可作为生成验收标准的参考)` : "未提供(如有后端文档,可作为生成验收标准的参考)"}
76
136
 
77
- 分析原始需求文档,生成结构化的 requirements.md 到:\`${outputPath}\`
137
+ ## 输出要求
78
138
 
79
139
  ### 文档结构
80
140
 
81
- - **Introduction**:功能概述(目的、价值、范围)
82
- - **Glossary**:术语表(System、User、关键术语)
83
- - **Requirements**:需求列表(User Story + Acceptance Criteria)
141
+ 必须包含以下章节:
142
+
143
+ #### 1. 介绍
144
+ - **功能概述**:一句话说明功能是什么、解决什么问题
145
+ - **核心价值**:为什么要做这个功能(用户体验、转化率、营销能力等)
146
+ - **涉及范围**:
147
+ - 业务场景范围
148
+ - 平台支持范围
149
+ - 排除范围
150
+ - **核心指标**:衡量成功的关键指标
151
+ - **术语表**:关键术语定义,避免歧义
152
+
153
+ #### 2. 功能需求
154
+ 每个需求必须包含:
155
+ - **用户故事**:作为角色,我希望功能,以便价值
156
+ - **验收标准**:WHEN 触发条件 THEN 预期行为(至少 3-6 条)
157
+ - **说明**:补充必要的细节(不涉及技术实现)
158
+
159
+ #### 3. 交互细节
160
+ - **视觉反馈**:选中、不可用、加载、错误的视觉表现
161
+ - **动画效果**:展开/收起、弹出、跳转的动画时长和方式
162
+ - **错误处理**:各种错误场景的用户提示和处理方式
163
+ - **确认弹窗**:需要用户确认的场景和确认内容
164
+
165
+ #### 4. 技术要求与限制
166
+ - **性能需求**:响应时间、加载速度、动画流畅度
167
+ - **可用性需求**:状态清晰性、错误提示友好性、操作便捷性
168
+ - **兼容性需求**:支持的系统版本、设备类型、浏览器要求
169
+ - **限制说明**:不支持的场景、已知的兼容性问题、特殊边界情况
170
+
171
+ ### 内容要求
172
+
173
+ #### 必须包含的关键内容
174
+
175
+ **1. 功能范围**
176
+ - 业务场景、平台范围、排除范围
177
+
178
+ **2. 页面结构**
179
+ - 页面/模块布局、组件层级关系
180
+
181
+ **3. 数据展示**
182
+ - 数据来源(用"由系统返回"替代接口名)
183
+ - 数据展示规则
184
+ - 空数据/加载/错误状态的表现
185
+
186
+ **4. 交互逻辑**
187
+ - 操作入口、触发条件、即时反馈、结果处理
188
+
189
+ **5. 状态管理**
190
+ - 状态触发条件、转换逻辑、数据保持/重置
191
+
192
+ **6. 页面跳转**
193
+ - 跳转触发、目标页面、参数传递(只说明内容,不涉及字段)、返回逻辑
194
+
195
+ **7. 跨系统交互**
196
+ - 交互触发、返回处理、结果查询和展示
197
+
198
+ **8. 异常处理**
199
+ - 异常场景、提示方式、恢复机制
200
+
201
+ **9. 交互细节**
202
+ - 视觉反馈(选中/不可用等)
203
+ - 动画效果(展开/收起/弹出等)
204
+ - 确认弹窗
205
+
206
+ **10. 性能要求**
207
+ - 加载速度、响应时间、动画流畅度
208
+
209
+ #### 视角要求
210
+
211
+ **从用户视角描述**
212
+ - ✅ 描述"用户能看到什么"、"用户能做什么"、"操作后有什么反馈"
213
+
214
+ **避免技术细节**
215
+ - ❌ 不要描述"轮询 5 次"、"骨架屏 vs 局部加载"、"调用 XXX 接口"、"使用 XXX SDK"
216
+ - ✅ 用"查询超时"、"加载状态"、"由系统返回"替代
217
+
218
+ #### 格式化要求
219
+ - 用户故事:作为[角色],我希望[功能],以便[价值]
220
+ - 验收标准:WHEN [触发条件] THEN THE System SHALL [预期行为]
221
+ - 验收标准必须可测试:使用具体的时间、数量、状态,避免"快速响应"等模糊描述
222
+
223
+ ### 格式要求
224
+
225
+ #### 用户故事格式
226
+ \`\`\`
227
+ **用户故事**:作为[角色],我希望[功能],以便[价值]。
228
+ \`\`\`
229
+
230
+ #### 验收标准格式
231
+ \`\`\`
232
+ #### 验收标准
233
+
234
+ 1. WHEN [触发条件] THEN THE System SHALL [预期行为]
235
+ 2. WHEN [触发条件] THEN THE System SHALL [预期行为]
236
+ 3. WHEN [触发条件] THEN THE System SHALL [预期行为]
237
+ ...
238
+ \`\`\`
239
+
240
+ #### 可测试性要求
241
+ - 每个验收标准必须可测试、可验证
242
+ - 避免模糊的描述(如"快速响应")
243
+ - 使用具体的时间、数量、状态描述
84
244
 
85
- ### 格式规范
245
+ ## 核心约束
86
246
 
87
- **User Story**:作为[角色],我希望[功能],以便[价值]
247
+ ### 1. 内容完整性
248
+ - 必须包含所有 4 个章节(介绍、功能需求、交互细节、技术要求与限制)
249
+ - 每个功能需求必须有用户故事和 3-6 条验收标准
250
+ - 必须覆盖 10 个前端开发重点
88
251
 
89
- **Acceptance Criteria**:WHEN [触发条件] THEN THE System SHALL [系统行为]
252
+ ### 2. 视角正确性
253
+ - 从用户视角描述功能
254
+ - 不涉及技术实现细节(接口、SDK、轮询机制等)
255
+ - 用"由系统返回"、"加载状态"、"查询超时"替代技术术语
90
256
 
91
- ### 关键原则
257
+ ### 3. 内容独立性
258
+ - 不要生成接口文档(放在设计文档)
259
+ - 不要生成数据模型(放在设计文档)
260
+ - 不要生成技术架构(放在设计文档)
261
+ - 不要生成代码示例(放在开发阶段)
92
262
 
93
- - 描述"做什么"(What),不涉及"怎么做"(How)
94
- - System 代表整个系统(前后端整体)
95
- - 覆盖所有功能点、用户场景、异常情况
96
- - Acceptance Criteria 必须可测试、具体明确
97
- - 每个需求 3-6 条验收标准
263
+ ## 开始执行
98
264
 
99
- ### 处理不明确的内容
265
+ 请按照以上要求,从输入的 PRD ${designSource ? "和设计稿" : ""} 中提取信息,生成完整的需求文档到:\`${outputPath}\`
100
266
 
101
- - 如果原始文档中有不清晰、模糊、矛盾的地方,**必须先询问用户澄清**
102
- - 不要凭空猜测或假设需求
103
- - 列出具体的疑问点,等待用户确认后再生成文档
267
+ 生成过程中,如果遇到不明确的内容,必须向用户确认,不要假设答案。
104
268
  `;
105
269
  return prompt;
106
270
  }
@@ -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,EACxB,MAAM,4BAA4B,CAAC;AAapC;;GAEG;AACH,SAAS,sBAAsB,CAC7B,MAAkC;IAYlC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,yLAAyL;gBAClM,WAAW,EAAE;oBACX,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,4EAA4E;iBAC1F;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkC;IASlC,IAAI,CAAC;QACH,YAAY;QACZ,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,UAAU,CAAC,KAAM,CAAC;QAC3B,CAAC;QAED,cAAc;QAEd,6CAA6C;QAC7C,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,oBAAoB;YACpB,MAAM,iBAAiB,GAAG,MAAM,0BAA0B,CACxD,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,WAAW,CACnB,CAAC;YAEF,iCAAiC;YACjC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC/B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,iBAAiB,CAAC,OAAQ;oBACnC,WAAW,EAAE,iBAAiB,CAAC,WAAW;iBAC3C,CAAC;YACJ,CAAC;YAED,gCAAgC;QAClC,CAAC;QAED,aAAa;QACb,MAAM,UAAU,GAAG,uBAAuB,MAAM,CAAC,WAAW,kBAAkB,CAAC;QAC/E,MAAM,aAAa,GAAG,uBAAuB,MAAM,CAAC,WAAW,wBAAwB,CAAC;QAExF,IAAI,OAAO,GAAG,kBAAkB,CAAC;QACjC,OAAO,IAAI,cAAc,aAAa,IAAI,CAAC;QAC3C,OAAO,IAAI,cAAc,UAAU,MAAM,CAAC;QAC1C,OAAO,IAAI,mBAAmB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAE1D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO;YACP,WAAW,EAAE;gBACX,IAAI,EAAE,iBAAiB;gBACvB,WAAW,EAAE,MAAM,aAAa,OAAO,UAAU,EAAE;aACpD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,CAAC,KAAK,EACN,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,aAAqB,EACrB,UAAkB;IAElB,IAAI,MAAM,GAAG;;;;eAIA,aAAa;;;;sCAIU,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B/C,CAAC;IAEA,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"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"}
@@ -12,15 +12,29 @@ interface ProcessResult {
12
12
  instruction: string;
13
13
  };
14
14
  }
15
+ interface RequirementSource {
16
+ type: "file" | "url";
17
+ path?: string;
18
+ url?: string;
19
+ }
15
20
  /**
16
21
  * 步骤 2:处理需求文档输入
17
22
  * 这是整体流程的第二步,专门处理需求文档
18
23
  */
19
- export declare function processRequirementDocument(requirementSource: RequirementSource | undefined, featureName: string): Promise<ProcessResult>;
24
+ export declare function processRequirementDocument(requirementSource: RequirementSource | undefined, featureName: string, outputFileName?: string): Promise<ProcessResult>;
20
25
  /**
21
26
  * 尝试读取已保存的需求文档
22
27
  * 如果用户之前已经按照指令保存了文件,优先使用已保存的内容
23
28
  */
24
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>;
25
39
  export {};
26
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;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,EAChD,WAAW,EAAE,MAAM,GAClB,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"}
@@ -4,7 +4,7 @@ import * as fs from "fs/promises";
4
4
  * 步骤 2:处理需求文档输入
5
5
  * 这是整体流程的第二步,专门处理需求文档
6
6
  */
7
- export async function processRequirementDocument(requirementSource, featureName) {
7
+ export async function processRequirementDocument(requirementSource, featureName, outputFileName = "origin-requirement.md") {
8
8
  // 2.1 校验是否提供了需求文档
9
9
  if (!requirementSource) {
10
10
  return {
@@ -32,7 +32,7 @@ export async function processRequirementDocument(requirementSource, featureName)
32
32
  const ext = filePath.split(".").pop()?.toLowerCase();
33
33
  // 2.2.1 PDF 文件 - 返回读取指令
34
34
  if (ext === "pdf") {
35
- const outputMdPath = `.specs/requirements/${featureName}/origin-requirement.md`;
35
+ const outputMdPath = `.specs/requirements/${featureName}/${outputFileName}`;
36
36
  return {
37
37
  success: false,
38
38
  message: `📄 检测到 PDF 文件
@@ -48,7 +48,7 @@ export async function processRequirementDocument(requirementSource, featureName)
48
48
  }
49
49
  // 2.2.2 Markdown 文件 - 保存到固定位置
50
50
  if (ext === "md" || ext === "markdown") {
51
- const outputMdPath = `.specs/requirements/${featureName}/origin-requirement.md`;
51
+ const outputMdPath = `.specs/requirements/${featureName}/${outputFileName}`;
52
52
  // 读取 Markdown 内容
53
53
  const content = await fs.readFile(filePath, "utf-8");
54
54
  // 保存到固定位置
@@ -70,7 +70,7 @@ export async function processRequirementDocument(requirementSource, featureName)
70
70
  if (!url) {
71
71
  throw new McpError(-32602, "网页 URL 不能为空");
72
72
  }
73
- const outputMdPath = `.specs/requirements/${featureName}/origin-requirement.md`;
73
+ const outputMdPath = `.specs/requirements/${featureName}/${outputFileName}`;
74
74
  return {
75
75
  success: false,
76
76
  message: `🌐 检测到网页 URL
@@ -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