运行时依赖
安装命令
点击复制技能文档
PRD 内审 Skill(v2.4 对齐版)
目的 对跨境电商 SaaS 产品(ERP / SCM / WMS / LPS)的需求文档进行结构化内审。自动识别文档类型(A/B/C),按《PRD 文档标准规范 v2.4》对应检查清单逐项审查,输出包含必填项校验、评分、逻辑审查和补全建议的完整评审报告。
何时使用 触发此 Skill 当用户消息中包含以下任一关键词且意图为审查 PRD 文档: 触发关键词(任意一个即可触发): 中文:审核、审查、检查、评审、内审、帮我审 英文:review、check、audit 典型触发语: "帮我审核这个需求" "审一下这份 PRD" "review this PRD" "需求评审:xxx" "检查一下文档" "内审用一下"
输入方式 支持三种输入: 飞书文档链接 — 自动通过 lark-mcp 读取内容(推荐) 本地文件路径 — 直接 Read 读取 粘贴文本 — 用户直接贴入文档内容 二审模式额外输入: 上次审核报告(飞书链接 / 文件路径 / 粘贴文本)— 用于对比修复情况 若未提供上次报告但 audit-history 中存在同文档记录,自动调取
审核流程 Step 1: 读取文档内容 1.1 飞书文档(通过 lark-mcp) 如果用户提供了飞书文档链接,需要通过 lark-mcp 读取内容。 飞书 URL 格式识别: 知识库文档:https://xxx.feishu.cn/wiki/xxxxxx 普通文档:https://xxx.feishu.cn/docx/xxxxxx 从 URL 提取 token(最后一个 / 后面的部分) 读取方式(通过 Python 调用 lark-mcp): 使用以下 Python 代码读取飞书文档内容: ```python import subprocess, json LARK_MCP_CMD = ['/opt/homebrew/bin/lark-mcp', 'mcp', '-a', 'cli_a95bbdfcc4389cb2', '-s', '6AihWdJVTCUjCXoGjegVvhnzLqPJqdUI', '--token-mode', 'tenant_access_token', '-t', 'preset.doc.default,preset.base.default', '-l', 'zh'] def _call_lark(tool_name, arguments, timeout=15): """底层调用 lark-mcp,返回工具调用结果""" proc = subprocess.Popen( LARK_MCP_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) msgs = [ json.dumps({"jsonrpc":"2.0","id":1,"method":"initialize", "params":{"protocolVersion":"2024-11-05","capabilities":{}, "clientInfo":{"name":"prd-review","version":"2.3"}}}), json.dumps({"jsonrpc":"2.0","method":"notifications/initialized"}), json.dumps({"jsonrpc":"2.0","id":2,"method":"tools/call", "params":{"name": tool_name, "arguments": arguments}}), ] out, err = proc.communicate(input='\n'.join(msgs).encode() + b'\n', timeout=timeout) for line in reversed(out.decode().strip().split('\n')): try: r = json.loads(line) if r.get('id') == 2: content = r.get('result', {}).get('content', []) for c in content: if c.get('type') == 'text': return c['text'] return r.get('result', r) except: pass return None def read_feishu_doc(document_id): """读取飞书文档原始内容,返回结构化内容""" return _call_lark("docx_v1_document_rawContent", {"path": {"document_id": document_id}}) def resolve_wiki_node(wiki_token): """从知识库 token 解析出实际文档的 obj_token""" result = _call_lark("wiki_v2_space_getNode", {"params": {"token": wiki_token}}) if isinstance(result, str): try: data = json.loads(result) return data.get('node', {}).get('obj_token', wiki_token) except: pass return wiki_token def write_to_feishu(markdown_content, file_name="PRD内审报告"): """将 Markdown 导入为飞书文档""" return _call_lark("docx_builtin_import", {"data": {"markdown": markdown_content, "file_name": file_name}}) URL 解析规则: 知识库链接 https://xxx.feishu.cn/wiki/ABCDEF → resolve_wiki_node("ABCDEF") 获取 document_id 普通文档 https://xxx.feishu.cn/docx/ABCDEF → 直接用 ABCDEF 作为 document_id 1.2 本地文件 直接使用 Read 工具读取文件内容。支持 .md、.txt、.docx(需 textutil 转换)。 1.3 粘贴文本 用户直接贴入时,将文本内容作为审核对象。
Step 2: 检测是否为二审 在识别文档类型前,先检查用户输入是否包含上次审核报告: 触发条件(满足任一即为二审模式): 用户同时提供了 PRD 文档 + 上次审核报告(两个文件/链接/文本) 用户明确提到"二审""复审""修改后再审""重新审核""check fix" audit-history 目录中存在该文档的上次审核记录(通过文档标题匹配) 如果是二审模式: 读取上次审核报告,提取所有已标记的问题列表(编号 + 级别 + 问题描述) 对照本次 PRD 内容,逐条判定修复状态: 状态 标记 判定规则 已修复 ✅ 原问题在本次文档中已不存在或已有明确修改 部分修复 ⚠️ 原问题有改善但未完全解决(如模糊词有补充但仍有个别遗漏) 未修复 ❌ 原问题在本次文档中仍然存在且未做任何修改 变更较大 🔄 修复方向正确但引入了新的问题或改变了设计思路 二审评分规则: 仅对未修复(❌)和部分修复(⚠️)项继续扣分,已修复(✅)项恢复对应分数 在报告顶部增加"二审对比"区块(见报告模板) 同步更新 audit-history JSON 中的 is_re_review: true
Step 3: 识别文档类型(A/B/C) 根据文档结构和内容特征自动判断: 特征 B 型(综合优化) A 型(新功能) C 型(紧急) 标题含"优化""修复""改进" ✅ 常见 ✅ 常见 有"竞品分析"章节 ✅ 几乎必有 有"状态机"章节 ✅ 常见 有"用户场景"章节 ✅ 几乎必有 有"目标上线时间"且紧急 ✅ 有"触发条件""来源"字段 ✅ 篇幅 1-2 页 8-15 页 <1 页 有"业务流程"含流程图 ✅ 判断优先级:有"触发条件"+"来源"+"目标上线时间"且篇幅短 → C 型 → 有"竞品分析"或"用户场景" → A 型 → 其他 → B 型。拿不准时标注"疑似 X 型"并说明理由。
Step 3.5: 类型分歧确认(有分歧时暂停) 触发条件(满足任一即暂停): 聚合文档中某些子节被判断为不同类型(如 B 型文档中检测到疑似 A 型/C 型子节) 文档标题特征与内容特征不一致(如标题写"优化"但某节含完整状态机和跨单据同步) 单节内容的信息密度明显超出所属类型的典型篇幅(如 B 型某节 >3 页) 暂停后输出类型确认提示: ⚠️ 类型确认提示 在审核过程中发现以下内容可能存在类型归档差异:
| 子节 | Skill 判断 | 判断理由 |
|---|---|---|
| 第 X 节 标题 | 疑似 A 型 | 理由:... |
- 如果确实是 A 型需求,建议拆分为独立 A 型文档后重新提交审核
- 如果认为属于 B 型需求,Skill 将按 B 型标准审核该节(不检查竞品分析、用户场景等 A 型专属项)
- 跳过确认 → 先按当前判断输出审核报告,后续可在二审中调整