重做客户端“导入招标文件/标书解析”页面:标题显示配置中的文件解析方式;页面主体用 Markdown 渲染上传招标文件直接提取出的内容;三种解析方式参考 tools/mineru-agent-demo/、tools/mineru-accurate-demo/、tools/doc2markdown-node/,优先完整还原 Node 版本地解析链路。
| Error | Attempt | Resolution |
|---|
| technicalPlanStorage.load() 返回值包含 undefined 导致 TypeScript 构建失败 | 第一次 npm run build | 将返回值归一为 state || null |
将技术方案流程中用到的缓存从 Renderer localStorage 迁移到 Electron Main 侧文件存储,并更新 client/开发说明.md 的数据存储约定。
严格参照 backend /api/outline/generate-stream 的 OutlineService 和 OpenAIUtil.collect_json_response(),降低 client Step03 目录生成失败率。
aiService.cjs 中迁移生成、解析、校验、修复、重试一体化机制。outlineGenerationTask.cjs 中迁移 backend prompt、标准化 schema 和 validator。collectJsonResponse 执行修复和重试。npm run build 验证。实现客户端 Step04“生成正文”:参考 backend /api/content/generate-chapter-stream 为目录叶子章节生成正文;页面左侧显示目录树和生成状态,右侧显示正文内容;展示全局统计;技术方案 toolbar 在 Step04 改为“导出 Word”和“继续扩写”。
ContentEditPage 为左目录树、右正文阅读器、全局统计和生成入口。npm run build 验证。outlineData.outline[*].content,导出 Word 直接复用这份结构。| Error | Attempt | Resolution |
|---|
先修复已暴露的正文生成体验问题:规范 <br> 换行、去掉图例中的“AI 生成示意”、图片和图例居中、支持图片全屏查看,并在开发者模式下显示配图统计。
<br>,并强化 Prompt 禁止随机 Mermaid 和 HTML 换行。图:xxx,前端和 Word 导出中图片/图例居中。npm run build、正文任务 smoke test、Word <br> 导出 smoke test 和 git diff --check。<br> 统一规范为 <br />,前端通过 rehypeRaw 渲染换行,Word 导出把 <br /> 转为真实 Word 换行。| Error | Attempt | Resolution |
|---|---|---|
SettingsPage.tsx 导入 ImageModelStatus 时报共享类型入口未导出 |
第一次 npm run build |
在 client/src/shared/types/index.ts 补导出 ImageModelStatus |
将 Step04 正文导出 Word 从“浅层 Markdown 文本处理”升级为“Markdown AST 到 Word 原生结构转换”,确保图片、表格、加粗、列表等 Markdown 语法在 .docx 中真实还原,而不是直接输出 Markdown 源文本。
exportService.cjs 手写 docx XML 和 Markdown 正则解析实现。docx、unified、remark-parse、remark-gfm、image-size。exportWord(payload) IPC 和保存对话框,不改 Renderer 调用链路。npm run build、npm audit 和 git diff --check 验证。docx 对象模型保证后续排版可控。data:image/*;base64、http/https、file://、绝对路径和相对路径。统一 Step02/Step03/Step04 左侧进度区域视觉和交互:Step02、Step03 使用 Step04 的 content-outline-stats 可折叠结构,并保持任务列表、生成日志和正文区域独立滚动。
content-outline-stats。content-outline-stats。.outline-ai-*、.bid-analysis-progress-* 未引用样式。npm run build 和 git diff --check 验证。
| 普通 Node 环境 require updateService.cjs 时 electron-updater 立即访问 Electron app 并报 Cannot read properties of undefined (reading 'getVersion') | 第一次模块加载验证 | 将 electron-updater 改为 setupAutoUpdate() 内、且 app.isPackaged 后懒加载 |
| Windows 本地打包解压 winCodeSign 时因当前用户无符号链接权限失败 | 第一次 Windows unpacked 打包验证 | 当前阶段不做签名,关闭 win.signAndEditExecutable,避免触发 winCodeSign 资源编辑链路 |
| Actions 成功但 Release 没有产物 | 首次 v2.0.1 远程发布验证 | 改为 electron-builder --publish never 只构建,再用 gh release upload --clobber 显式上传产物,避免 existingType=release publishingType=draft 冲突 |
| Release 说明只有 Full Changelog | 首次 v2.0.1 远程发布验证 | 改为 workflow 用 git log 生成提交列表,并在 Release 已存在时用 gh release edit --notes-file 更新说明 |
| Actions Build renderer 报 TS2688: Cannot find type definition file for 'plist' | 修复后手动重跑 v2.0.1 | 显式安装 @types/plist,并在 workflow 中补 npm install --no-save @types/plist 兼容旧 tag |按讨论定版方案重构知识库上传分析:程序预筛并保留 filtered_blocks.json,将正文切为 block,AI 两轮抽取知识条目,调试页设置每批匹配条目数,分批用稳定前缀提交全文 block 匹配段落范围,补漏最多两轮,程序回填正文生成最终知识条目、舍弃段落和处理报告。
npm run build 验证。filtered_blocks.json 调试日志。| Error | Attempt | Resolution |
|---|---|---|
planning skill 示例路径 ~/.opencode/.../session-catchup.py 不存在 |
第一次 catchup | 改用实际路径 ~/.config/opencode/.../session-catchup.py |
git diff --check 报 client/doc/知识库设计.md:63: new blank line at EOF |
收尾检查 | 该文件非本次修改,按工作区保护规则未改动;本次修改文件仅有 LF/CRLF 提示 |
在标书查重中新增纯程序目录查重:元数据提取完成后自动开始目录分析;基于已提取 Markdown 目录,不接 AI;招标文件只用于句子白名单,命中的投标目录项不计重复;投标文件之间做多级目录重复和相似度对比。
duplicate-check/contents/*.md。| Error | Attempt | Resolution |
|---|
| planning skill 示例路径 ~/.opencode/.../session-catchup.py 不存在 | 第一次 catchup | 改用实际路径 ~/.config/opencode/.../session-catchup.py |
| git diff --check 报 client/doc/标书查重.md:54 trailing whitespace | 收尾检查 | 该文件是既有/用户改动,本轮未修改,按工作区保护规则未处理;本轮修改文件仅有 LF/CRLF 提示 |
基于 Cloudflare KV 在 analytics/ 增加可管理的 Markdown 公告通道;客户端与现有 30 分钟版本检查共用轮询,但公告用独立弹窗展示,关闭后同一公告不再显示,除非后台发布新公告。
NOTICE_STORE。| Error | Attempt | Resolution |
|---|---|---|
planning skill 示例路径 ~/.opencode/.../session-catchup.py 不存在 |
第一次 catchup | 改用实际路径 ~/.config/opencode/.../session-catchup.py |
Dashboard 脚本检查命令报 Unterminated regexp literal |
第一次 Dashboard 检查 | PowerShell/Node -e 中正则字面量转义导致,改用字符串索引提取 <script> 内容 |
remoteNotice.ts 构建报 enabled 类型比较恒定 |
第一次 npm run build |
normalizeNotice() 过滤停用公告后直接归一为 enabled: true |
为 client/ 接入基于 GitHub Actions 的 Windows/macOS 自动打包和 GitHub Release 发布;Release 由 v* tag 触发并自动生成说明;客户端打包后启动时检查 GitHub Release 更新,询问用户是否下载并安装。当前阶段不做代码签名。
electron-builder、electron-updater。app.whenReady()。client/开发说明.md 发布与更新说明。v*,不加 client- 前缀。generate-notes 生成。app.isPackaged 打包应用中启用,开发模式跳过。| Error | Attempt | Resolution |
|---|---|---|
contentGenerationTask.cjs 中 ?? 和 ` |
` 混用导致 CJS 语法错误 |
优化客户端全局底部 FloatingToolbar:增加按住拖动图标并支持拖动位置;排查页面布局,让内容占满窗口且消除全局滚动条,页面内部自行滚动;同步更新 client/开发说明.md。
| Error | Attempt | Resolution |
|---|
优化 Step04 正文生成:让文本模型先做章节编排决策,自然决定是否生成表格和是否配图;只有设置页生图模型明确测试可用时才调用生图接口生成图片并插入正文;预览和 Word 导出都能显示这些生成图片。
yibiao-asset://generated-images/... 预览协议和 Word 导出读取支持。npm run build 和 git diff --check 验证。status === 'available' 时参与正文配图;用户修改生图配置后状态重置为 untested。| Error | Attempt | Resolution |
|---|
完成正文生成配置弹窗、Mermaid/AI 生图互斥、AI 生图整体择优,并修复 Mermaid 图片在预览 URL 与 Word 导出中的 mermaid.ink 编码和失败处理。
npm run build 和 git diff --check。pako: 编码使用 zlib.deflateSync(JSON.stringify({ code, mermaid: { theme: 'default' } })) + base64url。| Error | Attempt | Resolution |
|---|---|---|
| 正文任务 smoke test 正则未提取到 Markdown 图片 URL | 第一次正文任务 URL 验证 | 改用字符串下标截取 URL |
fake Mermaid 代码把 \\n 当作字面字符导致 mermaid.ink 返回 400 |
第二次正文任务 URL 验证 | 使用真实换行构造 Mermaid 代码 |
实现 Mermaid 前端本地渲染,保留 Word 导出时通过 mermaid.ink 转图片;为导出过程增加友好提示、进度条、失败日志和导出后核对提示。
mermaid 代码块,并在前端用 Mermaid 动态渲染。export:word 增加进度事件、Renderer 进度弹窗和导出友好提示。npm run build 和 git diff --check。mermaid 代码块,方便前端本地渲染和人工编辑。warnings,并在导出弹窗中展示。| Error | Attempt | Resolution |
|---|
修复评审指出的正文编排单点失败阻断全文生成、WebP 生成图无法导出 Word、rehypeRaw 预览与 Word 导出不一致风险。
nativeImage 转 PNG 后插入 docx。br、img、table、列表、引用、粗体、斜体、代码等。npm run build 和 git diff --check 验证。rehypeRaw,因为这是当前明确需求;通过增强 Word 导出支持来减少预览/导出差异。docx 默认 content type 不支持 WebP;导出前统一转 PNG。| Error | Attempt | Resolution |
|---|---|---|
普通 Node 进程中 electron.nativeImage 不可用,WebP smoke test 只能走 warning |
WebP Node smoke test | 保留 Electron Main 运行时 nativeImage 转 PNG;Node 环境仅验证失败不崩溃 |
将正文生成进度拆为编排进度和生成进度:编排阶段先显示绿色编排进度,并将目录待生成状态改为编排中;编排完成后再切回正文生成进度。
content.phase、编排总数/完成数、生成总数/完成数。npm run build 和 git diff --check。task.stats.content.phase === 'planning' 派生显示“编排中”。| Error | Attempt | Resolution |
|---|
在不改流式 chunk 保存节流的前提下,降低 Step04 生成中和生成后 UI 卡顿:减少重复事件、避免目录统计重复递归、避免无关状态变化触发 Markdown 重解析,并限制 UI 日志体积。
renderTree() 直接读取缓存。memo 组件,只有正文内容变化才重新解析。event.task。npm run build 和 git diff --check。| Error | Attempt | Resolution |
|---|---|---|
buildOutlineMeta() 中叶子状态推断成 string 导致 TypeScript 构建失败 |
第一次 npm run build |
显式标注 status: TreeStatus 和 nodeMeta: OutlineNodeMeta |
点击“重新生成正文”应表示全文重新生成:开始前清空进度和已生成正文,不影响单章重新生成入口。
contentGenerationSections 和 contentGenerationTask 并持久化。regenerate 二次兜底清空 outline content,并用空 sections 计算初始进度。npm run build 和 git diff --check。| Error | Attempt | Resolution |
|---|
正文生成阶段在写入 Mermaid 代码块前先校验渲染结果;渲染失败时调用文本模型按错误信息最多修复 3 轮,仍失败则取消该 Mermaid 配图并保留正文,避免错误代码进入正文缓存。
npm run build、git diff --check 并更新进度记录。appendMermaidImageMarkdown() 之前。| Error | Attempt | Resolution |
|---|---|---|
planning skill 示例路径指向 $USERPROFILE\.opencode,本机实际在 .config\opencode |
第一次 session catchup | 改用 $USERPROFILE\.config\opencode\skills\... 成功运行 |
PowerShell 中直接用复杂 node -e smoke test 时引号被剥离,Node 误把 --> 当成参数 |
第一次 Mermaid smoke test | 改用临时 .cjs smoke 文件运行,验证完成后删除 |
| 修复成功 smoke test 预期修复 1 次,但 fetch stub 首次返回失败导致进入第 2 轮 | 第一次临时 smoke test | 调整 stub:初始失败由前端兼容规则触发,修复后首次 fetch 直接返回 PNG |
将 Mermaid 图和 AI 生图从正文生成中拆到独立配图阶段;编排阶段允许同一章节同时成为 AI 生图和 Mermaid 候选;配图阶段优先按 AI 生图上限选择章节,未入选 AI 但具备 Mermaid 候选的章节降级为 Mermaid。AI 生图并发 2,Mermaid 校验/修复并发 5;AI 入选后生图失败不再降级 Mermaid。
runOne() 正文生成中拆出,新增独立配图任务分配与执行。illustrating 和前端显示。npm run build 和 git diff --check。| Error | Attempt | Resolution |
|---|
修复正文预览正常但 Word 导出异常的问题:Markdown 表格在导出时应稳定识别为 Word 表格;不同正文块中的有序列表编号应独立,不再跨块连续计数。
exportService.cjs 中 Markdown 解析、表格识别和有序列表 numbering reference 使用方式。<w:tbl>,两段独立有序列表使用不同 numId。npm run build 和 git diff --check 验证。ol 或 Markdown ordered list 创建自己的 numbering reference。Document 的 numbering 配置在正文转换完成后按实际用到的 reference 动态生成;没有有序列表时不写 numbering 配置。| Error | Attempt | Resolution |
|---|
修复导出 Word 时仍有一个 Markdown 表格未转换的问题:模型将 GFM 分隔行 | :--- | ... | 和第一行/多行数据压到同一行,导致 remark-gfm 无法识别表格。
normalizeMarkdownTablesForDocx():按表头列数拆分压缩的分隔行和数据行。<w:tbl>、表格行数正确且不保留 :--- 文本。npm run build 和 git diff --check 验证。| Error | Attempt | Resolution |
|---|
调整单章重新生成流程:优先复用全文生成时保存的编排结果,不再默认重新编排;如果历史编排缺失,则只对当前小节执行一次编排,然后重新生成正文并按编排结果重新配图。
contentGenerationPlans 持久化字段和前端状态类型。ai、mermaid 或 none。planAll() 和 planOne()。npm run build 和 git diff --check。contentGenerationPlans 存在 technical_plan.json 根级,与 contentGenerationSections 同级。ai,Mermaid 执行为 mermaid,未配图为 none。contentGenerationPlans,避免复用过期目录的编排。| Error | Attempt | Resolution |
|---|
修复评审指出的 Word 导出预览不一致问题:div、section、article 等 HTML 容器中包裹表格、列表、图片等块级内容时,应递归导出为 Word 原生结构,而不是压平成普通文本。
exportService.cjs 中 HTML 节点导出路径,确认评审命中真实问题。htmlNodesToDocxBlocks()。div/section/article 的原段落导出行为,避免不必要的段落拆分。npm run build 和 git diff --check。htmlInlineRuns() 输出单段落。p 内如果出现表格、列表、图片等块级子节点,也拆块递归处理。| Error | Attempt | Resolution |
|---|
修复 Markdown 列表项中的缩进表格导出 Word 时未被识别的问题。列表项内的 GFM 表格应保留缩进,让 remark-gfm 能识别为表格 AST,并最终导出为 Word 原生表格。
expandInlineMarkdownTableRows() 会丢掉分隔行前的列表缩进。exportService 模块加载、npm run build 和 git diff --check。| 前只有空白的表格行保留原缩进;对 表题 | 表头 | ... 这类文本前缀仍按“正文 + 表格”拆分。| Error | Attempt | Resolution |
|---|
将 Step03 目录生成改为弹窗式配置:在弹窗内选择生成方式和本次参考知识库文档;页面原有生成方式切换去掉。本轮只做页面和前端状态,不改目录生成后台逻辑。
OutlineEditPage:生成按钮打开配置弹窗,弹窗内选择生成方式和知识库文档。| Error | Attempt | Resolution |
|---|
完整接入 Step03 目录生成参考知识库:用户选择知识库文档后,目录生成仅在二三级目录阶段读取并参考选中文档的轻量知识条目,目录节点只保存 knowledge_item_ids,引用 ID 使用 document_id::item_id 避免跨文件冲突。
knowledge_item_ids。id/title/resume,不读取正文内容。knowledge_item_ids,不增加 knowledge_usage_hint。document_id::item_id。knowledge_item_ids 时过滤掉,不让引用字段影响目录生成主流程。| Error | Attempt | Resolution |
|---|---|---|
node -e smoke test 因 PowerShell 字符串转义导致 SyntaxError: Unexpected end of input |
第一次目录知识引用 smoke test | 改用不含 JSON 字符串比较的断言写法重跑 |
第二次 smoke test 中非法 bad-id 未被过滤 |
第二次目录知识引用 smoke test | 定位为 fake AI 未执行 request.normalizer;同时在目录合并阶段增加全局知识 ID 过滤作为双重保护 |
自由模式知识库边界 smoke test 触发 完整目录至少需要三级结构 |
第一次自由模式 smoke test | fake AI 只返回二级目录,补充三级节点后重跑 |
将 Step03 知识库应用方式改为:先完全按原目录生成逻辑生成完整目录,不参考知识库;再把完整目录和选中知识库轻量条目交给 AI,让 AI 只返回二三级目录补充 Patch(bindings/additions),程序应用补丁并全局去重 knowledge_item_ids。
bindings 和 additions,不允许返回完整 outline。knowledge_item_id 在整份目录中最多保留一次。| Error | Attempt | Resolution |
|---|---|---|
PowerShell 长 node -e smoke test 中双引号被吞导致 SyntaxError: Unexpected token '.' |
第一次 Patch 流程 smoke test | 改用临时 .cjs 文件运行 smoke test,执行后删除临时文件 |
修复知识库目录 Patch 中模型照抄 document_id::K000001 占位 ID、将新增节点挂到三级目录导致全部过滤的问题;强化提示词,提供真实白名单,并让非法 Patch 进入 JSON 修复流程,同时在开发者模式下输出校验与应用日志。
collectJsonResponse 的 JSON 修复链路处理。npm run build 和 git diff --check。additions.parent_id;如果模型想补充三级目录,应绑定该三级目录或挂到其父级二级目录。| Error | Attempt | Resolution |
|---|
将 Step03 完整目录后的知识库增强从 bindings/additions + knowledge_item_ids 改为 additions-only:知识库只作为参考材料,AI 只输出缺失三级目录,程序把新增目录追加到现有二级目录下并统一编号,不再写入任何 knowledge_item_ids。
parent_id 只允许最终指向现有二级目录;如果模型误填三级目录,程序自动上提到其父级二级目录。| Error | Attempt | Resolution |
|---|---|---|
additions-only smoke test 中完整目录 fake AI 返回旧编号,导致补目录阶段找不到 1.1 |
第一次 smoke test | 将 fake 完整目录 ID 改为真实 1、1.1、1.1.1 后重跑通过 |
在现有每个叶子节点的正文编排 JSON 中增加 knowledge.item_ids,编排阶段只提交知识库 id/title/resume,不提交知识库正文;不做单独全局知识库分配,不限制同一知识条目被多个叶子节点复用。
contentGenerationPlans 落盘结构和知识库轻量引用读取方式。ContentGenerationPlanData 与 Main 侧 normalizeContentPlan(),支持 knowledge.item_ids。knowledge.item_ids 只从清单 ID 中选择。reference_knowledge_document_ids,并复用知识库轻量条目读取服务。npm run build 和 git diff --check。reason;只落盘 knowledge.item_ids。| Error | Attempt | Resolution |
|---|
只补充两类统计:活跃与留存、配置使用情况。客户端异步上报匿名配置状态,不采集 API Key、Base URL、模型名、文件名、路径、文档内容或生成内容;统计页展示活跃客户端、留存概览和配置分布。
analytics_created_at、config_usage、配置字段白名单。/track、/api/summary,新增 /api/retention 与 /api/config-usage。client_id 和 analytics_created_at 都存入 Electron userData/user_config.json。analytics_created_at cohort 和 app_open 活跃事件计算;缺少创建日期的旧事件不参与留存。| Error | Attempt | Resolution |
|---|---|---|
PowerShell 中首次 node -e smoke test 使用外层单引号导致传给 Node 的 JS 字符串引号被剥离 |
第一次 smoke test | 改用外层双引号、JS 字符串使用单引号后重跑通过 |
在正文生成阶段消费编排结果中的 knowledge.item_ids:程序读取对应知识条目的 content,并在正文生成 prompt 中只注入 content,不暴露知识库 ID、标题、简介或来源字段;素材消息放在章节动态信息之前以保持缓存友好。
documentId::itemId 定位 items.json 中的 content。runOne() 中按当前小节 contentPlan.knowledge.item_ids 解析正文素材并传入正文生成 prompt。npm run build 和 git diff --check。content,不传 id/title/resume/source_file/source_block_ids。| Error | Attempt | Resolution |
|---|
补充知识库开发者模式渲染调试日志,覆盖从点击“查看条目/Markdown”到 IPC 读取、状态更新、条目列表渲染、DOM 提交和下一帧可见的完整链路,用于定位用户感知慢点。
openDocument() 读取链路日志和内容规模统计。查看原文,先用日志确认慢点位于读取、IPC、JSON 解析、列表渲染还是单条原文渲染。| Error | Attempt | Resolution |
|---|---|---|
collectItemsContentMetrics() 返回的 metrics 被 TypeScript 推断成不含 chars 的窄类型 |
第一次 npm run build |
将集合指标显式声明为 Record<string, number> 后重跑构建通过 |
将知识库“查看原文”从页面内替换/跳转改为弹窗,关闭后保持条目列表 DOM 和滚动位置,避免用户在列表底部查看原文后回到顶部。
npm run build 验证。openSourceItem()、closeSourceItem()、sourceTrace 和 sourceRendering 调试链路。| Error | Attempt | Resolution |
|---|
实现标书查重 Step02 的元数据子模块:首次从 Step01 进入 Step02 时自动启动分析;正文内容提取和投标文件元数据提取并发执行,两条任务内部按文件线性处理;正文提取保留图片;元数据横向对比并标红重复项。
preserveImages: true,按文件独立资源 scope 保存内容。duplicate-check-content-<fileId> 前缀,便于重置时清理。force: true 强制重跑当前文件批次。| Error | Attempt | Resolution |
|---|---|---|
TypeScript 报 file is possibly null |
第一次 npm run build |
在计算签名前先构造 LocalFileSelection[],避免 filter(Boolean) 后类型未收窄 |
增强标书查重元数据读取能力,重点覆盖 .wps/.doc 的 OLE/HPSF 文档属性、LibreOffice 转 .docx 后的补充属性,以及 PDF 全量 Info/XMP/原始记录;尽可能识别 WPS/Kingsoft/账号相关痕迹。
cfb 依赖并确认 CommonJS API 可用。withLegacyWordDocxFile() 供元数据流程复用。SummaryInformation、DocumentSummaryInformation 和自定义属性。.doc/.wps 元数据流程改为原始 OLE 属性 + 转换 DOCX 属性补充,失败时保留已读字段并记录 metadata_error。info、可迭代 XMP、fingerprints、permissions 和原始 /Author 等记录。converted_docx:、pdf_info:、pdf_xmp:、pdf_raw:、ole_signal:、wps: 前缀参与横向比较。npm run build、npm audit 和 git diff --check。.doc/.wps 转 DOCX 失败不阻断 OLE 元数据结果;同时在表格中写入 metadata_error 说明失败原因。pdf_info:* / pdf_xmp:* / pdf_raw:* 展开来源字段。| Error | Attempt | Resolution |
|---|---|---|
planning skill 示例路径 ~/.opencode/.../session-catchup.py 不存在 |
第一次 catchup | 改用实际路径 ~/.config/opencode/.../session-catchup.py |
npm audit 报 1 个 moderate 漏洞 |
依赖变更后审计 | 漏洞来自既有 mermaid 11.14.0,本次新增 cfb 未引入新审计项;未自动 npm audit fix,避免扩大依赖变更 |
在标书查重 Step02 中新增纯程序正文和图片比对:正文按句子聚合重复,引用招标文件句子不计重复;图片按 hash 筛选完全相同图片;正文和图片分析在正文 Markdown 提取完成后并发执行,不调用 AI。
yibiao-asset 本地解析、hash 聚合重复图片。| Error | Attempt | Resolution |
|---|---|---|
git diff --check 报 client/doc/标书查重.md:54 trailing whitespace |
收尾检查 | 该文件是既有/用户改动,本轮未修改;本轮相关文件 diff check 仅 LF/CRLF 提示 |
修复正文比对中 HTML/Markdown 表格单元格被拼成同一句的问题,移除“疑似表格拼接”特例过滤,把正文分句从字符串硬过滤改为先提取结构化文本块再分句。
<td>/<th> 单元格提取文本块,保留 <p>/<li>/<br> 内部边界。| 替换成句号。isLikelyMergedTableSentence() 特例过滤,正文清洗不再删除编号前缀。npm run build 和本次文件 diff check。无偏离 等业务词特例过滤。交货期:30天、质保期:三年 这类字段会保留;无偏离 这类低信息短词仍不进入重复句。| Error | Attempt | Resolution |
|---|---|---|
planning skill 示例路径 ~/.opencode/.../session-catchup.py 不存在 |
第一次 catchup | 改用实际路径 ~/.config/opencode/.../session-catchup.py |
正文重复比对和招标引用排除都忽略句首结构性序号,避免 3.特别要求:... 与 特别要求:... 因序号差异无法匹配;展示句仍保留原文,正文内部数字、型号、标准号、金额、日期不受影响。
GB/T 29768-2013、交货期:30天、质保期:3年、第2包 不被误删。npm run build 和本次文件 diff check。normalized 作为正文比对和招标白名单 key,sentence 保留原文用于展示。| Error | Attempt | Resolution |
|---|
修复截图中短标题类正文重复项仍出现的问题:重复判断和招标白名单阶段继续忽略句首结构序号,但不通过 UI 隐藏原文;调整正文句子入库顺序并补齐低风险序号格式。
normalized,再用 normalized 判断是否进入正文句库/招标白名单。npm run build 和本次文件 diff check。sentence 原文作为证据,不改成 normalized。normalized,即去句首结构序号后的文本。NFKC,不删除正文标点,只对句首结构序号做局部剥离。| Error | Attempt | Resolution |
|---|---|---|
planning skill 示例路径 ~/.opencode/.../session-catchup.py 不存在 |
第一次 catchup | 改用实际路径 ~/.config/opencode/.../session-catchup.py |
VM 方式验证私有函数时相对 require('../utils/paths.cjs') 失败 |
第一次函数验证 | 使用 module.createRequire(file) 以服务文件路径创建本地 require |