This commit introduces a new option for the Opencode web service to
allow configuring an environment file so that we can safely specify an
`OPENCODE_SERVER_PASSWORD` environment variable to secure access to the
service without exposing the secret to the Nix store.
Extract tmuxinator from tmux.nix into its own programs/tmuxinator.nix
module. The new module adds:
- programs.tmux.tmuxinator.package for customising the tmuxinator package
- programs.tmux.tmuxinator.projects for declaring projects declaratively;
each project is written to $HOME/.config/tmuxinator/<name>.yaml
Co-authored-by: Austin Horstman <khaneliman12@gmail.com>
Currently enabling aerc in accounts.email.accounts.<account> doesn't handle existing configs where accounts.email.accounts.<account>.notmuch.enable is set to true. This pr proposes to automatically set notmuch as backend for aerc if this is the case, see rjarry/aerc@master/doc/aerc-notmuch.5.scd.
For set-ups where accounts.email.notmuch.enable has been enabled this was previously ignored, so this is probably a breaking change for these configs, but from running this set up during the last weeks I would consider the upside of better search and filtering performance as significantly larger than the minor changes in query handling as noted here rjarry/aerc@master/doc/aerc-notmuch.5.scd#usage.
Atuin 18.13.0 deprecated `atuin daemon` in favour of `atuin daemon start`
and prints a warning on every daemon startup. Keep the old invocation for
older versions so NixOS stable (currently shipping 18.10.0) keeps working.
Also drop the 18.2.0 minimum version assertion since all supported
nixpkgs branches ship newer versions.
Support extensions without fetchgit, useful when providing the sources
from a flake input or derivation for all extensions.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
Allow for configuring marketplaces or individual plugins.
Both are provided as a list of either paths or packages.
The lone plugins are enabled by adding a --plugin-dir argument to the wrapper script.
Marketplaces are saved to the nix store and enabled by adding to the claude settings and known_marketplaces files.
With the marketplace "installed", the plugin can just be enabled via the enabledPlugins setting.
atool is a commandline archive manager that uses packages like gnutar,
p7zip, unrar, and zip as backends for viewing, creating, and extracting
their corresponding archive formats.
Use the deferred state-version helper mode for programs.password-store.settings
so explicit empty and explicit legacy values silence the warning correctly,
while partial legacy-era settings still inherit PASSWORD_STORE_DIR until the
user resolves the migration.
Add integration coverage for password-store and pass-secret-service to verify
legacy, explicit empty, explicit legacy, and partial-settings behavior.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
Handle per-skill values that come through as store-path strings, such as fetcher outputs with subdirectories appended. This restores the previously working pattern for packaged skill directories and adds a regression test for both directory and file sources.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
The default value for programs.git.signing.format changed in 25.05
from an implicit "openpgp" to null. Keep the existing gated
mkOptionDefault behavior so the signing block only materializes when
other signing settings are in use, but route the versioned value and
static docs text through the shared state-version helper.
Add a focused current-state-version test that covers a non-empty
signing configuration with no explicit format, alongside the existing
legacy implicit-openpgp and explicit-format tests.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
Before 23.05, programs.swaylock.enable implicitly followed whether
programs.swaylock.settings was non-empty. That compatibility path was
still active for older state versions, but it emitted no warning.
Route the default through the shared state-version helper so legacy
users get the standard deprecation warning before the implicit enable
behavior is removed. Add a focused current-state-version test and keep
the existing legacy and explicit-enable coverage in place.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
Before 19.03, programs.beets.enable implicitly followed whether
programs.beets.settings was non-empty. That compatibility branch was
still active for older state versions, but it was silent.
Route the default through the shared state-version helper so legacy
users get a consistent deprecation warning before the implicit
enablement is cleaned up. Add focused tests for the legacy and current
default branches alongside the existing beets coverage.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
The default value of programs.password-store.settings changed in 25.11
when Home Manager stopped exporting PASSWORD_STORE_DIR implicitly.
Route the default through the shared state-version helper so users on
older state versions keep the compatibility behavior with a consistent
warning and a single place to remove later.
The existing password-store tests already cover the legacy default, the
current empty default, and explicit override behavior, so no new test
fixture is needed for this migration.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
Replace the inline shellWrapperName migration logic with the shared state-version default helper. This keeps the existing warning and version-dependent default, but moves the message and defaultText formatting into one reusable implementation.
Inline the helper directly at the option declaration so the module stays small while matching the new deprecation-default pattern for future adoptions.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
now that home-manager always generates an init.lua we can take the
wrapper output instead of reimplemnting stuff in HM (notwithstanding rtp
changes that are not needed in HM).
This is necessary to keep the provider configuration available after
this change https://github.com/NixOS/nixpkgs/pull/487390
Also updated test to reflect ruby disabling
The skills option was creating files under ~/.config/opencode/skill/
(singular) but OpenCode documentation only mentions
~/.config/opencode/skills/ (plural). Both work, but using an
undocumented directory can be confusing.
Fixes: https://github.com/nix-community/home-manager/issues/8907
Add an optional session setting so that session names can be different
than the smug project name. This also enables using template variables
when naming sessions.
Factor the repeated claude-code module patterns into a small set of local helpers instead of open-coding them over and over.
This keeps the behavior the same, but removes duplication in the inline-or-path option declarations, the inline-vs-directory assertions, and the repeated .claude file generation code. The claude-code NMT test slice still passes after the refactor.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
Claude Code rejects `--mcp-config` once the Home Manager wrapper injects
it around subcommands, which breaks commands like `claude mcp list`.
Claude Code 2.1.76 fixed `--plugin-dir` so it no longer consumes
following subcommands, so use that path for the generated MCP config
instead.
Generate a plugin directory with a manifest and `.mcp.json`, wrap
`claude` with `--plugin-dir` before user arguments, and snapshot that
wrapper directly in the tests. Keep the existing LSP support in the
generated plugin directory as well, and add coverage for the combined
MCP+LSP case plus the MCP integration merge path.
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
Needs to handle different lua versions better. Determine lua version for
which luaPackages set to reference
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>