Audited every entry in `installer/hardware-db.sh` against
`inputs.nixos-hardware.nixosModules` and found **21 of 43 entries (49%)
referenced modules that don't exist** in the upstream attribute set —
those installs would fail at eval time with "attribute not found"
errors on real hardware. Specifically:
- Framework 13 per-gen: nixos-hardware uses `framework-11th-gen-intel`,
not `framework-13-11th-gen-intel`. Fixed all four generations.
- Framework 13 AMD AI 300: `framework-amd-ai-300-series` (no "13-").
- Framework Intel Core Ultra: added `framework-intel-core-ultra-series1`.
- Framework 16 AMD AI 300: added `framework-16-amd-ai-300-series`.
- Framework generic fallback now uses the `framework` umbrella module.
- ThinkPad X1 Carbon: modules are `lenovo-thinkpad-x1-Nth-gen`,
not `-x1-carbon-genN`. Fixed gens 6/7/9/10/11; added X1 Nano.
- ThinkPad P14s: requires arch+gen suffix; switched to the AMD gen3/4/5
modules (the prior `lenovo-thinkpad-p14s` had no attribute).
- Surface Pro 6/7/8/10: all share `microsoft-surface-pro-intel`. Pro 9
keeps its dedicated module. Pro 3 fixed to `-pro-3`. Surface Book
2/3 and Intel-based Surface Laptop 3/4/5: no nixos-hardware module
— rows dropped; generic chassis+cpu+gpu detection still emits
sensible `common-pc-laptop`.
- ASUS ROG Strix G513 → `asus-rog-strix-g513im` (correct attr name).
- ASUS ROG Zephyrus GA403 didn't exist — dropped. Added `ga402x`,
`gu603h`, `g533zw`.
- ASUS Zenbook generic `asus-zenbook-ux` was non-existent — dropped
(too vague; available modules are per-model like `asus-zenbook-ux481`).
- Dell Latitude 5400 / 7480: no modules — replaced with the existing
`dell-latitude-7420`, `7430`, `7490`.
Added:
- ROG Ally / Ally X support (`asus-ally-rc71l` for `RC71L`,
`RC72LA`, and the "ROG Ally" product string). nixos-hardware
currently ships one module for both revisions.
Documented (in a footer comment) the devices nixos-hardware doesn't
cover so they're known-unsupported rather than accidentally missing:
- Valve Steam Deck → Jovian-NixOS as a separate flake input.
- Snapdragon X laptops → aarch64 only; Nomarchy installer is x86_64.
- Raspberry Pi → same as above.
Bug discovered along the way: the DB's pipe-separated row format
collides with bash regex alternation. A row like
`Microsoft|Surface Pro (10|8|7|6)|_|module` parses as 7 fields, with
"7" extracted as the module name. Surface Pro variants are now one
row per version.
CI gate added (`.forgejo/workflows/check.yml`): a new step extracts
every 4th-pipe-field from `HARDWARE_DB` and `comm -23`s it against
`inputs.nixos-hardware.nixosModules`. Any future entry pointing at a
non-existent module fails CI with a clear error. Closes the regression
class entirely.
Verified locally: bash -n + shellcheck --severity=error pass on
hardware-db.sh; the CI step's exact commands pass against the new DB.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
103 lines
4.3 KiB
YAML
103 lines
4.3 KiB
YAML
# Nomarchy CI — eval + lint.
|
|
#
|
|
# Catches the regressions that hurt today:
|
|
# 1. Flake stops evaluating (broken option ref, missing import, etc.).
|
|
# 2. A `nomarchy-*` shell script has a syntax error or a shellcheck
|
|
# error-severity issue.
|
|
# 3. `docs/SCRIPTS.md` drifts from the repo state because somebody
|
|
# added / removed / renamed a script and didn't run the generator
|
|
# (the pre-commit hook handles this, but only when enabled per-clone).
|
|
#
|
|
# Doesn't build ISOs — that needs a binary cache. Add a separate job
|
|
# once Cachix/Attic is in place.
|
|
|
|
name: Check
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
jobs:
|
|
eval-and-lint:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install Nix
|
|
uses: DeterminateSystems/nix-installer-action@main
|
|
with:
|
|
# Match the runner's effective channel. Nomarchy itself tracks
|
|
# nixos-25.11 via flake.nix; the installer-action default is fine.
|
|
extra-conf: |
|
|
experimental-features = nix-command flakes
|
|
|
|
- name: nix flake check --no-build
|
|
run: nix flake check --no-build
|
|
|
|
- name: Lint nomarchy-* scripts (bash -n + shellcheck)
|
|
run: |
|
|
# Mirror what .githooks/pre-commit runs locally, but across the
|
|
# whole tree instead of just changed files. Pre-commit gates
|
|
# individual commits; CI gates branches (including --no-verify
|
|
# bypasses).
|
|
set -e
|
|
fail=0
|
|
while IFS= read -r script; do
|
|
[[ -f "$script" ]] || continue
|
|
# Python helpers ship under the same nomarchy- prefix
|
|
# (e.g. nomarchy-haptic-touchpad). Skip non-bash.
|
|
head -1 "$script" | grep -qE '^#!.*\bbash\b' || continue
|
|
if ! bash -n "$script"; then
|
|
echo "::error file=$script::bash syntax error"
|
|
fail=1
|
|
fi
|
|
if ! nix shell nixpkgs#shellcheck --command shellcheck \
|
|
--severity=error --shell=bash "$script"; then
|
|
echo "::error file=$script::shellcheck error-severity issue"
|
|
fail=1
|
|
fi
|
|
done < <(find features/scripts/utils core/system/scripts \
|
|
themes/engine/scripts \
|
|
-maxdepth 1 -type f -name 'nomarchy-*')
|
|
exit "$fail"
|
|
|
|
- name: docs/SCRIPTS.md is up to date
|
|
run: |
|
|
# Regenerate to a temp file and compare. If different, the
|
|
# contributor forgot to run the generator (or skipped the
|
|
# pre-commit hook). Fail loudly and tell them the fix.
|
|
./bin/utils/nomarchy-docs-scripts --out /tmp/SCRIPTS.regen.md
|
|
if ! diff -q docs/SCRIPTS.md /tmp/SCRIPTS.regen.md >/dev/null; then
|
|
echo "::error::docs/SCRIPTS.md is stale."
|
|
echo "Run: ./bin/utils/nomarchy-docs-scripts --out docs/SCRIPTS.md"
|
|
echo "Then commit the regenerated file."
|
|
echo "--- diff ---"
|
|
diff -u docs/SCRIPTS.md /tmp/SCRIPTS.regen.md || true
|
|
exit 1
|
|
fi
|
|
|
|
- name: installer/hardware-db.sh references real nixos-hardware modules
|
|
run: |
|
|
# Every 4th-pipe-field in HARDWARE_DB is a nixos-hardware module
|
|
# name. Half the DB used to point at modules that don't exist
|
|
# (e.g. microsoft-surface-pro-8 — there's only -pro-intel and
|
|
# -pro-9), which made the install fail at eval time with
|
|
# cryptic "attribute not found" errors on real laptops. This
|
|
# step catches that regression class.
|
|
awk -F'|' '/^ "/ { gsub(/"/,"",$4); gsub(/^[[:space:]]+|[[:space:]]+$/,"",$4); if ($4) print $4 }' \
|
|
installer/hardware-db.sh | sort -u > /tmp/db-refs.txt
|
|
nix eval --impure --json --expr '
|
|
let
|
|
nh = (builtins.getFlake (toString ./.)).inputs.nixos-hardware.nixosModules;
|
|
in builtins.attrNames nh' \
|
|
| nix shell nixpkgs#jq --command jq -r '.[]' | sort -u > /tmp/db-real.txt
|
|
missing=$(comm -23 /tmp/db-refs.txt /tmp/db-real.txt)
|
|
if [[ -n "$missing" ]]; then
|
|
echo "::error::hardware-db.sh references nixos-hardware modules that don't exist:"
|
|
printf ' - %s\n' $missing
|
|
echo "Either fix the name (check the actual attr in nixos-hardware) or drop the row."
|
|
exit 1
|
|
fi
|