con un clic
release
Build, notarize, sign, and publish a release of VibePad
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Build, notarize, sign, and publish a release of VibePad
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
| name | release |
| description | Build, notarize, sign, and publish a release of VibePad |
| disable-model-invocation | false |
Build a release-ready VibePad: notarize with Apple, sign with Sparkle EdDSA, create a GitHub Release. Optionally bump the version first.
The user may pass a version string (e.g. /release 1.1) to bump MARKETING_VERSION before building. If no version is given, use the current version from the project.
Check terminal permissions — DMG creation requires your terminal to have two macOS permissions. Ask the user to confirm they've granted both before proceeding:
Use AskUserQuestion to ask: "Before we start, please make sure your terminal has these permissions enabled in System Settings → Privacy & Security: (1) Automation → Finder, (2) Full Disk Access. Are both enabled?" — do NOT proceed until the user confirms.
If a version argument was provided, update MARKETING_VERSION in the VibePad target's Debug and Release build configurations in VibePad.xcodeproj/project.pbxproj. Also bump CURRENT_PROJECT_VERSION by 1 from its current value. Use the Edit tool — only change the two VibePad target configs (IDs 3DCDC9722F36A1750063EE37 and 3DCDC9732F36A1750063EE37), not the test targets.
Delete stale config so testers get the first-launch onboarding experience:
rm -f ~/.vibepad/config.json
# Archive
xcodebuild archive -scheme VibePad -destination 'platform=macOS' \
-archivePath /tmp/VibePad.xcarchive 2>&1 | tail -5
# Export with Developer ID signing
xcodebuild -exportArchive \
-archivePath /tmp/VibePad.xcarchive \
-exportOptionsPlist ExportOptions.plist \
-exportPath /tmp/VibePad-export 2>&1 | tail -5
APP_PATH="/tmp/VibePad-export/VibePad.app"
VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$APP_PATH/Contents/Info.plist")
BUILD=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$APP_PATH/Contents/Info.plist")
echo "Version: $VERSION ($BUILD)"
get-task-allow, and Sparkle helpers:codesign --verify --deep --strict "$APP_PATH"
codesign -d --entitlements - "$APP_PATH" 2>&1 # must NOT contain get-task-allow
codesign -dvv "$APP_PATH/Contents/Frameworks/Sparkle.framework/Versions/B/Autoupdate" 2>&1 | grep Authority
If any check fails, stop and report to the user.
STAGING="/tmp/VibePad-dmg-staging"
rm -rf "$STAGING" && mkdir -p "$STAGING"
cp -R "$APP_PATH" "$STAGING/"
chflags -R nouchg "$STAGING/" # unlock files (Sonoma+ uchg bug)
create-dmg \
--volname "VibePad" \
--volicon "$APP_PATH/Contents/Resources/AppIcon.icns" \
--background "/Users/vyuignatiov/code/VibePad/dmg-resources/background@2x.png" \
--window-pos 200 120 \
--window-size 660 400 \
--icon-size 128 \
--text-size 14 \
--icon "VibePad.app" 180 220 \
--hide-extension "VibePad.app" \
--app-drop-link 480 220 \
"/Users/vyuignatiov/code/VibePad/VibePad-${VERSION}.dmg" \
"$STAGING/"
xcrun notarytool submit "/Users/vyuignatiov/code/VibePad/VibePad-${VERSION}.dmg" --keychain-profile "vibepad" --wait
xcrun stapler staple "/Users/vyuignatiov/code/VibePad/VibePad-${VERSION}.dmg"
If notarization fails, stop and report the error to the user. Use xcrun notarytool log <submission-id> --keychain-profile "vibepad" to get the detailed error log.
SPARKLE_BIN=$(ls -td /Users/vyuignatiov/Library/Developer/Xcode/DerivedData/VibePad-*/SourcePackages/artifacts/sparkle/Sparkle/bin 2>/dev/null | head -1)
"$SPARKLE_BIN/sign_update" "/Users/vyuignatiov/code/VibePad/VibePad-${VERSION}.dmg"
This prints sparkle:edSignature="..." and length="..." — save these values.
git tag v${VERSION}
git push origin v${VERSION}
gh release create v${VERSION} "/Users/vyuignatiov/code/VibePad/VibePad-${VERSION}.dmg" --title "VibePad ${VERSION}" --generate-notes
sparkle:edSignature and length values (they'll need these for the appcast)/update-site next to update the website and auto-update feed