cli-release
This skill should be used when the user asks to "release the CLI", "prepare a CLI release", "publish a new CLI version", "cut a CLI release", "do a release", "bump the CLI version", or mentions the CLI release checklist or release process. Guides through the full OpenHands CLI release workflow from version bump to binary publication, emphasizing human checkpoints.
来源信息
- 仓库
- OpenHands/OpenHands-CLI
- 最近来源活动
- 2026年4月6日 13:25
- 检测到的 SKILL.md 语言
- 英语
- 星标
- 263
- 分支
- 120
安装方式
默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。
检查来源文件
决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。
文件资源管理器
2 个文件正在显示 SKILL.md
SKILL.md
来源说明 · 只读预览- name
- cli-release
- description
- This skill should be used when the user asks to "release the CLI", "prepare a CLI release", "publish a new CLI version", "cut a CLI release", "do a release", "bump the CLI version", or mentions the CLI release checklist or release process. Guides through the full OpenHands CLI release workflow from version bump to binary publication, emphasizing human checkpoints.
# CLI Release Guide
This skill walks through the OpenHands CLI release process step by step.
> **🚨 CRITICAL**: NEVER merge the release PR, create/push tags, or publish
> a GitHub release without the human's explicit approval. Release is the
> last line of human defense. Always present the current status and ask for
> confirmation before performing any irreversible action.
> **⚠️ Tag format**: This project uses tags **without** a `v` prefix
> (e.g., `1.13.0`, not `v1.13.0`).
## Phase 1: Trigger the Version Bump Workflow
Determine the target version (SemVer `X.Y.Z`). Then trigger the
`bump-version.yml` workflow, which creates a branch and draft PR
automatically.
### Via GitHub UI
Navigate to
<https://github.com/OpenHands/OpenHands-CLI/actions/workflows/bump-version.yml>,
click **Run workflow**, enter the version (e.g., `1.14.0`), and run it.
### Via GitHub API
```bash
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/OpenHands/OpenHands-CLI/actions/workflows/bump-version.yml/dispatches" \
-d '{
"ref": "main",
"inputs": {
"version": "<version>"
}
}'
```
The workflow will:
1. Validate version format (`X.Y.Z`)
2. Create branch `bump-version-<version>`
3. Update version in `pyproject.toml`
4. Regenerate `uv.lock`
5. Update snapshot tests (version appears in splash screen SVGs)
6. Open a draft PR titled **"Bump version to \<version\>"**
Once the workflow completes, retrieve the PR number for later phases:
```bash
gh pr list --repo OpenHands/OpenHands-CLI \
--head "bump-version-<version>" --json number,title,url
```
## Phase 2: Wait for CI — Tests Must Pass
The bump PR triggers the standard CI suite. **All checks must pass.**
Monitor status:
```bash
gh pr checks <PR_NUMBER> --repo OpenHands/OpenHands-CLI
```
Key checks to verify:
- Lint
- Unit / integration tests
- Snapshot tests (updated by the bump workflow)
- Binary build
### ⏸ Checkpoint — Human Judgment on Failures
Decide with the team whether each failure is:
- **Blocking** — must fix before release
- **Known / pre-existing** — acceptable to release with a follow-up issue
- **Flaky** — re-run the workflow
Re-run failed jobs:
```bash
gh run list --repo OpenHands/OpenHands-CLI \
--branch "bump-version-<version>" --limit 5
gh run rerun <RUN_ID> --repo OpenHands/OpenHands-CLI --failed
```
## Phase 3: Tag the Release
> **🚨 STOP — Do NOT tag without explicit human approval.**
> Present the CI status summary and ask the human to confirm.
Tag the latest commit on the version bump branch. **No `v` prefix.**
```bash
git fetch origin
git checkout bump-version-<version>
git reset --hard origin/bump-version-<version> # ensure we're at latest
# verify tag doesn't already exist
if git rev-parse <version> >/dev/null 2>&1; then
echo "Error: Tag <version> already exists"
exit 1
fi
git tag <version>
git push origin --tags
```
Pushing the tag triggers two automated workflows:
- **`cli-build-binary-and-optionally-release.yml`** — builds platform
binaries and creates a **draft** GitHub release with assets
- **`pypi-release.yml`** — builds and publishes the `openhands` package
to PyPI
## Phase 4: Merge the PR
> **🚨 STOP — Do NOT merge without explicit human approval.**
Wait for CI to complete after tagging. Verify all checks passed, then merge:
```bash
gh pr checks <PR_NUMBER> --repo OpenHands/OpenHands-CLI
gh pr merge <PR_NUMBER> --repo OpenHands/OpenHands-CLI --merge
```
## Phase 5: Edit and Publish the GitHub Release
> **🚨 STOP — Do NOT publish without explicit human approval.**
> Publishing finalises the release for users.
Navigate to <https://github.com/OpenHands/OpenHands-CLI/releases> and
edit the draft release created by CI:
1. Click **Auto-generate release notes** (or write custom notes)
2. Review the notes
3. Click **Publish release**
### ⏸ Checkpoint — Verify Release Assets
After publishing, confirm all platform binaries were uploaded:
| Platform | Asset name |
|----------|-----------|
| Linux x86_64 | `openhands-linux-x86_64` |
| Linux ARM64 | `openhands-linux-arm64` |
| macOS Apple Silicon | `openhands-macos-arm64` |
| macOS Intel | `openhands-macos-intel` |
```bash
gh release view <version> --repo OpenHands/OpenHands-CLI --json assets \
--jq '.assets[].name'
```
### ⏸ Checkpoint — Verify PyPI Publication
```bash
curl -s -o /dev/null -w "openhands: %{http_code}\n" \
"https://pypi.org/pypi/openhands/<version>/json"
```
Should return `200`. Allow a few minutes for PyPI indexing.
## Phase 6: Update Install Website
After publishing the release, wait a couple of minutes. The
`update-install-website.yml` workflow automatically opens a PR in
[install-openhands-website](https://github.com/All-Hands-AI/install-openhands-website).
```bash
gh pr list --repo All-Hands-AI/install-openhands-website \
--search "update-version-<version>" --json number,title,url
```
Approve and merge the PR so users get the latest version via:
```bash
curl -fsSL https://install.openhands.dev/install.sh | sh
```
If the automated PR was not created, trigger the workflow manually:
```bash
curl -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/OpenHands/OpenHands-CLI/actions/workflows/update-install-website.yml/dispatches" \
-d '{
"ref": "main",
"inputs": {
"version": "<version>"
}
}'
```
## Phase 7: Post-Release — Notify the Team
Compose a Slack message for the human to post:
```
🚀 *CLI v<version> released!*
• PyPI: https://pypi.org/project/openhands/<version>/
• Release: https://github.com/OpenHands/OpenHands-CLI/releases/tag/<version>
• Install website PR: https://github.com/All-Hands-AI/install-openhands-website/pulls
```
See `references/post-release-checklist.md` for additional verification
steps and troubleshooting.
## Quick Reference — Full Checklist
- [ ] Trigger `bump-version.yml` with target version
- [ ] All CI checks pass on the bump PR
- [ ] **🚨 Get human approval**, then tag the release (no `v` prefix)
- [ ] **🚨 Get human approval**, then merge the PR
- [ ] **🚨 Get human approval**, then publish the GitHub release
- [ ] Verify platform binaries are attached to the release
- [ ] Verify `openhands` package is available on PyPI
- [ ] Approve and merge the install website PR
- [ ] Notify the team on Slack
在 GitHub 查看