2242 Commits
Author SHA1 Message Date
Austin Horstman 153bad8fb5 qt: stop rewriting platformTheme name gtk to gtk2
/ triage (push) Has been skipped
GitHub Pages / publish (ubuntu-latest) (push) Failing after 1m19s
Setting `qt.platformTheme.name = "gtk"` silently rewrote the
QT_QPA_PLATFORMTHEME session variable to `gtk2` and pulled in the
qtstyleplugins and qt6gtk2 packages, which is not what users asked for
and relies on unmaintained packages. There is no `gtk` Qt platform
theme, so `gtk` now maps to Qt's built-in `gtk3` platform-theme plugin
and installs no extra packages.

Users who want the previous behavior can set
`qt.platformTheme.name = "gtk2"` explicitly, which keeps
QT_QPA_PLATFORMTHEME=gtk2 and installs qtstyleplugins and qt6gtk2. The
`qt.useGtkTheme` -> `qt.platformTheme` migration now maps the legacy
option to `{ name = "gtk2"; }` so existing configs are unaffected.

Fixes #8663
2026-06-19 12:28:04 -05:00
Austin Horstman e061b00885 broot: fix nushell integration br command
broot 1.51 renamed the printed nushell entry point from `br` to `main`,
intended to be loaded with `use` where the command takes the module's
name. Home Manager sources the snippet with `source`, so it began
defining a global `main` instead of `br`, breaking the `br` command in
nushell.

Rewrite the definition line back to `br` for the nushell shell function
so `source` keeps exposing `br` globally. Other shells are unaffected.

Fixes #9392
2026-06-19 10:53:03 -05:00
Austin Horstman fea021792d treefmt: format Python with ruff
Add ruff to the tree formatter so Python sources are kept consistently
formatted by 'nix fmt' and the CI format check. Test fixtures under
tests/modules are excluded since some are intentionally invalid Python.
Reformats the existing lib/python and tests scripts accordingly.
2026-06-19 10:00:25 -05:00
mikaeladevandAustin Horstman 43f9f0abc6 misc: move modules spanning multiple files into subdirs
- modules/misc/qt.nix -> modules/misc/qt/default.nix
- modules/misc/gtk.nix -> modules/misc/gtk/default.nix
- modules/misc/news.nix -> modules/misc/news/default.nix
- modules/misc/xdg*.nix -> modules/misc/xdg/...
- modules/misc/nix*.nix -> modules/misc/nix/...
2026-06-19 08:59:16 -05:00
DrymarchonShaunandGitHub 266211649f hyprland: fix plugin loading when using lua
Move plugin loading to the top of the rendered ~/.config/hypr/hyprland.lua as plugins must be loaded before hl.config can be called with config keys added by the plugin, (binds using dispatchers added by plugins also fail if they are defined before the plugin is loaded)

