All checks were successful
Check / eval (push) Successful in 3m15s
The executive-slate preset shipped a waybar.css that referenced @base/@accent
with no @define-color block, and no matching waybar.jsonc — so the raw-read
override ran a largely unstyled bar (the item-28 partial-whole-swap defect).
The palette was also flat (base->surface only 1.13x) with a dim accent
(#4D78CC, 3.91 on base).
- Palette: widen surface stepping (base->surface 1.13x -> 1.29x so panels/
selection/hover separate), brighten the accent (#4D78CC -> #5A8AE6, 3.91 ->
5.04 on base, now AA text), lift subtext/good/warn/bad a tier, realign ansi,
soften bright-white (#FFFFFF -> #F0F3F9). text stays 12.5 AAA. Contrast
checker: all 23 themes x 7 pairings pass.
- Waybar: complete the bespoke bar as a real whole-swap. New waybar.jsonc with
the full 17-module set (parity with summer-day/night); waybar.css rewritten
to lead with its own @define-color block and cover every module + state class
the helper scripts emit (.recording/.activated/.on/.available/.dnd-*/battery).
Identity: solid, edge-to-edge, sharp corners, accent underline on the active
workspace.
- Rofi: drop the broken var() idiom for the house *{}/@name convention (split
border syntax, message/textbox/scrollbar elements for the theme-grid picker).
- CONVENTIONS: Waybar parity rule now names executive-slate as a third
whole-swap target (was stale at summer-only).
V1: nix flake check --no-build green; strict JSON parse of both files; real
rofi parsed the .rasi cleanly; with executive-slate set active, the module
eval resolves waybar.settings -> the jsonc, waybar.style -> the css, rofi.theme
-> the override rasi, and theme.nix accepts the palette. NOT yet done: on-screen
render of the bar/rofi/desktop (V2/V3) and preview.png (deferred to on-hardware
capture, per the chosen path).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.6 KiB
3.6 KiB
Conventions — how Nomarchy code is written
The standing rules an agent must follow while coding. GOALS.md says what we're building; this says how. Details/rationale live in docs/ROADMAP.md's decision records and the README.
Repo layout (the rule of thumb)
modules/ is the distro (reusable, no machine specifics) · hosts/ is a
machine · themes/ is data · pkgs/ is code · tools/ is maintainer-only
· agent/ is loop state. If a new file doesn't obviously belong to one of
those, it probably shouldn't exist.
Nix style
- No formatter. Files use deliberate aligned hand-formatting — match the surrounding style exactly; never reflow a file you're only touching a line of.
- Distro defaults use
lib.mkDefaultso a plain downstream assignment wins; bind/exec lists concatenate. Behaviour options overridable, appearance flows from the state JSON. - Options live in the existing surfaces:
nomarchy.system.*/nomarchy.hardware.*/nomarchy.services.*(NixOS,system.nix), everything elsenomarchy.*(HM,home.nix). Update the README tables when the surface changes.
Feature design
- In-flake state: any user-settable config gets a menu writer that
lands it in
theme-state.json(settings.*), git-tracked. No~/.local/state, no side files. Instant-effect where possible (--no-switch+ flip the service; the service reads the live working tree at start — the night-lightExecConditionpattern). Rebuild-baked values graduate viamkDefaultreads of the settings key. - Toggle vs package: a
nomarchy.*toggle only when there's real config behind it (units, groups, udev, firewall). A bare package goes in the downstream template'shome.packages— opt-out is deleting the line. - Opt-in features ship a commented example in
templates/downstream/home.nixorsystem.nix. - Menu: new entries go in the right submenu (Tools › / System ›; root
stays six entries), end lists with the shared
↩ Back, self-gate on the feature's availability, and add the directSUPER+CTRL+<mnemonic>bind inkeybinds.nix(single source — it feeds both Hyprland and the SUPER+? cheatsheet). - Waybar: new indicators self-gate (hidden when irrelevant), use
named
writeShellScriptBins on PATH (so static configs can exec them by bare name), and are added to both the generatedwaybar.nixconfig and everywaybar.jsoncwhole-swap — summer-day, summer-night and executive-slate (the parity rule). - Theming: every new visual surface consumes the palette from the state JSON. There is no second renderer to keep in sync — add the key to the JSON, consume it in the module.
Testing
- docs/TESTING.md is canonical; LOOP.md's ladder (V0–V3) sets the
required tier. Cheap first:
nix flake check --no-build,bash -n,py_compile. - Prefer a permanent
checks.*runNixOSTest over a one-off manual poke; reusable recipes (headless Hyprland with software GL, QMP screenshots, udev-event fakes) are indexed in MEMORY.md and demonstrated by the existing checks (distro-id,hardware-toggles,battery-charge-limit). - The honesty rule: report exactly what you verified and at which tier.
Git
mainis development (direct commits, pushed);v1is the release pointer — human-only, fast-forward-only, never touched by agents.- Commit style:
feat|fix|test|docs|chore(scope): summary, body with what/why + verification tier + what remains. Bookkeeping (agent/updates) rides in the same commit as the change. flake.lockmoves only when the task is a lock bump, and only within the pinned release branches.