AI agent skills¶
Skills are markdown files (SKILL.md) that live under each AI coding agent's config directory and tell the agent how to handle specific tasks. jarvy skills lets a team publish skills at an HTTPS URL and have every developer's machine install them automatically during jarvy setup.
This is PRD-049 riding on the library registry (PRD-054).
Quick start¶
Publisher¶
Add a skill item to your library manifest (see library registry for the full schema):
{
"kind": "skill",
"name": "myorg-code-review",
"version": "2.1.0",
"description": "MyOrg-specific code review checklist",
"skill_md_url": "https://cdn.myorg.com/jarvy/skills/code-review-2.1.0/SKILL.md",
"skill_md_sha256": "abc123...",
"supported_agents": ["claude-code", "cursor", "codex"]
}
Consumer (jarvy.toml)¶
[skills]
# auto-detect every AI agent installed on disk
# (or set agents = ["claude-code", "cursor"] to narrow)
# Option A — manifest URL (PRD-054):
[[skills.library_sources]]
url = "https://cdn.myorg.com/jarvy/manifest.json"
# Option B — Git repo with SKILL.md files (PRD-055):
[[skills.library_sources]]
url = "github:anthropics/[email protected]"
# Or fully qualified:
# url = "git+https://github.com/myorg/[email protected]#skills/"
[skills.install]
myorg-code-review = "2.1.0"
myorg-debug-checklist = { version = "1.0.0", agents = ["claude-code"] }
Both source types appear in the same library_sources array — Jarvy fetches each according to its URL scheme. See library registry for the full git-source surface (pin policy, SKILL.md frontmatter requirements, subpath safety).
Then:
jarvy skills install # install every configured skill
jarvy skills install <name> # one skill — ad-hoc from library_sources if not configured
jarvy skills update # re-fetch + reinstall skills whose version/sha changed
jarvy skills update <name> # update one skill
jarvy skills remove <name> # uninstall SKILL.md + sidecar from every agent
jarvy skills list # show what's configured + per-agent status
jarvy skills status # drift summary
jarvy skills agents # which AI agents jarvy detected
install, update, and remove accept --format json for scripting (PRD-051); exit codes are identical between human and JSON output.
jarvy setup also installs skills automatically (gated on [skills] auto_install = true, which is the default).
How install works¶
For each (skill_name, version) in [skills.install]:
- Resolve via
library_registry::resolve_skill(name)— looks up the matching item across every cachedlibrary_sourcesmanifest. - Refuse if the requested
versiondoesn't match the library item'sversion(no silent version drift). - Fetch
SKILL.mdover HTTPS (bounded read, 1 MiB cap). - sha256-verify the fetched body against the manifest's
skill_md_sha256. Mismatch is fatal — the file does not land on disk. - Write to every target agent's
~/.<agent>/skills/<skill-name>/SKILL.md. - Drop a
.jarvy-skill.jsonsidecar recording version + sha256 + install time, sojarvy skills statuscan detect drift.
Use "latest" instead of an explicit version to pull whatever the library currently advertises.
Ad-hoc install¶
jarvy skills install <name> with a name that is NOT in [skills.install] resolves the skill from your configured library_sources at latest and installs it without touching jarvy.toml. Useful for trying a skill before pinning it. Ad-hoc installs are invisible to jarvy skills list / status (those report configured entries only) — but jarvy skills update <name> and jarvy skills remove <name> still work on them.
Update¶
jarvy skills update # every [skills.install] entry
jarvy skills update <name> # one skill (configured or ad-hoc-installed)
For each skill, update re-syncs library_sources, compares the library's advertised version + skill_md_sha256 against the installed .jarvy-skill.json sidecar per agent, and:
- No-op when both match — nothing is fetched or written.
- Reinstalls (fetch → sha256-verify → write) when either changed. A skill missing on disk counts as changed, so
updatedoubles as repair. - Refuses when a pinned
[skills.install]version no longer matches what the library advertises (version mismatch) — bump the pin injarvy.tomlfirst. Entries pinned to"latest"follow the library forward automatically.
A named skill that isn't in [skills.install] is treated as "latest" (pairs with ad-hoc install).
Remove¶
Deletes SKILL.md + the .jarvy-skill.json sidecar from every targeted agent, then prunes the skill directory if it's empty. Files you added yourself next to SKILL.md are left alone. Idempotent: removing a skill that isn't installed is a clean no-op (reported per agent as "absent"), not an error.
Note remove does not edit jarvy.toml — a skill still listed in [skills.install] will come back on the next jarvy setup / jarvy skills install.
Agent paths¶
| Agent | Path |
|---|---|
| Claude Code | ~/.claude/skills/<name>/SKILL.md |
| Cursor | ~/.cursor/skills/<name>/SKILL.md |
| Codex | ~/.codex/skills/<name>/SKILL.md |
| Windsurf | ~/.windsurf/skills/<name>/SKILL.md |
| Cline | ~/.cline/skills/<name>/SKILL.md |
| Continue | ~/.continue/skills/<name>/SKILL.md |
Jarvy treats ~/.{agent}/ existence as proof the agent is installed. jarvy skills agents shows what it detected.
Project-scope skills (./.{agent}/skills/) are NOT supported in v1 — only user-scope. PRD-049 follow-up.
Per-skill agent narrowing¶
The bare-string form installs to every detected agent:
The detailed form narrows to a subset:
There are two layers of narrowing that both apply:
- Consumer narrowing —
agents = [...]on the entry (thisjarvy.toml) - Publisher constraint —
supported_agents = [...]on the library item
A skill installs to an agent only when it passes both. Skipped agents are reported per skill in jarvy skills install output, with a reason.
Status + drift¶
$ jarvy skills status
Skills Status
=============
Installed: 4
Missing: 1
Drift: 0
Run `jarvy skills install` to install missing skills.
jarvy skills list gives the per-skill, per-agent breakdown:
Configured skills (2):
myorg-code-review = 2.1.0
claude-code → installed (2.1.0)
cursor → installed (2.1.0)
myorg-debug-checklist = 1.0.0
claude-code → missing
Drift is detected via the .jarvy-skill.json sidecar — when a user manually edits SKILL.md and the recorded sha256 no longer matches, the sidecar still records the installed version but the next install will overwrite (after re-verifying the fetched body's sha).
Trust + safety¶
Skills fetched via library_sources carry the same trust model as every other library item — see library registry trust model.
The short version:
- Remote
jarvy.tomlfiles (jarvy setup --from <url>) CANNOT declare[[skills.library_sources]]. Refused withlibrary.remote_refusedevent. - Every
SKILL.mdbody is sha256-verified against the manifest. Mismatch refuses install. - HTTPS-only.
- Cosign signature verification: scaffolded but not enforced in v1. Assume a publisher can ship arbitrary
SKILL.mdcontent until cosign enforcement lands.
What's still open¶
jarvy skills update, jarvy skills remove, and ad-hoc jarvy skills install <name> shipped in PRD-049 phase 2. Still tracked under PRD-049 follow-up:
jarvy skills search/infosubcommands- skills.sh API integration (search, popular, info)
- Companion file fetching (today only
SKILL.mdlands; templates / scripts skip) - Project-scope skills (
./.{agent}/skills/) - Version-range pinning (today only exact or
"latest")
Related¶
- Library registry — the underlying manifest + fetch + cache mechanism
- AI hooks — sibling consumer; same
library_sourcesshape - MCP registration — sibling consumer; same shape
- Configuration reference — full
[skills]schema