| name | jikime-harness-release |
| description | Harness Engineering release manager โ generates CHANGELOG from pm:OK tasks, bumps version, creates git tag, and writes release notes |
| version | 1.0.0 |
| category | harness |
| tags | ["harness","release","changelog","version","tag","plans.md","pm:OK","harness-engineering"] |
| triggers | {"keywords":["harness-release","harness release","๋ฆด๋ฆฌ์ค","release","๋ฒ์ ๋ฆด๋ฆฌ์ค","changelog ์์ฑ","๋ฐฐํฌ ์ค๋น","ship"],"phases":["sync"],"agents":["orchestrator","manager-git","documenter"],"languages":[]} |
| progressive_disclosure | {"enabled":true,"level1_tokens":"~100","level2_tokens":"~5000"} |
| user-invocable | true |
| context | fork |
| agent | general-purpose |
| allowed-tools | ["Read","Write","Edit","Bash","Grep","Glob","TodoWrite"] |
Harness Release โ ๋ฆด๋ฆฌ์ค ์๋ํ ์คํฌ
Quick Reference
Plans.md์ pm:OK ํ์คํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฆด๋ฆฌ์ค๋ฅผ ์๋ํํฉ๋๋ค.
CHANGELOG ์
๋ฐ์ดํธ, ๋ฒ์ ๋ฒํ, git ํ๊ทธ, ๋ฆด๋ฆฌ์ค ๋
ธํธ ์์ฑ๊น์ง ์ฒ๋ฆฌํฉ๋๋ค.
์ฌ์ฉ๋ฒ:
/jikime:harness-release โ ๋ํํ ๋ฆด๋ฆฌ์ค (๋ฒ์ ์๋ ์ ์)
/jikime:harness-release --patch โ ํจ์น ๋ฒ์ (v1.0.0 โ v1.0.1)
/jikime:harness-release --minor โ ๋ง์ด๋ ๋ฒ์ (v1.0.0 โ v1.1.0)
/jikime:harness-release --major โ ๋ฉ์ด์ ๋ฒ์ (v1.0.0 โ v2.0.0)
/jikime:harness-release --dry-run โ ๋ฆด๋ฆฌ์ค ๋ฏธ๋ฆฌ๋ณด๊ธฐ (๋ณ๊ฒฝ์ฌํญ ์์)
/jikime:harness-release --version v2.1.0 โ ์ง์ ๋ฒ์ ์ง์
๋ฆด๋ฆฌ์ค ์ ์ ์กฐ๊ฑด
grep -c "pm:OK" Plans.md
grep "cc:WIP" Plans.md | wc -l
grep "pm:REVIEW" Plans.md | wc -l
git status --porcelain | wc -l
์ ์ ์กฐ๊ฑด ๋ฏธ์ถฉ์กฑ ์:
โ ๏ธ ๋ฆด๋ฆฌ์ค ์ ์ ์กฐ๊ฑด ๋ฏธ์ถฉ์กฑ:
- cc:WIP ํ์คํฌ 2๊ฐ ์กด์ฌ (Task 2.1, 2.2)
- pm:REVIEW ํ์คํฌ 1๊ฐ ๋๊ธฐ ์ค (Task 1.3)
๊ฐ์ ์งํํ์๊ฒ ์ต๋๊น? (๊ถ์ฅํ์ง ์์)
์คํ ํ๋ฆ
Step 1: ๋ฆด๋ฆฌ์ค ๋์ ์์ง
Plans.md์์ ๋ฆด๋ฆฌ์คํ ํ์คํฌ ๋ชฉ๋ก ์ถ์ถ:
grep "pm:OK" Plans.md
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -n "$LAST_TAG" ]; then
git log ${LAST_TAG}..HEAD --oneline -- Plans.md
fi
์์ง ๊ฒฐ๊ณผ:
๋ฆด๋ฆฌ์ค ๋์ ํ์คํฌ (pm:OK):
โ
1.1 โ JWT ํ ํฐ ์์ฑ (commit: abc1234)
โ
1.2 โ ๋ก๊ทธ์ธ API (commit: def5678)
โ
1.3 โ ๋ฆฌํ๋ ์ ํ ํฐ (commit: ghi9012)
โ
2.1 โ ํตํฉ ํ
์คํธ ์ถ๊ฐ (commit: jkl3456)
Step 2: ๋ฒ์ ๊ฒฐ์
ํ์ฌ ๋ฒ์ ๊ฐ์ง:
node -p "require('./package.json').version" 2>/dev/null
grep "^module" go.mod | head -1
cat version/VERSION 2>/dev/null || cat VERSION 2>/dev/null
git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0"
๋ฒ์ ๋ฒํ ์๋ ์ ์:
ํ์คํฌ ๋ถ์์ผ๋ก ์ ์ ํ ๋ฒ์ ๋ณํ ์ถ์ฒ:
| ํ์คํฌ ๋ด์ฉ ๋ถ์ | ๊ถ์ฅ ๋ฒ์ ๋ฒํ |
|---|
BREAKING CHANGE ํฌํจ ์ปค๋ฐ ์กด์ฌ | major |
์ ๊ท ๊ธฐ๋ฅ (feat:) ์ปค๋ฐ ์กด์ฌ | minor |
| ๋ฒ๊ทธ์์ /๊ฐ์ ๋ง ์กด์ฌ | patch |
ํ์ฌ ๋ฒ์ : v1.2.0
๊ถ์ฅ ๋ฒ์ : v1.3.0 (minor โ ์ ๊ท ๊ธฐ๋ฅ 3๊ฐ ํฌํจ)
๋ฒ์ ์ ์ ํํ์ธ์:
1. v1.3.0 (๊ถ์ฅ: minor)
2. v1.2.1 (patch)
3. v2.0.0 (major)
4. ์ง์ ์
๋ ฅ
Step 3: CHANGELOG.md ์์ฑ/์
๋ฐ์ดํธ
CHANGELOG ํญ๋ชฉ ํ์:
## [v1.3.0] โ 2026-03-15
### โจ ์ ๊ธฐ๋ฅ
- JWT ํ ํฐ ์์ฑ ๋ฐ ๊ฒ์ฆ ๊ตฌํ ([1.1] abc1234)
- ๋ก๊ทธ์ธ API ์๋ํฌ์ธํธ ์ถ๊ฐ ([1.2] def5678)
- ๋ฆฌํ๋ ์ ํ ํฐ ์ง์ ([1.3] ghi9012)
### ๐งช ํ
์คํธ
- ํตํฉ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 80% ๋ฌ์ฑ ([2.1] jkl3456)
### ๐ Plans.md ์ฐธ์กฐ
์ด ๋ฆด๋ฆฌ์ค์ ์์ธ ๊ตฌํ ํํฉ์ Plans.md์ Phase 1, Phase 2๋ฅผ ์ฐธ์กฐํ์ธ์.
์ปค๋ฐ ๋ฉ์์ง โ CHANGELOG ์นดํ
๊ณ ๋ฆฌ ๋งคํ:
| ์ปค๋ฐ ํ๋ฆฌํฝ์ค | CHANGELOG ์น์
|
|---|
feat: | โจ ์ ๊ธฐ๋ฅ |
fix: | ๐ ๋ฒ๊ทธ ์์ |
perf: | โก ์ฑ๋ฅ ๊ฐ์ |
test: | ๐งช ํ
์คํธ |
docs: | ๐ ๋ฌธ์ |
refactor: | ๐ง ๊ฐ์ |
security: | ๐ ๋ณด์ |
BREAKING CHANGE | ๐ฅ ์ฃผ์ ๋ณ๊ฒฝ (ํธํ์ฑ ๊นจ์ง) |
chore(plans): | ๊ฑด๋๋ (Plans.md ๊ด๋ฆฌ ์ปค๋ฐ) |
๊ธฐ์กด CHANGELOG.md๊ฐ ์์ผ๋ฉด ๋งจ ์์ ์ถ๊ฐ, ์์ผ๋ฉด ์ ๊ท ์์ฑ.
Step 4: ๋ฒ์ ํ์ผ ์
๋ฐ์ดํธ
๊ฐ์ง๋ ๋ฒ์ ํ์ผ ์ ํ์ ๋ฐ๋ผ ์๋ ์
๋ฐ์ดํธ:
npm version ${NEW_VERSION} --no-git-tag-version 2>/dev/null
echo "${NEW_VERSION}" > version/VERSION
sed -i '' "s/^version = .*/version = \"${NEW_VERSION_BARE}\"/" Cargo.toml
Step 5: Plans.md ๋ฆด๋ฆฌ์ค ๊ธฐ๋ก
Plans.md ํ๋จ์ ๋ฆด๋ฆฌ์ค ๋ฉํ๋ฐ์ดํฐ ์ถ๊ฐ:
---
## Release: v1.3.0 โ 2026-03-15
| ํญ๋ชฉ | ๋ด์ฉ |
|------|------|
| **๋ฒ์ ** | v1.3.0 |
| **๋ฆด๋ฆฌ์ค ํ์คํฌ** | 4๊ฐ (Task 1.1, 1.2, 1.3, 2.1) |
| **git ํ๊ทธ** | v1.3.0 (commit: xyz7890) |
| **CHANGELOG** | [CHANGELOG.md](./CHANGELOG.md) |
๋ฆด๋ฆฌ์ค๋ ํ์คํฌ๋ pm:OK ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
๋ค์ ๊ฐ๋ฐ ์ฌ์ดํด์ ์์ํ๋ ค๋ฉด /jikime:harness-plan create๋ก ์ Plans.md๋ฅผ ์์ฑํ๊ฑฐ๋,
์ Phase๋ฅผ ์ถ๊ฐํ์ธ์.
Step 6: Git ์ปค๋ฐ ๋ฐ ํ๊ทธ
git add CHANGELOG.md Plans.md package.json
git commit -m "chore(release): v${NEW_VERSION}
Release v${NEW_VERSION} โ ${TASK_COUNT}๊ฐ ํ์คํฌ ์๋ฃ.
Included tasks:
$(for task in ${TASK_LIST}; do echo " - [${task}] ${TASK_CONTENT[$task]}"; done)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"
git tag -a "v${NEW_VERSION}" -m "Release v${NEW_VERSION}"
ํธ์ ์ ๋ฐ๋์ ํ์ธ:
ํ๊ทธ v1.3.0์ ์๊ฒฉ์ ํธ์ํ์๊ฒ ์ต๋๊น?
git push origin main
git push origin v1.3.0
(y/n)
Step 7: ๋ฆด๋ฆฌ์ค ์๋ฃ ๋ณด๊ณ
โ
Harness Release v1.3.0 ์๋ฃ
๋ฆด๋ฆฌ์ค ๋ด์ญ:
๋ฒ์ : v1.3.0
ํ์คํฌ: 4๊ฐ (๋ชจ๋ pm:OK)
์ปค๋ฐ: xyz7890
ํ๊ทธ: v1.3.0 โ
CHANGELOG: ์
๋ฐ์ดํธ๋จ โ
๋ค์ ๋จ๊ณ:
/jikime:harness-sync retro โ ๋ ํธ๋ก์คํํฐ๋ธ ์์ฑ
/jikime:harness-plan create โ ๋ค์ ๊ฐ๋ฐ ์ฌ์ดํด ์์
gh release create v1.3.0 โ GitHub Release ์์ฑ (์ ํ)
--dry-run ๋ชจ๋
์ค์ ๋ณ๊ฒฝ ์์ด ๋ฆด๋ฆฌ์ค ๋ด์ฉ ๋ฏธ๋ฆฌ๋ณด๊ธฐ:
๐ Harness Release ๋ฏธ๋ฆฌ๋ณด๊ธฐ (dry-run)
๋ฒ์ : v1.2.0 โ v1.3.0
CHANGELOG ์ถ๊ฐ ์์ :
---
## [v1.3.0] โ 2026-03-15
### โจ ์ ๊ธฐ๋ฅ
- JWT ํ ํฐ ์์ฑ ([1.1] abc1234)
...
---
๋ณ๊ฒฝ ์์ ํ์ผ:
CHANGELOG.md (์ถ๊ฐ)
Plans.md (๋ฆด๋ฆฌ์ค ๊ธฐ๋ก ์ถ๊ฐ)
package.json (version: "1.3.0")
git ํ๊ทธ: v1.3.0
์ค์ ๋ฆด๋ฆฌ์ค๋ฅผ ์งํํ๋ ค๋ฉด --dry-run ์์ด ์คํํ์ธ์.
๋ฆด๋ฆฌ์ค ํ Plans.md ์ํ
๋ฆด๋ฆฌ์ค ํ Plans.md๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค:
| 1.1 | JWT ํ ํฐ ์์ฑ | ... | pm:OK | โ ์ ์ง
| 1.2 | ๋ก๊ทธ์ธ API | ... | pm:OK | โ ์ ์ง
๋ค์ ๊ฐ๋ฐ ์ฌ์ดํด:
- ๊ณ์ ์ถ๊ฐ:
harness-plan add๋ก ์ ํ์คํฌ ์ถ๊ฐ
- ์ ์์: ์ Plans.md ์์ฑ (์ด์ Plans.md๋
Plans-v1.3.0.md๋ก ๋ณด๊ด)
ํตํฉ ํฌ์ธํธ
| ์คํฌ/์ปค๋งจ๋ | ์ฐ๊ด ๋ฐฉ์ |
|---|
jikime-harness-sync | ๋ฆด๋ฆฌ์ค ์ sync retro ๊ถ์ฅ |
jikime-harness-plan | ๋ฆด๋ฆฌ์ค ํ ๋ค์ ์ฌ์ดํด ์์ |
jikime-workflow-changelog | CHANGELOG ์์ฑ ํจํด ๊ณต์ |
/jikime:3-sync | harness-release ์ง์
์ ์ค ํ๋ |
Version: 1.0.0
Status: Active
Last Updated: 2026-03-15