| name | harness-release |
| description | Generic release automation for projects using Keep a Changelog + GitHub. Single confirmation gate then end-to-end automation: bump detection, CHANGELOG promotion, PR/main merge, tag, GitHub Release. Trigger: release, version bump, publish. Do NOT load for: implementation, review, planning, setup. |
| description-en | Generic release automation for projects using Keep a Changelog + GitHub. Single confirmation gate then end-to-end automation: bump detection, CHANGELOG promotion, PR/main merge, tag, GitHub Release. Trigger: release, version bump, publish. Do NOT load for: implementation, review, planning, setup. |
| description-ja | æ±çšãªãªãŒã¹èªååã¹ãã«ãKeep a Changelog ãš GitHub ã䜿ããããããããžã§ã¯ãã§åäœãåäžç¢ºèªã²ãŒãã§ bump å€å®ã»CHANGELOG ææ Œã»PR/main åæ ã»ã¿ã°ã»GitHub Release ãŸã§å
šèªåå®è¡ããããªãªãŒã¹ãããŒãžã§ã³ãã³ããã¿ã°äœæãå
¬éã§èµ·åãå®è£
ã»ã³ãŒãã¬ãã¥ãŒã»ãã©ã³ãã³ã°ã»ã»ããã¢ããã«ã¯äœ¿ããªãã |
| kind | workflow |
| purpose | Release projects through changelog, version, PR/main merge, tag, and GitHub Release gates |
| trigger | release, version bump, publish |
| shape | workflow |
| role | orchestrator |
| pair | harness-review |
| owner | harness-core |
| since | 2026-05-05 |
| allowed-tools | ["Read","Write","Edit","Bash","AskUserQuestion","Skill"] |
| argument-hint | [patch|minor|major|--dry-run] |
| context | fork |
| effort | high |
| user-invocable | true |
Harness Release (æ±çš)
Keep a Changelog + GitHub ã䜿ããããããããžã§ã¯ãåãã®æ±çšãªãªãŒã¹èªååã¹ãã«ã
èšèšåå: åäžç¢ºèªã²ãŒãããŠãŒã¶ãŒã¯ 1 åã ãå
šäœèšç»ãèŠãŠæ¿èªãããæ¿èªåŸã¯ãã¡ã€ã«æžãæã â commit â branch push â PR äœæ/æŽæ° â default branch ãž merge â default branch äžã§ tag â GitHub Release ãŸã§ãäžæãªãå®è¡ããã
Release complete ã®å®çŸ©: release ã¯ãtag ãš GitHub Release ãäœã£ããã ãã§ã¯å®äºã§ã¯ãªãã察象 work ãš release bump ã default branchïŒéåžž mainïŒã« merge æžã¿ã§ãrelease tag ã default branch å°éå¯èœ commit ãæããGitHub Release ããã® tag ãå
¬éããŠããç¶æ
ãå®äºãšããã
Literal invocation note: ãã® skill ã®å
¥å£ã¯ harness-release, /release, /release patch, /release --dry-run ã®ãã㪠literal command ããã®ãŸãŸäœ¿ãã
Bare invocation contract
if $ARGUMENTS == "":
â ãä»ãŸã§ã®äœæ¥ãã³ãããããPR/main åæ ãŸã§å®äºããŠãªãªãŒã¹ãããããšè§£éããReview Gate æ€åºãå®è¡ãã
â 察象 work ã 1 ã€ã«ç¢ºå®ã§ããå Žåã ã Step 0 (Review Gate) ãžèªåé²è¡ãã
â 察象ãäžæãŸã㯠review state ãç¡ãå Žå㯠AskUserQuestion ã§éžæè¢ãåºããŠããé²ãã
åŒæ°ãªãåŒã³åºãæã®æåã®å¿çã§å¿
ãæ¬¡ã® literal marker ãåºåãã:
RELEASE_AUTOSTART: target=<work-summary>, base_ref=<ref>, mode=<patch|minor|major|auto>
ãã¿ã¹ã¯ãäžæç¢ºããæç€ºãåŸ
ã¡ãŸãããã¿ã¹ã¯ããããŸãããã远å ã®æç€ºããåŸ
ã¡ããŸããã¯çŠæ¢è¡åã
Output Contract (P35: ãæ¢ãŸã£ãããã«èŠãããUX 察ç)
skill çµè«æã® output ã® æåŸã® 1 è¡ã¯å¿
ã P35 footer ãå«ããfooter ã¯æ¬æ (user-facing prose) ãšåãèšèªã§åºåããïŒèšèªè§£æ±ºã¯æ¢åã®èšèªã«ãŒã«ã«åŸããfooter å¥çŽã¯èšèªãåå®çŸ©ããªãïŒããã㯠<local-command-stdout> çµç±ã®è¡šç€ºã§ user ããæ¢ãŸã£ãããšæãã UX åé¡ãžã®æç€ºç㪠instruction (patterns.md P35) ã§ãæå³ã¯èšèªã«äŸåããªããã literal ã¯èšèªããšã«åãæ¿ãã (#208):
- ja:
âãã®çµæã¯ Claude ãèŠçŽããŸããEnter ããŒã§æ¬¡ãžé²ãããæ°èŠ prompt ã§å¥ã®æç€ºãåºããŠãã ããã
- en:
âClaude will summarize this result. Press Enter to continue, or send a new prompt for a different instruction.
- ãã®ä»ã®èšèª: åãæå³ã® 1 è¡ãæ¬æãšåãèšèªã§åºåãã
Language
User-facing prose follows the explicit session or project language.
If no language is configured, use English. Use Japanese only when
i18n.language: ja, CLAUDE_CODE_HARNESS_LANG=ja, or an explicit session
instruction requests Japanese output.
Machine-readable values stay English.
harness-release / /release ã ããå
¥åãããå Žåãããã¯
ãä»ãŸã§ã®äœæ¥ãã³ãããããPR/main åæ ãŸã§å®äºããŠãªãªãŒã¹ãããã ãšããæå³ãšããŠæ±ãã
æ§è¡šçŸã® ãä»ãŸã§ã®äœæ¥ãã³ãããããŠãªãªãŒã¹ãããã ãåãæå³ã ããå®äºæ¡ä»¶ã«ã¯ PR/main åæ ãå¿
ãå«ããã
ãã¿ã¹ã¯ããããŸããããæç€ºãåŸ
ã¡ãŸããã§æ¢ãŸã£ãŠã¯ãããªãã
bare release ã§ã¯ãéåžžã® release preflight ã®åã« Review Gate ãš Work Commit Gate ãå®è¡ããã
git status --porcelain ãš git log @{upstream}..HEAD / main..HEAD ã確èªãããä»ãŸã§ã®äœæ¥ãã®å¯Ÿè±¡ãç¹å®ãã
.claude/state/review-result.json ãš .claude/state/review-approved.json ã確èªãã察象 work ã« APPROVE æžã¿ review ãããã確èªãã
- APPROVE æžã¿ review ãç¡ãå Žåã¯
AskUserQuestion ã§ç¢ºèªãã
- ãŠãŒã¶ãŒããã¬ãã¥ãŒããéå§ããéžãã ãã
harness-review ãèµ·åããAPPROVE ã«ãªããŸã§ release ãžé²ãŸãªã
harness-review ã REQUEST_CHANGES ãè¿ããå Žå㯠release ãä¿çããharness-work ã§ä¿®æ£ããŠãã harness-review ãåå®è¡ãããããã APPROVE ãŸã§ã«ãŒããã
harness-review ã APPROVE ãè¿ããåŸãworking tree ã®äœæ¥ commit ãäœã
- working tree clean ã«ãªã£ãŠããéåžžã® release preflight / confirmation gate / PR merge / tag / GitHub Release ãžé²ã
Review Gate AskUserQuestion
harness-release å®è¡æã« review approval ã確èªã§ããªãå Žåã¯ãæšæž¬ã§ release ããªãã
次㮠Ask ãåºãã
question: "harness-release ã¯ä»ãŸã§ã®äœæ¥ãã³ãããããŠãªãªãŒã¹ããŸããããã®äœæ¥ã® APPROVE review ãèŠã€ãããŸãããã©ãé²ããŸããïŒ"
options:
- label: "ã¬ãã¥ãŒããéå§ (Recommended)"
description: "harness-review ãå®è¡ããAPPROVE ã«ãªã£ãå Žåã ã commit/release ãžé²ã¿ãŸãã"
- label: "release dry-run"
description: "ãã¡ã€ã«ãæžãæãããrelease èšç»ãšäžè¶³ gate ã ã確èªããŸãã"
- label: "äžæ¢"
description: "review ã release ãè¡ããæ¢ããŸãã"
ãŠãŒã¶ãŒããã¬ãã¥ãŒããéå§ããéžãã å Žåã¯ãåãã»ãã·ã§ã³å
ã§ harness-review ããå§ããã
harness-review ã®å¯Ÿè±¡æ±ºå®ã¯ harness-review åŽã® bare review contract ã«åŸãã
review ã APPROVE ãªãããã®ãŸãŸ harness-release ã® Work Commit Gate ãžæ»ãã
review ã REQUEST_CHANGES ãªã release ã¯ä¿çããharness-work ã§ä¿®æ£ããŠãã harness-review ãåå®è¡ããã
ãã®ä¿®æ£åŸåã¬ãã¥ãŒ loop 㯠APPROVE ãŸã§ç¶ç¶ããã
ãŠãŒã¶ãŒã«æ»ããŠããã®ã¯æ¬¡ã®å Žåã ãã
- ä¿®æ£ã«ä»æ§æ£æ¬ / Plans.md / API / permission / migration / billing ãªã©ã®æææ±ºå®ãå¿
èŠã§ã
AskUserQuestion ãå¿
èŠ
- ä¿®æ£æ¹éãè€æ°ãããã©ããæ¡ããã§ãŠãŒã¶ãŒäŸ¡å€ãäºææ§ãå€ãã
- ãŠãŒã¶ãŒã Ask ã§
release dry-run ãŸãã¯ äžæ¢ ãéžãã
REQUEST_CHANGES åäœãæçµåæ¢çç±ã«ããŠã¯ãããªãã
Work Commit Gate
bare release ã§ working tree ã«æªã³ããã倿Žãããå Žåãrelease version bump commit ãšã¯å¥ã«ã
review æžã¿ work commit ãå
ã«äœãã
git status --short
git diff --stat
git add <reviewed files>
git commit -m "<type>: <summary>"
commit message 㯠review summary / Plans.md task / branch name ããçãçæããã
倿ã§ããªãå Žå㯠AskUserQuestion ã§ 2ã3 åã® commit message åè£ãåºãã
work commit äœæåŸã« .claude/state/review-result.json ã® commit_hash ã確èªãŸãã¯æŽæ°ãã
release preflight ãžé²ãã
éåžžã® release preflight ã«å
¥ã£ãåŸã¯ããããŸã§éã working tree dirty ã fail ãšããã
dirty tree ã®ãŸãŸ version bump / tag / GitHub Release ã«é²ãŸãªãã
Quick Reference
/release
/release patch
/release minor
/release major
/release --dry-run
åææ¡ä»¶
ãã®ã¹ãã«ãåããããžã§ã¯ãã¯ä»¥äžãæºããå¿
èŠããããŸã:
CHANGELOG.md ã Keep a Changelog 圢åŒ
[Unreleased] ã»ã¯ã·ã§ã³ãååšãã
- 以äžã®ããããã® version file ãæã€:
VERSION (åç¬ãã¡ã€ã«)
package.json (npm)
pyproject.toml (Python, [project] ãŸã㯠[tool.poetry])
Cargo.toml (Rust, [package])
gh CLI ãã€ã³ã¹ããŒã«æžã¿ã§ãèªèšŒæžã¿
- git ãªã¢ãŒã
origin ã GitHub ãæã
- Claude Code plugin project ã®å Žåã¯ã
claude CLI ã plugin tag ããµããŒãããŠãã
ããããæºããããªãå ŽåãPreflight ã§ detect ã㊠abort ããŸãã
prUrlTemplate ã«ãã multi-host review URL ã¯å°æ¥åè£ãšããŠèªèãããã
ãã®ã¹ãã«ã® release automation ã¯ä»ã gh CLI ãš GitHub remote ã primary path ãšããã
owner / branch / release asset / CI metadata ã®èªåååŸã¯ host ããšã®å·®ã倧ãããããPhase 56.2.3 ã§ã¯ docs-only ã«çããã
åäžã²ãŒããããŒ
[Bare release only: äœæ¥ review/commit åæ®µ]
â
0. Review Gate (æªã¬ãã¥ãŒãªã AskUserQuestion â harness-review)
0.5 Work Commit Gate (review APPROVE æžã¿ work ã release bump ãšåã㊠commit)
â
[Pre-Gate: æ
å ±åéã®ã¿ããã¡ã€ã«æªå€æŽ]
â
1. Preflight (working tree clean / CHANGELOG / gh çã®ç¢ºèª)
2. Version file èªåæ€åº
3. çŸåšããŒãžã§ã³ã®èªã¿åã
4. Claude plugin tag preflight (plugin project ã®å Žåã®ã¿)
5. [Unreleased] å
容ã®è§£æ â bump level æšå®
6. æ°ããŒãžã§ã³ç®åº
7. CHANGELOG å·®åãã©ããäœæ (ã¡ã¢ãªäž)
8. GitHub Release notes ãã©ããäœæ (ã¡ã¢ãªäž)
â
ââââââ åäžç¢ºèªã²ãŒã âââââââ
ãŠãŒã¶ãŒã«å
šèšç»ã 1 åã ãæç€º:
- æ€åºããã version file
- çŸããŒãžã§ã³ â æ°ããŒãžã§ã³
- bump å€å®çç± ("[Unreleased] ã« ### Added ããããã minor" ç)
- CHANGELOG 倿Žãã¬ãã¥ãŒ
- GitHub Release notes ãã©ãã
- ã³ããã察象ãã¡ã€ã«äžèЧ
- æçµã¢ã¯ã·ã§ã³ (branch push + PR merge + tag + release publish)
ãŠãŒã¶ãŒå¿ç:
"yes" â Post-Gate ãžé²ã
"<ä¿®æ£æç€º>" â æç€ºã«å¿ã㊠draft ãåçæãå確èª
"cancel/no" â äœãããçµäº
â
ââââââââââââââââââââââââ
â
[Post-Gate: æ¿èªåŸãäžæãªã]
9. Version file æžãæã
10. CHANGELOG.md æžãæã ([Unreleased] â [X.Y.Z] ææ Œ + compare link)
11. git add + commit
12. release branch push
13. PR äœæ/æŽæ°
14. default branch ãž merge
15. default branch ã fetch/checkout ããrelease commit ãå°éå¯èœã§ããããšã確èª
16. Claude plugin tag validation + tag (plugin project ã®å Žåã®ã¿)
17. GitHub Release çš semver tag (å¿
èŠãª project ã®ã¿)
18. git push origin <default-branch> --tags
19. gh release create vX.Y.Z
20. å®äºå ±å
Pre-Gate 詳现
1. Preflight
command -v gh >/dev/null || { echo "gh CLI ããããŸãã"; exit 1; }
command -v python3 >/dev/null || { echo "python3 ãå¿
èŠã§ã"; exit 1; }
if [ -n "$(git status --porcelain)" ]; then
echo "working tree ã«æªã³ããã倿ŽããããŸã"; exit 1;
fi
[ -f CHANGELOG.md ] || { echo "CHANGELOG.md ããããŸãã"; exit 1; }
grep -q "^## \[Unreleased\]" CHANGELOG.md || { echo "[Unreleased] ã»ã¯ã·ã§ã³ããããŸãã"; exit 1; }
scripts/release-preflight.sh
ãã® working tree clean check ã¯éåžž release preflight ã® gate ã§ããã
bare release ã§ãä»ãŸã§ã®äœæ¥ãã commit ãããå Žåã¯ããã® check ã®åã« Review Gate ãš Work Commit Gate ãå®äºãããã
æªã¬ãã¥ãŒã® dirty tree ããã® check ã ãã§ abort ããŠçµããããŠã¯ãããªãã
scripts/release-preflight.sh 㯠tag äœæåã« opencode/, skills-codex/, codex/.codex/skills/ ã® mirror drift ãæ€åºãããnode scripts/build-opencode.js ãå·®åãçæããå Žå㯠release ãæ¢ãããã®å·®åã commit ããŠãã tag ã«é²ãã
2. Version File èªåæ€åº
以äžãåªå
é ã§æ¢çŽ¢ãæåã«èŠã€ãã£ããã®ãæ£æ¬ãšãã:
import os, json, re
import tomllib
def detect_version_file():
if os.path.exists("VERSION"):
with open("VERSION") as f:
return ("VERSION", f.read().strip(), None)
if os.path.exists("package.json"):
with open("package.json") as f:
data = json.load(f)
return ("package.json", data["version"], None)
if os.path.exists("pyproject.toml"):
with open("pyproject.toml", "rb") as f:
data = tomllib.load(f)
if "project" in data:
return ("pyproject.toml", data["project"]["version"], "[project]")
if "tool" in data and "poetry" in data["tool"]:
return ("pyproject.toml", data["tool"]["poetry"]["version"], "[tool.poetry]")
if os.path.exists("Cargo.toml"):
with open("Cargo.toml", "rb") as f:
data = tomllib.load(f)
return ("Cargo.toml", data["package"]["version"], "[package]")
raise RuntimeError("No supported version file found")
詳现: version-files.md
3. Claude Plugin Tag Preflight
.claude-plugin/plugin.json ãååšãã project ã§ã¯ãéåžžã® GitHub Release tag ãšã¯å¥ã« Claude plugin release tag ãäœãã
ã²ãšããšã§èšããšãgit tag -a ãæã§çµã¿ç«ãŠãåã«ãClaude Code æ¬äœã® plugin validation ã«éããŠãã {plugin-name}--v{version} tag ãäœãã
Pre-Gate ã§ã¯ãã¡ã€ã«ãæžãæããã以äžã確èªããã
version sync 㯠grep / sed ã§æŸãããJSON 㯠structured parser ã§èªã:
command -v claude >/dev/null || { echo "claude CLI ããããŸãã"; exit 1; }
claude plugin validate .claude-plugin/plugin.json
HARNESS_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-.}"
python3 "${HARNESS_PLUGIN_ROOT}/scripts/check-release-version-sync.py" --root .
claude plugin tag .claude-plugin --dry-run
${HARNESS_PLUGIN_ROOT}/scripts/check-release-version-sync.py ã¯ãååšãã release surface ããã¹ãŠèªã¿åããcanonical ã VERSION > package.json > .claude-plugin/plugin.json > .codex-plugin/plugin.json ã®é ã§æ±ºããã
ãã®ããã§ã以äžã®äžäžèŽã»æ¬ èœã 1 ã€ã§ãããã° tag / release ã«é²ãŸãªã:
VERSION
package.json ã® .version
.claude-plugin/plugin.json ã® .version
.codex-plugin/plugin.json ã® .version
.claude-plugin/marketplace.json ã® .metadata.version
.claude-plugin/marketplace.json ã® .plugins[].versionïŒé
åå
ã®å plugin entryïŒ
äžäžèŽæã¯ãã©ã® surface ã canonical ãšéããããŸãã¯ã©ã® field ã missing / invalid ãã衚瀺ããã
æ©æ¢°åŠçã CI ã§èªãå Žå㯠--json ã䜿ã:
python3 "${HARNESS_PLUGIN_ROOT}/scripts/check-release-version-sync.py" --root . --json
ãã® check 㯠3 ã€ã®äºæ
ãé²ãããã«ãã:
VERSION ãš .claude-plugin/plugin.json ã® version ãããããŸãŸ tag ãåãäºæ
package.json / marketplace entry ã® version ãå€ããŸãŸ release workflow ã«é²ãäºæ
- plugin manifest / marketplace entry ã® validation ãéãããããšã§ plugin install / update åŽã§è©°ãŸãäºæ
--dry-run ã§ã¯ claude plugin tag ãå®éã«äœã tag åãšå
éšã® git tag -a / push çžåœã³ãã³ããèŠãããããã§èŠãã command ã Confirmation Gate ã® plan ã«å«ããã
4. Bump èªåæšå®
[Unreleased] çŽäžã®èŠåºããè§£æã㊠bump level ãæ±ºå®:
| [Unreleased] å
ã®èŠåºã | æšå® bump |
|---|
### Breaking Changes ãŸã㯠### Removed ãå«ã | major |
### Added ãå«ã (Removed/Breaking ãªã) | minor |
### Fixed / ### Changed / ### Security ã®ã¿ | patch |
| 空ã»ã¯ã·ã§ã³ | error: ãªãªãŒã¹å¯Ÿè±¡ãªã |
ãŠãŒã¶ãŒã /release patch|minor|major ã§æç€ºæå®ããå Žåã¯ãã¡ããåªå
ã
詳现: bump-detection.md
5. CHANGELOG ãã©ããäœæ (ã¡ã¢ãªäž)
以äžãèšç®ããŸã æžã蟌ãŸãªã:
## [Unreleased] ã®æ¬æãåãåºã
## [Unreleased] ãš ## [<previous>] ã®éã« ## [<new>] - YYYY-MM-DD ãæ¿å
¥ãã圢ãäœæ
- æ«å°Ÿ compare link:
[Unreleased]: .../compare/v<prev>...HEAD â v<new>...HEAD
[<new>]: .../compare/v<prev>...v<new> ã远å
- repo URL ã¯æ¢åã®
[Unreleased]: è¡ããåçæœåº
6. Release Notes ãã©ããäœæ (ã¡ã¢ãªäž)
## [<new>] ã»ã¯ã·ã§ã³ã®å
容ãå
ã«ãGitHub Release çšã®ããŒã¯ããŠã³ãçæ:
## What's Changed
**<ãªãªãŒã¹ããŒã(1è¡)>**
### Before / After
<ããŒãã«>
### Added / Changed / Fixed / Removed
<該åœã»ã¯ã·ã§ã³ãã³ããŒ>
---
ð€ Generated with [Claude Code](https://claude.com/claude-code)
詳现: release-notes.md
Confirmation Gate
ãã¹ãŠã®ãã©ãããæã£ããããŠãŒã¶ãŒã« 1 åã ãæç€º:
âââââââââââââââââââââââââââââââ
Release Plan: v<old> â v<new> (<bump>)
âââââââââââââââââââââââââââââââ
Version file: <detected file>
Bump reason: <why this level was chosen>
CHANGELOG changes:
[Unreleased] ã« <N> é
ç®ã®å€æŽãæ€åº
[<new>] - YYYY-MM-DD ãšããŠç¢ºå®
Compare link ã远å
GitHub Release notes preview:
<æåã® 10 è¡>
...
Files to modify:
- <version file>
- CHANGELOG.md
Final actions:
- git commit -m "chore: release v<new>"
- git push origin <release-branch>
- gh pr create/update + gh pr merge into <default-branch>
- git fetch origin <default-branch> && git checkout <default-branch>
- claude plugin tag .claude-plugin --push --remote origin # plugin project ã®å Žåãdefault branch äžã§å®è¡
- git tag -a v<new> # GitHub Release çš semver tag ãå¿
èŠãªå Žåãdefault branch äžã§äœæ
- git push origin <default-branch> --tags
- gh release create v<new>
Proceed? [yes / cancel / <ä¿®æ£æç€º>]
Post-Gate 詳现
æ¿èªåŸã¯äžæãªãã§å®è¡ã倱ææã¯ä»¥äžã®æ¹é:
| 倱æç®æ | åŸ©æ§ |
|---|
| ãã¡ã€ã«æžãæã倱æ | ããã§ abortãããŒã«ã«ã¯ dirty ãªãŸãŸäººéã倿 |
| commit 倱æ | hook æåŠçããŠãŒã¶ãŒã«åå ãæç€ºããŠä¿®æ£ãä¿ã |
| PR äœæ/merge 倱æ | release ãæªå®äºãšããŠåæ¢ãtag / GitHub Release ã«ã¯é²ãŸãªã |
| plugin tag validation 倱æ | VERSION / .claude-plugin/plugin.json / marketplace entry ã®äžäžèŽãä¿®æ£ããtag äœæã«ã¯é²ãŸãªã |
| push 倱æ | ãªã¢ãŒãåŽã®åé¡ãããŒã«ã« commit/tag ã¯æ®ã |
gh release create 倱æ | tag 㯠push æžã¿ãªã®ã§ãæ¢åã® release.yml ã»ãŒããã£ããããçºç«ããããæåã§ gh release create |
PR / Main Merge Gate
Post-Gate ã® release commit åŸã¯ãtag ãäœãåã« GitHub PR ã default branch ãž merge ããã
release_branch="$(git branch --show-current)"
default_branch="${HARNESS_RELEASE_DEFAULT_BRANCH:-main}"
git push -u origin "$release_branch"
gh pr create --base "$default_branch" --head "$release_branch" --title "chore: release v<new>" --body "<release summary>"
gh pr merge --merge --delete-branch=false
git fetch origin "$default_branch" --tags
git checkout "$default_branch"
git pull --ff-only origin "$default_branch"
git merge-base --is-ancestor "<release-commit>" "origin/$default_branch"
æ¢å PR ãããå Žåã¯æ°èŠäœæãããæ¢å PR ã® body ãæŽæ°ã㊠merge ãããrepository policy ã squash merge ãèŠæ±ããå Žåã¯ãrelease commit hash ã§ã¯ãªã release bump ã®å
容ïŒversion files + CHANGELOG + source commitsïŒã default branch ã«å«ãŸããããšã確èªããã
tag ã¯ãã® Gate å®äºåŸãdefault branch ã® HEAD ããã㯠release commit å°éå¯èœãª commit ã«å¯ŸããŠäœããrelease branch äžã ãã«ååšãã commit ãæã tag ã§ GitHub Release ãäœã£ãŠã¯ãããªãã
Claude plugin project ã® tag äœæ
.claude-plugin/plugin.json ããã project ã§ã¯ãPR/main merge åŸã« default branch äžã§ããäžåºŠ version sync ã確èªããŠãã plugin tag ãäœã:
HARNESS_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-.}"
python3 "${HARNESS_PLUGIN_ROOT}/scripts/check-release-version-sync.py" --root .
claude plugin tag .claude-plugin --dry-run
claude plugin tag .claude-plugin --push --remote origin
claude plugin tag ãäœã tag 㯠{plugin-name}--v{version} 圢åŒãæ¢åã® GitHub Release workflow ã vX.Y.Z tag ãåæã«ããŠãã project ã§ã¯ãplugin tag ãšã¯å¥ã« git tag -a v<new> ãäœããplugin é
åžã® tag 㯠claude plugin tag ã«ä»»ããGitHub Release çš semver tag 㯠release automation ã®äºæ surface ãšããŠæ±ãã
--dry-run ã¢ãŒã
Pre-Gate å
šãŠãå®è¡ããConfirmation Gate ãŸã§ã®å
容ã衚瀺ããããgate ã§æ¢ãŸã Post-Gate ã«é²ãŸãªãã
Claude plugin project ã®å Žåãdry-run ã§ã python3 "${HARNESS_PLUGIN_ROOT}/scripts/check-release-version-sync.py" --root . ãš claude plugin tag .claude-plugin --dry-run ãå®è¡ããå®éã«äœããã plugin tag åãš push 察象ã衚瀺ãããããã§ VERSION / package.json / .claude-plugin/plugin.json / .codex-plugin/plugin.json / .claude-plugin/marketplace.json ã® version surface ãäžäžèŽãŸãã¯æ¬ èœããŠããã°ãdry-run ã®æç¹ã§æ¢ããã
ç°å¢å€æ°
ãããžã§ã¯ãããšã®èª¿æŽã«äœ¿çš:
| 倿° | 説æ |
|---|
HARNESS_RELEASE_PROJECT_ROOT | ãªããžããªã«ãŒã (ããã©ã«ã: $(pwd)) |
HARNESS_RELEASE_BRANCH | push 察象ãã©ã³ã (ããã©ã«ã: çŸåšã®ãã©ã³ã) |
HARNESS_RELEASE_DEFAULT_BRANCH | PR merge å
default branch (ããã©ã«ã: main) |
HARNESS_RELEASE_HEALTHCHECK_CMD | Preflight ã§è¿œå å®è¡ããã³ãã³ã |
HARNESS_RELEASE_SKIP_GH | 1 ã§ GitHub Release äœæãã¹ããã |
CHANGELOG æžãæ¹ã«ãŒã«
[Unreleased] ã»ã¯ã·ã§ã³ã¯å¿
ã以äžã®ããããã®ãµãã»ã¯ã·ã§ã³ãæã€:
## [Unreleased]
### Added â minor
### Changed â patch
### Deprecated â minor
### Removed â major
### Fixed â patch
### Security â patch
### Breaking Changes â major (Keep a Changelog éæšæºã ãäžè¬ç)
ãã®ã¹ãã«ã¯ãããã®èŠåºããæ©æ¢°çã«è§£æãããããèŠåºãã®è¡šèšæºãïŒ### Fix / ### Bug Fixes çïŒã¯èªèã§ããŸãããKaCL æšæºã®èŠåºãã䜿çšããŠãã ããã
é¢é£ã¹ãã«
harness-release-internal - æ¬äœ claude-code-harness ã®ãªãªãŒã¹æã«è¿œå ã§èµ°ããã harness åºæ preflight/finalizationïŒé
åžå¯Ÿè±¡å€ïŒ
harness-plan - Plans.md 管ç
harness-review - ãªãªãŒã¹åã®ã³ãŒãã¬ãã¥ãŒ
èšèšææ³
- åäžã²ãŒã: ãŠãŒã¶ãŒã®å€æã¿ã€ãã³ã°ã¯ 1 åã ããmini-confirmation ãæããšã©ããŒã¹ã¿ã³ãåããŠæå³ã倱ã
- äºåã«å
šãŠæã: Post-Gate ã«å
¥ã£ãŠããã®ãèãçŽãããçŠãããGate åã«å
š draft ãæãã
- main åæ ãå®äºæ¡ä»¶: release tag / GitHub Release 㯠default branch åæ åŸã«ã ãäœããbranch-only release ã¯æªå®äºãšããŠæ±ã
- 倱æã¯ transparent: éäžã§å€±æãããèªåããŒã«ããã¯ã¯è©Šã¿ãããŠãŒã¶ãŒã«çŸç¶ãæç€ºããŠå€æããã
- ãããžã§ã¯ãéäŸå: VERSION file 圢åŒãmirrorãresidue check ãªã©ç¹å®ç°å¢ã®åæãæããªããæ¬äœ harness åºæã®åŠçã¯
harness-release-internal ã«åé¢