Aerc 0.22 discovers its notmuch database automatically and deprecates
path-bearing sources and maildir-store. Preserve those settings for
packages older than 0.22 while using the bare source for newer packages
or package = null. Keep maildir-account-path for both versions and cover
the legacy and null-package paths with golden tests.
Replace the inline jq merge script with
`lib.hm.generators.mkImpureConfigMerger`. The merge still uses `+` to
match the previous shallow object merge.
Tighten the tests: the store regex stops at the first space so it no
longer captures trailing activation script text, and the basic
configuration test asserts the dry-run and verbose branches now emitted
by the shared helper.
Assisted-by: Goose + GLM 5.3 Flash
Replace the module-local `impureConfigMerger` with
`lib.hm.generators.mkImpureConfigMerger`, keeping the JSON5 reader for
settings that may contain comments.
Behavior is preserved but two rough edges are fixed along the way:
- A corrupted existing file now fails activation loudly instead of
silently replacing the user's settings with the generated defaults.
- An existing file keeps its permissions and symlink target instead of
being replaced with a fresh mode-644 file.
Add a test that runs the generated activation snippet with `$DRY_RUN` and
`$VERBOSE` set, covering a dry-run that leaves existing settings
untouched, a live merge on top of preexisting settings, verbose logging,
silent quiet mode, permission preservation, and loud failure on a
corrupted file.
Assisted-by: Goose + GLM 5.3 Flash
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>
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.
Forward converted values to the complete settings path so the standard
changed-option warning identifies the destination key. Preserve legacy
reads, priorities, defaults, and shadowed conversions.
Point mpdris2 at Library.music_dir directly and cover nested paths,
literal dotted keys, and the affected callers in warning tests. The
contributor guidelines now describe `to` as the settings path that
contains `key` instead of the settings root.
Allow native POP3 retrievers without an IMAP mailbox list. Preserve
explicit mailbox defaults and cover the omitted setting in the account
configuration test.
Expose native filter, retriever, and destination configuration while
retaining account defaults and legacy boolean aliases. Preserve tuple
rendering and allow complete native retriever configuration without an
IMAP account block.
Generate managed JSON from canonical settings while preserving legacy editor and sync conversions. Use the shared overlay helper for extraConfig priorities and effective-key detection.
Keep activation-time merging into the writable application file, including unmanaged settings and historical null and empty-string filtering.
Adds programs.yopass for managing the yopass CLI configuration file
(~/.config/yopass/defaults.yml), with an NMT test verifying the
generated settings.
Assisted-by: Claude Fable 5
Leave native defaults to Rofi instead of injecting location and offset
values. Preserve explicit legacy settings and theme selection, and omit
configuration files when no effective settings or theme are supplied.
Generate the Rasi configuration block from merged native settings. Preserve legacy option conversions, overlay precedence, numeric defaults, and theme ordering.
Use the shared settings overlay helper for extraConfig forwarding and key detection. Keep package integration and the existing serializer unchanged.
The old cloud-only mappings cannot express root-level cache and client
settings. Expose complete YAML documents while preserving existing
configurations through standard rename aliases.
Build on the existing programs.worktrunk module:
- add bash/zsh/fish/nushell shell integrations, enabled by default via
the corresponding home.shell.enable<SHELL>Integration options,
- add an opt-in programs.worktrunk.claudeCodeIntegration, which wires
worktrunk into programs.claude-code: a statusLine, WorktreeCreate/
WorktreeRemove hooks (so agent isolation routes through wt), activity
state-marker hooks (🤖/💬 in wt list), and skills. Of the skills,
/wt-switch-create is on by default while /worktrunk is off by default,
since settings already manages the config it would help edit.
Both integrations need the wt binary, so they are inert when package is
set to null.
Follow-up to #9226, recreating the integration part of #9788.
Assisted-by: Claude-Code:GLM-5.3
b4 (https://b4.docs.kernel.org) is a tool for kernel-style patch and
email review workflows on lore.kernel.org. The module installs b4 and
writes its configuration to git-config's [b4] section -- b4 has no
config file of its own -- defaulting to a recommended Claude Code
review-agent wiring.
The review-editor highlighting and agent-reviewer prompt b4 ships under
misc/ are missing from its PyPI sdist; the module pulls them from the
nixpkgs packages added in NixOS/nixpkgs#543347 rather than fetching the
b4 repository itself.
Assisted-By: Claude Opus 4.8 (1M context)
Use the shared helper to preserve argument boundaries in ExecStart, including embedded newlines. Keep legacy strings and Darwin behavior unchanged, and cover the newline case in a Linux regression test.
Splitting the string on spaces broke arguments that legitimately contain
one, such as `--keep-since=1 day`. Accept a list of strings alongside the
string instead, each element being one argument, and restore the previous
behaviour for strings on both platforms: command line text that systemd
splits on Linux, a single argument on Darwin.
Darwin users passing several flags in one string have to switch to a list
to work around the launchd quoting.
On Linux the arguments are only appended when non-empty, which drops a
trailing space from ExecStart.
On darwin, clean.extraArgs was appended to ProgramArguments as a single
list element, so the launchd module rendered it as one shell-quoted word
and nh received every flag as a single argument:
nh clean user '--keep 5 --keep-since 3d'
error: unexpected argument '--keep 5 --keep-since 3d' found
Linux is unaffected: there extraArgs is interpolated into ExecStart as
text, and systemd splits that into arguments itself. Split on spaces so
both platforms treat the option the same way, dropping empty fields so
that an unset or space-padded value contributes no arguments.
The existing darwin test never set extraArgs, which is why this went
unnoticed. Add a case covering the option's own documented example.
The Nixpkgs wrapper now applies appDataDir, so a custom configPath
changes the Firefox and Floorp derivations. Test package identity with
each browser default and leave custom paths to the config-path tests.
On macOS 27+, wrapped package will have no Mozilla signature and will
fail to access the default datadir. Move users with recent stateVersion
to a non-default datadir recommended by:
https://github.com/NixOS/nixpkgs/pull/556611
Users with existing profiles under default datadir will have to migrate
them to a different location on macOS 27 upgrade. Migrating existing
directory is out of scope for Home Manager.
This is a counterpart for: https://github.com/NixOS/nixpkgs/pull/556611
When configPath is overridden, if wrapper supports the new appDataDir
argument, we pass configPath's absolute form to tell the app to look for
its datadir in the correct directory.
This will become necessary on macOS 27+ where Firefox that is not signed
by Mozilla has no access to its default datadir.
Expose qcal's JSON configuration through programs.qcal.settings and
per-calendar entries through accounts.calendar.accounts.<name>.qcal.settings.
Generated Calendars entries and the account remote projections use
mkDefault so users can override or extend them. timezone and
defaultNumDays become renamed aliases of the settings keys.
Custom packages can expose overrideAttrs without running patch hooks.
Provide mpv and vlc through runtime wrappers instead, covering both
upstream entry points and custom executable names. Test player lookup,
PATH precedence, and inherited helpers with executable fixtures.
Use the configured package for installation and player-specific patching, while preserving configuration generation when package is null. Generate any declared INI section and correct the settings example to match the nested section type.
Set PATH=${config.home.profileDirectory}/bin in the opencode-web
systemd service and launchd agent environment. This gives the service
access to packages installed via Home Manager.