# do-release
> [status|bump|changelog|notes|tag|publish] Release management - versioning, changelog generation, git tagging, and full release workflow.
- Author: Brandon Fryslie
- Repository: loom99-public/loom99-claude-marketplace
- Version: 20260203224452
- Stars: 0
- Forks: 0
- Last Updated: 2026-02-06
- Source: https://github.com/loom99-public/loom99-claude-marketplace
- Web: https://mule.run/skillshub/@@loom99-public/loom99-claude-marketplace~do-release:20260203224452
---
---
name: "do-release"
description: "[status|bump|changelog|notes|tag|publish] Release management - versioning, changelog generation, git tagging, and full release workflow."
context: fork
---
# Release Skill
Manage releases: version bumping, changelog generation, release notes, git tagging, and full publish workflow.
$ARGUMENTS
release
## Action Detection
Parse `$ARGUMENTS` to determine action:
1. **If `$ARGUMENTS` provided** → Parse for action keyword
2. **If no arguments** → Default to "status"
**Actions:**
- `status` (default) → Show release status
- `bump [level]` → Bump version (major/minor/patch, default: patch)
- `changelog` → Generate/update CHANGELOG.md
- `notes` → Show release notes for current version
- `tag` → Create git tag for current version
- `publish [level]` → Full release workflow
Set `action` and `action_args` based on parsed arguments.
---
## Action: status
Show current release state.
### Implementation
1. **Read version from plugin.json**:
```bash
grep '"version"' plugins/do/.claude-plugin/plugin.json | head -1 | sed 's/.*: *"\([^"]*\)".*/\1/'
```
2. **Get last git tag**:
```bash
git describe --tags --abbrev=0 2>/dev/null || echo "none"
```
3. **Count commits since tag**:
```bash
# If tag exists:
git rev-list ..HEAD --count
# If no tag:
git rev-list HEAD --count
```
4. **Check for uncommitted changes**:
```bash
git status --porcelain
```
5. **Get all plugin versions**:
- Read plugins/do/.claude-plugin/plugin.json
- Read plugins/do-more/.claude-plugin/plugin.json
- Read plugins/do-extra/.claude-plugin/plugin.json (if exists)
### Output
Display formatted status:
```
═══════════════════════════════════════
Release Status
Current Version: 0.5.21
Last Tag: v0.5.20 (or "none" if no tags)
Commits Since Tag: 15
Uncommitted Changes: [yes/no]
Plugins:
- do: 0.5.21
- do-more: 0.5.21
- do-extra: 0.5.15 (if exists)
Next: /do:release bump | changelog | publish
═══════════════════════════════════════
```
---
## Action: bump [level]
Increment version using semantic versioning.
### Implementation
1. **Parse level from action_args**:
- "major" → Increment major, reset minor and patch to 0
- "minor" → Increment minor, reset patch to 0
- "patch" or empty → Increment patch (default)
2. **Bump version**:
- For **patch**: Delegate to `just bump` (existing behavior)
- For **minor** or **major**: Manually update version:
- Read current version from `plugins/do/.claude-plugin/plugin.json`
- Parse: MAJOR.MINOR.PATCH
- Calculate new version based on level
- Update version in plugin.json files using `just bump-plugin` approach
- Update `.claude-plugin/marketplace.json`
3. **Display result**
### Output
```
═══════════════════════════════════════
Version Bump
Previous: 0.5.21
New: 0.6.0 (minor)
Updated:
- plugins/do/.claude-plugin/plugin.json
- plugins/do-more/.claude-plugin/plugin.json
- .claude-plugin/marketplace.json
Next: /do:release changelog | tag | publish
═══════════════════════════════════════
```
### Error Cases
- Invalid level → "Invalid level: must be major, minor, or patch"
---
## Action: changelog
Generate or update CHANGELOG.md from git commits.
### Implementation
1. **Get commits since last tag**:
```bash
# If tag exists:
git log ..HEAD --oneline --no-merges
# If no tag:
git log --oneline --no-merges
```
2. **Parse and group commits**:
- Scan commit messages for conventional commit prefixes
- Group by type:
- `feat:`, `add:` → **Added**
- `fix:`, `bug:` → **Fixed**
- `change:`, `update:`, `refactor:` → **Changed**
- Others → **Other**
- Strip prefix and clean up message
3. **Read existing CHANGELOG.md** (if exists)
4. **Generate new section**:
- Current version from plugin.json
- Current date (YYYY-MM-DD)
- Grouped changes
5. **Write CHANGELOG.md**:
- If file exists: Prepend new section
- If file doesn't exist: Create with header + new section
### CHANGELOG.md Format
Follow [Keep a Changelog](https://keepachangelog.com/) format:
```markdown
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.5.22] - 2026-01-19
### Added
- New feature X
- New feature Y
### Changed
- Updated Z
### Fixed
- Bug fix A
## [0.5.21] - 2026-01-18
...
```
### Output
```
═══════════════════════════════════════
Changelog Updated
Version: 0.5.22
Commits Processed: 15
Added: 3 entries
Changed: 5 entries
Fixed: 2 entries
Other: 5 entries
File: CHANGELOG.md
Next: /do:release notes | tag | publish
═══════════════════════════════════════
```
### Error Cases
- No commits since tag → "No commits since last release. Nothing to add to changelog."
- Git error → Display git error message
---
## Action: notes
Display release notes for current version.
### Implementation
1. **Read current version from plugin.json**
2. **Extract section from CHANGELOG.md**:
- If CHANGELOG.md exists:
- Find section with `## [version]`
- Extract everything until next `## [` or EOF
- If CHANGELOG.md doesn't exist:
- Generate from commits (same logic as changelog action)
- Don't save to file
3. **Format for display**
### Output
```
═══════════════════════════════════════
Release Notes: v0.5.22
### Added
- New feature X
- New feature Y
### Changed
- Updated Z implementation
### Fixed
- Bug fix A
- Bug fix B
═══════════════════════════════════════
```
### Error Cases
- No CHANGELOG.md and no commits → "No release notes available. Run /do:release changelog first."
---
## Action: tag
Create git tag for current version.
### Implementation
1. **Read current version from plugin.json**
2. **Check if tag exists**:
```bash
git tag -l "v"
```
3. **If tag exists** → Error with instructions
4. **Create annotated tag**:
- Tag name: `v` (e.g., `v0.5.22`)
- Tag message: `Release v`
```bash
git tag -a v -m "Release v"
```
5. **Display success**
### Output
```
═══════════════════════════════════════
Git Tag Created
Tag: v0.5.22
Type: Annotated
Message: "Release v0.5.22"
Next: git push origin v0.5.22
(or use /do:release publish to automate)
═══════════════════════════════════════
```
### Error Cases
- Tag already exists → "Tag v0.5.22 already exists. Delete with: git tag -d v0.5.22"
- Git error → Display git error message
---
## Action: publish [level]
Full release workflow - orchestrates all actions.
### Implementation
**Steps:**
1. **Validate**:
- Run `just validate`
- If fails: Abort with error details
2. **Check state**:
- Check for uncommitted changes
- If yes: Display warning and prompt for confirmation
- If user declines: Abort
3. **Bump version**:
- Run `bump` action with specified level (from action_args)
- Default: patch
4. **Generate changelog**:
- Run `changelog` action
5. **Commit changes**:
```bash
git add -A
git commit -m "Release v"
```
6. **Create tag**:
- Run `tag` action
7. **Display summary**:
- Show completion status
- Show push commands
### Output
```
═══════════════════════════════════════
Release Complete: v0.5.22
✓ Validation passed
✓ Version bumped: 0.5.21 → 0.5.22 (patch)
✓ Changelog updated
✓ Changes committed
✓ Tag created: v0.5.22
Push to remote:
git push origin master
git push origin v0.5.22
═══════════════════════════════════════
```
### Error Cases
| Condition | Response |
|-----------|----------|
| Validation fails | Abort with error details |
| Tag exists | Error with delete instructions |
| No commits since tag | "Nothing to release. No commits since last tag." |
| Uncommitted changes | Warning, prompt for confirmation |
| Git error | Display error and rollback instructions |
---
## Error Handling Summary
| Error Type | Action | Response |
|------------|--------|----------|
| Validation failure | All | Abort with details |
| Tag exists | tag, publish | Error + delete instructions |
| No commits | changelog, publish | "Nothing to release" |
| Uncommitted changes | publish | Warning + confirmation |
| Invalid level | bump | Error with valid options |
| Git error | All | Display error message |
---
## Dependencies
- `just validate` - Plugin validation (must pass)
- `just bump` - Existing patch bump (delegates for patch level)
- Git commands - For commits, tags, logs
- plugin.json files - Source of truth for versions
---
## Notes
- **Version source of truth**: `plugins/*/. claude-plugin/plugin.json`
- **Marketplace sync**: `.claude-plugin/marketplace.json` is updated in sync
- **Tag format**: `v{version}` (e.g., `v0.5.22`)
- **Changelog format**: Keep a Changelog standard
- **Commit message**: `Release v{version}` for publish workflow