# Claude Code integration

terum-skills adds eight skills that drive the CLI, two optional hooks and a per-machine switch to your Claude Code setup. Evals run on your Claude Code, and usage reads its transcripts.

## Four integrations

| Integration | Where it lives | What it does |
| --- | --- | --- |
| The eight skills | `~/.claude/skills/<name>/` | Run terum-skills for you and show the result as a board. |
| The session-start hook | `~/.claude/settings.json` | Fetches your team clones when a session starts, at most once an hour. |
| The edit hook | A script under `~/.terum/skills/hooks/`, plus `~/.claude/settings.json` | Reminds Claude to publish a skill after it edits one. |
| The per-machine switch | `skillOverrides` in Claude Code's settings | Turns a skill off on this machine without moving it. |

Setup places the eight skills without asking. Each hook is a separate question during setup and defaults to No, so neither is on your machine unless you said yes. The switch is a verb you run.

## The eight skills

With these installed, asking Claude to "list my team's skills" or "evaluate this skill" gets a correct invocation instead of a guess, and the answer comes back as a Markdown board. Seven are narrow; `terum-skills` is the manual for everything else.

| Skill | Runs |
| --- | --- |
| `list-skills` | `ls --local` and `ls`: your Library and the Marketplace |
| `skill-info` | `ls skill <name>`, then `eval-report` for a team skill |
| `search-skills` | `search <term>` |
| `eval` | `eval <skill>`, after confirming the cost with you |
| `eval-report` | `eval-report <skill>` |
| `skill-status` | `status`, then `update` |
| `sync-skills` | `sync` |
| `terum-skills` | Any verb; the ones that ask a question are handed to your terminal |

When `~/.codex` exists, setup places the same eight for Codex under `~/.codex/skills/`. Only these eight go to Codex; team skills you install are placed in Claude Code's folders.

Each placed copy calls the CLI you installed, not whatever the registry published since. Terum's copies are marked with `metadata.managed-by: terum-skills` in their frontmatter. Setup and `sync --hook` rewrite an outdated marked copy in place without asking; the hook also adds missing ones, but only where Terum's copies already live. Anything else at those paths is never touched. `uninstall` removes them. You can also delete the folders yourself; setup places them again next time.

### What the agent runs, and what it hands you

Claude Code's Bash tool has no terminal, so a verb that needs an answer fails there, and the manual splits the CLI on that line. The agent runs verbs that never ask, or ask only sometimes, such as `ls`, `status`, `sync`, `validate`, `install`, `publish` and `eval`. It prepares and hands to your terminal the ones that need an answer or can write before asking, such as `unpublish`, `reconcile`, `uninstall-skill`, `skill move`, `skill disable`, the `team` administration verbs and `setup`.

The manual forbids piping `y` into a prompt or inventing flags, and it tells the agent to confirm with you before anything that spends money (every `eval`) or changes the team (`install`, `publish`, `invite`, `profile`).

## The session-start hook

If you say yes during setup, one entry is added to `hooks.SessionStart` in `~/.claude/settings.json`. It runs `sync --hook` through the copy of the CLI that installed it, pinned to that version and never `@latest`, so nothing fetches a newer CLI at session start. A new release reaches the entry when you update and run `setup` again. The entry is `async` with a 60-second timeout, so the fetch runs beside your session. Before its first edit, setup backs up your settings file once to `~/.terum/skills/backups/`.

`sync --hook` fetches each team clone and resets it to `origin/main`, with a 20-second deadline and no credential dialog, and leaves alone a clone fetched within the last hour. It places nothing, uploads nothing and edits none of your skill folders. It only corrects Terum's own files: its hook entry, the eight skills and the edit-hook script. Its standard output is one line, the directive that tells Claude Code to reload skills; everything else goes to stderr.

The hook goes when your last team goes: `team leave` on the last team and `uninstall` both remove it. You can also delete the entry from `~/.claude/settings.json` by hand.

## The edit hook

A skill edited in a session exists only on your machine until someone publishes it, and this hook speaks at that moment. A yes during setup writes `~/.terum/skills/hooks/terum-skills-edit.mjs` and a `Write|Edit` entry under `hooks.PostToolUse`, run through `node`.

The script reads no network and does nothing unless the edited path is inside a `.claude/skills/<skill>/` folder and a team is configured. Then it adds a note for Claude's next turn saying which skill was edited, whether it is an installed copy of a team version, that the edit stays local until published, and the `publish` and `eval` commands to run. The note appears once per skill per session. Any failure is silent, because a reminder is never worth interrupting an edit.

`uninstall` removes the entry and the script, or you can delete both by hand.

## The per-machine switch

```sh
npx -y terum-skills@latest skill disable ~/.claude/skills/deploy-check
npx -y terum-skills@latest skill enable ~/.claude/skills/deploy-check
```

Claude Code's own `skillOverrides` setting can mark a skill `off`, which hides it from the model and the `/` menu. These verbs write that key, the same one the `/skills` menu writes, and nothing moves on disk. A Global skill's entry goes in `~/.claude/settings.json`; a project skill's goes in that checkout's `.claude/settings.local.json`, which is added to `.git/info/exclude` when the CLI creates it.

Only `off` belongs to terum-skills. `name-only` and `user-invocable-only` read as enabled, and `enable` leaves them alone. The app's Library switch calls the same verb, so it and Claude's menu never disagree.

## Evals, usage and misses

**Evals use your own Claude Code login.** There is no Terum account and no API key. The eval engine spawns the `claude` binary on your `PATH`, one headless session per arm, with `--setting-sources project` so your user-level settings and hooks stay out of the sandbox. See [Running evals](https://www.terum.ai/docs/running-evals).

**`usage` reads your transcripts.** It counts each placed skill's firings in Claude Code's transcripts under `~/.claude/projects`, with no model call, and archives what it scanned so the count outlives Claude Code's roughly 30-day retention.

**`misses` spends sessions.** It reads the same transcripts for prompts a placed skill should have been chosen for and was not, at one `claude -p` call per ten prompts, and writes nothing. See [Usage](https://www.terum.ai/docs/usage).
