Manifests and state¶
Repertoire uses one human-edited YAML format for catalogs, catalog registrations, bootstrap skills, and declared requirements. A file may contain any combination of the sections.
schema: 1
tool: https://github.com/phillarmonic/repertoire-ai
catalog:
name: phillarmonic
description: Phillarmonic agent skills
skills:
zensical:
path: skills/zensical
catalogs:
company:
source: git@github.com:example/company-skills.git
ref: main
requirements:
code-reviewer:
catalog: company
targets:
- codex
hooks: true
tool is an informational marker for people who find the file outside its
original context. Repertoire writes it as the project repository URL, but it
does not affect schema validation or installation behavior.
Catalog names use lowercase letters, digits, and hyphens. Catalog skill names
use the same kebab-case rule. Prefer owner-prefixed names such as
phillarmonkey-code for broad skills that would otherwise be generic. Skill
paths must be relative and contained within the catalog repository. Avoid
publishing generic catalog skill names such as code, docs, or review;
when agents show several personal or vendor skills together, those labels are
easy to confuse.
Trusted catalog keys¶
A catalog registration can list the public keys allowed to speak for that
catalog. Registrations with no trust block load and install as they do
today. When trust is present, each entry under trust.keys names an armored
public key file and the fingerprint that file must match:
catalogs:
company:
source: git@github.com:example/company-skills.git
ref: main
trust:
keys:
- path: keys/company.asc
fingerprint: ABCDEF0123456789ABCDEF0123456789ABCDEF01
path is relative to the directory that contains the manifest, and it must
stay inside that directory. fingerprint is the key the armored file must
match. An empty path, an empty fingerprint, or a path that leaves the manifest
directory is rejected. The manifest schema stays at 1.
When trust is present, materializing the catalog checks the checked-out
commit with git verify-commit. Repertoire imports only those public keys
into a temporary keyring, confirms each file's fingerprint before import, and
deletes the keyring when the check finishes. It does not read or write your
personal GnuPG keyring, and it does not contact a keyserver. A registration
with no trust block skips the check. A local path or an override still runs
it: the commit that was actually checked out has to verify. If gpg is
missing, the commit is unsigned, the fingerprint does not match, or the
signature is not from one of the declared keys, materialize fails and the
error names the catalog, the skill, and the commit. add, install,
update, and bootstrap then leave the lock unchanged.
The same keys sign each skill. A trusted catalog skill carries
REPERTOIRE.digest.asc in the skill directory: a detached ASCII signature
over that skill's content digest. The digest is the same hex hash recorded in
the lock (paths, modes, symlink targets, and file bytes). The signature file
is not part of the hash, so adding it does not change the digest. Either
declared key may sign. Verification uses the same temporary keyring and the
same fingerprint check as the commit. A changed skill, a missing
REPERTOIRE.digest.asc, or a signature from any other key fails, and the
error names the catalog, the skill, and the commit. add, install,
update, and bootstrap leave the lock unchanged. A loose catalog skill uses the
same file in its skill directory. A registration with no trust block does
not require it.
Project and global scope¶
Commands default to user-global scope: state lives in the operating system's
user configuration directory, and skills install under home-directory agent
roots. --project reads repertoire.yaml and repertoire.lock.json from the
current Git worktree root and installs into project-local agent directories.
--global makes the default explicit. The two flags cannot be combined.
The optional hooks field records whether optional managed project artifacts
should be installed with a declared requirement. Catalog-provided project
instructions are installed independently of this setting. The lock file is generated
deterministically. It records resolved commits, per-target content digests,
logical targets, installed locations, managed artifact destinations and
digests, and whether an installation came from a declared requirement or an
ad-hoc install.
Project bootstrap skills¶
A Git project declares the skills a contributor needs in the top-level
skills section of its repertoire.yaml, next to any catalogs and
requirements sections:
schema: 1
tool: https://github.com/phillarmonic/repertoire-ai
catalogs:
company:
source: git@github.com:example/company-skills.git
ref: main
skills:
github.com/phillarmonic/ai-skills/zensical:
scope: global
targets: [codex]
shared-helpers:
catalog: company
scope: project
targets: [agents]
hooks: true
skills keys may be skill names or
source-qualified IDs ({catalog-host-and-path}/{skill-name}). Prefer
owner-prefixed kebab-case skill names for broad or generic skills, such as
phillarmonkey-code. A catalog skill with that name can be referenced from a
source-qualified project manifest key such as
github.com/example/company-skills/phillarmonkey-code. catalog and
targets are optional. An omitted catalog uses unqualified resolution for skill
names, or the source-qualified ID's catalog source. An omitted target uses
agent detection for that scope.
scope accepts project or global and defaults to global.
Catalog-declared project instructions are installed into the worktree for both
project- and global-scope bootstrap declarations. This supports a small
repository pointer to a globally installed skill without copying the complete
skill package into the repository. The per-project instruction state is stored
in Repertoire's global lock, so bootstrap does not create a project lock solely
for these pointers.
hooks: true additionally enables catalog-declared hooks and integrations.
For global-scope declarations, the skill stays in the user's home directory
while these optional artifacts are managed in the bootstrapping worktree.
Removing the globally managed skill also removes its recorded project
instructions and optional artifacts, subject to the normal local-modification
checks.
When repertoire bootstrap runs in a project whose repertoire.yaml declares
no skills, it adds a starter skills section that declares every built-in
phillarmonic skill with a source-qualified ID and scope: global.
Bootstrap installations are recorded with a bootstrap origin in the normal
project or global lock. They do not add requirements to
repertoire.yaml, and removing one does not edit the manifest.
Removing a declaration from the skills section is additive: existing installed
copies remain until explicitly removed.
Migrating from .repertoire.yaml¶
Repertoire previously read bootstrap declarations from a standalone
.repertoire.yaml at the worktree root. When repertoire bootstrap or
repertoire sync finds that legacy file and repertoire.yaml declares no
skills, it merges the legacy catalogs and skills sections into
repertoire.yaml and deletes .repertoire.yaml. When both files declare
skills, repertoire.yaml wins and the legacy file is ignored with a warning so
you can merge and delete it manually.