MiaoYan Release Workflow
SkillDev toolsLets your agent prepare, validate, and publish a GitHub release with direct downloads.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the MiaoYan Release Workflow skill
About this capability
Prepare, validate, and publish a MiaoYan direct-download GitHub Release. Not for App Store builds.
What this skill tells your AI
The instructions your AI receives, as published by tw93/miaoyan in .agents/skills/release/SKILL.md and read by ahel’s review.
Use this skill only when the maintainer explicitly asks for a GitHub Release.
Version Rules
- Release tags use uppercase
Vx.y.z. MARKETING_VERSIONinMiaoYan.xcodeproj/project.pbxprojmust match the tag without the leadingV.CURRENT_PROJECT_VERSIONmust equalMARKETING_VERSION. Sparkle comparessparkle:versionin appcast.xml against the app'sCFBundleVersion(which maps toCURRENT_PROJECT_VERSION). If they diverge, users get an infinite update prompt loop (see V3.5.1 incident, #524).- Release notes should be prepared before tagging.
- Signing, notarization, and Sparkle credentials are maintainer-managed. Do not commit credential paths, private key filenames, passwords, or secret values.
- Sparkle signing must use the MiaoYan release key. Do not rely on the default Sparkle Keychain account because it may belong to another app.
Release Notes Format
- Before drafting, read the previous published release and treat it as the hard format template:
gh release view $(gh release list --limit 1 --json tagName --jq '.[0].tagName'). Do not rebuild the shape from memory. - Title is
V{x.y.z} {Codename} {emoji}, e.g.V4.0.0 Valstrax 🚀. The codename follows the monster-name-plus-emoji convention used byscripts/release-ci/generate_release_content.sh. - Source of truth is
.github/RELEASE_NOTES.md:# V{x.y.z} {Codename} {emoji}heading, Chinese numbered list,---separator, English numbered list, items mapped one-to-one.scripts/release-ci/render_release_body.shrenders it into the HTML release body (centered logo block + tagline,<h3>Changelog</h3>English list,<h3>更新日志</h3>Chinese list, closing star ask + repo blockquote). - Keep 3 to 6 items per language, one sentence each, engineer-facing.
Preflight
git diff --quiet && git diff --cached --quiet
grep "MARKETING_VERSION" MiaoYan.xcodeproj/project.pbxproj | head -1
grep "CURRENT_PROJECT_VERSION" MiaoYan.xcodeproj/project.pbxproj | head -1
gh release list --limit 10
gh run list --limit 10
Stop if:
- The working tree is dirty.
- The version is unclear.
CURRENT_PROJECT_VERSIONdoes not equalMARKETING_VERSION(hard stop, fix before proceeding).- The intended tag already exists and recovery has not been discussed.
Build And Publish
Use the repository's release scripts for the actual build, packaging, signing, notarization, and appcast update. The only tracked workflow is ci.yml; do not assume a release.yml workflow exists.
When a local release script is required, confirm these before running it:
- Required signing identities are available on the maintainer machine.
- Required secrets are available through the intended channel.
- The generated DMG, ZIP, and Sparkle metadata point to the same version.
- The ZIP used by the appcast is the file that was signed for Sparkle.
Verification
gh release view Vx.y.z
gh run list --limit 5
After publication, confirm that the release assets exist, the appcast points at the intended ZIP, and the Sparkle signature metadata matches the published ZIP.
Use scripts/release-ci/verify_sparkle_signature.sh --zip <zip> --signature <signature> to verify the appcast signature against the ZIP bytes and the app's embedded SUPublicEDKey before pushing appcast changes.
Reactions are part of publish completion. After the release is live, add the six positive reactions and read them back to confirm:
rid=$(gh api repos/tw93/MiaoYan/releases/tags/V<x.y.z> --jq .id)
for r in +1 laugh heart hooray rocket eyes; do gh api -X POST repos/tw93/MiaoYan/releases/$rid/reactions -f content="$r"; done
gh api repos/tw93/MiaoYan/releases/$rid/reactions --jq '.[].content'
Never add -1 or confused; a negative reaction on our own release reads as self-deprecation.
Safety Rules
- Never tag, upload assets, update appcast, or publish a release without explicit maintainer confirmation.
- Never commit local credential paths or secret filenames.
- If notarization or signing fails, report the exact failure and stop before changing credentials.
Signals
- GitHub stars
- 9k
- Forks
- 509
- Last commit
- Sep 2026
- Hacker News mentions
- 20
Advanced
- Catalog kind
- skill
- Gateway key
release-tw93- Source
- github.com/tw93/miaoyan