AirSpark/DEV-LOG.md
seaislee1209 acbd2e30ad Initial commit: Air Spark project
- frontend/: Next.js 16 app (App Router, React 19, Tailwind v4)
- skills/: project skills (seedance, automation, trae-agents, etc.)
- Docs: PRD, UI-Design-System, DEV-LOG, seedance integration notes
- skills-lock.json: skills version lock

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:08:49 +08:00

595 lines
29 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 — 核心页面开发(阶段 AApp 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` 组件的容器从 `<div>` 改为 `<Link href={/dashboard/${project.id}}`
- 卡片现在可正确点击跳转到项目详情页
#### 2. 真实剧本替换(`[projectId]/chat/page.tsx`
- 读取 `skills/测试skills三件套/原创剧本-skill/scripts/ep01.md` 的完整内容
- 替换 MOCK_SCRIPT 为《恐龙也是打工龙》第1集完整剧本4 场 + 片尾彩蛋)
- 更新 MOCK_MESSAGES 对话内容,匹配真实剧本场景
#### 3. 发送按钮修复(`[projectId]/chat/page.tsx`
- **之前**`absolute` 定位在 textarea 内部,位置不准且样式突兀
- **修复**:改为 `flex items-end gap-2` 布局,按钮独立在输入框右侧
- 固定 `w-10 h-10 rounded-xl`,与输入框底部对齐
- 有内容时紫色发光,无内容时半透明 + 边框
- 去掉 `pr-12`(不再需要为内嵌按钮留位置)
#### 4. 资产库画廊页(`dashboard/assets/page.tsx`)— 完整重写
- **搜索 + 分类筛选**:全部 / 角色 / 场景 / 道具(带计数)
- **资产卡片网格**(响应式 2-6 列):
- 缩略图用渐变色占位(角色=暖色、场景=冷色、道具=粉色)
- 类型标签(左上角)+ 关联剧集标签(右下角)
- 名称 + 更新时间 + 版本号
- Hover 效果(缩略图亮度提升)
- **资产详情弹窗**(点击卡片打开):
- 角色:展示正面/侧面/背面三视图
- 场景/道具:展示大图预览
- 生成提示词(可编辑)
- 关联剧集列表 + 版本历史
- 操作按钮:重新生成 / 编辑提示词后重新生成
- Mock 数据4 个角色 + 3 个场景 + 1 个道具(来自 ep01.md 剧本)
#### 5. Skills 管理页(`dashboard/skills/page.tsx`)— 完整重写
- **列表视图**3 个 Skill 卡片(可点击进入详情)
- 显示名称 + 英文 ID + 描述 + 关联阶段 + 更新时间
- Hover 显示箭头指引
- **详情视图**(点击卡片后展示):
- 左侧:系统提示词编辑器(预览/编辑切换,类似剧本面板)
- 右侧信息栏:
- 基本信息(描述、关联阶段、模型、类型标签、更新时间)
- 使用此 Skill 的项目列表
- 版本历史
- 操作:编辑 → 保存 → 版本自增
- Mock 数据包含真实的 Skill 提示词摘要
#### 6. Build 验证
9 个路由全部编译通过,无 TypeScript 错误。
### 修改文件
| 文件 | 修改内容 |
|------|---------|
| `dashboard/page.tsx` | ProjectCard 包裹 Link 实现点击导航 |
| `[projectId]/chat/page.tsx` | 真实剧本 + 发送按钮修复 |
| `dashboard/assets/page.tsx` | 完整重写 → 画廊 + 详情弹窗 |
| `dashboard/skills/page.tsx` | 完整重写 → 卡片列表 + 详情编辑 |
### 经验总结
> **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` 新增 CreateProjectModal2步表单名称+类型 → 集数+技能预览)
- 项目详情"添加剧集"按钮 → Link 到 chat 页面
- 项目详情"设置"按钮 → Link 到项目设置页
- chat 页"确认剧本,启动流水线" → Link 到 pipeline 页面
#### Step 9: 设置 + 项目设置
- `dashboard/settings/page.tsx`:完善 API KeysClaude + 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-cardlines 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()` 动态渲染,成本几乎为零但避免了这个问题。