# 安装与更新 DrowUp Skill

Skill zip **自带** `{baseDir}/bin/drowup.exe`（exe 仍可在 zip 里）。CLI 不含浏览器驱动。上架时读官方指纹插件 `@drowup/dsh-fingerprint` 写出的 `$DSH_HOME/drowup-fingerprint/playwright-core-path`（装上架员工会自动拉取）；也可设 `DROWUP_PLAYWRIGHT_PATH`。

登录凭据在 **`%APPDATA%\drowup\oauth.json`**（macOS / Linux 为 `~/.drowup/oauth.json`），不在技能包目录里。整目录替换技能包 **不会** 丢掉登录。

## 版本入口（权威来源）

最新版本号和 skill zip URL 由 OSS CDN 清单下发，**直接用字段里的绝对 HTTPS URL，不要手拼旧路径**：

`https://static.drowup.com/skills/drowup-skill.json`

官网 `/cli` 安装提示词与下载按钮也指向同一对 CDN 地址，不跟页面 origin 走。

```json
{
  "version": "1.1.4",
  "skill": "https://static.drowup.com/skills/drowup-skill.zip"
}
```

| 字段 | 含义 |
| --- | --- |
| `version` | 该 zip 的版本号 |
| `skill` | zip 下载地址。必须是绝对 HTTPS URL |

Agent 从官网 `/cli` 拿到的安装提示里已经带 zip URL，首次安装可以不读清单。**更新必须先读清单**，避免还在下旧 zip。

## 首次安装

1. 下载官方 zip（URL 不含密钥）。解压后顶层目录必须名为 `drowup`。
2. 放到**当前这个 Agent 的 skill 目录**：含这份 `SKILL.md` 的文件夹，路径记为 `{baseDir}` / `$SkillDir`。不同 Agent 各自有目录；没有「必须同时装 Cursor 和 Codex」这种清单。
3. 确认 `bin/drowup.exe` 存在。浏览器驱动来自指纹插件，不随 CLI 分发。
4. 登录。用户已经交代任务就立刻做，不要先 doctor：

```powershell
"{baseDir}/bin/drowup.exe" login
```

把终端打印的授权链接发给用户打开。不要粘贴 API Key。

## 更新 / 整目录替换

`unzip -o` 和 `Expand-Archive -Force` **只会覆盖同名文件**，新版本已经删掉的旧文件会留下。所以更新必须 **先删再解压**，让目录和 zip **严格 1:1**。

**不要在技能包目录里执行替换**（当前工作目录锁着文件夹时，Windows 删不掉）。在仓库或用户主目录跑。

### 步骤

1. 请求 `https://static.drowup.com/skills/drowup-skill.json`，取 `skill` 字段得到 zip URL。
2. 把 zip 下到系统临时目录。
3. **删除** 当前 `drowup` 技能包目录（整个文件夹，不是清空后覆盖）。
4. 把 zip **解压到父目录**（skills 目录）。zip 条目带 `drowup/` 前缀，解压后会重新得到 `drowup/SKILL.md`。
5. 确认 `SKILL.md`、`bin/drowup.exe` 都在。
6. 怀疑环境坏了再跑 `doctor --json`。不必重新登录。

也可以在父目录执行包内脚本（脚本会自己先下载再删目录）。`$SkillDir` 填当前这份 skill 的绝对路径，不要抄成某个产品的固定目录：

```powershell
# 先离开技能包目录
$SkillDir = '<当前 Agent 的 drowup 目录>'
cd $HOME
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
& "$SkillDir\install\install-drowup-cli.ps1" `
  -SkillDir $SkillDir `
  -ManifestUrl "https://static.drowup.com/skills/drowup-skill.json"
```

```bash
# macOS / Linux：先离开技能包目录
SKILL_DIR='<当前 Agent 的 drowup 目录>'
cd "$HOME"
bash "$SKILL_DIR/install/install-drowup-cli.sh" \
  --skill-dir "$SKILL_DIR" \
  --manifest-url "https://static.drowup.com/skills/drowup-skill.json"
```

### 手动命令（Windows）

```powershell
$SkillDir = '<当前 Agent 的 drowup 目录>'
$ManifestUrl = 'https://static.drowup.com/skills/drowup-skill.json'
$manifest = Invoke-RestMethod -Uri $ManifestUrl -UseBasicParsing
$skillUrl = $manifest.skill
if ($skillUrl -notmatch '^https?://') {
  $skillUrl = [Uri]::new($ManifestUrl, $skillUrl).AbsoluteUri
}
Invoke-WebRequest -Uri $skillUrl -OutFile "$env:TEMP\drowup-skill.zip"
$parent = Split-Path $SkillDir -Parent
Remove-Item -Recurse -Force $SkillDir
Expand-Archive -Path "$env:TEMP\drowup-skill.zip" -DestinationPath $parent
```

### 手动命令（macOS / Linux）

```bash
SKILL_DIR="<当前 Agent 的 drowup 目录>"
MANIFEST_URL="https://static.drowup.com/skills/drowup-skill.json"
SKILL_URL="$(curl -fsSL "$MANIFEST_URL" | python -c "import json,sys; print(json.load(sys.stdin)['skill'])")"
case "$SKILL_URL" in
  http://*|https://*) ;;
  *) SKILL_URL="${MANIFEST_URL%/*}/drowup-skill.zip" ;;
esac
curl -fL -o /tmp/drowup-skill.zip "$SKILL_URL"
rm -rf "$SKILL_DIR"
mkdir -p "$(dirname "$SKILL_DIR")"
unzip -q /tmp/drowup-skill.zip -d "$(dirname "$SKILL_DIR")"
```

官方清单的 `skill` 是绝对 HTTPS URL。若遇到旧的相对路径，用清单 origin 拼接，不要猜版本号。

## 不要做

- 不要只对现有 `drowup` 文件夹覆盖解压
- 不要把 zip 解压进 `drowup` 里面变成 `drowup/drowup/SKILL.md`
- 不要清 `%APPDATA%\drowup` 或 `~/.drowup`（那是登录态）
- 不要把本仓库开发目录 `skills/drowup/` 当成用户安装目录删掉
