From 10873e78873318dd649b5300ee22b208ef87d813 Mon Sep 17 00:00:00 2001 From: Dream Hunter Date: Sat, 7 Mar 2026 01:36:19 +0800 Subject: [PATCH] feat: add release skill for automated GitHub release (#879) * feat: add release skill for automated GitHub release creation Co-Authored-By: Claude Opus 4.6 * fix: use --notes-file instead of --notes for release creation Co-Authored-By: Claude Opus 4.6 * fix: add time-bound filter for PR collection in release skill Co-Authored-By: Claude Opus 4.6 * fix: use hyphenated cache-clearing in release skill Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- .claude/skills/release/SKILL.md | 27 ++++++++++++ .../release/references/release-template.md | 42 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 .claude/skills/release/SKILL.md create mode 100644 .claude/skills/release/references/release-template.md diff --git a/.claude/skills/release/SKILL.md b/.claude/skills/release/SKILL.md new file mode 100644 index 00000000..1d227c85 --- /dev/null +++ b/.claude/skills/release/SKILL.md @@ -0,0 +1,27 @@ +--- +name: release +description: Create a GitHub release for cloudflare_temp_email project. Use when the user asks to create a release, publish a version, tag a release, or make a new release. Reads CHANGELOG.md for release content, collects merged PRs via `gh` CLI, and creates a properly formatted GitHub release. +--- + +# Release Workflow + +## Steps + +1. **Read version**: Get current version from `worker/package.json` (`"version"` field) and the latest release tag via `gh release list --limit 1`. +2. **Read CHANGELOG**: Read `CHANGELOG.md` for the current version section (e.g. `## v1.4.0(main)`). Verify content matches `CHANGELOG_EN.md`. If entries are missing from either file, notify the user. +3. **Collect PRs**: Get the last release tag timestamp, then filter merged PRs by time: + ```bash + TAG="$(gh release list --limit 1 --json tagName --jq '.[0].tagName')" + SINCE="$(git show -s --format=%cI "$TAG")" + gh pr list --state merged --search "is:pr is:merged merged:>$SINCE base:main" --json number,title,author --limit 200 + ``` + Sort by PR number ascending. +4. **Compose release body**: Follow the template in [references/release-template.md](references/release-template.md). Key rules: + - Copy changelog sections verbatim (Features, Bug Fixes, Testing, Improvements). Omit empty sections. + - Wrap PRs list in `
PRs...
`. + - Always include the cache-clearing discussion link. + - End with `**Full Changelog**` comparison link. +5. **Create release**: + - Write body to a temp file (e.g. `/tmp/release-notes.md`) + - Run: `gh release create vX.Y.Z --title "vX.Y.Z" --notes-file /tmp/release-notes.md --target main` +6. **Verify**: Confirm the release URL and ask the user to review. diff --git a/.claude/skills/release/references/release-template.md b/.claude/skills/release/references/release-template.md new file mode 100644 index 00000000..57f1b535 --- /dev/null +++ b/.claude/skills/release/references/release-template.md @@ -0,0 +1,42 @@ +# Release Notes Template + +Release notes body 使用以下格式,内容从 CHANGELOG.md 的对应版本段落提取: + +```markdown +## What's Changed + +### Features + +- feat: |模块| 描述 + +### Bug Fixes + +- fix: |模块| 描述 + +### Testing + +- test: |模块| 描述 + +### Improvements + +- style/refactor/perf/docs: |模块| 描述 + +### [更新或者部署网页不生效请如图勾选清理缓存](https://github.com/dreamhunter2333/cloudflare_temp_email/discussions/487) + +
+PRs + +* PR title by @author in https://github.com/dreamhunter2333/cloudflare_temp_email/pull/NUMBER + +
+ +**Full Changelog**: https://github.com/dreamhunter2333/cloudflare_temp_email/compare/vOLD...vNEW +``` + +## Notes + +- Sections without entries should be omitted +- PRs section uses `
` to collapse by default +- PRs are sorted by PR number ascending +- The cache clearing discussion link is always included +- Release title and tag use format `vX.Y.Z`