diff --git a/.axhub/make/sidebar-tree.json b/.axhub/make/sidebar-tree.json index 05b4337..d6fc6be 100644 --- a/.axhub/make/sidebar-tree.json +++ b/.axhub/make/sidebar-tree.json @@ -262,6 +262,12 @@ "title": "业务条线说明", "itemKey": "prototypes/lease-business-line-overview" }, + { + "id": "item:prototypes:autorodo-web", + "kind": "item", + "title": "AutoRDO 需求清洗工作台", + "itemKey": "prototypes/autorodo-web" + }, { "id": "item:prototypes:yunxiao-pipeline-handbook", "kind": "item", diff --git a/src/prototypes/autorodo-web/.spec/confirm-flow.md b/src/prototypes/autorodo-web/.spec/confirm-flow.md new file mode 100644 index 0000000..9dc46b4 --- /dev/null +++ b/src/prototypes/autorodo-web/.spec/confirm-flow.md @@ -0,0 +1,132 @@ +# AutoRDO 需求清洗工作台 · 粘回确认与上报门禁 + +> 实现:`lib/parseDraft.ts`、`lib/pendingQuestions.ts`、`lib/applyAnswer.ts`、`lib/inferMeta.ts`、`lib/buildRecordPrompt.ts` +> UI:`components/StepConfirm.tsx`、`components/StepExport.tsx` + +本规格覆盖步骤 2「确认待确认」的解析 / 答题 / 元数据补齐,以及进入步骤 3「上报云效」前的门禁判定。 +**原型本地逻辑;未接真实云效 API、未接 AutoRDO 服务端。** + +--- + +## 前置条件 + +| 场景 | 是否校验 / 是否执行 | +|------|---------------------| +| 粘回区为空就点「解析初稿」 | 拦截:提示「请先粘贴 AutoRDO 初稿」;不改草稿列表 | +| 粘回文不含 `**标题**` /「原始诉求(AutoRDO)」可识别块 | 拦截:提示未能解析;不改草稿列表 | +| 尚未解析出任何草稿 | 不上报;步骤 3 导航禁用(无 drafts);步骤 2 出口提示「请先粘回并解析」 | +| 某条仍有未答「待确认」 | 该条 `confirmed=false`;不可进入上报 | +| 某条元数据不齐(类型 / 优先级 / 标签 / 提交部门 / 提交人) | `metaComplete=false`;不可进入上报 / 不可复制上报提示词 | +| 答题时选项与补充均为空 | 「确认并下一题」禁用;不调用 `applyPendingAnswer` | +| 补充文案非空 | **优先**用补充文案作为答案(覆盖单选) | + +--- + +## 判定优先级顺序 + +### A. 解析初稿(`parseAutorodoDraft`) + +按块拆分后,对每个需求块提取字段;**命中即采用,不再用更弱规则覆盖已提取值**。 + +| 优先级 | 条件 | 结果 | +|--------|------|------| +| 1 | Markdown 能按 `### N` 切出多块,且块内含「原始诉求(AutoRDO)」或 `**标题**` | 多条 `RequirementDraft` | +| 2 | 无法切块,但全文含 `**标题**` | 整篇视为 1 条草稿 | +| 3 | 以上皆否 | 返回空数组 → UI 报解析失败 | +| 4 | 块内匹配 `**标题**:…` | 写入 `title` | +| 5 | 块内匹配 `**描述**:` 至「待确认」之前 | 写入 `description` | +| 6 | 「待确认:」后为「无」或空 | `pendings=[]`,`confirmed=true` | +| 7 | 「待确认:」后有列表行 | 每行一条 `PendingItem`(去列表前缀),`confirmed=false` | + +解析成功后流水线(`StepConfirm.handleParse`): + +1. `enrichPendingsWithQuestions` — 为每条待确认生成题干与选项 +2. `inferSubmitMeta(标题+描述)` — 仅在提交部门 / 提交人为空时填入启发式结果 + +### B. 待确认选项启发式(`buildOptionsForPending`) + +| 优先级 | 原文匹配 | 题干 / 选项 | +|--------|----------|-------------| +| 1 | 含「导出范围」或「范围」 | 「导出范围」指什么?→ 当前筛选结果 / 全部数据 / 仅勾选行 | +| 2 | 含「模块」或「归属」 | 归属哪个业务模块?→ 租赁合同管理 / 车辆管理 / 证照管理 / 还车应结款 | +| 3 | 其它 | 原文(补「?」)→ 确认按原文理解 / 暂不纳入本需求 / 需文字补充 | + +### C. 答题写回描述(`applyPendingAnswer`) + +| 优先级 | 条件 | 描述写回 | +|--------|------|----------| +| 0 | 答案 trim 为空,或找不到 `pendingId` | 原样返回,不改 | +| 1 | 描述中存在 `{标签}:待确认` 占位 | 替换为 `{标签}:{答案}` | +| 2 | 描述中含任意「待确认」 | 替换**首个**「待确认」为答案 | +| 3 | 以上皆否 | 在描述末尾追加 `{标签}:{答案}` | + +答完后:该 pending `resolved=true`;若全部 resolved → `confirmed=true`。 + +### D. 提交部门 / 提交人启发式(`inferSubmitMeta`) + +仅作预填,用户可改;**不**自动填类型 / 优先级 / 标签。 + +| 字段 | 优先级 | 匹配 | +|------|--------|------| +| 提交部门 | 1 | `提交部门|部门:…` | +| 提交部门 | 2 | 固定词:业务管理组 / 产品部 / 安全部 / 运营部 / 财务部 / 技术部 | +| 提交人 | 1 | `提交人|反馈人|提出人:…` | +| 提交人 | 2 | `@姓名`(2–4 汉字) | +| 提交人 | 3 | `姓名反馈` | + +### E. 进入上报门禁(`StepConfirm` + `metaComplete` + `buildYunxiaoRecordPrompt`) + +全部需求须同时满足: + +| 优先级 | 条件 | 用户可见结果 | +|--------|------|--------------| +| 1 | `drafts.length > 0` | 否则提示先粘回解析 | +| 2 | 每条 `confirmed === true`(无未答待确认) | 「需求 N:还有 K 项待确认」 | +| 3 | 每条 `metaComplete`:类型、优先级、≥1 标签、提交部门、提交人 | 「需求 N:缺少 …」 | +| 4 | 全部通过 | 显示「进入上报」;步骤 3 可复制 YunxiaoPMapp 多条记录提示词 | + +`buildYunxiaoRecordPrompt` 在复制时再次校验;未通过则抛错,步骤 3 预览区展示错误与缺失清单。 + +--- + +## 数据源 + +| 来源 | 类型 | 说明 | +|------|------|------| +| 粘回 Markdown | 用户粘贴 | Cursor 跑完 AutoRDO 后的初稿;**本机剪贴板,非 API** | +| 本地启发式选项 | 代码常量 | `pendingQuestions.ts` / `inferMeta.ts` 正则与枚举;**未接字典服务** | +| 用户答题与元数据 | 会话内存 | 刷新丢失;**未持久化、未接云效** | +| 清洗 / 上报提示词 | 本地拼接 | `buildCleanPrompt` / `buildYunxiaoRecordPrompt`;用户自行粘到 Cursor 执行 Skill | + +**明确非数据源**:云效 OpenAPI、AutoRDO 远程清洗、需求库回写。 + +--- + +## 用户可见结果 + +| 动作 | 通过 | 失败 / 拦截 | +|------|------|-------------| +| 解析初稿 | 出现需求分页胶囊;展示标题、实时描述、待确认卡、元数据区 | 红字错误提示;草稿不变 | +| 确认并下一题 | 描述实时更新;下一题或「本需求待确认项已全部答完」 | 按钮禁用(无答案) | +| 补齐元数据 | 分段按钮 / 标签芯片即时反映 | — | +| 进入上报 | 主按钮可点 → 步骤 3 | 「尚不能进入上报」+ 缺失列表 | +| 复制上报提示词 | Toast:已复制,请粘到 Cursor 跑 YunxiaoPMapp | 预览区错误 +「请返回步骤 2」 | +| 复制定稿 Markdown | Toast:已复制定稿 Markdown | 无草稿时禁用 | + +标题写入上报口令时格式:`【新增|优化】` + 标题(若标题已带同前缀则去重)。每条 `推进至=暂不推进`。 + +--- + +## 代码路径 + +| 能力 | 路径 | +|------|------| +| 解析粘回稿 | `lib/parseDraft.ts` → `parseAutorodoDraft` | +| 待确认题干与选项 | `lib/pendingQuestions.ts` → `buildOptionsForPending` / `enrichPendingsWithQuestions` | +| 答题写回 | `lib/applyAnswer.ts` → `applyPendingAnswer` | +| 部门 / 人预填 | `lib/inferMeta.ts` → `inferSubmitMeta` | +| 元数据齐全 & 上报提示词 | `lib/buildRecordPrompt.ts` → `metaComplete` / `buildYunxiaoRecordPrompt` | +| 确认步 UI 与门禁 | `components/StepConfirm.tsx` | +| 上报步复制 | `components/StepExport.tsx` | + +关联产品说明:见 [requirements-prd.md](./requirements-prd.md) §6 / §8。 diff --git a/src/prototypes/autorodo-web/.spec/requirements-prd.md b/src/prototypes/autorodo-web/.spec/requirements-prd.md new file mode 100644 index 0000000..3caeb80 --- /dev/null +++ b/src/prototypes/autorodo-web/.spec/requirements-prd.md @@ -0,0 +1,245 @@ +# AutoRDO 需求清洗工作台 · 产品需求说明(全模块) + +## 1. 一句话与目标 + +**一句话** +给产品经理一个网页工作台:粘贴聊天/截图/语音素材 → 复制 AutoRDO 清洗提示词 → 粘回初稿确认待确认并补齐上报字段 → 复制 YunxiaoPMapp 多条「记录需求」提示词,在 Cursor 侧完成入库。 + +**要解决的问题** +- 碎片素材难直接写成可入库的标题与书面描述 +- 多条诉求混在一起,容易漏拆或合并错 +- 「待确认」项靠聊天来回补,缺少结构化答题与门禁 +- 上报云效前缺少类型、优先级、标签、提交部门/人的齐套校验 +- 不想在网页直连云效,只希望生成可粘贴执行的口令 + +**本期目标** +1. 三步工作台:粘贴素材 → 确认待确认 → 上报云效(复制口令) +2. 支持文本 + 图片/语音附件芯片(不上传;由 Cursor 多模态识读) +3. 一键复制 AutoRDO 清洗提示词;可选「粘贴后自动复制」 +4. 粘回初稿后解析多条需求、分页答题、补齐元数据 +5. 齐套后一键复制 YunxiaoPMapp 多条记录需求提示词(及定稿 Markdown) + +**非目标(本期不做)** +- 不直连云效 OpenAPI / 不在网页内建单 +- 不在网页内跑 AutoRDO 模型清洗(只生成提示词) +- 不做账号登录、权限、草稿云端持久化 +- 不替代 YunxiaoPMapp / AutoRDO Skill 本体规则 + +## 2. 模块边界(最重要) + +```mermaid +flowchart LR + subgraph web [AutoRDO 网页工作台] + P[粘贴素材] + C[确认待确认] + E[上报口令] + end + Cursor[Cursor + AutoRDO / YunxiaoPMapp] + YX[云效需求] + P -->|复制清洗提示词| Cursor + Cursor -->|粘回初稿 Markdown| C + C --> E + E -->|复制记录需求提示词| Cursor + Cursor -->|Skill 执行| YX +``` + +| 业务线 / 子域 | 做什么 | 不做什么 | +|---------------|--------|----------| +| 素材采集 | 粘贴文本与图/语音文件名芯片,生成清洗提示词 | 不上传附件、不识读媒体二进制 | +| 确认补齐 | 解析初稿、答待确认、编辑标题/描述、补元数据 | 不自动推进云效状态 | +| 上报出口 | 预览并复制多条「记录需求」口令 / 定稿 Markdown | 不调用云效 API | + +**外部依赖(产品口径)** + +| 依赖方 | 交互方式 | 产品要求 | +|--------|----------|----------| +| AutoRDO(Cursor Skill) | 用户粘贴清洗提示词后执行 | 产出含标题、描述、「待确认」的 Markdown 初稿 | +| YunxiaoPMapp(Cursor Skill) | 用户粘贴上报提示词后执行 | 按条独立记录需求;本工作台默认「暂不推进」 | +| 剪贴板 | 浏览器复制 / 粘贴 | 复制失败时明确提示,可重试 | + +**关键约束** +- 一条上报口令可含多条「记录需求」,**禁止合并为一条** +- 未答完待确认或元数据不齐 → **禁止**进入可复制的上报态 +- 标题类型仅「新增 / 优化」;写入口令时带 `【新增】` / `【优化】` 前缀 + +## 3. 用户与角色 + +| 角色 | 主要目标 | +|------|----------| +| 产品经理(如王冕) | 快速把碎片诉求洗成可入库描述,并复制口令交给 YunxiaoPMapp | +| 兼岗业管 / 业务接口人 | 粘贴业务反馈素材,确认模糊项后交产品入库 | +| 评审 / 培训 | 演示「清洗 → 确认 → 上报口令」闭环,不改真实云效 | + +## 4. 用户故事与故事点(业务条线说明口径) + +> 合计约 **13 SP**(可按团队基准调整)。 + +### Epic A · 粘贴与清洗提示词(约 4 SP) + +#### A1 · 多模态素材粘贴与复制清洗提示词 +- **角色**:产品经理 +- **起点**:手里有聊天记录、口述笔记、截图或语音文件名 +- **怎么运作**: + 1. 在步骤 1 粘贴正文;粘贴图片/语音时显示附件芯片(可移除) + 2. 点「确认并复制清洗提示词」,或开启「粘贴后自动复制」 + 3. 将提示词粘到 Cursor,按 AutoRDO 规则清洗 +- **关键结果**:`可`无正文仅附件时仍复制;`禁止`正文与附件皆空时复制 +- **闭环**:剪贴板拿到可执行的 AutoRDO 提示词,Toast 提示去 Cursor 执行 +- **排期**:US-01 · M + +### Epic B · 粘回确认与元数据(约 6 SP) + +#### B1 · 解析初稿并分页答待确认 +- **角色**:产品经理 +- **起点**:Cursor 已产出 AutoRDO 初稿 Markdown +- **怎么运作**: + 1. 粘回步骤 2,点「解析初稿」拆成多条需求分页 + 2. 对每条未确认项选题或填写补充,确认后描述实时写回 + 3. 可手改标题与描述 +- **关键结果**:`可`跳过已全部确认的需求;`禁止`空答案提交 +- **闭环**:各需求「待确认」清零或标明无待确认 +- **排期**:US-02 · L + +#### B2 · 补齐上报元数据并门禁放行 +- **角色**:产品经理 +- **起点**:待确认已处理或无需处理 +- **怎么运作**: + 1. 选择类型(新增/优化)、优先级;添加标签;确认提交部门与提交人(可预填) + 2. 系统列出缺失项;全部齐套后出现「进入上报」 +- **关键结果**:`禁止`缺项时进入可复制上报 +- **闭环**:全部需求确认且元数据齐套,进入步骤 3 +- **排期**:US-03 · M + +> 判定顺序、启发式选项与写回规则全文见 **[confirm-flow.md](./confirm-flow.md)**。 + +### Epic C · 云效上报口令(约 3 SP) + +#### C1 · 复制多条记录需求提示词 +- **角色**:产品经理 +- **起点**:步骤 2 已放行 +- **怎么运作**: + 1. 在步骤 3 预览 YunxiaoPMapp 多条「记录需求」口令 + 2. 一键复制;可选复制定稿 Markdown 存档 + 3. 粘到 Cursor 执行 YunxiaoPMapp(本页不直连云效) +- **关键结果**:`禁止`未齐套时复制上报口令;每条独立、暂不推进 +- **闭环**:口令已复制,可在 Cursor 侧完成入库 +- **排期**:US-04 · M + +## 5. 功能模块说明(正向 / 逆向) + +### 5.1 粘贴素材 + +**正向** +1. 输入或粘贴文本;粘贴图/语音出现附件芯片 +2. 确认复制清洗提示词;成功 Toast + +**逆向 / 边界** + +| 情况 | 系统表现 | +|------|----------| +| 无正文且无附件 | 主按钮禁用 | +| 复制失败 | 错误提示,可重试 | +| 关闭自动复制 | 仅手动确认时复制 | + +### 5.2 确认待确认 + +**正向** +1. 粘回初稿 → 解析 → 分页答题 → 补元数据 → 进入上报 + +**逆向 / 边界** + +| 情况 | 系统表现 | +|------|----------| +| 空粘回 / 无法解析 | 错误提示,不覆盖已有草稿(解析失败时) | +| 仍有待确认或缺元数据 | 「尚不能进入上报」+ 清单 | +| 补充文案与单选并存 | 以补充文案为准 | + +### 5.3 上报云效(口令) + +**正向** +1. 预览完整提示词 → 一键复制 → 去 Cursor 执行 +2. 可另复制定稿 Markdown(待确认:无) + +**逆向 / 边界** + +| 情况 | 系统表现 | +|------|----------| +| 草稿未齐套 | 预览区错误 + 缺失列表;复制上报禁用 | +| 无草稿 | 提示先完成步骤 2 | +| 本页 | **不**调用云效 API | + +## 6. 关键业务逻辑(必须对齐) + +### 6.1 粘回确认与上报门禁 + +摘要(全文见 [confirm-flow.md](./confirm-flow.md)): + +| 优先级 | 规则 | 说明 | +|--------|------|------| +| 1 | 先能解析出 ≥1 条需求 | 否则无法确认/上报 | +| 2 | 每条待确认须答完或初稿标明「无」 | 否则不可上报 | +| 3 | 类型、优先级、标签、提交部门、提交人齐套 | 否则不可上报 | +| 4 | 上报口令按条独立 + 暂不推进 | 不合并、不在本页推进状态 | + +**数据源(产品口径)** +- 粘回 Markdown(用户从 Cursor 粘贴) +- 本地启发式选项与部门/人预填(原型本地,未接真 API) +- 用户当场填写的答案与元数据(会话内) + +**用户可见结果** +- 通过:进入上报并可复制口令 +- 拦截:缺失清单文案;复制上报不可用 + +## 7. 总览流程图 + +```mermaid +flowchart TD + A[粘贴文本/图/语音芯片] --> B[复制 AutoRDO 清洗提示词] + B --> C[Cursor 执行 AutoRDO] + C --> D[粘回初稿 Markdown] + D --> E{解析成功?} + E -->|否| D + E -->|是| F[分页答待确认] + F --> G[补齐元数据] + G --> H{全部齐套?} + H -->|否| F + H -->|是| I[复制 YunxiaoPMapp 多条记录提示词] + I --> J[Cursor 执行入库] + J --> K[云效出现需求 · 本页结束] +``` + +## 8. 验收清单(产品 / 测试) + +**粘贴与清洗** +- [ ] 可粘贴文本;粘贴图片/语音显示附件芯片且可移除 +- [ ] 「确认并复制清洗提示词」生成含 AutoRDO 指令与素材区的提示词 +- [ ] 「粘贴后自动复制」开启时,粘贴文本会自动复制 +- [ ] 正文与附件皆空时不可复制 + +**确认与门禁** +- [ ] 粘回合法初稿可解析出多条并分页 +- [ ] 待确认可选题或补充;描述实时更新 +- [ ] 未答完或元数据不齐时不可进入上报,并列出缺失项 +- [ ] 部门/人可预填且可改;类型仅新增/优化 + +**上报口令** +- [ ] 齐套后可复制多条「记录需求」口令,含优先级/标签/部门/人,推进至=暂不推进 +- [ ] 可复制定稿 Markdown(待确认:无) +- [ ] 页面无云效直连写单行为 + +**文档** +- [ ] 标注目录可打开「产品需求说明(PRD)」与「粘回确认与上报门禁」 +- [ ] 规格与页面行为一致(见 confirm-flow.md) + +## 9. 交付口径 + +交付可运行的 **AutoRDO 需求清洗工作台** 原型:产品经理在网页完成「粘贴素材 → 复制清洗提示词 → 粘回确认待确认与元数据 → 复制 YunxiaoPMapp 多条记录需求提示词」;实际清洗与云效入库均在 Cursor Skill 侧完成,**网页不直连云效**。复杂确认与门禁规则以 `.spec/confirm-flow.md` 为准。 + +预览路径:`/prototypes/autorodo-web`;对象存储发布形态:`{baseUrl}/autorodo-web/index.html`。 + +## 10. 功能变更记录 + +> 产品经理原型发版记录。仅记功能与业务逻辑变更;不含样式/UI/表结构。 +> 由「需求定稿」关键字触发追加;日常改原型不强制每改必写。 + +(尚无定稿版本;首轮 AutoPRD 落盘。) diff --git a/src/prototypes/autorodo-web/AutorodoWebApp.tsx b/src/prototypes/autorodo-web/AutorodoWebApp.tsx new file mode 100644 index 0000000..4375884 --- /dev/null +++ b/src/prototypes/autorodo-web/AutorodoWebApp.tsx @@ -0,0 +1,81 @@ +import React, { useState } from 'react'; +import type { RequirementDraft, WizardStep } from './lib/types'; +import { StepPaste } from './components/StepPaste'; +import { StepConfirm } from './components/StepConfirm'; +import { StepExport } from './components/StepExport'; + +const STEPS: Array<{ id: WizardStep; title: string; desc: string }> = [ + { id: 1, title: '粘贴素材', desc: '复制清洗提示词' }, + { id: 2, title: '确认待确认', desc: '粘回初稿并答题' }, + { id: 3, title: '上报云效', desc: '复制记录需求口令' }, +]; + +export function AutorodoWebApp() { + const [step, setStep] = useState(1); + const [drafts, setDrafts] = useState([]); + const [activeIndex, setActiveIndex] = useState(0); + const [pasteBack, setPasteBack] = useState(''); + + const canGoStep = (id: WizardStep): boolean => { + if (id === 1) return true; + // 步骤 2:始终可进,便于粘回初稿;有 drafts 时同样可进 + if (id === 2) return true; + // 步骤 3:有草稿后可预览(完整校验在 StepConfirm / StepExport) + if (id === 3) return drafts.length > 0; + return false; + }; + + return ( +
+ + +
+ {step === 1 && } + {step === 2 && ( + setStep(3)} + /> + )} + {step === 3 && } +
+
+ ); +} + +export default AutorodoWebApp; diff --git a/src/prototypes/autorodo-web/annotation-source.json b/src/prototypes/autorodo-web/annotation-source.json new file mode 100644 index 0000000..b095995 --- /dev/null +++ b/src/prototypes/autorodo-web/annotation-source.json @@ -0,0 +1,197 @@ +{ + "documentVersion": 1, + "format": "axhub-annotation-source", + "data": { + "version": 2, + "prototypeName": "autorodo-web", + "pageId": "main", + "updatedAt": 1784917000000, + "nodes": [ + { + "id": "arw-page", + "index": 1, + "title": "工作台总览", + "pageId": "main", + "locator": { + "selectors": [ + "[data-annotation-id=\"arw-page\"]" + ], + "fingerprint": "arw-page", + "path": [] + }, + "aiPrompt": "AutoRDO 需求清洗工作台三步:粘贴素材、确认待确认、上报云效。", + "annotationText": "三步工作台:① 粘贴文/图/语音 → 复制 AutoRDO 清洗提示词;② 粘回初稿确认待确认;③ 复制 YunxiaoPMapp 多条记录需求提示词。", + "hasMarkdown": false, + "color": "#32a06e", + "images": [], + "createdAt": 1784916000000, + "updatedAt": 1784916000000 + }, + { + "id": "arw-step-paste", + "index": 2, + "title": "步骤 1 · 粘贴素材", + "pageId": "main", + "locator": { + "selectors": [ + "[data-annotation-id=\"arw-step-paste\"]" + ], + "fingerprint": "arw-step-paste", + "path": [] + }, + "aiPrompt": "粘贴区与复制清洗提示词。", + "annotationText": "主按钮「确认并复制清洗提示词」;可选「粘贴后自动复制」。图片/语音粘贴显示为附件芯片(不上传,由 Cursor 多模态识读)。", + "hasMarkdown": false, + "color": "#3fb87c", + "images": [], + "createdAt": 1784916000000, + "updatedAt": 1784916000000 + }, + { + "id": "arw-step-confirm", + "index": 3, + "title": "步骤 2 · 确认待确认", + "pageId": "main", + "locator": { + "selectors": [ + "[data-annotation-id=\"arw-step-confirm\"]" + ], + "fingerprint": "arw-step-confirm", + "path": [] + }, + "aiPrompt": "粘回初稿、解析、答题、补元数据与上报门禁。", + "annotationText": "粘回 AutoRDO 初稿并解析;分页答待确认;补齐类型/优先级/标签/提交部门/人后才可进入上报。规则见专题规格「粘回确认与上报门禁」。", + "hasMarkdown": false, + "color": "#2f9e6e", + "images": [], + "createdAt": 1784917000000, + "updatedAt": 1784917000000 + }, + { + "id": "arw-step-export", + "index": 4, + "title": "步骤 3 · 上报云效", + "pageId": "main", + "locator": { + "selectors": [ + "[data-annotation-id=\"arw-step-export\"]" + ], + "fingerprint": "arw-step-export", + "path": [] + }, + "aiPrompt": "复制 YunxiaoPMapp 多条记录需求提示词。", + "annotationText": "预览并一键复制多条「记录需求」提示词(暂不推进);可复制定稿 Markdown。本页不直连云效 API。", + "hasMarkdown": false, + "color": "#268f62", + "images": [], + "createdAt": 1784917000000, + "updatedAt": 1784917000000 + } + ], + "stateControls": [] + }, + "markdownMap": {}, + "assetMap": {}, + "directory": { + "nodes": [ + { + "type": "folder", + "id": "arw-doc-root", + "title": "AutoRDO 需求清洗工作台说明", + "defaultExpanded": true, + "children": [ + { + "type": "markdown", + "id": "arw-doc-prd", + "title": "产品需求说明(PRD)", + "markdownPath": ".spec/requirements-prd.md", + "markdown": "# AutoRDO 需求清洗工作台 · 产品需求说明(全模块)\n\n## 1. 一句话与目标\n\n**一句话** \n给产品经理一个网页工作台:粘贴聊天/截图/语音素材 → 复制 AutoRDO 清洗提示词 → 粘回初稿确认待确认并补齐上报字段 → 复制 YunxiaoPMapp 多条「记录需求」提示词,在 Cursor 侧完成入库。\n\n**要解决的问题** \n- 碎片素材难直接写成可入库的标题与书面描述 \n- 多条诉求混在一起,容易漏拆或合并错 \n- 「待确认」项靠聊天来回补,缺少结构化答题与门禁 \n- 上报云效前缺少类型、优先级、标签、提交部门/人的齐套校验 \n- 不想在网页直连云效,只希望生成可粘贴执行的口令 \n\n**本期目标** \n1. 三步工作台:粘贴素材 → 确认待确认 → 上报云效(复制口令) \n2. 支持文本 + 图片/语音附件芯片(不上传;由 Cursor 多模态识读) \n3. 一键复制 AutoRDO 清洗提示词;可选「粘贴后自动复制」 \n4. 粘回初稿后解析多条需求、分页答题、补齐元数据 \n5. 齐套后一键复制 YunxiaoPMapp 多条记录需求提示词(及定稿 Markdown) \n\n**非目标(本期不做)** \n- 不直连云效 OpenAPI / 不在网页内建单 \n- 不在网页内跑 AutoRDO 模型清洗(只生成提示词) \n- 不做账号登录、权限、草稿云端持久化 \n- 不替代 YunxiaoPMapp / AutoRDO Skill 本体规则 \n\n## 2. 模块边界(最重要)\n\n```mermaid\nflowchart LR\n subgraph web [AutoRDO 网页工作台]\n P[粘贴素材]\n C[确认待确认]\n E[上报口令]\n end\n Cursor[Cursor + AutoRDO / YunxiaoPMapp]\n YX[云效需求]\n P -->|复制清洗提示词| Cursor\n Cursor -->|粘回初稿 Markdown| C\n C --> E\n E -->|复制记录需求提示词| Cursor\n Cursor -->|Skill 执行| YX\n```\n\n| 业务线 / 子域 | 做什么 | 不做什么 |\n|---------------|--------|----------|\n| 素材采集 | 粘贴文本与图/语音文件名芯片,生成清洗提示词 | 不上传附件、不识读媒体二进制 |\n| 确认补齐 | 解析初稿、答待确认、编辑标题/描述、补元数据 | 不自动推进云效状态 |\n| 上报出口 | 预览并复制多条「记录需求」口令 / 定稿 Markdown | 不调用云效 API |\n\n**外部依赖(产品口径)** \n\n| 依赖方 | 交互方式 | 产品要求 |\n|--------|----------|----------|\n| AutoRDO(Cursor Skill) | 用户粘贴清洗提示词后执行 | 产出含标题、描述、「待确认」的 Markdown 初稿 |\n| YunxiaoPMapp(Cursor Skill) | 用户粘贴上报提示词后执行 | 按条独立记录需求;本工作台默认「暂不推进」 |\n| 剪贴板 | 浏览器复制 / 粘贴 | 复制失败时明确提示,可重试 |\n\n**关键约束** \n- 一条上报口令可含多条「记录需求」,**禁止合并为一条** \n- 未答完待确认或元数据不齐 → **禁止**进入可复制的上报态 \n- 标题类型仅「新增 / 优化」;写入口令时带 `【新增】` / `【优化】` 前缀 \n\n## 3. 用户与角色\n\n| 角色 | 主要目标 |\n|------|----------|\n| 产品经理(如王冕) | 快速把碎片诉求洗成可入库描述,并复制口令交给 YunxiaoPMapp |\n| 兼岗业管 / 业务接口人 | 粘贴业务反馈素材,确认模糊项后交产品入库 |\n| 评审 / 培训 | 演示「清洗 → 确认 → 上报口令」闭环,不改真实云效 |\n\n## 4. 用户故事与故事点(业务条线说明口径)\n\n> 合计约 **13 SP**(可按团队基准调整)。\n\n### Epic A · 粘贴与清洗提示词(约 4 SP)\n\n#### A1 · 多模态素材粘贴与复制清洗提示词\n- **角色**:产品经理 \n- **起点**:手里有聊天记录、口述笔记、截图或语音文件名 \n- **怎么运作**: \n 1. 在步骤 1 粘贴正文;粘贴图片/语音时显示附件芯片(可移除) \n 2. 点「确认并复制清洗提示词」,或开启「粘贴后自动复制」 \n 3. 将提示词粘到 Cursor,按 AutoRDO 规则清洗 \n- **关键结果**:`可`无正文仅附件时仍复制;`禁止`正文与附件皆空时复制 \n- **闭环**:剪贴板拿到可执行的 AutoRDO 提示词,Toast 提示去 Cursor 执行 \n- **排期**:US-01 · M \n\n### Epic B · 粘回确认与元数据(约 6 SP)\n\n#### B1 · 解析初稿并分页答待确认\n- **角色**:产品经理 \n- **起点**:Cursor 已产出 AutoRDO 初稿 Markdown \n- **怎么运作**: \n 1. 粘回步骤 2,点「解析初稿」拆成多条需求分页 \n 2. 对每条未确认项选题或填写补充,确认后描述实时写回 \n 3. 可手改标题与描述 \n- **关键结果**:`可`跳过已全部确认的需求;`禁止`空答案提交 \n- **闭环**:各需求「待确认」清零或标明无待确认 \n- **排期**:US-02 · L \n\n#### B2 · 补齐上报元数据并门禁放行\n- **角色**:产品经理 \n- **起点**:待确认已处理或无需处理 \n- **怎么运作**: \n 1. 选择类型(新增/优化)、优先级;添加标签;确认提交部门与提交人(可预填) \n 2. 系统列出缺失项;全部齐套后出现「进入上报」 \n- **关键结果**:`禁止`缺项时进入可复制上报 \n- **闭环**:全部需求确认且元数据齐套,进入步骤 3 \n- **排期**:US-03 · M \n\n> 判定顺序、启发式选项与写回规则全文见 **[confirm-flow.md](./confirm-flow.md)**。\n\n### Epic C · 云效上报口令(约 3 SP)\n\n#### C1 · 复制多条记录需求提示词\n- **角色**:产品经理 \n- **起点**:步骤 2 已放行 \n- **怎么运作**: \n 1. 在步骤 3 预览 YunxiaoPMapp 多条「记录需求」口令 \n 2. 一键复制;可选复制定稿 Markdown 存档 \n 3. 粘到 Cursor 执行 YunxiaoPMapp(本页不直连云效) \n- **关键结果**:`禁止`未齐套时复制上报口令;每条独立、暂不推进 \n- **闭环**:口令已复制,可在 Cursor 侧完成入库 \n- **排期**:US-04 · M \n\n## 5. 功能模块说明(正向 / 逆向)\n\n### 5.1 粘贴素材\n\n**正向** \n1. 输入或粘贴文本;粘贴图/语音出现附件芯片 \n2. 确认复制清洗提示词;成功 Toast \n\n**逆向 / 边界** \n\n| 情况 | 系统表现 |\n|------|----------|\n| 无正文且无附件 | 主按钮禁用 |\n| 复制失败 | 错误提示,可重试 |\n| 关闭自动复制 | 仅手动确认时复制 |\n\n### 5.2 确认待确认\n\n**正向** \n1. 粘回初稿 → 解析 → 分页答题 → 补元数据 → 进入上报 \n\n**逆向 / 边界** \n\n| 情况 | 系统表现 |\n|------|----------|\n| 空粘回 / 无法解析 | 错误提示,不覆盖已有草稿(解析失败时) |\n| 仍有待确认或缺元数据 | 「尚不能进入上报」+ 清单 |\n| 补充文案与单选并存 | 以补充文案为准 |\n\n### 5.3 上报云效(口令)\n\n**正向** \n1. 预览完整提示词 → 一键复制 → 去 Cursor 执行 \n2. 可另复制定稿 Markdown(待确认:无) \n\n**逆向 / 边界** \n\n| 情况 | 系统表现 |\n|------|----------|\n| 草稿未齐套 | 预览区错误 + 缺失列表;复制上报禁用 |\n| 无草稿 | 提示先完成步骤 2 |\n| 本页 | **不**调用云效 API |\n\n## 6. 关键业务逻辑(必须对齐)\n\n### 6.1 粘回确认与上报门禁\n\n摘要(全文见 [confirm-flow.md](./confirm-flow.md)):\n\n| 优先级 | 规则 | 说明 |\n|--------|------|------|\n| 1 | 先能解析出 ≥1 条需求 | 否则无法确认/上报 |\n| 2 | 每条待确认须答完或初稿标明「无」 | 否则不可上报 |\n| 3 | 类型、优先级、标签、提交部门、提交人齐套 | 否则不可上报 |\n| 4 | 上报口令按条独立 + 暂不推进 | 不合并、不在本页推进状态 |\n\n**数据源(产品口径)** \n- 粘回 Markdown(用户从 Cursor 粘贴) \n- 本地启发式选项与部门/人预填(原型本地,未接真 API) \n- 用户当场填写的答案与元数据(会话内) \n\n**用户可见结果** \n- 通过:进入上报并可复制口令 \n- 拦截:缺失清单文案;复制上报不可用 \n\n## 7. 总览流程图\n\n```mermaid\nflowchart TD\n A[粘贴文本/图/语音芯片] --> B[复制 AutoRDO 清洗提示词]\n B --> C[Cursor 执行 AutoRDO]\n C --> D[粘回初稿 Markdown]\n D --> E{解析成功?}\n E -->|否| D\n E -->|是| F[分页答待确认]\n F --> G[补齐元数据]\n G --> H{全部齐套?}\n H -->|否| F\n H -->|是| I[复制 YunxiaoPMapp 多条记录提示词]\n I --> J[Cursor 执行入库]\n J --> K[云效出现需求 · 本页结束]\n```\n\n## 8. 验收清单(产品 / 测试)\n\n**粘贴与清洗** \n- [ ] 可粘贴文本;粘贴图片/语音显示附件芯片且可移除 \n- [ ] 「确认并复制清洗提示词」生成含 AutoRDO 指令与素材区的提示词 \n- [ ] 「粘贴后自动复制」开启时,粘贴文本会自动复制 \n- [ ] 正文与附件皆空时不可复制 \n\n**确认与门禁** \n- [ ] 粘回合法初稿可解析出多条并分页 \n- [ ] 待确认可选题或补充;描述实时更新 \n- [ ] 未答完或元数据不齐时不可进入上报,并列出缺失项 \n- [ ] 部门/人可预填且可改;类型仅新增/优化 \n\n**上报口令** \n- [ ] 齐套后可复制多条「记录需求」口令,含优先级/标签/部门/人,推进至=暂不推进 \n- [ ] 可复制定稿 Markdown(待确认:无) \n- [ ] 页面无云效直连写单行为 \n\n**文档** \n- [ ] 标注目录可打开「产品需求说明(PRD)」与「粘回确认与上报门禁」 \n- [ ] 规格与页面行为一致(见 confirm-flow.md) \n\n## 9. 交付口径\n\n交付可运行的 **AutoRDO 需求清洗工作台** 原型:产品经理在网页完成「粘贴素材 → 复制清洗提示词 → 粘回确认待确认与元数据 → 复制 YunxiaoPMapp 多条记录需求提示词」;实际清洗与云效入库均在 Cursor Skill 侧完成,**网页不直连云效**。复杂确认与门禁规则以 `.spec/confirm-flow.md` 为准。\n\n预览路径:`/prototypes/autorodo-web`;对象存储发布形态:`{baseUrl}/autorodo-web/index.html`。\n\n## 10. 功能变更记录\n\n> 产品经理原型发版记录。仅记功能与业务逻辑变更;不含样式/UI/表结构。 \n> 由「需求定稿」关键字触发追加;日常改原型不强制每改必写。\n\n(尚无定稿版本;首轮 AutoPRD 落盘。)\n" + }, + { + "type": "folder", + "id": "arw-doc-prd-chapters", + "title": "PRD 分章", + "defaultExpanded": true, + "children": [ + { + "type": "markdown", + "id": "arw-prd-ch-01", + "title": "1. 一句话与目标", + "markdown": "## 1. 一句话与目标\n\n**一句话** \n给产品经理一个网页工作台:粘贴聊天/截图/语音素材 → 复制 AutoRDO 清洗提示词 → 粘回初稿确认待确认并补齐上报字段 → 复制 YunxiaoPMapp 多条「记录需求」提示词,在 Cursor 侧完成入库。\n\n**要解决的问题** \n- 碎片素材难直接写成可入库的标题与书面描述 \n- 多条诉求混在一起,容易漏拆或合并错 \n- 「待确认」项靠聊天来回补,缺少结构化答题与门禁 \n- 上报云效前缺少类型、优先级、标签、提交部门/人的齐套校验 \n- 不想在网页直连云效,只希望生成可粘贴执行的口令 \n\n**本期目标** \n1. 三步工作台:粘贴素材 → 确认待确认 → 上报云效(复制口令) \n2. 支持文本 + 图片/语音附件芯片(不上传;由 Cursor 多模态识读) \n3. 一键复制 AutoRDO 清洗提示词;可选「粘贴后自动复制」 \n4. 粘回初稿后解析多条需求、分页答题、补齐元数据 \n5. 齐套后一键复制 YunxiaoPMapp 多条记录需求提示词(及定稿 Markdown) \n\n**非目标(本期不做)** \n- 不直连云效 OpenAPI / 不在网页内建单 \n- 不在网页内跑 AutoRDO 模型清洗(只生成提示词) \n- 不做账号登录、权限、草稿云端持久化 \n- 不替代 YunxiaoPMapp / AutoRDO Skill 本体规则\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-02", + "title": "2. 模块边界(最重要)", + "markdown": "## 2. 模块边界(最重要)\n\n```mermaid\nflowchart LR\n subgraph web [AutoRDO 网页工作台]\n P[粘贴素材]\n C[确认待确认]\n E[上报口令]\n end\n Cursor[Cursor + AutoRDO / YunxiaoPMapp]\n YX[云效需求]\n P -->|复制清洗提示词| Cursor\n Cursor -->|粘回初稿 Markdown| C\n C --> E\n E -->|复制记录需求提示词| Cursor\n Cursor -->|Skill 执行| YX\n```\n\n| 业务线 / 子域 | 做什么 | 不做什么 |\n|---------------|--------|----------|\n| 素材采集 | 粘贴文本与图/语音文件名芯片,生成清洗提示词 | 不上传附件、不识读媒体二进制 |\n| 确认补齐 | 解析初稿、答待确认、编辑标题/描述、补元数据 | 不自动推进云效状态 |\n| 上报出口 | 预览并复制多条「记录需求」口令 / 定稿 Markdown | 不调用云效 API |\n\n**外部依赖(产品口径)** \n\n| 依赖方 | 交互方式 | 产品要求 |\n|--------|----------|----------|\n| AutoRDO(Cursor Skill) | 用户粘贴清洗提示词后执行 | 产出含标题、描述、「待确认」的 Markdown 初稿 |\n| YunxiaoPMapp(Cursor Skill) | 用户粘贴上报提示词后执行 | 按条独立记录需求;本工作台默认「暂不推进」 |\n| 剪贴板 | 浏览器复制 / 粘贴 | 复制失败时明确提示,可重试 |\n\n**关键约束** \n- 一条上报口令可含多条「记录需求」,**禁止合并为一条** \n- 未答完待确认或元数据不齐 → **禁止**进入可复制的上报态 \n- 标题类型仅「新增 / 优化」;写入口令时带 `【新增】` / `【优化】` 前缀\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-03", + "title": "3. 用户与角色", + "markdown": "## 3. 用户与角色\n\n| 角色 | 主要目标 |\n|------|----------|\n| 产品经理(如王冕) | 快速把碎片诉求洗成可入库描述,并复制口令交给 YunxiaoPMapp |\n| 兼岗业管 / 业务接口人 | 粘贴业务反馈素材,确认模糊项后交产品入库 |\n| 评审 / 培训 | 演示「清洗 → 确认 → 上报口令」闭环,不改真实云效 |\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-04", + "title": "4. 用户故事与故事点(业务条线说明口径)", + "markdown": "## 4. 用户故事与故事点(业务条线说明口径)\n\n> 合计约 **13 SP**(可按团队基准调整)。\n\n### Epic A · 粘贴与清洗提示词(约 4 SP)\n\n#### A1 · 多模态素材粘贴与复制清洗提示词\n- **角色**:产品经理 \n- **起点**:手里有聊天记录、口述笔记、截图或语音文件名 \n- **怎么运作**: \n 1. 在步骤 1 粘贴正文;粘贴图片/语音时显示附件芯片(可移除) \n 2. 点「确认并复制清洗提示词」,或开启「粘贴后自动复制」 \n 3. 将提示词粘到 Cursor,按 AutoRDO 规则清洗 \n- **关键结果**:`可`无正文仅附件时仍复制;`禁止`正文与附件皆空时复制 \n- **闭环**:剪贴板拿到可执行的 AutoRDO 提示词,Toast 提示去 Cursor 执行 \n- **排期**:US-01 · M \n\n### Epic B · 粘回确认与元数据(约 6 SP)\n\n#### B1 · 解析初稿并分页答待确认\n- **角色**:产品经理 \n- **起点**:Cursor 已产出 AutoRDO 初稿 Markdown \n- **怎么运作**: \n 1. 粘回步骤 2,点「解析初稿」拆成多条需求分页 \n 2. 对每条未确认项选题或填写补充,确认后描述实时写回 \n 3. 可手改标题与描述 \n- **关键结果**:`可`跳过已全部确认的需求;`禁止`空答案提交 \n- **闭环**:各需求「待确认」清零或标明无待确认 \n- **排期**:US-02 · L \n\n#### B2 · 补齐上报元数据并门禁放行\n- **角色**:产品经理 \n- **起点**:待确认已处理或无需处理 \n- **怎么运作**: \n 1. 选择类型(新增/优化)、优先级;添加标签;确认提交部门与提交人(可预填) \n 2. 系统列出缺失项;全部齐套后出现「进入上报」 \n- **关键结果**:`禁止`缺项时进入可复制上报 \n- **闭环**:全部需求确认且元数据齐套,进入步骤 3 \n- **排期**:US-03 · M \n\n> 判定顺序、启发式选项与写回规则全文见 **[confirm-flow.md](./confirm-flow.md)**。\n\n### Epic C · 云效上报口令(约 3 SP)\n\n#### C1 · 复制多条记录需求提示词\n- **角色**:产品经理 \n- **起点**:步骤 2 已放行 \n- **怎么运作**: \n 1. 在步骤 3 预览 YunxiaoPMapp 多条「记录需求」口令 \n 2. 一键复制;可选复制定稿 Markdown 存档 \n 3. 粘到 Cursor 执行 YunxiaoPMapp(本页不直连云效) \n- **关键结果**:`禁止`未齐套时复制上报口令;每条独立、暂不推进 \n- **闭环**:口令已复制,可在 Cursor 侧完成入库 \n- **排期**:US-04 · M\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-05", + "title": "5. 功能模块说明(正向 / 逆向)", + "markdown": "## 5. 功能模块说明(正向 / 逆向)\n\n### 5.1 粘贴素材\n\n**正向** \n1. 输入或粘贴文本;粘贴图/语音出现附件芯片 \n2. 确认复制清洗提示词;成功 Toast \n\n**逆向 / 边界** \n\n| 情况 | 系统表现 |\n|------|----------|\n| 无正文且无附件 | 主按钮禁用 |\n| 复制失败 | 错误提示,可重试 |\n| 关闭自动复制 | 仅手动确认时复制 |\n\n### 5.2 确认待确认\n\n**正向** \n1. 粘回初稿 → 解析 → 分页答题 → 补元数据 → 进入上报 \n\n**逆向 / 边界** \n\n| 情况 | 系统表现 |\n|------|----------|\n| 空粘回 / 无法解析 | 错误提示,不覆盖已有草稿(解析失败时) |\n| 仍有待确认或缺元数据 | 「尚不能进入上报」+ 清单 |\n| 补充文案与单选并存 | 以补充文案为准 |\n\n### 5.3 上报云效(口令)\n\n**正向** \n1. 预览完整提示词 → 一键复制 → 去 Cursor 执行 \n2. 可另复制定稿 Markdown(待确认:无) \n\n**逆向 / 边界** \n\n| 情况 | 系统表现 |\n|------|----------|\n| 草稿未齐套 | 预览区错误 + 缺失列表;复制上报禁用 |\n| 无草稿 | 提示先完成步骤 2 |\n| 本页 | **不**调用云效 API |\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-06", + "title": "6. 关键业务逻辑(必须对齐)", + "markdown": "## 6. 关键业务逻辑(必须对齐)\n\n### 6.1 粘回确认与上报门禁\n\n摘要(全文见 [confirm-flow.md](./confirm-flow.md)):\n\n| 优先级 | 规则 | 说明 |\n|--------|------|------|\n| 1 | 先能解析出 ≥1 条需求 | 否则无法确认/上报 |\n| 2 | 每条待确认须答完或初稿标明「无」 | 否则不可上报 |\n| 3 | 类型、优先级、标签、提交部门、提交人齐套 | 否则不可上报 |\n| 4 | 上报口令按条独立 + 暂不推进 | 不合并、不在本页推进状态 |\n\n**数据源(产品口径)** \n- 粘回 Markdown(用户从 Cursor 粘贴) \n- 本地启发式选项与部门/人预填(原型本地,未接真 API) \n- 用户当场填写的答案与元数据(会话内) \n\n**用户可见结果** \n- 通过:进入上报并可复制口令 \n- 拦截:缺失清单文案;复制上报不可用\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-07", + "title": "7. 总览流程图", + "markdown": "## 7. 总览流程图\n\n```mermaid\nflowchart TD\n A[粘贴文本/图/语音芯片] --> B[复制 AutoRDO 清洗提示词]\n B --> C[Cursor 执行 AutoRDO]\n C --> D[粘回初稿 Markdown]\n D --> E{解析成功?}\n E -->|否| D\n E -->|是| F[分页答待确认]\n F --> G[补齐元数据]\n G --> H{全部齐套?}\n H -->|否| F\n H -->|是| I[复制 YunxiaoPMapp 多条记录提示词]\n I --> J[Cursor 执行入库]\n J --> K[云效出现需求 · 本页结束]\n```\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-08", + "title": "8. 验收清单(产品 / 测试)", + "markdown": "## 8. 验收清单(产品 / 测试)\n\n**粘贴与清洗** \n- [ ] 可粘贴文本;粘贴图片/语音显示附件芯片且可移除 \n- [ ] 「确认并复制清洗提示词」生成含 AutoRDO 指令与素材区的提示词 \n- [ ] 「粘贴后自动复制」开启时,粘贴文本会自动复制 \n- [ ] 正文与附件皆空时不可复制 \n\n**确认与门禁** \n- [ ] 粘回合法初稿可解析出多条并分页 \n- [ ] 待确认可选题或补充;描述实时更新 \n- [ ] 未答完或元数据不齐时不可进入上报,并列出缺失项 \n- [ ] 部门/人可预填且可改;类型仅新增/优化 \n\n**上报口令** \n- [ ] 齐套后可复制多条「记录需求」口令,含优先级/标签/部门/人,推进至=暂不推进 \n- [ ] 可复制定稿 Markdown(待确认:无) \n- [ ] 页面无云效直连写单行为 \n\n**文档** \n- [ ] 标注目录可打开「产品需求说明(PRD)」与「粘回确认与上报门禁」 \n- [ ] 规格与页面行为一致(见 confirm-flow.md)\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-09", + "title": "9. 交付口径", + "markdown": "## 9. 交付口径\n\n交付可运行的 **AutoRDO 需求清洗工作台** 原型:产品经理在网页完成「粘贴素材 → 复制清洗提示词 → 粘回确认待确认与元数据 → 复制 YunxiaoPMapp 多条记录需求提示词」;实际清洗与云效入库均在 Cursor Skill 侧完成,**网页不直连云效**。复杂确认与门禁规则以 `.spec/confirm-flow.md` 为准。\n\n预览路径:`/prototypes/autorodo-web`;对象存储发布形态:`{baseUrl}/autorodo-web/index.html`。\n" + }, + { + "type": "markdown", + "id": "arw-prd-ch-10", + "title": "10. 功能变更记录", + "markdown": "## 10. 功能变更记录\n\n> 产品经理原型发版记录。仅记功能与业务逻辑变更;不含样式/UI/表结构。 \n> 由「需求定稿」关键字触发追加;日常改原型不强制每改必写。\n\n(尚无定稿版本;首轮 AutoPRD 落盘。)\n" + } + ] + }, + { + "type": "folder", + "id": "arw-doc-specs", + "title": "专题规格", + "defaultExpanded": true, + "children": [ + { + "type": "markdown", + "id": "arw-doc-confirm-flow", + "title": "粘回确认与上报门禁", + "markdownPath": ".spec/confirm-flow.md", + "markdown": "# AutoRDO 需求清洗工作台 · 粘回确认与上报门禁\n\n> 实现:`lib/parseDraft.ts`、`lib/pendingQuestions.ts`、`lib/applyAnswer.ts`、`lib/inferMeta.ts`、`lib/buildRecordPrompt.ts` \n> UI:`components/StepConfirm.tsx`、`components/StepExport.tsx`\n\n本规格覆盖步骤 2「确认待确认」的解析 / 答题 / 元数据补齐,以及进入步骤 3「上报云效」前的门禁判定。 \n**原型本地逻辑;未接真实云效 API、未接 AutoRDO 服务端。**\n\n---\n\n## 前置条件\n\n| 场景 | 是否校验 / 是否执行 |\n|------|---------------------|\n| 粘回区为空就点「解析初稿」 | 拦截:提示「请先粘贴 AutoRDO 初稿」;不改草稿列表 |\n| 粘回文不含 `**标题**` /「原始诉求(AutoRDO)」可识别块 | 拦截:提示未能解析;不改草稿列表 |\n| 尚未解析出任何草稿 | 不上报;步骤 3 导航禁用(无 drafts);步骤 2 出口提示「请先粘回并解析」 |\n| 某条仍有未答「待确认」 | 该条 `confirmed=false`;不可进入上报 |\n| 某条元数据不齐(类型 / 优先级 / 标签 / 提交部门 / 提交人) | `metaComplete=false`;不可进入上报 / 不可复制上报提示词 |\n| 答题时选项与补充均为空 | 「确认并下一题」禁用;不调用 `applyPendingAnswer` |\n| 补充文案非空 | **优先**用补充文案作为答案(覆盖单选) |\n\n---\n\n## 判定优先级顺序\n\n### A. 解析初稿(`parseAutorodoDraft`)\n\n按块拆分后,对每个需求块提取字段;**命中即采用,不再用更弱规则覆盖已提取值**。\n\n| 优先级 | 条件 | 结果 |\n|--------|------|------|\n| 1 | Markdown 能按 `### N` 切出多块,且块内含「原始诉求(AutoRDO)」或 `**标题**` | 多条 `RequirementDraft` |\n| 2 | 无法切块,但全文含 `**标题**` | 整篇视为 1 条草稿 |\n| 3 | 以上皆否 | 返回空数组 → UI 报解析失败 |\n| 4 | 块内匹配 `**标题**:…` | 写入 `title` |\n| 5 | 块内匹配 `**描述**:` 至「待确认」之前 | 写入 `description` |\n| 6 | 「待确认:」后为「无」或空 | `pendings=[]`,`confirmed=true` |\n| 7 | 「待确认:」后有列表行 | 每行一条 `PendingItem`(去列表前缀),`confirmed=false` |\n\n解析成功后流水线(`StepConfirm.handleParse`):\n\n1. `enrichPendingsWithQuestions` — 为每条待确认生成题干与选项 \n2. `inferSubmitMeta(标题+描述)` — 仅在提交部门 / 提交人为空时填入启发式结果 \n\n### B. 待确认选项启发式(`buildOptionsForPending`)\n\n| 优先级 | 原文匹配 | 题干 / 选项 |\n|--------|----------|-------------|\n| 1 | 含「导出范围」或「范围」 | 「导出范围」指什么?→ 当前筛选结果 / 全部数据 / 仅勾选行 |\n| 2 | 含「模块」或「归属」 | 归属哪个业务模块?→ 租赁合同管理 / 车辆管理 / 证照管理 / 还车应结款 |\n| 3 | 其它 | 原文(补「?」)→ 确认按原文理解 / 暂不纳入本需求 / 需文字补充 |\n\n### C. 答题写回描述(`applyPendingAnswer`)\n\n| 优先级 | 条件 | 描述写回 |\n|--------|------|----------|\n| 0 | 答案 trim 为空,或找不到 `pendingId` | 原样返回,不改 |\n| 1 | 描述中存在 `{标签}:待确认` 占位 | 替换为 `{标签}:{答案}` |\n| 2 | 描述中含任意「待确认」 | 替换**首个**「待确认」为答案 |\n| 3 | 以上皆否 | 在描述末尾追加 `{标签}:{答案}` |\n\n答完后:该 pending `resolved=true`;若全部 resolved → `confirmed=true`。\n\n### D. 提交部门 / 提交人启发式(`inferSubmitMeta`)\n\n仅作预填,用户可改;**不**自动填类型 / 优先级 / 标签。\n\n| 字段 | 优先级 | 匹配 |\n|------|--------|------|\n| 提交部门 | 1 | `提交部门|部门:…` |\n| 提交部门 | 2 | 固定词:业务管理组 / 产品部 / 安全部 / 运营部 / 财务部 / 技术部 |\n| 提交人 | 1 | `提交人|反馈人|提出人:…` |\n| 提交人 | 2 | `@姓名`(2–4 汉字) |\n| 提交人 | 3 | `姓名反馈` |\n\n### E. 进入上报门禁(`StepConfirm` + `metaComplete` + `buildYunxiaoRecordPrompt`)\n\n全部需求须同时满足:\n\n| 优先级 | 条件 | 用户可见结果 |\n|--------|------|--------------|\n| 1 | `drafts.length > 0` | 否则提示先粘回解析 |\n| 2 | 每条 `confirmed === true`(无未答待确认) | 「需求 N:还有 K 项待确认」 |\n| 3 | 每条 `metaComplete`:类型、优先级、≥1 标签、提交部门、提交人 | 「需求 N:缺少 …」 |\n| 4 | 全部通过 | 显示「进入上报」;步骤 3 可复制 YunxiaoPMapp 多条记录提示词 |\n\n`buildYunxiaoRecordPrompt` 在复制时再次校验;未通过则抛错,步骤 3 预览区展示错误与缺失清单。\n\n---\n\n## 数据源\n\n| 来源 | 类型 | 说明 |\n|------|------|------|\n| 粘回 Markdown | 用户粘贴 | Cursor 跑完 AutoRDO 后的初稿;**本机剪贴板,非 API** |\n| 本地启发式选项 | 代码常量 | `pendingQuestions.ts` / `inferMeta.ts` 正则与枚举;**未接字典服务** |\n| 用户答题与元数据 | 会话内存 | 刷新丢失;**未持久化、未接云效** |\n| 清洗 / 上报提示词 | 本地拼接 | `buildCleanPrompt` / `buildYunxiaoRecordPrompt`;用户自行粘到 Cursor 执行 Skill |\n\n**明确非数据源**:云效 OpenAPI、AutoRDO 远程清洗、需求库回写。\n\n---\n\n## 用户可见结果\n\n| 动作 | 通过 | 失败 / 拦截 |\n|------|------|-------------|\n| 解析初稿 | 出现需求分页胶囊;展示标题、实时描述、待确认卡、元数据区 | 红字错误提示;草稿不变 |\n| 确认并下一题 | 描述实时更新;下一题或「本需求待确认项已全部答完」 | 按钮禁用(无答案) |\n| 补齐元数据 | 分段按钮 / 标签芯片即时反映 | — |\n| 进入上报 | 主按钮可点 → 步骤 3 | 「尚不能进入上报」+ 缺失列表 |\n| 复制上报提示词 | Toast:已复制,请粘到 Cursor 跑 YunxiaoPMapp | 预览区错误 +「请返回步骤 2」 |\n| 复制定稿 Markdown | Toast:已复制定稿 Markdown | 无草稿时禁用 |\n\n标题写入上报口令时格式:`【新增|优化】` + 标题(若标题已带同前缀则去重)。每条 `推进至=暂不推进`。\n\n---\n\n## 代码路径\n\n| 能力 | 路径 |\n|------|------|\n| 解析粘回稿 | `lib/parseDraft.ts` → `parseAutorodoDraft` |\n| 待确认题干与选项 | `lib/pendingQuestions.ts` → `buildOptionsForPending` / `enrichPendingsWithQuestions` |\n| 答题写回 | `lib/applyAnswer.ts` → `applyPendingAnswer` |\n| 部门 / 人预填 | `lib/inferMeta.ts` → `inferSubmitMeta` |\n| 元数据齐全 & 上报提示词 | `lib/buildRecordPrompt.ts` → `metaComplete` / `buildYunxiaoRecordPrompt` |\n| 确认步 UI 与门禁 | `components/StepConfirm.tsx` |\n| 上报步复制 | `components/StepExport.tsx` |\n\n关联产品说明:见 [requirements-prd.md](./requirements-prd.md) §6 / §8。\n" + } + ] + } + ] + } + ] + } +} diff --git a/src/prototypes/autorodo-web/components/StepConfirm.tsx b/src/prototypes/autorodo-web/components/StepConfirm.tsx new file mode 100644 index 0000000..99995ff --- /dev/null +++ b/src/prototypes/autorodo-web/components/StepConfirm.tsx @@ -0,0 +1,406 @@ +import React, { useMemo, useState } from 'react'; +import type { Priority, RequirementDraft, RequirementMeta } from '../lib/types'; +import { parseAutorodoDraft } from '../lib/parseDraft'; +import { enrichPendingsWithQuestions } from '../lib/pendingQuestions'; +import { applyPendingAnswer } from '../lib/applyAnswer'; +import { inferSubmitMeta } from '../lib/inferMeta'; +import { metaComplete } from '../lib/buildRecordPrompt'; + +const TITLE_KINDS: Array> = ['新增', '优化']; +const PRIORITIES: Priority[] = ['紧急', '高', '中', '低']; + +export type StepConfirmProps = { + pasteBack: string; + onPasteBackChange: (value: string) => void; + drafts: RequirementDraft[]; + onDraftsChange: (drafts: RequirementDraft[]) => void; + activeIndex: number; + onActiveIndexChange: (index: number) => void; + onGoExport: () => void; +}; + +function patchDraft( + drafts: RequirementDraft[], + index: number, + patch: (d: RequirementDraft) => RequirementDraft, +): RequirementDraft[] { + return drafts.map((d, i) => (i === index ? patch(d) : d)); +} + +function missingHints(drafts: RequirementDraft[]): string[] { + if (drafts.length === 0) return ['请先粘回并解析 AutoRDO 初稿']; + const hints: string[] = []; + drafts.forEach((d, i) => { + const label = `需求 ${i + 1}`; + if (!d.confirmed) { + const left = d.pendings.filter((p) => !p.resolved).length; + hints.push(`${label}:还有 ${left} 项待确认`); + } + if (!metaComplete(d)) { + const m = d.meta; + const miss: string[] = []; + if (!m.titleKind) miss.push('类型'); + if (!m.priority) miss.push('优先级'); + if (m.tags.length === 0) miss.push('标签'); + if (!m.submitDept.trim()) miss.push('提交部门'); + if (!m.submitter.trim()) miss.push('提交人'); + if (miss.length) hints.push(`${label}:缺少 ${miss.join('、')}`); + } + }); + return hints; +} + +export function StepConfirm({ + pasteBack, + onPasteBackChange, + drafts, + onDraftsChange, + activeIndex, + onActiveIndexChange, + onGoExport, +}: StepConfirmProps) { + const [parseError, setParseError] = useState(null); + const [selectedOption, setSelectedOption] = useState(''); + const [supplement, setSupplement] = useState(''); + const [tagInput, setTagInput] = useState(''); + + const safeIndex = drafts.length === 0 ? 0 : Math.min(activeIndex, drafts.length - 1); + const current = drafts[safeIndex] ?? null; + const pending = current?.pendings.find((p) => !p.resolved) ?? null; + + const allReady = useMemo( + () => drafts.length > 0 && drafts.every((d) => d.confirmed && metaComplete(d)), + [drafts], + ); + const hints = useMemo(() => missingHints(drafts), [drafts]); + + const handleParse = () => { + const md = pasteBack.trim(); + if (!md) { + setParseError('请先粘贴 AutoRDO 初稿'); + return; + } + const parsed = parseAutorodoDraft(md); + if (parsed.length === 0) { + setParseError('未能解析出需求,请检查初稿格式(需含 **标题** / 原始诉求)'); + return; + } + const next = parsed.map((draft) => { + const enriched = enrichPendingsWithQuestions(draft); + const inferred = inferSubmitMeta(`${enriched.title}\n${enriched.description}`); + return { + ...enriched, + meta: { + ...enriched.meta, + submitDept: enriched.meta.submitDept || inferred.submitDept, + submitter: enriched.meta.submitter || inferred.submitter, + }, + }; + }); + setParseError(null); + setSelectedOption(''); + setSupplement(''); + setTagInput(''); + onDraftsChange(next); + onActiveIndexChange(0); + }; + + const updateCurrent = (patch: (d: RequirementDraft) => RequirementDraft) => { + if (!current) return; + onDraftsChange(patchDraft(drafts, safeIndex, patch)); + }; + + const updateMeta = (partial: Partial) => { + updateCurrent((d) => ({ ...d, meta: { ...d.meta, ...partial } })); + }; + + const handleConfirmAnswer = () => { + if (!current || !pending) return; + const answer = supplement.trim() || selectedOption.trim(); + if (!answer) return; + const next = applyPendingAnswer(current, pending.id, answer); + onDraftsChange(patchDraft(drafts, safeIndex, () => next)); + setSelectedOption(''); + setSupplement(''); + }; + + const addTag = () => { + const tag = tagInput.trim(); + if (!tag || !current) return; + if (current.meta.tags.includes(tag)) { + setTagInput(''); + return; + } + updateMeta({ tags: [...current.meta.tags, tag] }); + setTagInput(''); + }; + + const removeTag = (tag: string) => { + if (!current) return; + updateMeta({ tags: current.meta.tags.filter((t) => t !== tag) }); + }; + + const switchDraft = (index: number) => { + onActiveIndexChange(index); + setSelectedOption(''); + setSupplement(''); + setTagInput(''); + }; + + return ( +
+
+

确认待确认

+

粘回 AutoRDO 初稿,按需求分页答题并补齐上报元数据。

+
+ +
+ +