Compare commits
2 Commits
802acfdc86
...
10f3b312a3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
10f3b312a3 | ||
|
|
0f22c48c45 |
@@ -19,7 +19,6 @@ Guardrails (apply when adding anything):
|
||||
|
||||
### Now (ready to pick up)
|
||||
|
||||
- **Installer: "What's installed?" summary on first boot.** Surface what the installer actually wrote (theme, font, profiles, drives, form factor) from `state.json` + `nomarchy-system-scripts` introspection so the user can verify before they start customising. Detail in [Pillar 4](#4-pillar-installer).
|
||||
- **Installer: optional non-LUKS branch.** Let users explicitly opt out of FDE during install. Detail in [Pillar 4](#4-pillar-installer).
|
||||
- **Pillar 8 runtime verification pass.** Every Component 1–10 code sweep has shipped, but each closeout entry flagged behaviour that can only be confirmed on a real install: boot the live ISO and eyeball waybar across panel positions × form factors × all 22 palettes; run every `nomarchy-menu` entry and confirm it does the thing; walk every `nomarchy.*` option's enable→rebuild→observe loop. Run the punch-list, fix any new bugs inline, log structural ones as new roadmap rows.
|
||||
|
||||
@@ -85,7 +84,7 @@ Each PR description should reference the row(s) in `docs/SCRIPTS.md` it closes,
|
||||
|
||||
## 4. Pillar: Installer
|
||||
|
||||
- "What's installed?" summary screen on boot of a freshly-installed system, sourced from `state.json` + `nomarchy-system-scripts` introspection (Now).
|
||||
- "What's installed?" summary screen on boot of a freshly-installed system, sourced from `state.json` + `nomarchy-system-scripts` introspection (Shipped).
|
||||
- Optional non-LUKS branch in the installer for users who explicitly opt out of FDE (Now).
|
||||
- Richer disk metadata (Shipped).
|
||||
- `disko-golden.nix` variants for software-RAID and BTRFS-pool-as-root (Shipped).
|
||||
@@ -160,6 +159,7 @@ Pillar is **done** when every component has a closed `wave/qa-<component>` PR an
|
||||
|
||||
(Move items here when they land — keep them brief, link the commit/PR.)
|
||||
|
||||
- _2026-05-22_ — **Pillar 4: "What's installed?" first-boot summary.** New `nomarchy-installed-summary` script renders a markdown table (via `gum format`, plain fallback) showing the install shape the user should verify before customising: theme / font / panel position (read from `~/.config/nomarchy/state.json`), timezone / DNS / hybrid-GPU (read from `/etc/nixos/state.json`), form factor (`BAT*` sysfs check — same signal the installer uses), software profiles (heuristic via presence of marker binaries: `docker` → Dev, `steam` → Gaming, `libreoffice` → Office, `obs` → Media, `rg` → CLI Utils), FDE status (any `crypt` entry in `lsblk`), and the drive layout (filtered `lsblk -no NAME,SIZE,TYPE,MOUNTPOINT`). `nomarchy-welcome` now calls it as Step 0 (gated on a `gum input` so the user acknowledges before customisation rewrites anything) and the same command works standalone from any terminal. No installer-side changes — the script is fully self-contained against existing state files and live introspection. Closes the "Installer: What's installed? summary on first boot" Now-column item.
|
||||
- _2026-05-21_ — **Pillar 8 / Component 9 (ISOs): closeout — Pillar 8 code-audit phase complete.** Code-review-shaped sweep over `hosts/{nomarchy-installer,nomarchy-live}.nix`, the `installation-cd-minimal`/`installation-cd-graphical-base` module chain, and the four ISO build/test scripts. Two minor fixes inline: `nomarchy-build-iso` and `nomarchy-build-live-iso` both ran under `set -e` but then wrapped `nix build` in an `if [ $? -eq 0 ]` block — the `else` branch printing "Error: ISO build failed." was unreachable because `set -e` aborts before the conditional. Removed the dead branches (behaviour identical: the user sees `nix build`'s own error and the script exits). Regression-class check (`hardware-db.sh` precedent): cross-referenced every tool `install.sh` calls against the installer host's `environment.systemPackages` chain — `gptfdisk` (sgdisk) is provided by upstream `profiles/base.nix:21` which `installation-cd-base.nix` chains, `jq` is wrapped in the `nrun` nix-run fallback, and every other direct call (`wipefs`, `dd`, `parted`, `partprobe`, `cryptsetup`, `disko`, `nixos-{install,enter,rebuild}`, `loadkeys`, `timedatectl`, `nmtui`) resolves via either the explicit host packages or the standard base. `nomarchy-live` host shape verified: multi-GPU initrd modules + Xwayland video drivers cover both real hardware and QEMU; auto-login + passwordless sudo + helpful TTY MOTD + Hyprland on-boot exec to a terminal at the install command. `nomarchy-test-live-iso` walks four OVMF candidate paths with KVM detection. With this entry, every code-shaped audit in Pillar 8 has shipped (Components 1–10); the Now-column "Full QA audit" item moves out, replaced by a runtime-verification punch-list entry covering the cross-component "needs runtime verification" notes from each closeout.
|
||||
- _2026-05-21_ — **Pillar 8 / Component 8 (Scripts runtime behavior): closeout.** Code-review-shaped sweep over `features/scripts/utils/nomarchy-menu` (382 lines, 23 submenu functions), every script referenced from those submenus, the schema↔script field-name cross-check, and cross-cutting typo/stale-reference patterns. Four real fixes inline: **(1)** `nomarchy-menu:70` — "Learn → Nomarchy" still called `nomarchy-launch-webapp https://learn.omacom.io/2/the-nomarchy-manual` (an upstream Omarchy URL — the same one fixed in `nomarchy-manual` back on 2026-05-18). Now calls `nomarchy-manual`, which opens the local docs index. **(2)** `nomarchy-menu:179` — "Style → Hyprland" opened `~/.config/hypr/looknfeel.conf`, a path nothing deploys; the actual file lives at `~/.config/nomarchy/default/hypr/looknfeel.conf` (sourced via the chain from `nomarchy.conf`). Updated the path. **(3)** `nomarchy-menu:258` — `*Overrides*) xdg-open ~/.config/nomarchy/overrides/` case branch with no matching menu option, dead code anticipating the still-unimplemented `nomarchy.overrides.*` loader. Removed (will reappear with the option when the loader ships). **(4)** `nomarchy-theme-bg-next:12` — `jq -r '.theme // "nord"'` defaulted to `"nord"` if `.theme` was missing, while `lib/state-schema.nix:17` defines `"summer-night"` as the schema default. On a fresh-or-empty `state.json` the script looked for backgrounds under `palettes/nord/` while the rest of the system treated `summer-night` as active. Matched to the schema default. Cross-cutting sweeps came back clean: no `$NN[A-Z]+` env var typos elsewhere (the prior pair fixed in `40b6212` was the lot), no references to scripts deleted in earlier Pillar 3 batches (`nomarchy-restart-{hyprctl,mako,tmux}`, `nomarchy-battery-present`, `nomarchy-sudo-keepalive`, `nomarchy-rollback`, `nomarchy-snapshot`, `nomarchy-migrate-state`, `nomarchy-config-direct-boot`, `nomarchy-npx-install`, `nomarchy-webapp-handler-{hey,zoom}`), no stray `omarchy`/`omacom` strings outside historical roadmap entries, and every `state.json` field-write resolves against `lib/state-schema.nix` (or the documented off-schema `welcome_done`). One UX-shaped pattern bug logged separately to Later: `show_setup_config_menu` edits Nix-managed files that get clobbered on the next `home-manager switch`. Runtime verification (run every user-visible menu entry and confirm it does the thing) remains on the user.
|
||||
- _2026-05-21_ — **Pillar 8 / Component 7 (Theme engine + palettes): closeout.** Code-review-shaped sweep across `themes/engine/{stylix,stylix-compat,loader,files,scripts}.nix`, the 23 theme-engine scripts, and the 21 palettes' file completeness. Three real fixes inline + targeted dead-surface cleanup: **(1)** `nomarchy-theme-set` printed a warning when the named theme directory didn't exist but continued executing — wrote the bad name into `state.json` and ran `nomarchy-env-update` on a broken state. Now `exit 1` after the warning. **(2)** `nomarchy-theme-bg-set` (called by the walker background-selector menu and by the `nomarchy-wallpaper` CLI) updated the live `~/.config/nomarchy/current/background` symlink + restarted swaybg but never wrote `state.json` — so every wallpaper picked via either path silently reverted to the theme default on the next `home-manager switch` (`themes/engine/files.nix` re-resolves `nomarchy.wallpaper` at every rebuild). Now writes the chosen path into `state.json.wallpaper`, mirroring `nomarchy-theme-bg-next`. Added a file-exists check so a bogus path fails loudly instead of leaving a dangling symlink + a crashed swaybg. **(3)** Palette tree dead-surface cleanup: deleted `themes/palettes/{flexoki-light,lumon,retro-82,rose-pine}/apps/chromium.theme` (9-byte RGB strings nothing reads — chromium is themed via managed policies in `core/system/browser.nix`, not per-palette files) and `themes/palettes/summer-day/apps/kitty/{kitty.conf,everforest-light.conf}` (a 76KB stray kitty config at the wrong nested path, superseded by the `kitty.conf` generator added in `8d3ce2d`). Total: 6 files / 2210 lines. Updated the misleading comment in `nomarchy-themes-prebuild` ("the installer wires this up") to reflect reality (the installer only tips the user to run it). Updated the `themes/templates/*.tpl` Later row with a fact-check + concrete categorisation — the templates ARE consumed by `nomarchy-theme-set-templates`, but most write to paths nothing reads or are now superseded by Nix-side generators. Palette completeness matrix: all 21 palettes have `colors.toml`, `backgrounds/`, `icons.theme`, and `apps/`; 5 carry the `light.mode` marker (catppuccin-latte, flexoki-light, rose-pine, summer-day, white); only tokyo-night ships `keyboard.rgb` for the ASUS ROG path, and the keyboard-set chain isn't wired into `nomarchy-theme-set` so it stays manual — niche enough to leave. Runtime verification (switch through all 22 palettes and eyeball SDDM + Plymouth + GTK + Qt + terminals + browsers + waybar + walker rendering) remains on the user.
|
||||
|
||||
@@ -24,7 +24,7 @@ Phase B (per-batch PRs) refines those into `port-from-omarchy`,
|
||||
- `delete-dead` — Phase B verdict: remove and update callers.
|
||||
- `stub-with-notify` — Phase B verdict: temporary `notify-send` stub.
|
||||
|
||||
## Scripts (159)
|
||||
## Scripts (160)
|
||||
|
||||
| Script | Location | Callers | Status | Notes |
|
||||
| --- | --- | --- | --- | --- |
|
||||
@@ -74,6 +74,7 @@ Phase B (per-batch PRs) refines those into `port-from-omarchy`,
|
||||
| `nomarchy-hyprland-workspace-layout-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf,features/scripts/utils/nomarchy-menu | `kept` | |
|
||||
| `nomarchy-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,hosts/nomarchy-installer.nix, +2 more | `kept` | |
|
||||
| `nomarchy-install-docker-dbs` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||
| `nomarchy-installed-summary` | `features/scripts/utils` | features/scripts/utils/nomarchy-welcome | `kept` | |
|
||||
| `nomarchy-launch-about` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||
| `nomarchy-launch-audio` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +2 more | `kept` | |
|
||||
| `nomarchy-launch-bluetooth` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +1 more | `kept` | |
|
||||
@@ -174,7 +175,7 @@ Phase B (per-batch PRs) refines those into `port-from-omarchy`,
|
||||
| `nomarchy-update-firmware` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||
| `nomarchy-update-time` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||
| `nomarchy-upload-log` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-debug | `kept` | |
|
||||
| `nomarchy-version` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-debug | `kept` | |
|
||||
| `nomarchy-version` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-debug, +1 more | `kept` | |
|
||||
| `nomarchy-voxtype-config` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
||||
| `nomarchy-voxtype-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||
| `nomarchy-voxtype-model` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
||||
@@ -184,7 +185,7 @@ Phase B (per-batch PRs) refines those into `port-from-omarchy`,
|
||||
| `nomarchy-webapp-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-webapp-remove-all | `kept` | |
|
||||
| `nomarchy-webapp-remove` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||
| `nomarchy-webapp-remove-all` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||
| `nomarchy-welcome` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/autostart.conf,lib/state-schema.nix | `kept` | |
|
||||
| `nomarchy-welcome` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/autostart.conf,features/scripts/utils/nomarchy-installed-summary, +1 more | `kept` | |
|
||||
| `nomarchy-wifi-powersave` | `core/system/scripts` | features/scripts/utils/nomarchy-sys-update,installer/install.sh | `kept` | |
|
||||
| `nomarchy-windows-vm` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||
|
||||
@@ -202,7 +203,7 @@ Walked from `features/scripts/utils/nomarchy-menu`. Each `case` arm in a `show_*
|
||||
| Submenu | Entry | Calls | Status |
|
||||
| --- | --- | --- | --- |
|
||||
| `show_learn_menu` | Keybindings | `nomarchy-menu-keybindings` | `kept` |
|
||||
| `show_learn_menu` | Nomarchy | `nomarchy-launch-webapp` | `kept` |
|
||||
| `show_learn_menu` | Nomarchy | `nomarchy-manual` | `kept` |
|
||||
| `show_learn_menu` | Hyprland | `nomarchy-launch-webapp` | `kept` |
|
||||
| `show_learn_menu` | Arch | `nomarchy-launch-webapp` | `kept` |
|
||||
| `show_learn_menu` | Bash | `nomarchy-launch-webapp` | `kept` |
|
||||
@@ -253,7 +254,6 @@ Walked from `features/scripts/utils/nomarchy-menu`. Each `case` arm in a `show_*
|
||||
| `show_setup_config_menu` | Walker | `nomarchy-restart-walker` | `kept` |
|
||||
| `show_setup_config_menu` | Waybar | `nomarchy-restart-waybar` | `kept` |
|
||||
| `show_setup_config_menu` | XCompose | `nomarchy-restart-xcompose` | `kept` |
|
||||
| `show_setup_config_menu` | Overrides | `_(inline)_` | `kept` |
|
||||
| `show_update_menu` | Nomarchy | `nomarchy-update` | `kept` |
|
||||
| `show_update_menu` | Themes | `nomarchy-theme-update` | `kept` |
|
||||
| `show_update_menu` | Process | `_(inline)_` | `kept` |
|
||||
|
||||
99
features/scripts/utils/nomarchy-installed-summary
Executable file
99
features/scripts/utils/nomarchy-installed-summary
Executable file
@@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# Print a curated "what the installer wrote" summary so the user can verify
|
||||
# the system shape on first boot before they start customising. Reads from
|
||||
# state.json where the schema persists the value, and falls back to live
|
||||
# introspection for things the schema doesn't track (form factor, drives,
|
||||
# active software profiles, FDE).
|
||||
#
|
||||
# Invoked as Step 0 of nomarchy-welcome and available as a standalone CLI.
|
||||
|
||||
HOME_STATE="$HOME/.config/nomarchy/state.json"
|
||||
SYS_STATE="/etc/nixos/state.json"
|
||||
|
||||
jq_or_empty() {
|
||||
local file="$1"
|
||||
local query="$2"
|
||||
[[ -f "$file" ]] || { echo ""; return; }
|
||||
jq -r "$query // empty" "$file" 2>/dev/null || echo ""
|
||||
}
|
||||
|
||||
theme=$(jq_or_empty "$HOME_STATE" '.theme')
|
||||
font=$(jq_or_empty "$HOME_STATE" '.font')
|
||||
panel=$(jq_or_empty "$HOME_STATE" '.panelPosition')
|
||||
tz=$(jq_or_empty "$SYS_STATE" '.timezone')
|
||||
dns=$(jq_or_empty "$SYS_STATE" '.dns')
|
||||
hybrid_gpu=$(jq_or_empty "$SYS_STATE" '.features.hybridGPU')
|
||||
|
||||
# Form factor: same battery-presence check the installer uses to auto-set
|
||||
# nomarchy.{system.,}formFactor.
|
||||
if compgen -G "/sys/class/power_supply/BAT*" >/dev/null; then
|
||||
form_factor="laptop"
|
||||
else
|
||||
form_factor="desktop"
|
||||
fi
|
||||
|
||||
# Active software profiles: heuristic detection. The installer bakes the
|
||||
# user's pick into the generated home.nix as concrete `home.packages` /
|
||||
# system toggles rather than persisting a profile list, so we check for
|
||||
# the marker package of each profile.
|
||||
profiles=()
|
||||
command -v docker >/dev/null 2>&1 && profiles+=("Dev")
|
||||
command -v steam >/dev/null 2>&1 && profiles+=("Gaming")
|
||||
command -v libreoffice >/dev/null 2>&1 && profiles+=("Office")
|
||||
command -v obs >/dev/null 2>&1 && profiles+=("Media")
|
||||
command -v rg >/dev/null 2>&1 && profiles+=("CLI Utils")
|
||||
|
||||
profiles_str="None"
|
||||
if (( ${#profiles[@]} > 0 )); then
|
||||
profiles_str="$(IFS=', '; echo "${profiles[*]}")"
|
||||
fi
|
||||
|
||||
# FDE: any crypt device present means the install used LUKS.
|
||||
luks="No"
|
||||
if lsblk -no TYPE 2>/dev/null | grep -q '^crypt$'; then
|
||||
luks="Yes"
|
||||
fi
|
||||
|
||||
# Drives: target disks + their mounted root/boot/crypt partitions. Filter
|
||||
# noise (loop/rom/zram) so the table reads like an install receipt.
|
||||
drives=$(lsblk -no NAME,SIZE,TYPE,MOUNTPOINT 2>/dev/null \
|
||||
| grep -Ev '^(loop|sr|zram)' \
|
||||
| awk 'NF>=3 && $3 ~ /^(disk|part|crypt)$/' \
|
||||
|| true)
|
||||
|
||||
version_line=$(nomarchy-version 2>/dev/null || echo "Nomarchy")
|
||||
hostname_line="$(hostname 2>/dev/null || echo "")"
|
||||
|
||||
# Render via gum format (markdown). Fallback to plain text when gum isn't
|
||||
# on PATH — keeps the script callable from minimal contexts like recovery.
|
||||
render() {
|
||||
cat <<MD
|
||||
# $version_line on \`$hostname_line\`
|
||||
|
||||
| Setting | Value |
|
||||
| --- | --- |
|
||||
| Theme | ${theme:-—} |
|
||||
| Font | ${font:-—} |
|
||||
| Panel | ${panel:-—} |
|
||||
| Form factor | $form_factor |
|
||||
| Timezone | ${tz:-—} |
|
||||
| DNS | ${dns:-—} |
|
||||
| Hybrid GPU | ${hybrid_gpu:-false} |
|
||||
| Profiles | $profiles_str |
|
||||
| FDE (LUKS) | $luks |
|
||||
|
||||
## Drives
|
||||
|
||||
\`\`\`
|
||||
$drives
|
||||
\`\`\`
|
||||
MD
|
||||
}
|
||||
|
||||
if command -v gum >/dev/null 2>&1; then
|
||||
render | gum format
|
||||
else
|
||||
render
|
||||
fi
|
||||
@@ -26,6 +26,14 @@ gum style \
|
||||
echo "Welcome! Let's personalize your new system."
|
||||
echo ""
|
||||
|
||||
# 0. Show what the installer actually wrote so the user can verify the
|
||||
# install shape (theme, font, profiles, drives, FDE, form factor) before
|
||||
# diving into customisation. Available standalone via the same command.
|
||||
nomarchy-installed-summary
|
||||
echo ""
|
||||
gum input --placeholder "Press Enter to continue with customisation…" >/dev/null || true
|
||||
echo ""
|
||||
|
||||
# 1. Select initial theme
|
||||
echo "Step 1: Choose your starting theme"
|
||||
SELECTED_THEME="$(nomarchy-theme-list | gum filter --placeholder 'Select a theme...')"
|
||||
|
||||
Reference in New Issue
Block a user