Sandcastle 解剖:软件工厂是 if/for 写的——权限弹窗、YOLO 模式与 226 行编排代码
Matt Pocock——Total TypeScript 的作者,TS 教育圈最有影响力的那批人之一——这半年一直在琢磨一件事:让编码智能体完全无人值守地跑,还要好几个同时跑。卡住他的是每个用过 coding agent 的人都认识的两难:开着权限确认,agent 每装一个包、每改一个文件都要弹窗问你,人就被钉在键盘上;关掉确认上 YOLO 模式,agent 是自由了,它要是在你主目录里 rm -rf 呢?现成的沙箱方案他不满意,于是自己写了一个,开源,叫 Sandcastle,TypeScript,MIT,写稿当刻 8,355 star。npm 包名暴露了身份:@ai-hero/sandcastle——AI Hero 是他的付费教育站,这个库相当于把课程里的工程实践开源了出来。
先说它怎么解那个两难,因为答案比想象中简单粗暴:YOLO 照开。Sandcastle 驱动 agent 无人值守运行时,默认就传 Claude Code 的 --dangerously-skip-permissions——就是你怕的那个旗标。变化在执行环境:agent 被扔进 Docker 容器,代码经 git worktree 和 bind mount 进出,改坏了分支一扔,宿主毫发无伤。这里有个值得较真的分级:内置三个沙箱 provider,Docker 和 Podman 是 bind-mount 型——容器和宿主共享内核,防的是「乱改文件」不是安全边界级攻击;Vercel provider 走 Firecracker microVM,那才是硬件级隔离;甚至还有个 noSandbox 供你显式裸奔。想细调还可以把 permissionMode 从全跳改成 auto——让另一个 AI 逐工具审批。这最后一招值得单独记一笔:审批带宽不足时,有人选择加人(弹窗),有人选择拆审批(YOLO),Sandcastle 给出第三条路——把审批外包给另一个模型。审批的可拆性由爆炸半径决定,爆炸半径用容器压到零,审批就可以拆到只剩 review 代码这一道。
真正的看点在编排层。视频里那段「规划代理挑工单、每个工单开沙箱、审查、合并」听起来像一套多智能体系统,而它的全部实现是 226 行你能一口气读完的 TypeScript:一个 for 循环包着三个阶段。规划阶段,一个 opus 模型读开放 issue、建依赖图、吐出一段 <plan> JSON,用 Zod 校验,不合格就报错——开了重试就复用同一会话喂回错误描述让它改,不重做活。执行阶段,Promise.allSettled 把每个 issue 的管道并发跑起来:每个 issue 一个容器,implementer 先上(sonnet,上限一百轮),产出了 commit 才叫 reviewer 进同一个容器看一眼。合并阶段,一个 merger agent 拿着分支清单处理冲突、合回主分支。一个工单失败不连坐其他工单,没有任何 agent 产出就跳过本轮。就这些——没有编排智能体,没有 agent 之间的对话协商,「一座座小型软件工厂」的流水线是 if、for 和 Promise 写的,模型只在四个岗位上工:挑活、干活、验活、合活。连模型都用得有梯度:规划用 opus,其余用 sonnet,注释里写明「依赖分析需要更深推理」。
这个设计的谱系位置很清楚。我的老读者知道我反复写「编排税」:编排智能只在静态方案失败处回本,健康的流水线里编排就是开销。Sandcastle 是这条判断的正面标本——它证明多智能体协作里真正需要智能的环节(拆解依赖、实现、审查)和真正需要确定性的环节(并发、重试、合并、超时)可以干净地分开,前者交给模型,后者写进代码。素材说「流程全是你自己的代码,想换 Codex、想走 PR 都行」,核对属实:agent 侧有六个内置 provider(Claude Code、Codex、Cursor、OpenCode、Copilot、Pi),分支策略三种,落显式分支的就能推去开 PR。所有流程逻辑躺在你的 .sandcastle/main.mts 里,不满意随手改。
海关几句。视频文案与时间轴逐条对仓库,全对,无膨胀——「同一个 run 函数」「打了标签的 issue」「Docker 沙箱」「审查」「合并代理」逐项坐实。三处精确口径要补:一,「并行」有前置条件——仓库 ADR 0018 写明 fork 只隔离会话不隔离分支,并发跑必须给每个子任务显式分支,默认策略下并发会共享工作目录、git merge 会竞态;二,默认无人值守旗标就是 dangerously-skip-permissions,怕的「删主目录」防的是误伤不是攻击,bind-mount 沙箱别当安全边界用;三,「用 GitHub 标签派活」里标签只是工单池的入口,真正挑活的是 planner 模型,issue tracker 还可换 Beads 或自定义。工程纪律的侧面证据:20 篇 ADR,从 worktree 锁到 Windows 挂载到挂起进程的超时宽限,全是踩坑后的规则化。还有个细思恐极的安全细节:issue 标题这种用户输入会被模板引擎塞进提示词,Sandcastle 把 !command`` 展开限制在提示词文件本身,外部传入的一律当惰性文本——提示词注入这道门,在模板引擎层就焊死了。
结尾停在它的谦虚处。Sandcastle 不许诺「agent 替你写完了整个项目」,它许诺的是结构:一轮规划最多十个工单,跑完合回,再规划,最多十轮。人在循环里的位置从「批准每个动作」退到「开 issue、看 PR」——这大概就是当下无人值守的诚实刻度:自动化的是手,待办的是判断。
讨论回复
加载中...正在加载回复...
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。