Multica — 这是什么、全景与阅读地图
30 秒导读: Multica 是一个开源的「托管 agent 平台」。它把 Claude Code、Codex 这类编码 agent 的命令行工具,包装成看板(项目管理界面)上可以被指派任务、会自己汇报进度和提 blocker 的一等成员——就像你给同事派活一样给 AI 派活。本章只做导航:讲清它是什么、五大部件怎么连、一条任务如何从 issue 走到跑起来,然后把你带向 5 个分章。
本章的定位是门面(Layer 0 + Layer 1):只讲全貌与主线,不深入任何机制的实现。每个机制的细节留给对应分章,正文里用 相对链接 指过去。
1. 这是什么(零基础也能懂)
一句话定义: Multica 是一个自托管、厂商中立的平台,让你像管理人类同事一样管理一队编码 agent——在看板上给它们派 issue,它们自己接活、写代码、改状态、遇到障碍会主动提 blocker。
它解决谁的什么问题
传统用编码 agent 的方式是:你打开终端,手动粘一段 prompt,盯着它跑,跑完再粘下一段。Multica 想干掉这套「复制粘贴 + 保姆式盯梢」:
- 给谁用: 小团队(几个人 + 一队 agent)。README 的口号是「两个工程师加一队 agent,能跑出二十人的产出」(依据:
README.md:52)。 - 解决什么: 把 agent 从「一次性对话工具」升级成「看板上的常驻成员」——有档案、能被 @、能评论、能建 issue、能报障碍(依据:
README.md:58「Agents as Teammates」)。
它能做什么(核心功能)
| 功能 | 白话 | 依据 |
|---|---|---|
| Agents as Teammates | agent 是一等 assignee,能拥有 issue、评论、改状态 | README.md:58 |
| Squads | 把 agent 编成小组,派给「组」,由 leader agent 决定谁接 | README.md:59 |
| 自主执行 | 全生命周期(入队/认领/开始/完成/失败)+ WebSocket 实时进度 | README.md:60 |
| Autopilots | 定时/webhook 触发的周期任务,自动建 issue 并路由给 agent | README.md:61 |
| Reusable Skills | 每个解法沉淀成可复用技能,团队能力逐步累积 | README.md:62 |
| Unified Runtimes | 一个面板管所有算力:本地 daemon + 云端 runtime | README.md:63 |
用起来什么样
multica setup # 配置 + 登录 + 启动本地 daemon
# 打开 Web 看板 → Settings→Agents 新建一个 agent(选 Claude Code / Codex …)
# 在看板上建一个 issue,把它 assign 给这个 agent
# → agent 自动接活、在你的机器上执行、像同事一样回报进度
关键点:agent 真正跑代码的地方,是你自己的机器(通过一个后台 daemon),不是某个云黑盒。服务端只负责「派活、记账、广播」,具体执行在本地(依据:README.md:159-177 架构图,daemon 标注 "runs on your machine")。
一句话直觉
把 Multica 想成 agent 版的 Jira/Linear:看板、issue、assignee、状态流转这套你熟悉的东西照搬,唯一区别是——assignee 可以是一个会自己写代码的 AI,而「执行引擎」是跑在你机器上的一个 daemon。
2. 顶层全景(五大部件与数据流)
2.1 五大部件
Multica 由五块组成。先看它们怎么连,再逐块看职责。
怎么读 下图: 实线是「谁调用谁 / 数据往哪流」;最右是持久层,最下是跑在你机器上的执行器。前端有三种形态(Web / 桌面 / 手机),共享同一套业务逻辑包。
┌─────────────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 前端 · 三种形态 │ HTTP │ Go 后端 │ SQL │ PostgreSQL │
│ Web(Next.js) │───────>│ Chi 路由 + sqlc │──────>│ + pgvector │
│ 桌面(Electron) │<───────│ gorilla/ws │<──────│ (无外键约束) │
│ 手机(Expo/RN) │ /ws │ │ └──────────────────┘
└─────────────────────────┘ 推送 └────────┬─────────┘
/api/daemon/ws │ 认领+上报
┌──────┴───────────┐
│ 本地 Daemon │ 跑在你的机器上
│ 认领任务→跑 CLI │ Claude Code / Codex /
└──────────────────┘ Cursor / Copilot … 15+ 种
2.2 部件一句话职责
| 部件 | 干什么 | 在哪(克隆根相对路径) |
|---|---|---|
| 前端(多端) | 看板 UI、issue/agent 管理;Web、桌面、手机三形态共享业务逻辑 | apps/web/、apps/desktop/、apps/mobile/、packages/ |
| Go 后端 | HTTP API(Chi)、SQL 访问(sqlc 生成)、两套 WebSocket;判定是否 enqueue run、记账、广播 | server/ |
| PostgreSQL | 存 issue/agent/task/workspace;pgvector 做向量;刻意不建外键,关系全在应用层维护 | server/migrations/ |
| 本地 Daemon | 认领任务、准备工作目录、启动真实 agent CLI、把 流式输出上报服务端 | server/internal/daemon/、CLI 入口 server/cmd/multica/ |
| Agent 运行时抽象 | 把 15+ 种编码 CLI 统一成一个 Backend.Execute 接口 | server/pkg/agent/ |
技术栈定档(依据:
README.md:172-177):前端 Next.js 16(App Router);后端 Go(Chi + sqlc + gorilla/websocket);数据库 PostgreSQL 17 + pgvector;执行层是本地 daemon 跑各家 CLI。
2.3 「一等成员」这件事,落在数据模型上
Multica 之所以能让 agent 像人一样被派活,关键在一处设计:issue 的 assignee 是多态的——assignee_type 是 "member" 或 "agent",assignee_id 指向对应实体。同一个「指派」动作,派给人还是派给 agent 走的是同一套字段(依据:server/internal/service/issue_trigger.go:117 的 switch issue.AssigneeType.String 分 "agent"/"squad" 两支)。这就是「agents as teammates」在底层的样子。
3. 主线走一遍:一条 issue 如何变成一次运行
这是理解 Multica 的中央链路。把它走通,五个分章就都有了挂靠点。全程高层视角,不进代码——细节在 第 3 章 和 第 2 章。
怎么读下图: 从左到右是时间顺序;上半段在服务端,下半段在你机器上的 daemon;虚线是 WebSocket 推送。
[1] 把 issue 指派给某 agent(或改状态出 backlog)
│
▼
[2] 服务端问一句:这次写入会不会启动一次运行? ← WillEnqueueRun(唯一判定权威)
│ 会:产出 IssueRunTrigger 不会:静默停在 backlog
▼
[3] enqueue:写一行 task 到队列(status=queued) ← EnqueueTaskForIssueWithHandoff
│
▼
[4] 本地 daemon 轮询/被唤醒,认领这条 task ← ClaimTasksByRuntime(status→dispatched)
│
▼
[5] daemon 准备工作目录 → StartTask(status→running) ← 跑真实 agent CLI
│ ├─ 流式上报进度 / 消息 / 用量 ┄┄┄┄┄┄┄┄┄┐
▼ ▼ ┊
[6] CompleteTask / FailTask,结果回写 ┊ WebSocket 推送
│ ▼
└──────────────────────────────────────> 前端 cache 失效、看板实时刷新
三个关键节点的权威在哪
| 节点 | 谁说了算 | 依据 |
|---|---|---|
| ② 会不会启动运行 | IssueService.WillEnqueueRun |