Project Skills: let a Paca project register Agent Skills (agentskills.io format) and distribute them to any compliant client
The idea
I run more than one coding agent against the same project — Claude Code,
and others that also speak the Agent Skills format (agentskills.io). Right
now each one keeps its own copy of the same skills, on whichever machine I
happened to write them on. There's no single place that owns "these are
this project's skills," so keeping them in sync across agents and machines
is manual and easy to forget.
Paca already sits at the center of the project (tasks, docs, and now — via
its MCP server and the ACP bridge — the agents themselves connect to it).
It's the natural place to also hold the project's skills as the one source
of truth, and let whichever agent is working on the project — regardless
of which one, mine or a teammate's — pull the same skills in its own
native format. That's the core of what's below.
Context
scripts/install-paca-skills.sh already does something valuable: skills
are stored once (SKILL.md — YAML frontmatter + markdown body), served from
a running Paca instance's API (GET /api/v1/skills for bundled skills, and
a plugin manifest's skills.baseUrl + skills.names[] for
plugin-contributed ones), and a single installer distributes that content
to Claude Code, Gemini CLI, Cursor, and any AGENTS.md-reading tool.
What the script actually installs today, though, is a re-shaped copy per
target — frontmatter stripped for Claude Code/Cursor, re-packed into TOML
for Gemini CLI, merged into an AGENTS.md section for the rest. That made
sense as SKILL.md's fields and progressive-disclosure conventions
(scripts/, references/, assets/) weren't yet something every target
could be assumed to understand.
That assumption is now out of date. SKILL.md is a formal open standard —
agentskills.io, originated by Anthropic, opened
as a public spec, with a directory shape (SKILL.md + optional
scripts//references//assets/), a defined frontmatter (name,
description, license, compatibility, metadata, allowed-tools),
and a validator (skills-ref validate). Both Gemini CLI and Cursor are
listed as spec-adopting clients today, alongside Claude Code, VS Code,
GitHub Copilot, ChatGPT/Codex, JetBrains Junie, Goose, and dozens more. For
any client that already speaks the spec, converting a skill into something
else and handing over a lossy copy is no longer necessary — and it's the
lossy part that actually matters: today's conversion drops scripts/,
references/, and assets/ entirely, since the current targets
(TOML prompt, flat .md, an AGENTS.md section) have no notion of a skill
directory. On a spec-compliant client, that content should never need to
be dropped.
Proposal
- Distribute skills as real spec-shaped directories to any client that
already reads them, instead of always re-shaping into a lossy
single-file copy. Concretely: for a target whose own convention is a
skills directory (e.g. Claude Code's ~/.claude/skills/<name>/, and
whatever discovery path Gemini CLI/Cursor use for spec-compliant
skills), copy the skill folder as-is — SKILL.md plus scripts/,
references/, assets/, intact. Keep today's flattening path only for
genuine single-file targets that have no directory-skill support at
all.
- Let a Paca project hold its own skills, not just Paca's bundled set
and admin-installed plugins. A project's skills are exactly
agentskills.io-shaped content — same frontmatter, same optional
subdirectories — associated with a project instead of the Paca instance
globally.
- Ship this as a plugin, using the extension point that already
exists for this exact purpose: a plugin manifest's skills.baseUrl +
skills.names[] is already fetched and installed by
install-paca-skills.sh today (<baseUrl>/<name>/SKILL.md). A "Project
Skills" plugin that serves each registered skill's full directory at
that path needs no core API or database change to be installable
right now — the existing plugin-skills pipeline already knows how to
consume it. Point 1 above (spec-shaped, non-lossy distribution) is the
one piece that benefits everyone regardless of where the skill comes
from, bundled or plugin, so it's worth doing independently of the
plugin.
Why this fits the existing design
Point 3 needs zero core changes — it's built entirely on the plugin
extension point your own CONTRIBUTING.md lists as an open discussion area.
Point 1 is a bug-fix-shaped change to code that already exists
(install_one_skill in install-paca-skills.sh), not a new mechanism.
Open questions
- What's the actual per-client discovery path for a spec-compliant
directory skill on Gemini CLI and Cursor today (as opposed to their
single-file command formats, which the script currently targets)? Worth
confirming against their docs before assuming a 1:1 swap.
- Should a plugin-provided/project skill be able to shadow a bundled skill
of the same name, or must names be globally unique?
- For a skill whose
scripts/ needs execution rather than just being
read — does that require anything beyond what already exists for
plugin-contributed skills?
Happy to open two separate, smaller PRs matching points 1 and 2/3 above
(keeping each focused on one concern, per the PR checklist) — wanted to
check the direction first, especially on the open questions, before
writing code.
Project Skills: let a Paca project register Agent Skills (agentskills.io format) and distribute them to any compliant client
The idea
I run more than one coding agent against the same project — Claude Code,
and others that also speak the Agent Skills format (agentskills.io). Right
now each one keeps its own copy of the same skills, on whichever machine I
happened to write them on. There's no single place that owns "these are
this project's skills," so keeping them in sync across agents and machines
is manual and easy to forget.
Paca already sits at the center of the project (tasks, docs, and now — via
its MCP server and the ACP bridge — the agents themselves connect to it).
It's the natural place to also hold the project's skills as the one source
of truth, and let whichever agent is working on the project — regardless
of which one, mine or a teammate's — pull the same skills in its own
native format. That's the core of what's below.
Context
scripts/install-paca-skills.shalready does something valuable: skillsare stored once (SKILL.md — YAML frontmatter + markdown body), served from
a running Paca instance's API (
GET /api/v1/skillsfor bundled skills, anda plugin manifest's
skills.baseUrl+skills.names[]forplugin-contributed ones), and a single installer distributes that content
to Claude Code, Gemini CLI, Cursor, and any AGENTS.md-reading tool.
What the script actually installs today, though, is a re-shaped copy per
target — frontmatter stripped for Claude Code/Cursor, re-packed into TOML
for Gemini CLI, merged into an AGENTS.md section for the rest. That made
sense as SKILL.md's fields and progressive-disclosure conventions
(
scripts/,references/,assets/) weren't yet something every targetcould be assumed to understand.
That assumption is now out of date. SKILL.md is a formal open standard —
agentskills.io, originated by Anthropic, opened
as a public spec, with a directory shape (
SKILL.md+ optionalscripts//references//assets/), a defined frontmatter (name,description,license,compatibility,metadata,allowed-tools),and a validator (
skills-ref validate). Both Gemini CLI and Cursor arelisted as spec-adopting clients today, alongside Claude Code, VS Code,
GitHub Copilot, ChatGPT/Codex, JetBrains Junie, Goose, and dozens more. For
any client that already speaks the spec, converting a skill into something
else and handing over a lossy copy is no longer necessary — and it's the
lossy part that actually matters: today's conversion drops
scripts/,references/, andassets/entirely, since the current targets(TOML prompt, flat
.md, an AGENTS.md section) have no notion of a skilldirectory. On a spec-compliant client, that content should never need to
be dropped.
Proposal
already reads them, instead of always re-shaping into a lossy
single-file copy. Concretely: for a target whose own convention is a
skills directory (e.g. Claude Code's
~/.claude/skills/<name>/, andwhatever discovery path Gemini CLI/Cursor use for spec-compliant
skills), copy the skill folder as-is —
SKILL.mdplusscripts/,references/,assets/, intact. Keep today's flattening path only forgenuine single-file targets that have no directory-skill support at
all.
and admin-installed plugins. A project's skills are exactly
agentskills.io-shaped content — same frontmatter, same optional
subdirectories — associated with a project instead of the Paca instance
globally.
exists for this exact purpose: a plugin manifest's
skills.baseUrl+skills.names[]is already fetched and installed byinstall-paca-skills.shtoday (<baseUrl>/<name>/SKILL.md). A "ProjectSkills" plugin that serves each registered skill's full directory at
that path needs no core API or database change to be installable
right now — the existing plugin-skills pipeline already knows how to
consume it. Point 1 above (spec-shaped, non-lossy distribution) is the
one piece that benefits everyone regardless of where the skill comes
from, bundled or plugin, so it's worth doing independently of the
plugin.
Why this fits the existing design
Point 3 needs zero core changes — it's built entirely on the plugin
extension point your own CONTRIBUTING.md lists as an open discussion area.
Point 1 is a bug-fix-shaped change to code that already exists
(
install_one_skillininstall-paca-skills.sh), not a new mechanism.Open questions
directory skill on Gemini CLI and Cursor today (as opposed to their
single-file command formats, which the script currently targets)? Worth
confirming against their docs before assuming a 1:1 swap.
of the same name, or must names be globally unique?
scripts/needs execution rather than just beingread — does that require anything beyond what already exists for
plugin-contributed skills?
Happy to open two separate, smaller PRs matching points 1 and 2/3 above
(keeping each focused on one concern, per the PR checklist) — wanted to
check the direction first, especially on the open questions, before
writing code.