ccm CLAUDE.md

A project instruction file for ccm, a command-line tool that manages separate Claude Code profiles. Each profile keeps its Claude Code settings and account session isolated from the others.

In plain words
What is it for?
Working on profile management commands, building and testing the TypeScript CLI, following its Bun and Node requirements, and maintaining its coverage and mutation-test configuration.
Why use it?
It explains the project’s strict development requirements, including complete test coverage and mutation testing. This helps agents avoid changes that pass basic tests but weaken the quality checks.

Instructions file

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add instructions/remeic/ccm/claude-md
Clone the repo
git clone --depth 1 https://github.com/Remeic/ccm
Per session 777 This file is loaded in full into every session.
When invoked 777 The same file — it is already loaded in full.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00777 $0.00777
Opus 5 $0.00388 $0.00388
Sonnet 5 $0.00155 $0.00155
Haiku 4.5 $0.00078 $0.00078

Measured 3d ago against content hash 2c9d467a9ea3, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

ccm CLAUDE.md scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

CLAUDE.md · 56 lines

How it starts

The opening of the file, as written. The whole thing — 56 lines — stays where its author put it; the contents beside it link to each section on GitHub.

CLAUDE.md

Guidance for AI agents (and humans) working in this repo. See ARCHITECTURE.md for the design deep-dive.

What this is

ccm (@remeic/ccm) — nvm-like manager for Claude Code profiles. Each profile is an isolated CLAUDE_CONFIG_DIR, so multiple Claude accounts can coexist without re-login. CLI built on commander + zod. Zero other runtime deps — keep it that way.

Commands

Bun is the dev package manager (bun.lock). Node 24 (.nvmrc, engines).

bun install
bun run build           # tsup → single ESM file in dist/
bun run dev             # tsup watch
bun run test            # vitest
bun run test:coverage   # vitest + coverage (gate)
bun run test:mutation   # stryker (gate)
bun run lint            # biome check
bun run lint:fix        # biome check --write
bun run format          # biome format

Non-negotiable invariants

  • 100% coverage (vitest, all of branches/functions/lines/statements) and 100% mutation (Stryker, break: 100). Any new code must be fully tested AND mutation-proof. CI enforces both.
  • Every new src/lib/*.ts and mutated src/commands/*.ts must be added to stryker.config.mjs mutate[]. Omitting it silently weakens the 100%-mutation claim — a reviewer will diff mutate[] against src/. Add a direct tests/lib/*.test.ts for each new lib file; don't rely on caller coverage to kill mutants.
  • src/index.ts and src/types.ts are excluded from coverage — keep them logic-free (registration and schemas only). Don't move testable logic there to dodge the gate.

Conventions

  • ESM .js import specifiers in .ts source (e.g. import { x } from './foo.js') — required by the bundler's module resolution. New files follow this.
  • Layering: src/lib/* = pure, testable logic (named exports + /** JSDoc */). src/commands/* = CLI wiring (commander registration, I/O). Keep UI out of logic.
  • UI/output: colors, icons, and print helpers live in src/lib/ui.ts (built on node:util styleText, NO_COLOR/non-TTY aware). Never hand-write \x1b[... escapes in commands.
  • Errors: formatError in src/lib/errors.ts; CLI error handling via runAction in src/lib/run-action.ts (prints ✗ message + exit(1)). Don't re-add per-command try/catch boilerplate; keep only inner try/catch that carries real rollback semantics.
  • Dependency-injectable seams: lib functions take configFile/profilesDir/browsersDir params defaulting to the real paths. This is what makes 100% coverage achievable — preserve the pattern.
  • Validation: all external input via zod schemas in src/types.ts (profile names, config shape, Claude auth status). Parse with .safeParse and degrade gracefully.
  • Biome style: single quotes, no semicolons, trailing commas, 100-col width. Conventional Commits (commitlint-enforced).

Read the full file on GitHub · 56 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 3d ago First seen · 56 lines · 777 tokens per session scan A 2c9d467a9ea3

Subscribe to this mod's changes

ccm CLAUDE.md is an instructions file published in the GitHub repository Remeic/ccm (9 stars, last pushed 13d ago), licensed MIT. It adds 777 tokens to every session, about $0.0039 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.