PRD Writer
按照标准流程撰写产品需求文档 (PRD)。
流程概览(本地优先)
- 历史文档参考 → 按优先级学习历史风格(见下方参考优先级)
- 复习 SOP 规范 → 重温本 skill 的撰写风格和格式要求
- 本地撰写/修改 → 在本地 Markdown 文件中完成 PRD,格式严格遵循本 skill 规范
- 用户确认 → 用户审阅本地 PRD 内容,确认无误
- 发布至飞书 → 使用
lark-cli和 lark skill 发布到飞书文档- 飞书格式遵循 feishu-formatter 规范
- 发布前整体做一遍缩进 review,确保全部使用空格(无 tab)
- 仅使用 lark-cli 和 lark skill,忽略所有 MCP 工具
重要: 本地文件是 PRD 的 source of truth,飞书是发布渠道
历史文档参考优先级
撰写前参考已有文档,按以下优先级:
- ground-truth 文档(
content/ground-truth/)— 最高优先级,产品基准信息 - 相关 PRD 中 lastModified 较近的版本 — 反映最新决策
- 相关 PRD 中较早的版本 — 仅在必要时参考
参考链接归档
撰写过程中收到的参考链接,必须在对应 section 开头用引用块归档:
## 需求详情
> - [fal.ai Extend Video](https://fal.ai/models/xai/grok-imagine-video/extend-video)
> - [xAI Video Generation Guide](https://docs.x.ai/docs/guides/video-generation)
文末「参考链接」章节(固定收尾,必写)
每篇 PRD 文末固定以 ## 参考链接 收尾,归档本期实际依赖的上游/关联文档,即使撰写过程中用户没有显式给链接也要写——撰写时读过哪些历史 PRD / ground-truth / 埋点全集,就把它们的飞书链接归档进来。这是 Quokka 历史 PRD 的固定惯例(如 20260518、20260520、20260227 文末均有)。
收录范围(按相关性排,通常 2-5 条):
- 关联/上游 PRD(定义了本期沿用逻辑的版本)
- 计费表 / 埋点全集等 ground-truth 飞书文档(本期口径基线)
- 外部 API / 调研文档(如有)
格式同参考链接归档规则,blockquote + ul:
## 参考链接
> - [【Quokka】陪伴创作Agent一期](<FEISHU_DOC_URL>)
> - [【Quokka】支持模型参数&计费表](<FEISHU_DOC_URL>)
接口参考章节格式
## 接口参考 是独立的章节(非需求详情内的说明),用 blockquote 包裹无序列表,发布至飞书后渲染为带左灰边的引用块,与正文需求形成视觉区分:
## 接口参考
> - [产品介绍](https://docs.example.com/intro)
> - [商品创建](https://docs.example.com/product.create) · [商品修改](https://docs.example.com/product.modify)
> - [订阅创建](https://docs.example.com/subscription.create) · [订阅查询](https://docs.example.com/subscription.query)
禁止:
<!-- ❌ 错误:纯文本连续 blockquote 没有 bullet,在飞书中折叠为一行 -->
> [产品介绍](url1)
> [商品创建](url2)
> [订阅创建](url3)
<!-- ❌ 错误:裸 ul 没有外层 blockquote,发布飞书会丢失引用块视觉 -->
- [产品介绍](url1)
- [商品创建](url2)
正确的关键:每行 > 后必须紧跟 - (blockquote 内嵌 ul),飞书会把它识别为 <blockquote><ul><li>...</li></ul></blockquote> 单一引用块。同类型接口可用 · 连接在同一行,不同类型(商品、价格、订阅)各占一行。
参考链接归档(见上文)也使用同样的 blockquote+ul 模式,规则一致。
待确认问题标注
每个 section 中需要用户确认的问题,在该 section 开头用 [!warning] callout 标注:
## 需求详情
> [!warning] 待确认问题
> 1. Extend 模式是否需要独立的分辨率参数?
> 2. 参考图计费是每张还是总共?
飞书格式转换规则维护
在对话过程中如发现新的、值得记录的本地 ↔ 飞书格式转换规则,应向用户确认是否需要补充到 feishu-formatter 中
最高优先级:内容收敛原则
绝对禁止自主扩展未提及内容
核心禁令
- 禁止添加未提及的模块 - 需求方没有明确要求的章节,一律不写
- 按需组合原则 - 从以下模块中根据需求方实际要求选择(无固定必选项):
## 背景— 几乎必有## 设计稿链接— 有设计稿时添加,无则不加## 技术选型— 涉及技术决策时添加## 需求详情— 核心章节,几乎必有## [API/技术] 接口参考— 涉及外部 API 接入时添加## 会员权益变更— 涉及会员体系时添加## Reference— 需要附加技术参考资料时添加## 参考链接— 文末固定收尾章节,必写(归档关联/上游 PRD 与口径基线文档,见「文末『参考链接』章节」规则)
- 禁止清单 - 以下章节非必要不出现:
- ❌ 埋点需求 / 数据追踪
- ❌ 上线计划 / 项目排期
- ❌ 风险评估 / 风险分析
- ❌ 目标用户 / 用户画像
- ❌ 竞品分析
- ❌ 成功指标 / 效果验证
- ❌ 技术方案细节(除非有独立的技术选型章节)
- ❌ 运营策略
- ❌ 附录 / 术语表
违反后果: 添加未提及模块会导致 PRD 冗余、重点分散,必须删除后重写。
产品特定的废弃维度
- PixVerse Mini-App PRD 不写「分类归属」:入口位置只写「Mini-Apps 列表页」,不要再写「分类归属:Audio & Finishing」之类信息。Mini-Apps 列表页的分类体系已废弃,未来不再存在分类维度;继续写「分类归属 TBD」会留下过时假设让设计/开发误以为还要决策。读旧 PRD 改写时也顺手把分类信息删掉。
禁止清单(统一收口)
完成 PRD 后做一次 grep 式自检,以下任何一条出现就必须修正。这一节是「写完先看一眼」用的,不要分散查阅各 section:
结构 & 标题
- ❌ Markdown 正文出现 H1(飞书 H1 在文档标题块,正文从 H2 起)
- ❌ H2 带序号(H2 不编号)
- ❌ H3+ 没序号(必须
### 1. xxx/#### 1.1 xxx) - ❌ H2 章节之间缺少
---水平线
表格 & 单元格
- ❌ 表格内
![[name.png|200]]未转义为![[name.png\|200]](|必须\|,否则被 Markdown 当列分隔符切碎) - ❌ 「功能/页面」列单元格写
2.1/5.3章节序号前缀(编号只在 H3+ 章节标题里) - ❌ 表格内小标题后直接接纯文本段落、裸 blockquote / code / callout(默认写
**小标题**<br>• ...,富格式块作为 bullet 子项) - ❌ 单元格整格只堆纯文本段落(必须至少有一组
**小标题** + bullet或 bullet,极简一句话事实可例外但仍建议 bullet) - ❌ 数据字段逐字段拆行(字段名一行、类型一行、取值一行)→ 应归纳为业务概念在同一单元格
内容收敛
- ❌ Mini-App PRD 出现「分类归属:xxx」(分类体系已废弃)
- ❌ 出现未被需求方提到的章节:埋点 / 数据追踪 / 上线计划 / 排期 / 风险评估 / 目标用户 / 用户画像 / 竞品分析 / 成功指标 / 运营策略 / 附录
- ❌ 描述字号 / 颜色 / 间距 / 组件风格等视觉细节(设计稿是唯一来源)
格式规范
- ❌ 列表项末尾带句号
- ❌ 全文出现 tab 缩进(必须空格)
- ❌ 参考链接归档 / 接口参考用裸
- [...]或纯文本连续>(必须> - [text](url),blockquote + ul) - ❌ Front matter 出现中文 tag、自创 status 取值、PRD 已发布但缺
feishu字段
核心原则
- 渐进式丰富: 按需求方要求逐步丰富,避免过度详细
- 内容收敛: 不增加未提及的模块,严格按需求范围输出
- 格式规范: 列表项末尾不用句号;使用
→代替连接词 - 不写样式细节: PRD 不描述字号、颜色、组件风格等视觉样式,设计稿是样式的唯一来源
- 合并关联子模块: 逻辑紧密相关的子模块(如 UI 规格 + 适用页面)不拆成多个 H3 + 多个表格,应合并为同一表格同一行,默认用
**小标题**<br>• ...在单元格内分隔 - 字段按业务语义收敛: 数据字段描述不逐字段拆行(字段名一行、类型一行、取值一行),应归纳为一个业务概念(如「用户属性上报」)在同一单元格内组织
- 表格单元格默认结构化: 「需求详情」等单元格默认采用
**小标题**<br>• ...+ bullet points 组织内容,优先保证 Obsidian 表格预览像云文档;只有确实需要语义层级时才用##### 小标题。可以混用 code block / blockquote / callout 等富格式块。禁止整格直接堆纯文本段落,单元格内必须至少有一个加粗分组标题或一组 bullet。极简内容(一句话事实)可例外,但仍优先用 bullet 收敛 - 小标题之后必跟 bullet:
**小标题**<br>或##### 小标题下一行不允许直接接纯文本段落,表格 cell 内必须以•bullet 开头;即便只有一条内容也写成单条 bullet。富格式块(code / blockquote / callout)也应作为 bullet 的子项嵌入,而非裸贴在小标题下方
PRD 结构框架
Front Matter
---
title: "[前缀] 功能名称"
description: 一两句话概述 PRD 范围
tags:
- PixVerse
- tapfiliate
- affiliate
- commercialization
- web
date: YYYY-MM-DD
lastModified: YYYY-MM-DD
status: 待评审 # 待评审 / 开发中 / 已上线 / 已挂起,四选一
feishu: <飞书文档 URL> # 发布至飞书后回填,未发布则不写该字段
demo: <Demo 页面路径> # 有配套 demo 时填写相对路径(如 /demo/xxx.html),无则不写
---
字段语义
title—[前缀] 功能名称,前缀见下方「文档命名 → 标题前缀」description— 1-2 句概述 PRD 范围(会被scripts/sync-kanban.sh同步到 kanban-overview)tags— 4-8 个小写英文关键词,至少包含「产品名 + 功能领域 + 子模块」;不要混入中文 tag(与 search index / kanban 风格保持一致)。示例见上方date— 首次创建日期,写定后不再更新lastModified— 每次实质性内容变更都要更新status—待评审/开发中/已上线/已挂起四选一,不要自创取值feishu— 发布后回填,URL 形如<FEISHU_DOC_URL>>demo— 有配套 demo 页面时填相对路径(如/demo/erase.html);pnpm prd:feishu-links会自动在发布版本顶部插入「Demo 预览」callout(仅注入到 stdout,本地.md不动)
标题层级
- H2 作为主章节(不带序号):
## 背景、## 需求详情、## 技术选型 - H3 带数字序号:
### 1. 功能模块A或### 3.1 功能模块A - H4+ 继承上级编号:
#### 3.2.1 子模块 - H2 章节之间用
---水平线分隔 - Markdown 正文不包含 H1 标题
背景章节
1-3 段,简明扼要:当前状态 → 为什么做 → 本 PRD 范围
## 背景
PixVerse 当前仅支持个人用户使用,缺乏团队协作能力。
本方案为 Team Plan 的功能架构设计,目标客群为小型创意工作室 / Agency(2-15 人),定位轻量协作,不涉及审批流等企业级功能。
参考链接放在对应章节标题下方(详见「参考链接归档」规则)。
设计稿链接章节
有设计稿时放置链接,暂无则标注 TBD:
## 设计稿链接
TBD
需求详情撰写
表格类型选择
根据需求类型选择合适的表格结构:
类型 A:非 UI 功能(无参考图需求)
两列表格,适用于 CLI 命令、API 接口、后端逻辑等:
| 功能/页面 | 需求详情 |
| :--- | :--- |
| 功能名称 | 详细描述 |
类型 B:UI 功能(有参考图需求)
三列表格,适用于页面交互、UI 改动等:
| 功能/页面 | 需求详情 | 参考图 |
| :--- | :--- | :--- |
| 功能名称 | 详细描述 | ![[image-name.png\|200]] |
- 列名可用
详情或需求详情,保持同一文档内统一 - 参考图无则标注
TBD或留空,不写- - 禁止拆分关联子模块:一个完整功能的 UI 规格、适用页面、交互规则等应在同一行的同一单元格内用
**小标题**<br>• ...组织,不要拆成多个 H3 章节 + 多个表格 - 禁止写样式细节:不要描述字号、颜色、间距、组件风格等,这些由设计稿定义
- 「功能/页面」列禁止写章节序号:左列只放短功能名(如「首次进入」「切换 L1 大类」),不要写
2.1 首次进入/5.3 上传组件之类前缀。编号只能出现在 H3+ 章节标题(### 2. 默认选中与状态记忆),表格行内冗余编号会破坏信息架构、在飞书也会渲染出多余前缀 - 表格内 wiki-image 的
|必须转义为\|:写![[name.png\|200]],不能写裸![[name.png|200]]。裸|会被 Markdown 表格当列分隔符切碎,本地 Obsidian / Next.js 渲染都会崩。单元格外的 wiki-image 也可以统一写\|,一种写法不会出错
单元格内容组织
默认结构:加粗小标题 + bullet points
「需求详情」单元格的默认形态是 **小标题**<br>• ... 配 bullet list,避免单元格只塞一段纯文本,也让 Obsidian 表格预览接近云文档里的加粗分组。不要在表格 cell 里写 <br>- ...,Obsidian 会把它当普通横杠文本:
**包含的二级 Tab**<br>• Generate Video(默认选中)<br>• Template<br>• Reference<br>• Transition<br>• Modify
允许在 bullet 内嵌入 code block / blockquote(UI 文案)/ callout 等富格式块,例如:
**模型信息**<br>• 模型名:`Kling O3`<br>• Slogan
> 15s intelligent multi-shot · universal reference lock
禁止整格直接写纯文本段落:
<!-- ❌ 错误:单元格只有一段纯文本 -->
当前 Image 无子模式,不渲染 L2 Tab Bar,L1 选中 Image 后直接展示 Image 创作表单
<!-- ✅ 正确:用 bullet 收敛,必要时配 **小标题** -->
**规则**<br>• 当前 Image 无子模式,**不渲染 L2 Tab Bar**<br>• L1 选中 Image 后直接展示 Image 创作表单
例外:一句话即可说清的极简事实可以裸写一行 bullet,仍不允许多行散文段。
额外强制规则:**小标题**<br> 或 ##### 小标题 后必须是 • bullet,不允许直接接纯文本:
<!-- ❌ 错误:小标题下直接接段落 -->
**包含的二级 Tab**<br>
Generate Video(默认选中)、Template、Reference、Transition、Modify
<!-- ❌ 错误:小标题下裸贴 blockquote / code block -->
**Slogan**<br>
> 15s intelligent multi-shot
<!-- ✅ 正确:小标题后首个内容就是 bullet,富格式块作为 bullet 子项 -->
**Slogan**<br>• 主标语
> 15s intelligent multi-shot
子标题分隔
复杂功能在单元格内用 **小标题**<br>• ... 分隔逻辑块;只有确实需要语义层级时才用 ##### 小标题:
**模型信息**<br>• 模型名:Kling O3
> 15s intelligent multi-shot · universal reference lock
**参数**<br>• 时长:3-15s 之间任意整数(默认 5s)<br>• 画幅比:16:9 / 9:16 / 1:1
**支持模式 & 能力**<br>• ✅ T2V & I2V<br>• ✅ Multi-shot 多镜头开关
UI 文案引用
页面上实际展示的文案用 blockquote 格式:
- 标题
> Join {workspace_name}
- 副标题
> You've been invited to collaborate on PixVerse
- 按钮
> Accept Invitation
> Decline
多行内容
同一单元格内用 <br> 换行:
纯视频:$0.084/s<br>含音频:$0.112/s
分步流程
在单元格内描述多步骤交互:
**第一步,完成 Workspace 命名**<br>• 标题
> Give your Team Workspace a name
- 输入框
> Enter a name for the Team Workspace
- 按钮
> Confirm
**第二步,邀请团队成员**<br>• 标题
> Invite members to your workspace
场景分支
用 **Scenario X:场景描述**<br> 组织多场景:
**Scenario A:已登录,邮箱匹配**<br>1. 解析 token → 校验邮箱与当前登录账号一致<br>2. 展示邀请确认页<br>3. 点击 Accept → 加入团队 → Toast 提示
**Scenario B:未登录,已有账号**<br>1. 跳转登录页,邮箱预填写并锁定<br>2. 登录成功 → 自动跳回邀请确认页
特殊表格类型
功能支持状态表
| CLI 命令 | Web UI 命名 | API 端点 | 支持状态 |
| :--- | :--- | :--- | :--- |
| `create video` | Video | `/video/t2v` | ✅ 已实现 |
| `create template` | Template | `/video/t2v` with `template_id` | 🟡 后续迭代 |
| ~~`create restyle`~~ | ~~Restyle~~ | ~~`/video/restyle`~~ | ❌ 不支持 |
- ✅ 已实现 / 🟡 后续迭代 / ❌ 不支持
- 不支持的项用
~~strikethrough~~标记
权限矩阵表
布尔/状态列居中对齐,能力描述列左对齐:
| 能力 | Owner | Admin | Member | Guest |
| :--- | :---: | :---: | :---: | :---: |
| 账单管理 | ✅ | ❌ | ❌ | ❌ |
| 邀请/移除成员 | ✅ | ✅ | ❌ | ❌ |
计费/定价表
| 类型 | 模型 | 档位 | Fal 定价 | 积分定价 |
| --- | --- | --- | --- | --- |
| 视频 | Kling O3 | Standard | 纯视频:$0.084/s<br>含音频:$0.112/s | 纯视频:25<br>含音频:35 |
API 参数参考表
| 参数 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `prompt` | string | - | 正向提示词,最多 2500 字符 |
| `duration` | string | `"5"` | `"3"`-`"15"` 秒 |
多模型对比时扩展列:
| 参数 | 类型 | 默认值 | 说明 | Kling O3 | Kling 3.0 |
| --- | --- | --- | --- | --- | --- |
| `negative_prompt` | string | - | 负向提示词 | ❌ 不支持 | ✅ 支持 |
技术选型表
| 类别 | 选型 |
| :--- | :--- |
| 运行时 | Node.js (npm 分发) |
| CLI 框架 | Commander.js |
会员权益变更表
| 权益项 | Basic | Standard | Pro | Premium | Ultra |
| --- | --- | --- | --- | --- | --- |
| 功能使用权限 | ❌ | ❌ | TBD | TBD | TBD(40% OFF) |
默认值对比表
| 参数 | `create video` | `create image` | `create template` |
| :--- | :--- | :--- | :--- |
| model | `v5.6` | `qwen-image` | — |
| quality | `720p` | `1080p` | — |
Callout / 备注 用法
待确认问题 Callout
每个 section 中需要用户确认的问题,放在该 section 标题下方:
> [!warning] 待确认问题
> 1. Extend 模式是否需要独立的分辨率参数?
> 2. 参考图计费是每张还是总共?
架构说明 Callout
在需求表格前用 callout 说明核心架构或关键规则:
> [!info] 核心结构:Account → Workspace → Content
> - 每个用户对应一个 Account
> - 支持手动切换 Workspace
> - **Personal Workspace 与 Team Workspace 完全隔离**
| 功能/页面 | 详情 | 参考图 |
注意事项 Callout
> [!note]
> - Web 端需要前端交互的功能(如画笔涂抹、区域选择等),本期 CLI 不支持
> - 模板 Template 的信息复杂度较高,先暂缓,后续迭代支持
API 提供方说明
> **API 提供方**:[fal.ai](https://fal.ai)
后续迭代标注
> **后续迭代**:`--style`、`--camera` 等参数将在后续版本支持
图片引用
使用 Obsidian wiki-link 格式,统一宽度 200。在 Markdown 表格单元格内,| 必须转义为 \|,否则被当列分隔符切碎:
![[image-name.png\|200]]
参考图列中多张图时用 <br><br> 分隔,并加文字标注:
创建流程第一步<br>![[step1.png\|200]]<br><br>创建流程第二步<br>![[step2.png\|200]]
表格外(独立行、列表项)的 wiki-image 也建议统一写 \|,保持仓库内一种写法。
发布至飞书
格式转换、<title> 硬约束、图片上传 SOP、列宽规则、callout 反向映射、回读验证等全部按 feishu-formatter skill 执行。本 skill 不再平行维护一份发布步骤,避免两套规则漂移。
本地 PRD 完成后的交接点:
- 缩进 review → 全文 tab → 空格
- 禁止清单自检 → 见下方「禁止清单」一节
- 跑
pnpm prd:feishu-links <本地 PRD>→ 解析内部 wiki-link / 相对路径为飞书 URL;目标 PRD 无feishu时降级为文本但必须 warning,不允许静默发布 - 调用 feishu-formatter skill → 由其负责格式转换、
<title>验证、<colgroup>列宽、图片上传、回读 - 回填 feishu URL → 发布成功后将
doc_url写入本地 front matter
工具选择:仅使用 lark-cli 与 lark-* skill(lark-doc、lark-drive 等),禁止使用 MCP 工具。
飞书 → 本地归档:拉取后同样调用 feishu-formatter skill 的「飞书 → 本地 PRD 归档规范」反向转换,更新 lastModified,跑一次 pnpm build 验证。
文档命名
文件格式
YYYYMMDD_产品-功能关键词.md
示例:20260313_kling-o3-kling3.md、20260308_pixverse-team-plan.md
飞书文档标题 & Front Matter title
[产品/模块] 功能名称
示例:[PixVerse] Team Plan 产品设计方案、[Web] Kling O3 & Kling 3.0 视频 & 图片生成能力接入
标题前缀
标题前缀分为两类:产品名和平台/模块。
产品
| 前缀 | 说明 |
|---|---|
| [PixVerse] | AI 视频生成(Web: 专业创作者 / App: 娱乐模板) |
| [Quokka] | 移动端 AI 特效工具 |
平台 / 模块
| 前缀 | 说明 |
|---|---|
| [Web] | Web 端功能(模型接入、页面改动等) |
| [PixVerse App] | PixVerse 移动端 App 功能 |
| [国内] | 国内版本差异化功能 |
| [Analytics] | 埋点 / 数据字段变更 |
| [Galaxy Store] | Galaxy Store 上架相关 |
| [商业化] | 跨产品商业化模块(支付、分销等) |
| [运营后台] | 运营管理系统 |
质量检查
完成 PRD 后,参考以下清单进行验证:
结构检查
- H2 无序号,H3+ 有序号
- H2 章节之间有
---水平线 - 需求表格类型正确(两列 vs 三列)
- 列表项无句号
内容检查
- 背景 1-3 段,简明扼要
- 需求详情表格内容结构清晰(子标题分隔、UI 文案引用、场景分支)
- 无未提及的多余章节
- 功能状态使用 ✅ / 🟡 / ❌ 标记
- 逻辑紧密的子模块在同一行同一单元格内,未拆分为多个 H3 + 多个表格
- 表格单元格默认使用
**小标题**<br>• ...+ bullet 组织,未整格堆纯文本段落 - 每个
**小标题**<br>/##### 小标题下方第一行都是•bullet,未直接接纯文本或裸贴 code/blockquote/callout - 无样式细节描述(字号、颜色、间距、组件风格等)
- 数据字段按业务语义归纳为一个概念行,未逐字段拆行
表格检查
- 权限/对比表布尔列居中对齐
:---: - 定价表多维度用
<br>组织 - API 参数表包含:参数、类型、默认值、说明
- 不支持的功能用
~~strikethrough~~标记 - 「功能/页面」列单元格不带
2.1 / 5.3之类章节序号前缀 - PixVerse Mini-App PRD 入口表未写「分类归属」(分类体系已废弃)
格式检查
- 全文缩进使用空格,无 tab
- 参考链接已在对应 section 开头归档
- 文末有
## 参考链接收尾章节,已归档关联/上游 PRD 与口径基线文档(blockquote + ul) - 待确认问题已用
[!warning]callout 标注 - 所有表格内 wiki-image 都写成
![[name.png\|200]](|已转义为\|)
飞书表格和 Callout 的格式规范,请参考 feishu-formatter skill