Warn when session-variable definitions may change if applied more than
once. Apply the check to home and Zsh session variables without changing
their generated output.
Detect direct references after caller-specific rendering while excluding
stable whole-value expansions. Attribute each warning to the surviving
per-attribute definitions, including their module priorities and wrappers.
This gives users advance notice before later work allows the session
configuration to be applied in new shells. Recommend search-variable
options for path-like values and complete assignments for other values.
Tests cover detector boundaries, Zsh escaping, source attribution, and
both module call sites.
Build TERMINFO_DIRS from home.sessionSearchVariables and
home.sessionSearchVariablesAppend instead of a self-referential
home.sessionVariables value.
On the first merge, place Home Manager's directory first and the
system fallback last. Later merges preserve configured entries already
present in TERMINFO_DIRS. Do not add duplicate configured entries.
Add targets.darwin.terminfo.enable as the explicit opt-out. The prior
home.sessionVariables.TERMINFO_DIRS override now composes with the
module's paths instead of disabling them, so document the new opt-out in
news.
Run zsh test commands with -f because zsh reads .zshenv for -c commands.
This prevents host session markers from bypassing test merges.
Add entries after a PATH-like variable's runtime-inherited value.
`home.sessionSearchVariables` still places entries before that value.
`lib.mkAfter` cannot express this. It orders configured entries relative
to each other, but cannot place an entry after a value inherited at
runtime.
On the first merge in a process tree, configured entries are repositioned
according to prepend or append mode. Later merges preserve existing
positions so intervening environment changes are not reordered. An entry
listed in both options therefore takes append position on the first merge
and retains its inherited position later.
Neither option has an `environment.d` counterpart, so neither reaches
systemd user services. Modules that need that set
`systemd.user.sessionVariables` separately.
Switches `home.sessionPath` and `home.sessionSearchVariables` from
concatenation to the merge helper added in the previous commit. The
first merge preserves configured-first search order while removing
duplicate entries. Later merge blocks preserve inherited positions.
Entries that expand to an empty string are ignored. Statically empty
entries also produce an evaluation warning so an accidental
current-directory entry does not disappear silently.
Fish gets a native merge helper because babelfish rejects the POSIX
helper's quoted pattern removal, and Fish stores names ending in PATH as
lists. Candidate assignments and merge calls are translated together so
references to earlier search variables observe the same values as the
POSIX file. The native helper also preserves newline-bearing values
through Fish command substitutions.
A shared behavioral fixture sources both generated files for first and
later merges. It covers expansion and escaping, cross-variable
references, unset and empty values, duplicates, separator-bearing
entries, empty fields, Fish list shape, helper cleanup, and leading,
embedded, and trailing newlines.
Removes `prependToVar`, which has no consumers left and produced the
self-referential form this replaces. It was public through
`lib.hm.shell`, so the release notes include migration guidance.
Adds a POSIX `__hm_merge` helper and one `mergeSearchVariables`
generator. The generator owns helper setup, prepend and append calls,
marker export, and cleanup so callers cannot misorder those stages.
Nothing consumes it yet; `prependToVar` is untouched.
Adding an entry that is already present never duplicates it. Whether an
already-present entry may be moved depends on where the merge runs:
- First merge in a process tree, detected by
`__HM_SESS_VARS_MERGED` being unset: configured entries take their
configured precedence and existing occurrences are repositioned.
- Any later merge: existing entries keep their position, so re-sourcing
cannot reorder a path a development shell, direnv, or a wrapper put in
front.
The complete generator exports the marker after the last merge, then
removes its helper and scratch variables. The marker is deliberately
separate from `__HM_SESS_VARS_SOURCED`, whose position relative to the
merges is not fixed.
Entries expand in a double-quoted shell context. Raw double quotes
remain shell syntax so quoted command substitutions keep working; `\"`
produces a literal quote.
The helper lives in `session-search-merge.sh` rather than a Nix string.
It contains no interpolation, so keeping it as shell source avoids three
layers of escaping and lets shellcheck read it.
Removal is join-based rather than token-splitting. Splitting on the
separator is not idempotent for entries that contain the separator:
merging `a:b` into `x:a:b:y` would grow on every source.
Verified in bash, dash, and zsh across substring entries and globs.
Coverage also includes separator-bearing values, marker transitions,
prepend and append ordering, cleanup, and repeated sourcing.
`XDG_CONFIG_DIRS` and `XDG_DATA_DIRS` were self-referential
`home.sessionVariables` values. Declare the shell side through
`home.sessionSearchVariables`, which expands to the same search path.
Order the module entries after existing plain search-variable
contributions. This preserves the previous user, module, then inherited
lookup order. `systemd.user.sessionVariables` is unchanged, so the
`environment.d` output is byte-identical.
Add a news entry covering these two names and `NIX_PATH`. A user value
set through `home.sessionVariables` now becomes the trailing value
instead of colliding with the module definition. The entry also
documents list merging, `lib.mkForce`, and the separate `environment.d`
behavior.
`nix.nixPath` with `keepOldNixPath` produced a self-referential
`home.sessionVariables.NIX_PATH`. Declare it through
`home.sessionSearchVariables` instead. The generated value keeps the
same search path without depending on the variable it defines.
Order the module entries with `lib.mkAfter` so existing plain
`home.sessionSearchVariables.NIX_PATH` entries retain their precedence.
Read inherited search-variable values through `${VAR-}` so generated
files remain safe when sourced under `set -u`.
Preserve ordinary unset, empty, and inherited values. Add runtime
coverage and update the affected search-variable expectations.
With backupFileExtension and overwriteBackup set, an existing backup is
removed with a plain rm before the colliding file is moved over it.
Backups are often read-only: a file an application wrote over a
Home Manager link usually keeps the link target's mode, 0444 for a store
path. rm asks before removing a write-protected file when its input is
a terminal, so an interactive switch stops at
rm: remove write-protected regular file '...'?
The backup is being replaced on purpose, so remove it with rm -f.
nixpkgs#558216 switched the worktrunk package to the installAgentSkills
hook, moving the bundled skills from $out/skills/ to
$out/share/skills/worktrunk/.
Assisted-by: Claude-Code:GLM-5.3
Co-authored-by: Austin Horstman <khaneliman12@gmail.com>
Automated update of the master maintainers list combining:
- Home Manager specific maintainers from modules/lib/maintainers.nix
- Nixpkgs maintainers referenced in Home Manager modules
**Added:** 1 maintainers
**Removed:** 0 maintainers
**Total:** 319 → 320 maintainers
**✅ Added:** o-az
Generated by: lib/python/generate-all-maintainers.py
Add programs.astroid.settings for native JSON configuration and
generate the configuration file from it.
The extraConfig and externalEditor options become deprecated aliases
into settings. Home Manager no longer writes its bundled template;
Astroid's built-in defaults match it except editor.markdown_processor.
Astroid accounts still supply account settings, the notmuch path, and
the GPG path as per-key defaults. Empty settings write no file.
externalEditor now merges at ordinary priority instead of replacing
the editor keys, and priorities on extraConfig sections apply to the
section as a unit. The release notes describe both changes.
Add programs.notmuch.settings for native INI configuration with list
values, and generate the configuration file from it.
The new.ignore, new.tags, maildir.synchronizeFlags, search.excludeTags,
and extraConfig options become deprecated aliases into settings.
Settings carry no static defaults: new.tags, new.ignore, and
maildir.synchronize_flags fall back to notmuch's identical defaults.
State versions before 26.11 keep search.exclude_tags = deleted;spam and
write database.path even without email accounts. Enabled email
accounts supply database.path, and notmuch-enabled accounts the user
identity. Null values and empty sections are omitted so a derived
value can be removed.
extraConfig no longer overwrites modeled values unconditionally: forced
definitions win and ordinary collisions fail. The release notes
describe the migration.
Mbsync, lieer, and mujmap now write settings.new.ignore directly, so
they do not trigger deprecation warnings.
Add programs.borgmatic.backups.<name>.settings for native borgmatic
YAML and generate each backup file from it.
The location, storage, retention, and consistency options and the
section extraConfig options become deprecated aliases into settings.
Warnings name the affected backup. Legacy configurations without
overlapping keys produce the same YAML, and Home Manager symlink
exclusions still append to exclude_from.
Drop the assertions that rejected backups setting both or neither of
sourceDirectories and patterns, so native source patterns and
database-only backups work.
Consistency checks without a frequency were written as
`frequency: null`, which borgmatic rejects during configuration
validation. Omit null check fields so borgmatic applies its own
default.
The user-service drop-in invoked activate without a driver version, so
the script defaulted to driver 0 and always managed the per-user
home-manager profile, ignoring enableLegacyProfileManagement. Use the
same version as the system service and assert both generated
user-service commands.
Automated update of the master maintainers list combining:
- Home Manager specific maintainers from modules/lib/maintainers.nix
- Nixpkgs maintainers referenced in Home Manager modules
**Added:** 1 maintainers
**Removed:** 0 maintainers
**Total:** 318 → 319 maintainers
**✅ Added:** nyxar77
Generated by: lib/python/generate-all-maintainers.py
python3Packages.requests_oauthlib was removed and python3Packages.gpgme
is an alias; the packages are requests-oauthlib and gpg. The example
also extended old.propagatedBuildInputs, which the package does not
set because it lists its Python dependencies in dependencies, so it
failed to evaluate. Extend old.dependencies instead.
The example took typescript-language-server and typescript from
pkgs.nodePackages, which nixpkgs removed, and passed --tsserver-path,
which typescript-language-server 5.3.0 rejects as an unknown option,
so the server exited at startup. Run the top-level
typescript-language-server with --stdio only; the nixpkgs package
already falls back to the tsserver from typescript_5.
pkgs.haskell.packages.ghc784 no longer exists. Show ghc912: the option
is for building xmonad with a different GHC, and the default package
set already uses GHC 9.10.
The pinentry description told users to add pkgs.gcr to
services.dbus.packages, but nixpkgs removed it. Suggest pkgs.gcr_3,
which NixOS uses for pinentry-gnome3.
pwd-file was typed as a path, but ExecStart renders settings through
lib.cli.toCommandLine, whose default value formatter has no case for
paths, so a path literal such as ./mpd-password aborted evaluation with
"generators.mkValueStringDefault: this value is not supported".
Accept a string or a path, and render path-like values with toString,
which gives a path literal's location without copying the file into the
Nix store. Strings and derivations render as before. Add a test for a
path literal.
The network, host, and port migrations from services.mpd-mpris.mpd to
services.mpd-mpris.settings share the same prefixes and option names,
so lib.hm.deprecations.mkSettingsRenamedOptionModules expresses them
without repeating each option path. It expands to the same
mkRenamedOptionModule calls.
Add a test that sets the old options and checks the rename warnings and
the generated unit, which no existing test covered.