FOR EVERYONE
Multiple projects
If you work across several repos — a few clients, a couple of side projects, a monorepo — claude-kit fits that without anything bleeding together. The rule of thumb: one /kit-init per project.
Why per-project
The kit deliberately sets up each project on its own, rather than once at a parent level:
- It travels with the repo. A project's agents, skills, rules, and
kit.config.jsonall live in its own.claude/. Commit that and the whole team shares the same setup — clone the repo elsewhere and it just works. - Clean memory. Each project maps to its own memory wing, so decisions and context never leak from one project into another. See Memory.
In a workspace or monorepo, run /kit-init inside each project rather than at the root. /kit-init notices whether you're in a single project or a folder of several and recommends accordingly.
Shared defaults across a folder
Per-project doesn't mean repeating yourself. If one folder holds several projects and you want them to share a preference — the same language, the same plan format, the same annotation setup — drop a .claudekit/config.json into the parent folder.
It cascades to everything beneath it, the way .editorconfig does: the nearest folder wins, and its settings merge over each project's own config without trampling a project's specific choices.
clients/
.claudekit/config.json # shared defaults for everything below
acme/
.claude/ # acme's own setup; inherits + can override
globex/
.claude/ # globex's own setup; inherits + can override
So you set the shared bits once, and each project still gets the last word on its own specifics.
How it works under the hood
- Project config. Each project's
.claude/kit.config.jsonis the source of truth for that project, loaded by scripts viascripts/lib/kit-config.sh→load_kit_config, which flattens it intoKIT_*environment variables. - The cascade. After loading the project config,
load_kit_configwalks ancestor directories for.claudekit/config.jsonfiles and deep-merges them over the project config (far → near, nearest wins) usingjq '.[0] * .[1]'. It re-exports the fields that make sense at folder scope —KIT_LANG,KIT_PLANS_FORMAT, theKIT_ANNOTATE_*set — and exposes the fully merged result asKIT_EFFECTIVE_CONFIG. - No
.claudekit/? No change. Projects without any ancestor.claudekit/behave exactly as they did before — the cascade is purely additive.
Where to go next
- Memory — how wings keep projects separated.
- Profiles & configuration — the config the cascade merges.
- Stay updated —
.claudekit/overrides apply on upgrade, too.