Harnesses & adapters¶
A harness is a target AI coding agent. Each one loads skills from its own path with its own
schema. adept sync renders every canonical skill into every enabled harness, and
adept sync-from adopts harness-side edits back into canonical.
Enable and inspect harnesses:
adept harness add claude-code # enable a harness
adept harness remove cursor # disable a harness
adept harness list # registered harnesses + enabled state
Enabled harness ids are recorded in .adeptability/config.json under harnesses[].
Specialized renderers¶
Five harnesses ship dedicated renderers that get the details right — correct frontmatter, activation translation, sidecar handling, and size budgets:
| Harness | id | Output |
|---|---|---|
| Claude Code | claude-code |
.claude/skills/<id>/SKILL.md (full sidecars, allowed-tools) |
| Cursor | cursor |
.cursor/rules/<id>.mdc (activation → alwaysApply/globs/description) |
| OpenCode | opencode |
.opencode/skill/<id>/SKILL.md (full sidecars) |
| Codex | codex |
AGENTS.md (aggregated, 32 KiB cap, lowest-priority dropped first) |
| GitHub Copilot | copilot |
.github/instructions/<bucket>.instructions.md (aggregated per-glob) |
See the Harness Comparison for exactly what each renderer emits and why it differs.
Generic per-skill adapters¶
Beyond the five specialized renderers, adept ships built-in generic per-skill adapters
for 50+ more agents — each writing SKILL.md into that agent's convention. A sample:
amp, cline, continue, gemini-cli, github-copilot (agent-skills mode), goose,
junie, kilo, openhands, qwen-code, roo, warp, windsurf, zencoder, and many
more that write into a shared .agents/skills/<id>/SKILL.md.
Run adept harness list for the authoritative, live registry — it always reflects the version
you have installed.
Config-driven adapters (no recompile)¶
You can teach adept about a new harness by dropping a YAML adapter file into
$ADEPT_LIBRARY/adapters/ (or a library's adapters/ dir). It's loaded at startup. Example:
id: jetbrains-junie
name: JetBrains Junie
kind: per-skill
output: ".junie/guidelines/{id}.md"
needs-directory: false
size-budget-bytes: 0
frontmatter:
include:
- description
- tags
rename:
description: summary
body:
prefix: |
> Auto-generated by adeptability. Do not edit by hand.
detect:
- ".junie/"
- ".junie/guidelines/"
Adapter files are validated against an embedded schema on load. Key fields:
kind—per-skill(one file per skill),aggregator-single, oraggregator-per-glob.output— the on-disk path template;{id}expands to the skill id.frontmatter.include/frontmatter.rename— which canonical fields to emit, and any key renames.body.prefix/body.suffix/body.replace— body transforms (with{{.Project.Name}}templating).detect— path globs used to auto-adopt existing files onadept init.import.rename— optional reverse-render hints; the defaultsync-fromflow auto-derives the inverse offrontmatter.rename, so this is only needed for non-bijective renames.
See examples/adapters/jetbrains-junie.yaml in the repo for the fully annotated version.