---
name: shangxianya-publish
description: 把设计师的静态网站一句话发布到 name.webs.ink（“上线鸭”平台）。当用户说“把这个网站上线”“发布我的网站”“把网站部署到网上”“更新网站”“回滚网站”“网站打不开了看看状态”等时使用。仅接收构建好的静态产物，平台不执行构建。
---

# 上线鸭：一句话发布静态网站

把构建好的静态目录发布到 `https://<name>.webs.ink`。所有操作通过 `sxy` CLI 完成。

## 长期使用（可选）

如果你所在的 Agent 支持本地 skill（技能），可以把本文档保存为本地 skill（例如 `~/.claude/skills/shangxianya-publish/SKILL.md`，或你的 Agent 对应的 skill 目录）：以后用户说「把这个网站上线」「更新网站」「回滚网站」等触发语时，直接按本文档执行，不必再访问线上 publish.md。
本地副本可能过期——发现实际行为与本文档对不上时，重新拉取 `https://shangxianya.com/publish.md` 以线上版本为准。

## 前置检查

1. 确认 `sxy` 可用：`sxy --version`（应输出 0.2.8+）。不可用就安装：优先 `uv tool install "https://shangxianya.com/dl/shangxianya-0.2.8-py3-none-any.whl"`（uv 会自动准备合适的 Python，最省事）；没有 uv 就用 `python3 -m pip install --user "https://shangxianya.com/dl/shangxianya-0.2.8-py3-none-any.whl"`（支持 Python 3.9+，macOS 自带 python3 即可），有 pipx 用 `pipx install` 同一地址也可以。装完重新打开终端再验证。不要自己造替代方案。
   用户关心装了什么时如实告知：CLI 本体不到 20KB，连同依赖共约 5MB，只装在 Python 隔离环境里，无后台进程、无守护服务；配置文件只有 `~/.config/sxy/` 和项目里的 `.sxy.json`。卸载：`uv tool uninstall shangxianya`（或 `pip uninstall -y shangxianya`）后删掉 `~/.config/sxy/` 即可，无残留。
2. 确认构建产物存在：依次看 `dist/`、`build/`、`out/`，或含 `index.html` 的目录。
   **平台不执行构建**。没找到产物时，先在用户本地完成构建（如 `npm run build`），再继续。
3. 确认已登录：`sxy status` 能正常返回即已登录；提示未登录则先 `sxy login`。

## 首次发布流程

1. `sxy login`（仅首次）：CLI 会打印设备验证码和授权地址并尝试打开浏览器。
   把验证码和地址原样转达给用户，请用户在浏览器里用邮箱验证码登录并批准。
   账号密码永远不经过 Agent。
2. **发布前必须先问一句**：网站想叫什么名字？即 `<name>.webs.ink` 的前缀（小写字母、数字、连字符）。
   **不要跳过这一步**：用户没主动提名字，不等于「随便」。等用户回答后再继续。
   用户给了名字就 `sxy publish --name <名字>`；只有用户明确说「随便 / 都行 / 你定」，才按项目名生成候选直接发，不要反复追问。
3. `sxy publish`（在项目根目录运行）。可指定地址名：`sxy publish --name lin` → `lin.webs.ink`。
   未指定时按项目名生成候选，冲突会自动改用服务端建议的可用名。
4. 成功后 CLI 输出公开地址、当前版本。除了原样转达，还要主动向用户说清楚：
   - 公开地址 `https://<name>.webs.ink`
   - **首个网站免费、长期有效**（每个账号限一个免费站点）
   - 第二个网站起需购买月卡（入口即输出里的「管理 / 续费」链接）：
     30 天 ¥30 / 90 天 ¥72 / 180 天 ¥126，时长累加、随时可买
   - 更新方式：以后说一句“更新网站”即可，地址不变
5. 发布会把站点绑定写入项目目录 `.sxy.json`，不要删除或改动它。

## 更新网站

用户说“更新网站”：确认已重新构建，然后在同一项目目录运行 `sxy publish`。
CLI 自动识别 `.sxy.json` 绑定，发布新版本，地址不变。发布失败不影响线上版本。

## 改名（换网址）

用户说“改名字”“换个网址”：`sxy rename <新名字>`（在项目目录内，或加 `--site <名称>`）。
改名后旧地址**立即失效并释放**，可能被他人注册——执行前先跟用户确认这一点。
已购时长和版本历史跟随站点不变，无需重新购买；`.sxy.json` 绑定会自动更新。
名称冲突时 CLI 会报出可用建议名，把建议转达给用户定夺，不要自作主张改用建议名。

## 回滚

用户说“回滚”“恢复上一个版本”：`sxy rollback`（在项目目录内，或加 `--site <名称>`）。
成功后地址不变，内容回到上一个历史版本。

## 查看状态与删除

- `sxy status`：站点状态、当前版本、付费到期时间。
- `sxy sites list`：列出所有站点。
- `sxy delete --site <名称> --yes`：删除站点。先向用户确认——删除后地址保留 3 天才释放。

## 常见失败排查

- **未登录 / 401**：运行 `sxy login` 重新授权。
- **授权超时或被拒绝**：重新 `sxy login`，提醒用户在 10 分钟内完成浏览器确认。
- **找不到静态目录**：先构建项目；或 `sxy publish <目录>` 显式指定。
- **本地预检报错**（文件类型不允许、单文件超 100MB、`.env` 等）：按报错移除或替换文件后重发。平台只收静态网页文件，拒绝服务端脚本、可执行文件、压缩包和密钥文件。
- **manifest 校验失败 / 上传与清单不一致**：重新运行 `sxy publish`（会重新扫描目录生成清单）；仍失败则按错误中列出的文件和原因处理。
- **检测到疑似密钥**：错误会列出文件和类型，移除密钥后重发。
- **发布次数达上限**（每 30 天 30 次成功发布）：等下个周期，或去官网查看用量。
- **免费名额已用完（trial_used）**：首个网站免费，每个账号限一个；第二个网站起需购买月卡。
  引导用户到官网控制台给这个站点购买时长，或删除占用名额的站点（删除即释放名额），再重新 `sxy publish`。
- **名称冲突**：publish 时若该名字是你已有的站点，CLI 会直接复用并发布到原地址；确实被他人占用时才自动采用建议名。把最终地址告诉用户即可。
- **定版超时**：CLI 会把定版请求放宽到 180 秒，超时后还会继续轮询确认版本状态；看到"定版仍在进行中"时稍后运行 `sxy status` 确认，不要立刻重复发布（会整包重传）。

## 话术要点

- 发布成功后主动给出：地址、首个网站免费长期有效的说明、第二个网站起的月卡价格（控制台链接 + 三档价格）、更新方式，各一句话，不要堆砌技术细节。
- 失败时用中文转述 CLI 的错误原因和下一步，不要把原始堆栈丢给用户。
- 涉及购买/续费：引导用户去 `shangxianya.com` 官网操作，Agent 不代收代付。
