Factory V3 → Main 分批搬运计划

源分支:public-factory-v3 · 策略:新旧并存,不删除旧模块

核心原则

低风险 第 1 批:基础协议与数据层

纯新增,无破坏。包含 AgentBoard 数据层、全局依赖注入、聊天协议扩展、Solution 热重载

改动说明并存注意
host/src/blade_agent/host/agent_board/ 数据层新模块,新表名必须删除 schema.py 中的 _rename_legacy_tables() 调用和 rename 映射;增加测试证明 software_factory_v2_* 旧表不被改名
deps.py新增 AgentBoardStoreget_agent_board_store()set_socketio_serverget_socketio_server()必须保留 main 已有的 get_software_factory_store()get_factory_v2_store()get_vibe_coding_store()set_network_env_getter
bridge.py 新增 create_socket_bridge工厂函数无冲突
ChatRequest.display_message 字段可选字段,默认 None链路横跨 chat_types.py_chat_service.pyorchestrator/chat.pysocket_schemas/__init__.pysocketio_handlers.py 和 AgentBoard route,需一并搬运
Engine.reload_solution_registry()新增方法,支持 Solution 热重载无冲突
还需搬运的支撑文件:orchestrator/headless_setup.pytool_host/headless.py(submit_result 增强)、projections/_history_dispatch.pyfork_resume.pytool_host/fork.py_engine_session_create.py

低风险 第 2 批:app-dev Solution + PromptBuilder + 新 Skills

新增 Solution 目录,PromptBuilder 增加 Solution 分支逻辑。需紧跟第 1 批,不能晚于第 3 批验收

改动说明并存注意
host/src/blade_agent/host/solutions/builtin/app-dev/ 整个目录新 Solution保留 vibe-coding-v2/software_factory/ 不动
新增 skills(agent_board、agent_native_app_guide 等)新 skill 文档无冲突
prompt.py 新增 has_solution_prompt 分支Solution 走精简路径,非 Solution 走原路径保留 agent_name / agent_identity 参数,仅在非 Solution 路径使用
_wrap_solution_agents_md / _wrap_context_agents_md新增静态方法无冲突
MEDIA: 语法不删除旧会话可能依赖
engine.py不删除 agent_name / agent_identity 传参保持原样
headless submit_result.description 提示词增强兼容增强无冲突
需补齐测试:host/tests/test_engine_solution_hot_reload.pyhost/tests/test_prompt_builder_solution.py

中风险 第 3 批:AgentBoard REST/Socket 路由层(并行注册)

新增路由,不替换旧路由。依赖第 1 批数据层、Socket.IO 基础,以及第 2 批的 app-dev solution id 可解析(否则项目初始化 session 会失败)

