Multi-agent orchestrator plugin for Claude Code.
- Flat dispatch: main Claude session (meeting runner) -> specialist subagents (per speaker turn) -> worker subagents (per implementation task). No nested orchestrator subagent; the main session IS the orchestrator.
- MCP Server over stdio transport + Claude Code plugin (skills, hooks, agents)
- SQLite storage at ~/.open-coleslaw/data.db
- Web dashboard at http://localhost:35143
- Claude CLI subprocess for agent execution (mock mode with COLESLAW_MOCK=1)
- TypeScript (strict, ESM)
- @modelcontextprotocol/sdk -- MCP server
- better-sqlite3 -- storage
- ws -- WebSocket for dashboard
- zod -- validation
- tsup -- build
- vitest -- testing
npm run build-- build with tsupnpm run dev-- watch modenpm test-- vitest (219 tests)npm run lint-- tsc --noEmitnpm run clean-- remove dist/
src/
index.ts -- entry point, stdio transport + dashboard startup
server.ts -- MCP server creation, 14 tool registrations
tools/ -- MCP tool handlers (14 tools, 15 files + index)
orchestrator/ -- orchestrator logic, meeting runner, leader pool, worker manager
meeting/ -- meeting protocol, minutes generation, compaction, mention detection
agents/ -- agent factory, prompts, project analyzer, claude CLI invoker
dashboard/ -- web dashboard server (inline HTML + Cytoscape.js)
extension/ -- self-extending capability system
storage/ -- SQLite schema, CRUD for agents/meetings/mentions/tasks/events
hooks/ -- hook scripts (pre-read, auto-route, auto-commit, doc-update, flow-verify, mvp-cycle)
skills/ -- skill prompt generators
assets/ -- rules.md, plugin-guide.md, templates, configs
installer/ -- install/uninstall helpers
types/ -- TypeScript type definitions
utils/ -- logger, config, cost tracker
start-meeting-- Convene a meeting (kickoff|design|verify-retry) with a topic + agendaget-meeting-status-- Get meeting progress and agent statesget-minutes-- Retrieve PRD-format meeting minutesexecute-tasks-- Return the task list directly fromminutes.actionItemsfor worker dispatchget-agent-tree-- Display the full agent hierarchy tree (bookkeeping)respond-to-mention-- Respond to a pending @mention decisionget-mentions-- List @mentions filtered by status/meetingcancel-meeting-- Cancel a meeting with cascade to all workerslist-meetings-- List meetings with status filter and paginationget-task-report-- Execution report with per-department breakdowncreate-capability-- Self-extend: create new hook/skill/command/asset/loopget-cost-summary-- Cost tracking per agent/meeting/departmentchain-meeting-- Link meetings: output of one feeds into the nextadd-transcript-- Record a speaker's turn during a meetinggenerate-minutes-- Write PRD minutes from the accumulated transcriptsupdate-mvps-- Upsert MVP list (full list or single-MVP status patch); emitsmvp_progressto the dashboardannounce-plan-state-- Mirror plan-mode lifecycle (entered / clarify-asked / clarify-answered / plan-presented / resolved) so the dashboard's plan-mode panel reflects the terminal state
| Tier | Model | Role |
|---|---|---|
| Meeting runner (main session) | whatever user picked in Claude Code | Dispatches specialists, runs MCP tools, calls EnterPlanMode, dispatches workers, verifies |
| Specialist subagent | inherits from session | One per speaker turn: planner / architect / engineer / verifier / product-manager / researcher |
| Worker subagent | inherits from session | One per parallel implementation task |
No model hard-coding anywhere. All agents/*.md files use model: inherit.
TIER_CONFIGS in src/types/agent.ts has maxTurns only — no model field.
Switching /model in the user's Claude Code session changes the whole pipeline.
Specialist roles: planner, architect, engineer, verifier, product-manager, researcher, plus worker for implementation.
- Planning: Read (planner always attends; facilitates, doesn't take positions)
- Architecture: Read, Grep, Glob
- Engineering: Read, Grep, Glob, Write, Edit, Bash
- Verification: Read, Grep, Glob, Bash (formerly QA; now also runs verification after implementation)
- Product: Read
- Research: Read, Grep, Glob, WebSearch
- ESM imports with .js extensions
- All timestamps: Date.now() (Unix ms)
- JSON fields in SQLite: serialize/deserialize in store functions
- Conventional commits: feat/fix/docs/refactor/test/chore
- Agent system prompts include core rules from rules.md
- Mock mode: set COLESLAW_MOCK=1 for development without Claude CLI
- Node.js >= 18 required
Before modifying anything under src/, agents/, or skills/:
- Write the test or structural assertion first.
src/logic → vitest test that fails because the code doesn't yet exist- plugin structure (agent files present/absent, skill contents, frontmatter) →
add/extend
test/plugin-structure.test.tswith a failing assertion
- Run tests. The new one must fail. If it passes, the test is wrong — it's not actually asserting the new behavior.
- Implement until the test goes green. No extra scope.
- Refactor if useful, with tests still green.
- Commit the test and the implementation together.
Unit-testable (TDD fully applies):
- MCP tool handlers (input validation, SQLite writes, event bus emission)
- Storage CRUD, state-bridge event application, type invariants
- Plugin structure (agent files, skill strings, frontmatter, marketplace.json version alignment)
Not unit-testable (vitest can't verify):
- Whether Claude's LLM actually dispatches specialists instead of role-playing them
- Whether meeting minutes end up in the user's language
- Whether the dashboard renders correctly in a browser
For those, runtime behavior is verified via manual smoke tests documented in
docs/smoke-tests.md. npm test passing is NEVER proof that a release works
end-to-end — the smoke-test checklist has to pass in a real session before calling
a version "ready".
- Flat dispatch (v0.6.0+) — main Claude session runs the whole pipeline
directly. No
orchestratorsubagent. Every speaker turn is a realAgent({ subagent_type: "open-coleslaw:<role>" })call followed byadd-transcriptwith the real response. Previously we had an orchestrator subagent that role-played every specialist, which defeated the multi-agent premise — fixed. - Skill as runbook —
skills/using-open-coleslaw/SKILL.mdis the full pipeline instruction set that the main session follows. Loaded at session start via thesession-starthook. - Model inheritance everywhere — no hard-coded model names. Agent .md
files use
model: inherit;TIER_CONFIGShas nomodelfield. - Agents respond in the user's language — detect from the original request and propagate through orchestrator → specialists. Minutes in the same language.
- Plan-mode-wrapped cycle (v0.6.5+) — the main session calls
EnterPlanMode()before the first planner dispatch of each planning cycle. The entire clarify + kickoff + design meeting runs inside plan mode; the synthesised plan surfaces viaExitPlanMode({ plan }). Disk writes (markdown minutes, INDEX.md, pending- comments rotation) happen AFTER user approval, not during the meeting. - Reverse-question clarify step (v0.6.5+) — kickoff planner has two sub-modes:
clarifyreturns eitherNEEDS_CLARIFICATION(≤4 structured questions, each with 2-5 concrete options) or the literal tokenREADY. When questions come back, the main session surfaces them viaAskUserQuestionand re-dispatches planner indecomposesub-mode with the answers. - Kickoff meeting breaks user request into ordered MVPs before any design meeting
- Meetings terminate on consensus, not round count (MAX_ROUNDS=10 escalates to @mention)
- Planner always attends; facilitates and synthesizes, doesn't take technical positions
- Dynamic attendee selection — not every specialist attends every meeting
- Specialists and workers are always dispatched by the main session, destroyed after task completion.
- Minutes saved to project's
docs/open-coleslaw/with INDEX.md (per-project, survives compact/clear) - Dashboard renders a meeting thread + comments UI; browser comments flow through a file queue
- Stop hook checks context usage at cycle end (
.cycle-completemarker) and suggests/compactor/clearabove ~30% - Self-extending: creates new capabilities on demand
- Rule priority: rules.md > CLAUDE.md > conversation context
- MVP cycle:
EnterPlanMode→ kickoff (first MVP only) → design →ExitPlanMode({ plan })→ user approves → workers → verify → fail? verify-retry (re-enter plan mode) → pass? next MVP re-enters plan mode. The main session runs every step.