---
name: deploy-test-env
description: 当用户要求提交代码、更新/部署测试环境时触发。流程：审阅改动→提交前 fetch+pull（冲突即停）→（按需单测）→提交→push 到 origin 同名分支→local_build.sh 构建并推送镜像→更新测试环境→报告结果。
---

# Deploy Test Environment（提交与测试环境部署）

## Activation
- 用户明确要求**提交代码**、**更新测试环境**、**部署测试环境**、**发布到测试环境**、**测试环境部署**、**发测试**、**上线测试**（非生产），或等价本地提交流水线时应用本技能。
- **命中词（任一）**：提交代码 / commit / 本地提交 / 帮我提交 / 更新测试环境 / 部署测试环境 / 发布测试环境 / 测试环境部署 / 发测试 / 部署到测试。
- **排除词（任一）**：仅自测 / 仅开发实现（且未要求提交或部署）；GeeLib 任务闭环优先 → **workflow-hub** 规则 A。
- 激活后首行输出：`[SKILL:deploy-test-env]`。

## 门禁
- **失败即停**：任一步失败则停止并汇报 `FAIL`。
- **审阅阻断**：阶段 1 发现明显逻辑错误、安全隐患、误改无关文件、或将提交密钥/`.env` 等敏感内容时，**不得**进入后续步骤，立即 `FAIL` 并说明原因。
- **不破坏性 git**：禁止危险 git 操作（如 `push --force`、硬重置他人历史等）。
- **提交前同步**：必须先 `fetch` 再 `pull` 与远端**同名跟踪分支**对齐；**出现合并冲突则立即停止** `FAIL`，不得自动解决冲突。
- **提交后推送**：在通过审阅且本地提交成功后，将当前分支 `push` 到 `origin` 的**同名分支**（与 `git rev-parse --abbrev-ref HEAD` 一致）；推送失败按 `FAIL` 处理并汇报。
- **不提交敏感文件**：`.env`、`*.pem`、`*.key`、`credentials.json` 等；禁止暂存或提交密钥类内容。
- **长任务前**：检查已有终端，避免重复后台 Docker/构建进程。

## 阶段（顺序执行）

| 阶段 | 内容 | 通过条件 |
|------|------|----------|
| 1 | 审阅改动 | `git status`、`git diff`（及必要时的 `git diff --staged`）；结论为可继续；有阻断问题则停止 |
| 2 | 提交前同步 | `git fetch --all --prune` 后 `git pull`（与当前分支上游同名分支对齐）；**有合并冲突或非零退出且存在冲突标记则立即停止** `FAIL` |
| 3 | 单测（按需） | 用户明确要求跑单元测试时执行 `go test ./...`（可缩小范围）；未要求则跳过并注明 |
| 4 | 提交代码 | 检视后仅暂存相关文件；heredoc 提交信息；无待提交改动则「跳过提交」并进入阶段 5 |
| 5 | 推送同名分支 | 阶段 4 完成后：`git push origin "$(git rev-parse --abbrev-ref HEAD)"`（推当前分支到 `origin` 同名 ref；已是最新则通常显示 up-to-date，仍记 `PASS`）；失败则 `FAIL` |
| 6 | 构建镜像 | `bash ./local_build.sh <model>` 成功；`<model>` 为 `cmd/<model>/main.go` 目录名；未指定时从改动路径推断或向用户确认；环境不适合 Docker 推送时与用户约定是否仅 `go build` 等替代 |
| 7 | 更新测试环境 | 使用项目约定的测试环境发布方式（如部署平台/Jenkins/发布脚本）将阶段 6 产物发布到目标测试环境；发布失败则 `FAIL`，不得跳过 |
| 8 | 报告结果 | 分支、commit（若有）、镜像名/标签、测试环境更新结果、关键日志摘要、整体 `PASS`/`FAIL` |

## 输出约定
- 阶段 1～8 每步标注 `PASS`/`FAIL`（阶段 3 可写 `PASS（跳过）`）；`FAIL` 时给出命令、关键错误行、建议下一步。
- **命令与提交格式细则**：同目录 **`reference.md`**；阶段 6 以仓库根目录 **`local_build.sh`** 为准；阶段 7 以团队当前测试环境发布链路为准。

## 与 self-test-flow
- 本技能中的 `go test` 与 **self-test-flow** 的联调/落库校验**不是**同一回事；联调报告按 **self-test-flow** 单独执行。

## 执行回执（每次进入本技能都要输出）
- `已命中技能`：deploy-test-env
- `命中关键词`：列出触发词
- `已加载文档`：`packages/agent/skills-runtime/deploy-test-env/SKILL.md`、`packages/agent/skills-runtime/deploy-test-env/reference.md`
- `阶段状态`：阶段 1～8 的已完成、进行中、待执行
