Poltergeist:给原生应用一个 npm run dev,顺便复盘一次 Go 迁移
Poltergeist 是一个 AI 友好的通用文件监听器:识别项目,文件一变,立即重建。它的定位可以理解成“原生应用的 npm run dev”,自动配置、系统通知、智能构建队列都包含在内。
这个项目源于开发 Peekaboo 的实际摩擦。Peekaboo 是一个用 Swift 写的 macOS OS 自动化 agent/CLI/MCP,最突出的问题是编译时间:Swift 编译器不快,而 agent 又经常忘记在测试前重新 build,于是调试过程经常发生在早就修好的旧代码上。Poltergeist 的做法很简单:后台盯住文件,一旦有变化就先构建一遍。
最初它只是一个监视 Swift 文件的 bash 脚本。后来整个系统被重写成 TypeScript,目标是适配任意项目、任意语言、任意构建系统。类似 watchexec 的工具一直存在,但没有一个按 agentic engineering flow 设计。Poltergeist 会判断调用来自人类还是 agent,并给 agent 额外输出更友好的提示;如果构建目标是 macOS 应用,它还能自动退出旧进程并启动新版本。
为什么选 TypeScript
- agent 写 TypeScript 的完成度很高;
- 迭代速度快,编译几乎即时;
- 跨平台;
- Watchman 有现成的 TypeScript 绑定。
用 Claude Code 搭建与迭代
工具完全由 Claude Code 构建。起点是 bash 脚本,再让 agent 转成 TypeScript。开发流程大致是:
长 prompt,加 plan only,开 ultrathink;有时让它 give me a few options。每个功能收尾时,立刻要求 add tests + update docs。按功能补测试比最后统一补有效得多,功能上下文还热的时候写测试,最容易暴露 bug。GitHub 上的 CI 也尽量早加。
Poltergeist → Poltergohst:Go 重写实验
作者去问 Claude 关于语言选型的意见,得到的答案不在预期内。于是干脆让 Claude 用 Go 把整个项目重写一遍,持续了几个小时。
迁移过程中试过开源模型:Qwen 3 Coder、GLM 4.5,配合 OpenCode 和 Crush 跑,但 bug 太多,不推荐。Qwen 3 Coder 的 1M context 本来应该很合适,实际使用中 API 错误不断。
用 Claude Code 做大仓库迁移时,有一个绕开 256KB 上下文限制的实操方法:
先将所有重要文件(源码、测试,不含示例)合并成一个约 1.1MB 的 Markdown 文件,再粘进对话,附上命令 convert to Go。整个转换由 Opus 4.1 执行。
最终没有切到 Go,原因很实际:
- 对 Go 不够熟练。
- 留在 TypeScript 这边,Bun 的 SPA 模式启动约 44ms,也能打出适合 Homebrew 分发的单二进制,压缩后约 20MB。
- Watchman 的 TypeScript 绑定质量很高,但没有官方 Go 绑定;第三方 Go 绑定项目已经多年未维护,转 Go 意味着要自己维护更多代码。
安装与使用
# For modern macOS
brew tap steipete/tap
brew install poltergeist
# Windows, Linux, Intel Mac (Node 20+)
npm install -g @steipete/poltergeist
# Auto-detect and configure your project
poltergeist init
poltergeist haunt
# Run your tool (always fresh!)
polter my-cli --help
另有一个原生 macOS 菜单栏应用,源码可用,名字可能叫 Ghostbuster。