Sim 托管 CLI 注册表完全指南:如何为 Function Sandbox 安全地新增一个不可变 CLI

发布时间:2026/9/10 6:01:34

Sim 托管 CLI 注册表完全指南:如何为 Function Sandbox 安全地新增一个不可变 CLI Sim 托管 CLI 注册表完全指南如何为 Function Sandbox 安全地新增一个不可变 CLI【免费下载链接】simSim is the collaborative workspace to build, deploy, and monitor AI agents and workflows. Used by 100,000 builders.项目地址: https://gitcode.com/GitHub_Trending/sim16/sim本文是一份面向 Sim 仓库贡献者的实战技术指南围绕.agents/skills/add-managed-cli/SKILL.md中的工作流程展开完整讲解如何为 Sim 的 Function Sandbox 添加或升级一个精选curated、不可变的托管 CLI——从上游版本核验、不可变 ID 设计、客户端安全元数据与服务器端安装配方编写到供应链测试与真实沙箱冒烟验证。读完本文你将掌握 Sim 托管 CLI 注册表apps/sim/lib/execution/remote-sandbox/cli-tools.ts与cli-tools.server.ts的完整实现原理并能在不触碰 UI、API、数据库、解析器与云厂商provider代码的前提下独立完成一次合规的 CLI 接入。为什么需要一个托管 CLI注册表Sim 的 Function Sandbox 允许工作区在沙箱里安装一组预置的命令行工具例如gcloud、aws、kubectl、terraform、duckdb等供 Agent 与工作流在沙箱环境中直接调用。但这些 CLI 并非通过任意命令或包名安装而是必须经过一个精选注册表curated registry系统级 Debian/APT 包已经覆盖了经过验证的 Debian/APT 坐标场景托管 CLI 则要求不可变产物immutable artifacts与可复现配方reproducible recipes。注册表的核心原则是持久化的是 ID而不是任意的安装命令。apps/sim/lib/execution/remote-sandbox/cli-tools.ts开头的注释明确写道Stable identifiers for the curated CLI tools a workspace sandbox may install. The persisted value is an id, never an arbitrary install command.也就是说用户侧客户端只接触安全的目录元数据服务器侧server-only才持有下载、校验、安装与验证的完整配方二者通过导入边界严格隔离。截至当前仓库注册表共收录24 个托管 CLI见 cli-tools.ts 中的SANDBOX_CLI_TOOL_IDS分为 6 个类别Cloud、Kubernetes、Infrastructure、Deployment、Data storage、Security。每个沙箱最多可选10 个CLIMAX_SANDBOX_CLI_TOOLS 10在 HTTP 边界与领域边界双重强制。动手前必读五个活体源码SKILL.md 强调编辑之前先读这些活体源码不要把技能文档里的当前条目复制进去条目会随版本演进而变化。这五个文件是理解注册表工作的钥匙文件作用cli-tools.ts持久化 ID 与客户端安全元数据catalogcli-tools.server.ts仅服务器端配方recipe与配方辅助函数cli-tools.test.ts目录与供应链不变量测试cli-tools-boundary.test.ts客户端/服务器导入边界测试sandbox-spec.ts内容寻址哈希content-addressed hash的输入另外两点约束resolve.ts与e2b.ts只在改动供给机制provisioning mechanics时才需要阅读。一次常规的目录新增不需要修改 UI、API、数据库、解析器或 provider 代码——这些路径都会从注册表自动派生。常规托管 CLI 新增不得修改专用的 Function 基础镜像也不得修改独立的 Mothership Shell 模板——托管配方只是叠加在 Function 基础镜像之上的一层。MAX_SANDBOX_CLI_TOOLS10除非用户另行提出产品级限制变更否则不要改动。第 1 步核验上游发布版本在写任何代码之前必须通过上游官方发布文档与官方产物确认以下全部信息精确版本与稳定的 Linux x86-64 产物 URL。严禁使用latest、可变重定向或无版本号的安装器该精确产物的SHA-256。优先使用发布方签名的校验和否则自行下载官方产物并独立计算归档archive布局与需要安装的精确可执行文件路径针对每一个对外公布的可执行文件的非交互、免凭据验证命令通常是版本命令/opt/sim-cli下所需的 PATH 条目E2B 与 Daytona 兼容性。只有在同一个 Linux 配方对两者都成立时才默认同时支持两者。当用户未指定版本时应从主要上游来源选择当前稳定版本并明确声明所选的确切版本不得静默选择预发布版prerelease或从不经核实的二手来源推断版本。明确的拒绝清单curl 管道到 shell 的安装器curl-to-shell installers、npm install、pip install、发行版软件包仓库、任意用户命令、非官方镜像产物一律拒绝。并且绝不允许在镜像配方或构建日志中放置凭据、令牌、登录命令或账户配置——认证只允许发生在运行时runtime-only。第 2 步选择不可变 IDID 格式为toolupstream-version-rrecipe-revision例如kubectl1.36.3-r1、aws-cli2.36.15-r1。规则要点新上游版本追加一个以-r1结尾的新 ID同一上游版本的纯配方变更追加-r2、-r3……依次递增绝不修改或删除已有 ID 或配方。已持久化的沙箱必须能继续解析到当初选定的字节与行为升级时保留旧 ID 与旧配方并将其元数据设为selectable: false只有最新版本保留公开标签可选。在首次为一个工具家族发布升级前需要验证编辑沙箱时不会同时留下已退役与替换两个 ID 都被选中的状态。如果通用选择器与 API 校验尚未替换或拒绝冲突版本应在通用注册表边界统一处理一次配以聚焦的 UI 与契约测试绝不针对单个 CLI 做特判也绝不静默安装两个暴露同一可执行文件的版本。配方的身份ID、revision、SHA-256会进入沙箱镜像哈希——这正是hashSandboxSpec在 sandbox-spec.ts 中所做的事。保留旧条目才使这种身份是**可复现reproducible**的而不仅仅是缓存失效cache-busting。第 3 步添加客户端安全元数据在 cli-tools.ts 中完成以下操作将 ID 追加到SANDBOX_CLI_TOOL_IDS顺序与元数据注册表、配方注册表保持一致在SANDBOX_CLI_TOOLS中添加一个条目其键key与id精确一致提供唯一的、可选的label简洁的description已有的category以及在searchTerms中给出有用的可执行文件/厂商别名只有当现有类别都不准确时才新增类别且新类别必须至少有一个可选条目。以kubectl为例真实条目形如kubectl1.36.3-r1: { id: kubectl1.36.3-r1, label: kubectl, description: Control Kubernetes clusters., category: Kubernetes, searchTerms: [kubectl, kubernetes, k8s], },关键约束该文件必须保持对客户端 bundle 安全。它不得包含产物 URL、校验和、安装命令、验证命令、PATH 配方、provider SDK也不得从cli-tools.server.ts导入任何东西。cli-tools-boundary.test.ts会从客户端可达的模块图反向可达性搜索确保cli-tools.server.ts永远不会被客户端模块图拉入。cli-tools.test.ts中还有一个专门的断言直接读取cli-tools.ts源码文本确认其中不出现installCommand、verificationCommands、pathEntries、SANDBOX_SYSTEM_PATH、sha256以及任何官方产物 host。API 枚举与可搜索的分组选择器都由这个注册表派生见 managed-cli-select.tsx因此不要添加并行的选项数组或路由本地的 wire 类型。第 4 步添加仅服务器端配方在 cli-tools.server.ts 中优先使用最窄的辅助函数辅助函数适用场景defineBinaryRecipe单个下载的二进制文件如kubectl、argocd、firebase、sops、minio-mcdefineTarGzipRecipe/defineZipRecipe包含二进制的归档如doctl、gh、helm、terraform、stripe、duckdbdefineVerifiedRecipe厂商归档或安装器布局需要显式命令如gcloud、aws、az、pulumi、restic、mongosh直接手写类型化条目仅当辅助函数无法如实建模该发布形态时defineVerifiedRecipe会把配方统一组装为一条确定性的安装命令其结构真实生成逻辑为mkdir -p root/bin root/extract curl -fsSL --retry 3 --retry-all-errors artifactUrl -o artifact echo sha256 artifact | sha256sum -c - installCommands... rm -f artifact其中root统一为/opt/sim-cli/toolNamebin为root/bin临时产物放在/tmp/sim-cli-toolName-artifactName安装完成后清理。cleanupCommand只允许出现rm -rf/rm -f且路径严格限定在/opt/sim-cli/tool/extract与/tmp/...——测试会对每个清理指令做正则断言。配方契约要求提供以下每个字段精确的version、artifactUrl、artifactName以及小写 64 位十六进制sha256每个安装的executable都对应一个verificationCommands条目确定性的解压/安装命令写入/opt/sim-cli固定路径必须加引号并清理临时产物当可执行文件不在辅助函数默认bin目录时提供pathEntries仅当与 E2B-and-Daytona 默认值不同时才提供supportedProviders默认两者都支持当revision不等于1时提供之且必须与 ID 后缀一致。一些真实的配方形态示例二进制直达kubectlkubectl1.36.3-r1: defineBinaryRecipe(kubectl1.36.3-r1, { version: 1.36.3, artifactUrl: https://dl.k8s.io/release/v1.36.3/bin/linux/amd64/kubectl, artifactName: kubectl-v1.36.3-linux-amd64, sha256: ebbd080e7c2e275093b55915722043257eb24004363e20acb3c4d71919f88336, executables: [kubectl], verificationCommands: [kubectl version --client], binaryName: kubectl, }),tar.gz 归档github-cli注意归档内嵌套路径github-cli2.97.0-r1: defineTarGzipRecipe(github-cli2.97.0-r1, { version: 2.97.0, artifactUrl: https://github.com/cli/cli/releases/download/v2.97.0/gh_2.97.0_linux_amd64.tar.gz, artifactName: gh_2.97.0_linux_amd64.tar.gz, sha256: a2c9b8497e1f85b1ad0dfcb78b5a622e098801b8e461e459e88e1ee12f018112, executables: [gh], verificationCommands: [export GH_NO_UPDATE_NOTIFIER1 GH_TELEMETRY0, gh --version], binaries: { gh: gh_2.97.0_linux_amd64/bin/gh }, }),厂商安装器布局aws-cli需要显式 install 命令aws-cli2.36.15-r1: defineVerifiedRecipe(aws-cli2.36.15-r1, { version: 2.36.15, artifactUrl: https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.36.15.zip, artifactName: awscli-exe-linux-x86_64-2.36.15.zip, sha256: 02a8eb2fe985be8ebcc284aaa5bae206ee8668872d6369e66a5c7d49d8671a08, executables: [aws], verificationCommands: [aws --version], installCommands: (paths) [ unzip -q ${paths.artifact} -d ${paths.extract}, ${paths.extract}/aws/install --install-dir ${paths.root}/aws-cli --bin-dir ${paths.bin} --update, ], }),关于验证命令必须离线、免遥测验证命令的目标是证明该命令能通过sandboxCliEnvironment被发现而不是做认证或联系用户账户。因此许多配方都会在版本命令前导出环境变量以关闭遥测与更新检查gcloud --version、bq version、gsutil versiongoogle-cloud-cliexport GH_NO_UPDATE_NOTIFIER1 GH_TELEMETRY0gh --versionexport GLAB_CHECK_UPDATEfalse GLAB_SEND_TELEMETRYfalseglab versionexport CHECKPOINT_DISABLE1terraform versionexport PULUMI_SKIP_UPDATE_CHECKtruepulumi versionsops --disable-version-check --versionmongosh --build-info构建信息而非联系网络的检查cli-tools.test.ts用一张表格逐一断言这些离线、免遥测的验证命令组合。配方命令以 root 身份运行既发生在预构建镜像创建阶段也发生在**运行时供给runtime provisioning**阶段。新增产物 host 的供应链审查如果产物托管方host是全新的只能在 cli-tools.test.ts 的officialHosts白名单中添加确切的官方 hostname。当前白名单包含awscli.amazonaws.com、dl.k8s.io、dl.min.io、downloads.mongodb.com、downloads.rclone.org、get.helm.sh、get.pulumi.com、github.com、gitlab.com、packages.microsoft.com、releases.hashicorp.com、storage.googleapis.com。测试同时断言所有artifactUrl必须是https://、不得包含latest、必须包含版本号安装命令不得出现curl ... | sh、npm install、pip install。请把白名单视为一次供应链审查而不是让测试闭嘴的手段。第 5 步保持通用行为不被破坏新增 CLI 后需要确认以下通用路径仍然自洽sandboxCliToolRecipes对传入的 ID 列表做 canonicalize去重 排序并解析出配方sandboxCliEnvironment把每个配方的pathEntries与SANDBOX_SYSTEM_PATH合并构造 PATH 环境传播给 Python 子进程、JavaScript 子进程与 Shellexport const SANDBOX_SYSTEM_PATH /usr/local/sbin:/usr/local/bin:/usr/local/games:/usr/sbin:/usr/bin:/usr/games:/sbin:/bin:/root/.local/binE2B 会把配方烘焙进自定义镜像运行时策略runtime-strategyprovider 则在 Function 超时内执行安装纯 CLI 沙箱不选任何语言包也必须保持可构建hashSandboxSpec在包含配方 ID、revision、校验和的同时对空 CLI 列表保留旧版哈希sandbox-spec.test.ts用固定摘要3cb73688...断言了这一点确保存量沙箱镜像不被无谓重建设置页选择器从客户端安全元数据派生分组与搜索别名。不要在那些通用层里为某个 CLI 特判除非注册表契约确实无法表达某个真实的 provider 需求。当多个 CLI 需要同一种新行为时应泛化地扩展注册表契约。第 6 步为新增编写测试当新条目引入了未被现有测试覆盖的行为时扩展测试主要位于 cli-tools.test.ts每一次升级都增加回归断言旧 ID 与旧配方仍然可解析但不可选择替换 ID 可选把重要的可执行文件别名加入表驱动的搜索断言如[google-cloud-cli577.0.0-r1, [bq, gcloud]]、[minio-mc..., [mc]]为多可执行文件配方、自定义 PATH 或受限 provider 增加聚焦断言如 supabase 的supabase与supabase-go双可执行文件仅在安装 真实最小命令无法脱离认证被验证时才添加opt-in 凭据冒烟测试凭据从测试专用环境变量读取、默认跳过、仅在运行时创建、并且总是拆除沙箱。仓库中的真实冒烟测试范例是 managed-cli.smoke.test.ts它由E2B_MANAGED_CLI_SMOKE1触发默认describe.skipIf跳过要求设置E2B_API_KEY与E2B_FUNCTION_TEMPLATE_ID对SANDBOX_SELECTABLE_CLI_TOOL_IDS中每个 ID 依次执行安装命令 → 清理命令 → 验证命令三个阶段全部以 root 用户运行安装超时 15 分钟、验证超时 2 分钟afterEach中强制kill()沙箱。绝不提交下载的产物或凭据。必需验证完整命令清单在apps/sim目录下运行单元与组件测试bunx vitest run \ lib/execution/remote-sandbox/cli-tools.test.ts \ lib/execution/remote-sandbox/cli-tools-boundary.test.ts \ lib/execution/remote-sandbox/sandbox-spec.test.ts \ lib/execution/remote-sandbox/resolve.test.ts \ lib/api/contracts/sandboxes.test.ts \ app/workspace/[workspaceId]/settings/components/sandboxes/utils.test.ts \ app/workspace/[workspaceId]/settings/components/sandboxes/components/sandbox-editor.test.tsx在仓库根目录运行类型检查、API 校验契约检查、格式与差异检查bun run type-check bun run check:api-validation bunx biome check \ apps/sim/lib/execution/remote-sandbox/cli-tools.ts \ apps/sim/lib/execution/remote-sandbox/cli-tools.server.ts \ apps/sim/lib/execution/remote-sandbox/cli-tools.test.ts git diff --check对新增配方还应在真实 E2B 或 Daytona 沙箱中实际执行它的安装命令与每一条验证命令需要凭据与网络可用时。若只运行了注册表/单元验证必须如实说明缺口。完成检查清单官方不可变 Linux x86-64 产物与 SHA-256 已核验版本化 ID 已追加旧 ID 与旧配方全部保留客户端元数据可搜索、已分类、唯一、且不含配方细节服务器端配方已钉死版本、经完整性校验、非交互、免凭据每个对外公布的可执行文件都有离线验证命令与 PATH 条目provider 兼容性明确且准确目录、边界、哈希、解析器、类型、API 校验、格式与 diff 检查全部通过真实 provider 安装已测试或如实披露缺失的实机验证。小结Sim 的托管 CLI 注册表是一套把供应链安全内建到数据模型里的系统客户端只见安全的目录元数据服务器端持有钉死版本、校验和与安装配方的不可变配方二者以cli-tools-boundary.test.ts的导入边界与cli-tools.test.ts的不变量测试双重锁死内容寻址的hashSandboxSpec把配方 ID、revision 与 SHA-256 纳入镜像身份同时为旧沙箱保留兼容哈希。遵循本文的六步流程与验证清单你就能在不触碰 UI、API 与 provider 实现的前提下安全地扩充这个精选工具集并确保每一次新增都可复现、可审计、可回滚。【免费下载链接】simSim is the collaborative workspace to build, deploy, and monitor AI agents and workflows. Used by 100,000 builders.项目地址: https://gitcode.com/GitHub_Trending/sim16/sim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 6:01:34

