标必达
本技能分两部分。安装、更新、授权看第一部分;写投标文件看第二部分。第二部分发现没有接入或授权失效时,转到第一部分第 3 节。
统一约束
需要用户选择时,用提问的方式给出固定选项。
安装、更新、授权开始时不要先问用户确认。只升级技能时不要请用户退出 WorkBuddy,不要提本轮文件要重新发。写入连接器、迁移 MCP 名称或打开「信任」开关后,仍按第 3 节请用户完全退出 WorkBuddy 再打开。
命令和工具
只允许运行本技能写明的命令:第一部分的安装命令、node scripts/configure-workbuddy.mjs(含 --check、--link、--update)、node scripts/check-skill-version.mjs,第二部分工具文本里的那一条 node scripts/upload-tender.mjs,以及导出完成时 query_task 文本里的那一条 node scripts/download-bid.mjs。除此之外禁止运行命令。禁止自己写脚本。安装说明里的 install 没有 --force,不能用来覆盖已安装的版本。版本检查不要等待用户开口。不要把检查地址写给用户。不要把上传地址写给用户。
已连接的 MCP 服务器 标必达 提供本部分的工具。只调用 allowed-tools 中的名字。present_files 仅在导出完成、要把工作区里的 Word 挂到对话时用。工具参数以该服务器 tools/list 的定义为准。select_tender_scope、blind_settings、read_card_section、update_catalogue 是卡片内部工具,不算未接入;模型禁止直接调用这四个名字。包段选择、暗标设置及目录保存由卡片操作。
重新解析、重新生成目录、重新生成正文、按章重生、重写失败章节、资料重试、目录卡里的保存改动和撤销全部,都由卡片内部 tools/call 完成,完成后在本卡刷新;模型不要因为这些动作再调用中文开卡工具。目录头脑风暴按第 3 节转入对话,应用成功后打开新目录卡片,旧卡不轮询、不刷新。不要调用 update_catalogue。
禁止调用 allowed-tools 以外的工具。不要读或改 mcp.json。不要把授权码、授权链接以外的地址写进对话。不要让用户去连接器里填请求头,不要提 Bearer、mcp.json、工具数量。
禁止读招标文件、产品清单、技术资料或 PDF,禁止安装 pypdf 或任何库,禁止创建虚拟环境。不要读 PDF,不要安装任何库。不要传 file_path。不要传 workspace_root。不要传 file_url。不要传 bid_info。不要传 solution_uuid。create_solution 不要传 bid_info、bid_score_criteria、file_url、filename、solution_uuid、visual_config。write_bid 返回 insufficient_credit 时,不要自己解释原因,不要重试。
对话和参数
整份标书在当前这一次对话里做完。卡片插入的用户消息是下一步的指令。不要新开对话,禁止重新上传招标文件。收到以 【 开头的卡片消息时,不要自己完成任务;除尚未包含修改意见的 【目录头脑风暴】 提示外,本轮第一个动作必须调用对应工具。头脑风暴提示没有实际意见时按第 3 节先询问,不提交提示模板。
workspace_root 由 WorkBuddy 注入。不要自己编路径,不要用招标文件所在目录代替,不要向用户索要工作区地址。工具参数里不要传 file_url、solution_uuid。内部定位一律用消息或工具文本里的 任务=,参数名是 task。
不要把项目概述、评分标准、目录或正文写进对话。任务梗概原文除外;梗概只保留工具返回的 Markdown 表,不要改表,不要补 OSS 地址,不要把 任务= 写进对用户说的话。不要把 OSS 地址写进对话。下载地址只允许出现在 node scripts/download-bid.mjs 的参数里,不要写进对用户说的话。
Please continue with the conversation、based on the summarized context、上下文已压缩 这类压缩续写不是「继续」。立即结束本轮,不要 query_task,不要打开卡片。
查询和卡片
普通解析、目录、正文、导出分别使用 stage=parse/catalogue/writing/export。目录讨论和应用分别使用 stage=brainstorm/catalogue_apply,必须原样传递返回的 task、operation_id。进行中只能查询,不打开卡片;讨论完成按第 3 节解释响应,只有提案应用成功才打开新目录卡片。等待用户回答或确认时停止查询,不能自动应用。
query_task(任务状态查询)完成或失败立刻返回。进行中每次最多等 30 秒。文本含「仍在进行」时,把「仍在进行」那一句原样写给用户,不要打开卡片,立即用同一个 task 再调用,直到完成或失败。文本含「进度未变」时,不要向用户说话,立即用同一个 task 再调用 query_task。不要在查询进行中调用三个中文工具。文本要求调用其中一个中文工具时,只调用一次,参数只用同一个 task。返回 interactionMode=mcp-app 时,把工具文本里「立即结束本轮」之前的句子原样写进对话,然后立即结束本轮。进行中按上面的 query_task 规则处理。
导出
导出完成且 query_task 文本里有 node scripts/download-bid.mjs 时:原样运行这一条,一个字都不要改。命令退出码为 0 且输出「已下载」后,调用 present_files,files 数组里只放 path= 后面的绝对路径。命令失败或输出「下载失败」就不要再调用 present_files,对用户只写「Word 已导出,但没有挂到对话。」并原样带上 path= 这一行。不要写「已挂到对话」。不要把下载地址写进对话。禁止自己写脚本。禁止 ls。禁止 .workbuddy/memory。禁止确认记忆目录。禁止查看所有产物。不要用建方案表里的路径。不要自己找 docx。present_files 成功之前不要向用户说话。完成后不要再打开卡片。不要搜索工作区。
第一部分:安装、更新与授权
1. 安装与更新
用户消息里出现「安装 @//user_c98feec5/toubiao-hynamic-cn」,或明确说更新、升级、重新安装标必达时,先运行:
skillhub install @//user_c98feec5/toubiao-hynamic-cn --dir ~/.workbuddy/skills/ --force
装完立刻运行 node scripts/configure-workbuddy.mjs --check,再看 tools/list:
- 输出「MCP 名称已更新」:把该行原样告诉用户,请用户完全退出 WorkBuddy 再打开,并确认「标必达」的「信任」开关,结束本轮。
- --check 输出「已授权」,且已有十二个 标必达 工具、调用没有返回 invalid_token:只说已升到本技能 version 里的版本号,可以继续。
- 否则走第 3 节。本机曾经授权过也要写入连接器。
2. 版本检查
本对话第一次进入第二部分(用户附上招标文件,或明确要求写投标文件 / 写综合标 / 方案写作)时,先运行:
node scripts/check-skill-version.mjs
- 没有输出:进入第二部分。
- 输出含「有新版本」:先不要解析、不要运行上传脚本。把脚本输出的那一行原样写给用户,然后用提问的方式问用户,选项是「现在升级」「先用当前版本」。
- 选「现在升级」:走第 1 节,装完结束本轮。
- 选「先用当前版本」:本对话不再检查,进入第二部分。
- 没回答:不升级、不解析。
- 消息以
【开头、用户原话是「继续」「接着写」「重试」、本轮已经检查过、正在走第 1 节或第 3 节:不运行检查脚本。
3. 授权
本 Skill 会被多个客户端安装。授权前从当前宿主明确提供的运行上下文取得当前客户端标识,再把下方命令的 <当前客户端标识> 替换为该标识后运行;禁止原样运行占位符。WorkBuddy 使用 workbuddy,千问办公使用 qianwen,其他客户端使用其稳定的英文标识。不能从 Skill 名称、脚本路径、安装目录、模型名称或企业名称猜测来源。若运行上下文无法确定宿主,先向用户确认客户端名称,不能默认归到 WorkBuddy。--check 只检查现有连接,不打开授权页面,无需来源。当前脚本的配置写入适配器仍面向 WorkBuddy;其他客户端的安装入口需使用对应适配器,共享来源校验和授权链接构造模块。
用户说「授权标必达」「重新授权」,或第 1 节需要写入连接器时,运行:
node scripts/configure-workbuddy.mjs --source=<当前客户端标识>
按输出处理。退出码为 2 且输出「授权页没有自动打开」不算报错。
所有配置脚本模式输出「MCP 名称已更新」时,都要把该行原样告诉用户,请用户重启 WorkBuddy 并确认「标必达」的「信任」开关;同次输出包含后续授权提示时,继续按对应规则处理。
- 输出「已打开授权页」:对用户只说这几句:
1. 在刚打开的页面登录;没有账号先注册,注册后再登录。
2. 在「身份」里选择要授权的身份(个人空间也在里面),点「授权给本机 WorkBuddy」,看到「已接入」。
3. 完全退出 WorkBuddy 再打开。
4. 打开「专家·技能·连接器」,进入「连接器」,点右上角「自定义连接器」,在「我的 MCP」里找到「标必达」,打开它的「信任」开关。然后把招标文件发给我。 - 输出「授权页没有自动打开」:把输出里的授权链接写成可点击的链接,告诉用户在这台电脑的浏览器里打开它(点不开就复制到浏览器地址栏),登录、在「身份」里选择身份、点「授权给本机 WorkBuddy」。这个链接只能在这台电脑上用,不要让用户用手机打开。然后用提问的方式问用户,选项是「已完成授权」「链接打不开」「稍后再说」。
- 命令报错:把报错原样告诉用户,问一次是否重试。
用户选「已完成授权」时,运行 node scripts/configure-workbuddy.mjs --check:
- 输出「已授权」:对用户只说上面第 3、4 句。
- 输出「还没有授权」:告诉用户还没收到授权,再问一次同样的问题。
- 输出「授权已过期」:重新运行 node scripts/configure-workbuddy.mjs --source=<当前客户端标识>,按本节处理。
用户选「链接打不开」时:请用户把链接复制到这台电脑上的另一个浏览器(例如 Chrome 或 Edge)里打开,然后再问一次。还是打不开,重新运行一次 node scripts/configure-workbuddy.mjs --source=<当前客户端标识>,按本节处理;第二次仍然打不开,把情况如实告诉用户,结束本轮。
用户选「稍后再说」时:告诉用户随时说「授权标必达」即可继续,结束本轮。
已经输出「已打开授权页」之后,用户说没看到页面、打不开、没反应:运行 node scripts/configure-workbuddy.mjs --link --source=<当前客户端标识>。输出授权链接时,按「授权页没有自动打开」那一条处理;输出「授权已过期」时,重新运行 node scripts/configure-workbuddy.mjs --source=<当前客户端标识>;输出「已授权」时,只说第 3、4 句。
4. 更新凭证
用户说「更新凭证」「更换授权」「重新授权」,或任何工具结果含 invalid_token:不要先问是否更新。凭证还有效时也走这一节,用来换成一张新凭证。运行:
node scripts/configure-workbuddy.mjs --update --source=<当前客户端标识>
后面的输出处理与第 3 节相同。用户选「已完成授权」后仍运行 node scripts/configure-workbuddy.mjs --check。--check 输出「授权已失效」时,再运行一次 node scripts/configure-workbuddy.mjs --update --source=<当前客户端标识>。
第二部分:标书写作
0. 接入检查
开始写作前看 tools/list。
- 已有十二个 标必达 业务工具,且调用没有返回 invalid_token:进入第 1 节。
- 没有上述十二个工具:告诉用户「标必达还没完成接入,我先带你完成」,然后走第一部分第 3 节。
- 任何 tools/call 结果含 invalid_token:告诉用户「授权已失效,我先更新凭证」,然后走第一部分第 4 节。
- 用户已经完全退出重开 WorkBuddy,但调用工具时提示需要信任或一直没有响应:提醒用户在「自定义连接器」的「我的 MCP」里,打开「标必达」的「信任」开关。
- 用户只说写投标文件、写综合标或方案写作,且未接入:说明未接入,用提问的方式问用户,选项是「现在接入」「稍后再说」。未选「现在接入」不运行脚本。
1. 收集资料
用户要写投标文件时,先确认三类文件,再进入第 2 节:
- 招标文件:必填,PDF、DOC、DOCX 或 WPS,正好 1 份。
- 产品清单:选填,Excel(.xls / .xlsx),最多 1 份。
- 相关技术资料:选填,PDF 或 DOCX,最多 10 份,默认全部在写作中引用。
DOC、WPS 招标文件由服务端自动转换为 DOCX,XLS 产品清单由服务端自动转换为 XLSX。不要要求用户预先转换 WPS 招标文件,不要在本机执行格式转换。
本轮没有附文件:用提问的方式问用户,选项是「现在附上」「稍后再说」。先只说一句:招标文件必填,产品清单和技术资料选填,请一次附到对话。选「稍后再说」则结束本轮。
本轮只附了一个 PDF、DOC、DOCX 或 WPS:把它当作招标文件,用提问的方式问用户,选项是「现在补资料」「没有,开始解析」。
本轮附了多个文件:先分类,再用表格列出「文件名 / 类型」。类型有疑问时用提问的方式请用户确认或改正:
- Excel 是产品清单;超过 1 个时用提问的方式问用哪一份。
- PDF、DOC、DOCX 或 WPS 里,文件名含「招标」「采购」「磋商」「谈判」「询价」「公告」的是招标文件;猜不出或有多份时用提问的方式问用户。
- 其余 PDF、DOCX 是相关技术资料。.doc、.wps 当技术资料时,请用户先另存为 DOCX 或 PDF。
数量或类型不符合上面的要求时,当场告诉用户,不要调用工具。用户确认后进入第 2 节。
2. 解析与配置
文件上传后,服务端先沿用已有格式转换,再调用系统已有包段范围识别:
- 只有一个包段:服务端自动确认;等待解析成功或失败后才打开第一张解析卡片,进行中不要提前开卡。
- 多个包段:按 query_task 指令打开现有解析卡片,由用户多选或全选,至少选择一个包段;确认后在当前卡片解析,并展示项目概述和评分标准。
- 模型不要代选包段、编造包段 ID、直接调用包段选择工具,或在用户确认范围并完成解析前创建方案。query_task 要求等待时继续查,要求打开卡片时只打开一次并结束本轮。
解析成功后,用户在卡片中配置写作任务。“标题和篇幅”内设置投标方式:明标默认勾选,无论是否识别出暗标要求都能选择明标。选择暗标时,没有暗标要求则展示默认屏蔽项;有要求则展示默认项及当前包段适用的解析要求,重复项合并展示。补充要求通过服务端解释、用户确认后保存。模型不能自行拼装规则或绕过确认。
调用 parse_tender,regenerate=false,带上招标文件的 filename;有产品清单时带 product_filename;有技术资料时带 reference_filenames(文件名数组)。
返回文本里有 node scripts/upload-tender.mjs 时,按文本里的对照,把 __TENDER_FILE__、__PRODUCT_FILE__、__REFERENCE_FILE_1__ 等占位符换成对应文件的绝对路径,其它一个字都不改,然后运行。
- 全部成功:立刻按文本再调用 parse_tender,只带 upload_id、filename 和 regenerate=false。然后 query_task,stage=parse。
- 输出「上传失败」:告诉用户是哪一份失败,用提问的方式问「重试 / 不用这份」。重试就原样再运行同一条命令;不用这份就直接按文本调用 parse_tender。招标文件上传失败只能重试。
返回文本里已有 任务= 时,直接 query_task,stage=parse,task 用那一行。查询要求调用「标书解析审查和写作任务配置选择」时,用同一个 task 调用它一次,然后立即结束本轮。
query_task 返回「技术资料有 N 份不能用」时,按文本用提问的方式逐份问用户:不支持解析的给「换文件 / 不用这份」,解析失败的给「重试 / 不用这份」。
- 重试:调用 update_materials,action=retry,attachment_ids 用文本里的 attachment_id。
- 不用这份:调用 update_materials,action=skip。
- 换文件:先 action=skip,再请用户附上新文件,调用 update_materials,action=add,filenames 为新文件名,按返回文本运行上传命令后再带 upload_id 调一次。
处理完再 query_task,stage=parse。
用户消息以 【补充资料】 开头时:这是产品清单分流:.xls/.xlsx → 产品清单,.pdf/.docx → 相关技术资料。本轮还没附文件时,用提问的方式问用户,选项是「现在附上」「先不补」;选「先不补」则结束本轮。本轮已经附了文件或用户选「现在附上」并附上后,调用 update_materials,action=add,task 用消息里的 任务=,filenames 用真实文件名,按返回文本上传,再 query_task,stage=parse,完成后再次调用「标书解析审查和写作任务配置选择」。
用户消息以 【重新解析】 开头时(旧卡片或卡片内部调用失败回退),调用 parse_tender,regenerate=true,task 用消息里的 任务=。再循环查询,完成后再次调用「标书解析审查和写作任务配置选择」。新卡片会在卡片内部完成重新解析并刷新本卡。
用户消息以 【方案写作配置】 开头时,本轮第一个动作必须调用 create_solution。参数只用这条消息里的 task(任务=)、title、pages、reference_basis、chapter_contents、reference_ids(按逗号拆成整数数组,为空就传空数组)、use_product(消息里有就传)、table_density、chart_density、image_density、ai_image(消息里有就传)和三个开关。项目概述和评分标准由服务端从当前任务绑定的包段范围解析结果读取;包段范围、明暗标模式及策略也由服务端读取已保存设置。不要在 create_solution 参数中覆盖这些内容。create_solution 返回后立刻把返回文本里的 Markdown 表原样写进对话,不要等目录完成再写表。接着调用 generate_catalogue,regenerate=false,task 用工具返回文本里 任务= 的值。不要 query_task stage=parse。然后循环 query_task,stage=catalogue,同一个 task。查询要求调用「审查生成的目录」时,用同一个 task 调用它一次,然后立即结束本轮。
3. 目录
目录卡片支持手工编辑、重新生成、头脑风暴及开始编写。手工保存通过卡片内部工具完成,不要在对话中自行输出新目录。目录标题、编写思路或结构调整意见必须交给服务端头脑风暴处理。
3.1 头脑风暴入口
- 用户点击“头脑风暴”后,卡片插入:
【目录头脑风暴】
任务=xxx
请描述希望调整的章节、内容或编写思路。
- 若只有这段提示、尚未提供修改意见,保留任务,先请用户描述调整需求;不要把模板当作意见提交。
- 用户随后输入修改意见,或直接在对话中提出目录调整时,把用户意见原样作为
message调用brainstorm_catalogue,不要改写、概括或自行编写目录。已有澄清问题时,也把用户回答原样交回该工具。 - 使用当前唯一明确的任务。对话中有多个候选任务或没有唯一明确任务时,先请用户明确要修改哪份方案,不使用任意最近任务。
- 每个新讨论请求生成不同的
request_id;相同请求重试保留原值,不能用同一编号提交不同内容。
3.2 讨论、确认及应用
- 调用
brainstorm_catalogue,参数为task、原始message、request_id。返回运行中时循环query_task,stage=brainstorm,原样传递返回的task、operation_id;处理期间不打开卡片。 - 讨论完成后按
response_type处理:
-clarification:原样展示澄清问题和选项,等待用户回答,再按 3.1 提交;不要自行补全用户答案。
-answer:展示回答,不应用修改,不调用应用工具。
-proposal:展示服务端修改摘要、警告和需要确认的内容,保留返回的proposal_id,明确询问用户是否确认应用当前提案,然后停止本轮。不能因模型认为合理而自动应用。 - 用户明确确认当前提案后,调用
apply_catalogue_proposal,参数为相同task、服务端返回的proposal_id和新的request_id;同一应用请求重试复用原request_id。不得自行构造 operations、目录或提案编号。 - 需要等待时循环
query_task,stage=catalogue_apply,原样传递返回的任务及操作标识。只有返回应用成功,才调用现有“审查生成的目录”工具打开一张新卡片,然后结束本轮。旧目录卡片不轮询、不刷新。 - 用户拒绝提案时不应用;用户继续提出修改意见时重新调用讨论工具。提案或目录版本过期、应用失败时展示服务端原因,不声称保存成功,不改用其他提案或版本号直接重试。
3.3 重新生成与开始编写
用户消息以 【重新生成目录】 开头时(旧卡片或卡片内部调用失败回退),调用 generate_catalogue,regenerate=true,task 用消息里的 任务=;原样传递消息中的 catalogue_version。再循环查询,完成后按服务端指令调用“审查生成的目录”。卡片内部成功执行的重新生成会刷新本卡,模型不要重复开卡。
用户消息以 【开始编写】 开头时,本轮第一个动作必须调用 write_bid,regenerate=false,task 用消息里的 任务=,catalogue_version 原样取自该消息。在用户点「开始编写」之前,不要调用 write_bid。然后循环 query_task,stage=writing,同一个 task。查询要求调用“审查生成的标书”时,只调用一次并立即结束本轮。
手工保存、重新生成目录、开始编写均使用卡片提供的基础版本。版本过期时重新打开目录卡片让用户确认,不能从工具结果取新版本替换用户旧确认后直接重试;消息缺少必要版本且服务端拒绝时同样重新开卡,不猜测版本号。
4. 正文
正文使用服务端绑定的包段范围、明暗标模式及规则,模型不能自行切换范围或绕过暗标约束。正文重新生成、按章重生或失败章节重试沿用该任务最近一次用户确认的 catalogue_version;若无法确定或服务端提示版本过期,重新打开目录卡片让用户确认,不编造版本、不直接重试。
用户消息以 【重新生成正文】 开头时(旧卡片或卡片内部调用失败回退),调用 write_bid,regenerate=true,task 用消息里的 任务=,再循环查询,完成后再次调用「审查生成的标书」。点名某一章时同时传入 node_key。新卡片会在卡片内部重新生成并刷新本卡。
用户消息以 【重写失败章节】 开头时(旧卡片或卡片内部调用失败回退),调用 write_bid,regenerate=false,不要传 node_key。然后循环 query_task,stage=writing,同一个 task。已完成的章节不要重写。查询要求调用「审查生成的标书」时,用同一个 task 调用它一次,然后立即结束本轮。新卡片会在卡片内部重写失败章节并刷新本卡。
write_bid 返回 insufficient_credit 时,把返回的那句话原样写给用户,然后用同一个 task 调用「审查生成的标书」打开卡片,立即结束本轮。
5. 导出
暗标导出复用系统已有生成约束和格式处理。返回 final_file_checked=false 时,如实说明“已按暗标生成约束和格式设置导出,未做最终文件检测”;不要声称检测通过,不增加最终文件检测或新的下载门槛。完成文件交付后附上这条说明,不在下载完成前提前宣称文件已交付。
用户消息以 【导出标书】 开头时,本轮第一个动作必须调用 export_bid,task 用消息里的 任务=。返回后立即循环 query_task,stage=export,同一个 task。完成后若文本里有 node scripts/download-bid.mjs,原样运行这一条。命令退出码为 0 且输出「已下载」后调用 present_files,files 数组里只放 path= 后面的绝对路径。命令失败或输出「下载失败」就不要再调用 present_files,对用户只写「Word 已导出,但没有挂到对话。」并原样写上 path=。不要写「已挂到对话」。不要把下载地址写进对话。禁止自己写脚本。禁止 ls。禁止 .workbuddy/memory。禁止确认记忆目录。present_files 成功之前不要向用户说话。然后立即结束本轮。
6. 继续、重试
先检查当前是否处于目录头脑风暴,再处理下面普通任务的继续规则:
- 讨论或应用仍在运行:使用原 task、operation_id 查询对应 stage=brainstorm/catalogue_apply。同一提交失败需要重试时,复用原始参数及 request_id,不重复创建新请求。
- 等待澄清回答或确认提案:提醒用户当前问题或待确认提案并等待;不能把“继续”视为确认应用,也不能自动应用。明确回答或明确确认后按第 3 节执行。
- 应用已经成功:依服务端指令打开新目录卡片后结束本轮;不要轮询旧卡,也不要用普通 stage=auto 分支绕过头脑风暴确认。
- 上述情况无法定位唯一任务或操作时先澄清,不猜测。只有不属于这些情况时才进入以下普通任务规则。
用户原话是「继续」「接着写」「重试」,且本轮消息不是以 【 开头时:调用 query_task,stage=auto,task 用对话里最近一次 任务=。按返回文本继续:含「仍在进行」则把那一句写给用户再查;含「进度未变」则立即再查;要求打开中文卡片则打开一次并结束本轮;含「不要再打开卡片」则立即结束本轮;导出完成且文本里有 node scripts/download-bid.mjs 时,原样运行这一条。命令退出码为 0 且输出「已下载」后调用 present_files,files 数组里只放 path= 后面的绝对路径。命令失败或输出「下载失败」就不要再调用 present_files,对用户只写「Word 已导出,但没有挂到对话。」并原样写上 path=。不要写「已挂到对话」。不要把下载地址写进对话。禁止自己写脚本。禁止 ls。禁止 .workbuddy/memory。禁止确认记忆目录。present_files 成功之前不要向用户说话。然后立即结束本轮。对话里没有 任务= 时走第 1 节。