Keep one AI focused on the big picture while a brigade of AI coding agents does the work.
Kitchen turns a Claude Code session into a hands-on engineering lead. That sous chef hires Claude, Codex, or Gemini cooks in tmux, gives them focused tickets, and receives their completed work automatically through Claude Code channels. You keep talking to one coherent orchestrator while the cooks spend their own context reading code, running tests, implementing changes, and reviewing one another.
It runs the stock agent CLIs you already use—authenticated through your existing subscriptions—not stripped-down API workers hidden behind a custom harness.
| Benefit | Why it matters |
|---|---|
| A manager that stays sharp | The sous delegates source reads, greps, tests, and implementation instead of filling its own context with project detail. Its context stays available for coordination, tradeoffs, and long-running continuity. |
| Real agents, on your existing subscriptions | Cooks are ordinary Claude Code, Codex, and optionally Gemini/agy sessions. They keep their native tools, skills, plugins, MCP servers, and subscription auth; no separate model API integration or metered API-key billing is required. Provider usage limits still apply. |
| An opinionated workflow you can actually edit | sous-chef.md and the role prompts encode a complete operating method: delegate investigation, write verifiable tickets, review across backends, preserve decisions, and prove completion. They are plain Markdown—fork them, tune them, or replace the methodology. |
| Cross-model review by design | The supplied workflow pairs a Claude implementer with a Codex reviewer, or vice versa. An adversarial second model often catches assumptions the first model rationalized past. The convention lives in the prompt, so you remain in control. |
| Parallel work without a black box | Each cook is an isolated tmux window. Run independent workstreams concurrently, attach to watch them live, inspect a pane with kitchen peek, or take over the keyboard yourself. |
| Memory that survives the shift | Per-project mistakes.md and preferences.md files persist across kitchens, while per-kitchen notes support handoffs and task briefs. The team can carry forward lessons without keeping every old conversation alive. |
Kitchen also integrates the superpowers skills workflow for brainstorming, specs, chunked implementation, review, and verification. For heavier use cases it can hand an independent workstream to another kitchen's sous with a ticket, or launch a clean-room Claude/Codex cook for a more reproducible evaluation—but the core stays deliberately small: tmux down, hooks and a Unix socket back up.
your terminal
you <────────────> sous chef (Claude Code)
│ ▲
kitchen ticket│ │MCP channel notification
▼ │
tmux session │
┌────────┼────────┐ │
│ │ │ │
Claude Codex Gemini/agy
cook cook cook
│ │ │
└────────┴────────┘
completion hooks
│
per-kitchen Unix socket
There are two intentionally simple directions:
- Sous → cook:
kitchen ticketpastes a message into the cook's tmux composer and verifies that the TUI accepted it. - Cook → sous: the agent CLI's completion hook sends the cook's full final response to a per-kitchen Unix socket. A tiny MCP channel server pushes it into the sous's live context—no polling and no pane scraping for results.
For the implementation details, diagrams, backend contracts, and the hook → socket → MCP flow, see How kitchen works.
Open a kitchen in a Git repository:
kitchen openClaude starts as the sous chef in your terminal. Give it the outcome you want:
Build the import feature. Have one model implement it, another review it,
and run an end-to-end verification before you report back.
The sous can turn that into a flow like this:
kitchen hire eng --backend claude --role eng
kitchen hire reviewer --backend codex --role reviewer
kitchen ticket eng "Implement the agreed import feature and verify it end to end."
# eng's response arrives automatically in the sous's context
kitchen ticket reviewer "Review the import implementation. Do not edit; report findings."You continue talking to the sous while both cook sessions remain visible in tmux. The supplied workflow reuses cooks when their context is valuable, routes findings back to the implementer, and requires evidence before declaring the work done.
- tmux — cooks run in tmux windows; this is the process and observation layer.
- Verify:
tmux -V - Install:
brew install tmuxon macOS, or use your Linux package manager.
- Verify:
- git — kitchen derives the project namespace from the repository and uses git worktrees for named kitchens.
- Verify:
git --version
- Verify:
- uv — installs the Python 3.12+ CLI and its dependencies.
- Verify:
uv --version
- Verify:
- Claude Code CLI 2.1.80 or newer — the sous uses Claude Code's development channels feature.
- Verify:
claude --version
- Verify:
- claude.ai web authentication — channels are available to claude.ai logins, not Console/API-key authentication.
- Sign in:
claude /login, then choose your claude.ai account.
- Sign in:
- superpowers plugin — the supplied sous workflow invokes its brainstorming and development skills.
- Install from Claude Code:
/plugin install superpowers@claude-plugins-official(thesuperpowers-marketplaceinstall also works)
- Install from Claude Code:
mcpPython SDK — installed automatically as a transitive dependency of this project; no separate install step is needed.
- Codex CLI — required only for
--backend codexcooks. Kitchen forces its completion notify command per cook launch, so~/.codex/config.tomlneeds no kitchen entries. - Antigravity CLI (
agy) — required only for the opt-in--backend geminicook. Kitchen does not use ageminibinary andkitchen setupdoes not install or checkagy. jq— needed only by the packaged richer statusline example, not by the kitchen core.
On macOS:
brew install tmux git
curl -LsSf https://astral.sh/uv/install.sh | shOn Linux, install tmux and git through your package manager, then install uv with the command above.
Install Claude Code using its official instructions, then sign in with a claude.ai account:
claude /loginKitchen's channel connection will not work with Console/API-key authentication.
From inside Claude Code:
/plugin install superpowers@claude-plugins-official
git clone git@github.com:plonkus/kitchen.git
cd kitchen
uv tool install --editable .The editable install makes changes to this checkout—including prompt customizations—available to the installed kitchen command immediately.
kitchen setupkitchen setup installs and verifies:
- Claude
StopandUserPromptSubmithooks: it appends akitchen hookentry to~/.claude/settings.jsonfor each event that lacks one, after asettings.json.bak-kitchen-<time>backup, and leaves every other setting alone. - The
mcpPython SDK. - The superpowers plugin.
- Claude Code version 2.1.80 or newer.
- That no legacy kitchen uses the reserved name
projects.
The statusline check is advisory. Re-run the command until the blocking checks are green.
Run kitchen from inside any git repository:
# Use the current checkout
kitchen open
# Or create a branch + sibling worktree for a named kitchen
kitchen open my-featureThe current process becomes the Claude sous chef. Talk to it normally—describe goals, constraints, and what evidence you expect. The sous knows the kitchen commands and manages cooks for you.
In another terminal, watch the brigade:
tmux -L ck-<project-slug>-<kitchen-name> attachEach kitchen runs on its own tmux server (socket ck-<kitchen>), so the -L is required — a bare tmux attach -t ck-… will not find the session. No -t is needed: the server holds a single session, named kitchen, whose windows are kitchen:<cook>. kitchen open prints the exact command.
Kitchen namespaces sessions and state by project slug. For example, kitchen open my-feature in a repository named widget becomes kitchen widget-my-feature, while the git branch and worktree keep the name my-feature. A no-name kitchen open usually uses the repository name without doubling it.
Hire a Claude engineer to investigate the flaky integration test.
Have a Codex reviewer inspect the engineer's commit for correctness and scope.
Split the migration into independent workstreams and run them in parallel.
Use a clean-room cook in /tmp/eval-checkout to evaluate this prompt.
Clock out the docs cook; keep the reviewer around for the next change.
The sous runs these commands under the hood. You can also use them directly from another terminal.
| Command | What it does |
|---|---|
kitchen open [name] [project] |
Open a kitchen; an explicit name creates a worktree. |
kitchen hire <cook> [options] |
Spawn a cook and wait until its interactive prompt is ready. |
kitchen roles |
List the packaged cook roles. |
kitchen ticket <cook> "message" |
Deliver a verified message to a cook. |
kitchen ticket sous --kitchen <kitchen> "message" |
From a sous, deliver a ticket to another kitchen's sous over its channel socket; exits non-zero if that sous is not listening. |
kitchen peek <cook> [--full] |
Capture the cook's current pane or full scrollback. |
kitchen brigade [kitchen] |
Show live cook status and known context usage. |
kitchen clock-out <cook> |
Hard-kill a cook and remove its managed state. |
kitchen sweep |
Remove state files for cook windows that no longer exist. |
kitchen close [kitchen] |
Shut down the kitchen and remove managed per-kitchen state. |
kitchen setup |
Install hooks; check dependencies and environment readiness. |
# Packaged role; _default is used when --role is omitted
kitchen hire eng --backend claude --role eng
# Cross-model reviewer
kitchen hire reviewer --backend codex --role reviewer
# Unified effort scale: low, medium, high, max
kitchen hire investigator --effort max
# Claude model tier; the Claude CLI resolves the current model in that tier
kitchen hire architect --model opus
# Codex model; astra is passed to `codex -m` as gpt-6-astra (Codex cooks only)
kitchen hire reviewer --backend codex --model astra
# Near-fresh eval worker: no role, auto-memory, or superpowers startup injection
kitchen hire eval1 --clean-room --project /absolute/eval-directory
# Add a specific skill/plugin directory back to a clean-room Claude cook
kitchen hire eval2 --clean-room --with-skill /absolute/path/to/skillClaude cooks receive role Markdown as an appended system prompt. Codex receives it as the first message after the TUI is ready, and Gemini/agy receives it as its initial turn. Clean-room mode supports Claude and Codex; --with-skill currently supports Claude only. Clean-room mode does not hide files such as CLAUDE.md or AGENTS.md from the cook's working directory, so use an empty directory or pinned checkout when that isolation matters.
Each Codex cook's thread is named [<kitchen>/<cook>] at hire and archived with codex archive on kitchen clock-out or kitchen close, so cooks stay out of the ChatGPT app's session list. Clean-room Codex cooks are skipped. If the ChatGPT app holds the thread, the archive fails with a one-line note and the clock-out continues.
Every launched agent gets AGENT_NAME, AGENT_KITCHEN, and STATUS_DIR. Global hooks are gated on those variables, so ordinary agent sessions outside a kitchen are untouched. Every launched agent also gets CLAUDE_CODE_DISABLE_AUTO_MEMORY=1, so durable notes go to the kitchen wiki rather than Claude Code's auto-memory.
When a cook completes a turn:
- Claude's
Stophook, Codex'snotify, or agy's stop hook invokes kitchen. - Kitchen stores the full final response and any available context information in the cook's status JSON.
- The hook sends one JSON line to
~/.claude-kitchen/<kitchen>/kitchen.sock. - The per-kitchen MCP server emits a Claude channel notification.
- The response appears automatically in the sous's context, and the sous decides whether to follow up, review, iterate, or report back.
The sous's own Stop hook does not notify its own socket, preventing an echo loop.
~/.claude-kitchen/
├── <kitchen>/
│ ├── kitchen.json # source/worktree + sous resume session
│ ├── kitchen-mcp.json # generated per-kitchen MCP config
│ ├── kitchen.sock # live channel socket
│ ├── sous.pid # duplicate-sous guard
│ ├── cooks/<name>.json # backend, status, response, session, context
│ ├── codex-home/ # clean-room Codex homes, when used
│ ├── plow-chat/ # optional: plow-credentials (600), last_seen.json
│ └── notes/ # handoff, log, and long task briefs
└── projects/<slug>/wiki/
├── mistakes.md # durable lessons
└── preferences.md # durable working preferences
kitchen close removes managed per-kitchen notes and cook state. The project wiki survives so later kitchens inherit the lessons and preferences.
A kitchen whose state dir holds plow-chat/plow-credentials also loads the plow-chat channel when kitchen open starts its sous. Texts to that Plow line arrive as <channel source="plow-chat" from="<name>" chat="<chat uid>">; photos and files sent with them are saved under plow-chat/files/ and their space-separated paths added as a file attribute. The sous answers with its reply tool, or sends up to four local files as one message with send_file. There is no allowlist: Plow delivers only chats the line's account owns, meaning the owner's 1:1 and any iMessage group the owner was in when its first text arrived. Every member of those chats speaks with head-chef authority. Anyone who has both numbers can start such a group, so the owner should treat every group with the line as trusted.
Setup, using latch and the kitchen name kitchen open prints (a kitchen boss opened in a widget repo is widget-boss):
latch login # text the printed code from your phone
latch agents lines # pick a free line
mkdir -p -m 700 ~/.claude-kitchen/widget-boss/plow-chat
latch agents new --own --name widget-boss --line ln_... \
--credential-file ~/.claude-kitchen/widget-boss/plow-chat/plow-credentialsThen restart the sous: /exit, then kitchen open --resume boss from the project root. Text the line to check it. A new group needs no setup: add the line's number to it.
The orchestration behavior is intentionally not hard-coded:
src/claude_kitchen/sous-chef.mddefines the manager's operating method: protect context, delegate investigation, use superpowers for spec work, review across models, preserve decisions, and require evidence.src/claude_kitchen/roles/contains the cook contracts:eng,reviewer,qa, and_default..kitchen/on-open.shand.kitchen/on-close.shin a project can run lifecycle automation for that repository.
With an editable install, reopen the kitchen or re-hire a cook after changing a prompt to pick up the new behavior. For long-lived customization, fork the repository and install your fork.
server:kitchen · no MCP server configuredat sous startup: this is a known harmless startup race; the server connects shortly afterward.- Superpowers is missing: install it from Claude Code with
/plugin install superpowers@claude-plugins-official(thesuperpowers-marketplaceinstall also works). - Channel authentication fails: run
claude /loginand select a claude.ai account. Console/API-key authentication does not expose channels. - Claude Code is too old: upgrade to version 2.1.80 or newer.
agy not on PATH: Gemini cooks require Antigravity CLI; Claude and Codex kitchens do not.- Named kitchen refuses to open outside a git repository: a plain directory works for an unnamed
kitchen open(a home kitchen), butkitchen open <name>makes a git worktree, so it needs a repository. - Legacy kitchen named
projects: that name is reserved for the persistent project wiki root; follow the rename instruction printed by setup.
Kitchen was inspired by two projects we admired and learned from. We re-implemented their ideas in our own Python—no code was copied.