fix: ground + fix three Pillar-9 candidate bugs from the script sweep
All checks were successful
Check / eval-and-lint (push) Successful in 6m40s

All three confirmed real on inspection.

1. nomarchy-refresh-config was dead on every system: it read
   /etc/nixos/nomarchy/{core/home/config,features} (the source tree never
   lands there — only /etc/nomarchy on VM-guest/live ISO) and fell back to
   ~/.local/share/nomarchy/config, which nothing deployed despite SKILL.md
   documenting it. Deploy the pristine core/home/config tree to
   ~/.local/share/nomarchy/config via xdg.dataFile and read from there, so it
   works without a source checkout; its live caller nomarchy-refresh-fastfetch
   now succeeds. Fix two stale SKILL.md examples (waybar/, hypr/) that pointed
   at non-existent stock paths.

2. nomarchy-docs-scripts shipped a stale divergent copy in
   features/scripts/utils/ (in the user nomarchy-system-scripts package)
   beside the canonical bin/utils dev tool — it errored outside the repo.
   Grounding it surfaced the identical bug in nomarchy-docs-keybindings.
   Delete both duplicates, add them to the generator's self-reference
   denylist so they don't show as false `missing`, regenerate docs/SCRIPTS.md.

3. Home ~/.config/nomarchy/state.json was never seeded on non-installer
   systems, so nomarchy-installed-summary rendered "—" for theme/font/panel.
   Add an idempotent home-manager activation seed in core/home/state.nix that
   backfills the resolved values (defaults * existing — user choices and
   runtime-only keys like welcome_done always win).

Verified: flake check + full eval matrix clean; refresh-config happy/error
paths and the seed deep-merge proven by hand.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-05-31 14:25:02 +01:00
parent 00b8214cb1
commit 0fbc3d9c82
9 changed files with 75 additions and 433 deletions

View File

@@ -1,4 +1,4 @@
{ config, lib, ... }:
{ config, lib, pkgs, ... }:
let
nomarchyLib = import ../../lib { inherit lib; };
@@ -12,6 +12,19 @@ let
# Read unified state from ~/.config/nomarchy/state.json
togglesState = nomarchyLib.readHomeState config.home.homeDirectory;
cfg = config.nomarchy;
# The resolved values, in state.json's on-disk shape. Seeded into the file
# so runtime consumers (nomarchy-installed-summary, the setters) see the
# real defaults instead of a missing key — without this the summary shows
# "—" for theme/font/panel on any system the installer didn't write to.
seedJSON = builtins.toJSON {
inherit (cfg) theme wallpaper panelPosition nightlightTemperature;
font = cfg.fonts.monospace;
inherit (cfg.toggles) suspend screensaver idle nightlight waybar;
inherit (cfg.hyprland) gaps_in gaps_out border_size;
};
stateFile = "${config.home.homeDirectory}/.config/nomarchy/state.json";
in
{
# Every assignment uses lib.mkDefault so a downstream /etc/nixos/home.nix
@@ -48,5 +61,23 @@ in
inherit assetsPath;
});
};
# Backfill any state.json key the user hasn't set. Existing values always
# win (`defaults * existing`), so a user's theme/font/etc. and any
# runtime-only keys (welcome_done, …) are never clobbered — this only
# fills the gaps so the file reflects the system's actual defaults.
home.activation.seedNomarchyState = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
run mkdir -p "$(dirname ${lib.escapeShellArg stateFile})"
tmp="$(${pkgs.coreutils}/bin/mktemp)"
# Build the next file contents in $tmp first; only the final move is
# guarded by `run` so a dry-run never mutates the real state file.
if [ -e ${lib.escapeShellArg stateFile} ]; then
${pkgs.jq}/bin/jq -n --argjson d ${lib.escapeShellArg seedJSON} \
--slurpfile s ${lib.escapeShellArg stateFile} '$d * $s[0]' > "$tmp"
else
printf '%s\n' ${lib.escapeShellArg seedJSON} > "$tmp"
fi
run mv "$tmp" ${lib.escapeShellArg stateFile}
'';
};
}