con un clic
release
// Prepare and execute a full OTGW-firmware release following the documented release process
// Prepare and execute a full OTGW-firmware release following the documented release process
Publish an OTGW-firmware beta prerelease — bump _VERSION_PRERELEASE, push to dev, tag, and let CI build + publish the GitHub prerelease
Update OTGW-firmware documentation in one sequential, backlog-tracked workflow (dev / 1.5.x line)
Build firmware + filesystem and flash to ESP via USB. Auto-detects serial port. No user input needed.
Architecture Decision Record (ADR) management skill. Creates, maintains, and enforces architectural decisions. Ensures code changes align with documented decisions. Documents alternatives considered and rejected. Facilitates architectural planning and human decision documentation.
Architecture Decision Record (ADR) management skill. Creates, maintains, and enforces architectural decisions. Ensures code changes align with documented decisions. Documents alternatives considered and rejected. Facilitates architectural planning and human decision documentation.
| name | release |
| description | Prepare and execute a full OTGW-firmware release following the documented release process |
| disable-model-invocation | true |
Prepare and execute a complete release of the OTGW-firmware project.
/release <version>
Example: /release 1.3.2
The version argument is the target release version (without v prefix). The previous version is auto-detected from the latest git tag.
limit=50 per channel for contributor detection, not 100. Releases are monthly; 50 messages captures all unique contributors.tee .tmp/build_release.log | tail -5. Only read the full log if exit code != 0. Never load verbose build output into context on success.gh issue list and gh pr list with --jq '.[] | {login: .author.login, title: .title}'. Only author and title are needed for contributor detection.bin/adr-context with the commit-message list to find relevant ADRs instead of manually reading ADR files.Follow these phases in order. There are only 2 mandatory checkpoints (marked with CHECKPOINT). All other phases proceed automatically unless something unexpected happens.
dev: git checkout devgit status — if dirty: stage, commit, pushgit pull — incorporate remote changesgit push origin dev — sync local and remotegit status must show nothing to commit, working tree cleangh release view --json tagName,name,publishedAt \
--jq '{tag: .tagName, title: .name, date: .publishedAt}'
Store tag name (e.g. v1.3.2) and published date.git fetch --tags && git log <prev-tag> --oneline -1git log <prev-tag>..HEAD --oneline -- src/ | grep -v "CI: update version.h"
If no code changes: warn the user and ask whether to proceed. (Conditional stop.)Check whether architectural changes since the previous release require new or updated ADRs.
bin/adr-context to identify relevant ADRs (uses commit messages as relevance signal):
ADR_KIT=$(ls -d ~/.claude/plugins/cache/rvdbreemen-adr-kit/adr-kit/*/ | sort -V | tail -1)
git log <prev-tag>..HEAD --format="%s" -- src/ | head -20 | \
"$ADR_KIT/bin/adr-context" --format text --limit 5
Read only the top-5 returned ADRs to check whether they cover the changes made.dev before proceeding.Conditional stop: Only pause if ADRs are actually needed. Otherwise proceed automatically.
dev and push to remote.mkdir -p .tmp
python build.py 2>&1 | tee .tmp/build_release.log | tail -10
echo "Exit: $?"
If exit code != 0: read .tmp/build_release.log for diagnosis, fix, retry.
If exit code == 0: proceed — do NOT read the full log.version.h changes from build and push.No checkpoint. Proceed automatically to Phase 3 on success.
git checkout main && git pull origin maingit merge devConditional stop: Only pause on merge conflicts.
Gather information and generate documentation. Write each document to disk as soon as it is generated — do NOT accumulate all content in context simultaneously.
Step 4a — Changes:
git describe --tags --abbrev=0git log <prev-tag>..HEAD --oneline (exclude "CI: update version.h")docs/adr/ since the previous release.Step 4b — Contributors (R1, R4):
Source 1 — GitHub issues & PRs (compact, R4):
DATE="<previous-release-date>"
gh issue list --state closed --search "closed:>$DATE" --limit 50 \
--json author,title --jq '.[] | "\(.author.login): \(.title)"'
gh pr list --state merged --search "merged:>$DATE" --limit 50 \
--json author,title --jq '.[] | "\(.author.login): \(.title)"'
Source 2 — Discord #beta-testing (R1 — limit 50):
mcp__discord-mcp__fetch_channel_history(channel_id="914498730001072149", limit=50)
Filter to messages since the previous release date. Extract unique contributor usernames. Strip trailing 4-digit suffixes (e.g. fuzzyduck3793 → fuzzyduck). Note what each person did.
Source 3 — Discord #devs-esp-firmware (R1 — limit 50):
mcp__discord-mcp__fetch_channel_history(channel_id="924989767966425158", limit=50)
Same filtering. Exclude maintainer (number3nl, user ID 384411356616720384) and bots.
Deduplicate across all three sources. Identify the most active contributor for a shoutout.
Step 4c — Generate documents sequentially (R3):
Generate each document and write it to disk immediately after creation. Keep only the filename in context after writing.
RELEASE_NOTES_<version>.md → write to repo root → note: "Written."RELEASE_GITHUB_<version>.md → write to repo root → note: "Written."docs/BREAKING_CHANGES.md (prepend new section) → note: "Updated."README.md (demote old "What's New", add new section) → note: "Updated."CHECKPOINT 1: Present a compact summary to the user (R3):
Changes: <N commits — key highlights in 3-5 bullets>
Contributors: <shoutout name> + <N others>
Documents written:
- RELEASE_NOTES_<version>.md
- RELEASE_GITHUB_<version>.md
- docs/BREAKING_CHANGES.md (updated)
- README.md (updated)
Ask: "Review the files above, then approve to proceed — or request changes."
Do NOT paste full document contents into context. The user reads the files directly.
Proceed directly after Phase 4 approval.
main and push.version.h: comment out _VERSION_PRERELEASE so the build produces a clean v<version>. Verify: grep -n "PRERELEASE" src/OTGW-firmware/version.hpython build.py 2>&1 | tee .tmp/build_release_final.log | tail -10
echo "Exit: $?"
Fix any issues. Read .tmp/build_release_final.log only on failure.main.gh release create v<version> --target main \
--title "v<version> - <Short Title>" \
--notes-file RELEASE_GITHUB_<version>.md --draft
Derive the short title (3-6 words) from the release theme. Examples: v1.3.2 - File Explorer Reliability Fix.gh release upload v<version> build/*.ino.bin build/*.littlefs.bin \
flash_otgw.sh flash_otgw.bat --clobber
gh release view v<version> --json assets --jq '.assets[].name'gh release edit v<version> --draft=false --latestGET /api/v2/device/info.#nederlandse-ondersteuning (channel ID: 815561033036333076)#english-support (channel ID: 931267109726593116)CHECKPOINT 2: Show both Discord messages to the user before sending.
git checkout dev && git merge mainversion.h: increment patch, uncomment _VERSION_PRERELEASE, set to betaautoinc-semver.py to update derived stringsfeat: Bump version to v<next>-beta for developmentdevWhen release notes need updating after publish, do all three in the same round:
RELEASE_NOTES_<version>.md, README.md, RELEASE_GITHUB_<version>.md) on main.main.gh release edit v<version> --notes-file RELEASE_GITHUB_<version>.mdmain back into dev: git checkout dev && git merge main && git push origin devSkipping step 3 leaves the repo and GitHub release page out of sync. Skipping step 4 means the next beta cycle starts from stale release docs.
python build.pydocs/process/RELEASE_PROCESS.md at the start of every releaseRELEASE_GITHUB_<version>.md, run gh release edit v<version> --notes-file RELEASE_GITHUB_<version>.md and merge main back into dev