name: release-app description: Automate the release process for Caffee app.
Instructions
When the user invokes this skill with an app path:
Extract version from filename
- The app filename format is
Caffee-v{VERSION}.app(e.g.,Caffee-v1.18.0.app) - Extract the version string including the 'v' prefix (e.g.,
v1.18.0) - Also extract just the number part for display (e.g.,
1.18.0)
- The app filename format is
Verify the app exists
- Check if the provided app path exists
- If not, report error and stop
Rename app to Caffee.app
- Copy/rename the app to
Caffee.appin the same directory - This ensures consistent naming when users install the app
- Example:
cp -R ~/Documents/Caffee-v1.18.0 ~/Documents/Caffee.app
- Copy/rename the app to
Create DMG
- Run:
create-dmg Caffee.app .(use the renamed Caffee.app) (use which for get path) - This creates a DMG in the current directory
- Rename the output to
Caffee-{VERSION}.dmg(e.g.,Caffee-v1.18.0.dmg) - Clean up: remove the temporary Caffee.app copy
- Run:
Sign the DMG
- Run:
sign_update Caffee-{VERSION}.dmg(use which for get path) - Capture the output which contains:
sparkle:edSignature="..."length="..."
- Parse and extract the signature and file size
- Run:
Get file size and checksum
- Get file size:
stat -f%z Caffee-{VERSION}.dmg - Get SHA256 checksum:
shasum -a 256 Caffee-{VERSION}.dmg
- Get file size:
Update web/appcast.xml
- Add a new
<item>element at the top of the channel (before existing items) - Use current date in RFC 2822 format for pubDate
- The download URL format:
https://github.com/khanhicetea/Caffee/releases/download/{VERSION}/Caffee-{VERSION}.dmg - Include the signature and length from sign_update output
- If release notes provided, use them; otherwise generate from git log since previous version
- the sparkle:version should be integer, e.g., 11901 (1.19.1 => 110000 + 19100 + 1)
- Add a new
Update web/index.html
- Update the download button version text and link
- Add new release notes entry in the Release Notes section with checksum
- Release notes (changelogs) translate into Vietnamese
Update web/download.html
- Update the meta refresh URL to point to the new DMG release
- Update the direct download link in the body
- URL format:
https://github.com/khanhicetea/Caffee/releases/download/{VERSION}/Caffee-{VERSION}.dmg
Summary
- Show summary of what was done
- Show the DMG path for upload to GitHub
- Remind user to:
- Upload DMG to GitHub releases at the tag
{VERSION} - Deploy updated web files
- Upload DMG to GitHub releases at the tag
Example appcast.xml item format
<item>
<title>Version 1.18.0</title>
<sparkle:version>1</sparkle:version>
<sparkle:shortVersionString>1.18.0</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>13.0</sparkle:minimumSystemVersion>
<pubDate>Thu, 30 Jan 2026 12:00:00 +0700</pubDate>
<enclosure
url="https://github.com/khanhicetea/Caffee/releases/download/v1.18.0/Caffee-v1.18.0.dmg"
sparkle:edSignature="SIGNATURE_HERE"
length="12345678"
type="application/octet-stream"
/>
<description><![CDATA[
<h2>What's New</h2>
<ul>
<li>Release notes here</li>
</ul>
]]></description>
</item>
Example index.html updates
Download button (around line 64):
<button class="secondary" onclick="location.href='/download.html?v=1.18.0'">
Tải app tại đây (v1.18.0)
</button>
Release notes section (after line 240):
<div>
<h5>v1.18.0</h5>
<ul>
<li>Checksum sha256 (Caffee-v1.18.0.dmg) :
<code>CHECKSUM_HERE</code>
</li>
<li>Release notes here</li>
</ul>
<hr />
</div>
Example download.html updates
Meta refresh tag (line 9):
<meta
http-equiv="refresh"
content="2; URL=https://github.com/khanhicetea/Caffee/releases/download/v1.18.0/Caffee-v1.18.0.dmg"
/>
Direct download link (line 24):
<a
href="https://github.com/khanhicetea/Caffee/releases/download/v1.18.0/Caffee-v1.18.0.dmg"
>bấm vào đây để tải ngay</a
>