Where installed skills come from
Agent skills are installed by home-manager under ~/.claude/skills/, ~/.agents/skills/, and ~/.codex/skills/. These managed paths link to the source skill directory. Edit the owning repository rather than an installed link.
Shared skill sources and resources live in the workspace's agent-skills/skills/<name>/ directory. The Nix catalog at agent-skills/catalog.nix selects shared skills for consumers. Downstream overlays may add local skill paths through their own machines.claude.skills and machines.codex.skills configuration; keep those files in the downstream repository.
Edit a shared skill
- Edit its directory in the workspace
agent-skillscheckout. - If the change also updates a consumer, use the same feature branch in both repositories. Add
agent-skillsto the workspace withaddsrc agent-skills [email protected]:goromal/agent-skills.gitif it is not present. - Test anixpkgs integration using a temporary local flake input if needed. Before pushing, restore the remote feature-branch URL and lock it with
nix flake update agent-skills. - Open the
agent-skillsPR and link it from the consumer PR. Merge the skill source PR first, then repin consumers to the mergedmainrevision.
Create a shared skill
- Add
skills/<skill-name>/SKILL.mdinagent-skills; keep references, examples, scripts and assets alongside it. - Add
{ name = "<skill-name>"; file = ./skills/<skill-name>/SKILL.md; }tocatalog.nix. Entries apply to Claude and Codex by default; setframeworkswhen needed. - Link supporting resources relative to the skill folder and update downstream locks.
Edit a downstream-local skill
Change it in the repository that owns the overlay or module contributing the skill path. Keep the directory self-contained, including references. Its configuration can add a { name, file } entry to the framework's skills option.
Delete or replace a shared skill
Remove its entry from catalog.nix and delete its source folder, then update downstream locks. To replace a shared skill on one machine, list its name in machines.agents.excludedSkills and add the local skill path with that name in the downstream module.