✉ AMail · 本机 Agent 任务调度台

和你电脑上的 Agent
通信的邮箱

把「N 个工作区 × M 个 Agent 会话」收敛为 一个派发口 + 一个收件箱
派任务 = 写信,做决策 = 回信;工作区由你指定,活派给哪个 Agent 也由你定。

痛点 1

N 个工作区 × 多个 Agent CLI

作为 FDE,一个人同时负责前端、后端、Skill 多个工作区;QoderCLI、CodeX、DeepSeek Harness 又各是一套终端会话。切目录、切窗口、切上下文,全靠人挪。

痛点 2

依赖任务:人肉等待 + 人肉搬运

B 依赖 A 的产出,就只能盯着 A 跑完,再把结论复制粘贴进 B 的会话重新派——人同时当轮询器和搬运工。

痛点 3

长链任务人肉编排

复杂任务超出单个 Agent 的上下文,得先拆解、再分阶段实现——每个阶段开会话、传上下文、盯进度,全是手动串接。

痛点 4

人被拴在电脑前

任务只能坐在工位上派;人一离开,Agent 干完了没人验收、想到新需求没处派——回到座位才发现一切都在等你。

所以我做了一个邮箱。往下滑,看四个场景。

系统心智模型

一个派发口 · N 个工作区 · 一个收件箱

✍️

一个派发口

指定工作区与执行 Agent
回车即寄出

webapp-frontendworktree 隔离
api-serverworktree 隔离
mobile-appworktree 隔离
📥

一个收件箱

只装必须由人裁决的事
清零 = 没有 Agent 在等你

每个任务在独立 git worktree 中执行,你的工作目录永远不被写;
执行、排队、验收、合入由系统完成,人只负责派任务、挑 Agent、做决策

Case 1 · 单任务连发针对痛点 1 · 工作区与 Agent 切换

想到就发,不等、不切目录

派任务 = 写一封信。连着给三个工作区各发一封,每封还能指定不同的执行 Agent——写完就走,Agent 们并行开工。

  1. 1写第一封信:给 webapp-frontend 派「暗色模式」任务,执行 Agent 选 qodercli,回车即寄出
  2. 2第二封给 api-server:502 排查这活更适合 DeepSeek Harness——哪个活配哪个 Agent,由人判断
  3. 3第三封是个纯问题,寄给内置「问答」收件人
  4. 4在途一行:三个任务、两种 Agent 并行执行,各自在独立 git worktree 里,你的工作目录一行都不会被改
  5. 5问答那封先回信——答案作为一封回信躺进收件箱,随时看
  6. ☰ 点击任意步骤,可从该步重播动画
AMail — 写信
✍️ 写信
📥 收件箱 0
🚀 在途 0
🗂 已归档
收件人(工作区)
webapp-frontend
api-server
mobile-app
问答
收件人 选择工作区…执行 Agent · 默认基线 main · 优先级 普通
⚙ 高级投递设置
在途 0
⏱ 几分钟后…
可信边界独立 worktree 执行 · 验收命令闸门 · 异常/不确定项进入收件箱 · 合入策略可配置
Case 2 · 依赖任务与交接针对痛点 2 · 人肉等待与搬运

B 依赖 A?发信时一起发完

给 B 声明「等 A 完成后开始」。A 合入的那一刻,B 自动启动——还自动带上 A 的交付摘要。

  1. 1先发 A:给 api-server 派「头像上传接口」
  2. 2紧接着发 B:给 webapp-frontend 派前端接入任务——展开高级投递设置,点开「依赖」,从在途任务里选中 A;两封一次发完,人去干别的
  3. 3在途视图:A 进行中,B 显示「等待 A」,系统替你盯着
  4. 4A 验收通过,squash 合入基线分支(一个任务一个干净 commit)
  5. 5交接时刻:A 的交付摘要(handoff)自动注入 B 的任务上下文,B 自动启动——零复制粘贴
  6. ☰ 点击任意步骤,可从该步重播动画
AMail — 写信
✍️ 写信
📥 收件箱 0
🚀 在途 0
🗂 已归档
收件人(工作区)
webapp-frontend
api-server
mobile-app
问答
收件人 选择工作区…执行 Agent · 默认基线 main · 优先级 普通
依赖 无 ▾
A · 头像上传接口(含裁剪)进行中
⚙ 高级投递设置
在途 0
⏱ 任务 A 执行中…
可信边界独立 worktree 执行 · 验收命令闸门 · 异常/不确定项进入收件箱 · 合入策略可配置
Case 3 · 连环信针对痛点 3 · 长链任务人肉编排

一句话目标,拆成整条链

