skills/claude-code-config/SKILL.md
Use this skill when helping manage Claude Code configuration, including settings, MCP servers, LSP servers, skills, hooks, permissions, plugins, or per-device overrides. Also use when the user asks about Claude Code features, marketplace skills, or wants to modify their setup.
npx skillsauth add cullenmcdermott/nix-config claude-code-configInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This system uses a declarative Nix home-manager module (programs.claude-code) to manage all Claude Code configuration. Files under ~/.claude/ are Nix-managed symlinks to the Nix store and must NOT be edited directly.
Two modules work together:
programs.claude-code (upstream home-manager) — settings, skills, agents, commands, hooks, mcpServers, memory (CLAUDE.md), rulesprograms.claude-code-nix (our custom module) — LSP servers with Nix store paths, statusline scripts, shell aliases, extra packagesflake.nix
└─ modules/home-manager/default.nix # Option VALUES for both modules
├─ programs.claude-code (upstream)
│ └─ Generates: ~/.claude/settings.json
│ ~/.claude/CLAUDE.md
│ ~/.claude/skills/*/
│ ~/.claude/agents/
│ ~/.claude/commands/
└─ programs.claude-code-nix (our module: claude-code.nix)
└─ Generates: ~/.claude/statusline-command.sh
~/.claude/custom-plugins/lsp-servers/.lsp.json
Shell aliases (claude, clod)
| File | Purpose |
|------|---------|
| modules/home-manager/claude-code.nix | Our Nix extensions module (LSP, statusline, aliases) |
| modules/home-manager/default.nix | Where ALL option values are set |
| modules/home-manager/packages/claude-code.nix | Claude Code binary package derivation |
| flake.nix | System composition — extraHomeManagerModules for per-device overrides |
| systems/work/claude-code.nix | Work laptop override template |
| skills/ | Custom skill sources (home-assistant, llm-orchestrator, claude-code-config) |
| agents/ | Sub-agent definitions for multi-model review |
| commands/ | Custom command definitions |
In modules/home-manager/default.nix, add to programs.claude-code.mcpServers:
programs.claude-code.mcpServers.my-server = {
command = "mcp-server-my-thing";
args = [ "--flag" "value" ];
env = { MY_VAR = "value"; };
};
Then rebuild: nixswitch
In modules/home-manager/default.nix, add to programs.claude-code-nix.lsp.servers:
programs.claude-code-nix.lsp.servers.rust = {
command = "${pkgs.rust-analyzer}/bin/rust-analyzer";
args = [ ];
extensionToLanguage = { ".rs" = "rust"; };
};
Always use absolute Nix store paths (${pkgs.foo}/bin/foo) for the command.
In modules/home-manager/default.nix, add to programs.claude-code.settings.permissions.allow:
programs.claude-code.settings.permissions.allow = [
# ... existing permissions ...
"Bash(my-new-command:*)"
];
skills/<skill-name>/SKILL.mdmodules/home-manager/default.nix, add to programs.claude-code.skills:programs.claude-code.skills.my-skill = ./../../skills/my-skill;
Skills can be directories (with SKILL.md inside) or inline strings.
In a per-device override module (e.g., systems/work/claude-code.nix):
programs.claude-code.skills.home-assistant = lib.mkForce "";
In modules/home-manager/default.nix:
programs.claude-code.settings.hooks = {
PreToolUse = [
{
type = "command";
command = "my-hook-script";
matcher = "Bash(rm *)";
}
];
};
systems/work/claude-code.nix with work-specific overridesflake.nix, add it to the work system's extraHomeManagerModules:darwinConfigurations."work-macbook" = mkDarwinConfig {
username = "cullen";
system = "aarch64-darwin";
hostname = "work-macbook";
extraHomeManagerModules = [ ./systems/work/claude-code.nix ];
};
The Nix module system merges lists (permissions), attrsets (MCP servers, LSP, skills), and strings (memory) automatically.
In modules/home-manager/packages/claude-code.nix, update the version and platformHashes. Or override via the module:
programs.claude-code.package = pkgs.callPackage ./packages/claude-code.nix {
version = "2.2.0";
platformHashes = { ... };
};
Use WebFetch to browse the Claude Code plugin marketplace:
https://api.anthropic.com/mcp-registry/docshttps://github.com/anthropics/skillsFetch these URLs for up-to-date documentation:
https://docs.anthropic.com/en/docs/claude-code/settingshttps://docs.anthropic.com/en/docs/claude-code/pluginshttps://docs.anthropic.com/en/docs/claude-code/hookshttps://docs.anthropic.com/en/docs/claude-code/skillshttps://docs.anthropic.com/en/docs/claude-code/mcp~/.claude/settings.json directly — it's a read-only Nix symlink. Use programs.claude-code.settings.* options instead.claude plugins install for LSP plugins — LSP is Nix-managed via programs.claude-code-nix.lsp.servers. Marketplace LSP plugins will conflict.~/.claude/ manually — use the module options. Manual files will be orphaned or overwritten by home-manager.${pkgs.foo}/bin/foo absolute paths to avoid PATH resolution issues.~/.claude/ — add them to the skills/, agents/, or commands/ directories in the repo and wire them through the module.programs.claude-code (upstream home-manager)| Option | Type | Description |
|--------|------|-------------|
| enable | bool | Enable Claude Code |
| package | package | The claude-code package |
| settings | JSON attrs | Flat JSON merged into settings.json |
| mcpServers | attrs | MCP server definitions (wrapped into binary) |
| memory.text | str | CLAUDE.md content |
| skills | attrs of (str or path) | Skills (dirs or inline SKILL.md content) |
| agents / agentsDir | attrs or path | Agent definitions |
| commands / commandsDir | attrs or path | Command definitions |
| hooks / hooksDir | attrs or path | Hook scripts |
| rules / rulesDir | attrs or path | Rule files |
| outputStyles | attrs | Output style files |
programs.claude-code-nix (our Nix extensions)| Option | Type | Description |
|--------|------|-------------|
| enable | bool | Enable Nix extensions |
| lsp.enable | bool | Enable LSP plugin |
| lsp.servers | attrs | LSP servers with absolute Nix store paths |
| statusLine.enable | bool | Enable custom statusline |
| statusLine.scriptText | null or str | Custom script (null = default 3-line) |
| extraPackages | list of package | Additional packages |
tools
Multi-LLM orchestration utilities for discovering available CLI tools, assessing change complexity, and building structured prompts. Used by reviewer sub-agents and multi-model commands.
tools
This skill should be used when helping with Home Assistant setup, including creating automations, modifying dashboards, checking entity states, debugging automations, and managing the smart home configuration. Use this for queries about HA entities, YAML automation/dashboard generation, or troubleshooting HA issues.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------