# Air Spark — 开发交互记录 > 记录开发者与 Claude Code 的协作过程,积累 AI 辅助开发的最佳实践。 > 持续更新中。 --- ## Session 1 — 项目基础搭建 **日期**:2026-03-03 ### 用户需求 - 提供了产品 PRD 初稿,定义了 AI 驱动动画生产平台的完整功能 - 要求确定技术选型和项目架构 ### Claude 完成的工作 - 审阅 PRD,与用户讨论并迭代到 v0.4 - 确定技术栈:Next.js 14 + FastAPI + PostgreSQL + Celery/Redis - 设计了七阶段流水线架构(剧本→规划→人设→分镜→切分→视频→拼接) - 创建了三套自动化 Skill 提示词(storyboard / segmentation / json-schemas) - 确定了关键设计决策(网格按场景分、PIL 精确裁切、Stage 6 全并发等) ### 关键决策 - **网格尺寸按场景时长决定**(≤45s→4格, 45s-2min→9格, >2min→两个9格) - **JSON-only 输出**用于自动化 Skill(区别于人用的 Markdown Skill) - **移除 prev_frame 依赖**,Stage 6 全部片段可并发提交 --- ## Session 2 — UI 设计系统 & 组件展示页 **日期**:2026-03-04 ### 用户需求 - 要求建立完整的 UI 设计系统 - 风格关键词:liquid glass、glassmorphism、dark mode、premium、cinematic - 使用 ui-ux-pro-max skill 生成设计建议 ### Claude 完成的工作 1. **运行 ui-ux-pro-max 设计系统生成器**,获得专业推荐(配色、字体、风格) 2. **编写 UI-Design-System.md v0.3**,包含: - 色彩系统(影院暗色背景 + 品牌色 + 状态色) - 玻璃拟态层级规范(标准/激活/悬停三层) - 字体系统(Space Grotesk + DM Sans + JetBrains Mono) - 按钮/表单/卡片/Toast 等组件规范 3. **搭建 Next.js 14 前端项目**(App Router + TypeScript + Tailwind CSS v4) 4. **开发 21 节组件展示页**(`/showcase`),覆盖: - 色彩 & 玻璃层、字体排版、按钮、状态格子 - 流水线步骤条、审核卡片、骨架屏、剧本确认 - 日志面板、模态框、表单、Toast、空状态 - 徽章/标签、头像、导航路径、标签页 - 危险按钮 & 搜索框、提示气泡、文字对比度 5. **添加全局环境背景动效**(CSS 渐变光晕 + 动画) ### 用户反馈 & 迭代 - 用户要求添加**中英文切换**(i18n) - Claude 实现了页面级 `lang` 状态 + `t` 翻译对象(~110 个键) - 用户指出多处翻译问题,逐一修正: - 字体排版区域仍显示英文 → 添加中文示例文本 - "Stage 6" 未翻译 → 改为"第六阶段" - "面包屑" 翻译生硬 → 改为"导航路径" - "Air Spark 工作室" → 去掉"工作室"/"Studio" - 补充了 **Noto Sans SC(思源黑体)** 中文字体支持 ### 关键决策 - Showcase 页面用**页面级 `t` 对象**做 i18n(临时方案) - 正式应用将来用 **next-intl** + URL 路由(`/zh/...`, `/en/...`) - 品牌名统一为 **Air Spark**(不带 Studio / 工作室) --- ## Session 3 — 开发策略讨论 **日期**:2026-03-04 ### 用户需求 - 了解 Claude Code 2026 新功能(Swarm、Worktree、Batch 等) - 考虑使用 Swarm 团队模式进行并行开发 - 要求 Claude 给出客观建议,以最快完成项目为目标 - 要求建立**开发交互记录文档**,积累协作经验 ### Claude 的建议 用户原有流程(先 UI → 再交互 → 再后端)本质正确。**不建议为了用新功能而改变有效流程。** Swarm 现阶段不适合全面启用的原因: 1. 缺少清晰的任务边界(核心页面 UI 未确定) 2. 前后端 API 契约未定义(并行开发会导致接口不一致) 3. 实验功能有额外协调开销 **推荐路线:** - **阶段 A**(串行):设计锁定 → 确定核心页面 UI → 反推 API 契约 - **阶段 B**(并行/Swarm):前端交互 + 后端 API + 数据库同时推进 - **阶段 C**:集成联调 ### 经验总结 > **给团队的建议**:AI 新功能(如 Swarm)应在**任务边界清晰时**才启用。 > 过早并行化 = 用协调开销换开发速度,得不偿失。 > 正确做法是先串行想清楚,再并行干活。 --- ## Session 4 — 核心页面开发(阶段 A:App Shell + 项目列表) **日期**:2026-03-04 ### 用户需求 - 要求后续每完成一步主动更新交互文档 - 开始开发核心页面,询问逐个做还是一起做 ### Claude 的建议 **先做一个页面锁定 App Shell,再批量出剩余页面。** 原因: - 第一个页面确定布局骨架(侧边栏 + 内容区),所有页面共用 - Shell 确认后,剩余页面只是填内容,可以快速批量产出 ### Claude 完成的工作 #### 1. App Shell 布局骨架 - **Sidebar 组件**(`components/layout/Sidebar.tsx`): - 可折叠侧边栏(240px ↔ 68px),玻璃拟态背景 - 四个导航项:项目、资产库、Skills、设置 - 当前路由高亮(accent 紫色) - 底部用户信息区 + 折叠按钮 - collapsed 状态由父组件控制,sidebar 和 main 内容区联动 - **Dashboard Layout**(`app/dashboard/layout.tsx`): - 管理 collapsed 状态,传递给 Sidebar - main 区域 margin-left 随 sidebar 折叠联动动画 #### 2. 项目列表页(`app/dashboard/page.tsx`) - **页面头部**:标题 + 「创建项目」CTA 按钮 - **搜索栏 + 统计**:实时搜索过滤 + 项目数/运行数统计 - **项目卡片网格**:响应式(1/2/3/4 列) - 每张卡片包含:类型标签、项目名、集数、运行状态 - **七阶段进度条**:彩色条形图,直观展示流水线进度 - 当前阶段 + 最后更新时间 - Hover 效果 + 更多操作按钮 - **空状态**:无项目时的引导界面 - **搜索无结果**:提示换关键词 - 4 条 Mock 数据覆盖不同状态(running / completed / failed) #### 3. Build 验证 - `npx next build` 通过,无 TypeScript 错误 ### 新增文件 | 文件 | 用途 | |------|------| | `components/layout/Sidebar.tsx` | 可折叠侧边栏组件 | | `app/dashboard/layout.tsx` | Dashboard 布局(sidebar + main) | | `app/dashboard/page.tsx` | 项目列表页 | ### 用户确认 - 用户确认项目列表页视觉方向 OK,要求继续做其他页面 - 发现左下角有黑色小圆球 → 是 Next.js Dev Indicator,在 `next.config.ts` 中关闭 --- ## Session 4(续)— 批量产出核心页面 **日期**:2026-03-04 ### 用户需求 - 确认 App Shell 视觉方向后,批量产出剩余核心页面 ### Claude 完成的工作 #### 1. 项目详情页(`app/dashboard/[projectId]/page.tsx`) - **面包屑导航**:项目 > T仔的上班日记 - **项目信息卡**:名称、类型标签、描述、Skill 标签列表 - **统计行**:总集数、运行中、已完成 - **剧集列表**:每行包含: - 集数编号(大字)+ 标题 + 状态标签(草稿/运行中/已完成/失败/空闲) - Mini 七阶段进度条 - 当前阶段 + 时长 + 更新时间 - Hover 显示操作按钮(剧本 / 流水线 / 开始写剧本) - 5 条 Mock 剧集数据覆盖各种状态 #### 2. 剧本对话页(`app/dashboard/[projectId]/chat/page.tsx`) - **类 Claude.ai 风格**的全屏对话界面 - **顶栏**:返回按钮 + 项目/集数标题 + Skill 信息 + 「保存为正式剧本」按钮 - **消息区域**: - 用户消息(紫色气泡,右对齐) - AI 回复(玻璃卡片,左对齐,带复制/重新生成按钮) - 简单的 Markdown 渲染(加粗、分隔线) - **输入区域**:多行文本框 + 发送按钮(有内容时亮紫色) - **剧本确认流程**:点「保存为正式剧本」→ 顶部出现绿色 banner → 按钮变为「确认剧本,启动流水线」 - 4 条 Mock 对话,包含完整的剧本内容(T仔第一天上班的 7 个场景) #### 3. 流水线监控页(`app/dashboard/[projectId]/pipeline/[episodeId]/page.tsx`) - **七阶段步骤条**:可点击切换查看每个阶段,当前阶段高亮 - **Stage 6 视频生成视图**(主要展示): - 渐变进度条 + 百分比 + 完成数 - 状态统计行(完成/生成中/失败/队列中) - 8×4 片段状态网格(32 个格子,颜色编码 + 图标) - 失败片段操作栏(编辑提示词 / 重跑) - 「导出 Seedance 批次包」按钮 - **Stage 3 人设审核视图**: - 4 张角色卡片(占位图 + 名称 + 通过/重跑按钮) - 底部汇总 CTA(全部通过后可点击) - **已完成阶段**:绿色 ✓ + 描述 + 「查看输出详情」 - **待执行阶段**:灰色时钟 + 等待提示 - **可折叠系统日志面板**:时间戳 + 级别颜色 + 消息 #### 4. Build 验证 所有 6 个路由编译通过: - `/dashboard` — 项目列表 - `/dashboard/[projectId]` — 项目详情 - `/dashboard/[projectId]/chat` — 剧本对话 - `/dashboard/[projectId]/pipeline/[episodeId]` — 流水线监控 ### 新增文件 | 文件 | 用途 | |------|------| | `app/dashboard/[projectId]/page.tsx` | 项目详情页(剧集列表) | | `app/dashboard/[projectId]/chat/page.tsx` | 剧本对话页(Claude.ai 风格) | | `app/dashboard/[projectId]/pipeline/[episodeId]/page.tsx` | 流水线七阶段监控页 | ### 页面导航路径 ``` /dashboard → 项目列表(4 张卡片) /dashboard/proj_001 → 项目详情(5 集剧集列表) /dashboard/proj_001/chat?ep=1 → 剧本对话(AI 对话 + 剧本确认) /dashboard/proj_001/pipeline/ep_01 → 流水线监控(七阶段 + 片段网格) ``` ### 经验总结 > **批量产出的前提是 Shell 已锁定。** 确认了侧边栏 + 布局后,三个页面只用了一轮就全部产出, > 没有布局返工。这验证了「先串行锁定骨架,再批量出内容」的策略。 --- ## Session 5 — 用户反馈 & 迭代修复 **日期**:2026-03-04 ### 用户反馈(4 个页面全部审阅后) 1. **流水线监控页** — 片段网格是正方形,不符合设计规范(应为自然高度 + padding) 2. **剧本对话页** — 纯对话模式不合理,需要改为**左右分栏**: - 左:剧本文档(可查看/可编辑,类似 IDE 中的文件面板) - 右:AI 对话(提需求、提修改意见) - 用户原话:"如果把所有内容都堆在一个对话框里,我无法看到完整的剧本,也没办法手动微调" 3. **路由 bug** — 点击侧边栏「资产库」跳到了项目详情(`/dashboard/assets` 被 `[projectId]` 动态路由匹配了) 4. **项目列表 + 项目详情** — 暂无大问题 ### Claude 修复内容 #### 1. 路由 bug 修复 **根因**:`/dashboard/assets` 没有对应的 `page.tsx`,被 `[projectId]` 动态路由吞掉。 **修复**:创建三个静态路由页面(优先级高于动态路由): - `app/dashboard/assets/page.tsx` — 资产库(空状态占位) - `app/dashboard/skills/page.tsx` — Skills 管理(3 个 Skill 卡片) - `app/dashboard/settings/page.tsx` — 设置(API Key、流水线模式配置) #### 2. 剧本对话页重设计 → 分栏式剧本工作台 **核心改造**:从纯对话布局改为左右分栏(可拖拽调整宽度): - **左侧 — 剧本面板(55% 默认宽度)**: - 预览模式:Markdown 渲染(标题、对话、舞台指示、分隔线) - 编辑模式:纯文本 textarea,可手动修改 - 顶部切换按钮(预览 ↔ 编辑) - 场景数 + 时长统计 - **中间 — 可拖拽分隔条**(hover 显示拖拽图标) - **右侧 — AI 对话面板**: - 更紧凑的气泡(7px avatar、更小的间距) - AI 回复内容改为摘要式("已更新场景二和场景五"),而非全文 - 输入框 2 行高度,适配右侧窄面板 - **联动逻辑**(Mock 演示):AI 修改剧本后左侧同步更新 #### 3. 片段网格修复 移除 `aspect-square`,改为 showcase 标准:`p-2.5 flex-col items-center gap-1.5`,自然高度。 #### 4. Build 验证 9 个路由全部编译通过。 ### 新增文件 | 文件 | 用途 | |------|------| | `app/dashboard/assets/page.tsx` | 资产库页面(空状态) | | `app/dashboard/skills/page.tsx` | Skills 管理页面 | | `app/dashboard/settings/page.tsx` | 设置页面 | ### 经验总结 > **最有价值的反馈来自用户的使用场景描述。** 用户没有说"把聊天框放左边",而是描述了 > 实际使用痛点:"无法看到完整剧本,也没办法手动微调"。从痛点推导出分栏式设计, > 比纯视觉反馈更能驱动正确的产品决策。 > **动态路由的坑**:Next.js App Router 中,`[projectId]` 会匹配所有未定义的子路径。 > 静态路由必须显式创建 `page.tsx` 才能优先匹配。 --- ## Session 6 — 用户深度反馈 & 功能完善 **日期**:2026-03-04 ### 用户反馈(详细审阅全部页面后) 1. **剧本对话页**:需支持 3 种使用模式(引导生成 / 大纲辅助 / 优化已有剧本 + 文件上传) 2. **发送按钮**:与输入框不对齐、样式丑,需修复 3. **剧本内容**:用真实剧本 `ep01.md` 替换 Mock 数据 4. **资产库页**:需要 Mock 画廊(角色立绘做缩略图,点击查看三视图) 5. **Skills 页**:卡片需可点击进入详情/管理页 6. **项目卡片**:点击不跳转到项目详情(缺少路由链接) 7. **全局路由**:确保所有页面间跳转正确 ### Claude 完成的工作 #### 1. 项目卡片导航修复(`dashboard/page.tsx`) - 将 `ProjectCard` 组件的容器从 `
` 改为 ` **Mock 数据应尽早使用真实内容。** 用真实的 ep01.md 剧本做 Mock,不仅让页面更有代入感, > 还能验证 Markdown 渲染逻辑是否正确覆盖了实际格式(标题、角色表、舞台指示等)。 > **UI 组件要考虑不同数据类型的差异化展示。** 资产库中角色(三视图)和场景(单张大图)的 > 展示方式不同,需要在组件层面做类型判断而非统一模板。 --- ## 附录:交互模式总结 ### 有效的交互习惯 | 习惯 | 说明 | |------|------| | **给出风格关键词** | "liquid glass, cinematic dark" 比 "好看一点" 有效 10 倍 | | **即时指出翻译/文案问题** | 逐条修正比最后统一改效率高 | | **要求客观建议** | 明确说"要冷静客观",避免 AI 一味附和 | | **先确认视觉再写逻辑** | 减少返工,UI 是需求的最佳载体 | | **描述使用场景而非UI指令** | "我无法看到完整剧本" > "把文本放左边" | ### 可以改进的地方 | 场景 | 建议 | |------|------| | 大批量文本替换 | 可以一次性提供所有翻译对照表,减少来回 | | 品牌命名 | 尽早统一(我们到 Session 2 末尾才去掉 "Studio") | | 设计规范 | 先锁定再开发,避免边开发边改规范 | | 路由设计 | 动态路由旁的静态路由要提前占位,避免被吞 | --- ## Session 7 — 深度迭代:命名修正 + Skills 架构重设计 **日期**:2026-03-04 ### 用户反馈 1. **Stage 3 命名**:"人设"不准确,只涵盖角色但该阶段生成所有参考图 → 改为"图片资产" 2. **项目卡片三点菜单**:三个点按钮无功能,应弹出操作菜单(设置/复制/归档/删除) 3. **三视图展示**:不应是三张分割图,而是一张横版 16:9 图(正面半身+正面全身+侧面+背面) 4. **Skills 架构根本问题**:当前 UI 把 Skill 当成"单一系统提示词",但实际 Skill 是目录级知识包: ``` skill-name/.claude/skills/{name}/ ├── SKILL.md ← 入口文件 ├── references/ ← AI 按需读取的知识库 └── templates/ ← 输出模板 ``` 需要完全重设计为文件树 + 文件编辑器(IDE 风格) 5. **Stage 2 命名**:"规划"太模糊,用户不明白这步做什么 → 改为"提示词提取" 6. **未来 Skill 安装**:需要"安装 Skill"按钮,支持导入外部 Skill ### Claude 完成的工作 #### 1. 流水线阶段命名修正(全局 7 文件) - Stage 2:`"规划"` → `"提示词提取"`(6 个文件,描述更清楚地告诉用户此步做什么) - Stage 3:`"人设"` → `"图片资产"`(5 个文件,覆盖角色/场景/道具所有参考图) - 涉及文件:`dashboard/page.tsx`, `[projectId]/page.tsx`, `pipeline/[episodeId]/page.tsx`, `showcase/page.tsx`, `skills/page.tsx` - Showcase 页英文同步更新:`"Planning"` → `"Prompt Extract"`, `"Characters"` → `"Image Assets"` #### 2. 项目卡片下拉菜单(`dashboard/page.tsx`) - 新增 `ProjectCardMenu` 组件,处理 `stopPropagation`(菜单在 Link 包裹的卡片内) - 四个操作项:项目设置 / 复制项目 / 归档 / 删除(红色危险操作) - 点击外部自动关闭(`useRef` + `useEffect` 监听 `mousedown`) - 菜单样式:毛玻璃深色背景 `rgba(15,15,25,0.95)` + `backdropFilter: blur(20px)` #### 3. 三视图修复(`dashboard/assets/page.tsx`) - **之前**:3 列网格展示 3 张独立的正面/侧面/背面图 - **修复**:单张 `aspect-video` 横版 16:9 图,内部用 `flex` 等分 4 区域 - 4 区域:正面半身 / 正面全身 / 侧面 / 背面 - 底部半透明标签标注每个区域 - 区域间白色分隔线 #### 4. Skills 管理页完整重写(`dashboard/skills/page.tsx`) **架构级重设计**,从"单一提示词编辑器"改为"目录级知识包管理器": - **列表视图**: - 每张卡片显示文件统计(总文件数 / references / templates) - 顶部新增"安装 Skill"按钮(为未来外部 Skill 导入预留) - **详情视图**(IDE 风格): - **左侧文件树**(260px 宽): - 可折叠文件夹(SKILL.md、CLAUDE.md、references/、templates/) - 文件类型图标区分(FileText / Folder) - 当前选中文件高亮 - **右侧文件编辑器**: - 预览 / 编辑模式切换 - 文件路径面包屑 - 文件描述显示 - Mock 数据基于真实 Skill 目录结构 - Mock 数据来源:`D:\Air spark\skills\测试skills三件套\` 的实际文件结构 #### 5. Build 验证 9 个路由全部编译通过,零 TypeScript 错误。 ### 修改文件 | 文件 | 修改内容 | |------|---------| | `dashboard/page.tsx` | 阶段命名修正 + ProjectCardMenu 下拉菜单 | | `[projectId]/page.tsx` | 阶段命名修正 | | `pipeline/[episodeId]/page.tsx` | 阶段命名修正("人设"→"图片资产" + "规划"→"提示词提取") | | `showcase/page.tsx` | 阶段命名修正(中英文 + toast) | | `dashboard/assets/page.tsx` | 三视图改为单张 16:9 横图 | | `dashboard/skills/page.tsx` | 完整重写 → 文件树 + 编辑器(IDE 风格) | ### 经验总结 > **命名即沟通。** "规划"对开发者清楚但用户困惑,"提示词提取"直接告诉用户这步做什么。 > 面向用户的阶段名应该用动词+名词结构描述动作,而非抽象名词。 > **Skill 不是 prompt。** 把 Skill 简化为单一系统提示词是对其能力的阉割。 > 真实的 Skill 是一个目录结构化的知识包,模型根据用户需求选择性读取不同文件。 > UI 设计必须反映这种目录结构,否则管理界面会误导用户。 --- ## Session 8 — 阶段 A 收尾:全流程页面补全 **日期**:2026-03-05 ### 背景 用户确认了完整计划后,从 Step 0 到 Step 9 全部执行。核心目标:补全端到端流程链路 + 审核回退 + 剧本三栏工作台 + 所有管线阶段视图。 ### 完成的工作 #### Step 0+1: Pipeline 组件拆分 + ReviewGate + 级联失效 - 提取 `components/pipeline/` 目录,4 个核心组件:PipelineStepper、ReviewGate、SegmentGrid、LogPanel - PipelineStepper 新增 `invalidated` 状态(amber ⚠️ + 删除线)+ 可点击跳转 - ReviewGate 通用审核门:3 种模式(review / auto_passed / invalidated) - 级联失效逻辑:重跑/回退 → 下游全部标记 `invalidated`,旧数据保留 - `page.tsx` 瘦身:430 → ~200 行,纯布局 + 状态管理 + stage 分发 #### Step 2: 剧本工作台(三栏 IDE 布局) - `chat/page.tsx` 从双栏改为三栏:文件树(200px) + 文件预览/编辑(flex-1) + AI Chat(380px) - 文件树反映 screenplay-skill 7 阶段产出:concept → outline → characters → world → synopsis → beats → scripts - 4 种文件状态:✅ done / 📝 draft / ⏳ pending / ⚠️ outdated - Markdown 预览 + 纯文本编辑模式切换 - 顶栏:剧本阶段指示器(① ② ③ ④ ⑤ ⑥ ⑦)+ "确认剧本,启动流水线" CTA - 引导模式提示:当前进度、下一步建议 #### Steps 3-7: 五个阶段视图 | 文件 | 阶段 | 内容 | |------|------|------| | `StagePromptExtract.tsx` | Stage 2 | 三 Tab(角色/场景/Keyshot)+ 可展开编辑提示词 | | `StageImageAssets.tsx` | Stage 3 | 三 Tab(角色/场景/道具)+ 总进度 + 单资产重跑 | | `StageKeyshots.tsx` | Stage 4 | 按场景手风琴 + 宫格预览 + 裁切格子横滚画廊 | | `StageSegments.tsx` | Stage 5 | 片段列表 + 时码 + 参考图引用 + Seedance 提示词预览 | | `StageTimeline.tsx` | Stage 7 | 16:9 预览区 + 时间轴条 + 场景色编码 + 导出CTA | #### Step 8: 流程串联 - `dashboard/page.tsx` 新增 CreateProjectModal(2步表单:名称+类型 → 集数+技能预览) - 项目详情"添加剧集"按钮 → Link 到 chat 页面 - 项目详情"设置"按钮 → Link 到项目设置页 - chat 页"确认剧本,启动流水线" → Link 到 pipeline 页面 #### Step 9: 设置 + 项目设置 - `dashboard/settings/page.tsx`:完善 API Keys(Claude + Banana Pro + Seedance)+ 流水线模式(全自动/逐步审核/自定义)+ 自定义时 7 阶段审核开关 - 新建 `[projectId]/settings/page.tsx`:项目名/描述/类型 + 技能配置 + 渲染风格(6选项)+ 视频参数(比例+模型)+ 危险区(归档/删除) - 首页 `/` 重定向从 `/showcase` 改为 `/dashboard` ### 文件变更清单 | 操作 | 文件 | |------|------| | 新建 | `components/pipeline/PipelineStepper.tsx` | | 新建 | `components/pipeline/ReviewGate.tsx` | | 新建 | `components/pipeline/SegmentGrid.tsx` | | 新建 | `components/pipeline/LogPanel.tsx` | | 新建 | `components/pipeline/StagePromptExtract.tsx` | | 新建 | `components/pipeline/StageImageAssets.tsx` | | 新建 | `components/pipeline/StageKeyshots.tsx` | | 新建 | `components/pipeline/StageSegments.tsx` | | 新建 | `components/pipeline/StageTimeline.tsx` | | 新建 | `dashboard/[projectId]/settings/page.tsx` | | 重写 | `dashboard/[projectId]/pipeline/[episodeId]/page.tsx` | | 重写 | `dashboard/[projectId]/chat/page.tsx` | | 重写 | `dashboard/settings/page.tsx` | | 修改 | `dashboard/page.tsx`(添加 CreateProjectModal) | | 修改 | `dashboard/[projectId]/page.tsx`(添加剧集→chat,设置→settings 链接) | | 修改 | `app/page.tsx`(重定向 → /dashboard) | ### 经验总结 > **端到端先于细节。** 用户最在意的不是单个页面的精美度,而是"从创建项目到导出成片"的完整链路是否畅通。 > 先把 ReviewGate + 步骤条跳转 + 页面间 Link 全部串起来,再逐个打磨阶段视图。 > **三栏布局是内容创作工具的正确范式。** 剧本工作台从双栏升级为三栏后,"文件即产出"的概念变得清晰 —— 用户能看到 AI 生成了什么文件、当前在第几步、下一步做什么。 > **组件拆分的时机。** 当一个文件超过 300 行且包含多个独立子组件时,就应该拆。Pipeline page 从 430 行拆到 ~200 行后,添加 5 个新阶段视图几乎零成本。 --- ## Session 9 — 用户预览反馈:流水线三阶段 UI 修复 **日期**:2026-03-12 ### 背景 用户启动前端预览,对 Stage 4 / 6 / 7 三个阶段视图进行了详细审阅,提出了 3 类问题。 ### 用户反馈 1. **Stage 4(宫格生成)内容重复**:场景列表渲染了两遍 —— 上方 `grid-cols-2` 卡片组展示宫格缩略图,下方 accordion 又列了同样的场景带可展开的格子描述。 2. **Stage 6(视频生成)无法预览视频**:只有状态格子(完成/生成中/失败),点击完成的片段没有任何反馈。用户无法判断视频质量是否需要重跑。此外失败提示硬编码"片段 08",多个失败时不会动态列出。 3. **Stage 7(剪辑导出)布局问题**: - 视频预览窗口 `max-w-2xl mx-auto` 偏小且居中,不符合剪辑软件操作直觉 - 时间轴片段下方出现一个 glass-card 展示"片段01 — 黑屏OS引入",用户标注"干嘛用的???"——该卡片是点击时间轴片段后显示的选中详情,与预览区信息完全重复 ### Claude 修复内容 #### 1. StageKeyshots.tsx — 删除重复,合并视图 - **删除**上方 `grid grid-cols-2` 独立卡片组(4 个场景卡片 + 宫格缩略图) - **合并**到 accordion 展开面板内:先展示宫格缩略图(mini grid),再展示格子描述横滚画廊 - 移除未使用的 `Camera` import #### 2. SegmentGrid.tsx — 新增视频预览 + 动态失败处理 - **新增** `selectedId` 状态 + 点击"已完成"片段打开顶部预览面板(16:9 播放区 + 关闭按钮) - **选中态** ring 高亮,区分当前预览的片段 - **点击约束**:只有 `status === "done"` 的片段可点击预览,其余 cursor-default - **动态失败列表**:`segments.filter(s => s.status === "failed").map(...)` 替代硬编码"片段 08",多个失败时逐行显示 #### 3. StageTimeline.tsx — 全宽预览 + 删除重复信息卡 - **预览区**:移除 `max-w-2xl mx-auto`,改为 `aspect-video` 全宽填充,尺寸与页面宽度一致 - **删除** "Selected Clip Info" glass-card(lines 147-164),该信息已在预览区内通过文字叠层展示 - 保留 `Image` import(预览区占位图标仍在使用) ### 修改文件 | 文件 | 修改内容 | |------|---------| | `components/pipeline/StageKeyshots.tsx` | 删除重复卡片组,宫格缩略图合并入 accordion | | `components/pipeline/SegmentGrid.tsx` | 新增视频预览面板 + 动态失败列表 | | `components/pipeline/StageTimeline.tsx` | 预览全宽 + 删除冗余信息卡 | ### 经验总结 > **重复信息 = 用户困惑。** 同一份数据渲染两次(Stage 4 的卡片+手风琴、Stage 7 的预览区+详情卡), > 用户不会认为"这是两种视角",只会觉得"为什么出现两遍"。宁可合并到一处,也不要拆成两个看起来类似的组件。 > **Mock 阶段也要考虑交互完整性。** Stage 6 只展示状态格子而没有点击预览,用户会认为功能缺失。 > 即使是占位 UI,也应该提供基本交互反馈(选中高亮、预览面板),让用户理解"这里将来能做什么"。 > **硬编码 Mock 的陷阱。** 失败提示写死"片段 08"在单个失败时没问题,但用户会追问"如果 4/5/6/7/8 都失败呢?" > 从一开始就用 `.filter().map()` 动态渲染,成本几乎为零但避免了这个问题。