open-coleslaw 0.6.3 โ†’ 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,140 +1,164 @@
1
1
  # ๐Ÿฅฌ Open Coleslaw
2
2
 
3
- **Just type your prompt. Like coleslaw โ€” it's already prepared, just scoop and eat.**
3
+ [![npm version](https://img.shields.io/npm/v/open-coleslaw.svg?style=flat-square&color=00b894)](https://www.npmjs.com/package/open-coleslaw)
4
+ [![license](https://img.shields.io/npm/l/open-coleslaw.svg?style=flat-square&color=6c5ce7)](LICENSE)
5
+ [![node](https://img.shields.io/node/v/open-coleslaw.svg?style=flat-square&color=0984e3)](package.json)
6
+ [![downloads](https://img.shields.io/npm/dm/open-coleslaw.svg?style=flat-square&color=fdcb6e)](https://www.npmjs.com/package/open-coleslaw)
4
7
 
5
- Open Coleslaw is a multi-agent orchestrator plugin for Claude Code. It gives you an entire AI engineering team โ€” planner, architect, engineer, verifier, product manager, researcher โ€” that organizes itself, runs real round-robin meetings, only ends a meeting when everyone actually agrees, and executes in MVP-sized cycles.
8
+ > **Type a prompt. Get a real multi-agent engineering team. No commands to learn.**
6
9
 
7
- Zero commands to memorize. Zero tools to call manually. Your AI team is already hired.
10
+ Open Coleslaw is a multi-agent orchestrator plugin for [Claude Code](https://claude.com/claude-code). Every prompt runs through a **kickoff meeting โ†’ per-MVP design meeting โ†’ plan mode โ†’ parallel workers โ†’ verification** pipeline โ€” with each speaker turn being a real `Agent` dispatch, not role-play.
8
11
 
9
- ## How It Works
12
+ ![Open Coleslaw dashboard](docs/assets/dashboard.png)
10
13
 
11
- You type a prompt like *"Build me a balance game app"*. That's it.
14
+ ---
12
15
 
16
+ ## Quick Start
17
+
18
+ In Claude Code:
19
+
20
+ ```
21
+ /plugin marketplace add sshworld/open-coleslaw
22
+ /plugin install open-coleslaw@sshworld
13
23
  ```
14
- You: "Build me a balance game app"
15
24
 
16
- The main Claude session (acting as meeting runner) runs the whole pipeline:
25
+ Open a new session, then just type what you want:
17
26
 
18
- โ‘  Kickoff meeting
19
- ยท Dispatches open-coleslaw:planner to decompose request into ordered MVPs
20
- ยท Minutes written to docs/open-coleslaw/
27
+ ```
28
+ Build me a balance-game web app
29
+ ```
21
30
 
22
- โ‘ก Per MVP โ€” Design meeting (round-robin, consensus-based)
23
- ยท Dispatches open-coleslaw:architect โ†’ speech โ†’ add-transcript
24
- ยท Dispatches open-coleslaw:engineer โ†’ speech โ†’ add-transcript
25
- ยท Dispatches open-coleslaw:verifier โ†’ speech โ†’ add-transcript
26
- ยท After each round, planner runs a consensus check (AGREE / DISAGREE)
27
- ยท Repeats until everyone AGREEs (max 10 rounds, then @mention escalation)
28
- ยท Planner synthesizes minutes โ†’ docs/open-coleslaw/
31
+ That's it. Watch the meeting unfold at **http://localhost:35143**.
29
32
 
30
- โ‘ข Plan Mode
31
- ยท EnterPlanMode โ†’ plan from minutes โ†’ user approves
33
+ ---
32
34
 
33
- โ‘ฃ Implementation
34
- ยท Dispatches N ร— open-coleslaw:worker in parallel
35
+ ## What You Type vs What Happens
35
36
 
36
- โ‘ค Verification
37
- ยท open-coleslaw:verifier runs tests / build
38
- ยท PASS โ†’ next MVP ยท FAIL โ†’ verify-retry meeting โ†’ re-plan
37
+ | You type | The pipeline runs |
38
+ |---|---|
39
+ | `Build me a balance-game web app` | Kickoff โ†’ 3 MVPs โ†’ per-MVP design meeting โ†’ plan mode โ†’ workers โ†’ verified |
40
+ | `Fix the flaky login test` | Kickoff (1 MVP) โ†’ design meeting w/ engineer + verifier โ†’ plan โ†’ fix โ†’ green |
41
+ | `Should we migrate from Redux to Zustand?` | Design meeting w/ architect + engineer + researcher โ†’ minutes with recommendation |
39
42
 
40
- โ‘ฅ All MVPs done โ†’ touch .cycle-complete โ†’ final report
41
- ```
43
+ You don't call a tool. You don't pick a department. You don't write prompt templates.
44
+ The main Claude session **dispatches each specialist as a real subagent** and
45
+ collects their actual output into the meeting transcript.
42
46
 
43
- Every speaker turn is a **real** `Agent` dispatch. No role-playing. The
44
- dashboard at `localhost:35143` shows each specialist's actual comment appear
45
- in the thread as the main session dispatches them.
47
+ ---
46
48
 
47
- You never call a tool. You never pick a department. You never manage an agent.
49
+ ## Why Open Coleslaw
48
50
 
49
- Meeting minutes are saved to `docs/open-coleslaw/` in your project, so they persist even if you `/compact` or `/clear` your Claude Code context between MVPs.
51
+ - **Real multi-agent, not one-LLM role-play.** Every speaker turn is a separate `Agent` dispatch with its own context. The dashboard shows the real comments as they stream in.
52
+ - **Consensus, not round count.** A meeting only ends when everyone actually agrees. If 10 rounds pass without consensus, you get an `@mention` to break the tie.
53
+ - **Minutes survive compaction.** Everything is written to `docs/open-coleslaw/` inside your project. `/compact` and `/clear` don't lose meeting history.
54
+ - **Model-agnostic.** No hardcoded model names anywhere. Switch with `/model` and the whole pipeline follows โ€” Opus, Sonnet, Haiku, or whatever ships next.
50
55
 
51
- ## Installation
56
+ ---
52
57
 
53
- In Claude Code:
58
+ ## The Team
54
59
 
55
- ```
56
- /plugin marketplace add sshworld/open-coleslaw
57
- /plugin install open-coleslaw@sshworld
58
- ```
60
+ 7 agents, all dispatched by the main Claude session:
59
61
 
60
- Then start a new session. That's it โ€” every prompt now goes through the orchestrator pipeline.
62
+ | Agent | Role |
63
+ |---|---|
64
+ | `planner` | Chairs the meeting. Runs rounds, checks consensus, synthesises minutes. **Always attends.** |
65
+ | `architect` | System design, API contracts, schemas |
66
+ | `engineer` | Implementation feasibility, code quality |
67
+ | `verifier` | Test strategy at design time; runs tests/build at verify time |
68
+ | `product-manager` | Requirements, user stories, prioritisation |
69
+ | `researcher` | Codebase exploration, prior art, library comparison |
70
+ | `worker` | Writes code (N workers in parallel during implementation) |
61
71
 
62
- ### Verify It Works
72
+ Planner is mandatory. The other specialists are convened dynamically based on what the task actually needs.
63
73
 
64
- Start a new session and type anything:
74
+ ---
75
+
76
+ ## The Pipeline
65
77
 
66
78
  ```
67
- Design a REST API for a todo app
79
+ You type a prompt
80
+ โ”‚
81
+ โ–ผ
82
+ [EnterPlanMode] โ† planning cycle begins
83
+ โ”‚
84
+ โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€ Phase 1: Clarify + Kickoff โ”€โ”€โ”€โ”€โ”
85
+ โ”‚ planner (clarify) โ†’ AskUserQuestion? โ”‚
86
+ โ”‚ planner (decompose) โ†’ MVP list โ”‚
87
+ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
88
+ โ”‚
89
+ โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€ Phase 2: Design meeting (per MVP) โ”€โ”€โ”
90
+ โ”‚ planner โ†’ architect โ†’ engineer โ†’ verifier โ”‚
91
+ โ”‚ consensus check each round โ”‚
92
+ โ”‚ planner synthesises minutes โ”‚
93
+ โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
94
+ โ”‚
95
+ [ExitPlanMode({ plan })] โ† user approves
96
+ โ”‚
97
+ approve โ”€โ–บ write minutes markdown + INDEX.md
98
+ โ”‚
99
+ Phase 4: workers (parallel) โ”€โ–บ Phase 5: verifier
100
+ โ”‚
101
+ pass โ†’ next MVP (re-enter plan mode)
102
+ fail โ†’ verify-retry meeting (plan mode again)
68
103
  ```
69
104
 
70
- You should see the orchestrator agent being dispatched and a kickoff meeting starting automatically.
105
+ The whole **planning cycle** โ€” from the first planner dispatch through the
106
+ synthesised plan โ€” runs inside Claude Code's native plan mode. Implementation
107
+ and verification happen outside plan mode. Each MVP is its own cycle.
71
108
 
72
- ## The Pipeline (flat)
109
+ When all MVPs pass verification, the main session touches a marker file and the Stop hook checks your context usage โ€” if you're over ~30%, it suggests running `/compact` or `/clear`. Minutes on disk mean you lose nothing.
73
110
 
74
- There is no orchestrator subagent any more. The **main Claude session** runs
75
- the whole pipeline โ€” dispatching planner + specialists one-by-one and collecting
76
- their real output into `add-transcript`. This is what makes "multi-agent" mean
77
- multi-agent: each speaker turn is a fresh `Agent` call with its own context, not
78
- one LLM role-playing every role.
111
+ ---
79
112
 
80
- ```
81
- Kickoff โ†’ per-MVP design meeting โ†’ Plan Mode โ†’ Workers โ†’ Verify โ†’ (loop)
82
- ```
113
+ ## Dashboard
83
114
 
84
- Verification failure doesn't abort the cycle โ€” it opens a focused
85
- `verify-retry` meeting and re-plans the fix.
115
+ A live meeting viewer at **http://localhost:35143**:
86
116
 
87
- When the whole cycle ends the orchestrator touches a marker file, and the `Stop` hook checks your context usage. If you're over ~30%, it suggests running `/compact` or `/clear` before the next task. Minutes on disk mean you lose nothing.
117
+ - **Current meeting as a thread** โ€” speakers post comments, stance badges (AGREE / DISAGREE / SPEAKING) appear inline
118
+ - **MVP progress panel** โ€” pending / in-progress / done
119
+ - **Comment from the browser** โ€” type a note straight into the meeting; it's picked up at the next round boundary
120
+ - **Per-project tabs** โ€” multiple terminals on the same project merge into one tab
121
+ - **Past meetings** โ€” survives MCP restart (rehydrated from markdown minutes on disk)
88
122
 
89
- ## The Agent Cast
123
+ ---
90
124
 
91
- ```
92
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
93
- โ”‚ Main Claude session โ”‚ โ† You. Runs the pipeline directly.
94
- โ”‚ (dispatches everyone) โ”‚
95
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
96
- โ”‚
97
- Kickoff โ†’ per-MVP design loop
98
- โ”‚
99
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
100
- โ–ผ โ–ผ โ–ผ โ–ผ
101
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
102
- โ”‚ Planner โ”‚ โ”‚ Architectโ”‚ โ”‚ Engineer โ”‚ โ”‚ Verifier โ”‚ + product-manager /
103
- โ”‚ (chair) โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ researcher as needed
104
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
105
- Always Dynamic Dynamic Dynamic
106
- โ”‚
107
- Plan Mode โ†’ User approves
108
- โ”‚
109
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
110
- โ–ผ โ–ผ โ–ผ
111
- โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
112
- โ”‚Worker 1โ”‚ โ”‚Worker 2โ”‚ โ€ฆ โ”‚Worker Nโ”‚ โ† Parallel implementation
113
- โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
114
- โ”‚
115
- Verifier runs tests
116
- / \
117
- Pass Fail โ†’ verify-retry meeting
118
- โ†“
119
- Next MVP (or done)
120
- ```
125
+ ## Philosophy
121
126
 
122
- **6 Specialist agents** (you dispatch each one yourself):
123
- Planner, Architect, Engineer, Verifier, Product Manager, Researcher. Plus Worker (parallelized for implementation).
127
+ ### The Coleslaw Principle
124
128
 
125
- The **planner always attends** โ€” chairs the meeting, runs the round-robin, drives consensus. Other specialists are convened dynamically based on the task.
129
+ Coleslaw is a side dish that's already made. You don't prepare it โ€” you just eat it. This plugin works the same way. You don't configure agents, define workflows, or call tools. You describe what you want, and the system figures out the rest.
126
130
 
127
- ## Meetings That Actually End on Agreement
131
+ ### Key Decisions
128
132
 
129
- Rounds are not fixed. After every round the planner asks each participant AGREE or DISAGREE. The meeting only proceeds to synthesis when everyone agrees. If round 10 passes without consensus, the planner escalates via `@mention` for you to decide.
133
+ - **The orchestrator is your proxy, not a CEO.** You are the decision-maker. The orchestrator acts on your behalf but escalates important choices via `@mention`.
134
+ - **Kickoff first.** Every non-trivial request starts by breaking itself into ordered MVPs.
135
+ - **Consensus, not round count.** A meeting ends when everyone actually agrees (or you're asked to break a tie).
136
+ - **Minutes are the real artifact.** They survive `/compact` and `/clear` โ€” your Claude Code context is disposable.
137
+ - **TDD by default.** The engineer and verifier draft tests before workers start writing code.
130
138
 
131
- This is deliberately slower than a fixed-round meeting โ€” but each MVP ends with a real decision, not a paper one.
139
+ ---
132
140
 
133
- ## What's Inside
141
+ ## Development
134
142
 
135
- ### 15 MCP Tools (orchestrator calls these โ€” you never do)
143
+ ```bash
144
+ git clone https://github.com/sshworld/open-coleslaw.git
145
+ cd open-coleslaw
146
+ npm install
147
+ npm run build
148
+ npm test # 260 tests
149
+ npm run lint # type-check only
136
150
 
137
- | Tool | What It Does |
151
+ COLESLAW_MOCK=1 node dist/index.js # run without the Claude CLI
152
+ ```
153
+
154
+ See [`CLAUDE.md`](CLAUDE.md) and [`docs/smoke-tests.md`](docs/smoke-tests.md) before shipping a release โ€” unit tests alone don't catch multi-agent regressions.
155
+
156
+ ---
157
+
158
+ <details>
159
+ <summary><strong>๐Ÿ›  15 MCP tools</strong> (the pipeline calls these โ€” you don't)</summary>
160
+
161
+ | Tool | What it does |
138
162
  |------|-------------|
139
163
  | `start-meeting` | Creates a meeting record (kickoff / design / verify-retry) |
140
164
  | `add-transcript` | Saves a speaker's turn |
@@ -145,99 +169,43 @@ This is deliberately slower than a fixed-round meeting โ€” but each MVP ends wit
145
169
  | `get-task-report` | Shows execution results per department |
146
170
  | `get-agent-tree` | Displays the agent hierarchy (bookkeeping) |
147
171
  | `respond-to-mention` | Resolves a pending decision escalated by an agent |
148
- | `get-mentions` | Lists pending @mention decisions |
172
+ | `get-mentions` | Lists pending `@mention` decisions |
149
173
  | `cancel-meeting` | Stops a meeting and cascades to workers |
150
174
  | `list-meetings` | Shows meeting history |
151
175
  | `create-capability` | Self-extends the plugin with new hooks/skills |
152
176
  | `get-cost-summary` | Tracks spend per agent/meeting/department |
153
177
  | `chain-meeting` | Links meetings โ€” previous minutes feed the next |
154
178
 
155
- ### 7 Agents (all dispatched by the main Claude session via the Agent tool)
156
-
157
- | Agent | Role |
158
- |-------|------|
159
- | `planner` | Runs the meeting, chairs rounds, checks consensus, synthesises minutes |
160
- | `architect` | System design, API contracts, schemas |
161
- | `engineer` | Implementation feasibility, code quality |
162
- | `verifier` | Testing strategy at design time; tests/build at verify time |
163
- | `product-manager` | Requirements, user stories, prioritisation |
164
- | `researcher` | Codebase exploration, prior art, library comparison |
165
- | `worker` | Writes code (N workers in parallel) |
179
+ </details>
166
180
 
167
- ### 7 Skills
181
+ <details>
182
+ <summary><strong>๐ŸŽฏ 7 skills</strong> (the plugin registers these in your session)</summary>
168
183
 
169
184
  | Skill | Purpose |
170
185
  |-------|---------|
171
- | `using-open-coleslaw` | Injected at session start โ€” ensures all requests go through the pipeline |
172
- | `meeting` | Dispatches the orchestrator for the meeting โ†’ plan โ†’ implement flow |
173
- | `status` | Shows active meetings, agents, pending mentions |
174
- | `dashboard` | Opens the real-time dashboard |
175
- | `mention` | Handles pending @mention decisions |
176
- | `agents` | Shows the agent hierarchy tree |
177
- | `minutes` | Browses past meeting minutes |
178
-
179
- ### Real-Time Meeting Dashboard
180
-
181
- A live meeting viewer at `http://localhost:35143`:
182
-
183
- - **Current meeting as a thread** โ€” speakers post comments, consensus stances are shown inline
184
- - **MVP progress panel** โ€” which MVPs are pending / in-progress / done
185
- - **User comment box** โ€” type a note straight into the meeting from the browser; the orchestrator picks it up at the next round boundary (file-queue routed to `docs/open-coleslaw/.pending-comments.jsonl`)
186
- - **Terminal comments also work** โ€” if you prompt Claude Code while a meeting is in progress, your prompt becomes a user turn in the thread
187
- - Per-project tabs (multiple terminals โ†’ multiple tabs); duplicate names auto-number: `project`, `project (1)`
188
-
189
- ### Self-Extending
190
-
191
- Ask for a workflow that doesn't exist yet, and the orchestrator creates it โ€” new hooks, skills, or automations โ€” registered for future use.
192
-
193
- ## Agent Tiers
194
-
195
- | Tier | Model | Role |
196
- |------|-------|------|
197
- | Meeting runner | inherits from user session | The main Claude session itself โ€” dispatches everything |
198
- | Specialist subagent | inherits from user session | Dispatched per speaker turn |
199
- | Worker subagent | inherits from user session | Dispatched per implementation task |
200
-
201
- **No model is hard-coded.** Every specialist, every worker runs on whatever
202
- model you've selected in your Claude Code session (Opus, Sonnet, Haiku, or
203
- anything Anthropic ships next). Switch models with `/model` and the whole
204
- pipeline follows.
186
+ | `using-open-coleslaw` | Injected at session start โ€” the full pipeline runbook |
187
+ | `meeting` | Shortcut pointer to the runbook |
188
+ | `status` | Active meetings, agents, pending mentions |
189
+ | `dashboard` | Opens the live dashboard |
190
+ | `mention` | Handle pending `@mention` decisions |
191
+ | `agents` | Show the agent hierarchy |
192
+ | `minutes` | Browse past meeting minutes |
205
193
 
206
- ## Philosophy
207
-
208
- ### The Coleslaw Principle
209
-
210
- Coleslaw is a side dish that's already made. You don't prepare it โ€” you just eat it. This plugin works the same way. You don't configure agents, define workflows, or call tools. You describe what you want, and the system figures out the rest.
211
-
212
- ### Key Decisions
213
-
214
- - **The Orchestrator is your proxy, not a CEO.** You are the decision-maker. The orchestrator acts on your behalf but escalates important choices via @mention.
215
- - **Kickoff first.** Every non-trivial request starts by breaking itself into ordered MVPs.
216
- - **Consensus, not round count.** A meeting ends when everyone actually agrees (or you are asked to break a tie).
217
- - **Minutes are the real artifact.** They survive `/compact` and `/clear` โ€” your Claude Code context is disposable.
218
- - **Agents check before they code.** Every specialist reads the project's state before proposing anything.
194
+ </details>
219
195
 
220
- ## Development
196
+ <details>
197
+ <summary><strong>๐Ÿงฉ Self-extension</strong></summary>
221
198
 
222
- ```bash
223
- git clone https://github.com/sshworld/open-coleslaw.git
224
- cd open-coleslaw
225
- npm install
226
- npm run build
199
+ Ask for a workflow that doesn't exist yet (a new hook, a new skill, a custom automation) and the pipeline creates it, registered for future use. Powered by the `create-capability` MCP tool.
227
200
 
228
- # Run with mock agents (no Claude CLI needed)
229
- COLESLAW_MOCK=1 node dist/index.js
201
+ </details>
230
202
 
231
- # Run tests
232
- npm test
233
-
234
- # Type check
235
- npm run lint
236
- ```
203
+ ---
237
204
 
238
205
  ## Contributing
239
206
 
240
- See [CLAUDE.md](CLAUDE.md) for contributor guidelines.
207
+ See [CLAUDE.md](CLAUDE.md). TDD is the default โ€” write the failing test or
208
+ structural assertion first, then implement.
241
209
 
242
210
  ## License
243
211
 
package/dist/index.js CHANGED
@@ -2500,7 +2500,10 @@ var CostTracker = class {
2500
2500
  byDepartment[leader.department] = (byDepartment[leader.department] ?? 0) + cost;
2501
2501
  }
2502
2502
  }
2503
- } catch {
2503
+ } catch (err) {
2504
+ logger.debug(
2505
+ `Cost tracker: DB aggregation skipped (${err instanceof Error ? err.message : String(err)})`
2506
+ );
2504
2507
  }
2505
2508
  const filteredEntries = meetingId ? this.entries.filter((e) => e.meetingId === meetingId) : this.entries;
2506
2509
  for (const entry of filteredEntries) {
@@ -3976,6 +3979,7 @@ var StateBridge = class extends EventEmitter2 {
3976
3979
  if (past.length === 0) return;
3977
3980
  const current = this.projects.get(info.projectPath);
3978
3981
  if (!current) return;
3982
+ if (current.pastMeetings.length > 0) return;
3979
3983
  current.pastMeetings = past;
3980
3984
  logger.info(
3981
3985
  `Hydrated ${past.length} past meeting(s) for ${displayName}`
@@ -4330,7 +4334,10 @@ function startDashboard(options) {
4330
4334
  } else if (msg.type === "ping") {
4331
4335
  ws.send(JSON.stringify({ type: "pong" }));
4332
4336
  }
4333
- } catch {
4337
+ } catch (err) {
4338
+ logger.debug(
4339
+ `Malformed WebSocket message: ${err instanceof Error ? err.message : String(err)}`
4340
+ );
4334
4341
  }
4335
4342
  });
4336
4343
  });
@@ -4359,7 +4366,10 @@ async function main() {
4359
4366
  const sessionId = randomUUID();
4360
4367
  const projectPath = process.cwd();
4361
4368
  const projectName = projectPath.split("/").pop() ?? "unknown";
4362
- startDashboard({ sessionId, projectPath, projectName }).catch(() => {
4369
+ startDashboard({ sessionId, projectPath, projectName }).catch((err) => {
4370
+ logger.warn(
4371
+ `Dashboard startup failed: ${err instanceof Error ? err.message : String(err)}`
4372
+ );
4363
4373
  });
4364
4374
  }
4365
4375
  const server = createServer();
@@ -4367,7 +4377,9 @@ async function main() {
4367
4377
  await server.connect(transport);
4368
4378
  }
4369
4379
  main().catch((error) => {
4370
- console.error("Fatal error:", error);
4380
+ logger.error(
4381
+ `Fatal error: ${error instanceof Error ? error.message : String(error)}`
4382
+ );
4371
4383
  process.exit(1);
4372
4384
  });
4373
4385
  //# sourceMappingURL=index.js.map