General
Introduction
ccpp is a command-line tool and a Claude Code marketplace. Here is how the two fit together.
Claude Code runs an agent loop on your machine: it reads files, edits them, runs shell commands and decides when a task is done. Claude Code also exposes hooks, programs it runs at fixed points of that loop (before a tool call, after it, at the end of a turn…). ccpp uses those hooks.
The parts
| Part | What it is |
|---|---|
ccpp | A single binary. Core commands (doctor, about, account, update, marketplace) plus one command per plugin, such as ccpp cpo. |
| Plugin | A feature set with its own command (ccpp cpo …) and its own Claude Code plugin. |
| Marketplace | The repository is a Claude Code marketplace named ccpp. Installing cpo@ccpp registers the hooks of the CPO plugin. |
~/.ccpp/ | Your ccpp home: config.yml, user policies, your ccpp.dev credentials. $CCPP_HOME moves it. |
What happens during a session
- Claude Code fires a hook, for instance
PreToolUsebefore aBashcall. - The Claude Code plugin runs
ccpp <plugin> hookwith the hook input on stdin. - The plugin decides (allow, refuse, ask the user, add context for Claude) and answers on stdout in the format Claude Code expects for that hook.
The decision is made by code and files you can read, not by a model. For CPO, the files are policies, and the same input always gives the same answer.
Plugins
| Plugin | Command | Purpose |
|---|---|---|
| CPO | ccpp cpo | Claude Policy Objects: rules checked on every file write, shell command, tool call and end of turn. |
Output conventions
Every ccpp command prints Markdown by default, so Claude and people can read it. Add --json for a
machine-readable answer, for scripts and CI:
ccpp doctor --json
ccpp cpo list --jsonErrors follow the same rule: Markdown on stderr, or a JSON error object with --json, and exit code 1.