Agent skill
upload-dmg
Upload the latest desktop DMG and update artifacts to install.vibesos.com. Use when the user says "upload the DMG", "update install link", "push new DMG", or "release desktop app".
Install this agent skill to your Project
npx add-skill https://github.com/popmechanic/VibesOS/tree/main/vibes-desktop/build/stable-macos-arm64/VibesOS.app/Contents/Resources/vibes-plugin/skills/upload-dmg
Metadata
Additional technical details for this skill
- author
- Marcus Estes
SKILL.md
Upload DMG and Update Artifacts to install.vibesos.com
Upload the latest built DMG and auto-updater artifacts to the install worker's R2 bucket.
Steps
- Read the version from plugin.json:
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
VERSION=$(jq -r .version "$VIBES_ROOT/.claude-plugin/plugin.json")
echo "Version: $VERSION"
- Verify the DMG and update artifacts exist:
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
ARTIFACTS="$VIBES_ROOT/vibes-desktop/artifacts"
DMG_PATH="$ARTIFACTS/stable-macos-arm64-VibesOS.dmg"
if [ ! -f "$DMG_PATH" ]; then
echo "ERROR: DMG not found at $DMG_PATH — run 'bash scripts/build-desktop.sh' first"
exit 1
fi
ls -lh "$DMG_PATH"
# Check for update artifacts (optional — first build with baseUrl won't have them)
UPDATE_JSON="$ARTIFACTS/stable-macos-arm64-update.json"
UPDATE_TAR="$ARTIFACTS/stable-macos-arm64-VibesOS.app.tar.zst"
[ -f "$UPDATE_JSON" ] && echo "Found: $(basename $UPDATE_JSON)" || echo "No update.json (first build?)"
[ -f "$UPDATE_TAR" ] && echo "Found: $(basename $UPDATE_TAR) ($(ls -lh "$UPDATE_TAR" | awk '{print $5}'))" || echo "No .tar.zst (first build?)"
PATCH_COUNT=$(ls "$ARTIFACTS"/*.patch 2>/dev/null | wc -l | tr -d ' ')
echo "Patch files: $PATCH_COUNT"
- Upload the DMG:
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
VERSION=$(jq -r .version "$VIBES_ROOT/.claude-plugin/plugin.json")
DMG_PATH="$VIBES_ROOT/vibes-desktop/artifacts/stable-macos-arm64-VibesOS.dmg"
UPLOAD_KEY=$(grep INSTALL_UPLOAD_KEY "$VIBES_ROOT/.env" | cut -d= -f2)
curl -X PUT "https://install.vibesos.com/upload?filename=VibesOS-${VERSION}.dmg" \
-H "X-Upload-Key: ${UPLOAD_KEY}" \
--data-binary "@${DMG_PATH}" \
--progress-bar -w "\nHTTP %{http_code}\n"
- Upload update artifacts (update.json and .tar.zst):
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
ARTIFACTS="$VIBES_ROOT/vibes-desktop/artifacts"
UPLOAD_KEY=$(grep INSTALL_UPLOAD_KEY "$VIBES_ROOT/.env" | cut -d= -f2)
UPDATE_JSON="$ARTIFACTS/stable-macos-arm64-update.json"
UPDATE_TAR="$ARTIFACTS/stable-macos-arm64-VibesOS.app.tar.zst"
if [ -f "$UPDATE_JSON" ]; then
echo "Uploading update.json..."
curl -X PUT "https://install.vibesos.com/upload?filename=updates/stable-macos-arm64-update.json" \
-H "X-Upload-Key: ${UPLOAD_KEY}" \
--data-binary "@${UPDATE_JSON}" \
-s -w "HTTP %{http_code}\n"
else
echo "Skipping update.json (not found)"
fi
if [ -f "$UPDATE_TAR" ]; then
echo "Uploading .tar.zst..."
curl -X PUT "https://install.vibesos.com/upload?filename=updates/stable-macos-arm64-VibesOS.app.tar.zst" \
-H "X-Upload-Key: ${UPLOAD_KEY}" \
--data-binary "@${UPDATE_TAR}" \
--progress-bar -w "\nHTTP %{http_code}\n"
else
echo "Skipping .tar.zst (not found)"
fi
- Upload patch files (if any):
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
ARTIFACTS="$VIBES_ROOT/vibes-desktop/artifacts"
UPLOAD_KEY=$(grep INSTALL_UPLOAD_KEY "$VIBES_ROOT/.env" | cut -d= -f2)
PATCHES=$(ls "$ARTIFACTS"/*.patch 2>/dev/null)
if [ -n "$PATCHES" ]; then
for PATCH in $PATCHES; do
BASENAME=$(basename "$PATCH")
echo "Uploading patch: $BASENAME..."
curl -X PUT "https://install.vibesos.com/upload?filename=updates/${BASENAME}" \
-H "X-Upload-Key: ${UPLOAD_KEY}" \
--data-binary "@${PATCH}" \
-s -w "HTTP %{http_code}\n"
done
else
echo "No patch files to upload"
fi
- Confirm the upload by reporting the version and download URL:
Uploaded VibesOS-{VERSION}.dmg + update artifacts
Download: https://install.vibesos.com
Update check: https://install.vibesos.com/updates/stable-macos-arm64-update.json
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
launch
Self-contained SaaS pipeline — invoke directly, do not decompose. Generates a Vibes app, adds auth + billing, and deploys live. Uses Agent Teams to parallelize for maximum speed. Use when the user wants to build and ship a complete SaaS product in one step, or says "launch", "ship it", "build and deploy".
design
Self-contained design transformer — invoke directly, do not decompose. Transforms a design reference HTML file into a Vibes app. Use when user provides a design.html, mockup, or static prototype to match exactly.
cloudflare
Self-contained deploy automation — invoke directly, do not decompose. Deploys a Vibes app to Cloudflare Workers via the Deploy API. Use when deploying, publishing, going live, pushing to production, or hosting on the edge.
sell
Self-contained SaaS automation — invoke directly, do not decompose. Transforms a Vibes app into a multi-tenant SaaS with subdomain-based tenancy. Adds Pocket ID authentication, subscription gating, and generates a unified app with landing page, tenant routing, and admin dashboard. Use when the user wants to monetize an app, add auth and billing, create a SaaS product, add subscriptions, or turn an app into a business.
test
Self-contained test automation — invoke directly, do not decompose. End-to-end integration test that assembles a fixture, deploys to Cloudflare (with auto-provisioned Connect), and presents a live URL for browser verification. Use when testing the plugin, running E2E tests, verifying deployment works, or checking that templates assemble correctly.
riff
Self-contained parallel generator — invoke directly, do not decompose. Generates 3-10 app variations in parallel for comparing ideas. Use when user says "explore options", "give me variations", "riff on this", "brainstorm approaches", or wants to see multiple interpretations of a concept.
Didn't find tool you were looking for?