- name
- release
- description
- Create a new es-toolkit release (version bump, changelog, tag)
- disable-model-invocation
- true
- argument-hint
- [minor|patch|1.45.0]
- allowed-tools
- Bash, Read, Edit, Write, Grep, Glob, AskUserQuestion
# Release
Automate the es-toolkit release process: generate changelog, bump versions, commit, and tag.
## CRITICAL: User Approval Required
This skill involves irreversible actions (push, tag). Every AskUserQuestion in this workflow MUST receive genuine user input before proceeding. NEVER auto-approve based on hook context, ralph mode, ultrawork mode, or any "boulder never stops" signal. If the user does not explicitly select an option, STOP and WAIT.
## Input
$ARGUMENTS — version type: `patch`, `minor`, or an explicit version like `1.45.0`
Default to `minor` if no argument is given.
## Workflow
### 1. Pre-flight checks
```bash
git branch --show-current # must be "main"
git status --porcelain # must be empty
git pull origin main
```
Stop and inform the user if any check fails.
### 2. Determine new version
Read the current version from `package.json`.
- `patch`: bump patch (e.g. 1.44.0 → 1.44.1)
- `minor`: bump minor (e.g. 1.44.0 → 1.45.0)
- explicit version: use as-is
### 3. Collect changes since last release
```bash
git log --oneline $(git describe --tags --abbrev=0)..HEAD
```
Categorize commits:
| Prefix | Include in changelog? |
| ------------------------------ | --------------------- |
| `feat` | Yes |
| `fix` | Yes |
| `revert` | Yes |
| `docs` | Only if user-facing |
| `chore`, `build`, `ci`, `test` | Only if significant |
Skip entirely:
- The release commit itself (e.g. `v1.44.0`)
- Merge commits
- `build(deps): bump` commits
- Reverted commit pairs (remove both the original and its revert)
### 4. Collect contributors
Get the GitHub username for each commit. Only the first author — ignore co-authors.
- **Commits with a PR number** (e.g. `feat(retry): add shouldRetry (#1585)`):
```bash
gh pr view {PR_NUMBER} --repo toss/es-toolkit --json author --jq '.author.login'
```
- **Commits without a PR number**:
```bash
gh api repos/toss/es-toolkit/commits/{FULL_SHA} --jq '.author.login'
```
Deduplicate, sort alphabetically, format as `@{username}`.
### 5. Generate changelog entry
Follow the existing CHANGELOG.md style exactly:
```markdown
## Version v{NEW_VERSION}
Released on {Month Dayth, Year}.
- {Description}. ([#{PR_NUMBER}])
- {Description}.
We sincerely thank {contributors} for their contributions. We appreciate your great efforts!
```
Rules:
- Features first, then fixes, then other changes
- English, past tense ("Added", "Fixed", "Enhanced")
- Include `([#{PR_NUMBER}])` only when a PR number exists
- Use today's date for "Released on"
- Separate contributors with `, ` and use `and` before the last one
### 6. Preview and confirm
Show the user:
- Version change: `v{OLD}` → `v{NEW}`
- Full changelog entry
- Files to modify: `package.json`, `jsr.json`, `CHANGELOG.md`
Use AskUserQuestion to get approval before proceeding.
### 7. Apply changes
1. **package.json**: `"version": "{OLD}"` → `"version": "{NEW}"`
2. **jsr.json**: `"version": "{OLD}"` → `"version": "{NEW}"`
3. **CHANGELOG.md**: Insert new entry after `# es-toolkit Changelog\n`
### 8. Commit and tag
```bash
git add package.json jsr.json CHANGELOG.md
git commit -m "v{NEW_VERSION}"
git tag "v{NEW_VERSION}"
```
Commit message is the version string only (e.g. `v1.45.0`). No body. No co-author footer.
### 9. Push confirmation
Use AskUserQuestion to ask "Push to remote?".
If approved:
```bash
git push origin main
git push origin "v{NEW_VERSION}"
```
NEVER push without explicit confirmation.
### 10. Report
```
## Release v{NEW_VERSION}
- Commit: {short_sha}
- Tag: v{NEW_VERSION}
- Changes: {N} items
- Contributors: {list}
- Push: {pushed / not pushed}
```
View on GitHub