改动说明并存注意
server/src/blade_agent/server/routes/agent_board.py新路由 /api/agent-board/*保留旧路由文件 software_factory.pyfactory_v2.pyvide_coding.py(文件名是 vide,API 前缀是 /api/vibe-coding
routes/agent_board_changes.py变更事件流同上
routes/agent_board_git.pyGit 操作路由同上
routes/_agent_board_messages.py_agent_board_runtime.py辅助模块,必须一起搬无冲突
routes/gitea_client.pyGitea API 封装,位于 server/routes/ 下,不在项目根或 service 层无冲突
server/src/blade_agent/server/socket_schemas/__init__.py新增 agent-board socket schema无冲突
agent_board_socket.py新增无冲突
app.py 路由注册手工追加 3 个 agent_board router不能 cherry-pick 整文件(source 已删旧 import),须保留 software_factoryfactory_v2vide_coding 的 include_router
socketio_handlers.py新增 agent-board 事件不删除 V2 socket 事件
sandbox_port_pool.py不改保留端口回收逻辑
需补齐测试:tests/test_agent_board_schema.pytests/test_agent_board_archive.pytests/test_server_session_file_routes.py;并新增旧路由仍可访问、旧表未 rename 的回归测试

低风险 第 4 批:CLI blade kanban

纯新增命令。代码可先搬,但功能验收依赖第 3 批的 /api/agent-board/* 路由

改动说明
kanban.go + kanban_project.go + 测试新命令组:list / get / create / update / project
client.go 新增 Patch()向后兼容
root.go 注册一行注册

高风险 第 5 批:前端并存

最复杂的一批,依赖第 2、3 批同时可用。不能套用 source 分支的删除式 diff,必须手工保留旧页面、路由和 SDK exports

改动说明并存注意
新增 AgentBoardPage.tsxAgentBoardProjectPage.tsx新页面无冲突
新增 agent-board-api.ts新 API 层无冲突
App.tsx 新增路由 实际路由包括:/projects/new/studio/app-dev/projects/new/p/:projectId/tasks.../p/:projectId/chat.../p/:projectId/git/pulls.../p/:projectId/files/p/:projectId/publish/p/:projectId/service(s) → publish,以及兼容的 /agent-board/:projectId... 保留 /factory/*/factory-v2/* 旧路由
/chat 页面后端切换 不是简单的切换:/chat 仍路由到 HomePage,实际需改的是 HomePageHomeInput.tsxHomeSidebar.tsxGlobalHeader.tsxSolutionShell.tsxChatRouteBridge.tsx,将 vibe-coding-v2 / factory-v2 桥接改为 app-dev / agent-board 核心切换点,需逐文件确认
SubmitResultRenderer.tsx新增工具渲染组件无冲突
agent-kit 改动 涉及 client/types/rest.tsclient/types/socket-events.tsreact/sockets/event-bridge.tsreact/stores/chat-store.tsreact/stores/ui-store.tsreact/components/chat/tool-renderers/registry.tsreact/components/workspace/*react/schemas/session.ts 不能删除 software-factoryvibe-coding 的 resource exports
还需搬运的前端文件:app.cssRightPanel.tsxLeftPanel.tsxWorkspaceFilesPanel.tsxAgentBoardHeader.tsxAppDevBoardPanel.tsxAppDevPreviewPanel.tsxAccessUrlPanel.tsxcomponents/ui/button.tsxcomponents/ui/tooltip.tsx;并新增旧 agent-kit exports 仍存在的回归测试
旧页面和 client不删除保留 /factory/* 可访问

高风险 第 6 批:沙盒持久化改造

独立批次,涉及 persistent container 的生命周期、挂载和 label,需高风险验收。是否最后做取决于 app-dev 项目是否必须依赖新的持久容器语义

改动说明并存注意
persistent session 沙盒路径新分支逻辑只在 is_persistent=True 时激活
沙盒核心文件 实际涉及 host/src/blade_agent/host/sandbox/docker.pydocker_container_create.py_docker_reaper.py_docker_mount_validation.pyserver/src/blade_agent/services/sandbox_port_pool.py 涉及 persistent container 的生命周期、挂载和 label,改动范围大于预期
Blade CLI 陈旧检测增强无冲突
PortChangeNotificationHook不动旧路径仍需要
ChatOrchestrator.set_port_allocator不动旧路径仍需要
验收覆盖:端口回收、session 删除、容器重启后恢复、Blade CLI stale rebuild。需补齐测试 host/tests/test_docker_persistent.py

明确不搬的东西

批次依赖关系

第 1 批 (基础协议与数据)
  ├── 第 2 批 (app-dev Solution + PromptBuilder) ── 紧跟第 1 批
  │     └── 第 3 批 (AgentBoard REST/Socket) ── 依赖第 1 批数据层 + 第 2 批 solution id
  │           └── 第 5 批 (前端并存) ── 依赖第 2、3 批同时可用
  └── 第 4 批 (CLI kanban) ── 代码可先搬,功能验收依赖第 3 批

第 6 批 (沙盒持久化) ── 独立,高风险验收
  取决于 app-dev 是否必须依赖持久容器语义