diff options
| author | 2026-09-18 15:12:24 +0200 | |
|---|---|---|
| committer | 2026-09-18 15:12:24 +0200 | |
| commit | 4937d0d6f29895b514dcf8cd20c73a1aec446144 (patch) | |
| tree | 7ff388ba4cca94e95489d30452b25badd7e49aa9 /openspec/specs/nix-flake-bootstrap/spec.md | |
| parent | 72b640f5ae65755c1d932b7b8ee88d2367e4036f (diff) | |
| download | desktop-flake-4937d0d6f29895b514dcf8cd20c73a1aec446144.tar.gz desktop-flake-4937d0d6f29895b514dcf8cd20c73a1aec446144.tar.bz2 desktop-flake-4937d0d6f29895b514dcf8cd20c73a1aec446144.zip | |
Archive four completed changes, sync main specs
add-nix-flake-bootstrap, add-host-bootstrap-script,
add-dotfiles-stow-bootstrap, and add-developer-environment all had
every task complete (verified via a real nix flake check and a real
NixOS host build). Archived in dependency order so the two changes
sharing the nix-flake-bootstrap capability merged additively. Main
specs now exist for the first time: nix-flake-bootstrap (10
requirements), dotfiles-management (4), developer-environment (4).
add-gnome-desktop remains active (not yet implemented).
Diffstat (limited to 'openspec/specs/nix-flake-bootstrap/spec.md')
| -rw-r--r-- | openspec/specs/nix-flake-bootstrap/spec.md | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/openspec/specs/nix-flake-bootstrap/spec.md b/openspec/specs/nix-flake-bootstrap/spec.md new file mode 100644 index 0000000..955dc56 --- /dev/null +++ b/openspec/specs/nix-flake-bootstrap/spec.md | |||
| @@ -0,0 +1,91 @@ | |||
| 1 | ## Purpose | ||
| 2 | |||
| 3 | Provides a single Nix flake that provisions NixOS hosts from a copyable template and provisions a shared, cross-platform home-manager user profile that installs standalone on non-NixOS systems, keeping both paths built from the same per-user module. | ||
| 4 | |||
| 5 | ## Requirements | ||
| 6 | |||
| 7 | ### Requirement: Shared home profile across activation methods | ||
| 8 | The system SHALL apply the same home-manager user profile (shell, git, editor, CLI tools) whether it is activated as part of a NixOS system build or activated standalone via `home-manager switch` on a non-NixOS system. | ||
| 9 | |||
| 10 | #### Scenario: NixOS-activated profile matches standalone profile | ||
| 11 | - **WHEN** a NixOS host built with the `mkNixos` helper activates its `home-manager.users.tom` configuration | ||
| 12 | - **THEN** the resulting user environment includes the same programs and settings as the `homeConfigurations."tom@linux"` output built with the `mkHome` helper, because both consume the same `users/tom.nix` module | ||
| 13 | |||
| 14 | ### Requirement: Standalone installation requires no root privileges | ||
| 15 | The system SHALL allow the shared home profile to be installed on any non-NixOS system without modifying system-level configuration or requiring root/sudo. | ||
| 16 | |||
| 17 | #### Scenario: Standalone home-manager switch | ||
| 18 | - **WHEN** a user with Nix installed runs `home-manager switch --flake .#tom@linux` on a non-NixOS Linux system | ||
| 19 | - **THEN** only the user's home directory is modified and no root privileges are required | ||
| 20 | |||
| 21 | ### Requirement: NixOS host template is not a live flake output | ||
| 22 | The system SHALL provide a NixOS host template directory that is not wired into any `nixosConfigurations` output, so it cannot be accidentally built or installed before being customized for real hardware. | ||
| 23 | |||
| 24 | #### Scenario: Flake check does not build the template | ||
| 25 | - **WHEN** `nix flake check` is run against the repository | ||
| 26 | - **THEN** no `nixosConfigurations` entry evaluates or builds the `hosts/template` directory directly | ||
| 27 | |||
| 28 | ### Requirement: Flakes remain enabled on installed NixOS systems | ||
| 29 | Every NixOS host built from this flake SHALL have the `nix-command` and `flakes` experimental features enabled by default, so subsequent `nixos-rebuild` invocations do not require extra flags. | ||
| 30 | |||
| 31 | #### Scenario: Rebuilding after install needs no extra flags | ||
| 32 | - **WHEN** a NixOS system installed from this flake is rebuilt with `nixos-rebuild switch --flake <path>#<host>` | ||
| 33 | - **THEN** the command succeeds without passing `--extra-experimental-features` | ||
| 34 | |||
| 35 | ### Requirement: Per-host and per-user state versions are explicit | ||
| 36 | Each NixOS host and each home-manager user configuration SHALL declare its own `system.stateVersion` / `home.stateVersion` value; the shared helper functions SHALL NOT supply a default value. | ||
| 37 | |||
| 38 | #### Scenario: Missing stateVersion fails evaluation | ||
| 39 | - **WHEN** a host or user configuration omits its `stateVersion` setting | ||
| 40 | - **THEN** evaluating that configuration fails rather than silently falling back to a shared default | ||
| 41 | |||
| 42 | ### Requirement: Repository evaluates under pure evaluation | ||
| 43 | The flake's `homeConfigurations` and check outputs defined in this change SHALL evaluate and build using only pure evaluation, without requiring the `--impure` flag. | ||
| 44 | |||
| 45 | #### Scenario: Pure flake check succeeds | ||
| 46 | - **WHEN** `nix flake check` is run without `--impure` | ||
| 47 | - **THEN** it completes successfully for all outputs defined in this change | ||
| 48 | |||
| 49 | ### Requirement: Host directories are auto-discovered as flake outputs | ||
| 50 | Any directory under `hosts/` other than `hosts/template` that contains a valid host definition SHALL automatically become a `nixosConfigurations.<name>` output, without requiring any edit to `flake.nix`. | ||
| 51 | |||
| 52 | #### Scenario: New host directory becomes buildable without touching flake.nix | ||
| 53 | - **WHEN** a new directory `hosts/<name>/` is created containing `configuration.nix`, `hardware-configuration.nix`, and a `system` file, and `flake.nix` itself is left unmodified | ||
| 54 | - **THEN** `nixosConfigurations.<name>` evaluates successfully as part of the flake's outputs | ||
| 55 | |||
| 56 | #### Scenario: Template remains excluded from discovery | ||
| 57 | - **WHEN** the flake's outputs are evaluated | ||
| 58 | - **THEN** `hosts/template` does not appear as a `nixosConfigurations` entry, regardless of its contents | ||
| 59 | |||
| 60 | ### Requirement: Host creation is scripted | ||
| 61 | The system SHALL provide a script that scaffolds a new NixOS host directory from the template, given a hostname, a target root path, and a state version. | ||
| 62 | |||
| 63 | #### Scenario: Scaffolding a new host | ||
| 64 | - **WHEN** the host creation script is run with a hostname, a `--root` path, and a `--state-version` | ||
| 65 | - **THEN** a `hosts/<hostname>/` directory is created containing a `configuration.nix` with the hostname and state version filled in, a `system` file, and a `hardware-configuration.nix` copied from the given root | ||
| 66 | |||
| 67 | #### Scenario: Refusing to overwrite an existing host | ||
| 68 | - **WHEN** the host creation script is run with a hostname that already has a `hosts/<hostname>/` directory, without an explicit override flag | ||
| 69 | - **THEN** the script fails without modifying the existing directory | ||
| 70 | |||
| 71 | ### Requirement: Hardware configuration source is always explicit | ||
| 72 | The host creation script SHALL require an explicit root path for locating `hardware-configuration.nix` and SHALL NOT read from the invoking system's own `/etc/nixos` unless that path is explicitly given as the root. | ||
| 73 | |||
| 74 | #### Scenario: No root provided | ||
| 75 | - **WHEN** the host creation script is run without a root path specified | ||
| 76 | - **THEN** the script fails with an error rather than falling back to any default location | ||
| 77 | |||
| 78 | #### Scenario: Live installer environment targets the mounted install, not the live system | ||
| 79 | - **WHEN** the host creation script is run from a NixOS live/installer environment with `--root /mnt` pointing at a freshly mounted install target | ||
| 80 | - **THEN** the resulting `hardware-configuration.nix` is copied from `/mnt/etc/nixos/hardware-configuration.nix`, and the live environment's own `/etc/nixos/hardware-configuration.nix` is never read | ||
| 81 | |||
| 82 | #### Scenario: Hardware configuration cannot be found or generated | ||
| 83 | - **WHEN** the host creation script is run with a `--root` path that has no `hardware-configuration.nix` and no `nixos-generate-config` command is available to create one | ||
| 84 | - **THEN** the script fails with a clear error instead of proceeding with a missing or stub file | ||
| 85 | |||
| 86 | ### Requirement: Install target matches the created host name | ||
| 87 | The host attribute produced for a newly scaffolded host SHALL exactly match the hostname given to the creation script, so the host can be installed or rebuilt via `<flake>#<hostname>`. | ||
| 88 | |||
| 89 | #### Scenario: Installing a newly scaffolded host | ||
| 90 | - **WHEN** a host is scaffolded with a given hostname | ||
| 91 | - **THEN** `nixos-install --flake <flake-path>#<hostname>` and `nixos-rebuild switch --flake <flake-path>#<hostname>` both resolve to the configuration that was just scaffolded | ||