复杂任务超出单个 Agent 的上下文?只写业务目标,Agent 拆成整链计划;人审一次计划,整条链跨工作区自动接力——拿不准的事,才回信问你。

  1. 1写一句业务目标,点「拆成连环信」——Agent 只调查不动代码,拆出整链计划
  2. 2审阅整链计划:3 个步骤横跨 3 个工作区,依赖关系一目了然;人只审这一次
  3. 3启动整链:步骤 1 开跑,后续步骤等依赖
  4. 4自动接力:每步验收通过自动合入,交付摘要自动流向下一步——跨工作区也一样
  5. 5步骤 3 中 Agent 拿不准文档放哪——变成一封等你回的信,点一个选项即回
  6. 6整链完成,收到汇总信;收件箱清零 = 没有 Agent 在等你
  7. ☰ 点击任意步骤,可从该步重播动画
AMail — 写信 · 拆成连环信
✍️ 写信
📥 收件箱 0
⛓ 连环信 0
🗂 已归档
收件人(工作区)
webapp-frontend
api-server
docs-site
业务目标 连环信规划模型 auto · 自动推进
⚙ 高级投递设置
Agent 正在调查三个仓库、拆解整链计划…(只调查,不改业务代码)
⛓ 整链计划 · 上线「导出报表」待审阅
1
后端:新增报表导出 API(CSV/XLSX)
api-server · 自动推进 · 验收 make test
待启动
2
前端:报表页加「导出」入口,对接新 API
webapp-frontend · 自动推进依赖 步骤 1
待启动
3
文档:补一篇「导出报表」使用说明
docs-site · 自动推进依赖 步骤 2
待启动
3 个步骤 · 跨 3 个工作区 · 全自动推进
收件箱清零 = 没有 Agent 在等你
⏱ 链自动接力中…
可信边界独立 worktree 执行 · 验收命令闸门 · 异常/不确定项进入收件箱 · 合入策略可配置
Case 4 · 远程派单针对痛点 4 · 人被拴在电脑前

人在外面,电脑照常交付

整套能力又封装成了 CLI,接给钉钉上的 Hermes 机器人——在手机上发消息就能给电脑派任务、收回信、做裁决。

  1. 1AMail CLI 封装成钉钉机器人 Hermes 的能力:一句话远程派任务——Hermes 转成 AMail 的一封信,电脑上的 Agent 开工,人合上电脑出门
  2. 2干完了,验收回信直接推到钉钉:验收命令结果 + 变更摘要
  3. 3回一句「合入」——在手机上完成裁决,电脑自动 squash 合入
  4. 4收件箱清零:人不在工位,交付照样闭环
  5. ☰ 点击任意步骤,可从该步重播动画
阿里钉 — Hermes Enterprise
H
Hermes Enterprise 机器人
阿里巴巴
😊@Aa✂️📁
请输入消息
⏱ …
可信边界指令白名单 + 本机 token 鉴权 · 执行仍在隔离 worktree · 合入仍过验收闸门
还有更多

这些能力都在同一只邮箱里

🔒 worktree 隔离 · 跑坏零污染 ✅ 验收命令闸门 · 只信退出码 🤖 无人值守自动合入 · 可选可配 🖥 macOS 菜单栏桌面端 · 通知直达回信 ⌨️ CLI 编排面 · --json 稳定输出
AMail 真实产品界面真实界面截图位:showcase/assets/real-ui.png(替换后自动显示)
'">

真实产品界面。

这 5 天我是怎么做出来的 → 技术报告
技术报告 · 一个人 + 一组 Agent

5 天,从空仓库到桌面端交付

Go 后端 + React 前端 + Tauri 桌面壳 + CLI 编排面,全程由 CLI coding agent 在工程约束下完成。

5
2026.08.20 01:07 → 08.24 01:33
268
commits(含 merge)
+118,453
新增行 · 11,826 删减行
141
凌晨提交(00:00–07:59,占 52.6%)
—— 夜间无人值守跑批的直接证据
统计口径:仓库 HEAD 的 git log --numstat 全量(由 gen-stats.sh 构建时实测生成)
Git 贡献统计

Git 仓库统计。单一贡献者,5 天累计十万行级变更。

提交历史

凌晨 1 点到 4 点的连续提交。来自睡前批量派发的 issue 流水线:每个 issue 在独立 worktree 里由 agent 执行,过验收闸门才 commit——我在睡觉,系统在交付。

这是个什么东西

AMail:本机 Agent 任务调度台

把多工作区的 CLI coding agent 任务从「会话式交互」变成邮箱式工作流:写信派发 → 系统调度执行 → 收件箱回信裁决 → squash 合入。纯本地单机,只监听 127.0.0.1。

✍️ 写信派发

Web UI / 桌面壳
/ CLI 三入口

⚙️ Go 单进程服务

调度器 · SQLite
WS 事件流

🌿 git worktree × N

每任务独立隔离
用户目录零污染

🤖 CLI coding agent

ACP 协议桥接
模型动态枚举

📥 收件箱

询问/验收/异常
人只做决策

✅ squash 合入

merge-tree 预检
一任务一干净 commit

单二进制交付:前端构建产物 go:embed 进后端,SQLite 纯 Go 驱动(CGO-free)。

报告核心 · 我真正想展示的

十万行不是「让 AI 随便生成」的,
是在四条工程约束下长出来的

数字容易引来「是不是 AI 批量灌的水」的追问——所以重点不是产量,是让几百次无人值守执行不跑偏的约束体系。

