--- name: install-usagebar version: "2.0.0" updated_at: 2026-06-30 homepage: https://usagebar.cn description: 安装 usageBar——macOS 菜单栏工具,统计 Claude Code / Codex / Qoder / 悟空 等 AI 编程工具的 token 用量。触发词:用户说"装/安装/帮我装/装上/重装/更新 usageBar"。从官方镜像下载**已签名公证**的 usageBar.app、装到 /Applications 并启动,全程零交互约 20 秒。 --- ## 这个 skill 干啥 usageBar 是 macOS 菜单栏小工具,实时显示 Claude Code / Codex / Qoder / 悟空 等 AI 编程工具的 token 消耗(今日 / 近 7 天 / 近 30 天 / 累计)。 本 skill 让 AI 一句话装好它:**下载官方已签名公证的 app → 装到 `/Applications` → 启动**。约 20 秒、零交互。 > app 是 **Developer ID 签名 + Apple 公证**的正式分发,Gatekeeper 直接放行,**无需清 quarantine**。 > 卸载:把 `/Applications/usageBar.app` 拖到废纸篓即可(或用 app 自带的退出/移除)。诊断后续会做进 app。 ## 何时触发 用户说"装 / 安装 / 帮我装 / 装上 / 重装 / 更新 usageBar"(或同义表达)。 ## 安装 直接运行下面这一段(每条命令都可见、可审计;已公证所以不清 quarantine;失败有明确退出码): ```bash set -euo pipefail APP=/Applications/usageBar.app TMP=/tmp/usagebar-install PROC="usageBar.app/Contents/MacOS/usageBar" PRIMARY=https://usagebar.cn/dl/usageBar.zip FALLBACK=https://github.com/ChanningYuan/usageBar/releases/latest/download/usageBar.zip # 0) 前置:架构 + macOS 版本(不符直接退,给清晰原因) [ "$(uname -m)" = arm64 ] || { echo "❌ 仅支持 Apple Silicon(当前 $(uname -m));Intel Mac 暂不支持" >&2; exit 10; } [ "$(sw_vers -productVersion | cut -d. -f1)" -ge 14 ] || { echo "❌ 需要 macOS 14+(当前 $(sw_vers -productVersion))" >&2; exit 11; } # 1) 下载(官方境内镜像优先,GitHub 兜底)+ 解压(ditto 保签名) rm -rf "$TMP"; mkdir -p "$TMP" echo "→ 下载 usageBar…" curl -fsSL --connect-timeout 15 -o "$TMP/usageBar.zip" "$PRIMARY" \ || { echo " 镜像不通,改用 GitHub…"; curl -fsSL -o "$TMP/usageBar.zip" "$FALLBACK"; } \ || { echo "❌ 下载失败(镜像 + GitHub 都不通),检查网络后重试" >&2; exit 20; } ditto -x -k "$TMP/usageBar.zip" "$TMP/" [ -d "$TMP/usageBar.app" ] || { echo "❌ 解压后没找到 usageBar.app,下载可能损坏" >&2; exit 21; } # 2) 验签:确认是官方公证版(防篡改/截断。curl 下载不带 quarantine,open 时 Gatekeeper # 不一定触发,所以这步显式验——这是"让 agent 下载并运行"的信任锚) spctl --assess --type execute "$TMP/usageBar.app" \ || { echo "❌ 验签未通过:下载的不是有效的官方公证版本,已中止" >&2; exit 22; } # 3) 安装到 /Applications(先退旧进程,再覆盖) pkill -f "$PROC" 2>/dev/null || true; sleep 1 rm -rf "$APP" cp -R "$TMP/usageBar.app" "$APP" \ || { echo "❌ 拷到 /Applications 被拒(多半企业 MDM)。让用户跑:sudo cp -R \"$TMP/usageBar.app\" /Applications/" >&2; exit 30; } # 4) 启动 + 自检 open "$APP"; sleep 2 if pgrep -f "$PROC" >/dev/null; then echo "✅ usageBar 已安装并启动(PID $(pgrep -f "$PROC" | head -1))" else echo "✅ 已安装,正在冷启动(首次约 15 秒)" fi rm -rf "$TMP" echo "位置 /Applications/usageBar.app | 菜单栏右上角会出现 token 数字 | 开机自启:系统设置 → 通用 → 登录项 加 usageBar" ``` **看退出码做后续判断**: | code | 含义 | 你该怎么做 | |---|---|---| | 0 | 成功 | 复述最后那段给用户,结束 | | 10 | Intel Mac | 告知:暂不支持 Intel,联系作者要 universal binary | | 11 | macOS < 14 | 告知:需先升级到 macOS 14+ | | 20 | 下载失败 | 镜像 + GitHub 都不通,让用户查网络重试 | | 21 | 解压失败 | 下载损坏,重跑一次 | | 22 | 验签失败 | 拉到的不是官方公证版(被篡改/截断/网络劫持),别装,重试或反馈 | | 30 | /Applications 被拒 | 多半 MDM;让用户 `sudo cp -R "$TMP/usageBar.app" /Applications/` | | 其他 | 未预期 | 把完整 stderr 发用户,建议反馈 | ## 装好后跟用户说(复述模板) > ✅ usageBar 装好了——菜单栏右上角能看到各 AI 编程工具今天烧了多少 token(今日 / 近 7 天 / 近 30 天 / 累计)。首次冷启约 15 秒。想开机自启,到 系统设置 → 通用 → 登录项 加上它。 ## 约束 - 只动 `/Applications/usageBar.app`,不碰其他系统文件。 - 需要 `sudo` 时告诉用户为什么,不静默 sudo。 - 失败时给**完整 stderr**,不能只说"失败了"。