
CLI-Anything 之 Tigris 对象存储 Harness让 AI Agent 通过一个入口驱动快照、IAM 与临时凭证【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything本篇技术指南围绕 CLI-Anything 仓库中 tigris 子模块的 Agent Harness 展开讲解如何把 Tigris全球分布式、S3 兼容、免出口流量费的对象存储服务的官方 CLI 包装成一个对 AI Agent 友好的统一命令行入口cli-anything-tigris。读完本文你将掌握该 Harness 的安装与认证流程、七大命令组auth / bucket / object / presign / snapshot / access-key / iam的完整用法、--json机器可读输出的契约以及面向编码 Agent 的隔离、备份与销毁安全最佳实践并了解其底层壳调用官方 CLI的实现原理。背景为什么需要一个 Tigris CLI HarnessTigris 是一个全球分布式、S3 兼容的对象存储服务核心卖点包括数据就近放置读取、无出口流量费no egress fees、以及快照snapshots和范围受限访问密钥scoped access keys等专有原语。对于编码 Agent如 Claude Code、Codex而言直接面对原始 CLI 存在输出不可解析、命令繁多、权限管理繁琐等问题。cli-anything-tigris的思路与 CLI-Anything 项目一致包装官方tigrisCLI 而非重新实现 S3 协议从而让 Agent 触及 Tigris 的全部原语快照、IAM、范围化凭证、OAuth而不仅是通用 S3 操作随着上游 CLI 发布新命令Harness 自动继承新能力通过处处--json的单一入口统一输出契约。需要特别强调的是这是Tigris CLI 专属工具不是通用的 S3/MinIO/R2/AWS 端点管理器这一点在 README 与 TIGRIS.md 中均有明确声明。安装与认证安装分三步缺一不可# 1. 安装底层 Tigris CLI npm install -g tigrisdata/cli # 或brew install tigrisdata/tap/tigris # 2. 认证浏览器 OAuth tigris login # 3. 安装本 Harness pip install cli-anything-tigris前提条件来自 SKILL.mdPython 3.10依赖 PEP 604 联合类型与 PEP 585 泛型macOS 系统自带 Python 为 3.9需用 pyenv、uv 或brew install python3.12tigrisCLI 在 PATH 上其二进制别名是t3。认证默认走tigris login的浏览器 OAuth 流程凭据由官方 CLI 自身解析。对于依赖环境变量认证的场景Harness 还支持通过--access-key/--secret-key显式传入凭据——底层实现会把它们导出为子进程的TIGRIS_STORAGE_ACCESS_KEY_ID、AWS_ACCESS_KEY_ID、TIGRIS_STORAGE_SECRET_ACCESS_KEY、AWS_SECRET_ACCESS_KEY环境变量见 tigris_backend.py。setup.pysetup.py显示运行时依赖仅两个click8.0.0与prompt-toolkit3.0.0刻意不引入 boto3因为 S3 协议由官方 CLI 负责。安装后提供cli-anything-tigris控制台脚本。快速上手# 交互式 REPL cli-anything-tigris # 或直接驱动 cli-anything-tigris --json auth whoami cli-anything-tigris --json bucket list cli-anything-tigris --json object cp ./local.bin t3://my-bucket/remote.bin cli-anything-tigris --json snapshot take my-bucket --name baseline-v1 cli-anything-tigris --json access-key create agent-run-42 cli-anything-tigris --json access-key rotate tid_AaBb --yes cli-anything-tigris --json presign get --bucket my-bucket --key hello.txt注意bucket 删除、access-key 删除、access-key 轮换均需显式--yes否则 Harness 拒绝调用后端。全局选项选项默认值说明--json关闭输出 JSON 格式机器可读--cli-pathtigristigris二进制路径PATH 上的t3别名同样可用--access-key无可选的访问密钥 ID导出到子进程环境变量--secret-key无可选的密钥导出到子进程环境变量这些选项定义在 tigris_cli.py。入口函数还通过TIGRIS_CLI前缀支持环境变量auto_envvar_prefixTIGRIS_CLI。REPL 模式不带子命令直接运行cli-anything-tigris即进入交互式 REPL支持 tab 补全与历史记录基于 prompt-toolkit。REPL 内置help显示命令速查、quit/exit/q退出并把每行输入经shlex.split后交给 Click CLI 解析tigris_cli.py。七大命令组全参考auth —— 认证包装tigris login/logout/whoami命令说明login浏览器 OAuth 登录tigris login交互流程直接透传到 TTYlogout登出当前会话whoami打印当前认证用户 / 组织实现位于 core/auth.py其中login/logout因不支持 JSON 格式化而以captureFalse方式直接流式输出。bucket —— Bucket CRUD命令说明list列出所有 bucketcreate --name NAME创建 bucketdelete --name NAME --yes删除空 bucket必须--yesinfo NAME获取 bucket 信息tigris buckets get相当于 HEAD底层映射见 core/bucket.pydelete命令在未带--yes时会直接输出错误并退出码 1从源头拦截危险操作。object —— 对象操作包装tigris ls/cp/rm/stat命令说明list --bucket B [--prefix P] [--limit N]列出对象--limit为客户端截断put --bucket B --key K (--file F \| --text T)上传文件或内联文本get --bucket B --key K --output F下载对象到本地文件delete --bucket B --key K删除对象info --bucket B --key K对象元数据HEAD / statcp SRC DST [-r]复制接受t3://或tigris://URI两点实现细节值得注意URI 规范化后端_path_to_t3会把tigris://bucket/key、bucket/key甚至/bucket/key统一规范化为t3://bucket/keytigris_backend.py单测 test_core.py 覆盖了各种非法输入如s3://b/k、tigris://nokey的拒绝逻辑。上传/下载复用cpput --file走tigris cp file t3://bucket/keyput --text会把文本暂存到临时文件再 cp 并在结束时清理get则反向下载。这解释了为什么 SKILL.md 中object组的说明是wrapstigris ls/cp/rm/stat。cp命令要求 src 与 dst 至少一方是远程 URI否则报错退出core/object.py。当两端都是 t3 时执行服务端复制server-side copy数据完全不经 Agent 中转也不会产生出口流量费——这是成本与安全上的关键特性。presign —— 限时 URL命令说明get --bucket B --key K [--expires SEC]生成下载用预签名 URLput --bucket B --key K [--expires SEC]生成上传用预签名 URL默认有效期 3600 秒还支持--access-key指定签名所用密钥。实现见 core/presign.py底层调用tigris presign path --method get|put --expires-in sec。后端会同时兼容上游 CLI 的两种返回形态JSON 模式下解析{url: ...}字段否则回退为裸 URL 字符串。snapshot —— 时间点快照Tigris 专属原语命令说明list BUCKET列出某 bucket 的快照take BUCKET [--name N]创建快照可用--name命名快照是 bucket 某一时间点的只读副本是通用 S3 兼容提供商不具备的能力也是每个 Agent 隔离与回滚方案的基石。实现见 core/snapshot.py。access-key —— 范围化编程凭证命令说明list列出全部访问密钥create NAME创建新密钥secret 只展示一次get KEY_ID查看密钥详情delete KEY_ID --yes永久删除密钥必须--yesassign KEY_ID --bucket B --role R将密钥限定到 bucket 角色如Editor、Viewerrotate KEY_ID --yes轮换密钥的 secret必须--yesassign与snapshot组合使用即可实现按 Agent 隔离为单次 Agent 运行铸造一个仅限单一 bucket 的最小权限密钥运行结束即删除。delete与rotate的--yes校验在 core/access_key.py 中由命令层强制未携带--yes直接拒绝。iam —— 策略与组织用户命令说明policy list列出 IAM 策略policy create NAME --document FILE从 JSON 文件创建策略user list列出组织用户user invite EMAIL [--role R]邀请用户默认角色member实现见 core/iam.py。与access-key assign配合IAM 策略让组织可以向编程客户端授予狭窄、可审计的权限。双输出模式与 Agent 调用契约所有命令支持两种输出人类可读默认表格、颜色、格式化文本经统一的 REPL skin 渲染机器可读--json输出 JSON 信封对于上游 CLI 原生支持--format json的命令如buckets list、snapshots list、whoami则原样透传其 JSON 输出对不支持 JSON 的命令如cp由 Harness 包一层薄信封。后端_run的核心逻辑是拼装tigris args --format json命令--format json追加在末尾避免与子命令解析冲突用subprocess.run执行并解析 JSON解析失败则回退为原始文本tigris_backend.py。非零退出码会抛出TigrisCliError并附带 stderr 信息。Agent 程序化调用时遵循以下契约来自 SKILL.md 与 TIGRIS.md始终加--json以获得可解析输出检查返回码——0 为成功非 0 为错误读取 stderr 获取错误信息object cp接受t3://bucket/key或tigris://bucket/keyURIt3 → t3 的服务端复制完全跳过往返presign在人类模式下 URL 输出到 stdoutJSON 模式下位于url字段销毁类操作bucket 删除、access-key 删除与轮换必须显式--yes建议先对目标 bucket 打快照再执行操作最后视情况保留或丢弃快照按 Agent 隔离access-key createaccess-key assign --bucket B --role Editor铸造单 bucket 作用域密钥Agent 运行结束用access-key delete吊销。架构与源码导览Harness 目录结构如下详见 TIGRIS.mdtigris/agent-harness/ ├── setup.py # 依赖仅 click、prompt-toolkit无 boto3 ├── TIGRIS.md # 架构与 SOP 文档 └── cli_anything/tigris/ ├── __main__.py # python -m 入口 ├── tigris_cli.py # Click CLI REPL 调度器 ├── core/ │ ├── auth.py # login, logout, whoami │ ├── bucket.py # list, create, delete, info │ ├── object.py # list, put, get, delete, info, cp │ ├── presign.py # presign get/put │ ├── snapshot.py # list, take │ ├── access_key.py # list, create, get, delete, assign, rotate │ └── iam.py # policies users ├── utils/ │ ├── tigris_backend.py # 围绕 tigris 的 subprocess 包装器 │ └── repl_skin.py # 统一 REPL 皮肤 ├── skills/SKILL.md # 完整命令参考与 Agent 使用指引 └── tests/ ├── test_core.py # subprocess.run 全 mock 的单测 └── test_full_e2e.py # 真实 CLI 的端到端测试环境变量门控各命令组与上游 CLI 的映射关系命令组包装的上游命令操作authtigris login/logout/whoamilogin, logout, whoamibuckettigris buckets ...list, create, delete --yes, infoobjecttigris ls/cp/rm/statlist, put, get, delete, info, cppresigntigris presignget, putsnapshottigris snapshots ...list, takeaccess-keytigris access-keys ...list, create, get, delete --yes, assign, rotate --yesiamtigris iam policies / users ...policy list/create, user list/invite测试策略test_core.py在模块级 patch 了shutil.which并把subprocess.run完全 mock 掉因此无需安装tigrisCLI 也无网络即可运行覆盖 URI 规范化、--yes强制校验、JSON 透传等行为test_full_e2e.py面向真实 bucket需设置环境变量CLI_ANYTHING_TIGRIS_RUN_E2E1、tigris在 PATH 且已认证运行说明见 tests/TEST.md。Agent 实战模式结合上述机制可以沉淀出三类可直接复用的模式1. 备份优先的销毁流程——任何删除/轮换前先建恢复点cli-anything-tigris --json snapshot take my-bucket --name pre-cleanup cli-anything-tigris --json bucket delete --name old-bucket --yes # 如需回滚snapshot list 找到快照后恢复2. 单 Agent 单密钥的最小权限隔离cli-anything-tigris --json access-key create agent-run-42 cli-anything-tigris --json access-key assign tid_AaBb --bucket my-bucket --role Editor # ... Agent 在此密钥作用域内工作 ... cli-anything-tigris --json access-key delete tid_AaBb --yes # 运行结束吊销3. 免共享凭证的工件交接——通过预签名 URL 把对象访问权移交给其他工具或下游 Agent全程不泄露密钥cli-anything-tigris --json presign get --bucket my-bucket --key artifacts/model.pt --expires 3600适用边界与注意事项该 Harness 只面向官方 Tigris CLI认证模型遵循其 OAuth 会话或环境变量凭据不要将其用作通用 S3 端点工具破坏性命令的--yes由命令层强制校验未携带即拒绝但快照、IAM、密钥等操作仍会真实作用于云端资源生产环境请先在小规模 bucket 上验证Python 版本要求 3.10旧版 Python尤其 macOS 系统 Python 3.9需先升级解释器底层 CLI 若不在 PATHHarness 启动时会报错并提示安装命令但--help仍可用后端初始化错误被延迟处理见 tigris_cli.py。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考