用途
该技能用于验证本仓库的构建/发布脚本,属于脚本层面的端到端验证,而不是库层面的单元测试。SDK 本身作为库通过 import claude_agent_sdk 使用,但 scripts/ 目录是一组由发布工作流运行的 CLI。因此验证方式是运行它们,而不是导入它们。
核心约束
绝对不能运行真正的安装器。scripts/download_cli.py 会通过 shell 调用 curl https://claude.ai/install.sh | bash(以及 PowerShell 等价命令)。真实运行会覆盖开发者机器上的 claude 二进制文件。不要运行 bash install.sh,也不要在真实网络下以 latest/stable(或任何大小写变体)调用 download_cli.py。
正确做法是:在临时 PATH 上放置桩 curl / bash / powershell,在 env -i 下配合隔离的 HOME 运行脚本,这样 find_installed_cli() 就无法发现真实二进制并将其复制到 src/claude_agent_sdk/_bundled/。
测试夹具
技能正文给出了搭建隔离测试环境的 shell 命令,包括创建临时目录、复制脚本、写入 _cli_version.py,以及定义桩 curl 与桩 bash。桩 curl 会把 argv 记录到 $MARKER 文件,并可根据 CURL_BODY 写出响应体,退出码由 CURL_EXIT 决定(默认 0)。桩 bash 会把参数计数与每个参数记录到 $MARKER。
运行命令为:
cd $SB/repo
env -i HOME=$SB/home PATH=$SB/stub:/usr/bin:/bin MARKER=$SB/m \
CLAUDE_CLI_VERSION=2.1.208 .venv/bin/python scripts/download_cli.py
要点:run_command() 会捕获子进程输出,因此桩必须记录到 $MARKER 文件——打印到 stderr 会被吞掉。
值得驱动的流程
update_cli_version.py <version>:整个校验面都可以在这里触达。具体版本号会写入文件;latest/stable、v2.1.207、next、2.1以及引号逃逸字符串各自以退出码 1 失败,并给出不同消息,且文件保持不变。build_wheel.py --skip-sdist:读取 pin,然后链式调用download_cli.py。在沙箱中把_cli_version.py改写为移动标签 / 单引号 / 垃圾内容或删除它:每种情况都必须在任何子进程被拉起之前失败。--cli-version <v>会绕过 pin(这是有意的逃生通道;发布工作流不使用它)。download_cli.py:把CURL_BODY设为 HTML 错误页或空字符串,以证明 body 检查会拒绝它且不重试;清空 PATH 以证明缺少 curl 会在一次尝试中快速失败;设CURL_EXIT=22以证明真正的瞬时失败仍会重试 3 次。
Windows 路径
Windows 路径在 Linux 上不可达,它位于 platform.system() == "Windows" 之后。可用一个小型 runner 驱动:patch.object(m.platform, "system", return_value="Windows"),并配合一个桩 powershell,读取 -Command 文本并遵守 $env:CLAUDE_CLI_INSTALL_SCRIPT。这是强制平台唯一正当的地方。
注意事项
${CURL_BODY:-default}会把空 body 视为未设置。要测试空 body 分支,需使用单独一个执行: > "$out"的桩。- 重试路径会真实睡眠(抖动最多 5 秒,然后 2 秒 + 4 秒)。完整的三次尝试运行约需 10 秒;应为此预留时间,而不是假定为卡死。