Xcode fleet sync: signed archives, compatibility, install, selection, first launch.
69
83%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Medium
Suggest reviewing before use
Synchronize exact Xcode builds across Peter's supported Macs. Use $remote-mac for fleet topology and SSH rules.
~/Projects/manager/computers.yaml; use live tailscale status --json for reachability/IPs.hostname, user, macOS, architecture, and hardware UUID before writes.scripts/xcode-host-inventory.sh locally or remotely:skills/xcode-sync/scripts/xcode-host-inventory.sh
ssh -o RequestTTY=no -o RemoteCommand=none HOST 'bash -s' \
< skills/xcode-sync/scripts/xcode-host-inventory.shTreat unreachable hosts as pending, not synchronized. Try live Tailscale IP, Tailscale SSH, then mDNS/LAN only when network topology permits.
Prefer the user's downloaded .xip; do not redownload it.
pkgutil --check-signature "$archive"
shasum -a 256 "$archive"
stage=$(mktemp -d /tmp/xcode.XXXXXX)
cleanup() { rm -rf "$stage"; }
trap cleanup EXIT
(cd "$stage" && xip --expand "$archive")
set -- "$stage"/Xcode*.app
[[ $# == 1 && -d "$1" ]]
app=$1
plutil -extract CFBundleShortVersionString raw -o - "$app/Contents/Info.plist"
plutil -extract ProductBuildVersion raw -o - "$app/Contents/version.plist"
plutil -extract LSMinimumSystemVersion raw -o - "$app/Contents/Info.plist"
DEVELOPER_DIR="$app/Contents/Developer" xcodebuild -version
cleanup
trap - EXITRequire Apple Software signature. Compare ProductBuildVersion, not version label alone: two archives named Xcode 26.6 may contain different builds. Do not use DTXcodeBuild as the sync key; it can differ from the build reported by xcodebuild -version.
LSMinimumSystemVersion.Never change a host OS to make an Xcode build eligible unless explicitly requested.
rsync -a --partial --progress -e 'ssh -o RequestTTY=no -o RemoteCommand=none' \
"$archive" HOST:Downloads/ssh HOST 'bash -s'; never let the local shell expand remote $variables or $(commands)./Applications/Xcode.app/Applications/Xcode-beta.app/Applications/Xcode-previous.app, only for three months after a new stable major ships unless the user sets another windowXcode-previous.app to a temporary rollback path, move the former stable to Xcode-previous.app, install and verify the new stable, then delete the older rollback copy. Restore both channel paths on failure. Record the new previous-major removal date in the task report.xcode-select unless the user requests a switch. Replacing the app at the already-selected path preserves selection.Use writable /Applications directly. Otherwise use passwordless sudo -n; if admin approval is required, show a local macOS authorization prompt or report the exact pending step. Do not bypass receipts or license state.
For every installed app:
DEVELOPER_DIR="$app/Contents/Developer" xcodebuild -version
codesign --verify --deep --strict "$app"
DEVELOPER_DIR="$app/Contents/Developer" xcodebuild -checkFirstLaunchStatusIf first-launch status is nonzero:
sudo env DEVELOPER_DIR="$app/Contents/Developer" xcodebuild -license accept
sudo env DEVELOPER_DIR="$app/Contents/Developer" xcodebuild -runFirstLaunchRecheck until status 0. If sudo/admin UI is unavailable, the app is installed but not ready; report that distinction.
Finish with a host matrix: macOS, desired version/build, installed path, selected path, signature, first-launch state, previous-major removal date, and skip/failure reason. Keep source archives unless deletion is explicitly requested.
bb36883
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.