bmall-mcp 1.8.7 → 1.8.9
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 +13 -0
- package/dist/tools/requirements/index.d.ts.map +1 -1
- package/dist/tools/requirements/index.js +107 -76
- package/dist/tools/requirements/index.js.map +1 -1
- package/dist/tools/requirements/requirement-processor.d.ts.map +1 -1
- package/dist/tools/requirements/requirement-processor.js +26 -81
- package/dist/tools/requirements/requirement-processor.js.map +1 -1
- package/package.json +1 -1
- package/src/tools/requirements/index.ts +136 -88
- package/src/tools/requirements/requirement-processor.ts +34 -91
package/README.md
CHANGED
|
@@ -204,6 +204,19 @@ src/
|
|
|
204
204
|
|
|
205
205
|
## Changelog
|
|
206
206
|
|
|
207
|
+
### v1.8.9 (2026-03-16)
|
|
208
|
+
- ✅ 优化工作流输出:一次性返回所有需要处理的文档任务
|
|
209
|
+
- ✅ 支持并行处理:AI可以同时处理多个文档,提高效率
|
|
210
|
+
- ✅ 减少交互次数:从多次返回改为一次返回完整任务列表
|
|
211
|
+
- ✅ 完善Figma提示:像PDF一样提供具体的工具调用步骤
|
|
212
|
+
- ✅ 统一提示格式:所有文档都有清晰的操作指引
|
|
213
|
+
|
|
214
|
+
### v1.8.8 (2026-03-16)
|
|
215
|
+
- ✅ 优化PDF读取流程:同时使用read_pdf_text和read_by_ocr两个工具
|
|
216
|
+
- ✅ 简化流程:不再输出中间文件,直接合并到origin-requirement.md
|
|
217
|
+
- ✅ 提升效率:一次调用完成两个工具读取,减少交互次数
|
|
218
|
+
- ✅ 确保完整性:文本层+OCR内容合并,不遗漏任何信息
|
|
219
|
+
|
|
207
220
|
### v1.8.7 (2026-03-16)
|
|
208
221
|
- ✅ 优化PDF处理指令:明确指示AI调用mcp_execute_tool工具
|
|
209
222
|
- ✅ 完善PDF读取提示:提供完整的工具调用参数和格式
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"AAyBA,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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"AAyBA,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,CA2ND"}
|
|
@@ -47,100 +47,131 @@ export async function generateRequirements(params) {
|
|
|
47
47
|
projectRoot = getProjectRoot(params.requirementSource.path);
|
|
48
48
|
}
|
|
49
49
|
debugLog(`计算项目根目录`, { projectRoot, cwd: process.cwd() });
|
|
50
|
-
// 2.1
|
|
50
|
+
// 2.1 检查所有文档状态,收集需要处理的文档
|
|
51
|
+
const originDocPath = buildOutputPath(params.featureName, "origin-requirement.md", projectRoot);
|
|
52
|
+
const designDocPath = params.designSource ? buildOutputPath(params.featureName, "design-doc.md", projectRoot) : null;
|
|
53
|
+
const backendDocPath = params.backendSource ? buildOutputPath(params.featureName, "backend-doc.md", projectRoot) : null;
|
|
54
|
+
debugLog(`检查文档状态`, { originDocPath, designDocPath, backendDocPath });
|
|
55
|
+
// 检查各个文档是否已存在
|
|
51
56
|
const savedRequirement = await tryReadSavedRequirement(params.featureName, projectRoot);
|
|
57
|
+
const savedDesign = params.designSource ? await tryReadSavedDesign(params.featureName, projectRoot) : null;
|
|
58
|
+
const savedBackend = params.backendSource ? await tryReadSavedBackend(params.featureName, projectRoot) : null;
|
|
59
|
+
debugLog(`文档状态检查结果`, {
|
|
60
|
+
savedRequirement: !!savedRequirement,
|
|
61
|
+
savedDesign: !!savedDesign,
|
|
62
|
+
savedBackend: !!savedBackend
|
|
63
|
+
});
|
|
64
|
+
// 收集需要处理的文档
|
|
65
|
+
const tasks = [];
|
|
66
|
+
// 检查需求文档
|
|
52
67
|
if (!savedRequirement) {
|
|
53
|
-
debugLog(
|
|
54
|
-
const requirementResult = await processRequirementDocument(params.requirementSource, params.featureName);
|
|
68
|
+
debugLog(`需求文档未找到,需要处理`);
|
|
69
|
+
const requirementResult = await processRequirementDocument(params.requirementSource, params.featureName, "origin-requirement.md");
|
|
55
70
|
if (!requirementResult.success) {
|
|
56
71
|
debugLog(`需求文档需要进一步处理`, { requirementResult });
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
72
|
+
tasks.push({
|
|
73
|
+
name: "需求文档 (PRD)",
|
|
74
|
+
outputPath: originDocPath,
|
|
75
|
+
source: params.requirementSource,
|
|
76
|
+
status: "needs_processing",
|
|
77
|
+
processingInstruction: requirementResult.message
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
debugLog(`需求文档已处理`);
|
|
62
82
|
}
|
|
63
|
-
debugLog(`需求文档已保存`);
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
debugLog(`需求文档已存在`, { contentLength: savedRequirement.length });
|
|
67
83
|
}
|
|
68
|
-
//
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const designProjectRoot = getProjectRoot(params.designSource.path);
|
|
77
|
-
debugLog(`设计稿项目根目录`, { designProjectRoot });
|
|
78
|
-
designResult = await processRequirementDocument(params.designSource, params.featureName, "design-doc.md");
|
|
79
|
-
}
|
|
80
|
-
else if (params.designSource.type === "figma") {
|
|
81
|
-
// Figma 链接类型,返回提示让 AI 处理
|
|
82
|
-
designResult = {
|
|
83
|
-
success: false,
|
|
84
|
-
message: `🎨 检测到 Figma 设计稿链接
|
|
85
|
-
|
|
86
|
-
请使用 Figma MCP 读取设计稿并保存到文件`,
|
|
87
|
-
needsAction: {
|
|
88
|
-
type: "analyze_content",
|
|
89
|
-
instruction: `使用 Figma MCP 读取设计稿 ${params.designSource.url},保存到 ${buildOutputPath(params.featureName, "design-doc.md", projectRoot)}。完成后立即保存文件,不要把内容放在上下文中。保存后重新调用 generate_requirements 工具。`,
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
// 未知类型,默认返回成功
|
|
95
|
-
debugLog(`设计稿类型未知,跳过`);
|
|
96
|
-
designResult = { success: true, message: "设计稿已处理" };
|
|
97
|
-
}
|
|
84
|
+
// 检查设计稿
|
|
85
|
+
if (params.designSource && !savedDesign) {
|
|
86
|
+
debugLog(`设计稿未找到,需要处理`);
|
|
87
|
+
if (params.designSource.type === "file") {
|
|
88
|
+
const designResult = await processRequirementDocument({
|
|
89
|
+
type: "file",
|
|
90
|
+
path: params.designSource.path
|
|
91
|
+
}, params.featureName, "design-doc.md");
|
|
98
92
|
if (!designResult.success) {
|
|
99
93
|
debugLog(`设计稿需要进一步处理`, { designResult });
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
94
|
+
tasks.push({
|
|
95
|
+
name: "设计稿",
|
|
96
|
+
outputPath: designDocPath,
|
|
97
|
+
source: params.designSource,
|
|
98
|
+
status: "needs_processing",
|
|
99
|
+
processingInstruction: designResult.message
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
debugLog(`设计稿已处理`);
|
|
105
104
|
}
|
|
106
|
-
debugLog(`设计稿已保存`);
|
|
107
|
-
designSourceInfo = `**设计稿位置**:${buildOutputPath(params.featureName, "design-doc.md", projectRoot)}\n`;
|
|
108
105
|
}
|
|
109
|
-
else {
|
|
110
|
-
|
|
111
|
-
|
|
106
|
+
else if (params.designSource.type === "figma") {
|
|
107
|
+
tasks.push({
|
|
108
|
+
name: "设计稿 (Figma)",
|
|
109
|
+
outputPath: designDocPath,
|
|
110
|
+
source: params.designSource,
|
|
111
|
+
status: "needs_processing",
|
|
112
|
+
processingInstruction: `🎨 检测到 Figma 设计稿链接
|
|
113
|
+
|
|
114
|
+
请读取以下 Figma 设计稿并保存到文件:
|
|
115
|
+
|
|
116
|
+
- Figma 链接:${params.designSource.url}
|
|
117
|
+
- 保存到:\`${designDocPath}\`
|
|
118
|
+
|
|
119
|
+
读取完成后,重新调用 \`generate_requirements\` 工具`
|
|
120
|
+
});
|
|
112
121
|
}
|
|
113
122
|
}
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const
|
|
118
|
-
if (!
|
|
119
|
-
debugLog(
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return {
|
|
128
|
-
success: false,
|
|
129
|
-
message: backendResult.message,
|
|
130
|
-
needsAction: backendResult.needsAction,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
debugLog(`后端文档已保存`);
|
|
134
|
-
backendSourceInfo = `**后端文档位置**:${buildOutputPath(params.featureName, "backend-doc.md", backendProjectRoot)}\n`;
|
|
123
|
+
// 检查后端文档
|
|
124
|
+
if (params.backendSource && !savedBackend) {
|
|
125
|
+
debugLog(`后端文档未找到,需要处理`);
|
|
126
|
+
const backendResult = await processRequirementDocument(params.backendSource, params.featureName, "backend-doc.md");
|
|
127
|
+
if (!backendResult.success) {
|
|
128
|
+
debugLog(`后端文档需要进一步处理`, { backendResult });
|
|
129
|
+
tasks.push({
|
|
130
|
+
name: "后端文档",
|
|
131
|
+
outputPath: backendDocPath,
|
|
132
|
+
source: params.backendSource,
|
|
133
|
+
status: "needs_processing",
|
|
134
|
+
processingInstruction: backendResult.message
|
|
135
|
+
});
|
|
135
136
|
}
|
|
136
137
|
else {
|
|
137
|
-
debugLog(
|
|
138
|
-
backendSourceInfo = `**后端文档位置**:${buildOutputPath(params.featureName, "backend-doc.md", projectRoot)}\n`;
|
|
138
|
+
debugLog(`后端文档已处理`);
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
|
+
// 如果有需要处理的任务,返回完整工作流
|
|
142
|
+
if (tasks.length > 0) {
|
|
143
|
+
debugLog(`发现 ${tasks.length} 个需要处理的任务`);
|
|
144
|
+
let message = `📋 需要处理以下文档(共 ${tasks.length} 个)\n\n`;
|
|
145
|
+
tasks.forEach((task, index) => {
|
|
146
|
+
message += `### 任务 ${index + 1}:${task.name}\n`;
|
|
147
|
+
message += task.processingInstruction;
|
|
148
|
+
message += `\n\n`;
|
|
149
|
+
});
|
|
150
|
+
message += `⚠️ **重要提示**:\n`;
|
|
151
|
+
message += `- 每个任务处理完成后,立即保存文件,**不要把文件内容放在上下文中**\n`;
|
|
152
|
+
message += `- 所有任务完成后,重新调用 \`generate_requirements\` 工具\n`;
|
|
153
|
+
message += `- 这样可以避免上下文过长,提高处理效率\n`;
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
message,
|
|
157
|
+
needsAction: {
|
|
158
|
+
type: "process_documents",
|
|
159
|
+
instruction: `按顺序或并行处理上述 ${tasks.length} 个任务,每个任务完成后立即保存文件。所有任务完成后重新调用 generate_requirements 工具。`
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// 所有文档都已准备好
|
|
164
|
+
debugLog(`所有文档已准备完毕`);
|
|
165
|
+
let designSourceInfo = "";
|
|
166
|
+
if (savedDesign) {
|
|
167
|
+
designSourceInfo = `**设计稿位置**:${designDocPath}\n`;
|
|
168
|
+
}
|
|
169
|
+
let backendSourceInfo = "";
|
|
170
|
+
if (savedBackend) {
|
|
171
|
+
backendSourceInfo = `**后端文档位置**:${backendDocPath}\n`;
|
|
172
|
+
}
|
|
141
173
|
// 5. 生成分析提示词
|
|
142
174
|
const outputPath = buildOutputPath(params.featureName, "requirements.md", projectRoot);
|
|
143
|
-
const originDocPath = buildOutputPath(params.featureName, "origin-requirement.md", projectRoot);
|
|
144
175
|
debugLog(`生成输出路径`, { outputPath, originDocPath, projectRoot });
|
|
145
176
|
let message = "📝 需求文档已准备完毕\n\n";
|
|
146
177
|
message += `**原始文档位置**:${originDocPath}\n`;
|
|
@@ -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;AAG9D,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EAEvB,kBAAkB,EAElB,mBAAmB,EACnB,cAAc,EACd,eAAe,EAEhB,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,SAAS,QAAQ,CAAC,OAAe,EAAE,IAAU;IAC3C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,UAAU,SAAS,KAAK,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACxG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAC5B,CAAC;AAuBD;;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,QAAQ,CAAC,yBAAyB,EAAE;QAClC,MAAM;QACN,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;QACvB,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE;KACtB,CAAC,CAAC;IAEH,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,sBAAsB;QACtB,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,iBAAiB,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAC9E,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;QACD,QAAQ,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAEzD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/requirements/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-processor.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/requirement-processor.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAElG;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,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,EACnB,cAAc,GAAE,MAAgC,GAC/C,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"requirement-processor.d.ts","sourceRoot":"","sources":["../../../src/tools/requirements/requirement-processor.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAElG;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,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,EACnB,cAAc,GAAE,MAAgC,GAC/C,OAAO,CAAC,aAAa,CAAC,CAmKxB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB"}
|
|
@@ -94,98 +94,43 @@ export async function processRequirementDocument(requirementSource, featureName,
|
|
|
94
94
|
}
|
|
95
95
|
catch {
|
|
96
96
|
// 文件不存在,需要处理
|
|
97
|
-
debugLog(
|
|
98
|
-
//
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
debugLog(`发现text和ocr文件,准备合并`);
|
|
107
|
-
return {
|
|
108
|
-
success: false,
|
|
109
|
-
message: `✅ PDF 的两个中间文件已存在,现在合并它们
|
|
97
|
+
debugLog(`输出文件不存在,需要处理PDF`, { outputMdPath });
|
|
98
|
+
// 检测语言
|
|
99
|
+
const fileName = filePath.split('/').pop() || '';
|
|
100
|
+
const isChinese = /[\u4e00-\u9fa5]/.test(fileName);
|
|
101
|
+
const language = isChinese ? 'chi_sim' : 'eng';
|
|
102
|
+
debugLog(`准备提取PDF内容`, { filePath, language });
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
message: `📄 检测到 PDF 文件,需要提取完整内容
|
|
110
106
|
|
|
111
107
|
请执行以下操作:
|
|
112
108
|
|
|
113
|
-
1.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
4. 保存完成后,重新调用 \`generate_requirements\` 工具`,
|
|
118
|
-
needsAction: {
|
|
119
|
-
type: "read_pdf",
|
|
120
|
-
instruction: `合并两个PDF读取结果:
|
|
121
|
-
1. 读取文件 ${textPath} 的内容
|
|
122
|
-
2. 读取文件 ${ocrPath} 的内容
|
|
123
|
-
3. 将两者合并保存到 ${outputMdPath}
|
|
124
|
-
4. 保存文件
|
|
125
|
-
5. 重新调用 generate_requirements 工具(不要把文件内容放在上下文中)`,
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
// 只有text文件存在,进行OCR
|
|
131
|
-
const fileName = filePath.split('/').pop() || '';
|
|
132
|
-
const isChinese = /[\u4e00-\u9fa5]/.test(fileName);
|
|
133
|
-
const language = isChinese ? 'chi_sim' : 'eng';
|
|
134
|
-
debugLog(`发现text文件,准备OCR`);
|
|
135
|
-
return {
|
|
136
|
-
success: false,
|
|
137
|
-
message: `✅ PDF 文本层已提取,现在使用 OCR 提取图片和表格
|
|
138
|
-
|
|
139
|
-
请执行以下操作:
|
|
109
|
+
1. 调用 \`mcp_execute_tool\` 工具读取文本层:
|
|
110
|
+
- server_name: "pdf-reader"
|
|
111
|
+
- tool_name: "read_pdf_text"
|
|
112
|
+
- arguments: { "file_path": "${filePath}" }
|
|
140
113
|
|
|
141
|
-
|
|
114
|
+
2. 调用 \`mcp_execute_tool\` 工具读取图片和表格(OCR):
|
|
142
115
|
- server_name: "pdf-reader"
|
|
143
116
|
- tool_name: "read_by_ocr"
|
|
144
117
|
- arguments: { "file_path": "${filePath}", "language": "${language}", "dpi": 300 }
|
|
145
118
|
|
|
146
|
-
|
|
119
|
+
3. 将两次读取的内容合并(文本层 + OCR内容)
|
|
147
120
|
|
|
148
|
-
|
|
149
|
-
needsAction: {
|
|
150
|
-
type: "read_pdf",
|
|
151
|
-
instruction: `必须先调用 pdf-reader MCP 工具进行 OCR:
|
|
152
|
-
1. 调用 mcp_execute_tool,使用 pdf-reader 的 read_by_ocr 工具,参数为 { "file_path": "${filePath}", "language": "${language}", "dpi": 300 }
|
|
153
|
-
2. 将返回的内容保存到文件:${ocrPath}
|
|
154
|
-
3. 保存完成后重新调用 generate_requirements 工具(不要把文件内容放在上下文中)`,
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
// 还没有任何文件,先提取文本
|
|
161
|
-
debugLog(`未发现中间文件,先提取文本层`);
|
|
162
|
-
// 创建输出目录
|
|
163
|
-
const outputDir = path.dirname(textPath);
|
|
164
|
-
await fs.mkdir(outputDir, { recursive: true });
|
|
165
|
-
debugLog(`创建目录`, { outputDir });
|
|
166
|
-
return {
|
|
167
|
-
success: false,
|
|
168
|
-
message: `📄 检测到 PDF 文件,需要先提取文本层
|
|
121
|
+
4. 保存合并后的内容到:\`${outputMdPath}\`
|
|
169
122
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
- tool_name: "read_pdf_text"
|
|
175
|
-
- arguments: { "file_path": "${filePath}" }
|
|
176
|
-
|
|
177
|
-
2. 将读取到的内容保存到文件:\`${textPath}\`
|
|
178
|
-
|
|
179
|
-
3. 保存完成后,重新调用 \`generate_requirements\` 工具`,
|
|
180
|
-
needsAction: {
|
|
181
|
-
type: "read_pdf",
|
|
182
|
-
instruction: `必须先调用 pdf-reader MCP 工具读取 PDF:
|
|
123
|
+
5. 保存完成后,重新调用 \`generate_requirements\` 工具`,
|
|
124
|
+
needsAction: {
|
|
125
|
+
type: "read_pdf",
|
|
126
|
+
instruction: `必须调用 pdf-reader MCP 的两个工具读取 PDF:
|
|
183
127
|
1. 调用 mcp_execute_tool,使用 pdf-reader 的 read_pdf_text 工具,参数为 { "file_path": "${filePath}" }
|
|
184
|
-
2.
|
|
185
|
-
3.
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
128
|
+
2. 调用 mcp_execute_tool,使用 pdf-reader 的 read_by_ocr 工具,参数为 { "file_path": "${filePath}", "language": "${language}", "dpi": 300 }
|
|
129
|
+
3. 将两次读取的内容合并(text + ocr)
|
|
130
|
+
4. 保存合并后的内容到文件:${outputMdPath}
|
|
131
|
+
5. 保存完成后重新调用 generate_requirements 工具(不要把文件内容放在上下文中)`,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
189
134
|
}
|
|
190
135
|
}
|
|
191
136
|
// 2.2.2 Markdown 文件 - 保存到固定位置
|
|
@@ -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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"}
|
package/package.json
CHANGED
|
@@ -108,117 +108,165 @@ export async function generateRequirements(
|
|
|
108
108
|
}
|
|
109
109
|
debugLog(`计算项目根目录`, { projectRoot, cwd: process.cwd() });
|
|
110
110
|
|
|
111
|
-
// 2.1
|
|
111
|
+
// 2.1 检查所有文档状态,收集需要处理的文档
|
|
112
|
+
const originDocPath = buildOutputPath(params.featureName, "origin-requirement.md", projectRoot);
|
|
113
|
+
const designDocPath = params.designSource ? buildOutputPath(params.featureName, "design-doc.md", projectRoot) : null;
|
|
114
|
+
const backendDocPath = params.backendSource ? buildOutputPath(params.featureName, "backend-doc.md", projectRoot) : null;
|
|
115
|
+
|
|
116
|
+
debugLog(`检查文档状态`, { originDocPath, designDocPath, backendDocPath });
|
|
117
|
+
|
|
118
|
+
// 检查各个文档是否已存在
|
|
112
119
|
const savedRequirement = await tryReadSavedRequirement(params.featureName, projectRoot);
|
|
120
|
+
const savedDesign = params.designSource ? await tryReadSavedDesign(params.featureName, projectRoot) : null;
|
|
121
|
+
const savedBackend = params.backendSource ? await tryReadSavedBackend(params.featureName, projectRoot) : null;
|
|
122
|
+
|
|
123
|
+
debugLog(`文档状态检查结果`, {
|
|
124
|
+
savedRequirement: !!savedRequirement,
|
|
125
|
+
savedDesign: !!savedDesign,
|
|
126
|
+
savedBackend: !!savedBackend
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// 收集需要处理的文档
|
|
130
|
+
const tasks: Array<{
|
|
131
|
+
name: string;
|
|
132
|
+
outputPath: string;
|
|
133
|
+
source?: any;
|
|
134
|
+
status: "exists" | "needs_processing";
|
|
135
|
+
processingInstruction?: string;
|
|
136
|
+
}> = [];
|
|
137
|
+
|
|
138
|
+
// 检查需求文档
|
|
113
139
|
if (!savedRequirement) {
|
|
114
|
-
debugLog(
|
|
140
|
+
debugLog(`需求文档未找到,需要处理`);
|
|
115
141
|
const requirementResult = await processRequirementDocument(
|
|
116
142
|
params.requirementSource,
|
|
117
|
-
params.featureName
|
|
143
|
+
params.featureName,
|
|
144
|
+
"origin-requirement.md"
|
|
118
145
|
);
|
|
119
|
-
|
|
146
|
+
|
|
120
147
|
if (!requirementResult.success) {
|
|
121
148
|
debugLog(`需求文档需要进一步处理`, { requirementResult });
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
149
|
+
tasks.push({
|
|
150
|
+
name: "需求文档 (PRD)",
|
|
151
|
+
outputPath: originDocPath,
|
|
152
|
+
source: params.requirementSource,
|
|
153
|
+
status: "needs_processing",
|
|
154
|
+
processingInstruction: requirementResult.message!
|
|
155
|
+
});
|
|
156
|
+
} else {
|
|
157
|
+
debugLog(`需求文档已处理`);
|
|
127
158
|
}
|
|
128
|
-
debugLog(`需求文档已保存`);
|
|
129
|
-
} else {
|
|
130
|
-
debugLog(`需求文档已存在`, { contentLength: savedRequirement.length });
|
|
131
159
|
}
|
|
132
|
-
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
const savedDesign = await tryReadSavedDesign(params.featureName, projectRoot);
|
|
160
|
+
|
|
161
|
+
// 检查设计稿
|
|
162
|
+
if (params.designSource && !savedDesign) {
|
|
163
|
+
debugLog(`设计稿未找到,需要处理`);
|
|
137
164
|
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
params.designSource as any,
|
|
148
|
-
params.featureName,
|
|
149
|
-
"design-doc.md"
|
|
150
|
-
);
|
|
151
|
-
} else if (params.designSource.type === "figma") {
|
|
152
|
-
// Figma 链接类型,返回提示让 AI 处理
|
|
153
|
-
designResult = {
|
|
154
|
-
success: false,
|
|
155
|
-
message: `🎨 检测到 Figma 设计稿链接
|
|
156
|
-
|
|
157
|
-
请使用 Figma MCP 读取设计稿并保存到文件`,
|
|
158
|
-
needsAction: {
|
|
159
|
-
type: "analyze_content" as any,
|
|
160
|
-
instruction: `使用 Figma MCP 读取设计稿 ${params.designSource.url},保存到 ${buildOutputPath(params.featureName, "design-doc.md", projectRoot)}。完成后立即保存文件,不要把内容放在上下文中。保存后重新调用 generate_requirements 工具。`,
|
|
161
|
-
},
|
|
162
|
-
};
|
|
163
|
-
} else {
|
|
164
|
-
// 未知类型,默认返回成功
|
|
165
|
-
debugLog(`设计稿类型未知,跳过`);
|
|
166
|
-
designResult = { success: true, message: "设计稿已处理" };
|
|
167
|
-
}
|
|
165
|
+
if (params.designSource.type === "file") {
|
|
166
|
+
const designResult = await processRequirementDocument(
|
|
167
|
+
{
|
|
168
|
+
type: "file",
|
|
169
|
+
path: params.designSource.path
|
|
170
|
+
},
|
|
171
|
+
params.featureName,
|
|
172
|
+
"design-doc.md"
|
|
173
|
+
);
|
|
168
174
|
|
|
169
175
|
if (!designResult.success) {
|
|
170
176
|
debugLog(`设计稿需要进一步处理`, { designResult });
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
177
|
+
tasks.push({
|
|
178
|
+
name: "设计稿",
|
|
179
|
+
outputPath: designDocPath!,
|
|
180
|
+
source: params.designSource,
|
|
181
|
+
status: "needs_processing",
|
|
182
|
+
processingInstruction: designResult.message!
|
|
183
|
+
});
|
|
184
|
+
} else {
|
|
185
|
+
debugLog(`设计稿已处理`);
|
|
176
186
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
187
|
+
} else if (params.designSource.type === "figma") {
|
|
188
|
+
tasks.push({
|
|
189
|
+
name: "设计稿 (Figma)",
|
|
190
|
+
outputPath: designDocPath!,
|
|
191
|
+
source: params.designSource,
|
|
192
|
+
status: "needs_processing",
|
|
193
|
+
processingInstruction: `🎨 检测到 Figma 设计稿链接
|
|
194
|
+
|
|
195
|
+
请读取以下 Figma 设计稿并保存到文件:
|
|
196
|
+
|
|
197
|
+
- Figma 链接:${params.designSource.url}
|
|
198
|
+
- 保存到:\`${designDocPath}\`
|
|
199
|
+
|
|
200
|
+
读取完成后,重新调用 \`generate_requirements\` 工具`
|
|
201
|
+
});
|
|
182
202
|
}
|
|
183
203
|
}
|
|
184
|
-
|
|
185
|
-
//
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
const
|
|
204
|
+
|
|
205
|
+
// 检查后端文档
|
|
206
|
+
if (params.backendSource && !savedBackend) {
|
|
207
|
+
debugLog(`后端文档未找到,需要处理`);
|
|
208
|
+
const backendResult = await processRequirementDocument(
|
|
209
|
+
params.backendSource,
|
|
210
|
+
params.featureName,
|
|
211
|
+
"backend-doc.md"
|
|
212
|
+
);
|
|
189
213
|
|
|
190
|
-
if (!
|
|
191
|
-
debugLog(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
params.featureName,
|
|
200
|
-
"backend-doc.md"
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
if (!backendResult.success) {
|
|
204
|
-
debugLog(`后端文档需要进一步处理`, { backendResult });
|
|
205
|
-
return {
|
|
206
|
-
success: false,
|
|
207
|
-
message: backendResult.message!,
|
|
208
|
-
needsAction: backendResult.needsAction,
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
debugLog(`后端文档已保存`);
|
|
212
|
-
backendSourceInfo = `**后端文档位置**:${buildOutputPath(params.featureName, "backend-doc.md", backendProjectRoot)}\n`;
|
|
214
|
+
if (!backendResult.success) {
|
|
215
|
+
debugLog(`后端文档需要进一步处理`, { backendResult });
|
|
216
|
+
tasks.push({
|
|
217
|
+
name: "后端文档",
|
|
218
|
+
outputPath: backendDocPath!,
|
|
219
|
+
source: params.backendSource,
|
|
220
|
+
status: "needs_processing",
|
|
221
|
+
processingInstruction: backendResult.message!
|
|
222
|
+
});
|
|
213
223
|
} else {
|
|
214
|
-
debugLog(
|
|
215
|
-
backendSourceInfo = `**后端文档位置**:${buildOutputPath(params.featureName, "backend-doc.md", projectRoot)}\n`;
|
|
224
|
+
debugLog(`后端文档已处理`);
|
|
216
225
|
}
|
|
217
226
|
}
|
|
227
|
+
|
|
228
|
+
// 如果有需要处理的任务,返回完整工作流
|
|
229
|
+
if (tasks.length > 0) {
|
|
230
|
+
debugLog(`发现 ${tasks.length} 个需要处理的任务`);
|
|
231
|
+
|
|
232
|
+
let message = `📋 需要处理以下文档(共 ${tasks.length} 个)\n\n`;
|
|
233
|
+
|
|
234
|
+
tasks.forEach((task, index) => {
|
|
235
|
+
message += `### 任务 ${index + 1}:${task.name}\n`;
|
|
236
|
+
message += task.processingInstruction;
|
|
237
|
+
message += `\n\n`;
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
message += `⚠️ **重要提示**:\n`;
|
|
241
|
+
message += `- 每个任务处理完成后,立即保存文件,**不要把文件内容放在上下文中**\n`;
|
|
242
|
+
message += `- 所有任务完成后,重新调用 \`generate_requirements\` 工具\n`;
|
|
243
|
+
message += `- 这样可以避免上下文过长,提高处理效率\n`;
|
|
244
|
+
|
|
245
|
+
return {
|
|
246
|
+
success: false,
|
|
247
|
+
message,
|
|
248
|
+
needsAction: {
|
|
249
|
+
type: "process_documents" as any,
|
|
250
|
+
instruction: `按顺序或并行处理上述 ${tasks.length} 个任务,每个任务完成后立即保存文件。所有任务完成后重新调用 generate_requirements 工具。`
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// 所有文档都已准备好
|
|
256
|
+
debugLog(`所有文档已准备完毕`);
|
|
257
|
+
|
|
258
|
+
let designSourceInfo = "";
|
|
259
|
+
if (savedDesign) {
|
|
260
|
+
designSourceInfo = `**设计稿位置**:${designDocPath}\n`;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
let backendSourceInfo = "";
|
|
264
|
+
if (savedBackend) {
|
|
265
|
+
backendSourceInfo = `**后端文档位置**:${backendDocPath}\n`;
|
|
266
|
+
}
|
|
218
267
|
|
|
219
268
|
// 5. 生成分析提示词
|
|
220
269
|
const outputPath = buildOutputPath(params.featureName, "requirements.md", projectRoot);
|
|
221
|
-
const originDocPath = buildOutputPath(params.featureName, "origin-requirement.md", projectRoot);
|
|
222
270
|
debugLog(`生成输出路径`, { outputPath, originDocPath, projectRoot });
|
|
223
271
|
|
|
224
272
|
let message = "📝 需求文档已准备完毕\n\n";
|
|
@@ -108,7 +108,7 @@ export async function processRequirementDocument(
|
|
|
108
108
|
if (ext === "pdf") {
|
|
109
109
|
const projectRoot = getProjectRoot(filePath);
|
|
110
110
|
const outputMdPath = buildOutputPath(featureName, outputFileName, projectRoot);
|
|
111
|
-
|
|
111
|
+
|
|
112
112
|
// 检查是否已经存在输出文件
|
|
113
113
|
try {
|
|
114
114
|
await fs.access(outputMdPath);
|
|
@@ -121,103 +121,46 @@ export async function processRequirementDocument(
|
|
|
121
121
|
};
|
|
122
122
|
} catch {
|
|
123
123
|
// 文件不存在,需要处理
|
|
124
|
-
debugLog(
|
|
125
|
-
|
|
126
|
-
// 检查是否已经完成了部分步骤
|
|
127
|
-
const textPath = outputMdPath.replace('.md', '-text.md');
|
|
128
|
-
const ocrPath = outputMdPath.replace('.md', '-ocr.md');
|
|
129
|
-
|
|
130
|
-
try {
|
|
131
|
-
await fs.access(textPath);
|
|
132
|
-
try {
|
|
133
|
-
await fs.access(ocrPath);
|
|
134
|
-
// 两个文件都存在,可以合并
|
|
135
|
-
debugLog(`发现text和ocr文件,准备合并`);
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
success: false,
|
|
139
|
-
message: `✅ PDF 的两个中间文件已存在,现在合并它们
|
|
140
|
-
|
|
141
|
-
请执行以下操作:
|
|
124
|
+
debugLog(`输出文件不存在,需要处理PDF`, { outputMdPath });
|
|
142
125
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
4. 保存完成后,重新调用 \`generate_requirements\` 工具`,
|
|
148
|
-
needsAction: {
|
|
149
|
-
type: "read_pdf",
|
|
150
|
-
instruction: `合并两个PDF读取结果:
|
|
151
|
-
1. 读取文件 ${textPath} 的内容
|
|
152
|
-
2. 读取文件 ${ocrPath} 的内容
|
|
153
|
-
3. 将两者合并保存到 ${outputMdPath}
|
|
154
|
-
4. 保存文件
|
|
155
|
-
5. 重新调用 generate_requirements 工具(不要把文件内容放在上下文中)`,
|
|
156
|
-
},
|
|
157
|
-
};
|
|
158
|
-
} catch {
|
|
159
|
-
// 只有text文件存在,进行OCR
|
|
160
|
-
const fileName = filePath.split('/').pop() || '';
|
|
161
|
-
const isChinese = /[\u4e00-\u9fa5]/.test(fileName);
|
|
162
|
-
const language = isChinese ? 'chi_sim' : 'eng';
|
|
163
|
-
|
|
164
|
-
debugLog(`发现text文件,准备OCR`);
|
|
165
|
-
|
|
166
|
-
return {
|
|
167
|
-
success: false,
|
|
168
|
-
message: `✅ PDF 文本层已提取,现在使用 OCR 提取图片和表格
|
|
169
|
-
|
|
170
|
-
请执行以下操作:
|
|
126
|
+
// 检测语言
|
|
127
|
+
const fileName = filePath.split('/').pop() || '';
|
|
128
|
+
const isChinese = /[\u4e00-\u9fa5]/.test(fileName);
|
|
129
|
+
const language = isChinese ? 'chi_sim' : 'eng';
|
|
171
130
|
|
|
172
|
-
|
|
173
|
-
- server_name: "pdf-reader"
|
|
174
|
-
- tool_name: "read_by_ocr"
|
|
175
|
-
- arguments: { "file_path": "${filePath}", "language": "${language}", "dpi": 300 }
|
|
131
|
+
debugLog(`准备提取PDF内容`, { filePath, language });
|
|
176
132
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
needsAction: {
|
|
181
|
-
type: "read_pdf",
|
|
182
|
-
instruction: `必须先调用 pdf-reader MCP 工具进行 OCR:
|
|
183
|
-
1. 调用 mcp_execute_tool,使用 pdf-reader 的 read_by_ocr 工具,参数为 { "file_path": "${filePath}", "language": "${language}", "dpi": 300 }
|
|
184
|
-
2. 将返回的内容保存到文件:${ocrPath}
|
|
185
|
-
3. 保存完成后重新调用 generate_requirements 工具(不要把文件内容放在上下文中)`,
|
|
186
|
-
},
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
} catch {
|
|
190
|
-
// 还没有任何文件,先提取文本
|
|
191
|
-
debugLog(`未发现中间文件,先提取文本层`);
|
|
192
|
-
|
|
193
|
-
// 创建输出目录
|
|
194
|
-
const outputDir = path.dirname(textPath);
|
|
195
|
-
await fs.mkdir(outputDir, { recursive: true });
|
|
196
|
-
debugLog(`创建目录`, { outputDir });
|
|
197
|
-
|
|
198
|
-
return {
|
|
199
|
-
success: false,
|
|
200
|
-
message: `📄 检测到 PDF 文件,需要先提取文本层
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
message: `📄 检测到 PDF 文件,需要提取完整内容
|
|
201
136
|
|
|
202
137
|
请执行以下操作:
|
|
203
138
|
|
|
204
|
-
1. 调用 \`mcp_execute_tool\`
|
|
139
|
+
1. 调用 \`mcp_execute_tool\` 工具读取文本层:
|
|
205
140
|
- server_name: "pdf-reader"
|
|
206
141
|
- tool_name: "read_pdf_text"
|
|
207
142
|
- arguments: { "file_path": "${filePath}" }
|
|
208
143
|
|
|
209
|
-
2.
|
|
144
|
+
2. 调用 \`mcp_execute_tool\` 工具读取图片和表格(OCR):
|
|
145
|
+
- server_name: "pdf-reader"
|
|
146
|
+
- tool_name: "read_by_ocr"
|
|
147
|
+
- arguments: { "file_path": "${filePath}", "language": "${language}", "dpi": 300 }
|
|
148
|
+
|
|
149
|
+
3. 将两次读取的内容合并(文本层 + OCR内容)
|
|
210
150
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
151
|
+
4. 保存合并后的内容到:\`${outputMdPath}\`
|
|
152
|
+
|
|
153
|
+
5. 保存完成后,重新调用 \`generate_requirements\` 工具`,
|
|
154
|
+
needsAction: {
|
|
155
|
+
type: "read_pdf",
|
|
156
|
+
instruction: `必须调用 pdf-reader MCP 的两个工具读取 PDF:
|
|
215
157
|
1. 调用 mcp_execute_tool,使用 pdf-reader 的 read_pdf_text 工具,参数为 { "file_path": "${filePath}" }
|
|
216
|
-
2.
|
|
217
|
-
3.
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
158
|
+
2. 调用 mcp_execute_tool,使用 pdf-reader 的 read_by_ocr 工具,参数为 { "file_path": "${filePath}", "language": "${language}", "dpi": 300 }
|
|
159
|
+
3. 将两次读取的内容合并(text + ocr)
|
|
160
|
+
4. 保存合并后的内容到文件:${outputMdPath}
|
|
161
|
+
5. 保存完成后重新调用 generate_requirements 工具(不要把文件内容放在上下文中)`,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
221
164
|
}
|
|
222
165
|
}
|
|
223
166
|
|
|
@@ -225,7 +168,7 @@ export async function processRequirementDocument(
|
|
|
225
168
|
if (ext === "md" || ext === "markdown") {
|
|
226
169
|
const projectRoot = getProjectRoot(filePath);
|
|
227
170
|
const outputMdPath = buildOutputPath(featureName, outputFileName, projectRoot);
|
|
228
|
-
|
|
171
|
+
|
|
229
172
|
debugLog(`准备保存 Markdown 文件`, {
|
|
230
173
|
inputPath: filePath,
|
|
231
174
|
outputPath: outputMdPath,
|
|
@@ -233,21 +176,21 @@ export async function processRequirementDocument(
|
|
|
233
176
|
isAbsolute: path.isAbsolute(filePath),
|
|
234
177
|
resolvedPath: path.resolve(filePath)
|
|
235
178
|
});
|
|
236
|
-
|
|
179
|
+
|
|
237
180
|
// 读取 Markdown 内容
|
|
238
181
|
const content = await fs.readFile(filePath, "utf-8");
|
|
239
182
|
debugLog(`成功读取文件内容`, { contentLength: content.length });
|
|
240
|
-
|
|
183
|
+
|
|
241
184
|
// 保存到固定位置
|
|
242
185
|
const outputDir = path.dirname(outputMdPath);
|
|
243
186
|
debugLog(`准备创建目录`, { outputDir });
|
|
244
187
|
await fs.mkdir(outputDir, { recursive: true });
|
|
245
188
|
debugLog(`目录创建成功`, { outputDir });
|
|
246
|
-
|
|
189
|
+
|
|
247
190
|
debugLog(`准备写入文件`, { outputPath: outputMdPath });
|
|
248
191
|
await fs.writeFile(outputMdPath, content, "utf-8");
|
|
249
192
|
debugLog(`文件写入成功`, { outputPath: outputMdPath });
|
|
250
|
-
|
|
193
|
+
|
|
251
194
|
return {
|
|
252
195
|
success: true,
|
|
253
196
|
content,
|