树莓派Pico RTC时间同步:NTP精简实现与硬件补救

1. 为什么树莓派 Pico 的 RTC 不能“开箱即用”——从硬件限制到软件补救的底层逻辑MicroPython 开发者第一次把树莓派 Pico 插上电脑,兴奋地敲下import machine; rtc machine.RTC(),接着调用rtc.datetime(),看到返回的是一串固定值&#xf…

2026/9/10 6:01:34

telegram-node-bot集群部署指南:多进程架构与Webhook配置详解

telegram-node-bot集群部署指南:多进程架构与Webhook配置详解 想要构建高性能、高可用的Telegram机器人应用吗?telegram-node-bot作为一款功能强大的Node.js模块,提供了完整的集群部署方案和灵活的Webhook配置选项。本指南将深入解析telegra…

2026/9/10 6:01:34

diagram-design:前端可视化决策系统实战指南

1. “diagram-design”不是一张图,而是一套前端可视化决策系统“diagram-design”这个词在2024年技术社区里高频出现,但它从来就不是某个具体工具、库或插件的代号——它是一类问题的统称:如何在现代Web环境中,以可控、可维护、可…

2026/9/10 6:41:38

OpenClaw+IoT:打造真正懂你的全屋智能实战

做全屋智能这行时间长了就会发现,客户对“智能”的期待,和设备厂商对“智能”的定义,完全是两回事。大部分厂商交付的是“能控制的灯”,而客户真正想要的是一个“不用自己动手的家”。这两年我陆续落地了12个全屋智能项目&#xf…

