acceptance-tests
Read this before writing or running the graphical acceptance suite under `test/acceptance.d/`.
Read this before creating or changing migrations under `migrations/`.
$ npx -y skills add basecamp/omarchy --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Read this before creating or changing migrations under `migrations/`.
Read this before creating or changing migrations under `migrations/`.
Omarchy migrations are one-time repair scripts for existing installs. They are used when a package update needs to change state that pacman cannot safely own by itself.
Migrations live in:
migrations/*.sh
They run as the current Omarchy user through `omarchy-migrate`, normally during `omarchy update`. A migration may touch user/session state (`~/.config`, `~/.local`, user systemd, browser/editor prefs, DBus/session state), and may also perform machine-wide repairs when needed.
Completion state is per-user:
~/.local/state/omarchy/migrations/<migration filename>
That means every user gets a chance to run every migration. Migrations run as the user; privileged operations should invoke the appropriate helper or privilege prompt themselves. Migrations must be idempotent: if one user already applied a machine-wide repair, the same migration running for another user should detect that and no-op.
`omarchy update` is the normal update path. It runs package updates, then:
omarchy-migrate omarchy-hook post-update
`omarchy-migrate` waits for any active pacman transaction to finish, then runs all pending migrations for the current user in the visible update terminal.
Every graphical login starts `omarchy-migrate-notify.service` after `graphical-session.target`. The notifier checks:
omarchy-migrate --pending
It stays silent while `omarchy update` holds its lock, since that update applies the pending migrations itself.
If that user has pending migrations, it shows a notification that opens a terminal for:
omarchy-migrate
The notifier never runs migrations silently in the background.
This is what covers users who did not run the update themselves: someone who bypassed the pacman guard with `sudo env OMARCHY_ALLOW_DIRECT_PACMAN=1 pacman -Syu`, and any second user on the machine, whose migration markers are per-user and therefore still missing after another user updated.
Login is the only trigger on purpose. Watching the packaged migration directory also fires during a normal `omarchy update`, which prompts for migrations that `omarchy-migrate` is about to run in the visible update terminal.
Users can safely run:
omarchy-migrate
at any time. Already-completed migrations are skipped.
Use:
omarchy-migrate --pending
Exit behavior:
Output is one pending migration per line:
1781158082.sh
Use the helper:
omarchy-dev-add-migration --no-edit
This creates:
migrations/<unix timestamp>.sh
New migration format:
with `bash -euo pipefail`, not through executable bits.
`omarchy-pkg-add`, `omarchy-pkg-drop`, `omarchy-pkg-present`, and `omarchy-pkg-missing` when appropriate.
after migrations run, and the login-time shell already runs current code and hot-reloads `shell.json` edits.
needed for one-off repair work.
Example:
echo "Relink Neovim theme to Omarchy current state" theme_link="$HOME/.config/nvim/lua/plugins/theme.lua" current_relative_target="../../../../.local/state/omarchy/current/theme/neovim.lua" [[ -L $theme_link ]] || exit 0 ln -sfn "$current_relative_target" "$theme_link"
Run a migration against a temporary home when possible:
HOME=$(mktemp -d) bash -euo pipefail migrations/<timestamp>.sh
To rerun a migration locally, remove its marker and run the migrator:
rm ~/.local/state/omarchy/migrations/<migration>.sh omarchy-migrate
Keep a dedicated test while the migration is still being written or bugfixed, if it calls an Omarchy helper whose interface can still change, or if it is a security-sensitive privileged repair (FIDO2, leftover installer artifacts, udev, sshd). Once a one-shot rewrite has shipped in a tagged release and is frozen, drop the test even when that rewrite used sudo, pacman, or limine-mkinitcpio. Keep the migration itself for late-updaters. Tests of `omarchy-migrate`, the login notifier, and `omarchy-upgrade-to-quattro` stay.
Omarchy 4.0 is upgraded through `bin/omarchy-upgrade-to-quattro`, not through the normal migration runner. Do not add compatibility migrations for old installer layouts; put pre-4 package-layout transition work in the upgrade command instead.
Clearing a privileged file that a retired installer left on disk is the exception, and belongs in a migration whether or not that installer was part of a package layout transition. The upgrade command only runs on a machine still making the 3 to 4 crossing, so anything put there never reaches an install that crossed already, and it never runs at all for an installer that was retired on its own — while the file the installer wrote is still sitting on those machines. The upgrade command finishes by running `omarchy-migrate` (`run_post_upgrade_migrations`), so one migration reaches every population; a copy in the upgrade command would only be a second copy o
Omarchy is a beautiful, fun & agentic Linux distribution by DHH. Read more at omarchy.org.
Repo: basecamp/omarchy
Read this before writing or running the graphical acceptance suite under `test/acceptance.d/`.
Read this before adding or changing commands in `bin/`.
Read this before adding a branded glyph to `default/fonts/omarchy/omarchy.ttf`.
Read this before working under `install/` or on the system/user setup commands.
Read this before editing the Quickshell desktop under `shell/`.
Read this before finishing any change with a visual effect: Omarchy shell styling and layout, panels, menus, notifications, desktop appearance, animations,…