Skip to content

Skills, plugins, hooks, references

A skill is a markdown procedure the agent can invoke: “how to run tests here,” “how to deploy staging.” It lives in skills/<id>/SKILL.md and is registered in skills/skills.json.

At prepare time AIR copies it into .claude/skills/<id>/ in the clone, along with any references it declares.

The five that ship, all default_in_roots: ["zimmer"]:

SkillWhat it does
sync-docsPre-PR step: update docs that the branch diff made stale. Always-on by convention.
zimmer-run-testsRun the test suite the way this repo expects.
zimmer-start-dev-serverBring up a local instance for e2e verification.
zimmer-deploy-stagingDrive the staging deploy workflow.
zimmer-change-ai-artifactThe guide to changing the catalog itself.

A markdown document that many skills can share. Broken out from skills deliberately — one reference (your git workflow, your engineering conventions) shouldn’t be copy-pasted into every skill that needs it.

Zimmer’s catalog ships exactly one: engineering-practicesreferences/ENGINEERING_PRACTICES.md.

At prepare time, each skill’s declared references are bundled into .claude/skills/<skill-id>/references/.

A named bundle that composes existing skills, MCP servers, and hooks. The index entry points at a directory; the directory holds .plugin/plugin.json.

plugins/ci-workflow/.plugin/plugin.json
{
"name": "ci-workflow",
"title": "CI Workflow",
"version": "1.0.0",
"skills": ["zimmer-run-tests"],
"mcp_servers": [],
"hooks": ["git-push-ci-reminder"]
}

The four that ship:

PluginDefault inBundles
ci-workflowagent-orchestratorzimmer-run-tests + git-push-ci-reminder
screenshots-videosagent-orchestratorscreenshot/video capture tooling
figma-design-workflowFigma design tooling
meeting-wranglingmeeting tooling

A plugin is a macro: at prepare time AIR unions its constituents into the activated set, and they materialize through the same code path as directly-selected artifacts. Select both a plugin and a skill it bundles, and you get one copy.

A lifecycle script registered into the agent’s own settings — .claude/settings.json, tagged with _airHookId so AIR knows which entries it owns. Fired on agent events (a tool call, a git push).

Zimmer’s catalog declares exactly one: git-push-ci-reminder.

Don’t confuse these with transcript hooks, which are a Ruby-side plugin system that runs inside Zimmer when transcript messages arrive. Different thing, same word.

The full procedure lives in skills/zimmer-change-ai-artifact/SKILL.md. The short version:

  1. Add the body (skills/<id>/SKILL.md, hooks/<id>/HOOK.json, references/<file>.md).
  2. Register it in the index (skills/skills.json, etc.).
  3. Add default_in_roots: ["<root>"] to make it default-on for that root.
  4. Verify with air resolve before pushing. A dangling reference will not fail the resolve — it will exit 0, drop your artifact’s reference, and then break the test suite.
Terminal window
# From the repo root
AIR_CONFIG=$PWD/air.json npx @pulsemcp/[email protected] resolve --json --no-scope

Watch stderr, not the exit code. Lines containing references unknown and Dropping the reference are what Zimmer treats as a hard failure.