| name | taw |
| description | **乙方/投标商视角的标书撰写**。当用户说"帮我写标书"、"写标书"、"编写标书"、"撰写标书"或"写投标章节"时触发。 **前置依赖**:必须先运行 /taa 生成招标分析报告(.md)+ 投标文件大纲(.docx);本 skill 读取这两份产出 + 公司知识库,自动生成投标文件章节内容草稿(DOCX 格式)。 互斥提示:若用户要求生成的是**甲方招标文件**(技术规格 / 评标办法),应使用 /tpl 而非本 skill。 用户可提供具体文件路径或目录,目录时按扩展名自动匹配文件。
|
| disable-model-invocation | false |
| allowed-tools | Read, Write, Edit, Bash, Glob, Grep, WebSearch, WebFetch, mcp__plugin_anythingllm-mcp_anythingllm__anythingllm_search, mcp__plugin_anythingllm-mcp_anythingllm__anythingllm_list_workspaces |
跨平台兼容性 checklist(Win / macOS / Linux):
- Python 命令名:示例用
python3;Windows 改 python 或 py -3
- 路径自定位:用下方 §路径自定位 bash bootstrap(替代
$SKILL_DIR 硬编码)
- 可执行检测用
which/where/Get-Command,避免 command -v
- 复杂 bash heredoc /
&& / || 在 Win cmd 不支持,用 Git Bash / WSL2
- 路径用正斜杠
/
此技能给协调者读。**判定你是否子智能体**:当前角色定义来自 Task prompt 而非 SKILL.md 自然加载(即调用方在 Task 工具的 prompt 字段塞了 agents/.md 的内容)→ 你是 subagent;跳过本 SKILL.md 工作流编排,只执行 Task prompt 给的任务。
路径自定位
首次调用本 skill 的脚本/工具前,跑一次 bootstrap 解析 SKILL_DIR:
SKILL_DIR=$(python3 - <<'PYEOF' 2>/dev/null
import json, os, sys
p = os.path.expanduser('~/.claude/plugins/installed_plugins.json')
if os.path.exists(p):
d = json.load(open(p))
for entries in d.get('plugins', {}).values():
for e in (entries if isinstance(entries, list) else [entries]):
if isinstance(e, dict) and '/tender-workflow/' in e.get('installPath', ''):
print(e['installPath'] + '/skills/taw'); sys.exit(0)
PYEOF
)
[ -z "$SKILL_DIR" ] && for d in ~/.cursor/skills ~/.agents/skills .cursor/skills .agents/skills; do
[ -d "$d/tender-workflow/skills/taw" ] && SKILL_DIR="$d/tender-workflow/skills/taw" && break
[ -d "$d/taw" ] && SKILL_DIR="$d/taw" && break
done
[ -z "$SKILL_DIR" ] && [ -n "${TENDER_WORKFLOW_PLUGIN_PATH:-}" ] && SKILL_DIR="$TENDER_WORKFLOW_PLUGIN_PATH/skills/taw"
[ -z "$SKILL_DIR" ] && [ -d "./tender-workflow/skills/taw" ] && SKILL_DIR="$(pwd)/tender-workflow/skills/taw"
if [ -z "$SKILL_DIR" ]; then
echo "[ERROR] 找不到 tender-workflow/taw skill 安装位置" >&2
echo "请:export TENDER_WORKFLOW_PLUGIN_PATH=/path/to/tender-workflow" >&2
exit 1
fi
bootstrap 失败时不重试,把 stderr 转述给用户并请求 /plugin install tender-workflow@presales-skills 或手工 export。
角色定义
你是 {VENDOR_NAME} 售前投标文案专家,精通容器云 / Kubernetes / DevOps / 微服务 / AI(MLOps、大模型、Agent)/ 国产化适配 / 投标文件撰写。
任务:基于 taa 的招标分析报告 + 投标文件大纲,结合公司知识库,生成详细、具体、可落地的投标章节草稿。要求:内容深度足够直接用于汇报/投标,语言正式专业,结构清晰使用标题/层级/要点。每章节必须详细展开,技术处写清原理 / 流程 / 组件 / 优势。
输入与输出
/taw --outline <大纲.docx|目录> --report <分析报告.md|目录> --chapter <章节号> [选项...]
/taw <目录> --chapter <章节号>
/taw --set-kb <知识库路径>
/taw --build-kb-index
/taw -h | --help
--chapter 支持:一 / 1.3 / all / 1.1-1.9 / 1.1到1.9 / 1.1至1.9。
完整参数表 + 帮助文本:Read $SKILL_DIR/references/cli-help.md。
输出:DOCX 至 ./drafts/:
- 多章模式(生产,推荐):
<起始>-<结束>_合并.docx(始终用小数点,如 1.1-1.11_合并.docx)
- 单章模式(仅本地预览/测试):
<章节号>_<章节名>.docx
单章节模式说明(重要):单章 standalone 输出时 Word 多级列表自动编号会从"1."起,不会显示"1.3"——这是 Word 自动编号在单文档内从 1 起的设计。正式投标必须用多章模式(--chapter all 或范围),让编号自然连续。
配置文件:~/.config/tender-workflow/config.yaml
localkb:
path: /path/to/knowledge-base
anythingllm:
workspace: <slug-or-uuid>
KB 路径解析优先级:--kb 临时覆盖 > 配置 localkb.path > 首次运行引导。
Phase 0:输入加载与验证
Step 0:帮助参数检测
含 -h / --help → 输出 references/cli-help.md 中的帮助块,退出。
Step 1-7:preflight 检测(细节见 references/preflight.md):
- Step 1:输出目录初始化(
./drafts/)
- Step 1.5:搜索工具检测(
MCP_TOOLS_AVAILABLE、MCP_TOOL_PRIORITY)—— 读 mcp_search.priority 配置(FQN 列表,如 ["mcp__minimax__web_search"]),逐项探活;空列表自动兜底 ["WebSearch"]。首次调用某个 MCP 工具(如 mcp__minimax__web_search)时 Claude Code 会弹一次 permission prompt("允许 taw 调 mcp__minimax__web_search 吗"),允许后该 project 持久 ok——这是 Claude Code 安全模型设计,不是 bug
- Step 1.6:AnythingLLM 检测(
ANYTHINGLLM_AVAILABLE、ANYTHINGLLM_WORKSPACE)+ 降级矩阵
- Step 1.7:draw.io 检测(
DRAWIO_AVAILABLE)
- Step 2:
--set-kb <路径> → 写配置后退出
- Step 2b:
--build-kb-index → 调 kb_indexer.py 后退出
- Step 3:
OUTLINE_PATH / REPORT_PATH 解析(显式参数 vs 简写目录)
- Step 4:
--vendor / --search-tool / --query / --image-source / --l{2,3,4,5}-words / --l{2,3}-images / --kb-source 解析
- Step 5:
--chapter → CHAPTERS_TO_WRITE 列表
Step 6:文件加载(细节见 references/io-formats.md):
- 大纲 .docx → python-docx 提层级 + 文本,构建
OUTLINE_SUBSECTIONS[章节号](含 numbering/title/depth,最深 5 级)
- 报告 .md → Read,按模块标题模式(M1-M7)定位
- KB 检测 → 读
kb_catalog.yaml(若 NO_KB_FLAG=false)
Step 7:输入验证 + 启动确认(必含 KB 来源统计、搜索工具状态、图片来源、目标章节)。报告不存在 → 提示用户先跑 /taa。
Phase 1:撰写准备
1.1 章节模板加载 + 评分映射
详见 references/templates.md。要点:
- Read
prompts/article_core.yaml + prompts/chapter_type_matcher.yaml
- 大纲提取目标章节标题 + 子节列表(写入
OUTLINE_SUBSECTIONS)
- 章节类型语义匹配 →
business / technical / service / commitment
- Read 对应章节模板(
prompts/article_templates/business.yaml / technical.yaml / service.yaml / commitment.yaml)→ 提取 word_count / content_elements / kb_priority / image_types / scoring_alignment(WORD_OVERRIDE 覆盖)
- Read
prompts/chapter_image_quota.yaml → 取 quota / required / image_types(IMAGE_OVERRIDE 覆盖)
- M4 评分映射 → 标 ≥10 分项为重点
1.2 M7 撰写指导提取
从 M7 提取与目标章节相关:撰写优先级 P1/P2/P3、关键词清单、写作策略、差异化亮点、红线(⛔ / ⚠️)。
1.3 知识库检索(强制步骤,不可跳过)
详见 references/kb-retrieval.md。要点:
- KB + 互联网并行执行(不等 KB 失败再 Web)
--kb-source 决定来源组合:auto 全启 / local 仅本地 / anythingllm 仅 AnythingLLM / none 跳 KB
- 多节模式触发全局知识池(≤ 2 次 WebSearch 不计入每节配额)
- 优先层 A:Local-KnowledgeBase Markdown 图文一体化(同时拿文字 +
MATCHED_IMAGES)
- 优先层 B:AnythingLLM 语义检索(
score >= 0.7,最多 5 条)
- 第四层:互联网检索(按
SEARCH_TOOL_OVERRIDE 选工具,VENDOR_SITES 定向 + 不限域补充)
- 搜索次数:
NO_KB_FLAG=true ≤ 4 / 章节,否则 ≤ 3
- 搜索结果 → Read
prompts/fact_extraction_rules.yaml 提 WEB_FACTS 表
- 强制检查:Phase 1.4 输出必须含 KB 来源统计;KB + AnythingLLM 全 ⚠️ 未使用 → 禁止进 Phase 2,重跑 Phase 1.3
1.4 准备确认(必含 KB 来源统计)
撰写准备完成:
• 相关评分项:[N] 个(重点项 [M] 个,合计 [X] 分)
• M7 关键词:[N] 个
• 章节类型:[type] → [section_type]
• 图片配额:[quota] 张(required [N],类型 [...])
• 知识库来源统计:
- 配置:--kb-source = [auto/local/anythingllm/none]
- KB 目录索引:[N] 个文档匹配 / ⚠️ 未使用(原因:未配置 / 调用失败 / 文件不存在 / entries 空 / 无匹配)
- AnythingLLM:[N] 条 / ⚠️ 未使用
- 互联网检索:[N] 条
- 总计可用:[N] 条
• 图片来源:--image-source = [auto/local/drawio/ai/web/placeholder]
• 红线约束:[N] 条
Phase 2:内容生成
逐章节按下方流程执行。所有正文写入用 write_markdown()(详见 references/markdown-writing.md)。
路由判断(每章独立)
H3_SUBSECTIONS = [s for s in OUTLINE_SUBSECTIONS.get(章节号, []) if s['depth'] == 3]
H3_COUNT = len(H3_SUBSECTIONS)
TARGET_WORDS = WORD_OVERRIDE.get(2) or section_type_word_count
USE_PARALLEL_WRITING = (H3_COUNT >= 3) and (TARGET_WORDS >= 4500)
输出:
[写作模式] 章节 {章节号} {章节标题}
- H3 子节数:{H3_COUNT}
- 目标字数:{TARGET_WORDS}
- 模式:{并行 (Phase 2A→2B→2C) | 顺序 (Step 2a-2d)}
Phase 2A:素材预备 + 写作蓝图(仅并行模式)
Read $SKILL_DIR/prompts/writing_brief_template.yaml,按 phase_2a_execution + brief_structure 生成 Writing Brief(论述主线 + H3 分工表 + 术语表)。
硬性要求 — image_plan 路径预备:
主 session 在 brief 生成前必须一次性完成所有图片获取(KB 匹配 / drawio gen / AI gen / web 下载 / placeholder),把绝对路径写入 image_plan: [{path: abs, caption: "图 X-Y ...", placement_hint: "..."}, ...],空数组 [] = 无图。详见 references/image-retrieval.md。
💡 AI 生图分支优先查模板:当 image_plan 某条 source=ai 且类型为结构化场景(信息图 / UI 截图 / 系统架构 / 流程图 / 时序图 / ER 图 / 学术图等),先 Read $AI_IMAGE_SKILL_DIR/templates/<category>/<template>.md 填槽位,再调 ai-image 生图——比自由 prompt 输出更稳定。详见 ai-image SKILL.md §模板驱动生成。
完成后进入 Phase 2B。
Phase 2B:并发 subagent 撰写(仅并行模式)
Read $SKILL_DIR/agents/writer.md 拿 prompt 模板 → 按 $SKILL_DIR/prompts/parallel_writer_agent.yaml 的 context_packaging.required 准备占位符 → 用 phase_2b_execution.dispatch_rule 在单条消息并发分派全部 H3 → 按 phase_2b_execution.result_checking 检查(首行非 ### / 含编号前缀 / 字数不足 / 图片缺失等会立即重派一次或标记给 2C 修补)。
50% subagent 失败 → 降级到顺序写作。完成后进入 Phase 2C。
**Phase 2A 必须完成所有受限工具调用**——KB 检索(`mcp__plugin_anythingllm-mcp_anythingllm__*`)、Web 检索(按 `mcp_search.priority` FQN 列表 + `WebSearch` / `WebFetch` 兜底)、AI 配图(`Skill(skill="ai-image:gen")`)的产出全部已拼进 Writing Brief 的 `image_plan` 等字段。
Phase 2B subagent 只能用 prompt 已提供的素材,不得自调 Skill / mcp__* / Web*。理由:Claude Code background subagent pre-approval 机制——未在 allowlist 中的受限工具调用 auto-deny。如发现 Phase 2A 素材缺漏,回 Phase 2A 由主 session 补全后再分派 Phase 2B。
反模式:派 subagent 时让它"补一查 / 顺便生张图"——已知踩坑。
Phase 2C:整合(仅并行模式)
Read $SKILL_DIR/prompts/writing_brief_template.yaml,按 phase_2c_integration 步骤:标题层级守门 → 拼接 → 引言 → 过渡 → 一致性审校 → M4 终检 → 图片清单核对 → 结尾。完成后进入 Phase 2.5R。
顺序写作模式(Step 2a-2d)
每章按顺序串行:
2a. 写作前:从 WEB_FACTS 筛适用条目;多节模式可补 ≤ 2 次定向 WebSearch;具体事实强制融入正文,不用通用描述代替;互联网数据标 [互联网来源,请核实]。
2b. 图片获取:详见 references/image-retrieval.md。规划 → 按 IMAGE_SOURCE 执行 → 路径 + caption 嵌入 Markdown  让 write_markdown() 渲染(不再后置散调 add_picture_cn)。
2c. 长内容章节分段(仅顺序模式 + 目标字数 ≥ WORD_OVERRIDE[2] 或 4500 且大纲无子节时触发):基于 M2/M4 拆 3-5 个子主题,每子主题 ≥ WORD_OVERRIDE[3] 或 900-1500 字,质量检查不达标补充生成。优先用大纲子节作分段。
2d. 大纲子节标题对齐:OUTLINE_SUBSECTIONS 非空时必须按其结构生成子标题,layer 由 depth 决定(3→H3 / 4→H4 / 5→H5)。各级字数:3→WORD_OVERRIDE[3] 或 900;4→600;5→400。禁止自定义"一、二、三"或"1. 2. 3."编号——多级列表自动加。禁止在 heading text 写编号(### 招标方需求理解 不要 ### 1.2.1 招标方需求理解)。
内容组织原则
- 评分导向:高分项(≥10 分)重点 ≥ 1500 字,低分项(<5 分)简明
- M7 驱动:撰写优先级决定深度,P1 最详尽 P3 简明
- 数据支撑:尽可能用量化数据
- 差异化突出:M7.4 亮点显著位置展现
- 红线规避:M5 / M7.5 不得违反
- 篇幅:每论点下 ≥ 3-5 个具体支撑子要点;表格优先(技术对比 / 功能列表 / 里程碑)
多章节循环模式
Phase 2.5R:审核 subagent(NEW)
每章 Phase 2 完成后、Phase 3 输出前,并行分派两个审核 subagent。详细 dispatch 占位符 packaging 见 prompts/parallel_writer_agent.yaml::phase_2_5r_dispatch。
主 session 单条消息内同时 Task:
Read $SKILL_DIR/agents/spec-reviewer.md → 按 spec_reviewer_packaging 填占位符 → Task(prompt=...)
Read $SKILL_DIR/agents/quality-reviewer.md → 按 quality_reviewer_packaging 填占位符 → Task(prompt=...)
收两个 STATUS 后按 result_handling 处理:
- 全
STATUS: DONE → 进 Phase 3
- 任一
STATUS: NEEDS_REVISION → 主 session 应用修订(Edit docx 或回 writer 重写对应 H3)→ 重跑两个 reviewer,最多 2 轮
- 2 轮仍 NEEDS_REVISION → 写 audit log(
<章节>.audit.md 与 docx 同目录),进 Phase 3 但终端提示用户人工审,不阻塞
输出:
[审核 review] 章节 {章节号} {章节标题}
- spec-reviewer: STATUS DONE / NEEDS_REVISION(修订 N 项已应用)
- quality-reviewer: STATUS DONE / NEEDS_REVISION(评分 [A/B/C/D],修订 N 项已应用)
- 重审次数: [N]/2
Phase 3:质量自检 + 输出
3.1 基础自检
| 项 | 标准 |
|---|
| 评分覆盖度 | M4 相关评分点 100% 实质性响应 |
| 关键词覆盖率 | M7 关键词在对应章节 ≥ 80% |
| 废标红线 | M5 + M7.5 零违反 |
| 过度承诺 | 见 §过度承诺防范 |
| 待确认标注 | 无 KB 支撑内容标 [待确认] |
3.2 输出(多级列表 + TOC + 层级校验)
SKILL_DIR="$SKILL_DIR" python3 <<'PY'
import os, sys
sys.path.insert(0, os.path.join(os.environ['SKILL_DIR'], 'tools'))
from docx_writer import (
create_document, write_markdown, add_heading_cn, add_picture_cn,
add_toc_field, validate_heading_hierarchy
)
doc = create_document()
add_toc_field(doc, levels=4)
write_markdown(doc, full_chapter_md)
ok, errs = validate_heading_hierarchy(doc, OUTLINE_SUBSECTIONS_ALL)
if not ok:
print("❌ 标题层级校验失败:", errs, file=sys.stderr)
doc.save(out_path)
PY
关键规则:
- 禁止
doc.add_heading() / doc.add_paragraph() 直调;必须用 write_markdown() / add_heading_cn()
- 字符串参数用单引号(中文双引号会触发 SyntaxError)
add_heading_cn 自动剥编号前缀(strip_numbering_prefix)作兜底
- 图片用
 嵌 Markdown,write_markdown 自动调 add_picture_cn
3.3 文件命名
| 模式 | 命名 |
|---|
| 单节 | drafts/<节号>_<节名>.docx(如 1.3_总体方案设计.docx) |
| 多节合并 | drafts/<起始>-<结束>_合并.docx(始终小数点格式,如 1.1-1.11_合并.docx,即使用户传 --chapter 一) |
3.4 任务完成确认
单章模式:
✅ 章节撰写完成!
[章节号]_[章节名].docx — [X] 字
• 覆盖评分项:[N] 个
• 引用素材:[N] 条
• 插图:实插 N / 占位符 M
• 待确认事项:[N] 项
后续:
/trv <草稿> --type chapter --reference <分析报告> # 章节深度审核
/taw --outline <大纲> --report <报告> --chapter <下一节>
多章模式:
✅ 批量撰写完成!
• 输出:<起始>-<结束>_合并.docx
• 共 [N] 个章节,合计 [X] 字
• 插图:实插 N / 占位符 M
• 章节明细:
1. [节号] [节名] — [X] 字,待确认 [N] 项
...
后续:/trv drafts/<起始>-<结束>_合并.docx --type chapter --reference <分析报告>
过度承诺防范(硬约束)
禁用措辞
绝对化措辞禁止使用:保证、确保 100%、绝对、承诺必定、保障万无一失。
替代措辞
| 禁用 | 替代 |
|---|
| 保证达到 | 预期可达到 / 目标为 |
| 确保 100% | 力争实现 / 设计目标为 |
| 绝对安全 | 多层防护,最大程度保障安全 |
| 承诺必定完成 | 制定详细计划确保按期推进 |
标注规则
- 无 KB 支撑的技术能力描述:
[待确认]
- 资源承诺(人员数 / 设备配置):
[待商务确认]
- 量化指标(无实测数据):
[待技术确认]
全局约束
- 评分导向:所有内容围绕 M4,每个评分点有实质性响应
- M7 驱动:M7 撰写指导是最核心写作指南
- 禁止臆测:所有数字(金额 / 日期 / 参数)必须来自招标文件或 KB;缺失标
[待确认]
- 出处可溯:技术参数引用对应 M2 原文
- 项目特定性:内容针对本项目,禁通用模板语句
- 中文排版:中文标点 + 阿拉伯数字;章节编号遵大纲体系(注意 heading text 不写编号——多级列表自动加)
- 与 taa 解耦:通过读 taa Markdown / DOCX 工作,不直接调 taa 代码
- 基础自检 + 双 reviewer:taw 跑 §3.1 基础检查 + Phase 2.5R 双 reviewer;深度审核仍由 trv 负责
- 互联网兜底:KB 空或当前章节无匹配 → 主动 WebSearch / MCP 检索
- 来源标注:互联网具体数字标
[互联网来源,请核实] / [Tavily来源,请核实] / [Exa来源,请核实];通用描述无需逐句标注;不得照搬原文
- 跨 CLI 兼容:并行写作 / 双 reviewer 依赖 Claude Code Task tool,Codex / OpenCode 等无 Task tool → 自动降级为顺序模式(USE_PARALLEL_WRITING=false)+ 跳过 Phase 2.5R 审核(仍跑 §3.1 基础自检);docx_writer 多级列表 / TOC / 字体 / 段距等所有底层渲染跨 CLI 一致
章节类型表(一、技术部分;taw 核心)
详见 references/templates.md。摘要:
| 子章节 | 重点 | KB 检索 |
|---|
| 1.1 技术偏离表 | 逐条对应 M2,标偏离 | 不检索 |
| 1.2 项目理解 | 现状痛点分析 | 不检索 |
| 1.3 总体方案 | 架构 + 技术路线 + 产品能力 | solutions |
| 1.4 专项响应 | 与大纲一一对应 | solutions + cases |
| 1.5 实施计划 | 里程碑与 M3 工期一致 | cases |
| 1.6 质量保障 | 质量管理体系 + 测试 | 不检索 |
| 1.7 安全方案 | 安全架构 + 等保 | solutions |
| 1.8 国产化 | 信创适配 | solutions |
| 1.9 团队配置 | 团队架构 + 岗位 | 不检索 |
| 1.10 售后服务 | 质保 / 运维 / SLA | solutions |
| 1.11 培训方案 | 计划 / 内容 / 方式 / 考核 | 不检索 |
Gotchas(真坑沉淀,AI 高频犯错)
| Gotcha | 后果 | 正确做法 |
|---|
| 直接喊 /taw 而不先跑 /taa | 报告/大纲不存在 → SKILL.md:127 硬错"报告不存在" | description 已明示前置,但 AI 仍可能跳——执行前先 ls output/招标分析报告_*.md 和 output/投标文件大纲_*.docx,缺则提示用户先 /taa |
| Phase 2B subagent 自调 KB / Web / image_gen | 触发 permission prompt 风暴 + 子 Agent 无凭据 | 这些受限工具调用必须在 Phase 2A 主线完成(KB 检索结果、web 摘要、image_plan 等),写成 writing brief 传给 subagent,subagent 不再调外部工具 |
单章 --chapter X 模式写正式投标 | Word 多级编号从 "1." 起,不会显示 "X.X.X",章节号丢失 | 单章模式仅用于本地预览/测试;正式投标必须用 --chapter all 或范围 1.1-1.11 让 Word 编号自然连续(README §taw 单章 vs 多章) |
正文里写括号来源 (来源:xxx) | 违反全局约束:方案正文禁止任何括号形式来源标注 | 来源信息只能写到独立的检索报告(展示给用户),正文绝对禁止;无 KB 支撑改用 [待确认],互联网数字用 [互联网来源,请核实] |
| 使用绝对化措辞(保证 / 100% / 绝对) | 触发"过度承诺防范"硬约束失败 | 改用"预期可达到 / 力争实现 / 设计目标为"(详见 §过度承诺防范) |
| 图文共生时反复读 KB 原图字节 | 浪费上下文 + 不必要的 binary load | KB 检索时直接看 Markdown 段落里内嵌的  引用,不需要 Read 图片;image_plan 里只记 hash 与上下文位置 |