LegalAVA · 副产品
Vibe side project · Herdr plugin + E-Ink

herdr2dotvibe 副产品

一个 Herdr 插件:后台的 coding agent 一跑完,桌上那块 Quote/0 墨水屏就换成一张小卡片——哪个任务、哪个 agent、还有谁在跑。不用切回终端,不用看通知中心;抬眼一扫,知道该回去接手谁。和上面的法律 agent 产品线没有关系,是同一套「agent 驱动开发」顺手做出来的第三件东西。

它长什么样

屏幕上就是这一张卡:标题固定,第一行任务名,第二行 agent 与工作区,最后一行「还有谁在跑」,右下角时间。

MindReset Quote/0 墨水屏设备渲染图
Herdr · Agent 已完成
修复日历透明问题Claude · daily-notes进行中:合同审查、产品页
2026-08-27 12:18
设备渲染图来自 MindReset 官网,屏幕内容为本插件推送示意

Quote/0:2.66 英寸墨水屏,296 × 152 像素,磁吸,一次充电最长一年。它没有背光、不会亮起、不会响——正是这一点让它适合做「完成」这种不需要立刻处理、但想被看见的信号。

herdragent list
w1 · daily-notes
w1:p1修复日历透明问题done
w1:p2产品页working
w2 · legal
w2:p1合同审查working
w2:p3codexidle
event pane.agent_status_changed → agent_status=done · pane_id=w1:p1 · seq=1503
Herdr 看到的Herdr 认得每个 pane 里跑的是哪种 agent、处于 idle / working / blocked / done 哪个状态;状态一变就发事件,插件只订阅这一种。
POST/api/authV2/open/device/…/text
{ "refreshNow": true, "taskKey": "…", "taskAlias": "Herdr Agent", "title": "Herdr · Agent 已完成", "message": "修复日历透明问题\n Claude · daily-notes\n 进行中:合同审查、产品页", "signature": "2026-08-27 12:18" }
200 {"message":"设备 … 文本 API 内容已切换。"}
插件发出的Dot 的 Text API 只收标题、正文、落款三样。插件把任务名、agent、工作区和「进行中」拼成正文,refreshNow 让屏幕立刻翻页。

设计理念

同时开着四五个 agent 的时候,真正的成本不是等待,而是「不知道该看哪一个」。这块屏的任务只有一个:把注意力领回正确的那个窗口。

只订阅一种事件Herdr 会发很多事件;插件只登记 pane.agent_status_changed,且只处理 done。working、blocked、idle 都不推——屏幕上永远只有「你可以回去了」这一种消息。
一屏只放一件事296 × 152 像素放不下列表,也不该放。最新完成的那个任务占整屏;「进行中:…」压成一行,最多三个名字,多了写「等 N 个」。
让 Herdr 回答问题,插件不猜任务叫什么、跑的是哪个 agent、在哪个工作区、还有谁在忙——全部回头问 herdr agent get / list / workspace get。插件不维护任何自己的世界模型。
标题是「泛」的就换一个终端标题只写着 claudeπ - 之类的时候,没有信息量;插件退一步用工作区名,再退一步用目录名,最后才是「后台任务」。
按状态序号去重同一个 pane 的同一次完成,Herdr 可能触发不止一次。用它的 state_change_seq 做键,文件锁 + 原子写记下「上一次推的是哪一序号」,同一序号只推一次。
密钥不进配置Dot 的 API key 优先从 macOS 钥匙串读;配置文件只放设备号与任务键,权限 600。插件目录本身不含任何凭据。
设备睡着也没关系Quote/0 靠电池、会休眠;接口会告诉你「已保存,醒来时显示」。插件不重试、不轮询——完成这件事本来就不急,醒来看见就好。
失败就写日志,不要弹窗推送失败只记一行日志、返回非零退出码,交给 herdr plugin log 查。这是一条通知链路的末端,它自己不该再产生通知。
一个文件,零依赖清单是 5 行 TOML,逻辑是 400 行 Python,只用标准库。HERDR_DOT_DRY_RUN=1 就能把 payload 打印出来而不真的推。

怎么工作

从 agent 停下到屏幕翻页,中间经过四站,通常一两秒。

Herdr识别 pane 里的 agent状态机 → 事件
环境变量
传 JSON
notifier.py只认 done · 按 seq 去重回问 Herdr 补齐上下文
HTTPS
Bearer
Dot Text APItitle / message / signaturerefreshNow
Wi-Fi
Quote/0墨水屏翻页休眠则醒来再显示
遇到什么怎么做
状态变成 done问 Herdr 要 agent 详情、工作区名、其他 working 会话,拼卡片,推送
状态变成别的直接退出,什么都不做
同一序号再来一次记为重复,忽略
终端标题没信息量依次退到工作区名 → 目录名 → 「后台任务」
没有其他会话在跑末行写「进行中:无」——这本身是个好消息
设备休眠 / 离线接口保存内容,设备醒来时显示;插件视为成功
推送失败写日志、退出码 1;不重试,不弹窗

同一块屏还接着另一个小脚本:定时把 Codex 的额度用量(5 小时 / 7 天窗口、剩余百分比、重置时间)推成一张卡。两个推送源共用一台设备,Dot 端按任务轮播。

为什么叫 vibe 副产品

起因是一个具体的不便:在 Herdr 里同时开着几个 agent 做不同的事——写产品页、审合同、改 App——每一个都要跑几分钟。人在这几分钟里会去做别的,回来时得挨个窗口看谁完成了。桌上正好有一块 Quote/0,它有开放的 Text API;Herdr 正好在 0.8 加了插件事件。把两头接起来,就是这个插件。人说的只有一句话:agent 跑完,让墨水屏告诉我是哪一个。

这三个副产品放在一起看,共同点很明显:每一个都只做一件事,状态少到可以写在一行里,边界清楚到 agent 可以放心改。DailyNotes 的状态是一张日记的 ETag,flomo2obsidian 的状态是一个游标,herdr2dot 的状态是「上一次推的序号」。这和 LegalAVA 做法律工具的方法是同一个:先把边界与流向讲清楚,再谈自动化。

技术与状态

插件Herdr 插件(herdr-plugin.toml + notifier.py),要求 Herdr ≥ 0.8.2,macOS。Python 3 标准库,无第三方依赖。
设备MindReset Quote/0 墨水屏,Text API(title / message / signature / refreshNow),限速 10 次/秒。同一设备另接 Codex 额度卡。
边界只推 done;不推 blocked(那种需要人立刻处理的状态,留给终端自己的提示)。不回写 Herdr,不控制设备其他内容。
状态个人自用中,每天在真实工作里跑。不分发;姊妹项目见 DailyNotesflomo2obsidian