skills/release-peekaboo/SKILL.md
Release Peekaboo CLI/Mac app: service-account 1Password notarization, npm/GitHub release, appcast, verification, closeout.
npx skillsauth add steipete/agent-scripts release-peekabooInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Release ~/Projects/Peekaboo as the npm package @steipete/peekaboo plus signed/notarized macOS app assets.
Use $one-password, $browser-use, $npm, $autoreview, and repo AGENTS.md rules. Read $npm before any npm auth, token, or publish recovery work. Keep all op secret work inside one persistent tmux session. Never print .p8, npm tokens, passwords, or OTPs.
Canonical automation item:
MoltyAPI Key - App Store Connect - Personal - Releasekey_id, issuer_id, private_key_p8MOLTY_OP_SERVICE_ACCOUNT_TOKENService Account Deleted, use desktop op --account my.1password.com and restore the Molty service account before the next release.AKVLXW849T69a6de84-c8a9-47e3-e053-5b8c7c11a4d1Peekaboo Release 3.2.1AdminLegacy mirror:
PrivateAPI Key - App Store Connect - PersonalRevoked old key:
Peekaboo Release 3.2.0 / 7HRXH68LLU, revoked 2026-05-18.Sparkle key:
.mac-release.env has the current fallback.SPARKLE_PRIVATE_KEY_FILE for normal releases.Developer ID release keychain:
MoltyPeekaboo Release Keychainkeychain_path, keychain_password, certificate_source/Users/steipete/Library/Keychains/peekaboo-release-321-20260518132141.keychain-dbcodesign wants to use the "peekaboo-release" keychain, enter this item's keychain_password, not the Developer ID .p12 password..p12 while creating the keychain.security unlock-keychain and security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" so codesign can use the identity without GUI prompts.npm publish token:
PrivateAPI Token - npm - Personaltoken$npm rules. Run inside the same tmux session, write only a temp npmrc, delete it immediately, and use the npmjs TOTP item for web auth if npm prompts.Use the service account first. Put the token in the tmux environment without printing it:
tmux -S "$SOCKET" set-environment -t "$SESSION" OP_SERVICE_ACCOUNT_TOKEN "$MOLTY_OP_SERVICE_ACCOUNT_TOKEN"
Create a temp env file with service-account refs:
APP_STORE_CONNECT_API_KEY_P8=op://Molty/API Key - App Store Connect - Personal - Release/private_key_p8
APP_STORE_CONNECT_KEY_ID=op://Molty/API Key - App Store Connect - Personal - Release/key_id
APP_STORE_CONNECT_ISSUER_ID=op://Molty/API Key - App Store Connect - Personal - Release/issuer_id
Before a release, verify shape and Apple auth without printing values:
op run --env-file "$ENVFILE" -- bash -c '
set -euo pipefail
KEY_FILE="/tmp/AuthKey_${APP_STORE_CONNECT_KEY_ID}.p8"
printf "%s\n" "$APP_STORE_CONNECT_API_KEY_P8" > "$KEY_FILE"
chmod 600 "$KEY_FILE"
test "$APP_STORE_CONNECT_KEY_ID" = "AKVLXW849T"
xcrun notarytool history \
--key "$KEY_FILE" \
--key-id "$APP_STORE_CONNECT_KEY_ID" \
--issuer "$APP_STORE_CONNECT_ISSUER_ID" \
--output-format json >/dev/null
rm -f "$KEY_FILE"
'
Peekaboo forces notarytool submit --no-s3-acceleration; the default S3 accelerated upload path can return a misleading 401 even when history auth succeeds.
If both history and non-S3 submit fail, suspect wrong access level or stale key. Browser route:
$browser-use real Chrome profile.https://appstoreconnect.apple.com/access/integrations/api.Peekaboo Release <version> with Admin access..p8 once from the key row.notarytool history; delete ~/Downloads/AuthKey_<key_id>.p8.main; pull ff-only if needed.package.jsonversion.jsonApps/CLI/Sources/Resources/version.jsonCore/PeekabooCore/Sources/PeekabooAgentRuntime/MCP/PeekabooMCPVersion.swiftApps/*CHANGELOG.md and Apps/CLI/CHANGELOG.md for the release.$autoreview before commit unless the change is trivial/docs-only.committer.main.op run --env-file "$ENVFILE" -- \
bash -lc 'printf "y\n" | ./scripts/release-binaries.sh --create-github-release --publish-npm'
The script builds universal CLI, npm package, signed/notarized app zip, appcast, checksums, draft GitHub release, and npm publish.
Notarized releases must sign with Developer ID Application: Peter Steinberger (Y5PE65HELJ), not Apple Development. If your shell has SIGN_IDENTITY exported for CLI builds, override it for the release command.
If npm upload is slow and TOTP expires, use the stored npm token through a temp npmrc and complete npm web auth immediately when prompted with the npmjs TOTP. Do not create granular bypass tokens for this; if one was created by mistake, delete it from https://www.npmjs.com/settings/steipete/tokens before closeout.
Required before closeout:
npm view @steipete/peekaboo@<version> version dist-tags dist.tarball dist.integrity time --json
gh release view v<version> --repo openclaw/Peekaboo --json tagName,isDraft,isPrerelease,url,assets,body
xmllint --noout appcast.xml
git status --short --branch
Confirm:
latest points to it.v<version>.appcast.xml changes are committed and pushed.Unreleased section to root and CLI changelogs.committer "docs(changelog): open <next-version>" CHANGELOG.md Apps/CLI/CHANGELOG.md.git checkout main && git pull --ff-only && git status --short --branch.OP_SERVICE_ACCOUNT_TOKEN, remove temp env/key files, and final with what landed.data-ai
OpenClaw session relay: prompts/posts via local/remote acpx over SSH.
tools
Wrangler CLI: Workers, KV, tail, deploy, account routing.
tools
Twilio SMS CLI: buy/list/keep numbers, send/check messages, credential routing.
development
Audit Codex/OpenClaw skills: loaded roots, duplicate skills, unused skills, prompt-budget costs, compact descriptions.