Personal Workbench · 个人工作台

把每天涌进来的杂乱信息,变成可检索、可行动的结构化资产

一套跑在 Claude Code 上的个人工作操作系统。存储是纯 markdown + git,没有数据库、没有服务、没有账号。 手机上随手丢进 Discord 的一条链接、一份 PPT、一句待办,会被自动抽取、判类、套模板, 最后以一个 pull request 的形式落进仓库等我 review。

存储 markdown + git 运行时 Claude Code 入口 Discord REST 轮询桥 规则 / 检查 7 条 / 6 个 起始 2026-07-27
01

它解决什么

PROBLEM
痛点这里的做法
任务杂而多,散落在微信、邮件、脑子里 所有行动项汇聚到 tasks/TASKS.md 这一个台账,格式由脚本强制校验,ID 唯一
每天的资料格式五花八门:网页、Word、PPT、PDF、录音 scripts/intake/extract.py 统一抽成纯文本,再交给 wb-intake 消化
存了等于没存,三个月后回头找不到 强制模板 + YAML frontmatter,机器校验,按 PARA 归档,索引自动生成
手机上看到有用的东西,回到电脑就忘了 Discord #inbox 频道随手丢,桥接服务轮询取回,Claude 自动消化并开 PR
02

管道:从随手一丢,到一个可 review 的 diff

PIPELINE

三个入口汇到同一条管道。中间只有一步 —— wb-intake 技能负责抽取、判类、套模板 —— 产物分流到四个去处。每一次消化的终点都是一个 pull request,而不是直接写进主干: 人工闸门是这套系统里唯一不可省略的一环。

入口 / INTAKE 消化 / DIGEST 产物 / OUTPUT Discord #inbox 手机随手丢 · REST 轮询取回 本地 inbox/pending/ 拖文件进目录即可 会话里直接说 Claude Code 对话中投喂 wb-intake 抽取 → 判类 → 套模板 extract.py + 强制 frontmatter daily/2026-07-28.md 每日日志 resources/<area>/xxx.md 资料卡 · 按主题归档 projects/xxx/… 项目文档 tasks/TASKS.md 行动项 · 单一台账 Pull request · 人工闸门 Rule 6:Claude 不合并自己的 PR 6 个检查脚本在 CI 上把关: frontmatter · 台账 · 归档 · 密钥 · 收件箱 · 规则覆盖
FIG. 1 — 三个入口 → 一步消化 → 四类产物 → 一个 PR。所有写入都经过 diff,没有任何一条路径能绕过人工 review。
03

为什么规则必须配一个检查脚本

GOVERNANCE

这个系统每天真正的写入者是 Claude,不是我。写进 CONTRIBUTING.md 的规则, 如果只是一段自然语言的叮嘱,几十轮会话之后一定会被稀释。所以有一条元规则: 每条规则都必须有一个能自动跑的检查(Rule 2),并且有一个检查专门验证这件事本身 —— all_rules_have_checks.py 会扫描规则列表,任何一条没有对应检查的规则都会让 CI 变红。

  • Rule 1 落库文档必须有合法 frontmatter —— frontmatter_valid.py
  • Rule 2 每条规则都必须有检查 —— all_rules_have_checks.py
  • Rule 3 任务台账格式合法且 ID 唯一 —— tasks_ledger_valid.py
  • Rule 4 收件箱原料永不进 git —— inbox_not_committed.py
  • Rule 5 密钥不进仓库 —— no_secrets.py
  • Rule 6 Claude 不合并自己的 PR —— 人工闸门,由 PR 流程本身保证
  • Rule 7 文档按主题归档,索引保持最新 —— docs_are_filed.py

一条命令 python3 scripts/run_checks.py 跑完全部检查。绿了,说明骨架完整。

04

三条决定形态的架构决策

ADR

一个决策值得写进 design/ 的判断标准只有一条:将来的我会问"当时为什么这么定", 而答案不在代码里。

ADR-0001用 Discord 做投喂入口,不自建 bot

单人使用、没有运维预算、坏了只能自己修。选 Discord 而不是 Telegram / iMessage, 是因为需要多频道分流(#inbox / #tasks / #daily / #refs), 以及将来加多个机器人各司其职的空间。飞书 / 企业微信在国内网络和 Office 预览上确实更贴合, 但第一天就要自己维护一座桥,违背"先跑通再加复杂度"。

ADR-0002存储用 markdown + git,不用数据库或 Notion

真正的约束不是功能,而是"写入者是 agent"。markdown + git 让每一次改动都是一个 diff —— 这是人工闸门能成立的前提。全文检索就是 grep,没有依赖、没有服务、没有账号, 十年后 cat 还能读。代价是复杂查询要写脚本,以及文件数长到几千时得再加索引。

ADR-0003用自建 REST 轮询桥取代官方 channels 插件

官方插件配置全部做完后 bot 始终不回消息。排查下来是它走 Discord gateway(WebSocket), 而这台机器上 WebSocket 走不通:DNS 被污染到一个 Facebook 段的 IP,修了 DNS 之后 IP + SNI 层同样被挡。 逐条实测七种写法后结论很干净 —— 卡住的只有 WebSocket,REST 完全正常。 于是改成零依赖 Python 定时轮询 Discord REST API,urllib 原生读 https_proxy

方法论

这次排查的判据不是"连上了",而是 Discord 网关握手后必发的 HELLO(op:10) 帧。 只看"连上了"会得到假阳性 —— 三个进程都卡在 SYN_SENT 却看起来像在运行。 选一个不会骗人的判据,是这类网络问题里唯一省时间的做法。

05

让它自己活着

RUNTIME
  • launchd 常驻 —— 轮询桥注册成 macOS launchd 服务,开机自启,崩溃自拉起。踩过的坑:ProgramArguments 必须写解释器的真身路径,不能写 /usr/bin/python3 那个 shim,否则 TCC 权限判定会挂在错误的二进制上。
  • 进程锁 —— 早期两个轮询实例同时跑,互相覆盖水位线,导致消息重复或漏掉。现在用文件锁保证同一时刻只有一个消费者。
  • 权限失败不再静默 —— TCC 拒绝时以前只是悄悄什么都不做,现在会明确报错,因为"看起来在跑但其实没跑"是最贵的一种故障。
  • 附件真实验证 —— Discord 附件路径在跑通一份 DAS 产业报告和 26 张竞赛截图之后才算数,不以"代码看起来对"为准。
06

血统

LINEAGE

治理机制(规则必须有检查、agent-loop / agent-verify 契约、保持 CLAUDE.md 简短) 提炼自此前的 DASGPT 项目与自建的 claude-project-toolkit; "收件箱 → PR"这个管道形态借鉴 DASGPT 的 Reference Scout。 也就是说,这不是从零设计的一套流程,而是把两个真实项目里已经被验证过的做法, 收敛成一个单人可维护的最小骨架。

Repo personal-workbench(私有) Skills wb-intake / wb-daily / wb-task / wb-brief / wb-loop / wb-verify Checks python3 scripts/run_checks.py → OK: 6 check(s) passed Rev 2026-07-28