D1: SQLite board-tasks 是唯一主看板
Gitea Issue 不再作为主看板数据源。Gitea 仅保留 Repo Provider 角色(clone / PR / diff / merge / webhook)。 V3 的 Gitea Issue 看板链路(factory_v3.py 的 board CRUD + webhook + label 状态同步)全部删除。
public-factory-v3 分支 / 简化终稿
综合三份设计文档的分析,形成本终稿。目标:将 Factory V2 / Factory V3 / Vibe Coding V2 三套并行实现收敛为一套通用 Agent Board 机制, 分 4 个 PR 阶段交付,每个 PR 可独立验证。
最务实可执行。 优势:硬编码清单具体到代码行号;7 阶段拆分粒度适合 PR;明确提出"先冻结决策再动手";PR 边界清晰(第一个 PR 只做命名边界,不碰 UI 大重构)。 劣势:篇幅较长,部分阶段可以合并以减少交付次数。
分析详尽,执行粒度太粗。 优势:有量化数据(3500 行可删、30 个文件);表格对比清晰;决策问题提得好。 劣势:三步走粒度太大,每步都是 2000+ 行变更的 PR,不适合 review 和验证。
架构愿景好,缺乏落地细节。 优势:模块边界定义清晰(Board Domain / TaskRunner / Repo Provider / Entry Adapter);目标目录结构直观。 劣势:没有识别具体硬编码问题;没有 PR 拆分计划;不了解当前代码的重复细节。
Gitea Issue 不再作为主看板数据源。Gitea 仅保留 Repo Provider 角色(clone / PR / diff / merge / webhook)。 V3 的 Gitea Issue 看板链路(factory_v3.py 的 board CRUD + webhook + label 状态同步)全部删除。
Task result 不强制 pr_url。通用结果只需 summary + err_msg;代码任务可额外返回 pr_url、branch 等。
HEADLESS_TASK_OUTPUT_SCHEMA 改为可扩展。
保留一个统一的项目工作台(/projects/:projectId),删除 /factory-v2、/factory-v3 路由。
Vibe Coding V2 作为入口配置(提供默认 Agent、文案),不拥有专属看板实现。
代码层:agent_board。API:/api/agent-board。
数据库表名第一阶段保留 software_factory_v2_*(避免 migration 风险),后续再改。
模型类名立即改:BoardProject / BoardTask / BoardTaskEvent / BoardAgent。
| 类型 | 位置 | 硬编码值 | 处理方式 |
|---|---|---|---|
| Solution ID | factory_v3.py (6处)factory_v2.py (8处)kanban.go |
"software_factory_v3""vibe-coding-v2" |
从 Agent Config / session 参数传入,路由层不绑定 |
| Role ID | factory_v3.py 多处 |
"butler", "default", "sf_manager" |
随 V3 Solution 删除一并消失;通用层只读 Agent Config |
| 状态枚举 | gitea_client.py:133-140前端 BoardPanel.tsx:26-34 |
status/unassigned ... status/done |
删除 Gitea 状态映射;统一用 BoardTaskStatus 枚举 |
| Webhook URL | factory_v3.py:222 |
http://host.docker.internal:8020 |
随 Gitea Issue 看板链路一并删除 |
| 人员列表 | FactoryV2BoardPanel.tsx:149 |
11 个团队成员姓名 | 改为前端自由输入 + 历史记录 |
| 默认 Agent | store.py:78 |
("default", "Vibe Coding", "vibe-coding-v2", "default", 0) |
去 "Vibe Coding" 绑定,改为通用默认名 |
| 输出 Schema | _factory_v2_runtime.py |
pr_url 强制字段 |
改为可选:通用 summary + 可选 pr_url |
| Autorun 提示词 | factory_v3.py:301-317 |
固定引用 blade skill use git_guide |
模板参数化,由 Agent Config 决定工作流步骤 |
| Socket 事件 | factory_v2_socket.pyfactory_v3.py |
factory-v2:board-task:changedboard:updated |
统一为 agent-board:task:changed |
采用 #1 方案的"先确认再动手"策略 + 合并部分阶段以减少交付次数。每个 PR 独立可验证。
预计 -900 行 / +200 行(净删 ~700)
host/agent_board/ 目录,将 software_factory_v2/ 的 models/schema/store 迁移过去并改名server/routes/agent_board.py,从 factory_v2.py 迁移看板 CRUD + autorunfactory_v3.py 整个文件(542 行)gitea_client.py:删除 Issue/Label 相关方法,保留 Repo/PR 部分 → 改名 gitea_provider.pyfactory_v2_socket.py(66 行),Socket 事件统一到 agent_board/api/agent-board
uv run pytest 全绿 + 前端 pnpm typecheck 通过 + 手动验证看板 CRUD 和 headless autorun。
预计 -1400 行 / +100 行(净删 ~1300)
FactoryV2BoardPanel.tsx → components/agent-board/AgentBoardPanel.tsx,去硬编码人员名components/factory-v3/ 目录(BoardPanel + ButlerBubble + ButlerProvider + CreateProjectFlow = 913 行)FactoryV3ProjectPage.tsx + FactoryV3ListPage.tsx(170 行)/factory-v2/:projectId → /projects/:projectIdVibeCodingWorkbenchLayout.tsx 改名 → ProjectWorkbenchLayout.tsx,去 "Vibe" 文案/api/agent-board
pnpm lint && pnpm typecheck + 浏览器手动测试看板拖拽、任务创建、autorun 触发。
预计 -1500 行 / +100 行(净删 ~1400)
solutions/builtin/software_factory_v3/ 目录(4 个 role + 16 个 skill)sf_prd_guide → prd_guide,sf_ui_design_guide → ui_design_guide,sf_tech_design_guide → tech_design_guidefactory_v3 Skill → 改为通用 agent_board Skill(描述看板 CLI 用法)blade kanban CLI:API 指向 /api/agent-board,去掉 solution_id 硬编码agent_board Skill(供所有 Solution 引用)
make test (CLI) + uv run pytest + 手动测试 blade kanban 命令在沙盒内可用。
预计 -300 行 / +150 行(净删 ~150)
agent_board.py 抽出 task_runner.py:统一 headless session 创建 → 事件同步 → 状态回写 → 结果解析agent_config.prompt_template 或使用默认通用模板{summary, err_msg} + 可选扩展字段_factory_v2_runtime.py、_factory_v2_messages.py端到端测试:创建看板任务 → 分配 Agent → 自动触发 headless → 结果回写到卡片 → 前端实时更新。
host/src/blade_agent/host/agent_board/
models.py # BoardProject, BoardTask, BoardTaskStatus, BoardTaskEvent, BoardAgent
schema.py # SQLite schema (表名暂保留 software_factory_v2_*)
store.py # AgentBoardStore
task_runner.py # card -> headless session -> events -> result
host/src/blade_agent/host/agent_board/
gitea_provider.py # Repo/PR/diff/merge (无 Issue/Label)
server/src/blade_agent/server/routes/
agent_board.py # 统一 /api/agent-board 路由
agent_board_changes.py # PR 回流 + 代码变更
web/apps/web/src/components/agent-board/
AgentBoardPanel.tsx # 通用看板面板
AgentBoardTaskDialog.tsx # 任务详情
AgentBoardEvents.tsx # 事件时间线
agent-board-api.ts # API client
web/apps/web/src/layouts/
ProjectWorkbenchLayout.tsx # 统一工作台壳
web/apps/web/src/pages/
ProjectWorkbenchPage.tsx # /projects/:projectId
| 文件/目录 | 行数 | 原因 | PR |
|---|---|---|---|
server/routes/factory_v3.py | 542 | Gitea Issue 看板主路由 | #1 |
server/factory_v2_socket.py | 66 | 并入统一 socket | #1 |
server/routes/_factory_v2_runtime.py | 152 | 合并到 task_runner | #4 |
server/routes/_factory_v2_messages.py | 55 | 合并到 agent_board | #4 |
server/vibe_log_socket.py | 136 | 并入统一 socket | #1 |
web/components/factory-v3/ (整目录) | 913 | Gitea 看板 UI | #2 |
web/pages/FactoryV3ProjectPage.tsx | 79 | V3 入口 | #2 |
web/pages/FactoryV3ListPage.tsx | 91 | V3 列表 | #2 |
solutions/builtin/software_factory_v3/ (整目录) | ~1500 | V3 Solution | #3 |
| 合计 | ~3,500 |
~3,500
行代码净删除
~30
个文件删除/合并
3 → 1
API prefix 收敛
16 → 8
Skill 去重