A package manager and lockfile for your Claude Code setup.
Project description
cchad
A package manager and lockfile for your Claude Code setup.
cchad scans a repo, detects its tech stack, and installs a curated, deconflicted set of MCP servers and skills for Claude Code — recording every choice in a committed manifest so anyone who clones the repo gets an identical setup with one command.
Mental model: a preset is your base tooling ·
auto_plugins_mcps.mdis the lockfile ·cchad syncisnpm install.
Why
Claude Code gets its power from MCP servers, skills, and hooks — but assembling the right set is tedious and easy to get wrong:
- Discovery is manual. The ecosystem is thousands of repos; finding the few that matter for this project is research every time.
- Tools fight each other. Stack two workflow frameworks or two browser MCPs and they conflict and degrade the agent.
- Config isn't shared. Everyone hand-configures their own
.claude/and.mcp.json, so teammates drift.
cchad does curated + auto-detected + deconflicted + team-synced in one tool, and the result is a plain file you can read and review in a PR.
What makes it different
- The manifest is the source of truth. A committed, human-readable
auto_plugins_mcps.mdrecords what was detected, what got installed, and why. The CLI applies the manifest — it never hides config in an opaque blob. - Deconfliction is first-class. At most one workflow spine, one browser MCP, a capped number of servers, no redundant duplicates — every drop comes with a reason.
Principles: minimal by default, plan before apply, safe (atomic writes, backups, rollback, never auto-runs untrusted installers).
Install
# with uv (recommended)
uv tool install cchad # or run ad-hoc: uvx cchad --help
# or with pipx
pipx install cchad
Inside Claude Code, install the plugin instead:
/plugin marketplace add Cypsy1714/cchad
/plugin install cchad@cchad
Quickstart
In a terminal
cchad setup # once: pick a baseline, applied to your user scope
cchad init # in a repo: detect → preview plan → apply + write the manifest
In Claude Code
/cchad:setup # once: pick a baseline
/cchad:init # in a repo: preview the plan, confirm, apply
Onboarding a teammate
Someone clones a repo that already has auto_plugins_mcps.md committed:
cchad sync # rebuilds their local .mcp.json / .claude to match the manifest
They open Claude Code and it's configured identically.
How it works
cchad has two layers:
| Layer | Scope | Lives in | Set by |
|---|---|---|---|
| Base | user (~/.claude/) |
your config.toml |
cchad setup |
| Project | this repo | committed auto_plugins_mcps.md |
cchad init |
- A preset (
minimal/recommended/full) picks your base tooling — the things you want in every project. - Rules map the detected stack to project packages (e.g.
mongodb→ the MongoDB MCP,react→ a React skill). - The resolver merges both layers and deconflicts them (see docs/deconfliction.md).
- Apply writes real config:
.mcp.json, skill directories, and a fenced block inCLAUDE.md. Plugins are never auto-installed — cchad prints the exact command.
The manifest
auto_plugins_mcps.md is committed to the repo. Its frontmatter is what cchad reads;
the body is what your teammates review in a PR.
---
cchad_version: 0.1.0
generated: 2026-07-01
stack: [fastapi, javascript, mongodb, python, react, vite]
tools:
- id: context7
kind: mcp
source: npx -y @upstash/context7-mcp
scope: project
- id: mongodb-mcp
kind: mcp
source: npx -y mongodb-mcp-server
scope: project
skipped:
- id: playwright-mcp
reason: "only one browser tool allowed; kept 'chrome-devtools-mcp'"
---
# Claude Code setup for this repo
...
Commands
| Command | What it does |
|---|---|
cchad setup |
Pick a base layer, save config, apply it to your user scope. |
cchad init |
Detect the stack, preview the plan, apply it, write the manifest. |
cchad plan |
Preview the plan (and diff vs the manifest). Writes nothing. |
cchad apply |
Apply this repo's committed manifest to local config. |
cchad sync |
Rebuild local config from the committed manifest (onboarding). |
cchad update |
Reload the catalog and show drift vs the manifest. |
cchad add / remove <id> |
Add or remove a project package in the manifest. |
cchad base list / add / remove |
Manage your base layer. |
cchad config edit |
Open your config in $EDITOR. |
cchad rollback |
Undo the last apply from its .bak backups. |
Global flags: --json, --yes, --plan-only, --no-base, --scope. See
docs/cli.md.
Configuration
Your personal base choices and policy live in ~/.config/cchad/config.toml (not
committed):
[base]
preset = "recommended" # minimal | recommended | full
enable = [] # extra base packages
disable = [] # preset items to drop
[policy]
max_mcp_servers = 5
browser = "chrome-devtools-mcp" # which single browser MCP wins
spine = "superpowers" # which single workflow spine wins
[catalog]
sources = [] # your own catalog YAMLs (paths or github: refs)
Extending the catalog
The value is the data. Add your own packages, presets, and rules — no code needed —
by pointing [catalog].sources at a YAML file or a github:owner/repo ref. Your
entries override the shipped ones by id. See docs/extending.md.
Safety
- Plan before apply — nothing touches disk without a preview.
- Atomic writes +
.bakbackups +cchad rollback— your existing.mcp.jsonand.claude/are never corrupted. - No auto-run installers — cchad only writes config and installs from sources in its catalog. Plugins become a manual step with the exact command.
- No secrets in the manifest — servers that need keys reference environment variables; tokens are never written to committed files.
Documentation
- Concepts — the vocabulary and the two-layer model
- CLI reference
- Configuration
- The catalog
- The manifest
- Deconfliction
- The Claude Code plugin
- Extending cchad
Contributing
Issues and PRs welcome — see CONTRIBUTING.md. Adding a package or a detection rule is usually a one-line change to a YAML file.
License
MIT © Cypsy1714
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cchad-0.1.0.tar.gz.
File metadata
- Download URL: cchad-0.1.0.tar.gz
- Upload date:
- Size: 41.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af92cc3e643eff23df1eb7d7aa3c2c7de4a9c8af7bf5a26915a26f431d429ea1
|
|
| MD5 |
b63a5d8d7937acf91f7f18f8a35ab1c0
|
|
| BLAKE2b-256 |
e48297b4e37c4e80c04b095ae156bc27280500370747555348efcae4749a445b
|
Provenance
The following attestation bundles were made for cchad-0.1.0.tar.gz:
Publisher:
release.yml on Cypsy1714/cchad
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cchad-0.1.0.tar.gz -
Subject digest:
af92cc3e643eff23df1eb7d7aa3c2c7de4a9c8af7bf5a26915a26f431d429ea1 - Sigstore transparency entry: 2039680696
- Sigstore integration time:
-
Permalink:
Cypsy1714/cchad@b3af0ac57d65045ffe79a8b92224ae58ed5bd222 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Cypsy1714
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b3af0ac57d65045ffe79a8b92224ae58ed5bd222 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cchad-0.1.0-py3-none-any.whl.
File metadata
- Download URL: cchad-0.1.0-py3-none-any.whl
- Upload date:
- Size: 37.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99104a1d012618aa8469b2b589b81c2c0962712abe483b3a2e500b6649de8ca9
|
|
| MD5 |
2a7d8320a9c92e2586a40f113237f97d
|
|
| BLAKE2b-256 |
e7a02ff97ab9ffae0be375f9ac7567816f6efde8584321e2cbd7742c7610213a
|
Provenance
The following attestation bundles were made for cchad-0.1.0-py3-none-any.whl:
Publisher:
release.yml on Cypsy1714/cchad
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cchad-0.1.0-py3-none-any.whl -
Subject digest:
99104a1d012618aa8469b2b589b81c2c0962712abe483b3a2e500b6649de8ca9 - Sigstore transparency entry: 2039680769
- Sigstore integration time:
-
Permalink:
Cypsy1714/cchad@b3af0ac57d65045ffe79a8b92224ae58ed5bd222 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Cypsy1714
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b3af0ac57d65045ffe79a8b92224ae58ed5bd222 -
Trigger Event:
push
-
Statement type: