diff --git a/go.mod b/go.mod index bc6cdf4..4e4994b 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/manifoldco/promptui v0.9.0 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.11.1 - github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260811030544-8dd599016a25 + github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260812025714-9a51285e73c9 golang.org/x/term v0.44.0 ) diff --git a/go.sum b/go.sum index 9c6dad4..16c936a 100644 --- a/go.sum +++ b/go.sum @@ -24,12 +24,8 @@ github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260626103758-60b4523c8358 h1:q9sQ6a40CRE6CA5aUFUtvyKObVyW3JJZG1WUtziH/4o= -github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260626103758-60b4523c8358/go.mod h1:097WABFNud50hH2KImyZ8WOJeb0lM2A4+gLvQ1kllsc= -github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260724023741-905601aa3144 h1:PHVW7cDYIAfl1vv/6qKbvzs52HvhlSW5j1h4DuJO2uc= -github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260724023741-905601aa3144/go.mod h1:097WABFNud50hH2KImyZ8WOJeb0lM2A4+gLvQ1kllsc= -github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260811030544-8dd599016a25 h1:l9KU2bJKvLGZkh8NDKq0fnzbSF7B2P7Eo8pN6b20ccw= -github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260811030544-8dd599016a25/go.mod h1:097WABFNud50hH2KImyZ8WOJeb0lM2A4+gLvQ1kllsc= +github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260812025714-9a51285e73c9 h1:B20Rbjyt5h5PZSziJbIhewzpcywOBYvh6Cx6bEewc0A= +github.com/ucloud/ucloud-sandbox-sdk-go v0.0.0-20260812025714-9a51285e73c9/go.mod h1:097WABFNud50hH2KImyZ8WOJeb0lM2A4+gLvQ1kllsc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= diff --git a/install.sh b/install.sh index 0c56122..bdae88d 100755 --- a/install.sh +++ b/install.sh @@ -159,12 +159,22 @@ download() { } make_tmp_dir() { - if has mktemp; then - TMP_DIR="$(mktemp -d 2>/dev/null || mktemp -d -t ucloud-sandbox-cli)" - else - TMP_DIR="/tmp/ucloud-sandbox-cli-install.$$" - mkdir -p "$TMP_DIR" + if ! has mktemp; then + error "mktemp was not found." + info "Install mktemp, then run this installer again." + exit 1 + fi + + TMPDIR="${TMPDIR:-/tmp}" + if [ ! -d "$TMPDIR" ] || [ ! -w "$TMPDIR" ]; then + error "Temporary directory is unavailable: $TMPDIR" + exit 1 fi + + # Pass an explicit template so both BSD/macOS and GNU mktemp create the + # directory under the caller's temporary root. The bare `mktemp -d` form + # can ignore TMPDIR on macOS and land in a sandbox-denied system directory. + TMP_DIR="$(mktemp -d "${TMPDIR%/}/ucloud-sandbox-cli.XXXXXXXX")" } cleanup() { diff --git a/skills/ucloud-sandbox-site/SKILL.md b/skills/ucloud-sandbox-site/SKILL.md index aa0e281..aa7a7a1 100644 --- a/skills/ucloud-sandbox-site/SKILL.md +++ b/skills/ucloud-sandbox-site/SKILL.md @@ -38,54 +38,30 @@ description: 当用户提供以 `site_` 开头的 UCloud 站点空间 ID,并 ## 准备并验证 CLI -每次准备执行真实站点操作前,先检查是否存在旧 npm 版 CLI,并验证当前命令。Linux 和 macOS 使用以下流程: +最低支持版本是 `v1.3.1`。该版本开始让控制面、RPC、文件和流式请求统一继承 `HTTP_PROXY`、`HTTPS_PROXY` 与 `NO_PROXY`;旧版本在受限网络中可能误报 DNS 失败。 -```bash -OLD_NPM_PACKAGE="@ucloud-sdks/ucloud-sandbox-cli" - -if command -v npm >/dev/null 2>&1 && npm list -g "$OLD_NPM_PACKAGE" --depth=0 >/dev/null 2>&1; then - echo "OLD_NPM_CLI_FOUND" -elif command -v ucloud-sandbox-cli >/dev/null 2>&1; then - ucloud-sandbox-cli version -else - echo "NOT_INSTALLED" -fi -``` - -如果输出版本信息,CLI 验证通过,继续连接站点。如果输出 `OLD_NPM_CLI_FOUND`,说明安装的是 v1.0 及以前的 npm 旧版;先卸载旧版,再安装当前二进制版: - -```bash -npm uninstall -g @ucloud-sdks/ucloud-sandbox-cli -curl -sS https://raw.githubusercontent.com/ucloud/ucloud-sandbox-cli/main/install.sh | sh -s -- -y -ucloud-sandbox-cli version -``` +### AstraFlow Desktop -如果全局 npm 卸载需要管理员权限或交互确认,让用户在真实终端执行卸载命令,不要绕过权限限制。 +如果工具列表中存在 `ensure_ucloud_sandbox_cli`,它是唯一允许的安装与解析入口。执行真实站点操作前,第一个动作调用它,且一次任务最多调用一次: -如果输出 `NOT_INSTALLED`,使用官方安装脚本安装。Agent、CI 等自动化环境使用非交互模式: +- 已有合格版本时,它只返回共享 CLI 状态,不弹安装授权。 +- 缺失或低于最低版本时,它只从 `ucloud/ucloud-sandbox-cli` 官方 Release 下载,校验 SHA256 后原子安装到 AstraFlow 的共享托管目录;这一步只申请一次重要操作授权。 +- 托管目录由 Desktop 以只读方式加入 Agent 的 `PATH`,跨会话和重启复用。后续命令始终写 `ucloud-sandbox-cli`,不要保存、猜测或复制工具返回的绝对路径。 -```bash -curl -sS https://raw.githubusercontent.com/ucloud/ucloud-sandbox-cli/main/install.sh | sh -s -- -y -ucloud-sandbox-cli version -``` +使用该工具后,不要再执行 `npm list -g`、`which`、`find $HOME`、`curl | sh`,不要尝试 `/usr/local/bin`、沙箱私有的 `$HOME/.local/bin`,也不要为了找 CLI 切到主机执行。工具失败时保留并报告原始错误,停止站点操作。 -需要让用户在真实终端交互安装时,也可以使用: +### 其他客户端和真实终端 -```bash -curl -sS https://raw.githubusercontent.com/ucloud/ucloud-sandbox-cli/main/install.sh | sh -``` +仅当 `ensure_ucloud_sandbox_cli` 不存在时,执行一次 `ucloud-sandbox-cli version`。如果命令不存在或低于 `v1.3.1`,不要在受限 Agent 沙箱内自动安装;请用户在真实终端从官方仓库安装。 -若默认安装目录不可写,安装到用户目录并把它加入当前 shell 的 `PATH`: +只有用户明确要求“真实终端也能直接使用”时,才提供以下独立的用户级安装选项;不要自动执行,也不要使用 sudo 或自动写入 `/usr/local/bin`: ```bash -curl -sS https://raw.githubusercontent.com/ucloud/ucloud-sandbox-cli/main/install.sh | sh -s -- -y -p "$HOME/.local/bin" -export PATH="$HOME/.local/bin:$PATH" -ucloud-sandbox-cli version +curl -sS https://raw.githubusercontent.com/ucloud/ucloud-sandbox-cli/main/install.sh \ + | sh -s -- -y -p "$HOME/.local/bin" ``` -安装后必须以 `ucloud-sandbox-cli version` 成功作为 CLI 验证标准。安装脚本成功但命令仍不存在时,定位实际安装目录并加入 `PATH`;不要在尚未验证 CLI 时继续站点认证或部署。 - -本节只安装和验证 `ucloud-sandbox-cli`。不要自动更新已经可正常运行的 CLI,也不要在本技能中安装或更新 `ucloud-sandbox-site` skill 本身。 +本节只准备 `ucloud-sandbox-cli`,不要安装或更新本 Skill 本身。 ## 连接站点 @@ -111,13 +87,14 @@ export UCLOUD_SANDBOX_API_KEY="$SITE_ID" 站点所在地域或 API 域名仍由已有 CLI 配置以及 `UCLOUD_SANDBOX_REGION`、`UCLOUD_SANDBOX_DOMAIN` 决定。没有证据时不要擅自切换;连接失败且怀疑地域不符时,向用户确认站点地域。 -### 2. 执行无副作用的连接验证 +### 2. 在一次调用中验证连接并检查初始目录 ```bash -ucloud-sandbox-cli sandbox exec "$SANDBOX_ID" "printf 'SITE_CONNECTED\\n'; pwd" +ucloud-sandbox-cli sandbox exec "$SANDBOX_ID" \ + "printf 'SITE_CONNECTED\\n'; pwd; printf 'SITE_HOME\\n'; ls -la /home/user" ``` -只要这个 `exec` 成功,就认为 AI 已连接站点,可以继续检查文件、生成代码和部署。不要用 `sandbox list` 验证连接。 +只要这个 `exec` 成功,就认为 AI 已连接站点并已完成首次目录检查,可以继续生成代码和部署。不要把连接验证、`pwd` 和初始 `ls` 拆成多个调用,也不要用 `sandbox list` 验证连接。 ## 常用命令 @@ -336,3 +313,5 @@ ucloud-sandbox-cli sandbox exec "$SANDBOX_ID" \ | `exec` 在启动服务后不返回 | 确认服务已后台运行,并把 stdin、stdout、stderr 全部重定向 | | 站点内访问 80 端口失败 | 检查 PID、日志、启动命令和监听地址,确认服务监听 `0.0.0.0:80` | | `sandbox host` 有输出但页面打不开 | 不要据此宣布成功;先在站点内用 `curl` 验证,再检查进程和日志 | +| CLI 低于 `v1.3.1` 且出现 DNS/代理错误 | AstraFlow 中只再调用一次 `ensure_ucloud_sandbox_cli` 完成升级;其他客户端请用户在真实终端升级。不要切到主机重复同一站点命令 | +| CLI 已是 `v1.3.1` 或更高但仍出现 DNS/代理错误 | 保持 Default 沙箱;如平台要求,只申请一次当前会话的网络授权并重试一次。仍失败则报告域名、端口和原始错误,不要继续申请主机执行权限 | diff --git a/skills/ucloud-sandbox-site/references/windows.md b/skills/ucloud-sandbox-site/references/windows.md index 76fe2e8..c286aa4 100644 --- a/skills/ucloud-sandbox-site/references/windows.md +++ b/skills/ucloud-sandbox-site/references/windows.md @@ -22,17 +22,11 @@ ## 检查并安装 CLI -检查并卸载旧 npm 版;仅在命令不存在时调用独立 `install.ps1`。卸载需要管理员权限时,让用户在真实终端处理: +最低支持版本是 `v1.3.1`。如果 AstraFlow 工具列表中存在 `ensure_ucloud_sandbox_cli`,第一个动作调用它,且一次任务最多调用一次。它负责官方 Release 下载、SHA256 校验、共享托管安装和只读 `PATH` 注入;不要再运行下方脚本,不要搜索用户目录,也不要切到主机寻找 CLI。 -```powershell -if (Get-Command npm -ErrorAction SilentlyContinue) { - npm list -g "@ucloud-sdks/ucloud-sandbox-cli" --depth=0 *> $null - if ($LASTEXITCODE -eq 0) { - npm uninstall -g "@ucloud-sdks/ucloud-sandbox-cli" - if ($LASTEXITCODE -ne 0) { throw "Failed to uninstall the old npm CLI." } - } -} +仅当该工具不存在时,先执行一次 `ucloud-sandbox-cli version`。命令不存在或版本过低时,让用户在真实 PowerShell 中调用独立 `install.ps1`: +```powershell if (-not (Get-Command ucloud-sandbox-cli -CommandType Application -ErrorAction SilentlyContinue)) { [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 $InstallerUrl = "https://raw.githubusercontent.com/ucloud/ucloud-sandbox-cli/main/install.ps1" @@ -43,7 +37,7 @@ ucloud-sandbox-cli version if ($LASTEXITCODE -ne 0) { throw "ucloud-sandbox-cli verification failed." } ``` -安装脚本默认安装到 `%LOCALAPPDATA%\Programs\ucloud-sandbox-cli`,并更新当前进程和用户 `PATH`;不要自动更新已经可正常运行的 CLI。 +安装脚本默认安装到 `%LOCALAPPDATA%\Programs\ucloud-sandbox-cli`,并更新当前进程和用户 `PATH`。不要从 Agent 自动执行,不要自动更新已经满足最低版本的 CLI。 如果上述 PowerShell 安装流程失败,保留原始错误并主动查找其他可行安装方式,例如从官方 Release 手动下载与当前架构匹配的 ZIP;先向用户说明方案来源、操作、安装位置和风险,仅在用户明确同意后执行。替代方案只使用 `ucloud/ucloud-sandbox-cli` 官方仓库或官方 Release,并保持 TLS、证书和证书吊销校验;不要关闭安全校验、绕过系统安全策略或改用未经用户确认的第三方来源。若失败源于代理、证书或管理员权限,让用户在真实终端或由管理员处理。完成后确认 `ucloud-sandbox-cli version` 成功,且用户 `PATH` 已包含安装目录;否则不要继续连接站点。 ## 设置站点凭证并验证连接 diff --git a/submodules/ucloud-sandbox-sdk-go b/submodules/ucloud-sandbox-sdk-go index 8dd5990..9a51285 160000 --- a/submodules/ucloud-sandbox-sdk-go +++ b/submodules/ucloud-sandbox-sdk-go @@ -1 +1 @@ -Subproject commit 8dd599016a25ee5d2dd496f1b4a8998f0f65bf45 +Subproject commit 9a51285e73c9b70928e10e6009471254c4978628