feat(toolkit): bundle the baseline interactive toolset (task 0001) #27

Merged
alexion merged 1 commits from task-0001-toolkit-bundle into main 2026-07-25 12:50:19 -04:00
Owner

Summary

Adds modules.toolkit, a deliberate bundle Module that turns on the baseline interactive environment — fish, tmux, nvim, git, and direnv — as one unit and makes fish the login shell, so any Host or Guest shell feels identical. It follows the sanctioned aggregator pattern of modules/desktop/desktop.nix: the enable sets each member's enable = lib.mkDefault true, so a Host can still override any single piece while the one flag brings up the bundle.

neogaia is converted as the demonstrating Host: its five individual modules.{fish,git,direnv,tmux,nvim}.enable lines and its explicit modules.fish.defaultShell = true collapse to a single modules.toolkit.enable = true, keeping the Host a flat checklist.

Verified: nix flake check builds checks.x86_64-linux.neogaia; nix eval of each of the five members' enable returns true; fish.defaultShell is true and the login shell resolves to fish.

Review

Risk

Overall: Low

  • Blast radius: Low — new opt-in module plus one host swapping explicit enables for the bundle; no other hosts or callers touched.
  • Reversibility: Low — pure config addition, trivially revertible; mkDefault preserves per-host override, no migrations or deletions.
  • Test coverage: Low — no unit tests, but Nix module evaluation is checked by nix flake check building the host toplevel; config is declarative and self-validating.
  • Sensitive domain: Low — interactive shell tooling only; no auth, permissions, or data paths.
  • Size & complexity: Low — ~20-line module, one host edit; flat control flow, single mkIf.
  • Runtime criticality: Low — dev-workstation ergonomics bundle, not a production/hot path.

Standards — unaddressed

  • Duplicated Code vs modules/desktop/desktop.nix (judgement call): the new module is a near-verbatim structural clone of the desktop aggregator. Kept — this is the intended, ADR-0004-sanctioned aggregator pattern; a third aggregator would be the point to extract a shared helper.

Spec — unaddressed

  • mkDefault true over plain true for the members: kept deliberately — letting a Host override a single member is the intended flexibility and matches the existing desktop aggregator.
  • git is enabled via the bundle rather than an explicit per-host line: kept deliberately — collapsing the members into one line is the intended flat-checklist outcome; the git identity Module is still enabled on the Host.

— Claude

## Summary Adds `modules.toolkit`, a deliberate bundle Module that turns on the baseline interactive environment — fish, tmux, nvim, git, and direnv — as one unit and makes fish the login shell, so any Host or Guest shell feels identical. It follows the sanctioned aggregator pattern of `modules/desktop/desktop.nix`: the `enable` sets each member's `enable = lib.mkDefault true`, so a Host can still override any single piece while the one flag brings up the bundle. `neogaia` is converted as the demonstrating Host: its five individual `modules.{fish,git,direnv,tmux,nvim}.enable` lines and its explicit `modules.fish.defaultShell = true` collapse to a single `modules.toolkit.enable = true`, keeping the Host a flat checklist. Verified: `nix flake check` builds `checks.x86_64-linux.neogaia`; `nix eval` of each of the five members' `enable` returns `true`; `fish.defaultShell` is `true` and the login shell resolves to fish. ## Review ### Risk **Overall: Low** - Blast radius: Low — new opt-in module plus one host swapping explicit enables for the bundle; no other hosts or callers touched. - Reversibility: Low — pure config addition, trivially revertible; `mkDefault` preserves per-host override, no migrations or deletions. - Test coverage: Low — no unit tests, but Nix module evaluation is checked by `nix flake check` building the host toplevel; config is declarative and self-validating. - Sensitive domain: Low — interactive shell tooling only; no auth, permissions, or data paths. - Size & complexity: Low — ~20-line module, one host edit; flat control flow, single `mkIf`. - Runtime criticality: Low — dev-workstation ergonomics bundle, not a production/hot path. ### Standards — unaddressed - Duplicated Code vs `modules/desktop/desktop.nix` (judgement call): the new module is a near-verbatim structural clone of the desktop aggregator. Kept — this is the intended, ADR-0004-sanctioned aggregator pattern; a third aggregator would be the point to extract a shared helper. ### Spec — unaddressed - `mkDefault true` over plain `true` for the members: kept deliberately — letting a Host override a single member is the intended flexibility and matches the existing `desktop` aggregator. - `git` is enabled via the bundle rather than an explicit per-host line: kept deliberately — collapsing the members into one line is the intended flat-checklist outcome; the git identity Module is still enabled on the Host. — Claude
alexion added 1 commit 2026-07-25 12:48:39 -04:00
Add modules.toolkit, an aggregator that enables fish, tmux, nvim, git,
and direnv as one unit, and makes fish the login shell, so any Host or
Guest shell feels identical. Each member is set via mkDefault, so a Host
can still override any single piece while the one flag brings up the
whole bundle.

neogaia now enables the bundle as a single line in place of its five
individual enables and its explicit default-shell line, keeping the Host
a flat checklist.

Also lands the domain model, ADR 0006, and the guests spec: the toolkit
is the first piece of the wider guests work, and the guest-base will
auto-enable this bundle.
alexion force-pushed task-0001-toolkit-bundle from 66379c6b02 to 8cd59cb292 2026-07-25 12:48:39 -04:00 Compare
alexion merged commit 8cd59cb292 into main 2026-07-25 12:50:19 -04:00
alexion deleted branch task-0001-toolkit-bundle 2026-07-25 12:50:19 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: alexion/dotfiles#27