ccshelf

ccshelf: research and design notes

These pages are the project's guide, design notes, decision records and research, published from the Markdown files in the repository. New here? Start with Getting started. The design notes and research are not a user manual: they record why ccshelf works as it does, and where they disagree with the code, the code and its tests win. For a short command overview, see the website home page.

What each section is:

  • Start is this page: the overview, the glossary and the requirements.
  • Guide is Getting started: install, a first profile, installing missing plugins, and the profiles of an organization.
  • Reference is the command reference, generated from the real binary's --help output and checked in CI, so it cannot drift from the code.
  • Design is the current design, one file per topic: how the launcher works, the profile format, the security model, platform support and the roadmap. It is kept up to date.
  • Decisions is the decision log: every decision, supersession and open question, with date, evidence, confidence and a trigger to revisit. Rows are never deleted.
  • Research holds dated findings. They are updated only to correct them, so they can be older than the design.

Status (2026-10-08): implemented (launcher, catalog, Action, starter template, CI and release workflows), reviewed in several adversarial rounds, and released. The GitHub releases page has the current version. Known gaps:

  • Only macOS has run real Stage 0 experiments.
  • The Windows code paths run only in CI (windows-latest and windows-11-arm), not on a developer machine.
  • The Phase 0 evidence items are still open.

See the roadmap and the decision log (D-22).

ccshelf is an open-source Go tool for Claude Code with two parts:

  • a launcher that starts claude with a named profile of plugins, skills and MCP servers per terminal.
  • a catalog that lints and publishes an org's plugin marketplace.

The interactive report, report.html, is generated from these files by build_report.py. Never edit it by hand.

Where things are#

FileWhat it holds
DECISIONS.mdThe decision log: what was decided, why, with what confidence, when to revisit. Also superseded decisions and open questions
design/architecture.mdCode layout of the tool repo, design principles, the Go stack
design/launcher.mdHow the launcher invokes claude, what profiles share, accounts, hazards
design/profiles.mdProfile sources, the trust model for shared profiles, the manifest format
design/cli.mdThe command set and the interactive and flag-based interaction model (R6)
design/catalog-and-org-repo.mdTool repo versus org data repo (R5), and how the org data repo is structured
design/security.mdSecurity requirements SR1 to SR5 and the managed-policy model (R3)
design/platform.mdGitHub, GHE and cross-platform support (R1, R2)
design/project.mdOpen source (R4), license and the project name
design/release.mdVersioning and the release pull request (release-please), the token, tag and signing chain, PR title rules, failure and rollback, first-release runbook, and the assessment of three other projects
design/update.mdccshelf update: verification (SHA-256, cosign), install-method detection, replacing the binary, rollback and the opt-in automatic update
design/workflows.mdExample workflows (mockups)
../site/The project website: a static page with a loadout demo from captured output, plus these notes published as a /docs section (D-35, built by scripts/build_docs.py). scripts/check-site.sh validates it. A workflow deploys it to GitHub Pages automatically on every change to main (D-45), see site/README.md
getting-started.mdInstall, first profile, run --install-missing, org profiles and updates: a short guide for new users
reference/cli.mdThe command reference, generated from the real binary (scripts/gen-cli-reference.sh). CI fails when it is stale verified
design/roadmap.mdPhase 0 evidence, the MVP, deferred work and non-goals
research/context.mdThe two use cases and how the research was run
research/landscape.mdEvidence of the problems, native mechanisms, existing tools, naming findings
research/options-and-reviews.mdSolution options and the adversarial reviews
research/stage0.mdThe macOS experiments and the corrections made after the review round
research/adopt-or-build.mdPhase 0.2: evaluation of fuzzyalej/claude-profile and edimuj/claude-rig, and the build recommendation
research/routing-eval-protocol.mdPhase 0.1: the fixed protocol and success criterion of the routing eval (harness template in research/routing-eval/)

research/ holds dated findings that are updated only to correct them. design/ holds the current design.

Glossary#

Every document and the report use these terms the same way.

TermMeaning
ProfileA named recipe (profiles/<name>.toml) saying which plugins, standalone skills and MCP servers are active for one Claude Code session, plus session defaults. Started with ccshelf run <name>. It filters what is already installed. It is not an identity or security boundary. Part of the launcher (use case 1).
Output styleThe Claude Code setting outputStyle. A profile sets it with session.output_style. It changes the role, tone and format of the main conversation. See profiles.md and output-style-stage0.md.
InstructionsCLAUDE.md-style text of a profile, from the files in its [instructions] table. The launcher joins the files into one generated CLAUDE.md in an added directory. Claude Code loads it for the main conversation and for subagents that load CLAUDE.md files. It is not the system prompt. See profiles.md and instructions-stage0.md.
Profile bundleA generated, dependency-only plugin named profile-<name>, kept in bundles/, so a profile's plugins can be installed natively with one /plugin install. It is not itself a profile.
CatalogA generated, browsable index of an org's plugins and profiles: a static site plus catalog.json, built in CI from marketplace.json, the sidecars and git data. Also queried locally with ccshelf search and ccshelf doctor. Not committed. Answers "what exists, which should I use, who owns it". Part of use case 2 (discoverability).
SidecarThe per-plugin catalog metadata file catalog/plugins/<name>.toml (owner, status, when_to_use, overlaps, review date).
MarketplaceThe Claude Code concept: a git repo with .claude-plugin/marketplace.json and plugins that Claude Code installs from. Not the same as the catalog, which is a richer view built on top of it.
Tool repoThis public repo: the Go source, schemas, docs, releases, the reusable Action and a starter template. Never holds org data.
Org data repoAn adopting org's private repo (GHE Cloud or Server) holding its marketplace, plugins, profiles, sidecars, org config and CI. Also called the "profile catalog repo" in conversation.
AccountA Claude Code identity and data directory (a separate CLAUDE_CONFIG_DIR). An independent axis from profiles: a profile chooses what is active, an account chooses who you are.
Profile sourceWhere profile files come from: dir (the MVP), then git (after SR2), then plugin. Config key [[sources]] in the user's config.toml.
MaskingSetting enabledPlugins: false (per plugin) in a generated --settings file for every installed plugin the profile doesn't list.
CapabilityOne thing the launcher needs from Claude Code (settings masking, strict MCP config, --plugin-dir, ...). It probes each one and degrades per feature when managed policy blocks it.
Launcher, core, catalog (modules)The three Go packages in the tool repo: profiles/ (launcher), core/ (shared parsing and resolution) and catalog/.

How to read the confidence labels#

Claims about Claude Code behavior carry a marker:

  • verified verified in official docs (code.claude.com/docs), via gh, or by running the local CLI.
  • reported reported by a research agent and not independently re-checked. This includes the Stage 0 experiments, which a subagent ran with raw outputs kept.
  • unverified unverified, snippet-only or inferred.

Stage 0 uses the words Confirmed, Partly and No issue seen with the same meaning. The report's loadout demo on the Overview uses fictional plugin names and shows design intent. Only the masking mechanism itself was tested.

Requirements#

Full text and reasoning are in the design files. Each has a row in the decision log.

  • R1 macOS, Linux and native Windows, six targets (platform.md).
  • R2 GitHub.com, GHE Cloud and GHE Server with GitHub Actions (platform.md).
  • R3 works with no, partial and strict managed policy, and never bypasses it (security.md).
  • R4 open source, MIT (project.md).
  • R5 a public tool repo and each adopter's private org data repo (catalog-and-org-repo.md).
  • R6 an interactive mode and a flag-based mode. Flags are the contract (cli.md).
  • SR1 to SR5 security requirements (security.md).

Versions#

Research ran against Claude Code 2.1.290. The local CLI reported 2.1.291 when Stage 0 ran, probably because it auto-updated in between. Claude Code changes fast. Re-verify flag and field behavior before you rely on it.