Profile
A profile is a named, on-disk configuration for the project’s .claude/
tree. Profiles live under .claude-profiles/<name>/, and exactly one profile
is active at a time. The active profile is the one whose files are
materialized into .claude/ for Claude Code to read.
Anatomy
Section titled “Anatomy”.claude-profiles/└── dev/ ├── profile.json # manifest — extends, includes, description, tags ├── CLAUDE.md # optional: profile-managed section of project-root CLAUDE.md └── .claude/ # the files that get copied into ./.claude/ on `c3p use` ├── settings.json ├── agents/ └── commands/The profile.json manifest declares:
extends— single-parent inheritance (extends)includes— additive components spliced in (includes)description— one-line description shown byc3p listtags— free-form labels (also shown bylist)
Lifecycle
Section titled “Lifecycle”- Create a profile with
c3p new <name>, or seed one from your existing.claude/tree withc3p init. - Switch to it with
c3p use <name>— this resolvesextends/includes, merges the result, and materializes the merged tree into.claude/. - Inspect the live tree with
c3p driftandc3p status; compare profiles withc3p diff. - Re-apply source edits with
c3p sync.
Why profiles, not branches?
Section titled “Why profiles, not branches?”Profiles are checked into git as source bytes. The active profile and the
materialized .claude/ tree are artifacts — derived state. You commit the
profile sources; the live tree is regenerated on each swap.
This means switching contexts (solo dev → team lead → CI) takes a single
command, not a git stash/git checkout dance.