2026/9/10 6:41:38

AI招聘的演进:从单点提效到业务重构的关键路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 6:41:37

MySQL库操作指南:建库、字符集、权限与备份全解析

1. 库操作到底在操作什么刚接触MySQL的时候,很多人第一件事就是装环境、配变量、打开命令行敲几句SQL。折腾完mysql -uroot -p能进去了,接下来自然就会问一句:然后呢?然后就是建库、建表、塞数据。这里面的“建库”就是我今天想聊…

2026/9/10 6:41:37

SSM电商实战:从分层架构到订单事务与库存扣减

简介:SSM项目鲜花销售管理系统.zip 是一套基于 SpringSpringMVCMyBatis 框架的完整 Java Web 实战项目,适合正在学习 SSM 整合、MySQL 数据库及前端 LayUI 的中高级开发者。资源共收录 637 个文件,压缩后约 22.68MB,包含 105 个 J…

2026/9/10 6:36:37

本地大模型推理CLI工具真相:llama.cpp、Ollama与LMDEPLOY实操指南

1. “magnitude”不是命令行工具,而是被误传的模型推理服务代号最近在多个技术社区和开发者群聊里,频繁看到有人搜索“magnitude CLI”“magnitude inference server”“magnitude local models”,甚至把“magnitude”和“codex cli”“claud…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码