This also switches over to using the (undocumented?) hl.plugin.load("/path/to/plugin.so") to load plugins, which has solved some strange race condition weirdness caused by using exec_cmd with hyprctl plugin load (I first tried moving renderStartHook to the top of the rendered config, but sometimes it seemed the hyprctl plugin load wouldn't finish loading the plugin before the rest of the config was loaded, causing the same errors about unknown config keys)
2026-06-18 22:39:21 -05:00
Benedikt RipsandAustin Horstman c8f0b8ed44 fontconfig: add RFC42-style config file settings 2026-06-18 14:16:03 -05:00
Benedikt RipsandAustin Horstman 4441446672 fontconfig: generate config with pkgs.formats.xml 2026-06-18 14:16:03 -05:00
Benedikt RipsandAustin Horstman 27a3154f42 fontconfig: disallow null as config file source
This brings `fonts.fontconfig.configFile.*.source` in line with
`home.file.*.source` and the like.
2026-06-18 14:16:03 -05:00
Benedikt RipsandAustin Horstman 4ce682641d fontconfig: add 'configFile.<name>.target' option
This brings `fonts.fontconfig.configFile` in line with `home.file` and
the like.
2026-06-18 14:16:03 -05:00
Benedikt RipsandAustin Horstman 82432731d3 fontconfig: check warning in legacy default test 2026-06-18 14:16:03 -05:00
Austin Horstman a786067676 mkFirefoxModule: assert managed package for global extensions
Reject globalExtensions when Home Manager has no browser-managed policy
carrier. This follows up the global extension policy work with a clear
failure mode, a regression test, and a news entry so affected users know
how to fix package = null setups.
2026-06-18 12:53:30 -05:00
9f9b23ae21 mkFirefox: add policy to accept added extensions
This commit adds extensions added via
profiles.<name>.globalExtensions to the policy.
In consequence the extensions are added without complaint and don't need
to be enabled manually.

Co-authored-by: khaneliman <khaneliman@users.noreply.github.com>
2026-06-18 12:38:01 -05:00
Austin Horstman d456f483f1 codex: add profile config support
Codex 0.134.0 stopped reading profile settings from [profiles.<name>] in config.toml and no longer supports the top-level profile selector.

Add a dedicated programs.codex.profiles option so Home Manager can write CODEX_HOME/<name>.config.toml files that match the current CLI --profile behavior. For Codex 0.134.0 and later, legacy programs.codex.settings.profiles entries are migrated into profile files with a warning, and removed legacy profile keys are omitted from config.toml so strict config loading keeps working. Older Codex versions keep the legacy config shape.
2026-06-18 08:19:47 -05:00
Austin Horstman b9a29e51c5 opencode: support ordered settings entries
Use the shared DAG-aware JSON generator for programs.opencode.settings so order-sensitive permission rules can be expressed with lib.hm.dag entries.

Add a focused NMT test for last-match-wins permission output and news for existing opencode users.
2026-06-18 07:59:18 -05:00
Austin Horstman 6716d811e5 lib: add DAG-aware format generators
Add reusable Home Manager generator helpers for rendering freeform attrsets that contain lib.hm.dag entries.

This keeps ordering support available to JSON and future generated formats without forcing each module to carry its own DAG sorting boilerplate.
2026-06-18 07:59:18 -05:00
Austin Horstman 652f754686 difftastic: support difftool-only git integration
Splitting git diff tools into the separate programs.difftastic module
made it impossible to register difftastic as a git difftool without also
forcing it as diff.external, since the boolean git.diffToolMode only
toggled between "external" and "external + difftool".

Replace git.diffToolMode with a git.mode enum ("external", "difftool",
"both") so difftastic can be wired as the difftool only, leaving
`git diff` untouched. The deprecated boolean is migrated automatically
via mkChangedOptionModule (true -> "both", false -> "external"),
preserving existing behavior.

Fixes #8592
2026-06-18 07:45:53 -05:00
Fida Waseque ChoudhuryandAustin Horstman 5bcff43156 antigravity-cli: fix mcp validation error for remote/local servers
Do not serialize null/empty fields (command, args, env) for remote servers.
Also fix 'isRemote' check to check for non-null url fields instead of
using the ? operator, which evaluates to true even if the key is null.
2026-06-17 21:59:28 -05:00
csanthiagoandAustin Horstman c187002980 television: add themes option
Add a `themes` option to the television module, allowing users to define
custom themes that are written to `$XDG_CONFIG_HOME/television/themes/`
as individual TOML files. This follows the same pattern used by the
halloy and helix modules.


💘 Generated with Crush

Assisted-by: Crush:glm-5.2
2026-06-17 19:16:21 -05:00
Peter BittnerandAustin Horstman c51ac59e59 uv: manage Python versions and tools
Add programs.uv.python.{versions,default,prune} and
programs.uv.tool.{packages,prune} to install uv-managed Python versions
and tools during activation.

Install requests are passed verbatim to uv. Unpinned entries track the
latest release on each activation while pinned ones stay put: Python
requests without a patch component are installed with `uv python install
--upgrade` (exact patches, which uv refuses to upgrade, get a plain
install), and tools are refreshed with `uv tool upgrade <packages>`
scoped to the configured list. Both upgrades are scoped to the managed
entries, so installs Home Manager does not own are left untouched. prune
makes a set declarative by running `uv ... uninstall --all` before
reinstalling the listed entries.

The activation blocks run after linkGeneration so uv sees the freshly
linked uv.toml, and a null programs.uv.package is rejected once the
module emits activation commands.
2026-06-17 15:47:24 -05:00
Austin Horstman 89fda2248e mise: add usage dependency for shell completions
The generated script calls the separate `usage` CLI at completion time,
so add `pkgs.usage` to `home.packages` whenever mise is installed.
Stub it on Darwin test runs via `tests/darwinScrublist.nix`.
2026-06-17 09:32:24 -05:00
Austin Horstman 524d73a903 mise: add bash completion to bash integration
The bash integration previously only ran `mise activate bash`, so tab
completion for `mise` was never set up. Source the generated completion
script via `mise completion bash --include-bash-completion-lib`; the
flag self-bundles the bash-completion helpers so it also works on
systems whose bash-completion predates `_comp_initialize`.

Fixes #8539
2026-06-17 09:32:24 -05:00
ErinaYipandAustin Horstman 2a7b54df12 prismlauncher: add themes option 2026-06-16 22:42:18 -05:00
Pat L.andGitHub df4e046571 codex: Add support for installing plugins and marketplaces
Install the referenced plugins into $CONFIG_DIR/plugins and add them to
the marketplace file in `~/.agents/plugins/marketplace.json`. The
plugins are then enabled in `$CONFIG_DIR/config.toml`.

Also add support for custom plugin marketplaces via the `marketplaces`
option. Each marketplace entry is a local directory (or fetched package)
that Codex can browse to discover additional plugins. Marketplaces are
registered in `$CONFIG_DIR/config.toml` under [marketplaces.<name>] with
`source_type = "local"` pointing at the provided path. Setting either
`plugins` or `marketplaces` automatically enables the `features.plugins`
flag in the generated config.

Warn that if a derivation is being used as the source of the plugin, the
name of the derivation needs to match the plugin name in the manifest.
2026-06-16 15:35:13 -05:00
Austin Horstman 34dd288e65 antigravity-cli: update skills deployment path
The skills folder deployment path has been updated to
'~/.gemini/antigravity-cli/skills/' to align with the application's
configuration path structure from docs. I think the other path is just a
weird compatibility shim that app supports. strace shows it will search
it, but it also checks the documented path.
2026-06-16 08:06:05 -05:00
Ihar HrachyshkaandAustin Horstman c03e475289 programs/thunderbird: stop writing directory prefs
Thunderbird prefers[1] directory-rel for account local paths and only
falls back to directory when the relative pref is absent. To add, the
generated directory values were home-relative paths while the app
expects absolute paths when reading the setting. Instead of fixing
these, just drop the redundant settings.

[1] https://searchfox.org/comm-central/source/mailnews/base/src/nsMsgIncomingServer.cpp#745
2026-06-15 16:01:52 -05:00
Fida Waseque ChoudhuryandAustin Horstman a813a04113 antigravity-cli: fix programs.mcp.servers integration for remote servers
Do not rename url to serverUrl in transformMcpServer's extraTransforms.
This caused the core library to incorrectly default the server type to stdio,
and subsequently erase the serverUrl attribute entirely during cleanup.

The renaming is already handled at the end by the transformMcpServers helper.
2026-06-15 09:25:46 -05:00
Changseo JangandAustin Horstman 1285cd3d68 keepassxc: Support macOS KeePassXC configuration
Refactor configuration for KeePassXC settings based on platform.
2026-06-14 23:23:24 -05:00
Cody ShearerandAustin Horstman ed8263e7d7 voxtype: fix output mode paste
Voxtype requires the command `cat` from
`coreutils` when using the output mode `paste`,
but fails with the current configuration because
it cannot find `cat`.

```
WARN paste (clipboard + keystroke) failed: Text
injection failed: wl-copy exited with error,
trying next
```

This commit adds `coreutils` to the runtime path
to resolve the path to `cat`.
2026-06-14 17:58:52 -05:00
EdontinandAustin Horstman 5b6f573372 zed-editor: fix programs.mcp.servers compatibility
Default args to an empty list on stdio servers as it's a Vec<String>,
and loading the configuration fails if it's missing. This cannot be done
in extraTransforms due to the final filterAttrs.

Remove addType call as ContextServerSettings doesn't use type to
differentiate server types.

Link: https://github.com/zed-industries/zed/blob/601ecb3ee5c16940191818ee7f244837abf6983c/crates/settings_content/src/project.rs#L484
Link: https://github.com/zed-industries/zed/blob/601ecb3ee5c16940191818ee7f244837abf6983c/crates/project/src/project_settings.rs#L182
2026-06-13 10:42:15 -05:00
blokykandAustin Horstman 19c41a5a6d zsh: escape siteFunction names 2026-06-11 09:45:14 -05:00
blokykandAustin Horstman d29e0ab7c2 zsh: correctly handle autoloading functions starting with '-' 2026-06-11 09:45:14 -05:00
toastalandRobert Helgesson 7dbd305f8b darcs: add defaults
This adds support for specifying default values for Darcs commands.
2026-06-11 00:13:36 +02:00
Austin Horstman f96f717a47 vscode: support path literals in userSettings
programs.vscode.profiles.<name>.userSettings accepts either JSON settings or a path to a settings.json file. The update-check defaults were merged into userSettings before deciding whether to generate JSON or link a source file, so path values failed when Nix tried to apply // to them.

Skip those merges for path-like values and use the shared isPathLike helper for VS Code's source-or-generated JSON options so Nix paths, store path strings, and derivation outputs are handled consistently.

Fixes #7726
2026-06-10 13:10:31 -05:00
superflash41andAustin Horstman 74887eaee2 kiro-cli: add module 2026-06-10 09:48:41 -05:00
Austin Horstman cadadbc6f4 claude-code: omit unsupported mcp enabled field 2026-06-10 08:38:54 -05:00
MalikandAustin Horstman ebc55fd103 claude-code, codex, antigravity-cli, github-copilot-cli, opencode, vscode, zed-editor: use mcp lib
- use lib.hm.mcp.transformMcpServer for MCP integration
- Update tests to reflect new merged server configuration
2026-06-09 23:03:52 -05:00
MalikandAustin Horstman 6a66db1360 mcp: extract helper functions into lib/mcp.nix
Extract MCP-related helper functions (renderEnv, mkEnvFilesWrapper,
wrapEnvFilesCommand, addType, transformMcpServer) into a new shared
library module at modules/lib/mcp.nix.
- Add lib.hm.mcp for sharing transformMcpServer logic across consumers
- Add enabled/disabled conflict detection assertion
- Add tests for new library functions
2026-06-09 23:03:52 -05:00
Austin Horstman bd4277722d tests: add nixpkgs-disabled warning/assertion coverage
Evaluate `nixpkgs-disabled.nix` standalone (the harness always loads the
real `nixpkgs.nix`) to verify the warning and assertion report the offending
`nixpkgs.config`/`nixpkgs.overlays` definition locations.
2026-06-09 17:15:30 -05:00
Austin Horstman c58ead12ef voxtype: assert full service file in test
Replace the piecemeal assertFileRegex checks with a single
assertFileContent against the normalized unit, so the test pins the
entire generated service file rather than a handful of lines.
2026-06-09 07:49:19 -05:00
Austin Horstman 449012836e voxtype: restart service when configuration changes
Add the rendered config path to X-Restart-Triggers so the service restarts
whenever the configuration changes.
2026-06-09 07:49:19 -05:00
Austin Horstman df39142474 nushell: remove redundant abbreviations option
Nushell abbreviations are regular config settings, so users can already express them through programs.nushell.settings.abbreviations. Keep test coverage on that native path instead of maintaining a second option.
2026-06-08 13:35:42 -05:00
Austin Horstman e9cbe69850 sshAuthSock: avoid cycles for socket providers
PR #9420 added set-SSH_AUTH_SOCK.service and ordered it before sshAuthSock.systemd.socketProviderUnit. When that provider is a socket unit, systemd default dependencies already order the socket before sockets.target while service defaults place set-SSH_AUTH_SOCK.service after basic.target. That creates a sockets.target -> basic.target -> set-SSH_AUTH_SOCK.service -> provider.socket -> sockets.target cycle.

For gpg-agent this makes systemd drop gpg-agent-ssh.socket, leaving SSH_AUTH_SOCK pointing at the expected S.gpg-agent.ssh path but with no socket listening there.

Only order and install the environment service against non-socket providers. Socket providers still get SSH_AUTH_SOCK imported through default.target.

Fixes #9432.
2026-06-08 12:04:33 -05:00
Perchun PakandAustin Horstman 301871cd96 zellij: add support for plugins 2026-06-08 11:16:17 -05:00
Austin Horstman 4fe95527cb pi-coding-agent: scrub package in Darwin tests 2026-06-07 21:22:10 -05:00
Austin Horstman 0c42c7a66f darkman: replace removed python2 in test 2026-06-07 21:22:10 -05:00
Austin Horstman aa14fc7b46 tests: update generated TOML expectations 2026-06-07 21:22:10 -05:00
Dzming LiandAustin Horstman d4d5d9bb4a nushell: add abbreviations option
Add `programs.nushell.abbreviations`, mirroring `shellAliases`, to
declaratively configure fish-style abbreviations (nushell 0.113.0+).
The set is emitted as `$env.config.abbreviations = { ... }` after the
aliases so it survives a wholesale `$env.config = { ... }` written in
`extraConfig`.

Unlike aliases, abbreviations expand inline in the line editor, so the
expanded command is what ends up in history.
2026-06-07 21:06:57 -05:00
Austin Horstman b2b7db486e antigravity-cli: robust rename support
Handle module system merge priority resolution issues with suboptions.
2026-06-05 12:15:34 -05:00
Austin Horstman ff77a72fe5 antigravity-cli: rename gemini-cli module 2026-06-05 11:39:28 -05:00
Nikhil SinghandAustin Horstman 37e8eef933 pi-coding-agent: add module 2026-06-05 11:13:52 -05:00