Connect an adapter
An adapter is the bridge between facets and your AI coding tool — it tells the CLI where to place assets on disk so your tool can find them. You need at least one before adding facets.claude-code, opencode, and codex. Run facet adapter install with no name for an interactive picker, or pass a name to install it directly. Third-party adapters install the same way from an npm package, git URL, or local path.Find and add a facet
1
Search the registry (optional)
facet search lists matching facets with their latest version, author, and asset counts. Run it with no term to browse everything published.2
Add it
facet add brings a facet into your project in one step: it writes the entry to facets.json and runs the install pipeline. There is no separate “install after add”.The registry is the default source (hosted at agentfacets.io) — a bare name resolves to the latest published version. You can also pin a version, use a wildcard, or point at other sources.A bare name is pinned to its resolved version in facets.json; a wildcard like 1.* is preserved there, with the specific version recorded in the lockfile. See facet add for the full source grammar.What facet add writes
Your project now has two version-controlled files — commit both so teammates and CI resolve identical versions. (A third, the machine-local install receipt, lives outside your project and is not committed.)facets.json — the project manifest: which facets belong to the project, at what version, and how you want their assets named. It is the source of truth for your dependencies.facets.lock — the lockfile: exact resolved versions, , and per-file asset records for reproducible installs. It is managed by the CLI; you never hand-edit it.cowsay and a command cowsay. That is legal: skills and commands share one namespace, and agents have their own. What is not legal is two facets claiming the same name in the same namespace — see Two facets, one name.The lockfile honors the manifest. A pinned entry is reused as long as it still satisfies
facets.json; when you bump a version or widen a wildcard, facet install re-resolves and updates the lock.Where assets land
facet add writes each materialized asset into every connected adapter’s project-local directory, so your tool picks them up immediately. With the opencode adapter, adding cowsay writes:SKILL.md, and a skill installs and removes as one atomic bundle. Archive-only files — a facet’s top-level README.md or LICENSE — ship in the archive but are never written into your adapters. Other adapters use their own conventional location (Claude Code under .claude/, and so on). These files are project-scoped — the same scope you see in the lockfile — so they belong to the checkout, not your machine. facet remove deletes them again — including a skill’s owned companions, while preserving any files you added into a skill directory yourself — and facet install recreates them from the lockfile after a clone. Deletion is driven by your machine’s install receipt: files this machine never installed are left in place rather than removed on the lockfile’s word.Two facets, one name
Sooner or later two facets will publish an asset with the same name. Facets cannot know about each other, so your project decides.Adding a second facet whose skill is also calledplanning pauses the install:Enter on the group to open it, then give each one an outcome:- Keep — leave it under the published name.
- Alias — type a different name for it.
- Omit — do not install it at all.
↑↓, highlight a choice with ←→, and press Enter to apply it. They only have to differ from each other, so aliasing one of them is enough. Once every group shows ✓ resolved, confirm and the install continues.Your decision is saved to facets.json, so it happens once:facets.json
Aliasing renames the file, not the facet.
team-tools is still team-tools, its published skill is still planning, and every integrity hash is unchanged — which is why an alias can never smuggle different content in under a familiar name. See Materialization.Reinstall after a git clone
When you clone a project that already hasfacets.json and facets.lock, materialize into your adapters with:facet install fetches and installs every declared facet at the exact versions in the lockfile — so you get precisely what is pinned.Manage what’s installed
See what’s declared:facet list shows every facet in facets.json with its resolved version (from the lockfile), or its source specifier if it hasn’t been installed yet.Move to a newer version:facets.json and the lockfile. A dedicated facet upgrade command is on the roadmap; its page documents the manual paths until it ships.Remove a facet:facet remove takes a facet out of facets.json, deletes the assets it still owns from every connected adapter, and rewrites the lockfile without it. Several removals commit together or not at all. A name that isn’t declared is ignored rather than fatal, so re-running a removal is safe and a command whose names are all already gone succeeds as a no-op.Manage adapters: