release-har
npx skills add https://github.com/chachamaru127/claude-code-harness --skill release-har
Agent 安装分布
Skill 文档
Release Har Skill
Universal release automation skill. Works with any project.
Quick Reference
- “release” â
/release-har - “bump version” â
/release-har patch - “minor release” â
/release-har minor - “preview only” â
/release-har --dry-run
References
| Document | å 容 |
|---|---|
| references/release-notes-template.md | GitHub Release Notes ãã³ãã¬ã¼ãï¼4ã»ã¯ã·ã§ã³æ§é ï¼ |
| references/changelog-format.md | CHANGELOG.md ãã©ã¼ãããï¼Keep a Changelog æºæ ï¼ |
| .claude/rules/github-release.md | Release Notes ãã©ã¼ãããã«ã¼ã«ï¼æ£æ¬ï¼ |
Branch Policy
åç¬éçºããã¸ã§ã¯ãã§ã¯ main ã¸ã®ç´æ¥ push ã許容ããã
- CI ã
push: branches: [main]ã§å ¨æ¤è¨¼ãå®è¡ãããããPR ãªãã§ãå質ã²ã¼ãã¯æ©è½ãã release.ymlãv*ã¿ã° push æã« GitHub Release ã®åå¨ãä¿è¨¼ããã»ã¼ããã£ãããã¨ãã¦åä½ãã- force pushï¼
--force/--force-with-leaseï¼ã¯ç¦æ¢
å ±åéçºè ãããããã¸ã§ã¯ãã§ã¯ãPR çµç±ã®ãã¼ã¸ã«åãæ¿ãããã¨ã
Execution Flow
Pre-flight: äºåãã§ãã¯ï¼å¿ é ï¼
ãªãªã¼ã¹éå§åã«ä»¥ä¸ã確èªããã失æããå ´åã¯ãªãªã¼ã¹ã忢ãä¿®æ£ãä¿ãã
# 1. gh ã³ãã³ãã®åå¨ç¢ºèª
if ! command -v gh &>/dev/null; then
echo "â ï¸ gh ã³ãã³ããè¦ã¤ããã¾ãããGitHub Release ã®ä½æã¯ã¹ããããã¾ãã"
GH_AVAILABLE=false
else
GH_AVAILABLE=true
fi
# 2. æªã³ããã夿´ã®ç¢ºèª
if ! git diff --quiet || ! git diff --cached --quiet; then
echo "â æªã³ãããã®å¤æ´ãããã¾ããã³ãããã¾ãã¯ã¹ã¿ãã·ã¥å¾ã«ãªãªã¼ã¹ãã¦ãã ããã"
git status --short
exit 1
fi
# 3. ãã¼ã¸ã§ã³ãã¡ã¤ã«åæç¢ºèªï¼VERSION 㨠plugin.json ãåå¨ããå ´åï¼
if [ -f "VERSION" ] && [ -f ".claude-plugin/plugin.json" ]; then
V_VERSION=$(cat VERSION | tr -d '[:space:]')
V_PLUGIN=$(grep '"version"' .claude-plugin/plugin.json | sed 's/.*"version": "\([^"]*\)".*/\1/')
if [ "$V_VERSION" != "$V_PLUGIN" ]; then
echo "â ãã¼ã¸ã§ã³ä¸ä¸è´: VERSION=$V_VERSION, plugin.json=$V_PLUGIN"
echo " ä¿®æ£: ./scripts/sync-version.sh sync"
exit 1
fi
fi
| ãã§ã㯠| 失ææã®åä½ |
|---|---|
| gh ã³ãã³ãåå¨ | è¦åã®ã¿ã»ç¶è¡ï¼GitHub Release ã®ã¿ã¹ãããï¼ |
| æªã³ããã夿´ | 忢ï¼ã³ãããã¾ãã¯ã¹ã¿ãã·ã¥ãä¿ãï¼ |
| ãã¼ã¸ã§ã³ãã¡ã¤ã«åæ | 忢ï¼sync-version.sh sync ãä¿ãï¼ |
Step 1: 夿´åæ
以ä¸ã並ååå¾ããã
# åã¿ã°ãåå¾
PREV_TAG=$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null \
|| git tag --sort=-v:refname | head -1 2>/dev/null \
|| echo "")
# æ§é åã³ããããã°ï¼ãã©ã¼ããã: {hash}|{subject}|{author}|{date}ï¼
if [ -n "$PREV_TAG" ]; then
LOG=$(git log --format="%h|%s|%an|%ad" --date=short "${PREV_TAG}..HEAD")
else
LOG=$(git log --format="%h|%s|%an|%ad" --date=short --all | head -20)
fi
# OWNER/REPO åå¾ï¼gh åªå
â git remote ãã©ã¼ã«ããã¯ï¼
if command -v gh &>/dev/null; then
REPO_FULL=$(gh repo view --json nameWithOwner -q '.nameWithOwner' 2>/dev/null || echo "")
fi
if [ -z "${REPO_FULL:-}" ]; then
REMOTE_URL=$(git remote get-url origin 2>/dev/null || echo "")
REPO_FULL=$(echo "$REMOTE_URL" \
| sed -E 's|https://github\.com/||; s|git@github\.com:||; s|\.git$||')
fi
Conventional Commits åé¡
| Prefix | CHANGELOG ã«ãã´ãª |
|---|---|
feat: / feat(...): |
Added |
fix: / fix(...): |
Fixed |
docs: / perf: / refactor: / test: / chore: |
Changed |
| ãã®ä» / åé¡ä¸è½ | Changed |
BREAKING CHANGE æ¤åº: feat!: / fix!: çã® ! ä»ãã¿ã¤ããã¾ãã¯æ¬æã« BREAKING CHANGE: ãå«ãã³ãããã
Conventional Commits ã使ã£ã¦ããªãããã¸ã§ã¯ãã§ã¯ãClaude ãã³ãããã¡ãã»ã¼ã¸ãæå³çã«å¤æãã¦åé¡ããã
夿´åæãµããªè¡¨ç¤º
ð 夿´åæãµã㪠(vPREV â vNEWåè£)
âââââââââââââââââââââââââ
- feat : N ä»¶ â Added
- fix : M ä»¶ â Fixed
- other : L ä»¶ â Changed
- breaking : K ä»¶ â Breaking Changes â ï¸
âââââââââââââââââââââââââââââââââ
- contributors: X å
- compare: https://github.com/{OWNER}/{REPO}/compare/{PREV_TAG}...HEAD
âââââââââââââââââââââââââ
Step 2: SemVer å¤å®
Step 1 ã®åæçµæã«åºã¥ãã¦ãã¼ã¸ã§ã³ãææ¡ããã
PREV_VERSION=${PREV_TAG#v} # "v1.2.3" â "1.2.3"
MAJOR=$(echo "$PREV_VERSION" | cut -d. -f1)
MINOR=$(echo "$PREV_VERSION" | cut -d. -f2)
PATCH=$(echo "$PREV_VERSION" | cut -d. -f3)
if [ "${BREAKING_COUNT:-0}" -ge 1 ]; then
SUGGESTED_VERSION="$((MAJOR+1)).0.0" # major
elif [ "${FEAT_COUNT:-0}" -ge 1 ]; then
SUGGESTED_VERSION="${MAJOR}.$((MINOR+1)).0" # minor
else
SUGGESTED_VERSION="${MAJOR}.${MINOR}.$((PATCH+1))" # patch
fi
表示ä¾: ð¦ SemVer å¤å®: MINOR (1.2.3 â 1.3.0) çç±: feat: 3ä»¶, fix: 2ä»¶, breaking: 0ä»¶
| 弿° | åä½ |
|---|---|
/release-har patch |
確èªãªãã§ PATCH æ¡ç¨ |
/release-har minor |
確èªãªãã§ MINOR æ¡ç¨ |
/release-har major |
確èªãªãã§ MAJOR æ¡ç¨ |
| 弿°ãªã | èªåå¤å®çµæã表示ããã¦ã¼ã¶ã¼ã«ç¢ºèª |
0.x.y åæéçºæ®µé: MAJOR=0 ã®å ´å㯠SemVer 2.0.0 §4 ã«å¾ããbreaking change ã§ã minor ãã³ã (0.x+1.0) ã¾ã㯠major (1.0.0) ãã¦ã¼ã¶ã¼ã«é¸æãããã
Step 3: diff è¦ç´ & Release Notes è稿çæ
ã³ãããã¡ãã»ã¼ã¸ã ãã§ãªãå®éã®ã³ã¼ãå·®åãèªã¿ãHighlights 㨠Before/After ãã¼ãã«ãçæããã
# 夿´ãã¡ã¤ã«ã確èªï¼ãã¹ãã»ããã¯ãã¡ã¤ã«ã¯ä½åªå
ï¼
git diff --stat "${PREV_TAG}..HEAD"
# éè¦ãã¡ã¤ã«ã® diff ãèªãï¼src/ é
ä¸ãåªå
ï¼
git diff "${PREV_TAG}..HEAD" -- <éè¦ãã¡ã¤ã«ãã¹> | head -100
Claude ãçæãããã®ï¼æå¤§3ä»¶ï¼:
- Highlights: ã¦ã¼ã¶ã¼è¦ç¹ã§ã®ä¾¡å¤ï¼1-3æï¼
- Before / After ãã¼ãã«: 夿´åå¾ã®ç¶æ
ãã³ãã¬ã¼ã詳細: references/release-notes-template.md
Step 4: dry-run ãã¬ãã¥ã¼ï¼ããã©ã«ãåæ®µï¼
æ¬å®è¡åã«å¿
ããã¬ãã¥ã¼ã表示ããï¼--dry-run ãªãé常å®è¡ã§ãåæ§ï¼ã
ââââââââââââââââââââââââââââââââ
ð ãªãªã¼ã¹ãã¬ãã¥ã¼: v{PREV} â v{NEW}
ââââââââââââââââââââââââââââââââ
ð¦ ã¿ã°: vX.Y.Z
ð æ´æ°ãã¡ã¤ã«: CHANGELOG.md, VERSION, package.jsonï¼åå¨ããå ´åï¼
ð CHANGELOG ã¨ã³ããªï¼å
¨æï¼:
{CHANGELOG ã¨ã³ããª}
ð§¹ Documentation Cleanup:
CHANGELOG: {æ£è¦å対象 N ä»¶}ï¼æ¥ä»ãã©ã¼ããããã»ã¯ã·ã§ã³è¦åºãçï¼
README: {æ´æ°å¯¾è±¡ M ä»¶}ï¼ãã¼ã¸ã§ã³åç
§ãæ©è½ä¸è¦§çï¼
ð GitHub Release Notesï¼å
¨æï¼:
{4ã»ã¯ã·ã§ã³æ§é ã® Release Notes}
ð Compare URL: {COMPARE_URL}
ââââââââââââââââââââââââââââââââ
ãã®å
容ã§å®è¡ãã¾ããï¼ (yes / no / ä¿®æ£æç¤º)
| åç | åä½ |
|---|---|
yes |
Step 5 以éã®æ¬å®è¡ã¸ |
no |
䏿¢ |
| ä¿®æ£æç¤º | Release Notes ãä¿®æ£ãã¦åãã¬ãã¥ã¼ |
--dry-run ãªãã·ã§ã³æ: ãã¬ãã¥ã¼å¾ã«çµäºï¼æ¬å®è¡ãªãï¼ã
Step 5: CHANGELOG æ´æ°ï¼åå¨ããå ´åï¼
CHANGELOG.md ãããã°æ´æ°ããããã©ã¼ããã詳細: references/changelog-format.md
## [X.Y.Z] - YYYY-MM-DD
### ð¯ What's Changed for You
**{one-line ããªã¥ã¼è¦ç´}**
| Before | After |
|--------|-------|
| {æ§ç¶æ
} | {æ°ç¶æ
} |
### Added
- **{Feature}**: {description}
### Fixed
- **{Fix}**: {description}
CHANGELOG_ja.md ãåå¨ããå ´åã¯åå å®¹ãæ¥æ¬èªã§æ´æ°ããã
CHANGELOG ãåå¨ããªãå ´åã¯ã¹ãããã
Step 5.5: Documentation Cleanupï¼æ¢åããã¥ã¡ã³ãæ´åï¼
ãªãªã¼ã¹ã®ã¿ã¤ãã³ã°ã§ãæ¢åããã¥ã¡ã³ãã®åè³ªãæ´ãããæ°è¦ã¨ã³ããªã®è¿½å ã ãã§ãªããéå»ã®æ±ããä¿®æ£ããã
CHANGELOG æ¢åã¨ã³ããªã®æ£è¦å
éå»ã¨ã³ããªã Keep a Changelog 1.1.0 ã«æºæ ãã¦ããªãå ´åãæ£è¦åããã
| ãã§ãã¯é ç® | ä¿®æ£ä¾ |
|---|---|
| æ¥ä»ãã©ã¼ããã | 2026/02/23 â 2026-02-23 (ISO 8601) |
| ã»ã¯ã·ã§ã³è¦åºã | ### New Features â ### Added |
| 空ã»ã¯ã·ã§ã³ | å 容ã®ãªãè¦åºããåé¤ |
| ãªã³ã¯åã | Compare URL ã®ã¿ã°åä¿®æ£ |
| ãã¼ã¯ãã¦ã³æ§æ | ãã¼ãã«å´©ãããªã¹ãè¨æ³ã®çµ±ä¸ |
CHANGELOG_ja.md ãåå¨ããå ´åãåçã®æ´åã宿½ããã
README ã®æ´æ°
| ãã§ãã¯é ç® | ä¿®æ£å 容 |
|---|---|
| ãã¼ã¸ã§ã³çªå· | ããã¸ãã¤ã³ã¹ãã¼ã«ä¾ãåç §ãæ°ãã¼ã¸ã§ã³ã«æ´æ° |
| æ©è½ä¸è¦§ | 宿 ã¨ä¹é¢ãã¦ããè¨è¿°ãä¿®æ£ |
| ã³ãã³ã/API ä¾ | 廿¢ã»å¤æ´ããããã®ãæ´æ° |
| ãªã³ã¯åã | åå¨ããªããã¡ã¤ã«ã¸ã®ãªã³ã¯ãä¿®æ£ |
å¤æåºæº: æããã«å¤ãã»å£ãã¦ããç®æã®ã¿ä¿®æ£ãããæå³çãªã¹ã¿ã¤ã«ã®éãã¯å°éãããREADME ãåå¨ããªãå ´åã¯ã¹ãããã
Step 6: ãã¼ã¸ã§ã³ãã¡ã¤ã«æ´æ°
ããã¸ã§ã¯ãã«å¿ãã¦ãã¼ã¸ã§ã³ãæ´æ°ããã
| ãã¡ã¤ã« | æ´æ°æ¹æ³ |
|---|---|
VERSION |
ãã¡ã¤ã«å 容ãç´æ¥æ¸ãæã |
package.json |
"version": "X.Y.Z" ãæ´æ° |
pyproject.toml |
version = "X.Y.Z" ãæ´æ° |
Cargo.toml |
version = "X.Y.Z" ãæ´æ° |
.claude-plugin/plugin.json |
./scripts/sync-version.sh sync ãå®è¡ |
該å½ãã¡ã¤ã«ãåå¨ããªãå ´åã¯ã¹ãããã
Node.js ããã¸ã§ã¯ã: npm version patch --no-git-tag-version ãå©ç¨å¯ã
Step 7: ã³ããã & ã¿ã°
# 夿´å¯¾è±¡ãã¡ã¤ã«ã®ã¿æç¤ºçã«è¿½å ï¼git add -A ã¯ä½¿ç¨ããªãï¼
git add CHANGELOG.md README.md VERSION package.json # å®éã«å¤æ´ãããã¡ã¤ã«ã®ã¿
# ã³ãããï¼å¤æ´ãããå ´åã®ã¿ï¼
git commit -m "chore: release vX.Y.Z"
# ã¿ã°ä½æ
git tag -a vX.Y.Z -m "Release vX.Y.Z"
Step 8: Push
git push origin $(git branch --show-current)
git push origin vX.Y.Z
Step 9: GitHub Releaseï¼ãªãã·ã§ã³ï¼
ã¦ã¼ã¶ã¼ç¢ºèªå¾ã« GitHub Release ã使ãããRelease Notes ã¯è±èªå¿ é ã
gh release create vX.Y.Z \
--title "vX.Y.Z - {release title}" \
--notes "$(cat <<'EOF'
## What's Changed
**{one-line ããªã¥ã¼è¦ç´}**
### Before / After
| Before | After |
|--------|-------|
| {æ§ç¶æ
} | {æ°ç¶æ
} |
---
## Highlights
- **{Feature}**: {description}
## Notable Changes
### Added
- **{feature}**: {description}
### Fixed
- **{fix}**: {description}
## Full Changelog
**Full Changelog**: ${COMPARE_URL}
---
Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
ãã©ã¼ãããã«ã¼ã«: .claude/rules/github-release.md ãã³ãã¬ã¼ã詳細: references/release-notes-template.md
å¿ é äºé :
- Release Notes ã¯è±èª
- Before/After ãã¼ãã«ã¯çç¥ä¸å¯
Generated with [Claude Code](https://claude.com/claude-code)ããã¿ã¼ã¯çç¥ä¸å¯- Breaking Changes ããªãå ´åã¯ãã®ã»ã¯ã·ã§ã³ãçç¥
- Highlights ã¯æå¤§3ä»¶
Step 10: X (Twitter) åç¥æçæï¼--announce æå®æã®ã¿ï¼
/release-har --announce ã§å®è¡ããå ´åãGitHub Release 使å¾ã« X åãåç¥æãèªåçæããã
çæãã¸ãã¯
Step 3ï¼diff è¦ç´ï¼ã§çæãã Highlights ã®ãã¡æãéè¦ãª1ã2ç¹ã1è¡ãã¤ã«å§ç¸®ãã280æå以å ã®åç¥æã使ããã
ãã©ã¼ããã
ð v{VERSION} released!
{Highlights ããæ½åºãã1è¡è¦ç´ï¼æ¥æ¬èªã¾ãã¯è±èªãããã¸ã§ã¯ãã®è¨èªã«åãããï¼}
{2è¡ç®ï¼ä»»æï¼}
{GitHub Release URL}
ä¾:
ð v1.3.0 released!
Pre-flight checks + Claude diff summarization ã§é
ä¿¡å質ãåä¸ã
SemVer èªåå¤å®ã¨ dry-run ãã¬ãã¥ã¼ã§äºæ
ã鲿¢ã
https://github.com/OWNER/REPO/releases/tag/v1.3.0
å¶ç´
| å¶ç´ | å¤ |
|---|---|
| æå¤§æåæ° | 280æåï¼X ã®å¶éï¼ |
| çµµæå | æå°éï¼ð ã®ã¿æ¨å¥¨ï¼ |
| ãªã³ã¯ | å¿ é ï¼GitHub Release URLï¼ |
| è¨èª | ããã¸ã§ã¯ãã®ä¸»è¦è¨èªã«åããã |
çæå¾ããã®ã¾ã¾ã³ãã¼ã§ããå½¢å¼ã§ã¦ã¼ã¶ã¼ã«æç¤ºãããæç¨¿ã¯ Claude ã§ã¯è¡ããªãï¼æåã³ãã¼ï¼ãã¼ã¹ãï¼ã
Options
| Option | Description |
|---|---|
patch |
ããããã¼ã¸ã§ã³ãèªåã¤ã³ã¯ãªã¡ã³ã |
minor |
ãã¤ãã¼ãã¼ã¸ã§ã³ãèªåã¤ã³ã¯ãªã¡ã³ã |
major |
ã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ãèªåã¤ã³ã¯ãªã¡ã³ã |
--dry-run |
ãã¬ãã¥ã¼ã®ã¿ï¼ãã¡ã¤ã«å¤æ´ã»ã³ãããã»ã¿ã°ã»push ãªãï¼ |
--announce |
ãªãªã¼ã¹å¾ã« Xï¼æ§ Twitterï¼åãåç¥æãçæ |
Related Skills
x-release-harness– Harness plugin å°ç¨ãªãªã¼ã¹ï¼ãã¼ã«ã«ã®ã¿ï¼verify– ãªãªã¼ã¹åã®æ¤è¨¼