1

契约先行,Agent 不可越权改产品定义

PRD 与架构文档是唯一契约,对 agent 只读;枚举值必须与契约逐字一致。发现契约缺口时,agent 只能按字面实现并登记偏差,由人裁决——产品定义的修改权永远在人手里。

2

Issue → worktree → 验收闸门 → commit 的无人值守流水线

需求拆成 42 个 ISSUE 文档,脚本为每个 issue 开独立 git worktree 并行调 CLI agent;每步必须通过客观验收命令(测试/lint,只信退出码),失败自动带输出重试,通过才允许 commit。

ISSUE-0xx.mdgit worktreeagent 执行make test ✓commit
3

TDD 约束,而不是让 Agent 改测试来「做绿」

后端一律先写失败测试再实现,且明令禁止为了变绿删改测试断言语义;外部依赖全部用 fake,测试不访问网络、不依赖真实 agent。结果:后端测试代码比产品代码还多 31%

4

真实 Dogfooding:用 AMail 开发 AMail

项目中后期,新 issue 直接用 AMail 派给 AMail 自己:睡前把任务写成信(带依赖关系)批量寄出,无人值守跑一夜,早上在收件箱验收合入。上面那张凌晨提交截图,就是这套流程的产物。

5 天时间线 · 每日提交数
数据来自 git log 按日聚合(49 / 130 / 18 / 58 / 13
49
130
18
58
13
Day 1 · 08.20契约与骨架:PRD、架构文档、流水线脚手架
Day 2 · 08.21主体冲刺:调度器、执行桥接、流水线、收件箱
Day 3 · 08.22签收条件与无人值守自动合入
Day 4 · 08.23连环信 V2、多依赖 DAG、桌面壳
Day 5 · 08.24收尾治理:夜间巡检修缺陷、文档收编
交互带宽

需求是「说」出来的,不是敲出来的

派任务 = 把意图描述清楚。打字要经过一层额外的大脑编码——又慢,还会丢细节;语音是把想法直接倒出来,信息保真度更高。这 5 天里给 Agent 的需求描述与问题反馈,绝大多数是按住快捷键口述成文的——写信派发的邮箱范式和语音输入天然契合:一段话就是一封信。

36,258
总输入字数(语音成文)
3.0小时
累计口述时长
203字/分
输入速度(约为打字的 3–5 倍)
4.6小时
输入侧节省的时间
为什么这也算技术能力:人→Agent 的信息带宽决定了派单质量。描述得越完整,Agent 返工越少——输入侧省下的 4.6 小时之外,更大的收益是避免了因描述缩水带来的返工循环。
语音输入用量统计

语音输入用量统计。按住快捷键随时口述,到哪输入都按当前场景优化——写信框里的任务描述、收件箱里的回信意见,都是说出来的。

代码构成

现存代码分布(按 git 追踪文件实测)

后端产品代码(Go)
22,767
后端测试代码(Go)
29,762
前端产品代码(TS/React)
12,307
前端测试代码(TS)
6,509
桌面端(Tauri/Rust/脚本)
4,268

测试代码 > 产品代码。后端 29,762 行测试对 22,767 行产品代码——这不是 AI 生成代码的常见形状,是 TDD 闸门强制出来的形状。

技术栈

三端一体,单二进制交付

⚙️后端

  • Go 单进程服务,goroutine 调度器 + 全局并发闸
  • SQLite(纯 Go 驱动,CGO-free)
  • git worktree 隔离执行 + merge-tree 合入预检
  • ACP 协议桥接 CLI coding agent,模型动态枚举
  • WebSocket 事件流增量推送
  • 前端产物 go:embed,单二进制交付

🖼前端

  • React 18 + TypeScript,Vite 构建
  • TanStack Query 服务端状态 + Zustand 本地状态
  • 手写 CSS,无组件库——产品质感自己控制
  • 邮箱范式 UI:任务七态投影为邮件文件夹
  • WS 实时投影,收件箱/在途/连环信同屏

🖥桌面端

  • Tauri v2 macOS 菜单栏常驻壳
  • Go 引擎以 sidecar 进程托管、崩溃监督
  • 系统通知 + amail:// 深链直达回信
  • 全局快捷键 ⌥⌘M 随时写信
  • 纯浏览器模式完整可用,桌面壳是可选增强
架构取舍

我刻意没有做什么

不把 Agent 当作拥有生产权限的黑盒。一切执行都发生在可丢弃的隔离 worktree 里,合入前有客观验收与冲突预检闸门,跑坏了丢弃即可。

不用共享工作目录并发修改代码。每个任务一个 worktree,用户的工作目录与未提交改动全程不被触碰,多任务天然并行。

不要求人一直盯着终端轮询。需要人的事都会变成一封等回的信;收件箱清零即自由——人是决策者,不是轮询器。

「工具是我做的,工具也是我用的。
这份 demo 想展示的不是某个功能,
而是一个人 + 一组 Agent 的工程组织方式。」

← 回到产品演示