【免费下载链接】treehouseManage worktrees without managing worktrees.项目地址https://gitcode.com/gh_mirrors/treehou/treehouse点击查看免费下载treehouse 是一款面向 AI 编码代理的 Git worktree 池管理工具它用零守护进程 无状态 CLI的架构让你一条命令就能获得隔离、可复用的工作目录环境。本文将从安全优先与无状态设计两个角度讲清楚它为什么坚决不做后台常驻服务。 treehouse 是什么先弄懂worktree 池如果你用过git worktree大概知道痛点每个代理会话都要新建 worktree、重新装依赖、重建缓存慢得心疼。treehouse 把一堆 worktree 组成一个池pool代理来了从池里领一个干净环境秒进干完活退出子 shell环境自动清理、归还留给下一个代理复用全程treehouse一条命令进入、exit返回不需要你手动管理 worktree。官方定位一句话就是Manage worktrees without managing worktrees.为什么不用守护进程无守护 CLI 设计的 3 个理由很多工具喜欢做一个常驻后台服务来记住状态。treehouse 的设计文档里写得很直白No daemon — all operations are inline CLI commands.无守护进程 —— 所有操作都是内联 CLI 命令。这条不变式记录在 docs/design.md 的开头是项目的核心原则。背后的理由可以拆成三层1. 没有总在跑的东西就没有可攻击的运行时守护进程意味着一个长期存活的进程它占内存、持有状态、可能监听端口出问题时要查它的日志和崩溃转储。而 treehouse 的每个命令get、status、prune…执行完就退出不留下任何后台实体。跨 macOS / Linux / Windows 三平台时也完全省掉了服务怎么装、怎么开机自启的烦恼。2. 状态不在内存里就不会被悄悄改坏守护进程的状态通常只存在于进程内存中进程一死状态就丢或者进程升级后新旧状态打架。treehouse 把池状态放在磁盘上一个小小的状态文件treehouse-state.json里——状态即文件文件即事实。你随时可以用cat看它也随时可以用treehouse status看它。3. 愿景层面的明确拒绝项目的 VISION.md 甚至把拒绝守护进程写成了评审标准当一项变更会……使 daemon 或托管服务成为必需、用安全性换取便利性时应该被抵制。也就是说这不是暂时没做而是永远不该做。没有进程状态放哪——一个小状态文件 文件锁无守护设计的关键问题是并发安全谁来保证答案在 internal/pool/state.go文件锁串行化所有命令读写状态前先通过WithStateLock拿到池目录下的锁文件。Unix 平台用flock排他锁见 internal/pool/lock_unix.goWindows 有对应实现internal/pool/lock_windows.go。同一时刻只有一个命令能改状态等效于守护进程内部互斥但零常驻成本。原子写入状态文件永远走写临时文件 → fsync → 原子替换的路径WriteState/atomicWriteFile。写一半崩溃也不可能留下半截文件崩溃只会让你看到新的完整文件或旧的完整文件没有第三种情况。崩溃了怎么办无状态设计的自恢复兜底无守护工具最怕意外死机后世界变脏。treehouse 的做法是fail closed保守失败如果状态文件损坏、被截断或丢失命令不会直接报错罢工而是扫描池目录里真实存在于磁盘上的 worktree把每一条恢复成leased已租出并隔离附上一条人话提示recovered: state file was corrupt or truncated; verify before reuse隔离意味着get不会再把它发出去prune不会删它只有你检查确认后、用精确路径加--include-leased --yes才能移除。在状态不明时宁可不用也绝不冒进——这正是安全优先哲学的落地细节。 安全优先无守护 无状态带来的 4 重保护这套设计不是白付成本的它换来了实打实的安全性保护层具体机制无运行时攻击面无常驻进程、不监听端口、不持有长期凭证仓库配置不可执行仓库级treehouse.toml中的 hooks 一律被忽略——在不受信任的 clone 里运行 treehouse不可能自动执行仓库里藏着的 shell 脚本只有用户级配置可定义生命周期 hooks状态防伪种子文件清单用 HMAC 摘要写入状态文件worktree 里的文件被篡改无法绕过校验验证失败即隔离删除永远双确认prune/destroy默认 dry-run每类风险未合并、使用中、已租出各需独立 opt-in 标志旧版一刀切的--force已被彻底移除简单说攻击者拿到的最多是一个文件而不是一个活着的进程。权衡时刻这种设计的代价是什么公允地讲无守护也有取舍理解它才能选对工具每次命令都要现查进程表判断 worktree 是否占用中靠实时扫描系统进程internal/process/detect.go而不是问守护进程要缓存。换来的是永远所见即真代价是多一点 CPU 开销。没有内存态智能池的聪明全靠文件 锁 磁盘扫描重建逻辑复杂度更高状态文件要带版本号、键文件、HMAC但换来的是可移植、可审计、可崩溃恢复。它不是沙箱VISION.md 明确 treehouse 隔离的是工作目录和生命周期归属不替代系统级安全边界。总结一个可以照搬的设计哲学treehouse 给出的答案很克制但值得所有 CLI 工具借鉴能用文件表达的不用进程守护——状态落盘、原子写入、锁串行化三件套解决 90% 的并发问题不确定时 fail closed——恢复出来的东西一律隔离宁可你手动确认也不替你猜把安全边界划在用户信任域——仓库能影响行为但不能影响执行拒绝的范围写进愿景——不做守护进程不是 TODO 清单上的一行而是验收标准。如果你也在设计面向开发者的本地工具或许可以问自己一句我的功能真的需要一个活着的进程吗如果没有那一份小而完整的设计文档可能就是你最好的架构决策。延伸阅读docs/design.md设计不变式全集· internal/pool/state.go状态文件与恢复逻辑· VISION.md范围与评审标准赞分享【免费下载链接】treehouseManage worktrees without managing worktrees.项目地址https://gitcode.com/gh_mirrors/treehou/treehouse点击查看免费下载相关推荐GitHub CLI 设计解析为什么 gh 没有构建在 hub 之上——官方 CLI 与 git 代理工具的取舍GitHub CLI 设计解析为什么 gh 没有构建在 hub 之上——官方 CLI 与 git 代理工具的取舍 本文以 docs/gh vs hub.mdCLI开发工具Apache Beam 为什么没有 PCollection.map()——从 FlumeJava 历史到 PTransform 设计哲学Apache Beam 为什么没有 PCollection.map ——从 FlumeJava 历史到 PTransform 设计哲学 导读 本文基于 ApSuperDesign与现有设计工具对比为什么选择AI驱动的设计代理SuperDesign与现有设计工具对比为什么选择AI驱动的设计代理 在当今快速发展的设计领域SuperDesign作为首个开源的AI设计代理正在彻底改变人工智能AI 应用AI Agent前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考