A CLI tool for managing multiple Claude Code configuration profiles via a central hub of reusable components.
ccp solves the configuration management problem for Claude Code power users:
- Central Hub: Store all your skills, agents, hooks, rules, and commands in one place (
~/.ccp/hub/) - Multiple Profiles: Create purpose-specific configurations (quickfix, full-stack-dev, documentation)
- Settings Templates: Complete
settings.jsontemplates referenced by name — what you see is what you get - Project Setup: Copy hub items into any project's
.claude/for team-shareable, git-committable config - Concurrent Profiles: Run different profiles simultaneously in different projects via mise/direnv
- Symlink Architecture: Profiles link to hub items, ensuring single-source-of-truth maintenance
- Instant Switching: Switch between profiles globally or per-project via
CLAUDE_CONFIG_DIR
Claude Code's 20 skill limit forces manual reconfiguration for different work modes. There's no mechanism to save, switch, or share configurations. Duplicating skills across setups creates maintenance burden and configuration drift.
go install github.com/samhvw8/claude-code-profile/cmd/ccp@latestOr install a prebuilt release binary with mise:
mise use -g github:samhvw8/claude-code-profileOr build from source:
git clone https://github.com/samhvw8/claude-code-profile
cd claude-code-profile
go build -o ccp ./cmd/ccp# Initialize from existing ~/.claude
ccp init
# Search and install packages
ccp find debugging
ccp install owner/repo
# Create a new profile
ccp profile create quickfix --skills=debugging-core,git-basics
# Or use interactive mode
ccp profile create dev -i
# Switch active profile
ccp use quickfix
# Copy hub items into a project's .claude/
ccp project add skills/coding agents/reviewer~/.ccp/
├── hub/ # Single source of truth
│ ├── skills/
│ ├── agents/
│ ├── hooks/
│ ├── rules/
│ ├── commands/
│ └── settings-templates/ # Complete settings.json templates
│
├── store/ # Shared downloadable resources
│ └── plugins/
│ ├── marketplaces/
│ └── cache/
│
├── sources/ # Cloned source repositories
│
├── profiles/
│ ├── default/ # Migrated from original ~/.claude
│ │ ├── CLAUDE.md
│ │ ├── settings.json
│ │ ├── skills/ # Symlinks → hub/skills/*
│ │ ├── agents/ # Symlinks → hub/agents/*
│ │ ├── hooks/
│ │ ├── rules/
│ │ ├── profile.toml # Manifest
│ │ └── ...
│ │
│ └── shared/ # Shared data (tasks, todos, etc.)
│ ├── tasks/
│ ├── todos/
│ └── ...
│
└── ccp.toml # Config + installed sources
~/.claude → ~/.ccp/profiles/default # Symlink to active profile
| Command | Description |
|---|---|
ccp init |
Migrate existing ~/.claude to ~/.ccp structure |
ccp migrate |
Run migrations from older ccp versions |
ccp use <profile> [-g] |
Switch profile (project or global) |
ccp which |
Show current active profile |
ccp status |
Show ccp status and health |
ccp doctor [--fix] |
Diagnose and fix common issues |
| Command | Description |
|---|---|
ccp profile create <name> |
Create new profile (flags or -i interactive) |
ccp profile list |
List all profiles |
ccp profile edit <name> |
Add/remove hub items |
ccp profile sync [--all] |
Regenerate symlinks and settings |
ccp profile fix <name> |
Reconcile profile to match manifest |
ccp profile delete <name> |
Delete a profile |
| Command | Description |
|---|---|
ccp hub list [type] |
List hub contents |
ccp hub add <type> <path> |
Add item to hub |
ccp hub show <type/name> |
Show hub item details |
ccp hub remove <type/name> |
Remove item from hub |
ccp link [profile] [item] |
Link hub item to profile |
ccp unlink <profile> <item> |
Unlink hub item from profile |
| Command | Description |
|---|---|
ccp project add [items...] [-i] |
Copy hub items into project's .claude/ |
ccp project list |
List items in project's .claude/ |
ccp project remove [items...] |
Remove items from project's .claude/ |
omp (oh-my-pi) reads its own config from ~/.omp/agent/ and only loads ~/.claude when its enabledProviders setting opts in, so ccp mirrors a profile into omp's agent directory. Only items omp actually loads are linked (skills with descriptions, agents with a description and a resolvable model, commands); rules and Claude hooks are reported as inert instead, because omp surfaces a rule only with description/alwaysApply frontmatter and imports hooks as modules. ccp omp is hidden — run ccp omp --help for it.
| Command | Description |
|---|---|
ccp omp link skills/debugging commands/ship.md |
Link hub items into ~/.omp/agent/ |
ccp omp link |
Interactive selection of items not linked yet |
ccp omp sync [profile] |
Mirror a profile's skills and commands to omp |
ccp omp list [profile] [--json] |
List links and show what a sync would change |
ccp omp unlink skills/debugging |
Remove ccp links from omp |
ccp omp unlink / --all |
Interactive selection, or remove everything ccp set up |
ccp omp --profile work sync |
Target an omp named profile |
Once anything is linked, ccp use <profile> -g syncs omp against the profile you switched to, including its global context: ~/.omp/agent/AGENTS.md → the profile's CLAUDE.md, and RULES.md generated from the profile's rules. ccp doctor reports omp links too: broken ones (the hub item is gone) and drift against the active profile.
| Command | Description |
|---|---|
ccp find <query> |
Search skills.sh for packages |
ccp install [owner/repo] |
Install from package or sync all |
ccp source list |
List installed sources |
ccp source update |
Update installed sources |
ccp source remove <name> |
Remove a source |
| Command | Description |
|---|---|
ccp template list |
List settings templates |
ccp template show <name> |
Display template JSON |
ccp template create <name> |
Create new template |
ccp template edit <name> |
Edit in $EDITOR |
ccp template extract <name> |
Extract from profile's settings |
ccp use quickfix -g
# ~/.claude → ~/.ccp/profiles/quickfix# .mise.toml
[env]
CLAUDE_CONFIG_DIR = "~/.ccp/profiles/dev"# .envrc
export CLAUDE_CONFIG_DIR="$HOME/.ccp/profiles/dev"Each profile has a profile.toml manifest:
version = 3
name = "quickfix"
description = "Minimal bug-fixing configuration"
settings-template = "opus-full" # Optional settings template
[hub]
skills = ["debugging-core", "git-basics"]
hooks = ["pre-commit-lint"]
rules = ["minimal-change"]
commands = ["quick-test"]Data directories (tasks, todos, history) are always shared across profiles.
# Bash
source <(ccp completion bash)
# Zsh
ccp completion zsh > "${fpath[1]}/_ccp"
# Fish
ccp completion fish | source# Sync with chezmoi
chezmoi add ~/.ccp/ccp.toml ~/.ccp/hub
# On new machine
chezmoi apply
ccp install # Syncs all sources from ccp.tomlgo test ./... # Run tests
go build -o ccp ./cmd/ccp # Build
go install ./cmd/ccp # Install locallyMIT