Fitout

Context-aware plugin manager for Claude Code.
The Problem
Managing Claude Code plugins across projects is painful:
- Config files look correct but don't reflect what's actually installed
- This mismatch leads to broken sessions and missing capabilities
- Manually syncing plugins across projects is tedious and error-prone
The Solution
Fitout ensures your actual runtime state matches your declared configuration.
- Declare desired plugins in
.claude/fitout.toml
- Run
fitout status to see the diff
- Run
fitout install to sync
Installation
npm install -g fitout
fitout init
This adds a SessionStart hook to Claude Code that automatically installs missing plugins when you start a session.
Non-interactive setup
fitout init --yes
fitout init --hook-only
Requires Claude Code CLI to be installed.
Quick Start
Create .claude/fitout.toml in your project:
plugins = [
"superpowers@superpowers-marketplace",
"ci-cd-tools@pickled-claude-plugins",
]
Check status:
fitout status
Output:
Context: /path/to/project
✗ superpowers@superpowers-marketplace (missing)
✗ ci-cd-tools@pickled-claude-plugins (missing)
0 present, 2 missing
Install missing plugins:
fitout install
Commands
fitout status
Shows the diff between desired and installed plugins.
✓ - Plugin is installed
✗ - Plugin is missing
? - Plugin is installed but not in config
Exit code is 1 if any plugins are missing, 0 otherwise.
fitout install
Installs missing plugins to sync with config.
fitout install
fitout install --dry-run
fitout profiles
Lists available profiles with descriptions and plugin counts.
fitout profiles
fitout profiles --json
Profiles
Share plugin sets across projects using profiles.
User Profiles
Create profiles at ~/.config/fitout/profiles/:
description = "Baseline plugins for all projects"
plugins = [
"superpowers@superpowers-marketplace",
]
description = "Backend services and APIs"
plugins = [
"database-tools@some-registry",
"api-helpers@some-registry",
]
Using Profiles
Reference profiles in your project config:
profiles = ["backend"]
plugins = [
"project-specific@registry",
]
Plugins merge additively. The default profile auto-includes if present.
Provenance
Status output shows where each plugin comes from:
Context: /path/to/project
✓ superpowers@superpowers-marketplace (from: default)
✓ database-tools@some-registry (from: backend)
✓ project-specific@registry
3 present
Configuration Reference
Project Config (.claude/fitout.toml)
profiles = ["backend", "testing"]
plugins = [
"plugin-name@registry",
]
Profile Config (~/.config/fitout/profiles/<name>.toml)
description = "What this profile provides"
plugins = [
"plugin-name@registry",
]
Development
npm install
npm test
npm run dev -- status
npm run build
License
MIT