bmall-mcp 1.8.6 → 1.8.8
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 +11 -0
- package/dist/tools/requirements/requirement-processor.d.ts.map +1 -1
- package/dist/tools/requirements/requirement-processor.js +31 -67
- package/dist/tools/requirements/requirement-processor.js.map +1 -1
- package/package.json +1 -1
- package/src/tools/requirements/requirement-processor.ts +46 -80
package/README.md
CHANGED
|
@@ -204,6 +204,17 @@ src/
|
|
|
204
204
|
|
|
205
205
|
## Changelog
|
|
206
206
|
|
|
207
|
+
### v1.8.8 (2026-03-16)
|
|
208
|
+
- ✅ 优化PDF读取流程:同时使用read_pdf_text和read_by_ocr两个工具
|
|
209
|
+
- ✅ 简化流程:不再输出中间文件,直接合并到origin-requirement.md
|
|
210
|
+
- ✅ 提升效率:一次调用完成两个工具读取,减少交互次数
|
|
211
|
+
- ✅ 确保完整性:文本层+OCR内容合并,不遗漏任何信息
|
|
212
|
+
|
|
213
|
+
### v1.8.7 (2026-03-16)
|
|
214
|
+
- ✅ 优化PDF处理指令:明确指示AI调用mcp_execute_tool工具
|
|
215
|
+
- ✅ 完善PDF读取提示:提供完整的工具调用参数和格式
|
|
216
|
+
- ✅ 确保AI理解需要调用MCP工具并保存结果
|
|
217
|
+
|
|
207
218
|
### v1.8.6 (2026-03-16)
|
|
208
219
|
- ✅ 修复 TypeScript 编译错误:删除多余的 `}` 语法错误
|
|
209
220
|
- ✅ 修复设计稿处理逻辑中的代码结构问题
|
|
@@ -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,79 +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
|
-
|
|
112
|
-
- 读取 \`${textPath}\` 的内容
|
|
113
|
-
- 读取 \`${ocrPath}\` 的内容
|
|
114
|
-
- 将两者合并保存到 \`${outputMdPath}\`
|
|
107
|
+
请执行以下操作:
|
|
115
108
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
1. 读取 ${textPath} 的内容
|
|
121
|
-
2. 读取 ${ocrPath} 的内容
|
|
122
|
-
3. 将两者合并保存到 ${outputMdPath}
|
|
123
|
-
4. 保存文件
|
|
124
|
-
5. 重新调用 generate_requirements 工具(不要把文件内容放在上下文中)`,
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
// 只有text文件存在,进行OCR
|
|
130
|
-
const fileName = filePath.split('/').pop() || '';
|
|
131
|
-
const isChinese = /[\u4e00-\u9fa5]/.test(fileName);
|
|
132
|
-
const language = isChinese ? 'chi_sim' : 'eng';
|
|
133
|
-
debugLog(`发现text文件,准备OCR`);
|
|
134
|
-
return {
|
|
135
|
-
success: false,
|
|
136
|
-
message: `✅ PDF 文本层已提取(${textPath}),现在进行 OCR
|
|
109
|
+
1. 调用 \`mcp_execute_tool\` 工具读取文本层:
|
|
110
|
+
- server_name: "pdf-reader"
|
|
111
|
+
- tool_name: "read_pdf_text"
|
|
112
|
+
- arguments: { "file_path": "${filePath}" }
|
|
137
113
|
|
|
138
|
-
|
|
139
|
-
-
|
|
140
|
-
-
|
|
141
|
-
-
|
|
142
|
-
- 保存到:\`${ocrPath}\`
|
|
114
|
+
2. 调用 \`mcp_execute_tool\` 工具读取图片和表格(OCR):
|
|
115
|
+
- server_name: "pdf-reader"
|
|
116
|
+
- tool_name: "read_by_ocr"
|
|
117
|
+
- arguments: { "file_path": "${filePath}", "language": "${language}", "dpi": 300 }
|
|
143
118
|
|
|
144
|
-
|
|
145
|
-
needsAction: {
|
|
146
|
-
type: "read_pdf",
|
|
147
|
-
instruction: `使用 PDF Reader MCP 的 read_by_ocr 工具读取 ${filePath},设置 language="${language}",dpi=300,保存到 ${ocrPath}。完成后立即保存文件,然后重新调用 generate_requirements 工具。不要把文件内容放在上下文中,避免上下文过长。`,
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
// 还没有任何文件,先提取文本
|
|
154
|
-
debugLog(`未发现中间文件,先提取文本层`);
|
|
155
|
-
return {
|
|
156
|
-
success: false,
|
|
157
|
-
message: `📄 检测到 PDF 文件
|
|
119
|
+
3. 将两次读取的内容合并(文本层 + OCR内容)
|
|
158
120
|
|
|
159
|
-
|
|
160
|
-
- 优势:快速、准确、保留原始格式
|
|
161
|
-
- 保存到:\`${textPath}\`
|
|
121
|
+
4. 保存合并后的内容到:\`${outputMdPath}\`
|
|
162
122
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
123
|
+
5. 保存完成后,重新调用 \`generate_requirements\` 工具`,
|
|
124
|
+
needsAction: {
|
|
125
|
+
type: "read_pdf",
|
|
126
|
+
instruction: `必须调用 pdf-reader MCP 的两个工具读取 PDF:
|
|
127
|
+
1. 调用 mcp_execute_tool,使用 pdf-reader 的 read_pdf_text 工具,参数为 { "file_path": "${filePath}" }
|
|
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
|
+
};
|
|
170
134
|
}
|
|
171
135
|
}
|
|
172
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,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,80 +121,46 @@ export async function processRequirementDocument(
|
|
|
121
121
|
};
|
|
122
122
|
} catch {
|
|
123
123
|
// 文件不存在,需要处理
|
|
124
|
-
debugLog(
|
|
125
|
-
|
|
126
|
-
//
|
|
127
|
-
const
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
-
|
|
142
|
-
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
5.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
success: false,
|
|
165
|
-
message: `✅ PDF 文本层已提取(${textPath}),现在进行 OCR
|
|
166
|
-
|
|
167
|
-
**步骤 2:使用 \`read_by_ocr\` 提取图片和表格**
|
|
168
|
-
- 优势:可提取图片、表格、扫描件等非文本内容
|
|
169
|
-
- 语言:\`${language}\`(中文文档使用 \`chi_sim\`,英文使用 \`eng\`)
|
|
170
|
-
- DPI:\`300\`(默认值)
|
|
171
|
-
- 保存到:\`${ocrPath}\`
|
|
172
|
-
|
|
173
|
-
⚠️ **重要**:OCR完成后立即保存文件,不要把文件内容放在上下文中。保存后重新调用本工具。`,
|
|
174
|
-
needsAction: {
|
|
175
|
-
type: "read_pdf",
|
|
176
|
-
instruction: `使用 PDF Reader MCP 的 read_by_ocr 工具读取 ${filePath},设置 language="${language}",dpi=300,保存到 ${ocrPath}。完成后立即保存文件,然后重新调用 generate_requirements 工具。不要把文件内容放在上下文中,避免上下文过长。`,
|
|
177
|
-
},
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
} catch {
|
|
181
|
-
// 还没有任何文件,先提取文本
|
|
182
|
-
debugLog(`未发现中间文件,先提取文本层`);
|
|
183
|
-
return {
|
|
184
|
-
success: false,
|
|
185
|
-
message: `📄 检测到 PDF 文件
|
|
186
|
-
|
|
187
|
-
**步骤 1:使用 \`read_pdf_text\` 提取文本层**
|
|
188
|
-
- 优势:快速、准确、保留原始格式
|
|
189
|
-
- 保存到:\`${textPath}\`
|
|
190
|
-
|
|
191
|
-
⚠️ **重要**:文本提取完成后立即保存文件,不要把文件内容放在上下文中。保存后重新调用本工具。`,
|
|
192
|
-
needsAction: {
|
|
193
|
-
type: "read_pdf",
|
|
194
|
-
instruction: `使用 PDF Reader MCP 的 read_pdf_text 工具读取 ${filePath},保存到 ${textPath}。完成后立即保存文件,然后重新调用 generate_requirements 工具。不要把文件内容放在上下文中,避免上下文过长。`,
|
|
195
|
-
},
|
|
196
|
-
};
|
|
197
|
-
}
|
|
124
|
+
debugLog(`输出文件不存在,需要处理PDF`, { outputMdPath });
|
|
125
|
+
|
|
126
|
+
// 检测语言
|
|
127
|
+
const fileName = filePath.split('/').pop() || '';
|
|
128
|
+
const isChinese = /[\u4e00-\u9fa5]/.test(fileName);
|
|
129
|
+
const language = isChinese ? 'chi_sim' : 'eng';
|
|
130
|
+
|
|
131
|
+
debugLog(`准备提取PDF内容`, { filePath, language });
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
message: `📄 检测到 PDF 文件,需要提取完整内容
|
|
136
|
+
|
|
137
|
+
请执行以下操作:
|
|
138
|
+
|
|
139
|
+
1. 调用 \`mcp_execute_tool\` 工具读取文本层:
|
|
140
|
+
- server_name: "pdf-reader"
|
|
141
|
+
- tool_name: "read_pdf_text"
|
|
142
|
+
- arguments: { "file_path": "${filePath}" }
|
|
143
|
+
|
|
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内容)
|
|
150
|
+
|
|
151
|
+
4. 保存合并后的内容到:\`${outputMdPath}\`
|
|
152
|
+
|
|
153
|
+
5. 保存完成后,重新调用 \`generate_requirements\` 工具`,
|
|
154
|
+
needsAction: {
|
|
155
|
+
type: "read_pdf",
|
|
156
|
+
instruction: `必须调用 pdf-reader MCP 的两个工具读取 PDF:
|
|
157
|
+
1. 调用 mcp_execute_tool,使用 pdf-reader 的 read_pdf_text 工具,参数为 { "file_path": "${filePath}" }
|
|
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
|
+
};
|
|
198
164
|
}
|
|
199
165
|
}
|
|
200
166
|
|
|
@@ -202,7 +168,7 @@ export async function processRequirementDocument(
|
|
|
202
168
|
if (ext === "md" || ext === "markdown") {
|
|
203
169
|
const projectRoot = getProjectRoot(filePath);
|
|
204
170
|
const outputMdPath = buildOutputPath(featureName, outputFileName, projectRoot);
|
|
205
|
-
|
|
171
|
+
|
|
206
172
|
debugLog(`准备保存 Markdown 文件`, {
|
|
207
173
|
inputPath: filePath,
|
|
208
174
|
outputPath: outputMdPath,
|
|
@@ -210,21 +176,21 @@ export async function processRequirementDocument(
|
|
|
210
176
|
isAbsolute: path.isAbsolute(filePath),
|
|
211
177
|
resolvedPath: path.resolve(filePath)
|
|
212
178
|
});
|
|
213
|
-
|
|
179
|
+
|
|
214
180
|
// 读取 Markdown 内容
|
|
215
181
|
const content = await fs.readFile(filePath, "utf-8");
|
|
216
182
|
debugLog(`成功读取文件内容`, { contentLength: content.length });
|
|
217
|
-
|
|
183
|
+
|
|
218
184
|
// 保存到固定位置
|
|
219
185
|
const outputDir = path.dirname(outputMdPath);
|
|
220
186
|
debugLog(`准备创建目录`, { outputDir });
|
|
221
187
|
await fs.mkdir(outputDir, { recursive: true });
|
|
222
188
|
debugLog(`目录创建成功`, { outputDir });
|
|
223
|
-
|
|
189
|
+
|
|
224
190
|
debugLog(`准备写入文件`, { outputPath: outputMdPath });
|
|
225
191
|
await fs.writeFile(outputMdPath, content, "utf-8");
|
|
226
192
|
debugLog(`文件写入成功`, { outputPath: outputMdPath });
|
|
227
|
-
|
|
193
|
+
|
|
228
194
|
return {
|
|
229
195
|
success: true,
|
|
230
196
|
content,
|