Skip to main content

Enter the dev shell

The repo ships a devenv.nix that pins Node, npins, jq/yq, ripgrep, shellcheck, and the markdown linter. With direnv configured, the shell is automatic:
direnv allow
Without direnv:
devenv shell

Available scripts

Inside the dev shell, the following scripts are exposed:
CommandWhat it does
installAlias for bash scripts/install.bash
lintRun markdownlint-cli2 over skills/**/SKILL.md, agents/*.md, commands/*.md, then jq empty settings.json
evalRun the full promptfoo suite via bash scripts/eval.bash
eval-fastRun only the routing tests via bash scripts/eval.bash --fast

Lint

lint
Catches:
  • Malformed Markdown in personal skills, agents, and commands
  • Invalid JSON in settings.json
The plugin bundles under plugins/ are intentionally excluded from lint’s globs because they carry upstream-authored content and should not be reformatted casually.

Eval

eval        # full suite
eval-fast   # routing only
The eval harness lives under evals/ and uses promptfoo (installed via npm in the dev shell). eval-fast skips end-to-end tests and is the right loop for working on skill descriptions and routing triggers.

Editing skills

1

Edit the SKILL.md

Personal skills live under skills/<skill-name>/SKILL.md. Plugin skills live under plugins/<plugin>/skills/<skill-name>/SKILL.md.
2

Lint

Run lint to catch formatting errors before committing.
3

Re-run install

Run install (idempotent). New skills become visible to ~/.claude on the next session.
4

Verify routing

Run eval-fast to check that triggering still does what you expect.

Adding a plugin

Drop a new directory under plugins/<name>/ with at minimum:
plugins/<name>/
├── .claude-plugin/plugin.json
├── README.md
└── skills/
    └── <skill-name>/SKILL.md
install.bash symlinks plugins/ wholesale into ~/.claude/plugins, so no further wiring is needed once the directory exists.
Last modified on April 8, 2026