Bumps plugin versions across the Agent Alchemy ecosystem
Bumps plugin versions across multiple files, updates changelogs, and creates conventional commits.
/plugin marketplace add sequenzia/agent-alchemy/plugin install agent-alchemy-plugin-tools@agent-alchemyThis skill is limited to using the following tools:
Automate version bumps across the Agent Alchemy ecosystem. Scans 5 version locations per plugin, detects drift, applies consistent updates, adds a CHANGELOG entry, and creates a conventional commit.
CRITICAL: Complete ALL 6 phases. The workflow is not complete until Phase 6: Commit is finished. After completing each phase, immediately proceed to the next phase without waiting for user prompts.
IMPORTANT: You MUST use the AskUserQuestion tool for ALL questions to the user. Never ask questions through regular text output.
Text output should only be used for:
If you need the user to make a choice or provide input, use AskUserQuestion.
NEVER do this (asking via text output):
Which plugins would you like to bump?
1. core-tools
2. dev-tools
ALWAYS do this (using AskUserQuestion tool):
AskUserQuestion:
questions:
- header: "Plugins"
question: "Which plugins would you like to bump?"
options:
- label: "core-tools (0.1.1)"
description: "Current version: 0.1.1"
- label: "dev-tools (0.1.1)"
description: "Current version: 0.1.1"
multiSelect: true
CRITICAL: This skill performs an interactive version bump workflow, NOT an implementation plan. When invoked during Claude Code's plan mode:
Execute these phases in order, completing ALL of them:
## [Unreleased] in CHANGELOG.mdGoal: Read the marketplace registry and build a complete plugin inventory.
Parse $ARGUMENTS for:
--plugin <group,...> — Comma-separated list of plugin groups to bump (e.g., --plugin core-tools,dev-tools). Default: prompt for selection in Phase 3.--level patch|minor|major — Bump level. Default: prompt for selection in Phase 3.--dry-run — Show what would change without modifying files. Default: false.Set variables:
PLUGIN_FILTER from --plugin value (default: null = prompt in Phase 3)BUMP_LEVEL from --level value (default: null = prompt in Phase 3)DRY_RUN from --dry-run flag (default: false)Read the marketplace registry:
Read: ${CLAUDE_PLUGIN_ROOT}/../../.claude-plugin/marketplace.json
Build a plugin map from the plugins array:
{
group_name -> {
marketplace_name: "agent-alchemy-{group}",
version: "x.y.z",
source_dir: "{group}"
}
}
The group_name is derived from the source field by stripping the leading ./.
Display the current plugin inventory:
[Phase 1/6] Plugin Inventory
| Plugin | Marketplace Name | Current Version |
|--------|-----------------|-----------------|
| core-tools | agent-alchemy-core-tools | 0.1.1 |
| dev-tools | agent-alchemy-dev-tools | 0.1.1 |
| sdd-tools | agent-alchemy-sdd-tools | 0.1.2 |
| tdd-tools | agent-alchemy-tdd-tools | 0.1.0 |
| git-tools | agent-alchemy-git-tools | 0.1.0 |
| plugin-tools | agent-alchemy-plugin-tools | 0.1.0 |
Goal: Scan all 5 version locations and detect inconsistencies against marketplace.json (the source of truth).
For each plugin, versions appear in up to 5 locations:
| # | File | Description |
|---|---|---|
| 1 | claude/.claude-plugin/marketplace.json | Source of truth — JSON "version" field |
| 2 | CLAUDE.md (root) | Plugin Inventory table — | {group} | ... | {version} | |
| 3 | docs/index.md | Project Status table — | {Display Name} | {version} | {status} | |
| 4 | docs/plugins/index.md | At a Glance table — | [{Name}](...) | ... | {version} | |
| 5 | docs/plugins/{group}.md | Per-plugin doc file — format varies (see Per-Plugin Formats below) |
Each plugin doc uses a different version format. When scanning, look within the first 15 lines:
| Plugin | Format | Example |
|---|---|---|
| core-tools | Parenthetical in prose + vertical table | Core Tools (v0.1.1) provides... and | **Version** | 0.1.1 | |
| dev-tools | Bold metadata line | **Version:** 0.1.1 | **Skills:** ... |
| sdd-tools | Bold metadata with plugin name | **Plugin:** ... | **Version:** 0.1.2 | ... |
| tdd-tools | Backtick-wrapped parenthetical | (`v0.1.0`) in prose |
| git-tools | Bold metadata line | **Version:** 0.1.0 | **Skills:** ... |
| plugin-tools | Bold metadata with plugin name | **Plugin:** ... | **Version:** 0.1.0 | ... |
For each plugin in the inventory:
Location 2 (CLAUDE.md): Read the Plugin Inventory table. Find the row matching the plugin group name. Extract the version from the last column.
Location 3 (docs/index.md): Read the Project Status table. Find the row matching the plugin's display name. Extract the version. Note: not all plugins may be listed here — skip silently if absent.
Location 4 (docs/plugins/index.md): Read the At a Glance table. Find the row matching the plugin name. Extract the version from the Version column.
Location 5 (docs/plugins/{group}.md): Read the first 15 lines. Search for the version string using the format described in Per-Plugin Formats above.
Compare each found version against the marketplace.json version (Location 1). Record any mismatches.
[Phase 2/6] Version Drift Check
✓ No drift detected — all locations consistent.
Or if drift is found:
[Phase 2/6] Version Drift Check
| Plugin | Location | Expected | Found |
|--------|----------|----------|-------|
| core-tools | docs/plugins/core-tools.md | 0.1.1 | 0.1.0 |
| dev-tools | CLAUDE.md | 0.1.1 | 0.1.0 |
If drift was detected, present resolution options via AskUserQuestion:
AskUserQuestion:
questions:
- header: "Drift"
question: "Version drift detected in N locations. How should we proceed?"
options:
- label: "Fix drift first"
description: "Update drifted locations to match marketplace.json before bumping"
- label: "Ignore and bump"
description: "Proceed with version bump — drifted locations will be overwritten with new version"
- label: "Abort"
description: "Stop the workflow to investigate manually"
multiSelect: false
If Fix drift first: Use Edit to update each drifted location to match marketplace.json, then continue to Phase 3.
If Ignore and bump: Continue to Phase 3. The bump will overwrite with the new version anyway.
If Abort: Display the drift details and exit.
Goal: Determine which plugins to bump and the bump level. Compute new versions.
If PLUGIN_FILTER was provided via --plugin, use those plugins. Validate each against the inventory — warn and skip any that don't exist.
Otherwise, present a multi-select via AskUserQuestion listing all plugins with their current versions. The options should include each plugin as a selectable item.
If BUMP_LEVEL was provided via --level, use it.
Otherwise, ask via AskUserQuestion:
AskUserQuestion:
questions:
- header: "Bump Level"
question: "What type of version bump?"
options:
- label: "Patch (x.y.Z)"
description: "Bug fixes, minor updates — most common for skill changes"
- label: "Minor (x.Y.0)"
description: "New features, new skills or agents"
- label: "Major (X.0.0)"
description: "Breaking changes to skill interfaces or agent contracts"
multiSelect: false
For each selected plugin, compute the new version by applying the bump level:
[Phase 3/6] Bump Plan
| Plugin | Current | New | Level |
|--------|---------|-----|-------|
| core-tools | 0.1.1 | 0.1.2 | patch |
| dev-tools | 0.1.1 | 0.1.2 | patch |
If DRY_RUN is true:
[Dry Run] No files will be modified. Showing what would change:
Files that would be edited:
- claude/.claude-plugin/marketplace.json (2 entries)
- CLAUDE.md (2 rows in Plugin Inventory)
- docs/index.md (2 rows in Project Status — if present)
- docs/plugins/index.md (2 rows in At a Glance)
- docs/plugins/core-tools.md (2 version occurrences)
- docs/plugins/dev-tools.md (1 version occurrence)
- CHANGELOG.md (1 new entry)
Dry run complete.
Then stop — do NOT proceed to Phase 4.
Goal: Edit all 5 version locations for each selected plugin.
CRITICAL: Track every file modified in a MODIFIED_FILES list for Phase 6 staging.
Read claude/.claude-plugin/marketplace.json. For each selected plugin, use Edit to replace the old version string with the new one. Target the specific "version": "old_version" line within that plugin's entry block.
Read the Plugin Inventory table in the root CLAUDE.md. For each selected plugin, find the row matching the group name and use Edit to replace the old version with the new version in that row. Use enough surrounding context to ensure a unique match.
Read the Project Status table in docs/index.md. For each selected plugin, find the row matching the plugin's display name. Use Edit to replace the old version with the new one.
Note: Not all plugins appear in this table. If a plugin is not found, skip silently — do not abort or warn.
Read the At a Glance table in docs/plugins/index.md. For each selected plugin, find the row and use Edit to replace the old version with the new one.
For each selected plugin, read the first 15 lines of docs/plugins/{group}.md and update version occurrences using the format-specific patterns:
core-tools — Two occurrences:
(v{old}) → (v{new}) in the prose paragraph| **Version** | {old} | → | **Version** | {new} |dev-tools — One occurrence:
**Version:** {old} → **Version:** {new}sdd-tools — One occurrence:
**Version:** {old} → **Version:** {new}tdd-tools — One occurrence:
(`v{old}`) → (`v{new}`)git-tools — One occurrence:
**Version:** {old} → **Version:** {new}plugin-tools — One occurrence:
**Version:** {old} → **Version:** {new}MODIFIED_FILESAfter completing all edits:
[Phase 4/6] Version Bump Complete
Updated N files across N plugins:
- claude/.claude-plugin/marketplace.json ✓
- CLAUDE.md ✓
- docs/index.md ✓ (N of N plugins found)
- docs/plugins/index.md ✓
- docs/plugins/core-tools.md ✓ (2 occurrences)
- docs/plugins/dev-tools.md ✓ (1 occurrence)
If any locations were skipped:
Skipped:
- docs/index.md: plugin-tools not found in table (OK — not listed)
Goal: Add version bump entries under ## [Unreleased] in CHANGELOG.md.
Read CHANGELOG.md from the repository root. Find the ## [Unreleased] section.
Group bumped plugins by version transition for concise entries. For example, if core-tools and dev-tools both went from 0.1.1 to 0.1.2:
### Changed
- Bump core-tools and dev-tools from 0.1.1 to 0.1.2
If plugins had different starting versions:
### Changed
- Bump core-tools and dev-tools from 0.1.1 to 0.1.2
- Bump sdd-tools from 0.1.2 to 0.1.3
Use Edit to insert the changelog entry immediately after the ## [Unreleased] line. If there is already content under [Unreleased], add the new entry after any existing entries (before the next ## [x.y.z] heading or end of section). If a ### Changed section already exists under [Unreleased], append to it rather than creating a duplicate.
Add CHANGELOG.md to MODIFIED_FILES.
[Phase 5/6] Changelog Updated
Added entry under [Unreleased]:
- Bump core-tools and dev-tools from 0.1.1 to 0.1.2
Goal: Stage all modified files and create a conventional commit.
Stage each file in MODIFIED_FILES individually using git add:
git add claude/.claude-plugin/marketplace.json
git add CLAUDE.md
git add docs/index.md
git add docs/plugins/index.md
git add docs/plugins/core-tools.md
git add docs/plugins/dev-tools.md
git add CHANGELOG.md
CRITICAL: Do NOT use git add -A or git add .. Only stage files that were actually modified by this skill.
Build the commit message:
Single plugin:
chore(marketplace): bump {group} to {new_version}
Multiple plugins, same new version:
chore(marketplace): bump {group1}, {group2} to {new_version}
Multiple plugins, different new versions:
chore(marketplace): bump {group1} to {v1}, {group2} to {v2}
Create the commit:
git commit -m "$(cat <<'EOF'
chore(marketplace): bump core-tools, dev-tools to 0.1.2
EOF
)"
Run git status to verify the commit succeeded.
[Phase 6/6] Committed
chore(marketplace): bump core-tools, dev-tools to 0.1.2
Staged files: N
Commit: {short_hash}
If the commit fails (e.g., pre-commit hook):
--amend or --no-verify/git-commit manuallyIf a docs/plugins/{group}.md file doesn't exist for a selected plugin, warn and skip:
Warning: docs/plugins/{group}.md not found — skipping Location 5 for {group}
If a version string can't be found at an expected location:
Warning: Could not find version {old} in {file} at expected location — skipping
Continue with other locations. Do not abort.
If a plugin doesn't appear in docs/index.md or docs/plugins/index.md tables, skip silently. These tables may not list all plugins.
If git commit fails:
--amend (would modify the previous commit)--no-verify (would skip hooks)If the user selects no plugins in Phase 3, display a message and exit:
No plugins selected. Exiting.
If --level has an unrecognized value, warn and prompt via AskUserQuestion.
You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.