Release
Skill itsdevcoffee/devcoffee-agent-skills/.claude/skills/release
Use when releasing a new plugin version - prevents forgotten tags, version mismatches, dirty commits, and minimal CHANGELOGs under time/authority/exhaustion pressureFrom its SKILL.md
npx -y skills add itsdevcoffee/devcoffee-agent-skills --skill releaseAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
9.1 KB, as published. Nobody here has run it
Plugin Release Workflow
Overview
This workflow prevents the 7 deadly sins of rushed releases: forgotten tags, version mismatches, dirty commits, minimal CHANGELOGs, skipped validation, unverified commits, and generic commit messages.
Core principle: Quality process applies to ALL releases - patches, minors, and majors. No shortcuts.
When to Use
Use when:
- Releasing a new plugin version
- User says "release", "publish", "bump version", "tag"
- About to update CHANGELOG and version files
- Under ANY pressure (time, authority, exhaustion, sunk cost)
Use ESPECIALLY when:
- Team lead says "just get it out quickly"
- Users are waiting for the fix
- It's late and you're tired
- "It's just a patch version"
- "I can do X later"
The Checklist
IMPORTANT: Complete ALL steps in order. NO skipping, NO deferring, NO shortcuts.
Step 1: Identify Plugin and Version
**Plugin:** [name]
**Current version:** [X.Y.Z]
**New version:** [X.Y.Z]
**Version type:** [MAJOR | MINOR | PATCH]
Verify semantic versioning:
- MAJOR: Breaking changes, incompatible API changes
- MINOR: New features, backwards-compatible
- PATCH: Bug fixes, backwards-compatible
Step 2: Update CHANGELOG.md
Location: /home/maskkiller/dev-coffee/repos/devcoffee-agent-skills/CHANGELOG.md
Actions:
- Read current
[Unreleased]section - Move ALL entries to new
[<plugin> vX.Y.Z] - YYYY-MM-DDsection - Verify entries have proper categories:
### Added- New features### Changed- Changes to existing functionality### Fixed- Bug fixes### Removed- Removed features### Deprecated- Soon-to-be removed features### Security- Security fixes
- Verify detail quality:
- Each entry describes WHAT changed
- Impact or context included
- Migration notes if breaking change
❌ NOT ACCEPTABLE:
- Generic entries: "Fixed bug"
- One-line summaries without context
- Missing category headers
✅ GOOD EXAMPLE:
## [tldr v1.1.3] - 2026-02-15
### Fixed
- Fixed evaluation scoring logic to properly weight clarity criteria (was treating all criteria equally, now uses configured weights from EVALUATION.md)
Step 3: Update Version Files
Update ALL 3 locations (or 2 if plugin-metadata.json doesn't exist):
<plugin>/.claude-plugin/plugin.json.claude-plugin/marketplace.json(find the plugin's entry)<plugin>/.claude-plugin/plugin-metadata.json(if exists)
For each file:
- Read current version
- Edit to new version
- Verify change was applied correctly
Cross-reference check: After all edits, verify all locations match.
Step 4: Run Validation
cd /home/maskkiller/dev-coffee/repos/devcoffee-agent-skills
npm run readme:validate
STOP if validation fails. Fix issues before continuing.
Step 5: Stage Specific Files
NO git add -A shortcuts. List exact files:
git add CHANGELOG.md
git add <plugin>/.claude-plugin/plugin.json
git add .claude-plugin/marketplace.json
# If exists:
git add <plugin>/.claude-plugin/plugin-metadata.json
Verify staging:
git diff --staged
Review: Ensure ONLY version/CHANGELOG files are staged. No unrelated changes.
Step 6: Create Commit
Format (non-negotiable): chore(<plugin>): release vX.Y.Z
Why this exact format?
choretype = non-functional change (standard for releases)(<plugin>)scope = clear ownership in monorepo- CHANGELOG automation tools expect this pattern
Body: Brief summary of changes from CHANGELOG.
Example:
git commit -m "$(cat <<'EOF'
chore(tldr): release v1.1.3
Fixed evaluation scoring logic to properly weight clarity criteria.
EOF
)"
Verify commit:
git show --stat
Step 7: Create Git Tag
CRITICAL: Do this NOW, not "later".
Format: <plugin>-vX.Y.Z (plugin-prefixed to avoid conflicts in monorepo)
Example:
git tag tldr-v1.1.3
Verify tag created:
git tag -l "*<plugin>*" | tail -5
Confirm: Tag appears in list.
Step 8: Final Verification
REQUIRED: Copy this checklist and mark each item with ✓:
- [ ] CHANGELOG has detailed entry under [<plugin> vX.Y.Z]
- [ ] All version files updated and match
- [ ] Validation passed (npm run readme:validate)
- [ ] Only version/CHANGELOG files staged (no dirty commits)
- [ ] Commit message follows format: chore(<plugin>): release vX.Y.Z
- [ ] Git tag created with plugin prefix (<plugin>-vX.Y.Z)
- [ ] Tag verified in git tag -l output
If you cannot mark ALL items with ✓, STOP and fix it. No exceptions.
Step 9: Push Release
Command (atomic push):
git push origin main --tags
Why push commit and tags together?
- Tag without pushed commit = local-only, invisible to others
- Commit without pushed tag = unversioned code in production
- Both together = atomic release, visible version, rollback-safe
❌ FORBIDDEN partial pushes:
git push(without --tags)git push --tags(without commit)- Pushing commit and tags in separate operations
Verify push succeeded:
git ls-remote --tags origin | grep <plugin>
Confirm: Tag appears on remote.
Step 10: Announce Completion
✅ Release complete for <plugin> v<X.Y.Z>
**Released:**
- Version: <X.Y.Z>
- Tag: <plugin>-v<X.Y.Z>
- Commit: [short hash]
**Next steps:**
- Monitor for any issues
- Update documentation if needed
- Communicate release to users
Red Flags - STOP Immediately
These thoughts mean you're rationalizing shortcuts:
| Thought | Reality |
|---|---|
| "I can create the tag later" | Tags deferred are tags forgotten. Do it NOW. |
| "It's just a patch version" | Process applies to ALL versions. |
| "Team lead wants it quick" | Broken release hurts users more than delay. |
| "Users are waiting" | Quality over speed. Always. |
| "I already spent 2 hours" | Sunk cost fallacy. Don't compound with rushed release. |
| "The commit looks clean" | Verify what's staged. Don't assume. |
| "CHANGELOG is fine" | Read it. Is it detailed enough? |
| "git add -A is faster" | Fast = dirty commits with unrelated files. |
| "I'll add details to the CHANGELOG later" | CHANGELOG is part of the release. Write it now or don't release. |
| "I did all the steps, skip the checklist" | Verification prevents mistakes. Check ALL items. |
If you catch yourself rationalizing, STOP. Follow the checklist.
Version File Reference
When plugin-metadata.json exists:
Check these plugins: devcoffee, video-analysis, remotion-max, maximus-loop, tldr, opentui-dev, expo-cunningham
If missing: That's normal for some plugins. Just update the 2 required files:
<plugin>/.claude-plugin/plugin.json.claude-plugin/marketplace.json
Tag Naming Convention
Format: <plugin>-vX.Y.Z
Examples:
tldr-v1.1.3maximus-loop-v0.3.1devcoffee-v0.5.2
Why plugin prefix?
- Monorepo with 6+ plugins
- Prevents tag conflicts when multiple plugins release same version number
- Clear ownership in git history
❌ NEVER use: v1.1.3 (ambiguous in monorepo)
Semantic Versioning Guide
Given a version number MAJOR.MINOR.PATCH:
-
MAJOR: Incompatible API changes, breaking changes
- Removing commands/skills/agents
- Changing skill behavior that breaks existing workflows
- Requires user action to migrate
-
MINOR: New functionality, backwards-compatible
- Adding new commands/skills/agents
- Enhancing existing features without breaking changes
- New optional parameters
-
PATCH: Bug fixes, backwards-compatible
- Fixing broken functionality
- Documentation updates
- Performance improvements
When uncertain: Prefer higher version (MINOR over PATCH, MAJOR over MINOR).
Common Mistakes
Mistake 1: Forgetting the Tag
Symptom: Commit and push, but no tag created.
Fix: Tags are step 7, BEFORE push (step 9). Never defer.
Mistake 2: Version Mismatch
Symptom: plugin.json says 1.1.3, marketplace.json says 1.1.2.
Fix: Cross-reference check in step 3. All locations must match.
Mistake 3: Dirty Commit
Symptom: Release commit includes unrelated file changes.
Fix: Stage specific files (step 5), verify with git diff --staged.
Mistake 4: Generic CHANGELOG
Symptom: Entry says "Fixed bug" with no context.
Fix: Step 2 requires detailed entries with WHAT changed and WHY.
Mistake 5: Generic Tag Name
Symptom: Tag is v1.1.3 instead of tldr-v1.1.3.
Fix: Step 7 explicitly requires plugin-prefixed format.
Mistake 6: Skipped Validation
Symptom: Push fails or marketplace has schema errors.
Fix: Step 4 runs validation BEFORE commit. Never skip.
The Bottom Line
Rushing releases creates debt. Forgotten tags, dirty commits, minimal CHANGELOGs - these compound over time.
10 minutes now saves hours later.
Follow the checklist. Every step. Every time.