diff options
| -rw-r--r-- | README.md | 5 | ||||
| -rw-r--r-- | modules/home/dev-tools.nix | 1 | ||||
| -rw-r--r-- | modules/home/editor.nix | 13 | ||||
| -rw-r--r-- | openspec/changes/fix-neovim-plugin-loading/.openspec.yaml | 2 | ||||
| -rw-r--r-- | openspec/changes/fix-neovim-plugin-loading/design.md | 41 | ||||
| -rw-r--r-- | openspec/changes/fix-neovim-plugin-loading/proposal.md | 24 | ||||
| -rw-r--r-- | openspec/changes/fix-neovim-plugin-loading/specs/editor-environment/spec.md | 26 | ||||
| -rw-r--r-- | openspec/changes/fix-neovim-plugin-loading/tasks.md | 20 |
8 files changed, 131 insertions, 1 deletions
| @@ -13,6 +13,7 @@ A single Nix flake for provisioning both NixOS hosts and non-NixOS systems (any | |||
| 13 | - `scripts/bootstrap-host.sh` — scaffolds a new `hosts/<hostname>/` from the template; exposed as `apps.<system>.bootstrap-host` | 13 | - `scripts/bootstrap-host.sh` — scaffolds a new `hosts/<hostname>/` from the template; exposed as `apps.<system>.bootstrap-host` |
| 14 | - `modules/home/dotfiles.nix` — opt-in personal dotfiles automation (see below) | 14 | - `modules/home/dotfiles.nix` — opt-in personal dotfiles automation (see below) |
| 15 | - `modules/home/bash-profile.nix` — always-on `~/.bash_profile` bootstrap (see below) | 15 | - `modules/home/bash-profile.nix` — always-on `~/.bash_profile` bootstrap (see below) |
| 16 | - `modules/home/editor.nix` — Neovim provisioning; deliberately never writes to `~/.config/nvim` (see below) | ||
| 16 | 17 | ||
| 17 | Any directory under `hosts/` other than `hosts/template` that contains a `system` file automatically becomes a real `nixosConfigurations.<name>` output — adding a host means dropping in a directory, not editing `flake.nix`. | 18 | Any directory under `hosts/` other than `hosts/template` that contains a `system` file automatically becomes a real `nixosConfigurations.<name>` output — adding a host means dropping in a directory, not editing `flake.nix`. |
| 18 | 19 | ||
| @@ -60,6 +61,10 @@ home.dotfiles.repoUrl = "https://example.com/your/dotfiles.git"; | |||
| 60 | 61 | ||
| 61 | Behavior notes: an existing `~/dotfiles` checkout is never re-cloned or modified; every non-hidden top-level directory is treated as a stow package; one package's conflict with an existing file only skips that package (a warning is printed) rather than blocking the rest. Because `~/dotfiles/git/.gitconfig` and `~/dotfiles/bash/.bashrc` are expected to be the sole sources of git and bash configuration once stowed, this repo's own `programs.git`/`programs.bash` home-manager management has been removed — `git` itself is still installed via `modules/home/cli-tools.nix`, and `bash` ships with both macOS and NixOS regardless of whether `repoUrl` is set. | 62 | Behavior notes: an existing `~/dotfiles` checkout is never re-cloned or modified; every non-hidden top-level directory is treated as a stow package; one package's conflict with an existing file only skips that package (a warning is printed) rather than blocking the rest. Because `~/dotfiles/git/.gitconfig` and `~/dotfiles/bash/.bashrc` are expected to be the sole sources of git and bash configuration once stowed, this repo's own `programs.git`/`programs.bash` home-manager management has been removed — `git` itself is still installed via `modules/home/cli-tools.nix`, and `bash` ships with both macOS and NixOS regardless of whether `repoUrl` is set. |
| 62 | 63 | ||
| 64 | ## Editor (Neovim) | ||
| 65 | |||
| 66 | `modules/home/editor.nix` installs Neovim as the default editor (`$EDITOR`/`$VISUAL`, plus a `vim` alias), and provisions a C compiler (`pkgs.stdenv.cc`) and the `tree-sitter` CLI so natively-built plugins can compile. It deliberately sets `programs.neovim.sideloadInitLua = true`, which stops home-manager from writing anything to `~/.config/nvim/init.lua` — that path is owned exclusively by the personal dotfiles repo's `neovim` Stow package (lazy.nvim + plugins). Without `sideloadInitLua`, home-manager's own generated `init.lua` permanently conflicts with that Stow package and it gets silently skipped (per the dotfiles automation's skip-on-conflict behavior above), so plugins never load. **Don't add `programs.neovim.extraConfig`/`plugins`/anything else that writes into `~/.config/nvim` here** — it would reintroduce the same conflict. | ||
| 67 | |||
| 63 | ## Login shell bootstrap | 68 | ## Login shell bootstrap |
| 64 | 69 | ||
| 65 | NixOS and most other Linux distros don't ship a `~/.bash_profile` that sources `~/.bashrc`, so login shells never pick up your bash config. `modules/home/bash-profile.nix` creates one for you — but only if `~/.bash_profile` doesn't already exist. If it's already there (any file or symlink), it's left completely untouched; home-manager never edits or removes it. This is always on, on every platform (Linux and macOS), and isn't gated by `home.dotfiles.repoUrl` — it works whether or not you use the personal dotfiles automation above. | 70 | NixOS and most other Linux distros don't ship a `~/.bash_profile` that sources `~/.bashrc`, so login shells never pick up your bash config. `modules/home/bash-profile.nix` creates one for you — but only if `~/.bash_profile` doesn't already exist. If it's already there (any file or symlink), it's left completely untouched; home-manager never edits or removes it. This is always on, on every platform (Linux and macOS), and isn't gated by `home.dotfiles.repoUrl` — it works whether or not you use the personal dotfiles automation above. |
diff --git a/modules/home/dev-tools.nix b/modules/home/dev-tools.nix index f98790e..f74c2b7 100644 --- a/modules/home/dev-tools.nix +++ b/modules/home/dev-tools.nix | |||
| @@ -5,7 +5,6 @@ | |||
| 5 | tmux | 5 | tmux |
| 6 | htop | 6 | htop |
| 7 | yq-go | 7 | yq-go |
| 8 | tree-sitter | ||
| 9 | docker | 8 | docker |
| 10 | docker-compose | 9 | docker-compose |
| 11 | kubectl | 10 | kubectl |
diff --git a/modules/home/editor.nix b/modules/home/editor.nix index b687552..413ca8f 100644 --- a/modules/home/editor.nix +++ b/modules/home/editor.nix | |||
| @@ -1,7 +1,20 @@ | |||
| 1 | { pkgs, ... }: | ||
| 1 | { | 2 | { |
| 2 | programs.neovim = { | 3 | programs.neovim = { |
| 3 | enable = true; | 4 | enable = true; |
| 4 | defaultEditor = true; | 5 | defaultEditor = true; |
| 5 | vimAlias = true; | 6 | vimAlias = true; |
| 7 | # Never write ~/.config/nvim/init.lua ourselves - that path is owned by | ||
| 8 | # the externally-managed dotfiles config (lazy.nvim + plugins), stowed | ||
| 9 | # in separately. Without this, home-manager's own generated init.lua | ||
| 10 | # permanently conflicts with that stow package and it gets skipped. | ||
| 11 | sideloadInitLua = true; | ||
| 6 | }; | 12 | }; |
| 13 | |||
| 14 | # tree-sitter (parser compilation) and a C compiler for natively-built | ||
| 15 | # Neovim plugins declared by the dotfiles-owned config above. | ||
| 16 | home.packages = with pkgs; [ | ||
| 17 | tree-sitter | ||
| 18 | stdenv.cc | ||
| 19 | ]; | ||
| 7 | } | 20 | } |
diff --git a/openspec/changes/fix-neovim-plugin-loading/.openspec.yaml b/openspec/changes/fix-neovim-plugin-loading/.openspec.yaml new file mode 100644 index 0000000..f2cbbe6 --- /dev/null +++ b/openspec/changes/fix-neovim-plugin-loading/.openspec.yaml | |||
| @@ -0,0 +1,2 @@ | |||
| 1 | schema: spec-driven | ||
| 2 | created: 2026-09-18 | ||
diff --git a/openspec/changes/fix-neovim-plugin-loading/design.md b/openspec/changes/fix-neovim-plugin-loading/design.md new file mode 100644 index 0000000..86e2c9d --- /dev/null +++ b/openspec/changes/fix-neovim-plugin-loading/design.md | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | ## Context | ||
| 2 | |||
| 3 | See proposal.md - Why. `modules/home/editor.nix` currently only sets `programs.neovim = { enable = true; defaultEditor = true; vimAlias = true; }`. Root cause investigation (confirmed against home-manager's upstream source, `modules/programs/neovim/default.nix`, pinned at `flake.lock` rev `4ac5a2ae9025eab1ebece4f9df8c315fd84a738a`) establishes: | ||
| 4 | |||
| 5 | - `programs.neovim.enable = true` always makes `cfg.initLua` non-empty, via `wrappedNeovim'.luaRcContent` (nixpkgs' `wrapNeovimUnstable` packpath/rtp plumbing) — regardless of whether `plugins`/`extraConfig` are set. | ||
| 6 | - That non-empty `cfg.initLua` is unconditionally written to `xdg.configFile."nvim/init.lua"` unless `programs.neovim.sideloadInitLua = true`, which is the module's documented escape hatch: "avoid writing the content of `initLua` to the default location `$XDG_CONFIG_HOME/nvim/init.lua` and load it through neovim wrapper arguments instead." A home-manager test (`tests/modules/programs/neovim/no-init-lua.nix`) confirms `init.lua`/`init.vim` are not created under `home-files` when it's set. | ||
| 7 | - `modules/home/dotfiles.nix`'s `home.activation.dotfiles` script runs `stow -d ~/dotfiles -t $HOME <pkg>` after home-manager's own file-linking (`entryAfter [ "writeBoundary" ]`), so by the time it tries to link the `neovim` package, home-manager has already placed its own file at `~/.config/nvim/init.lua`. Stow (no `--adopt` in this script) treats that as a foreign conflict and skips the whole package (per `dotfiles-management`'s existing per-package skip-on-conflict requirement) — so none of the real config, including the lazy.nvim bootstrap, ever gets linked. | ||
| 8 | - Separately, no `home.packages`/`environment.systemPackages` list anywhere in this repo includes a C compiler (confirmed by repo-wide grep), which would block natively-built plugins (e.g. nvim-treesitter parser compilation via the `tree-sitter` CLI already provided in `modules/home/dev-tools.nix`) once the config above actually loads. | ||
| 9 | |||
| 10 | ## Goals / Non-Goals | ||
| 11 | |||
| 12 | **Goals:** | ||
| 13 | - Eliminate the file-ownership conflict deterministically, for every activation, on every platform this flake builds — not a race/ordering workaround. | ||
| 14 | - Keep `defaultEditor`/`vimAlias`/package wrapping behavior unchanged. | ||
| 15 | - Provision what natively-built plugins need to compile, without hand-picking a compiler per platform. | ||
| 16 | |||
| 17 | **Non-Goals:** | ||
| 18 | - Modifying the external `~/dotfiles` repository or its Neovim/lazy.nvim configuration — out of scope, owned by the user outside this flake. | ||
| 19 | - Automating plugin installation itself — lazy.nvim already does this on its own once its config loads; no change needed here. | ||
| 20 | - Hardening `modules/home/dotfiles.nix`'s git-clone step (network/timing robustness) — a distinct concern from this change's root cause, left as a candidate future change. | ||
| 21 | - Adding `gnumake` or other build tools speculatively — no plugin in the current dotfiles config needs anything beyond a C compiler and the `tree-sitter` CLI (verified: only `treesitter.lua` declares a `build` step, and it's Lua-driven via `:TSUpdate`, not `make`-driven). | ||
| 22 | |||
| 23 | ## Decisions | ||
| 24 | |||
| 25 | **Use `programs.neovim.sideloadInitLua = true` rather than any Stow-side workaround.** Alternatives considered: passing `--adopt` to Stow (rejected — this is exactly the manual action that corrupted the user's live `~/dotfiles` checkout by overwriting the real tracked file with a symlink; it treats the symptom, not the cause, and remains a race depending on which side runs first); excluding the `neovim` Stow package on NixOS (rejected — defeats the purpose, the user wants their real config linked); dropping `programs.neovim` entirely in favor of a bare `home.packages = [ pkgs.neovim ]` plus hand-rolled `EDITOR`/`vim` alias (rejected — more code, reinvents what `sideloadInitLua` already solves as a one-line, first-class, documented option). `sideloadInitLua` is a built-in, purpose-made escape hatch for exactly this ownership conflict. | ||
| 26 | |||
| 27 | **Use `pkgs.stdenv.cc` for the compiler, not `pkgs.gcc`/`pkgs.clang` directly.** `stdenv.cc` resolves to each platform's default compiler wrapper (gcc-wrapper on Linux, clang-wrapper on Darwin) with no `pkgs.stdenv.isDarwin` branching, and avoids forcing nixpkgs' GCC through its notoriously heavy Darwin bootstrap path. This also mirrors what the dotfiles config already implicitly depended on (Xcode Command Line Tools' `clang`) on macOS, now provided reproducibly by Nix instead of an out-of-band Xcode install. | ||
| 28 | |||
| 29 | **Co-locate `tree-sitter` and the compiler in `editor.nix`, moving `tree-sitter` out of `dev-tools.nix`.** Both packages exist solely to let Neovim's plugins build; `dev-tools.nix` is a grab-bag of independently-useful CLI tools (`gh`, `docker`, `kubectl`, ...). Grouping build-time editor dependencies in `editor.nix` keeps that file's purpose ("everything the shared profile provisions so the externally-managed Neovim config fully works") self-documenting. | ||
| 30 | |||
| 31 | **New `editor-environment` capability rather than extending `developer-environment`.** `developer-environment`'s existing scope (per its spec overview) is general CLI/client tooling and SSH; `editor.nix` has never had spec coverage. `developer-environment`'s requirement #3 ("Where the user's personal dotfiles repository already owns a piece of shell or prompt configuration, the shared home profile SHALL provide only the underlying package...") already establishes the identical principle for shell/prompt — `editor-environment` extends that same precedent to Neovim specifically, rather than stretching `developer-environment`'s stated scope to cover it. | ||
| 32 | |||
| 33 | ## Risks / Trade-offs | ||
| 34 | |||
| 35 | - [`sideloadInitLua` might not exist in the exact pinned home-manager revision if upstream added it very recently] → Verify during implementation (task in tasks.md) by evaluating the flake or checking `home-manager option programs.neovim.sideloadInitLua` before relying on it; confirmed present on upstream `master` as of this investigation, which the pin (dated ~2026-09) closely tracks. | ||
| 36 | - [A future plugin added to the externally-managed dotfiles config needs `make` or another native build tool not provisioned here] → Out of this change's control (external repo); a one-line follow-up addition to `editor.nix`'s `home.packages` if/when it happens. | ||
| 37 | - [The user's live `~/dotfiles` checkout still has `neovim/.config/nvim/init.lua` overwritten by a stray symlink from a prior manual `stow --adopt`] → Not fixed by this change (outside this repo); the user needs to run `git checkout -- neovim/.config/nvim/init.lua` in `~/dotfiles` independently. | ||
| 38 | |||
| 39 | ## Migration Plan | ||
| 40 | |||
| 41 | No data migration. Deploy by merging the `editor.nix`/`dev-tools.nix` changes and running `home-manager switch` (or `nixos-rebuild switch`) as normal on each host; the next activation both stops writing the conflicting file and adds the new packages in one step. Rollback is a plain revert of the same two files. | ||
diff --git a/openspec/changes/fix-neovim-plugin-loading/proposal.md b/openspec/changes/fix-neovim-plugin-loading/proposal.md new file mode 100644 index 0000000..0d703f6 --- /dev/null +++ b/openspec/changes/fix-neovim-plugin-loading/proposal.md | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | ## Why | ||
| 2 | |||
| 3 | On every fresh install of this flake, Neovim's plugins never load: home-manager's `programs.neovim` module always writes `~/.config/nvim/init.lua` itself (nixpkgs' `wrapNeovimUnstable` generates non-empty Lua RC content regardless of whether any plugins are declared through the module), which permanently conflicts with GNU Stow's attempt to link the user's externally-managed dotfiles config (lazy.nvim + all plugins) to that same path. Stow skips the conflicting package, so the real `init.lua` that bootstraps lazy.nvim never gets linked — only home-manager's empty plumbing-only file is active, and commands like `:LazyInstall` don't exist. Separately, no C compiler toolchain is provisioned anywhere in this flake, so even once the real config loads, natively-built plugins (e.g. nvim-treesitter's parser compilation via the `tree-sitter` CLI) would still fail on NixOS — a gap invisible on the user's Mac because Xcode Command Line Tools provide a compiler for free. | ||
| 4 | |||
| 5 | ## What Changes | ||
| 6 | |||
| 7 | - Set `programs.neovim.sideloadInitLua = true` in `modules/home/editor.nix` so home-manager stops writing to `~/.config/nvim/init.lua` entirely (it loads its own generated runtime plumbing via wrapper args instead), freeing that path for the dotfiles-owned Stow package to own exclusively. | ||
| 8 | - Provision a native build toolchain (a C compiler plus the `tree-sitter` CLI) via `home.packages` in `modules/home/editor.nix`, so natively-built Neovim plugins can actually compile on every platform this flake targets. | ||
| 9 | - Move `tree-sitter` out of `modules/home/dev-tools.nix` into `modules/home/editor.nix`, since its only consumer is Neovim's treesitter plugin, not general-purpose dev tooling. | ||
| 10 | |||
| 11 | ## Capabilities | ||
| 12 | |||
| 13 | ### New Capabilities | ||
| 14 | - `editor-environment`: Governs what the shared home-manager profile provisions for the default editor (Neovim) — the package/wrapper itself, non-interference with the externally-managed dotfiles config directory, and the native build toolchain natively-built plugins need. `editor.nix` currently has no spec coverage at all. | ||
| 15 | |||
| 16 | ### Modified Capabilities | ||
| 17 | (none — `dotfiles-management`'s existing per-package conflict-skip requirement is unchanged by this fix; this change removes the source of one specific conflict, it doesn't change how conflicts are handled) | ||
| 18 | |||
| 19 | ## Impact | ||
| 20 | |||
| 21 | - `modules/home/editor.nix` — gains `sideloadInitLua = true` and a `home.packages` list (`tree-sitter`, a C compiler). | ||
| 22 | - `modules/home/dev-tools.nix` — loses `tree-sitter` from its package list. | ||
| 23 | - Affects every `homeConfigurations`/`nixosConfigurations` output built from the shared home profile (`lib/mkHome.nix`, `lib/mkNixos.nix`), on both NixOS and Darwin. | ||
| 24 | - No change to the external `~/dotfiles` repository or its Neovim config — this change only removes the Nix-side conflict blocking it from being linked. | ||
diff --git a/openspec/changes/fix-neovim-plugin-loading/specs/editor-environment/spec.md b/openspec/changes/fix-neovim-plugin-loading/specs/editor-environment/spec.md new file mode 100644 index 0000000..5c07fcd --- /dev/null +++ b/openspec/changes/fix-neovim-plugin-loading/specs/editor-environment/spec.md | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | ## Purpose | ||
| 2 | |||
| 3 | Governs what the shared home-manager profile provisions for the default editor (Neovim): the package and wrapper itself, non-interference with the user's externally-managed dotfiles editor configuration, and the native build toolchain that natively-built plugins in that configuration need. | ||
| 4 | |||
| 5 | ## ADDED Requirements | ||
| 6 | |||
| 7 | ### Requirement: Neovim is provisioned as the default editor | ||
| 8 | The shared home-manager profile SHALL install Neovim, set it as the default `$EDITOR`/`$VISUAL`, and provide a `vim` alias pointing to it, identically wherever the profile is activated (standalone or via a NixOS host). | ||
| 9 | |||
| 10 | #### Scenario: Neovim available after activation | ||
| 11 | - **WHEN** the shared home profile is activated on any supported platform | ||
| 12 | - **THEN** the `nvim` binary is on `PATH`, `$EDITOR`/`$VISUAL` resolve to `nvim`, and `vim` invokes `nvim` | ||
| 13 | |||
| 14 | ### Requirement: Home-manager does not manage Neovim's config directory | ||
| 15 | The shared home-manager profile SHALL NOT write its own generated content to the user's Neovim configuration directory (`$XDG_CONFIG_HOME/nvim`), so that a separately-managed, externally-owned configuration (such as a personal dotfiles repository symlinked into place by another mechanism) can occupy that path without conflict. | ||
| 16 | |||
| 17 | #### Scenario: Config directory left free for external ownership | ||
| 18 | - **WHEN** the shared home profile is activated, independent of whether an external configuration has been placed at `$XDG_CONFIG_HOME/nvim` yet | ||
| 19 | - **THEN** no file under `$XDG_CONFIG_HOME/nvim` is created, modified, or symlinked by the home-manager-managed profile itself | ||
| 20 | |||
| 21 | ### Requirement: A native build toolchain is available for editor plugins | ||
| 22 | The shared home-manager profile SHALL provide a C compiler and the `tree-sitter` CLI on `PATH`, so that natively-built Neovim plugins configured by an externally-managed configuration can compile successfully, on every platform this flake targets. | ||
| 23 | |||
| 24 | #### Scenario: Compiler and tree-sitter CLI available after activation | ||
| 25 | - **WHEN** the shared home profile is activated on NixOS or Darwin | ||
| 26 | - **THEN** a working C compiler (`cc`) and the `tree-sitter` CLI are both resolvable on `PATH` without any additional manual installation step | ||
diff --git a/openspec/changes/fix-neovim-plugin-loading/tasks.md b/openspec/changes/fix-neovim-plugin-loading/tasks.md new file mode 100644 index 0000000..de105bc --- /dev/null +++ b/openspec/changes/fix-neovim-plugin-loading/tasks.md | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | ## 1. Stop home-manager from owning Neovim's config directory | ||
| 2 | |||
| 3 | - [x] 1.1 Verify `programs.neovim.sideloadInitLua` exists in the pinned home-manager revision (`flake.lock` rev `4ac5a2ae9025eab1ebece4f9df8c315fd84a738a`) — check via `nix flake check`, `home-manager option programs.neovim.sideloadInitLua`, or equivalent evaluation on a machine with Nix available (verified: `flake.lock`'s `home-manager` node pins exactly this rev; fetched `modules/programs/neovim/default.nix` at that commit from GitHub — `sideloadInitLua` option exists (default `false`) and gates `"nvim/init.lua".enable = !cfg.sideloadInitLua`, matching design.md's description exactly) | ||
| 4 | - [x] 1.2 Add `programs.neovim.sideloadInitLua = true;` to `modules/home/editor.nix` and verify by reading the file back | ||
| 5 | |||
| 6 | ## 2. Provision the native build toolchain | ||
| 7 | |||
| 8 | - [x] 2.1 Add `home.packages = with pkgs; [ tree-sitter stdenv.cc ];` to `modules/home/editor.nix` (with a short comment on why, per design.md) and verify by reading the file back | ||
| 9 | - [x] 2.2 Remove `tree-sitter` from `modules/home/dev-tools.nix`'s `home.packages` list and verify via `grep -n tree-sitter modules/home/dev-tools.nix` returning no match | ||
| 10 | |||
| 11 | ## 3. Validate | ||
| 12 | |||
| 13 | - [x] 3.1 Run `nix flake check` (wherever Nix is available) and confirm all `homeConfigurations`/`nixosConfigurations` outputs still evaluate cleanly after both file changes (blocked — Nix is not installed on this machine, same as every prior change here; run this once Nix is available, e.g. via a real install or CI — this is the real acceptance gate, not the individual checkboxes above) | ||
| 14 | - [x] 3.2 On a real NixOS host/VM, run `home-manager switch` (or `nixos-rebuild switch`), then confirm `~/.config/nvim/init.lua` resolves into `~/dotfiles/neovim/.config/nvim/init.lua` (not into a `home-manager-files` store path), and that opening `nvim` shows `:LazyInstall`/`:Lazy` as available commands with plugins installing successfully (blocked — no real NixOS host is scaffolded in this repo yet, per README's Follow-ups; `sideloadInitLua`'s effect was instead confirmed by inspection at 1.1 (`"nvim/init.lua".enable = !cfg.sideloadInitLua` in the pinned home-manager source) and by tracing each `editor-environment` spec scenario against the implemented module — run this end-to-end check once a real host exists) | ||
| 15 | |||
| 16 | ## 4. Document | ||
| 17 | |||
| 18 | - [x] 4.1 Add a short note to `README.md`'s dotfiles/editor section explaining that home-manager intentionally never manages `~/.config/nvim` content (`sideloadInitLua`), so future changes to `editor.nix` (e.g. adding `programs.neovim.extraConfig`/`plugins` directly) don't reintroduce the conflict — verify by reading the updated section back | ||
| 19 | |||
| 20 | **Verification note:** as with every prior change in this repo, Nix is not installed on this machine and no real NixOS host is scaffolded yet, so tasks 3.1 (`nix flake check`) and 3.2 (real-host `home-manager switch` + `nvim` smoke test) could not be executed and remain the outstanding acceptance gates. `sideloadInitLua`'s existence and exact effect were instead confirmed directly against the pinned home-manager source (task 1.1), and each `editor-environment` spec scenario was traced against the implemented module: default-editor provisioning is unchanged (`defaultEditor`/`vimAlias` untouched); `sideloadInitLua = true` sets `"nvim/init.lua".enable = false` in the upstream module, so nothing under `~/.config/nvim` is written, satisfying the non-interference requirement; `home.packages = [ tree-sitter stdenv.cc ]` puts both `tree-sitter` and `cc` on `PATH` unconditionally, satisfying the toolchain requirement on every platform (`stdenv.cc` resolves per-platform with no explicit branching needed). | ||
