PR #428 taught scripts/install.sh about Omarchy: detection, the -Sy then -S split that gets past the libalpm guard, and the hand-off to punktfunk-omarchy setup. It wired the install path only.
--uninstall left the whole integration behind
It removed the packages but left everything punktfunk-omarchy setup had put outside them:
the tagged ufw rules,
the user-unit drop-in,
the app-menu entry,
hooks.json,
and the custom_picker_binary takeover in xdph.conf.
That last one is the sharp edge: it keeps pointing a live compositor at a picker shim that is no longer installed.
punktfunk-omarchy remove is exactly the reverse and is idempotent, so it is safe when setup never ran. But it ships in the host package, so it has to run before pacman takes it away. Its guard carries the || [ "$DRY" = 1 ] that step 1b already uses, so the dry-run matrix can see it on a machine that has never had the package.
Gate 7 had no Omarchy row
That is why this went unnoticed. The matrix in scripts/ci/check-docs-drift.sh runs a fake os-release through the real script under --dry-run --yes, and its own comment says a fix to the installer adds its case there. Three added:
case
asserts
omarchy
the split install reaches sudo pacman -S --noconfirm …
omarchy2
the run hands off to punktfunk-omarchy setup
omarchy-rm
--uninstall calls punktfunk-omarchy remove
Each was proved non-vacuous by reverting the code it covers and watching the gate go red.
One row covers a fix that reached main separately
run()'s non-interactive rewrite matched only ^sudo pacman -Syu . Omarchy's line is sudo pacman -S <pkgs>, so --yes — and every terminal-less curl | sh, which behaves the same — asked "Proceed with installation?" with stdin on /dev/null and the step died. Omarchy was the one family that could not be installed unattended.
The -S rule that fixes it landed in the --channel switch work while this branch was open, so it is not part of this diff. The omarchy row keeps it from regressing.
Verification
scripts/ci/check-docs-drift.sh exits 0 after rebasing onto 14ec3d1b.
Each new row proved non-vacuous by reverting its fix.
Arch is byte-identical on both paths: install still sudo pacman -Syu --noconfirm …, uninstall still without the Omarchy hand-back. Detection is unchanged — Omarchy writes ID=omarchy / ID_LIKE=arch, so like arch gives the pacman family and [ "$ID" = omarchy ] fires.
--noconfirm is added inside run(), never to the command literal, so gate 6's "install.sh carries platforms.json's lines verbatim" check still passes.
Not in this diff
The uninstall epilogue still says "any firewall rules you opened" are left behind, which is now wrong on Omarchy because remove closes them. It is generic text shared by four families, so I left it alone.
PR #428 taught `scripts/install.sh` about Omarchy: detection, the `-Sy` then `-S` split that gets past the libalpm guard, and the hand-off to `punktfunk-omarchy setup`. It wired the **install** path only.
## `--uninstall` left the whole integration behind
It removed the packages but left everything `punktfunk-omarchy setup` had put *outside* them:
- the tagged ufw rules,
- the user-unit drop-in,
- the app-menu entry,
- `hooks.json`,
- and the `custom_picker_binary` takeover in `xdph.conf`.
That last one is the sharp edge: it keeps pointing a live compositor at a picker shim that is no longer installed.
`punktfunk-omarchy remove` is exactly the reverse and is idempotent, so it is safe when setup never ran. But it ships **in** the host package, so it has to run *before* pacman takes it away. Its guard carries the `|| [ "$DRY" = 1 ]` that step 1b already uses, so the dry-run matrix can see it on a machine that has never had the package.
## Gate 7 had no Omarchy row
That is why this went unnoticed. The matrix in `scripts/ci/check-docs-drift.sh` runs a fake `os-release` through the real script under `--dry-run --yes`, and its own comment says a fix to the installer adds its case there. Three added:
| case | asserts |
| --- | --- |
| `omarchy` | the split install reaches `sudo pacman -S --noconfirm …` |
| `omarchy2` | the run hands off to `punktfunk-omarchy setup` |
| `omarchy-rm` | `--uninstall` calls `punktfunk-omarchy remove` |
Each was proved non-vacuous by reverting the code it covers and watching the gate go red.
## One row covers a fix that reached main separately
`run()`'s non-interactive rewrite matched only `^sudo pacman -Syu `. Omarchy's line is `sudo pacman -S <pkgs>`, so `--yes` — and every terminal-less `curl | sh`, which behaves the same — asked "Proceed with installation?" with stdin on `/dev/null` and the step died. Omarchy was the one family that could not be installed unattended.
The `-S ` rule that fixes it landed in the `--channel` switch work while this branch was open, so it is **not** part of this diff. The `omarchy` row keeps it from regressing.
## Verification
- `scripts/ci/check-docs-drift.sh` exits 0 after rebasing onto `14ec3d1b`.
- Each new row proved non-vacuous by reverting its fix.
- Arch is byte-identical on both paths: install still `sudo pacman -Syu --noconfirm …`, uninstall still without the Omarchy hand-back. Detection is unchanged — Omarchy writes `ID=omarchy` / `ID_LIKE=arch`, so `like arch` gives the pacman family and `[ "$ID" = omarchy ]` fires.
- `--noconfirm` is added inside `run()`, never to the command literal, so gate 6's "install.sh carries `platforms.json`'s lines verbatim" check still passes.
## Not in this diff
The uninstall epilogue still says "any firewall rules you opened" are left behind, which is now wrong on Omarchy because `remove` closes them. It is generic text shared by four families, so I left it alone.
PR #428 taught scripts/install.sh about Omarchy: detection, the `-Sy` then `-S` split that gets past
the libalpm guard, and the hand-off to `punktfunk-omarchy setup`. It wired the INSTALL path only.
`--uninstall` removed the packages but left everything `punktfunk-omarchy setup` had put OUTSIDE
them: tagged ufw rules, the user-unit drop-in, the app-menu entry, hooks.json, and the
`custom_picker_binary` takeover in xdph.conf — the last of which keeps pointing a live compositor at
a picker shim that is no longer installed. `punktfunk-omarchy remove` is the reverse and is
idempotent, but it ships IN the host package, so it has to run before pacman takes it away. Its
guard carries the `|| [ "$DRY" = 1 ]` that step 1b already uses, so the dry-run matrix can see it on
a machine that has never had the package.
Gate 7's matrix had no Omarchy row at all, which is why this went unnoticed; its own comment says a
fix to the installer adds its case there. Three added — the split install, the setup hand-off, and
the uninstall — each proved non-vacuous by reverting the code it covers and watching the gate go red.
The first of those three now covers a fix that reached main separately: `run()`'s non-interactive
rewrite matched only `^sudo pacman -Syu `, so `--yes` and every terminal-less `curl | sh` asked
"Proceed with installation?" with stdin on /dev/null and died. The `-S ` rule that fixes it landed in
the --channel switch work while this branch was open. The row keeps it from regressing.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
PR #428 taught
scripts/install.shabout Omarchy: detection, the-Sythen-Ssplit that gets past the libalpm guard, and the hand-off topunktfunk-omarchy setup. It wired the install path only.--uninstallleft the whole integration behindIt removed the packages but left everything
punktfunk-omarchy setuphad put outside them:hooks.json,custom_picker_binarytakeover inxdph.conf.That last one is the sharp edge: it keeps pointing a live compositor at a picker shim that is no longer installed.
punktfunk-omarchy removeis exactly the reverse and is idempotent, so it is safe when setup never ran. But it ships in the host package, so it has to run before pacman takes it away. Its guard carries the|| [ "$DRY" = 1 ]that step 1b already uses, so the dry-run matrix can see it on a machine that has never had the package.Gate 7 had no Omarchy row
That is why this went unnoticed. The matrix in
scripts/ci/check-docs-drift.shruns a fakeos-releasethrough the real script under--dry-run --yes, and its own comment says a fix to the installer adds its case there. Three added:omarchysudo pacman -S --noconfirm …omarchy2punktfunk-omarchy setupomarchy-rm--uninstallcallspunktfunk-omarchy removeEach was proved non-vacuous by reverting the code it covers and watching the gate go red.
One row covers a fix that reached main separately
run()'s non-interactive rewrite matched only^sudo pacman -Syu. Omarchy's line issudo pacman -S <pkgs>, so--yes— and every terminal-lesscurl | sh, which behaves the same — asked "Proceed with installation?" with stdin on/dev/nulland the step died. Omarchy was the one family that could not be installed unattended.The
-Srule that fixes it landed in the--channelswitch work while this branch was open, so it is not part of this diff. Theomarchyrow keeps it from regressing.Verification
scripts/ci/check-docs-drift.shexits 0 after rebasing onto14ec3d1b.sudo pacman -Syu --noconfirm …, uninstall still without the Omarchy hand-back. Detection is unchanged — Omarchy writesID=omarchy/ID_LIKE=arch, solike archgives the pacman family and[ "$ID" = omarchy ]fires.--noconfirmis added insiderun(), never to the command literal, so gate 6's "install.sh carriesplatforms.json's lines verbatim" check still passes.Not in this diff
The uninstall epilogue still says "any firewall rules you opened" are left behind, which is now wrong on Omarchy because
removecloses them. It is generic text shared by four families, so I left it alone.punktfunk-omarchy setupdid, and the detection matrix grows an Omarchy row