release
This skill uses Claude hooks which can execute code automatically in response to events. Review carefully before installing.
Release Process
Release checklist for Simple History core plugin and add-ons.
Uses OneFlow branching model and semver versioning.
Release Order
Always release core first, then premium/add-ons.
Premium declares a minimum core version. While reversing the order won't crash (premium shows a graceful admin notice), releasing core first ensures compatibility.
Core Plugin Release
1. Create Release Branch
git checkout main
git pull
git checkout -b release-X.Y.Z
2. Bump Version
npm run bump:patch # or bump:minor / bump:major
This updates version in all three locations:
index.php(plugin headerVersion:andSIMPLE_HISTORY_VERSIONconstant)readme.txt(Stable tag:)package.json(version)
3. Update Changelog
In readme.txt, move items from ### Unreleased to a new versioned section:
### X.Y.Z (Month Year)
Remove the ### Unreleased heading entirely so the readme is clean. Do not keep an empty Unreleased section.
Do not update CHANGELOG.md during this step — it is maintained separately.
4. Add Update Details
If the release has significant changes, add update details to class-simple-history-updates.php. This is shown to users in the WordPress update screen. Show the user the changes for review (confirmed in the pre-tag checklist).
5. Run QA
npm run php:lint
npm run php:phpstan
npm run build
Run the three test suites in parallel using three separate Bash tool calls (with run_in_background: true) in a single message:
PHP_CLI_VERSION=81 PHP_VERSION=8.1 npm run test:wpunitPHP_CLI_VERSION=81 PHP_VERSION=8.1 npm run test:functionalPHP_CLI_VERSION=81 PHP_VERSION=8.1 npm run test:acceptance
Wait for all three to finish, then check results. Each suite is independent — they share the database container but don't conflict.
6. Write Blog Post
Write a blog post on simple-history.com as a draft (do not publish):
- Detailed changelog
- Screenshots where relevant
- Links to updated documentation
- Tagged with releases and changelog
The user will review and publish the blog post manually.
6b. Link Blog Post from readme.txt
Add a link to the blog post in the readme.txt changelog entry for this version. Place it right after the version heading, before the first changelog category. Use this format:
### X.Y.Z (Month Year)
Brief summary of the release highlights.
[Read more about it in the release post](https://simple-history.com/YYYY/simple-history-X-Y-Z-released/)
**Added**
The URL pattern is https://simple-history.com/YYYY/simple-history-X-Y-Z-released/ where dots in the version are replaced with hyphens.
7. Tag
Before tagging, ask the user to confirm ALL of these. Do not proceed until confirmed:
- Changelog in
readme.txtlooks correct - Update details in
class-simple-history-updates.phplook good - All tests pass (wpunit, functional, acceptance)
- Blog post is written on simple-history.com and linked from
readme.txtchangelog entry (with "Read more" link after version heading)
git tag X.Y.Z
8. Merge to Main
git checkout main
git merge release-X.Y.Z
git branch -d release-X.Y.Z
9. Push (MANUAL — do not run automatically)
STOP: Do not execute git push. Pushing the tag triggers deployment to WordPress.org and is irreversible. Remind the user to run these commands themselves:
git push origin main
git push origin X.Y.Z
Pushing the tag triggers the GitHub Actions workflow (.github/workflows/deploy.yml) which builds and deploys to WordPress.org via SVN.
10. Post-Release
- Wait for GitHub Actions to finish deploying
- Verify the new version appears on https://wordpress.org/plugins/simple-history/
- Test updating the plugin on:
- Follow up issues and support threads — answer and close resolved ones
Add-on Release (Premium and Others)
Add-ons live in a separate monorepo. See CLAUDE.local.md for the local path.
Branch and Tag Naming
Each add-on uses its own prefix:
| Add-on | Branch example | Tag example |
|---|---|---|
| Premium | premium/release-1.8.0 |
premium/1.8.0 |
| Debug and Monitor | debug-and-monitor/release-1.0.1 |
debug-and-monitor/1.0.1 |
| WooCommerce Logger | woocommerce-logger/release-1.0.4 |
woocommerce-logger/1.0.4 |
1. Test
Run tests and manual smoke testing. Verify features work with the latest core version.
2. Create Release Branch
git checkout main
git pull
git checkout -b <prefix>/release-X.Y.Z
3. Update Changelog
Update changelog in the add-on's readme.txt. Move items from ### Unreleased to a versioned section. Remove the ### Unreleased heading entirely so the readme is clean.
4. Update Translations
If texts have been added or modified, update translations using Claude's translate command.
5. Update Version
For Premium: Run Claude command version-update, which updates:
simple-history-premium.php— plugin header (Version: X.Y.Z)simple-history-premium.php—Config::init()array ('version' => 'X.Y.Z')readme.txt—Stable tag: X.Y.Z
For other add-ons: Manually update:
readme.txtindex.php(or similar main file, 2 places — header and constant)
6. Update Minimum Core Version (Premium Only)
Both of these must be updated together — keep them in sync!
In inc/functions.php:
- The
version_compare()check (the actual version gate) - The admin notice message string (the user-facing text)
7. Build (Premium Only)
npm run build
Build artifacts are committed for the premium plugin.
8. Tag
git tag <prefix>/X.Y.Z
9. Merge to Main
git checkout main
git merge <prefix>/release-X.Y.Z
git branch -d <prefix>/release-X.Y.Z
10. Push (MANUAL — do not run automatically)
STOP: Do not execute git push. Remind the user to run these commands themselves:
git push origin main
git push origin <prefix>/X.Y.Z
11. Create Distribution Zip
Premium:
npm run plugin-zip
Other add-ons: Use Keka to zip the plugin folder and add to releases folder.
Rename zip to include version: simple-history-premium-1.8.0.zip
12. Upload to Lemon Squeezy
- Go to https://app.lemonsqueezy.com/products/
- Upload zip to each variant
- Add new version number to each file uploaded
13. Update simple-history.com
- Update plugin info releases:
- Update version
- Update changelog
- Update date on add-on product page at
https://simple-history.com/add-ons/<plugin-slug>
14. Verify Update Delivery
Test that the plugin update is detected on:
- eskapism.se (has premium with license)
- Local test site (non-symlinked plugins, with license entered)
- simple-history.com (has the plugin but needs manual zip upload to update)
If no update is found, check Lemon Squeezy API errors and debug.
15. Blog Post
Write a blog post on simple-history.com describing the release. Add categories like premium and releases.
Version Locations Reference
Core Plugin
| File | Location | Example |
|---|---|---|
index.php |
Plugin header Version: |
Version: 5.22.0 |
index.php |
SIMPLE_HISTORY_VERSION constant |
define( 'SIMPLE_HISTORY_VERSION', '5.22.0' ) |
readme.txt |
Stable tag: |
Stable tag: 5.22.0 |
package.json |
version field |
"version": "5.22.0" |
Premium Plugin
| File | Location | Example |
|---|---|---|
simple-history-premium.php |
Plugin header Version: |
Version: 1.8.0 |
simple-history-premium.php |
Config::init() version |
'version' => '1.8.0' |
readme.txt |
Stable tag: |
Stable tag: 1.8.0 |
inc/functions.php |
version_compare() check |
Minimum core version gate |
inc/functions.php |
Admin notice message | User-facing version string |
More from bonny/wordpress-simple-history
changelog
Adds changelog entries to readme.txt following keepachangelog format. Use when updating the Unreleased section or documenting changes for a release.
23wordpress-org-compliance
Reviews plugin code for WordPress.org compliance and trialware violations. Use when checking premium features, upsells, or license keys before submission.
17logger-messages
Enforces active voice (verb-first) for all Simple History logger messages and the Event Details API for details output. Triggers: creating a new logger class, writing or modifying a 'messages' array in get_info()/getInfo(), calling notice_message/warning_message/info_message, or implementing get_log_row_details_output().
13code-quality
Runs linting and static analysis on PHP/CSS/JS using phpcs, phpstan, and rector. Use when checking code style, fixing lint errors, or running static analysis.
10sql
Run SQL queries against the WordPress development database. Use when querying database tables, inspecting Simple History events, checking WordPress data, debugging database issues, or when the user says "run query" or "check database".
7github-project
Use when working with the Simple History GitHub project board — updating issue status, querying board items, or automating project workflows.
1