|
| 1 | +# Coder Studio Product Spec |
| 2 | + |
| 3 | +本文档定义 Coder Studio 的产品功能规格体系。它不是 PRD,也不是历史设计记录,而是面向开发、测试和后续 AI agent 的功能事实与验收契约。 |
| 4 | + |
| 5 | +## 1. 文档目标 |
| 6 | + |
| 7 | +Product Spec 只回答四类问题: |
| 8 | + |
| 9 | +- 当前有哪些用户可达或内部可用的功能。 |
| 10 | +- 每个功能从哪里进入、如何交互、有哪些状态和边界。 |
| 11 | +- 每个功能依赖哪些前端入口、WebSocket command、server handler、provider 或 core 类型。 |
| 12 | +- 每个功能如何验收,如何拆成手工或自动化测试用例。 |
| 13 | + |
| 14 | +Product Spec 不承担以下职责: |
| 15 | + |
| 16 | +- 不写市场背景、品牌叙事或愿景口号。 |
| 17 | +- 不复述历史方案、旧 PRD 或过时 specs。 |
| 18 | +- 不把未接线 UI、实验代码或未来设想写成已实现能力。 |
| 19 | +- 不替代技术设计文档、实现计划或变更记录。 |
| 20 | + |
| 21 | +## 2. 事实来源 |
| 22 | + |
| 23 | +新规格以当前代码为准。旧 `docs/PRD*.md`、`docs/superpowers/specs/*`、wiki、promotion 和历史 issue 只能作为线索,不能作为事实依据。 |
| 24 | + |
| 25 | +可信事实来源按优先级排列: |
| 26 | + |
| 27 | +1. 用户可达入口:页面、按钮、菜单、快捷键、移动端 Sheet / Drawer。 |
| 28 | +2. 前端代码:`packages/web/src/app`、`packages/web/src/shells`、`packages/web/src/features`。 |
| 29 | +3. WebSocket 与命令分发:`packages/server/src/ws/dispatch.ts`、`packages/server/src/commands`。 |
| 30 | +4. 共享合同:`packages/core/src`。 |
| 31 | +5. Provider 能力:`packages/providers/src`。 |
| 32 | +6. 测试证据:`*.test.ts`、`*.test.tsx`、`e2e-ui/specs`。 |
| 33 | + |
| 34 | +如果代码、旧文档和 README 描述冲突,以当前代码为准。 |
| 35 | + |
| 36 | +## 3. 目录结构 |
| 37 | + |
| 38 | +建议目录如下: |
| 39 | + |
| 40 | +```text |
| 41 | +docs/product-spec/ |
| 42 | + README.zh-CN.md |
| 43 | +
|
| 44 | + modules/ |
| 45 | + app-shell.zh-CN.md |
| 46 | + auth.zh-CN.md |
| 47 | + welcome.zh-CN.md |
| 48 | + workspace.zh-CN.md |
| 49 | + workspace-desktop.zh-CN.md |
| 50 | + workspace-mobile.zh-CN.md |
| 51 | + workspace-tabs-layout.zh-CN.md |
| 52 | + agent-sessions.zh-CN.md |
| 53 | + agent-panes.zh-CN.md |
| 54 | + agent-instructions.zh-CN.md |
| 55 | + providers.zh-CN.md |
| 56 | + supervisor.zh-CN.md |
| 57 | + files.zh-CN.md |
| 58 | + editor-preview.zh-CN.md |
| 59 | + search-quick-open.zh-CN.md |
| 60 | + git.zh-CN.md |
| 61 | + worktrees.zh-CN.md |
| 62 | + terminal.zh-CN.md |
| 63 | + settings.zh-CN.md |
| 64 | + diagnostics.zh-CN.md |
| 65 | + monitoring.zh-CN.md |
| 66 | + work-analysis.zh-CN.md |
| 67 | + skills.zh-CN.md |
| 68 | + updates.zh-CN.md |
| 69 | + notifications.zh-CN.md |
| 70 | + command-palette.zh-CN.md |
| 71 | + shortcuts.zh-CN.md |
| 72 | + ui-components.zh-CN.md |
| 73 | +
|
| 74 | + flows/ |
| 75 | + startup-and-auth.zh-CN.md |
| 76 | + open-workspace.zh-CN.md |
| 77 | + start-agent-session.zh-CN.md |
| 78 | + file-edit-preview.zh-CN.md |
| 79 | + git-change-review.zh-CN.md |
| 80 | + terminal-recovery.zh-CN.md |
| 81 | + provider-configuration.zh-CN.md |
| 82 | +
|
| 83 | + acceptance/ |
| 84 | + smoke.zh-CN.md |
| 85 | + desktop.zh-CN.md |
| 86 | + mobile.zh-CN.md |
| 87 | + server-commands.zh-CN.md |
| 88 | +``` |
| 89 | + |
| 90 | +目录职责: |
| 91 | + |
| 92 | +- `modules/`:按产品模块记录功能点、状态、边界和验收标准。 |
| 93 | +- `flows/`:记录跨模块用户流程,用于端到端验收和 e2e 用例设计。 |
| 94 | +- `acceptance/`:记录全局验收清单,覆盖冒烟、桌面、移动端和 server command 层。 |
| 95 | + |
| 96 | +## 4. 模块边界 |
| 97 | + |
| 98 | +模块按用户能力和代码边界共同划分。优先保持一个模块内的功能能被同一类用户入口触发,并尽量对应明确的代码目录。 |
| 99 | + |
| 100 | +初始模块边界: |
| 101 | + |
| 102 | +| 模块 | 覆盖范围 | 主要代码线索 | |
| 103 | +| --- | --- | --- | |
| 104 | +| App Shell | 启动、路由壳层、连接态、桌面/移动壳层选择 | `packages/web/src/app`、`packages/web/src/shells` | |
| 105 | +| Auth | 登录、会话门禁、认证状态 | `packages/web/src/features/auth`、`packages/server/src/auth` | |
| 106 | +| Welcome | 欢迎页、打开工作区入口、设置入口 | `packages/web/src/features/welcome` | |
| 107 | +| Workspace | 工作区总入口、active workspace、加载/错误/空态 | `packages/web/src/features/workspace`、`packages/server/src/commands/workspace.ts` | |
| 108 | +| Workspace Desktop | 桌面工作区布局、侧栏、主区、底部终端 | `packages/web/src/features/workspace/views/desktop` | |
| 109 | +| Workspace Mobile | 移动端 Dock、Sheet、Drawer、移动端工作区状态 | `packages/web/src/features/workspace/views/mobile` | |
| 110 | +| Workspace Tabs / Layout | workspace tab、布局持久化、focus/fullscreen、最后查看目标 | `packages/web/src/features/workspace/actions/use-workspace-ui-state-persistence.ts`、`packages/web/src/features/workspace/actions/use-workspace-layout-actions.ts` | |
| 111 | +| Agent Sessions | Agent 会话创建、运行态、历史、metadata | `packages/web/src/features/agent-panes`、`packages/server/src/commands/session.ts` | |
| 112 | +| Agent Panes | Agent pane 布局、pane card、draft launcher、pane navigation | `packages/web/src/features/agent-panes` | |
| 113 | +| Agent Instructions | Agent 指令生成、读取、编辑、token 趋势 | `packages/web/src/features/workspace/actions/use-agent-instructions-actions.ts`、`packages/server/src/agent-instructions` | |
| 114 | +| Providers | Provider 配置、切换、运行边界、自定义 provider | `packages/web/src/features/agent-providers`、`packages/providers/src`、`packages/server/src/provider-runtime` | |
| 115 | +| Supervisor | Supervisor 列表、目标、详情、移动端 Sheet | `packages/web/src/features/supervisor`、`packages/server/src/supervisor` | |
| 116 | +| Files | 文件树、刷新、上下文菜单、上传、打开文件 | `packages/web/src/features/workspace/views/shared/file-tree-panel.tsx`、`packages/server/src/commands/file.ts` | |
| 117 | +| Editor Preview | 文本编辑、图片/Markdown/HTML 预览、Diff viewer | `packages/web/src/features/code-editor`、`packages/server/src/preview` | |
| 118 | +| Search / Quick Open | 搜索、快速打开、搜索预览 | `packages/web/src/features/quick-open`、`packages/web/src/features/workspace/views/shared/search-panel.tsx` | |
| 119 | +| Git | Git 状态、Diff、commit、branch、push/pull | `packages/web/src/features/workspace/actions/use-git-actions.ts`、`packages/server/src/commands/git.ts` | |
| 120 | +| Worktrees | Worktree 列表、详情、管理入口 | `packages/web/src/features/workspace/views/shared/worktree-*`、`packages/server/src/commands/worktree.ts` | |
| 121 | +| Terminal | shell terminal、agent terminal、多终端、恢复、上传 | `packages/web/src/features/terminal-panel`、`packages/server/src/terminal` | |
| 122 | +| Settings | 设置页、provider 设置、外观、快捷键、监控设置、关于 | `packages/web/src/features/settings`、`packages/server/src/commands/settings.ts` | |
| 123 | +| Diagnostics | 系统依赖、诊断页、安装流程 | `packages/web/src/features/diagnostics`、`packages/server/src/commands/diagnostics.ts` | |
| 124 | +| Monitoring | 运行监控、指标展示、监控设置 | `packages/web/src/features/monitoring`、`packages/server/src/monitoring` | |
| 125 | +| Work Analysis | 工作分析、时间范围、归因、趋势、导出 | `packages/web/src/features/work-analysis`、`packages/server/src/work-analysis` | |
| 126 | +| Skills | skills 面板、挂载目录、归因和管理 | `packages/web/src/features/workspace/actions/use-skills-panel.ts`、`packages/server/src/skills` | |
| 127 | +| Updates | 更新检查、更新提示、footer update rail | `packages/web/src/features/updates`、`packages/server/src/update` | |
| 128 | +| Notifications | Toast、系统通知、会话完成通知 | `packages/web/src/features/notifications`、`packages/web/src/components/ui/toast` | |
| 129 | +| Command Palette | 命令面板、命令入口、键盘交互 | `packages/web/src/features/command-palette` | |
| 130 | +| Shortcuts | 全局快捷键、工作区导航快捷键、设置页快捷键展示 | `packages/web/src/features/workspace/actions/use-workspace-navigation-shortcuts.ts`、`packages/web/src/features/settings/components/shortcuts-settings.tsx` | |
| 131 | +| UI Components | 可复用 UI 原语和组件库状态 | `packages/web/src/components/ui` | |
| 132 | + |
| 133 | +模块边界不是永久固定的。后续盘点发现某个模块过大时,应拆分为更小的文档,但功能 ID 要保持稳定。 |
| 134 | + |
| 135 | +## 5. 功能状态 |
| 136 | + |
| 137 | +每个功能点必须标记一个状态: |
| 138 | + |
| 139 | +| 状态 | 定义 | |
| 140 | +| --- | --- | |
| 141 | +| `Implemented` | 代码已接线,用户可达,可按验收标准验证。 | |
| 142 | +| `Partial` | 有部分代码或 UI,但流程、状态、错误处理或验收路径不完整。 | |
| 143 | +| `Internal` | 内部能力存在,但没有稳定用户入口,或只被其他功能间接使用。 | |
| 144 | +| `Deprecated` | 代码可能仍存在,但产品上不再承诺或不建议使用。 | |
| 145 | +| `Planned` | 计划做,但当前代码没有实现。 | |
| 146 | +| `Removed` | 曾经存在或曾被文档记录,但当前代码已移除。 | |
| 147 | + |
| 148 | +只有 `Implemented` 和 `Partial` 可以写入当前功能规格的主流程。`Planned` 必须明确标注,不得混入已实现能力。 |
| 149 | + |
| 150 | +## 6. 功能 ID 规则 |
| 151 | + |
| 152 | +功能 ID 用模块前缀加三位数字,稳定后不要随意修改。 |
| 153 | + |
| 154 | +建议前缀: |
| 155 | + |
| 156 | +| 前缀 | 模块 | |
| 157 | +| --- | --- | |
| 158 | +| `APP` | App Shell | |
| 159 | +| `AUTH` | Auth | |
| 160 | +| `WELCOME` | Welcome | |
| 161 | +| `WS` | Workspace | |
| 162 | +| `WSD` | Workspace Desktop | |
| 163 | +| `WSM` | Workspace Mobile | |
| 164 | +| `WSL` | Workspace Tabs / Layout | |
| 165 | +| `SESSION` | Agent Sessions | |
| 166 | +| `PANE` | Agent Panes | |
| 167 | +| `INSTR` | Agent Instructions | |
| 168 | +| `PROVIDER` | Providers | |
| 169 | +| `SUP` | Supervisor | |
| 170 | +| `FILE` | Files | |
| 171 | +| `EDITOR` | Editor Preview | |
| 172 | +| `SEARCH` | Search / Quick Open | |
| 173 | +| `GIT` | Git | |
| 174 | +| `WT` | Worktrees | |
| 175 | +| `TERM` | Terminal | |
| 176 | +| `SETTINGS` | Settings | |
| 177 | +| `DIAG` | Diagnostics | |
| 178 | +| `MON` | Monitoring | |
| 179 | +| `WA` | Work Analysis | |
| 180 | +| `SKILL` | Skills | |
| 181 | +| `UPDATE` | Updates | |
| 182 | +| `NOTIFY` | Notifications | |
| 183 | +| `CMD` | Command Palette | |
| 184 | +| `SHORTCUT` | Shortcuts | |
| 185 | +| `UI` | UI Components | |
| 186 | + |
| 187 | +示例: |
| 188 | + |
| 189 | +```text |
| 190 | +### WS-001 打开工作区 |
| 191 | +### SESSION-004 恢复 Agent 会话 |
| 192 | +### GIT-006 查看文件 Diff |
| 193 | +``` |
| 194 | + |
| 195 | +如果功能移动到另一个模块,旧 ID 保留,并在新位置标注迁移说明。 |
| 196 | + |
| 197 | +## 7. 模块文档模板 |
| 198 | + |
| 199 | +每个 `modules/*.zh-CN.md` 使用以下结构: |
| 200 | + |
| 201 | +```text |
| 202 | +# 模块名 |
| 203 | +
|
| 204 | +## 1. 模块范围 |
| 205 | +
|
| 206 | +覆盖: |
| 207 | +- workspace 列表、打开、关闭。 |
| 208 | +
|
| 209 | +不覆盖: |
| 210 | +- Git、终端和文件编辑细节。 |
| 211 | +
|
| 212 | +## 2. 用户入口 |
| 213 | +
|
| 214 | +| 入口 | 端 | 说明 | |
| 215 | +| --- | --- | --- | |
| 216 | +| Workspace launch modal | Both | 浏览目录并打开 workspace。 | |
| 217 | +
|
| 218 | +## 3. 功能点清单 |
| 219 | +
|
| 220 | +| ID | 功能点 | 状态 | 代码入口 | 验收入口 | |
| 221 | +| --- | --- | --- | --- | --- | |
| 222 | +| WS-004 | 打开 workspace | Implemented | `packages/server/src/commands/workspace.ts` | `packages/server/src/__tests__/workspace-commands.test.ts` | |
| 223 | +
|
| 224 | +## 4. 功能点规格 |
| 225 | +
|
| 226 | +### WS-004 打开 workspace |
| 227 | +
|
| 228 | +状态:`Implemented` |
| 229 | +
|
| 230 | +用户行为: |
| 231 | +- 用户选择目录并点击打开。 |
| 232 | +
|
| 233 | +系统响应: |
| 234 | +- 前端调用 `workspace.open`,服务端打开目录并返回 workspace。 |
| 235 | +
|
| 236 | +状态与边界: |
| 237 | +- Loading:打开请求处理中。 |
| 238 | +- Empty:没有可打开 workspace 时展示空态。 |
| 239 | +- Success:active workspace 切换到打开结果。 |
| 240 | +- Error:打开失败时展示诊断或错误反馈。 |
| 241 | +
|
| 242 | +桌面端差异: |
| 243 | +- 桌面端在 workspace tab 中显示新 workspace。 |
| 244 | +
|
| 245 | +移动端差异: |
| 246 | +- 移动端进入移动工作区视图。 |
| 247 | +
|
| 248 | +数据与命令: |
| 249 | +- Frontend:`packages/web/src/features/workspace/actions/use-workspace-launch-actions.ts` |
| 250 | +- WebSocket command:`workspace.open` |
| 251 | +- Server handler:`packages/server/src/commands/workspace.ts` |
| 252 | +- Core / provider 类型:`packages/core/src/domain/types.ts` |
| 253 | +
|
| 254 | +验收标准: |
| 255 | +- Given 启动器中已选择有效路径 |
| 256 | +- When 用户确认打开 |
| 257 | +- Then active workspace 切换为打开结果 |
| 258 | +
|
| 259 | +代码索引: |
| 260 | +- `packages/server/src/commands/workspace.ts` |
| 261 | +
|
| 262 | +测试线索: |
| 263 | +- `packages/server/src/__tests__/workspace-commands.test.ts` |
| 264 | +- `packages/web/src/features/workspace/actions/use-workspace-launch-actions.test.tsx` |
| 265 | +
|
| 266 | +## 5. 模块级验收清单 |
| 267 | +
|
| 268 | +- [ ] 能打开一个有效目录作为 workspace。 |
| 269 | +- [ ] 打开失败时有错误反馈。 |
| 270 | +
|
| 271 | +## 6. 未确认项 |
| 272 | +
|
| 273 | +- workspace history 的 UI 排序规则需补充更多代码证据。 |
| 274 | +``` |
| 275 | + |
| 276 | +未确认项必须说明缺少哪类证据。不要用英文占位词代替问题描述。 |
| 277 | + |
| 278 | +## 8. 流程文档模板 |
| 279 | + |
| 280 | +每个 `flows/*.zh-CN.md` 用于描述跨模块路径: |
| 281 | + |
| 282 | +```text |
| 283 | +# 流程名 |
| 284 | +
|
| 285 | +## 1. 流程目标 |
| 286 | +
|
| 287 | +## 2. 参与模块 |
| 288 | +
|
| 289 | +## 3. 前置条件 |
| 290 | +
|
| 291 | +## 4. 主路径 |
| 292 | +
|
| 293 | +| 步骤 | 用户行为 | 系统响应 | 关联功能 ID | |
| 294 | +| --- | --- | --- | --- | |
| 295 | +| 1 | 用户选择目录 | 系统打开 workspace 并进入工作区 | `WS-004` | |
| 296 | +
|
| 297 | +## 5. 分支与错误路径 |
| 298 | +
|
| 299 | +## 6. 验收标准 |
| 300 | +
|
| 301 | +## 7. 自动化测试建议 |
| 302 | +``` |
| 303 | + |
| 304 | +流程文档不重复模块规格细节,只引用功能 ID。 |
| 305 | + |
| 306 | +## 9. 验收写法 |
| 307 | + |
| 308 | +验收标准优先使用 Given / When / Then: |
| 309 | + |
| 310 | +```text |
| 311 | +验收标准: |
| 312 | +- Given 当前没有打开的 workspace |
| 313 | +- When 用户从欢迎页选择一个有效目录 |
| 314 | +- Then 应用进入工作区页 |
| 315 | +- And 顶部工作区栏显示该 workspace |
| 316 | +- And 刷新页面后仍能恢复该 workspace |
| 317 | +``` |
| 318 | + |
| 319 | +每个功能点至少要有一条可手工验证的验收标准。适合自动化的场景再补充测试建议。 |
| 320 | + |
| 321 | +验收标准要避免以下写法: |
| 322 | + |
| 323 | +- “体验正常” |
| 324 | +- “逻辑正确” |
| 325 | +- “展示合理” |
| 326 | +- “和以前一样” |
| 327 | +- “参考旧 PRD” |
| 328 | + |
| 329 | +## 10. 盘点顺序 |
| 330 | + |
| 331 | +全量盘点按三轮推进: |
| 332 | + |
| 333 | +1. 模块索引轮:为所有模块建立功能 ID、功能名、状态、代码入口和初始验收入口。 |
| 334 | +2. 功能规格轮:补齐用户行为、系统响应、状态、边界、数据与命令。 |
| 335 | +3. 验收清单轮:从功能 ID 反向生成模块验收、跨模块流程验收和冒烟清单。 |
| 336 | + |
| 337 | +第一轮不要追求完整叙述,重点是覆盖面和代码证据。第二轮再补细节。第三轮再生成测试用例。 |
| 338 | + |
| 339 | +## 11. 维护规则 |
| 340 | + |
| 341 | +- 修改功能行为时,同步更新对应模块 spec。 |
| 342 | +- 新增功能时,先分配功能 ID,再补代码索引和验收标准。 |
| 343 | +- 删除或废弃功能时,不删除 ID,改状态并说明当前代码状态。 |
| 344 | +- 如果只存在组件代码但没有用户入口,标记为 `Internal` 或 `Partial`。 |
| 345 | +- 如果只有旧文档描述但当前代码没有实现,标记为 `Planned`、`Deprecated` 或 `Removed`,不得写成 `Implemented`。 |
| 346 | +- 模块文档中不得大段复制旧 PRD 或旧 specs。 |
| 347 | +- 验收标准应能被人工执行,也应尽量能转成自动化测试。 |
0 commit comments