Source of truth for rebuilding my macOS development environment without committing secrets, auth state, or machine-local noise.
The main path is intentionally simple:
mkdir -p ~/development
git clone https://github.com/gabimoncha/dotfiles.git ~/development/dotfiles
cd ~/development/dotfiles
./bin/setupRun ./bin/setup without sudo. The scripts ask for a password only when a
specific privileged macOS or Homebrew step needs it.
By default, setup includes the full mobile development stack and overlaps safe
download-heavy work such as Xcode, Homebrew, mise, Android Studio, MAS apps,
and VS Code extensions. Use ./bin/setup --skip-mobile-dev when you do not want
the Xcode/Android downloads on a run, or ./bin/setup --serial when debugging.
Do this before moving to a new machine, or whenever you want to check whether the repo still reflects the current Mac.
cd ~/development/dotfiles
./bin/prepare-sync
./bin/file-backupbin/prepare-sync is a drift report, not an auto-writer. It compares the
current Homebrew bundle, prints the current mise state, and saves backups
under .sync-backups/ so changes can be made intentionally.
bin/file-backup runs the file-backed state workflow. It copies the small
Mackup allowlist to Synology Drive and mirrors it to iCloud on a best-effort
basis when iCloud is ready, creates the passphrase-encrypted Codex archive, and
opens Raycast with instructions to export an encrypted .rayconfig under
SynologyDrive-personal/MacBackups/Raycast. The Raycast step prints a full
timestamped save path such as
raycast-settings-YYYYMMDD-HHMMSS.rayconfig and copies it to the clipboard when
possible. Rerun ./bin/file-backup raycast after the Raycast export to mirror
the newest export to iCloud.
If Mackup asks before replacing existing backup copies, pass its option through the top-level helper:
./bin/file-backup --forceCommit and push any intentional repo changes before switching machines.
Codex CLI itself is not part of the archive. Bootstrap keeps the current
standalone install under ~/.codex/packages/standalone healthy and removes the
Homebrew cask if it exists. The archive only carries portable user state.
Cursor Agent CLI itself is not part of the archive. Bootstrap keeps its
standalone installer runtime under ~/.local/share/cursor-agent healthy and
exposes agent through ~/.local/bin; Cursor the app stays a Homebrew cask.
mise data is not migrated or restored separately. Bootstrap keeps only the
mise binary on the standalone installer path at ~/.local/bin/mise so
mise self-update remains available; existing tools, shims, cache, and state
stay in the normal mise locations.
mkdir -p ~/development
git clone https://github.com/gabimoncha/dotfiles.git ~/development/dotfiles
cd ~/development/dotfiles
./bin/setupIf Xcode Command Line Tools are missing, setup opens Apple's installer popup and exits. Finish the installer, then rerun:
./bin/setupbin/setup is the fresh-machine entrypoint. Each container below is a script
flow, and arrows between containers show where setup hands control to another
script.
flowchart LR
subgraph Setup["bin/setup"]
direction TB
S0["Start"]
S1{"Running as root?"}
S2["Exit: rerun without sudo"]
S3["Call bin/preflight"]
S4{"--dry-run?"}
S5["Preview mobile-dev and app installs"]
S6["Print final actionable summary"]
S7["Exit"]
S8["Call bin/bootstrap"]
S9{"Xcode CLT ready after bootstrap?"}
S10["Exit: finish installer, rerun ./bin/setup"]
S11["Call bin/install-apps"]
S12["Call bin/link-dotfiles"]
S13["Print manifest summary"]
S14{"Interactive terminal?"}
S15["Skip auth and restore follow-up"]
S16["Call bin/auth-setup after Enter"]
S17["Call bin/file-restore mackup"]
S18["Find .rayconfig and call bin/file-restore raycast when present"]
S19{"Encrypted Codex state archive found?"}
S20["Prompt and call bin/file-restore codex when approved"]
S21["Defer Codex restore"]
S22["Print shell reload hint and final actionable summary"]
S0 --> S1
S1 -->|"yes"| S2
S1 -->|"no"| S3
S3 --> S4
S4 -->|"yes"| S5 --> S6 --> S7
S4 -->|"no"| S8
S8 --> S9
S9 -->|"no"| S10
S9 -->|"yes"| S11 --> S12 --> S13 --> S14
S14 -->|"no"| S15 --> S22
S14 -->|"yes"| S16 --> S17 --> S18 --> S19
S19 -->|"yes"| S20 --> S22
S19 -->|"no"| S21 --> S22
end
subgraph Preflight["bin/preflight"]
direction TB
P1["Check macOS, Xcode CLT, Homebrew, GitHub SSH"]
P2["Check repo files and app manifest"]
P3["Run syntax checks for setup scripts"]
P4["Preflight passed"]
P1 --> P2 --> P3 --> P4
end
subgraph Bootstrap["bin/bootstrap"]
direction TB
B1["Verify admin, Xcode CLT, Homebrew"]
B2["Configure sudo Touch ID unless skipped"]
B3["Initialize nvim submodule"]
B4["Call bin/link-dotfiles"]
B5["Call bin/ensure-mise-standalone"]
B6["Call bin/ensure-codex-standalone"]
B7["Call bin/ensure-cursor-agent-standalone"]
B8["Prepare xcodes and aria2, then start Xcode install"]
B9["Start mise install and run brew bundle"]
B10["Run Android Studio, MAS apps, and VS Code extensions"]
B11["Call bin/link-dotfiles again after apps exist"]
B12["Run iOS platform support and Xcode-dependent formulae"]
B13["Run setup-tmux, shell framework, macOS defaults, Finder favorites"]
B14["Bootstrap complete"]
B1 --> B2 --> B3 --> B4 --> B5 --> B6 --> B7 --> B8 --> B9 --> B10 --> B11 --> B12 --> B13 --> B14
end
subgraph InstallApps["bin/install-apps"]
direction TB
I1["Read apps/manifest.tsv"]
I2{"Manifest row type"}
I3["cask or formula: brew install or dry-run"]
I4["manual: print vendor instructions"]
I5["App install pass complete"]
I1 --> I2
I2 --> I3 --> I5
I2 --> I4 --> I5
end
subgraph MobileDev["bin/install-mobile-dev"]
direction TB
MD1["Ensure standalone mise, xcodes, and aria2"]
MD2["Install and select full Xcode"]
MD3["Install Android Studio cask"]
MD4["Install iOS platform support"]
MD5["Install applesimutils, idb-companion, and sourcekitten"]
MD1 --> MD2
MD1 --> MD3
MD2 --> MD4
MD2 --> MD5
end
subgraph LinkDotfiles["bin/link-dotfiles"]
direction TB
L1["Build managed source list"]
L2["Add app configs only when app bundles exist"]
L3["Back up replaced targets"]
L4["Create symlinks into HOME"]
L1 --> L2 --> L3 --> L4
end
subgraph AuthSetup["bin/auth-setup"]
direction TB
A1["Authenticate gh when possible"]
A2["Configure local Git identity"]
A3["Create or reuse SSH key"]
A4["Upload key when possible"]
A5["Verify GitHub SSH"]
A1 --> A2 --> A3 --> A4 --> A5
end
subgraph MackupRestore["bin/file-restore mackup"]
direction TB
M1["Use tracked home/.mackup.cfg"]
M2["Restore allowlisted app settings from Synology or iCloud"]
M1 --> M2
end
subgraph RaycastRestore["bin/file-restore raycast"]
direction TB
R1{"Raycast .rayconfig found in Synology or iCloud?"}
R2["Open newest .rayconfig"]
R3["Defer Raycast restore"]
R1 -->|"yes"| R2
R1 -->|"no"| R3
end
subgraph CodexRestore["bin/file-restore codex"]
direction TB
C1["Decrypt age archive"]
C2["Validate allowlisted paths"]
C3["Back up replaced targets"]
C4["Restore curated Codex state"]
C1 --> C2 --> C3 --> C4
end
S3 -.-> P1
S5 -.-> I1
S8 -.-> B1
S11 -.-> I1
S12 -.-> L1
S13 -.->|optional later| MD1
S16 -.-> A1
S17 -.-> M1
S18 -.-> R1
S20 -.-> C1
B4 -.-> L1
B7 -.-> L1
It is safe to rerun as Apple ID, App Store, iCloud, Synology Drive, Xcode, or
app permissions become ready. The detailed bootstrap inventory is in
What Setup Actually Does.
Dry-run the install pass without changing the machine:
./bin/setup --dry-runAt the end of setup, press Enter to continue the interactive follow-up. You can also run the pieces directly later:
./bin/auth-setup
./bin/file-restorebin/auth-setup authenticates GitHub CLI, configures local Git identity, creates
or reuses an Ed25519 SSH key, uploads the SSH key when possible, and verifies
GitHub SSH. When GitHub CLI is authenticated, it prefers the account noreply
address for commits and warns if the active commit email could trip GitHub's
private-email push protection. If this repo was cloned from its public HTTPS
URL, it switches origin to git@github.com:gabimoncha/dotfiles.git after SSH
is verified.
bin/file-restore restores file-backed state from Synology first, then iCloud
where supported. It restores Mackup-managed app settings, opens the newest
Raycast .rayconfig it can find, and prompts before restoring encrypted Codex
state. Targeted commands such as bin/file-restore codex still exist for
focused reruns.
Top-level restore options are passed to Mackup, so use this when Mackup asks before replacing existing local files:
./bin/file-restore --forceIf restore unexpectedly falls back from Synology to iCloud, inspect the paths on that Mac with:
./bin/file-restore --debugDirect NAS mounts in Finder, such as ds1522plus/home/MacBackups, are separate
from the local Synology Drive sync folder. The automated restore path expects
MacBackups under SynologyDrive-personal; if debug only finds it under
/Volumes, fix the Synology Drive Client sync task.
Restore selection rules:
- Mackup restores the current backup tree at
SynologyDrive-personal/MacBackups/Mackup, or falls back toiCloud Drive/Mackup. It is not timestamped by this repo; use Synology Drive file history if you need an older Mackup copy. - Raycast restores the newest
.rayconfigby file modification time, checking Synology first and then iCloud. Pass an explicit path to restore a different export. - Codex restores
codex-state-latest.tar.gz.agefrom Synology first, then the newest timestamped Codex archive iflatestis missing, then iCloud. Pass an explicit archive path to restore an older archive.
bin/finder-sidebar-favorites creates ~/development and ~/Screenshots,
then adds both folders to Finder Favorites. It is run during setup and can be
rerun later if macOS privacy prompts or Finder state get in the way. The
sidebar label is screenshots; the folder path remains ~/Screenshots.
Some state cannot be safely automated:
- Apple ID, App Store, and iCloud sign-in
- Cursor, VS Code Settings Sync, Notion, Synology Drive, superwhisper, and DaVinci Resolve sign-in
- Accessibility, Automation, Microphone, and network permissions
- first-run setup for Xcode, Android Studio, OrbStack, and vendor-only apps
- Android Studio SDK setup for React Native: install Android 15 SDK Platform 35, Sources for Android 35, Android SDK Build-Tools, Android Emulator, and create at least one virtual device from Virtual Device Manager
The heavyweight mobile dev stack is part of the default setup path because Xcode and iOS platform support dominate a fresh-machine run. Skip it when you want a lighter pass:
./bin/setup --skip-mobile-devThe dedicated mobile-dev installer remains available for targeted reruns:
./bin/install-mobile-devManual/vendor apps currently live in apps/manifest.tsv as manual rows.
DaVinci Resolve and Pinokio are examples.
If the machine looks mostly set up but a few pieces feel incomplete, run:
./bin/app-state-doctorIt checks the app-state edges this repo can reason about: AeroSpace and Ghostty
config links, tmux plugins, Raycast install/export state, Touch ID for sudo,
and whether Spotlight is still holding Command-Space.
bin/bootstrap is the lower-level installer used by bin/setup.
It:
- verifies macOS, admin access, Xcode Command Line Tools, and Homebrew
- enables Touch ID for
sudothrough/etc/pam.d/sudo_localwhen supported - initializes the Neovim submodule
- links tracked files from
home/into$HOME - ensures standalone
mise, Codex, and Cursor Agent installer ownership - prepares
xcodesandaria2, then starts the Xcode install in the background - starts
mise installin the background - installs Homebrew formulae and casks
with
brew bundle --jobs="${DOTFILES_BREW_BUNDLE_JOBS:-auto}" - runs Android Studio, Mac App Store apps, and VS Code extensions after the Homebrew bundle phase
- links app dotfiles after app bundles exist
- runs iOS platform support and Xcode-dependent formulae after full Xcode is selected
- verifies
misetools withbin/check-mise-tools - installs tmux plugins through TPM and shell framework plugins
- applies tracked macOS defaults once and configures Finder sidebar favorites
- prints a final actionable summary of completed, failed, deferred, and critical items
Safe parallelism is on by default. Use ./bin/setup --serial or
DOTFILES_SETUP_SERIAL=1 ./bin/setup when debugging. Recoverable failures keep
independent work moving, then cause a nonzero exit after the final summary.
Deferred/manual items are listed but do not fail the run by themselves.
Touch ID for sudo can be managed directly:
./bin/configure-sudo-touch-id --check
./bin/configure-sudo-touch-id --enable
./bin/configure-sudo-touch-id --disableSkip this during setup when needed:
DOTFILES_SKIP_SUDO_TOUCH_ID=1 ./bin/setupApple Watch approval depends on macOS Auto Unlock being enabled in System
Settings. This repo configures the sudo Touch ID PAM hook, not Apple Watch
pairing or unlock settings.
The macOS defaults can be skipped for a run:
DOTFILES_SKIP_MACOS_DEFAULTS=1 ./bin/bootstrapbin/setup and bin/install-mobile-dev temporarily export
HOMEBREW_NO_REQUIRE_TAP_TRUST=1 while they run, then restore the previous
environment on exit. Keep this scoped to setup scripts only; Homebrew documents
the variable as transitional and not recommended for persistent shell config.
Run the mobile dev stack separately when you want to repair or repeat only full
Xcode, Android Studio, applesimutils, idb-companion, and sourcekitten:
./bin/install-mobile-devThe mobile dev installer asks xcodes for the latest release Xcode and selects
it. Use DOTFILES_XCODE_CHANNEL=prerelease ./bin/install-mobile-dev to install
the latest prerelease channel instead. It enables xcodes
--experimental-unxip by default for faster unarchiving; set
DOTFILES_XCODE_EXPERIMENTAL_UNXIP=0 to use regular unxip. After a newer Xcode
is selected, old Xcode apps from other major versions are removed through
xcodes uninstall. Set DOTFILES_KEEP_OLD_XCODES=1 to keep them.
Formulae that build from source and trip Homebrew's Xcode minimum check, such
as borders, stay in Brewfile but are deferred until full Xcode is selected.
This repo is deliberately boring about ownership:
Brewfileowns Homebrew formulae, casks, taps, App Store app entries, and VS Code extensions.home/.config/mise/config.tomlowns language runtimes and global developer tools thatmisesupports, including backend-prefixed tools such asgem:fastlaneandconda:aria2.- Codex CLI is a standalone-installer exception because remote control and
app-server updates depend on the installer-managed path under
~/.codex/packages/standalone. - Cursor Agent CLI is a standalone-installer exception because the official
installer owns
~/.local/share/cursor-agentand exposes theagentcommand through~/.local/bin, while the Cursor GUI remains a Homebrew cask. - The
misebinary is a standalone-installer exception becausemise self-updateis not available through package-manager installs. Its data, tools, shims, cache, and state remain in the normalmiselocations. apps/manifest.tsvis the typed ledger for cask, formula, and manual/vendor install handling.home/owns files that get symlinked into$HOME.macos/defaults.showns conservative macOS defaults.nvim/is a separate Neovim repo mounted here as a submodule.- Mackup owns only the allowlisted app settings in
home/.mackup.cfg, backed up to Synology Drive with iCloud as the secondary copy. - Raycast is restored from an encrypted
.rayconfigexport outside git, with Synology primary and iCloud secondary. - Codex memories and selected user config are restored from an encrypted
agearchive outside git, with Synology primary and iCloud secondary.
When adding a tool, use this order:
- Mac App Store via
mas, if it is a GUI app available there mise, ifmise ls-remote <tool>or an appropriate backend-prefixed id supports it- Vendor standalone installer, only for explicit exceptions such as Codex,
Cursor Agent, and
mise - Homebrew in
Brewfile, if it does not belong inmas,mise, or an explicit standalone exception apps/manifest.tsv, if it needs cask/formula status tracking, post-install handling, or manual/vendor follow-up
Do not commit secrets, tokens, private emails, .rayconfig files, cache
databases, session state, or machine-local exports.
Brewfile Homebrew, mas, casks, VS Code extensions
apps/manifest.tsv extra cask/formula/manual app ledger
bin/setup fresh-Mac entrypoint
bin/bootstrap lower-level bootstrap
bin/link-dotfiles symlink managed files into $HOME
bin/ensure-codex-standalone keep Codex on the standalone installer path
bin/ensure-cursor-agent-standalone
keep Cursor Agent on the standalone installer path
bin/ensure-mise-standalone keep mise on the standalone installer path
bin/preflight repo and machine checks
bin/auth-setup Git/GitHub/SSH follow-up
bin/configure-sudo-touch-id Touch ID for sudo PAM setup
bin/install-apps manifest installer
bin/install-mobile-dev heavyweight Xcode and Android Studio setup
bin/finder-sidebar-favorites add repo-owned Finder sidebar favorites
bin/app-state-doctor post-setup app-state checks
bin/file-backup unified Mackup, Raycast, and Codex file backup
bin/file-restore unified Mackup, Raycast, and Codex file restore
bin/*-backup, bin/*-restore compatibility aliases for file backup/restore
home/ tracked $HOME sources
home/.config/mise/config.toml mise-owned tools
home/.mackup.cfg Mackup allowlist using Synology file storage
macos/defaults.sh tracked macOS defaults
nvim/ Neovim submodule linked to ~/.config/nvim
bin/link-dotfiles links tracked files into $HOME and backs up replaced
targets under ~/.dotfiles-backups/<timestamp>/.
Currently managed:
~/.gitconfig~/.aerospace.toml~/.zshenv,~/.zprofile,~/.zshrc~/.p10k.zsh~/.mackup.cfg~/.rgrc~/.tmux.conf~/.config/mise/config.toml~/.config/zsh/*.zsh~/.config/karabiner/karabiner.json~/.config/zed/settings.json~/.config/zed/keymap.json~/.agents/skills~/Documents/superwhisper/settings/settings.json~/Library/Application Support/com.mitchellh.ghostty/config~/scripts/toggle_function_keys.shnvim/as~/.config/nvim
AeroSpace and Ghostty config links are only created after their app bundles
exist in /Applications.
The tracked zsh files are thin entrypoints:
home/.zshenvhome/.zprofilehome/.zshrchome/.config/zsh/path.zshhome/.config/zsh/env.zshhome/.config/zsh/profile.zshhome/.config/zsh/interactive.zshhome/.config/zsh/aliases.zshhome/.config/zsh/mise-npx.zshhome/.config/zsh/functions.zshhome/.config/zsh/check-updates.zsh
Machine-local secrets and exports belong in ignored files under:
~/.config/local/*.zsh
home/.config/local/*.zsh
Use home/.config/local/secrets.zsh.example as the template for repo-local
secret exports. The real secrets.zsh file stays untracked.
Use environment variables for secrets and the zsh path array for committable
PATH setup.
Infisical wrappers are available for separate work and personal service tokens:
infisical-work run --env=dev -- bun dev
infisical-personal run --env=dev -- npm run dev
infisical-work export --env=prod --format=json
infisical-personal secrets get SOME_KEY --env=devThey support run, export, and secrets, using INFISICAL_WORK_TOKEN or
INFISICAL_PERSONAL_TOKEN from local secrets. Optional
INFISICAL_WORK_API_URL and INFISICAL_PERSONAL_API_URL values are passed to
the CLI as --domain.
home/.config/zsh/mise-npx.zsh wraps npx and px so one-off npm package CLIs
use the [settings.npm].package_manager value resolved by mise. The global
default in home/.config/mise/config.toml is bun, while a project mise.toml
can override it to pnpm or aube. Bun-selected projects delegate directly to
bunx. Pnpm-selected projects use pnpm exec when the requested binary exists
in local node_modules/.bin, otherwise they use pnpm dlx for one-off package
commands, with the pnpm path routed through Socket Firewall Free. Use bx or
bunx when you explicitly want Bun regardless of the project setting, and use
command npx for the real npm binary when an npm-only flag is required. The file
includes comments with the minimal adoption steps for sharing it outside this
repo.
Socket Firewall Free is installed as npm:sfw through mise. Interactive zsh
aliases route supported package managers through it when sfw is on PATH:
npm, pnpm, yarn, pip, uv, and cargo. Use command <tool> for a
single bypass when you need the underlying package manager without the shell
alias. Bun and Bunx are intentionally not wrapped because Socket Firewall Free
does not officially support them.
Socket Firewall Free is a wrapper-mode safety layer, not a full private registry policy engine. It does not support private/custom registries, does not work offline, does not allow telemetry to be disabled, and blocks confirmed malware while warning on AI-detected potential malware.
For Android/React Native development, the tracked shell config exports
JAVA_HOME to the Homebrew Zulu 17 JDK and ANDROID_HOME to
~/Library/Android/sdk, then adds the Android emulator and platform-tools
directories to PATH. The JDK bin directory is placed before mise shims so
Java tools such as keytool come from the configured JDK instead of stale
runtime shims. Run ./bin/install-mobile-dev to install Android Studio. Android
Studio still owns installing the SDK packages and creating the emulator image.
Interactive mise activation is owned by home/.config/zsh/interactive.zsh.
Do not append activation lines directly to ~/.zshrc; it is a repo-managed
symlink. After changing shell activation, run exec zsh or open a new terminal.
To get the Android debug signing SHA-1, use the real debug keystore path:
keytool -list -v -keystore "$HOME/.android/debug.keystore" -alias androiddebugkey -storepass android -keypass androidWhen a clean shell does not have mise shims on PATH, prefer:
mise exec -- <command>Mackup uses Synology Drive as primary storage, mirrors to iCloud after backups on a best-effort basis when iCloud is ready, and restores from iCloud if the Synology backup is not available yet:
./bin/file-backup mackup
./bin/file-restore mackupThe allowlist currently includes Cursor, Cyberduck, Rectangle, Spotify, VS Code, GitHub CLI, Lazygit, Macs Fan Control, OBS, and Stats.
Use the helper scripts instead of raw Mackup link mode. This repo treats Mackup
as an explicit copy-based backup/restore tool so tracked files under home/
remain the source of truth.
Top-level backup options are passed to Mackup, so use
./bin/file-backup --force to replace existing Mackup backup copies during the
combined backup flow.
Raycast is separate and app-driven:
./bin/file-backup raycast
./bin/file-restore raycastSave .rayconfig exports under
SynologyDrive-personal/MacBackups/Raycast using the filename printed by
./bin/file-backup raycast, for example
raycast-settings-YYYYMMDD-HHMMSS.rayconfig. Then rerun
./bin/file-backup raycast to mirror the newest export to iCloud Drive/Raycast.
Keep .rayconfig exports and passphrases outside git.
Codex state is separate from Mackup and Raycast:
./bin/file-backup codex
./bin/file-restore codexThe archive is encrypted with age -p, saved to
SynologyDrive-personal/MacBackups/Codex, and mirrored to iCloud Drive/Codex
when iCloud is ready. It includes curated Codex config, keybindings, rules,
user-authored global skills, memories, and scheduled task definitions. It deliberately
excludes auth, connections, project/workspace state, histories, attachments,
caches, sqlite state, plugin caches, worktrees, sockets, app bundles, raw
Codex app global state, installation IDs, app-server state, and standalone
installer packages.
./bin/file-restore codex preserves active state by default: missing files are
restored, identical files are skipped, and incoming conflicts are staged under
~/.dotfiles-backups/<timestamp>/codex-state/incoming. Use --dry-run to
compare an archive first. Use --replace only when the archive should
intentionally replace current portable Codex state; current files are backed up
under ~/.dotfiles-backups/<timestamp>/codex-state/current.
nvim/ is a git submodule with separate history. bin/link-dotfiles links it
to:
~/.config/nvim
Do not edit the submodule from this repo unless the task is explicitly about the Neovim config repo.
Pull repo updates and reapply bootstrap-managed changes:
dotfiles-updateThat command runs git pull --ff-only and then bin/bootstrap with macOS
defaults skipped for the update run.
For targeted reruns:
./bin/preflight
./bin/bootstrap
./bin/install-apps
./bin/install-mobile-dev
./bin/link-dotfiles
./bin/setup-tmux
./bin/app-state-doctorAfter meaningful changes, run the smallest relevant checks:
bash -n bin/lib/setup-runtime.sh
bash -n bin/bootstrap
bash -n bin/ensure-codex-standalone
bash -n bin/ensure-cursor-agent-standalone
bash -n bin/ensure-mise-standalone
bash -n bin/install-mobile-dev
bash -n bin/link-dotfiles
bash -n bin/file-backup
bash -n bin/file-restore
bash -n macos/defaults.sh
git diff --checkFor setup or inventory changes, also run:
./bin/preflight
./bin/ensure-codex-standalone --dry-run
./bin/ensure-cursor-agent-standalone --dry-run
./bin/ensure-mise-standalone --dry-run
./bin/install-apps --dry-run
./bin/install-mobile-dev --dry-run
./bin/install-mobile-dev --dry-run --xcode-only
./bin/setup --dry-run
./bin/setup --dry-run --skip-mobile-dev
./bin/setup --dry-run --serialKeep README.md, QUICKSTART.md, scripts, and tracked config aligned. If the
implementation changes, update the docs in the same patch.