shelf Docs
On this page

Default targets

shelf writes borrowed skills to two directories in each project:

TargetRead by
.agents/skillsThe cross-harness convention: Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode, Amp, Goose, Cline, Roo Code, Factory Droid, Windsurf / Devin
.claude/skillsClaude Code (and Cursor, Copilot, OpenCode, Amp, Goose and Cline also read it)

These two cover every harness below except Kiro and a few that document neither directory. Change the default for all your projects with targets in the config; change it for one project with shelf targets.

Where each harness looks

As of October 2026:

HarnessProject dirsReads .agents/skillsReads .claude/skills
Claude Code.claude/skillsNoYes
Codex CLI.agents/skills (each folder from the working dir up to the repo root)YesNo
Cursor.agents/skills, .cursor/skillsYesYes
Gemini CLI.gemini/skills, .agents/skills (trusted workspaces only)YesNo
GitHub Copilot.github/skills, .claude/skills, .agents/skillsYesYes
OpenCode.opencode/skills, .claude/skills, .agents/skillsYesYes
Amp.agents/skills, .claude/skillsYesYes
Windsurf / Devin.devin/skills, .windsurf/skillsYesWhen Claude config is enabled
Goose.agents/skills, .goose/skills, .claude/skillsYesYes
Cline.clinerules/skills, .cline/skills, .claude/skills, .agents/skillsYesYes
Roo Code.roo/skills, .agents/skillsYesUndocumented
Factory Droid.factory/skills, .agents/skillsYesUndocumented
Kiro.kiro/skillsUndocumentedUndocumented

Harness ids

shelf targets knows these harnesses. Use the id (or the directory) with --add and --remove.

IdHarnessProject directoryUser directoryReads .agents/skills
agentsAgent Skills convention.agents/skills~/.agents/skillsyes (default target)
claudeClaude Code.claude/skills~/.claude/skillsno (default target)
kiroKiro.kiro/skills~/.kiro/skillsno
githubGitHub Copilot.github/skills~/.copilot/skillsyes
cursorCursor.cursor/skills~/.cursor/skillsyes
geminiGemini CLI.gemini/skills~/.gemini/skillsyes
opencodeOpenCode.opencode/skills~/.config/opencode/skillsyes
devinWindsurf / Devin.devin/skills~/.config/devin/skillsyes
windsurfWindsurf (legacy).windsurf/skills~/.codeium/windsurf/skillsyes
rooRoo Code.roo/skills~/.roo/skillsyes
clineCline.cline/skills~/.cline/skillsyes
factoryFactory Droid.factory/skills~/.factory/skillsyes
gooseGoose.goose/skills~/.config/goose/skillsyes
junieJunie.junie/skills~/.junie/skillsno
qwenQwen Code.qwen/skills~/.qwen/skillsno
traeTrae.trae/skills~/.trae/skillsno
openhandsOpenHands.openhands/skills~/.openhands/skillsno

The user directories matter in two places: shelf setup installs the bundled shelf skill in ~/.agents/skills and ~/.claude/skills, plus the user directory of any installed harness that doesn't read .agents/skills (for example ~/.kiro/skills when ~/.kiro exists). And shelf insights counts the skills in all of them as "loaded everywhere".

Only Claude Code and Codex get hooks.

Project targets

terminal
shelf targets
Skills are written to: .agents/skills, .claude/skills (your default)

HARNESS    DIRECTORY              NOTE
agents     .agents/skills     on  detected
claude     .claude/skills     on  detected
kiro       .kiro/skills           detected
github     .github/skills         reads .agents/skills
cursor     .cursor/skills         reads .agents/skills
…
openhands  .openhands/skills      

Kiro is used here but does not read .agents/skills: shelf targets --add kiro

detected means the harness's config directory (such as .kiro/) exists in the project. shelf suggests adding a detected harness that doesn't read .agents/skills and isn't already covered.

terminal
shelf targets --add kiro
Skills are written to: .agents/skills, .claude/skills, .kiro/skills
…

Changing targets moves every loan in the project: copies appear in added directories and are removed from removed ones. The project's targets are written to its lockfile ("targets": [...]), so every clone uses them.

OptionEffect
--add idsAdd harness ids or project-relative directories (comma-separated).
--remove idsRemove them. Copies with local edits are refused unless --force.
--resetGo back to your default targets from the config, and drop the lockfile's targets.
--forceRemove copies even if they have local edits.

A directory that isn't a known harness works too, as long as it is inside the project: shelf targets --add tools/agent-skills. A project needs at least one target.

Symlinked harness directories

Some projects symlink one harness directory to another, such as .claude/skills → .agents/skills. shelf compares targets by their real path: aliases are written once, never turned into a link to themselves, and removing one name never deletes the copy behind the other. shelf targets notes such a harness as same directory as … (symlink).

By default every target holds its own copy. In link mode, the first target holds the only real copy and the others are relative symlinks to it (junctions on Windows):

terminal
shelf borrow pdf-tools --link
Borrowed pdf-tools (due 2026-11-06) → .agents/skills, .claude/skills

ls -l .claude/skills
lrwxrwxrwx 1 me me 30 Oct  7 13:35 pdf-tools -> ../../.agents/skills/pdf-tools

Use --link per loan, or "mode": "link" in the config for every new loan. The lockfile records "mode": "link" for such loans. Hashing follows symlinks, so content states work the same in both modes.

Symlinked skills have open or recent bugs in Cursor, Claude Code and Codex, mostly on Windows, and Windows-native apps can't follow Linux symlinks inside WSL. Copies work everywhere, and shelf tracks them by hash, so they can't drift unnoticed. Use link mode in projects where you know symlinks work.

Frontmatter

The Agent Skills spec requires name (1 to 64 characters of [a-z0-9-], matching the directory) and description (at most 1024 characters). The reference validator rejects unknown top-level keys, and some harnesses silently skip skills that fail validation. shelf therefore never writes its own fields into SKILL.md; all tracking data lives in the lockfile and the database.

Adding a harness to shelf

Harnesses are one entry each in packages/core/src/projection/harnesses.ts. Add the entry and a row to the tables on this page. See Architecture.

Sources