kaizen-agent 1.7.9 → 1.8.0

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.
Files changed (47) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +694 -658
  3. package/agents/kaizen-builder.md +82 -77
  4. package/agents/kaizen-planner.md +250 -250
  5. package/agents/kaizen-reviewer.md +127 -127
  6. package/cli/board.test.ts +55 -0
  7. package/cli/dashboard.ts +1188 -1187
  8. package/cli/install.ts +76 -3
  9. package/cli/publish-gh.sh +27 -27
  10. package/cli/release.sh +45 -45
  11. package/cli/settings.ts +7 -3
  12. package/cli/sources.test.ts +494 -0
  13. package/cli/sources.ts +323 -0
  14. package/cli/state.test.ts +422 -197
  15. package/cli/state.ts +989 -700
  16. package/cli/web.ts +182 -11
  17. package/commands/kaizen-abort.md +5 -5
  18. package/commands/kaizen-approve.md +5 -5
  19. package/commands/kaizen-auto.md +6 -6
  20. package/commands/kaizen-backlog.md +5 -5
  21. package/commands/kaizen-config.md +5 -5
  22. package/commands/kaizen-full.md +5 -5
  23. package/commands/kaizen-gather.md +5 -0
  24. package/commands/kaizen-init.md +5 -5
  25. package/commands/kaizen-install.md +5 -5
  26. package/commands/kaizen-lite.md +5 -5
  27. package/commands/kaizen-plan.md +6 -6
  28. package/commands/kaizen-reject.md +6 -6
  29. package/commands/kaizen-review.md +6 -6
  30. package/commands/kaizen-run.md +5 -5
  31. package/commands/kaizen-status.md +5 -5
  32. package/package.json +3 -1
  33. package/skills/kaizen/README.md +283 -281
  34. package/skills/kaizen/SKILL.md +334 -440
  35. package/skills/kaizen/adapters.md +84 -77
  36. package/skills/kaizen/config.default.yml +181 -167
  37. package/skills/kaizen/gather.md +50 -0
  38. package/skills/kaizen/install.md +42 -0
  39. package/skills/kaizen/settings.md +52 -0
  40. package/skills/kaizen/spec-build.md +131 -119
  41. package/skills/kaizen/spec-main.md +109 -104
  42. package/skills/kaizen/spec-plan.md +201 -201
  43. package/skills/kaizen/spec-review.md +121 -121
  44. package/skills/kaizen/spec.md +154 -153
  45. package/skills/kaizen/status.md +43 -0
  46. package/skills/kaizen-help/SKILL.md +131 -129
  47. package/web/board.html +292 -125
package/README.md CHANGED
@@ -1,658 +1,694 @@
1
- <div align="center">
2
- <img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/main/assets/banner.png" alt="kaizen" width="760">
3
- </div>
4
-
5
- <p align="center"><i>Your AI agent shows you the plan before it does the work,<br>and a second agent checks what it did.</i></p>
6
-
7
- <p align="center">
8
- <a href="https://github.com/hfadhlullah/kaizen/stargazers"><img alt="stars" src="https://img.shields.io/github/stars/hfadhlullah/kaizen?style=social"></a>
9
- <a href="https://www.npmjs.com/package/kaizen-agent"><img alt="npm" src="https://img.shields.io/npm/v/kaizen-agent?color=2d50a5&label=npm"></a>
10
- <a href="https://github.com/hfadhlullah/kaizen/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/npm/l/kaizen-agent?color=2d50a5"></a>
11
- <img alt="dependencies" src="https://img.shields.io/badge/dependencies-0-2d50a5">
12
- <img alt="works with" src="https://img.shields.io/badge/Claude%20Code%20%C2%B7%20Codex%20%C2%B7%20Antigravity-2d50a5">
13
- </p>
14
-
15
- ---
16
-
17
- macOS, Linux, WSL — one paste:
18
-
19
- ```bash
20
- curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
21
- ```
22
-
23
- Windows PowerShell — one paste:
24
-
25
- ```powershell
26
- irm bun.sh/install.ps1 | iex; & "$env:USERPROFILE\.bun\bin\bunx.exe" kaizen-agent
27
- ```
28
-
29
- Already have Bun? `bunx kaizen-agent`.
30
-
31
- ---
32
-
33
- ## The problem
34
-
35
- You ask an AI to do something real — write the launch email, draft the policy,
36
- build the feature, plan the migration. It goes quiet, then hands back a finished
37
- thing.
38
-
39
- Now the work is yours. What did it actually change? Did it understand what you
40
- meant? Is any of it wrong in a way you would only notice next week? And if it
41
- misread you in the first thirty seconds, everything after that was wasted.
42
-
43
- kaizen puts two checkpoints in that gap.
44
-
45
- **Before** it starts, you see a plan and say yes or no. **After** it finishes, a
46
- second agent — one that never saw the first agent's reasoning, so it has nothing to
47
- defend — checks the work and tells you what is wrong. You decide what gets fixed.
48
-
49
- ## See it
50
-
51
- Pick whichever looks like your work. The five stages are identical in all of them —
52
- what changes is what *done* and *wrong* mean, which kaizen works out from your
53
- request rather than asking you.
54
-
55
- <details open>
56
- <summary><b>A customer email</b> — pricing change announcement</summary>
57
-
58
- ```
59
- you /kaizen rewrite the onboarding email — the new pricing starts on the 1st
60
-
61
- kaizen Here is the plan.
62
-
63
- This is a customer email, not a policy page.
64
- Done means: a customer knows what changes, when, and what to do — in one read.
65
- Wrong means: a claim we cannot stand behind, or someone thinks they are being
66
- charged more than they are.
67
-
68
- What I will do:
69
- 1. Rewrite the opening so the date and the amount come first
70
- 2. Add one line on what happens if they do nothing
71
- 3. Keep the existing sign-off and legal footer untouched
72
-
73
- Not doing: touching the pricing page itself — say the word if you want that too.
74
-
75
- Approve this plan? [ approve ] [ change something ]
76
-
77
- you approve
78
-
79
- kaizen Done, and reviewed. Two things found:
80
-
81
- 1. paragraph 2 high "Your price will not change" is not true for annual
82
- plans renewing after the 1st. Fix: name both cases.
83
- 2. subject line low 14 words, cut off on mobile. Fix: lead with the date.
84
-
85
- Fix them? [ both ] [ just 1 ] [ leave it ]
86
- ```
87
-
88
- Nobody told the reviewer to look for an untrue claim or a truncated subject line. It
89
- read the request, concluded this was a customer email, and reviewed it as one.
90
-
91
- </details>
92
-
93
- <details>
94
- <summary><b>Code</b> — a bug in checkout</summary>
95
-
96
- ```
97
- you /kaizen the discount field lets you enter more than 100%
98
-
99
- kaizen Here is the plan.
100
-
101
- This is a bug fix in the checkout code.
102
- Done means: a discount above 100 is rejected, and the existing tests still pass.
103
- Wrong means: valid discounts stop working.
104
-
105
- What I will do:
106
- 1. Add a check in apply_discount() — cart.py:9
107
- 2. Cover it with three tests — 0%, 100%, 101%
108
-
109
- Approve this plan?
110
-
111
- you approve
112
-
113
- kaizen Done, and reviewed.
114
- Verified: ran the suite — 47 passed, 0 failed. Before the change: 44 passed.
115
-
116
- One problem found:
117
-
118
- 1. cart.py:12 medium A discount of exactly 100 now returns 0 instead of
119
- being rejected. Fix: use > not >=.
120
- ```
121
-
122
- `done` is a passing suite, so the builder has to show the run and its numbers —
123
- before and after. "It should work" is not accepted in any track.
124
-
125
- </details>
126
-
127
- <details>
128
- <summary><b>Marketing</b> — a landing page for a launch</summary>
129
-
130
- ```
131
- you /kaizen landing page copy for the Pro tier launch
132
-
133
- kaizen Here is the plan.
134
-
135
- This is launch copy aimed at existing free users, not new visitors.
136
- Done means: a free user understands what Pro adds and what it costs, and can
137
- act without opening another page.
138
- Wrong means: an overclaim, a benefit we do not actually ship, or a price that
139
- disagrees with billing.
140
-
141
- What I will do:
142
- 1. Headline and subhead — lead with the one thing free users ask for most
143
- 2. Four benefits, each tied to a shipped feature
144
- 3. Price block, pulled from the billing config so it cannot drift
145
- 4. One CTA, repeated twice
146
-
147
- Out of scope: the pricing page, the in-app upgrade banner.
148
-
149
- Approve this plan?
150
-
151
- you approve
152
-
153
- kaizen Done, and reviewed. Three things found:
154
-
155
- 1. benefits 3 high "Unlimited exports" — the shipped limit is 500/month.
156
- 2. headline medium Names a competitor. Legal reviews those; flagging, not fixing.
157
- 3. CTA low "Get started" appears on the free signup too. Ambiguous.
158
- ```
159
-
160
- The reviewer checked each claim against what actually ships. Finding 2 it refused to
161
- fix on its own and handed to you — deliberately.
162
-
163
- </details>
164
-
165
- <details>
166
- <summary><b>Research</b> — a decision memo</summary>
167
-
168
- ```
169
- you /kaizen should we move from per-seat to usage-based pricing? write it up
170
-
171
- kaizen Here is the plan.
172
-
173
- This is a decision memo for the founders, not a market report.
174
- Done means: a recommendation with the reasoning shown, and the case against it
175
- stated fairly enough that someone could disagree on the evidence.
176
- Wrong means: a conclusion the evidence does not support, or only looking at
177
- the data that agrees with it.
178
-
179
- What I will do:
180
- 1. Pull the last 12 months of seat counts and usage from the billing export
181
- 2. Model both against actual accounts — who pays more, who pays less
182
- 3. Name the three accounts that break the model, and by how much
183
- 4. Recommend, with the strongest argument against it stated first
184
-
185
- Approve this plan?
186
-
187
- you approve
188
-
189
- kaizen Done, and reviewed. Two things found:
190
-
191
- 1. section 3 high The recommendation rests on 4 accounts out of 60. That
192
- is not stated where the conclusion is.
193
- 2. section 2 medium Churned accounts were excluded with no reason given —
194
- they are the ones the model treats worst.
195
- ```
196
-
197
- Nothing here was checked for tests or tone. `wrong` was defined as an unsupported
198
- leap and cherry-picked data, so that is what the reviewer went looking for.
199
-
200
- </details>
201
-
202
- <details>
203
- <summary><b>Operations</b> — a migration runbook</summary>
204
-
205
- ```
206
- you /kaizen runbook for moving the database to the new region on Saturday
207
-
208
- kaizen Here is the plan.
209
-
210
- This is a runbook someone else executes at 2am, not a description of a plan.
211
- Done means: a colleague can follow it start to finish without asking a question.
212
- Wrong means: a missing prerequisite, no way back, or a step that silently
213
- loses data.
214
-
215
- What I will do:
216
- 1. Prerequisites, with how to verify each one is true before starting
217
- 2. Steps in order, each with the exact command and what you should see
218
- 3. A rollback for every step that changes state
219
- 4. The point of no return, marked
220
-
221
- Approve this plan?
222
-
223
- you approve
224
-
225
- kaizen Done, and reviewed. Two things found:
226
-
227
- 1. step 7 critical No rollback after the DNS cutover, and it is not marked
228
- as the point of no return. Fix: mark it, add the TTL wait.
229
- 2. step 3 high Says "restore the backup" but never says which backup or
230
- how to confirm it is the right one.
231
- ```
232
-
233
- </details>
234
-
235
- ## The board
236
-
237
- `kaizen` opens a dashboard; **Board** is the screen where your work lives. Ideas you have
238
- not started sit on the left, runs sit under the stage they are actually in, and it redraws
239
- itself as your agents write to disk — a run that moves while you are looking at it moves on
240
- screen.
241
-
242
- ```
243
- Board ~/work/acme
244
-
245
- IDEA PLANNING BUILDING REVIEW DONE
246
- ────────────────────── ─────────────────── ──────────────── ───────────── ──────────────
247
- › · FAQ page for the ● q3 board memo ◐ billing runbook ● pricing ○ chapter three
248
- pricing change email
249
- ● oauth login ○ pricing
250
- · onboarding video research
251
- script, two minutes
252
-
253
- ↑↓←→ move n new e edit x reject d delete r run a all projects q back
254
- ● running ◐ stalled ◌ starting ● waiting on you ○ done · idea
255
- ```
256
-
257
- **Throw an idea in with `n`** and it lands in `<state.dir>/inbox.md`, one line each, in the
258
- same format a run's backlog already uses. `e` edits, `x` rejects with a reason, `d` deletes.
259
-
260
- **`r` starts a run from an idea** — it asks `full` or `lite`, then opens your configured
261
- agent with the request already typed. The idea retires from the board once a run exists
262
- that was started from its text, whoever started it, so the same work never appears twice.
263
- That check spans every project you have opened, because an idea thrown into the global
264
- inbox becomes a run inside whichever project you launched the agent in.
265
-
266
- **The dot is what the run is doing.** `●` cyan is running and `◐` is stalled — kaizen
267
- records no liveness signal anywhere, so "running" means the run's `state.json` has changed
268
- in the last half hour. A run whose terminal you closed three days ago shows as stalled,
269
- which is the distinction the board exists to make. `●` amber, with the name in red, is a
270
- run that cannot move until you decide something; the legend lists only the states actually
271
- on screen.
272
-
273
- **A run's stage is kaizen's, not yours.** You cannot drag a card between columns — a board
274
- that could do that would be lying about what happened. The one exception is `x` on a run
275
- card, which abandons it: the same transition `/kaizen abort` makes, with your reason
276
- recorded in the run's approval file.
277
-
278
- `a` switches between this project and every project kaizen knows about. Below a hundred
279
- columns the board stacks into a list rather than squeezing five columns into sixty.
280
-
281
- ### In a browser
282
-
283
- ```bash
284
- kaizen web
285
- ```
286
-
287
- serves the same board on `http://127.0.0.1:7420/` — loopback only, no account — and
288
- opens it in a Chromium-family browser as an app window when one is installed, otherwise
289
- in a tab.
290
-
291
- <img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/main/assets/board-web.png" alt="kaizen web board" width="760">
292
-
293
- Same columns, same files: an idea added here lands in `inbox.md`, a run
294
- started here opens your agent in a new terminal exactly as `r` does, and the board
295
- redraws as your agents write to disk. Mouse first; the TUI's keys still work. Click a card for its plan, review and
296
- backlog; `⋯` on a card runs, edits, rejects, abandons or archives. `Clear` on Done sends
297
- every finished run to the archive (`.kaizen/archive.md`, a list, nothing moves), and
298
- `Archive` in the strip shows what is there, with `Restore` on each card. The gear at the top right holds the browser's theme
299
- and every `kaizen settings` knob, same rows, same `config.yml`. `--port N` picks a port, `--no-open` just
300
- serves, the board opens on every project; `?all=0` in the URL narrows it to the one it was started in. `--daemon` starts the server
301
- detached so it outlives the terminal (pid kept in `~/.kaizen/web.pid`); `--stop` ends it. `kaizen web --shortcut` adds a launcher
302
- the OS can find — Spotlight on macOS, the app menu on Linux, a Desktop shortcut on Windows. Each one starts the board in the background (`--daemon`) and opens it; `kaizen web --stop` ends it.
303
-
304
- **Dictate instead of type.** Every text field on the board — a new idea, its notes, an
305
- edit, a reject reason, a note on a run — has a mic. Press it, talk, press it again; the
306
- words land at the caret next to whatever you had typed. Recognition is Whisper running
307
- inside the page, so audio never leaves your machine. The first press downloads the model
308
- from huggingface.co and caches it in the browser: `small` by default (about 410 MB,
309
- accurate across languages); `kaizen settings` → *Dictation model* — or the gear on the
310
- board — switches to `tiny`, `base`, or `large-v3-turbo` (about 1.5 GB, needs a capable GPU). The transformers.js library itself is fetched from jsDelivr the
311
- first time you press the mic in a session, so that first press needs the network; the
312
- model does not download again. Chromium and Edge qualify (Firefox falls back to the
313
- slower CPU path); a browser without a microphone API or WebAssembly shows no mic.
314
-
315
- ### Mouse
316
-
317
- Off by default. Turn it on in `kaizen settings` under `ui.mouse`, and clicking a row or
318
- card selects it, clicking it again opens or runs it, and the wheel scrolls — on the board,
319
- the menu, runs, backlog, projects and settings.
320
-
321
- It ships off because the trade is real: while the TUI holds the mouse, your terminal cannot
322
- select text with it, so copying a run id out of the dashboard stops working until you
323
- leave. Hold **Shift** and drag to select text anyway.
324
-
325
- ## Install
326
-
327
- Kaizen's installer and interactive dashboard require [Bun](https://bun.sh) — it is
328
- the only prerequisite. Pick your platform:
329
-
330
- <details open>
331
- <summary><b>Windows</b></summary>
332
-
333
- In PowerShell:
334
-
335
- ```powershell
336
- irm bun.sh/install.ps1 | iex; & "$env:USERPROFILE\.bun\bin\bunx.exe" kaizen-agent
337
- ```
338
-
339
- One line, because the shell that just installed Bun does not have it on `PATH` yet;
340
- the full path sidesteps that. Next time, plain `bunx kaizen-agent`.
341
-
342
- Git is not required. Where it is missing, kaizen copies itself into `%USERPROFILE%\kaizen`
343
- instead of cloning, and `bunx kaizen-agent` is also how you update. Links are made as
344
- directory junctions and file copies, so no administrator rights or Developer Mode are
345
- needed. WSL users can follow the Linux instructions instead.
346
-
347
- </details>
348
-
349
- <details>
350
- <summary><b>macOS</b></summary>
351
-
352
- ```bash
353
- curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
354
- ```
355
-
356
- Or `brew install oven-sh/bun/bun`, then `bunx kaizen-agent`.
357
-
358
- </details>
359
-
360
- <details>
361
- <summary><b>Linux</b></summary>
362
-
363
- ```bash
364
- curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
365
- ```
366
-
367
- The full path is there because the shell that just installed Bun does not have it on
368
- `PATH` until you open a new one. Next time, plain `bunx kaizen-agent`.
369
-
370
- </details>
371
-
372
- The installer walks you through where to install, prompts for your workflow preset (`medium`, `low`, or `ultra`), then tells you what to type next. Restart your editor afterwards.
373
-
374
- Run from inside a project it asks whether to install globally or for that project
375
- alone; anywhere else — your home directory, a plain folder, a script — it installs
376
- globally without asking, since a project install outside a project has nothing to
377
- belong to.
378
-
379
- **It installs for every agent you already have.** The skill folders follow the open
380
- Agent Skills standard, so the same workflow runs under any of them:
381
-
382
- | Agent | Gets | Stages run |
383
- |---|---|---|
384
- | Claude Code | Skills, the three stage agents, the slash commands | Each as its own subagent |
385
- | Codex | Skills | Sequentially, one session |
386
- | Antigravity | Skills | Parallel agents where available, else sequentially |
387
- | OpenCode, Cursor, Gemini CLI | Skills | Sequentially, one session |
388
-
389
- An agent counts as present if it has a config directory or a command on your PATH.
390
- Only what is already there is touched — installing does not create `~/.opencode` for
391
- someone who does not use OpenCode. Install again after adding an agent and it picks
392
- the new one up.
393
-
394
- **No agent yet?** kaizen does nothing on its own — it is a workflow an agent runs.
395
- If none is found, the installer says so and offers the list above, opening the
396
- install page for whichever you pick. Install it, run `kaizen` again, and carry on.
397
-
398
- The stage agents and slash commands are Claude Code's own formats and are not copied
399
- elsewhere; under the others you invoke the skill by name. `.kaizen/` is plain files
400
- either way, so a run started in one tool can be finished in another.
401
-
402
- Run `kaizen` anytime to open the terminal dashboard:
403
-
404
- ```
405
- ⠀⠀⠀⣰⠖⠾⣟⣛⠋⢉⣩⠽⢛⡽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
406
- ⠀⠀⢰⢻⠀⠀⢀⡬⠟⠉⢀⠴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
407
- ⠀⢠⠇⣾⡠⠞⢩⠤⢄⡚⣁⣀⣀⣀⢀⣠⠤⡄⠀⠀⠀⠀⠀⠀ █ █ ▄▀█ █ ▀▀█ █▀▀ █▄ █
408
- ⢠⣏⠔⣫⣀⡤⢸⠀⠀⠉⠁⠀⠀⠈⠉⠀⠀⡇⠀⠀⠀⠀⠀⠀ █▀▄ █▀█ █ ▄▀ ██▄ █ ▀█
409
- ⢾⠥⢾⡅⢧⠀⢸⠃⡤⠖⠢⡀⢀⠔⠲⢤⠘⡇⠀⠀⣀⣀⠀⠀ █ █ █ █ █ █▄▄ █▄▄ █ █
410
- ⠀⠀⠈⣇⠈⢠⣫⠞⠀⠘⢱⢣⡜⡎⠃⠀⠳⣝⡄⢠⠇⢻⢉⣷
411
- ⠀⠀⠀⠘⢆⠀⠑⢦⣀⡀⠈⠓⠚⠁⢀⣀⣤⣊⣠⢾⡀⢠⣿⠃ 0.7.2 plan · approve · build · review
412
- ⠀⠀⠀⠀⠈⠓⢄⠀⠀⠉⣉⣭⣭⣉⠉⠀⠈⢀⣠⢔⡩⠥⢥⡀ ~/Projects/app
413
- ⠀⠀⠀⠀⠀⠀⢠⡇⠀⡞⠁⠀⠀⠈⢳⠀⢰⣍⣠⠚⠧⡀⠀⡷ Claude Code, Codex, Antigravity, OpenCode, Gemini CLI
414
- ⠀⠀⠀⠀⠀⠀⠸⡇⠀⣇⠀⠀⠀⠀⣸⠀⢠⡏⠀⠀⢀⣳⠞⠁
415
- ⠀⠀⠀⠀⠀⠀⠀⠳⣀⣨⠥⠤⠶⠾⣅⣀⠞⠉⠉⠉⠉⠀⠀⠀
416
-
417
- ╭─ Runs ──────────────────────────────────╮ ╭─ Backlog — 4 open ──────────────────────────╮
418
- │ ● fix-discount waiting on you │ │ cart.py:12 low use > not >= │
419
- │ ● cache-headers in review │ │ headline med legal review │
420
- │ ● 3 done │ │ … 2 more │
421
- ╰─────────────────────────────────────────╯ ╰─────────────────────────────────────────────╯
422
-
423
- › All projects every project kaizen knows about
424
- Runs
425
- Backlog
426
- Settings
427
- Upgrade
428
- Quit
429
- ```
430
-
431
- It monitors your runs and backlog across all your projects without having to open an agent.
432
- Installing puts the `kaizen` command on your PATH, so updating later is:
433
-
434
- ```bash
435
- kaizen upgrade
436
- ```
437
-
438
- That pulls the latest workflow, relinks anything new, and clears the installer cache
439
- `bunx` keeps — which is what otherwise leaves you on an old version without saying
440
- so. `bunx kaizen-agent upgrade` does the same thing if you would rather not have the
441
- command. `kaizen --version` prints what is installed; `bunx kaizen-agent --version`
442
- prints what npm has.
443
-
444
- Then, in any project, just ask for something:
445
-
446
- ```
447
- /kaizen <what you want done>
448
- ```
449
-
450
- The first run sets the project up on its own — a `.kaizen/` folder holding the run's
451
- files. Nothing to initialise by hand. (`/kaizen-init` exists if you want to do it
452
- ahead of time, and the installer offers it for the project you install from.)
453
-
454
- Setup also adds a short section to the project's `CLAUDE.md`, so you can stop typing
455
- `/kaizen` entirely — ask for something the normal way and work worth a plan goes
456
- through the stages on its own. It draws the line at work worth a plan: a change
457
- across more than one file, anything with a migration or a rollback, a document
458
- someone else will act on. Questions and one-line fixes are answered, not staged.
459
- Delete that section to go back to `/kaizen` being explicit.
460
-
461
- That is the whole thing. Everything below is detail.
462
-
463
- ## How a run goes
464
-
465
- | | Stage | What happens |
466
- |---|---|---|
467
- | 1 | **Plan** | Reads your request and the existing material, writes a plan. Changes nothing. |
468
- | 2 | **You approve** | You see the plan and the work list. Say yes, or say what to change. |
469
- | 3 | **Build** | Does the work, then proves it — runs the tests, checks the claim against its source, walks the steps — and records what actually came back. |
470
- | 4 | **Review** | A different agent, which never saw stage 3's reasoning, checks the work and lists what is wrong, numbered and graded. |
471
- | 5 | **Fix** | Serious findings get fixed and re-checked, up to a limit. Anything left over is handed to you, never quietly dropped. |
472
-
473
- Each stage runs as its own agent with a clean slate, and writes a file before the
474
- next one starts. That is what makes stage 4 worth anything: a reviewer that watched
475
- itself do the work will defend it.
476
-
477
- Stage 3 is the one you can move. Set `build.executor` to `inline` and the agent you
478
- are already talking to does the work — you watch each step and can interrupt — or
479
- leave it as `subagent` and it is handed off and reported back, which keeps your
480
- conversation short and is the only workable choice on a big run. Set it to `ask` to
481
- be offered the choice each time you approve a plan. Stage 4 does not move: the
482
- reviewer is a separate agent either way, because that is the whole reason its
483
- findings are worth reading.
484
-
485
- ## How it knows what kind of work this is
486
-
487
- kaizen is not a software workflow. The same five stages hold for a book chapter, a
488
- launch email, a migration runbook, or a research memo — what changes is what
489
- *deliverable*, *done*, and *wrong* mean.
490
-
491
- Each run works that out for itself — its **track** — by answering three questions
492
- from your request:
493
-
494
- - **What is the deliverable?** A merged change, a chapter, a landing page, a runbook.
495
- - **What counts as done?** Tests pass. The chapter reads end to end. A colleague can
496
- follow the runbook unaided.
497
- - **What would make it wrong?** A security hole. A claim that is not true. A step
498
- that silently loses data.
499
-
500
- The third answer is what the reviewer becomes. A reviewer hunting race conditions in
501
- a book manuscript is worse than no reviewer at all, and the track is what prevents
502
- it. You are never asked to categorise your own request — it reads the request and
503
- tells you what it concluded, so you correct a sentence instead of filling in a form.
504
-
505
- ## Commands
506
-
507
- | Command | What it does |
508
- |---|---|
509
- | `/kaizen <request>` | Start a run |
510
- | `/kaizen-plan <request>` | Plan only — stop before anything is built |
511
- | `/kaizen-auto <request>` | No approval stops; report at the end |
512
- | `/kaizen-lite <request>` | Every stage in this session — cheap, and the reviewer has seen the work |
513
- | `/kaizen-full <request>` | Every stage its own cold agent — the independent review |
514
- | `/kaizen-review [target]` | Review something that already exists |
515
- | `/kaizen-status` | What is waiting on you, in flight, done |
516
- | `/kaizen-approve` | Approve whatever the run is waiting on |
517
- | `/kaizen-reject <reason>` | Send it back with a reason, or kill the run |
518
- | `/kaizen-run` | Carry on with an approved plan |
519
- | `/kaizen-backlog` | Everything noticed but not done, across all runs |
520
- | `/kaizen-abort` | Abandon the current run |
521
- | `/kaizen-config` | Show this project's settings and change them |
522
- | `/kaizen-init` | Set up the current project — optional, the first run does it |
523
- | `/kaizen-help` | The full card |
524
-
525
- ## What it writes
526
-
527
- Everything a run knows lives in files next to the work, not in a chat window:
528
-
529
- ```
530
- .kaizen/
531
- memory.md # what past reviews learned about this project
532
- runs/2026-09-07-onboarding-email/
533
- 00-request.md # what you asked, word for word
534
- 01-plan.md # the plan you approved
535
- 02-approval.md # what you decided, and why
536
- 03-impl.md # what changed, and the proof it works
537
- 04-review.md # findings, numbered and graded
538
- 06-backlog.md # what was noticed but not done
539
- ```
540
-
541
- Plain files, so you can read them, commit them, and pick a run back up tomorrow —
542
- or in another tool. kaizen also runs under Codex and Antigravity, and a run started
543
- in one can be finished in another. See [adapters.md](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/adapters.md).
544
-
545
- ## Settings
546
-
547
- `~/.kaizen/config.yml` — one file, every project. The three worth knowing:
548
-
549
- | Setting | Default | Meaning |
550
- |---|---|---|
551
- | `mode` | `approve` | `approve` stops for you; `auto` never does; `plan-only` stops after the plan |
552
- | `runner` | `full` | `full` gives each stage its own agent, so the reviewer never saw the work — several times the cost. `lite` runs every stage here, at about the cost of doing it by hand |
553
- | `build.executor` | `subagent` | Who does the work: a separate agent, `inline` in the current one, or `ask` each time |
554
- | `auto_fix.min_severity` | `high` | Findings this bad or worse get fixed without asking |
555
- | `approvals.plan` | `true` | Stop and show the plan before anything is built |
556
- | `ui.mouse` | `false` | Click to select, click again to act; while on, the terminal cannot select text |
557
- | `subagents.model` | `inherit` | Model the stage subagents run on: `inherit`, `opus`, `sonnet`, `haiku` (Claude Code only) |
558
- | `agent.<cmd>.model`, `agent.<cmd>.effort` | — | Model/effort the board launches a session with, per tool: `claude`, `codex`, `agy`, `opencode`, `gemini`. Model names are the tool's own (`agy models`) |
559
- | `subagents.effort` | `inherit` | Reasoning effort for the stage subagents: `inherit`, `low`, `medium`, `high` (Claude Code only) |
560
-
561
- ```bash
562
- kaizen settings
563
- ```
564
-
565
- opens a full-screen browser over the whole file — arrows to move and change, every
566
- change written as you make it, esc to close:
567
-
568
- ```
569
- kaizen settings ~/.kaizen/config.yml
570
-
571
- › preset medium
572
- mode approve
573
- runner full
574
- build.executor subagent
575
- approvals.plan true
576
- approvals.review false
577
- auto_fix.enabled true
578
- auto_fix.min_severity high
579
- auto_fix.max_iterations 2
580
- ...
581
-
582
- Quick preset — low: inline & manual, medium: balanced, ultra: autonomous subagents
583
-
584
- ↑↓ move · ←→ change · esc close saved preset = medium
585
- ```
586
-
587
- One project can differ: put a `.kaizen/config.yml` in it with just the keys to
588
- override, and it wins there while everything else follows the global file.
589
- It edits each line in place, so the comment above every key survives. `/kaizen-config`
590
- does the same thing from inside your agent if you would rather not leave it. Everything is also
591
- in [`config.default.yml`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/config.default.yml),
592
- with a comment on each key, if you would rather edit the file.
593
-
594
- ## Under the hood
595
-
596
- - [`SKILL.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/SKILL.md) — how the workflow behaves
597
- - [`spec.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/spec.md) — the tool-neutral contract every stage follows
598
- - [`adapters.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/adapters.md) — running it under Codex or Antigravity
599
-
600
- <details>
601
- <summary>Installer flags, updating, and installing without bun</summary>
602
-
603
- | Flag | Effect |
604
- |---|---|
605
- | *(none)* | Ask when standing in a project, otherwise install globally |
606
- | `--global` | Globally, no question asked |
607
- | `--project` | Into the current directory only |
608
- | `--check` | Report what is linked, exit non-zero if anything is missing |
609
- | `--force` | Replace a real file sitting where a link belongs |
610
- | `--preset <name>` | Pre-select workflow preset (`low`, `medium`, or `ultra`) |
611
- | `--yes` | Take every default, ask nothing |
612
- | `--verbose` | List every link instead of a one-line summary |
613
- | `upgrade` | Pull, relink, and clear the installer cache. No prompts. |
614
- | `uninstall` | Remove the links, the clone, and the launcher. Asks whether to keep your runs and settings. |
615
- | `uninstall --purge` | The same, and delete `~/.kaizen` and this project's `.kaizen/` too. |
616
- | `settings` | Open the settings browser for the nearest `.kaizen/`. Also `config`. |
617
-
618
- Uninstalling works the same on Linux, macOS and Windows — `kaizen uninstall`, or
619
- `bunx kaizen-agent uninstall` when the command itself is already gone. It offers three
620
- answers — keep your runs and settings, remove everything, or cancel — and takes the
621
- first without asking when the output is not a terminal. It lists what it removed; the `## Kaizen workflow` line in each project's `CLAUDE.md` is left for
622
- you to delete, since you may have edited around it.
623
-
624
- A global install also writes `~/.local/bin/kaizen` (`kaizen.cmd` in bun's bin
625
- directory on Windows), a two-line launcher pointing at
626
- the clone, so `kaizen upgrade` works from anywhere. It tells you if that directory is
627
- not on your PATH. `uninstall` removes it; `--project` installs skip it.
628
-
629
- Re-running is safe: correct links are left alone.
630
-
631
- `bunx` extracts a package once and reuses it without re-resolving, so a plain
632
- `bunx kaizen-agent` can keep running an old installer even after a new one is
633
- published. `upgrade` clears that copy, so the next run resolves fresh. The workflow
634
- itself — skills, agents, commands — comes from the clone and updates on any run.
635
-
636
- To work on kaizen itself, install from your own checkout so the links point at it:
637
-
638
- ```bash
639
- git clone https://github.com/hfadhlullah/kaizen.git ~/kaizen
640
- cd ~/kaizen && bun run cli/install.ts
641
- ```
642
-
643
- Without bun:
644
-
645
- ```bash
646
- mkdir -p ~/.claude/skills ~/.claude/agents ~/.claude/commands
647
- ln -s ~/kaizen/skills/kaizen ~/.claude/skills/kaizen
648
- ln -s ~/kaizen/skills/kaizen-help ~/.claude/skills/kaizen-help
649
- for f in ~/kaizen/agents/kaizen-*.md; do ln -s "$f" ~/.claude/agents/"$(basename "$f")"; done
650
- for f in ~/kaizen/commands/kaizen-*.md; do ln -s "$f" ~/.claude/commands/"$(basename "$f")"; done
651
- ```
652
-
653
- </details>
654
-
655
- ## License
656
-
657
- MIT. *Kaizen (改善) is Japanese for continuous improvement — small changes, checked
658
- as you go.*
1
+ <div align="center">
2
+ <img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/main/assets/banner.png" alt="kaizen" width="760">
3
+ </div>
4
+
5
+ <p align="center"><i>Your AI agent shows you the plan before it does the work,<br>and a second agent checks what it did.</i></p>
6
+
7
+ <p align="center">
8
+ <a href="https://github.com/hfadhlullah/kaizen/stargazers"><img alt="stars" src="https://img.shields.io/github/stars/hfadhlullah/kaizen?style=social"></a>
9
+ <a href="https://www.npmjs.com/package/kaizen-agent"><img alt="npm" src="https://img.shields.io/npm/v/kaizen-agent?color=2d50a5&label=npm"></a>
10
+ <a href="https://github.com/hfadhlullah/kaizen/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/npm/l/kaizen-agent?color=2d50a5"></a>
11
+ <img alt="dependencies" src="https://img.shields.io/badge/dependencies-0-2d50a5">
12
+ <img alt="works with" src="https://img.shields.io/badge/Claude%20Code%20%C2%B7%20Codex%20%C2%B7%20Antigravity-2d50a5">
13
+ </p>
14
+
15
+ ---
16
+
17
+ macOS, Linux, WSL — one paste:
18
+
19
+ ```bash
20
+ curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
21
+ ```
22
+
23
+ Windows PowerShell — one paste:
24
+
25
+ ```powershell
26
+ irm bun.sh/install.ps1 | iex; & "$env:USERPROFILE\.bun\bin\bunx.exe" kaizen-agent
27
+ ```
28
+
29
+ Already have Bun? `bunx kaizen-agent`.
30
+
31
+ ---
32
+
33
+ ## The problem
34
+
35
+ You ask an AI to do something real — write the launch email, draft the policy,
36
+ build the feature, plan the migration. It goes quiet, then hands back a finished
37
+ thing.
38
+
39
+ Now the work is yours. What did it actually change? Did it understand what you
40
+ meant? Is any of it wrong in a way you would only notice next week? And if it
41
+ misread you in the first thirty seconds, everything after that was wasted.
42
+
43
+ kaizen puts two checkpoints in that gap.
44
+
45
+ **Before** it starts, you see a plan and say yes or no. **After** it finishes, a
46
+ second agent — one that never saw the first agent's reasoning, so it has nothing to
47
+ defend — checks the work and tells you what is wrong. You decide what gets fixed.
48
+
49
+ ## See it
50
+
51
+ Pick whichever looks like your work. The five stages are identical in all of them —
52
+ what changes is what *done* and *wrong* mean, which kaizen works out from your
53
+ request rather than asking you.
54
+
55
+ <details open>
56
+ <summary><b>A customer email</b> — pricing change announcement</summary>
57
+
58
+ ```
59
+ you /kaizen rewrite the onboarding email — the new pricing starts on the 1st
60
+
61
+ kaizen Here is the plan.
62
+
63
+ This is a customer email, not a policy page.
64
+ Done means: a customer knows what changes, when, and what to do — in one read.
65
+ Wrong means: a claim we cannot stand behind, or someone thinks they are being
66
+ charged more than they are.
67
+
68
+ What I will do:
69
+ 1. Rewrite the opening so the date and the amount come first
70
+ 2. Add one line on what happens if they do nothing
71
+ 3. Keep the existing sign-off and legal footer untouched
72
+
73
+ Not doing: touching the pricing page itself — say the word if you want that too.
74
+
75
+ Approve this plan? [ approve ] [ change something ]
76
+
77
+ you approve
78
+
79
+ kaizen Done, and reviewed. Two things found:
80
+
81
+ 1. paragraph 2 high "Your price will not change" is not true for annual
82
+ plans renewing after the 1st. Fix: name both cases.
83
+ 2. subject line low 14 words, cut off on mobile. Fix: lead with the date.
84
+
85
+ Fix them? [ both ] [ just 1 ] [ leave it ]
86
+ ```
87
+
88
+ Nobody told the reviewer to look for an untrue claim or a truncated subject line. It
89
+ read the request, concluded this was a customer email, and reviewed it as one.
90
+
91
+ </details>
92
+
93
+ <details>
94
+ <summary><b>Code</b> — a bug in checkout</summary>
95
+
96
+ ```
97
+ you /kaizen the discount field lets you enter more than 100%
98
+
99
+ kaizen Here is the plan.
100
+
101
+ This is a bug fix in the checkout code.
102
+ Done means: a discount above 100 is rejected, and the existing tests still pass.
103
+ Wrong means: valid discounts stop working.
104
+
105
+ What I will do:
106
+ 1. Add a check in apply_discount() — cart.py:9
107
+ 2. Cover it with three tests — 0%, 100%, 101%
108
+
109
+ Approve this plan?
110
+
111
+ you approve
112
+
113
+ kaizen Done, and reviewed.
114
+ Verified: ran the suite — 47 passed, 0 failed. Before the change: 44 passed.
115
+
116
+ One problem found:
117
+
118
+ 1. cart.py:12 medium A discount of exactly 100 now returns 0 instead of
119
+ being rejected. Fix: use > not >=.
120
+ ```
121
+
122
+ `done` is a passing suite, so the builder has to show the run and its numbers —
123
+ before and after. "It should work" is not accepted in any track.
124
+
125
+ </details>
126
+
127
+ <details>
128
+ <summary><b>Marketing</b> — a landing page for a launch</summary>
129
+
130
+ ```
131
+ you /kaizen landing page copy for the Pro tier launch
132
+
133
+ kaizen Here is the plan.
134
+
135
+ This is launch copy aimed at existing free users, not new visitors.
136
+ Done means: a free user understands what Pro adds and what it costs, and can
137
+ act without opening another page.
138
+ Wrong means: an overclaim, a benefit we do not actually ship, or a price that
139
+ disagrees with billing.
140
+
141
+ What I will do:
142
+ 1. Headline and subhead — lead with the one thing free users ask for most
143
+ 2. Four benefits, each tied to a shipped feature
144
+ 3. Price block, pulled from the billing config so it cannot drift
145
+ 4. One CTA, repeated twice
146
+
147
+ Out of scope: the pricing page, the in-app upgrade banner.
148
+
149
+ Approve this plan?
150
+
151
+ you approve
152
+
153
+ kaizen Done, and reviewed. Three things found:
154
+
155
+ 1. benefits 3 high "Unlimited exports" — the shipped limit is 500/month.
156
+ 2. headline medium Names a competitor. Legal reviews those; flagging, not fixing.
157
+ 3. CTA low "Get started" appears on the free signup too. Ambiguous.
158
+ ```
159
+
160
+ The reviewer checked each claim against what actually ships. Finding 2 it refused to
161
+ fix on its own and handed to you — deliberately.
162
+
163
+ </details>
164
+
165
+ <details>
166
+ <summary><b>Research</b> — a decision memo</summary>
167
+
168
+ ```
169
+ you /kaizen should we move from per-seat to usage-based pricing? write it up
170
+
171
+ kaizen Here is the plan.
172
+
173
+ This is a decision memo for the founders, not a market report.
174
+ Done means: a recommendation with the reasoning shown, and the case against it
175
+ stated fairly enough that someone could disagree on the evidence.
176
+ Wrong means: a conclusion the evidence does not support, or only looking at
177
+ the data that agrees with it.
178
+
179
+ What I will do:
180
+ 1. Pull the last 12 months of seat counts and usage from the billing export
181
+ 2. Model both against actual accounts — who pays more, who pays less
182
+ 3. Name the three accounts that break the model, and by how much
183
+ 4. Recommend, with the strongest argument against it stated first
184
+
185
+ Approve this plan?
186
+
187
+ you approve
188
+
189
+ kaizen Done, and reviewed. Two things found:
190
+
191
+ 1. section 3 high The recommendation rests on 4 accounts out of 60. That
192
+ is not stated where the conclusion is.
193
+ 2. section 2 medium Churned accounts were excluded with no reason given —
194
+ they are the ones the model treats worst.
195
+ ```
196
+
197
+ Nothing here was checked for tests or tone. `wrong` was defined as an unsupported
198
+ leap and cherry-picked data, so that is what the reviewer went looking for.
199
+
200
+ </details>
201
+
202
+ <details>
203
+ <summary><b>Operations</b> — a migration runbook</summary>
204
+
205
+ ```
206
+ you /kaizen runbook for moving the database to the new region on Saturday
207
+
208
+ kaizen Here is the plan.
209
+
210
+ This is a runbook someone else executes at 2am, not a description of a plan.
211
+ Done means: a colleague can follow it start to finish without asking a question.
212
+ Wrong means: a missing prerequisite, no way back, or a step that silently
213
+ loses data.
214
+
215
+ What I will do:
216
+ 1. Prerequisites, with how to verify each one is true before starting
217
+ 2. Steps in order, each with the exact command and what you should see
218
+ 3. A rollback for every step that changes state
219
+ 4. The point of no return, marked
220
+
221
+ Approve this plan?
222
+
223
+ you approve
224
+
225
+ kaizen Done, and reviewed. Two things found:
226
+
227
+ 1. step 7 critical No rollback after the DNS cutover, and it is not marked
228
+ as the point of no return. Fix: mark it, add the TTL wait.
229
+ 2. step 3 high Says "restore the backup" but never says which backup or
230
+ how to confirm it is the right one.
231
+ ```
232
+
233
+ </details>
234
+
235
+ ## The board
236
+
237
+ `kaizen` opens a dashboard; **Board** is the screen where your work lives. Ideas you have
238
+ not started sit on the left, runs sit under the stage they are actually in, and it redraws
239
+ itself as your agents write to disk — a run that moves while you are looking at it moves on
240
+ screen.
241
+
242
+ ```
243
+ Board ~/work/acme
244
+
245
+ IDEA PLANNING BUILDING REVIEW DONE
246
+ ────────────────────── ─────────────────── ──────────────── ───────────── ──────────────
247
+ › · FAQ page for the ● q3 board memo ◐ billing runbook ● pricing ○ chapter three
248
+ pricing change email
249
+ ● oauth login ○ pricing
250
+ · onboarding video research
251
+ script, two minutes
252
+
253
+ ↑↓←→ move n new e edit x reject d delete r run a all projects q back
254
+ ● running ◐ stalled ◌ starting ● waiting on you ○ done · idea
255
+ ```
256
+
257
+ **Throw an idea in with `n`** and it lands in `<state.dir>/inbox.md`, one line each, in the
258
+ same format a run's backlog already uses. `e` edits, `x` rejects with a reason, `d` deletes.
259
+
260
+ **`r` starts a run from an idea** — it asks `full` or `lite`, then opens your configured
261
+ agent with the request already typed. The idea retires from the board once a run exists
262
+ that was started from its text, whoever started it, so the same work never appears twice.
263
+ That check spans every project you have opened, because an idea thrown into the global
264
+ inbox becomes a run inside whichever project you launched the agent in.
265
+
266
+ **The dot is what the run is doing.** `●` cyan is running and `◐` is stalled — kaizen
267
+ records no liveness signal anywhere, so "running" means the run's `state.json` has changed
268
+ in the last half hour. A run whose terminal you closed three days ago shows as stalled,
269
+ which is the distinction the board exists to make. `●` amber, with the name in red, is a
270
+ run that cannot move until you decide something; the legend lists only the states actually
271
+ on screen.
272
+
273
+ **A run's stage is kaizen's, not yours.** You cannot drag a card between columns — a board
274
+ that could do that would be lying about what happened. The one exception is `x` on a run
275
+ card, which abandons it: the same transition `/kaizen abort` makes, with your reason
276
+ recorded in the run's approval file.
277
+
278
+ `a` switches between this project and every project kaizen knows about. Below a hundred
279
+ columns the board stacks into a list rather than squeezing five columns into sixty.
280
+
281
+ ### In a browser
282
+
283
+ ```bash
284
+ kaizen web
285
+ ```
286
+
287
+ serves the same board on `http://127.0.0.1:7420/` — loopback only, no account — and
288
+ opens it in a Chromium-family browser as an app window when one is installed, otherwise
289
+ in a tab.
290
+
291
+ <img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/main/assets/board-web.png" alt="kaizen web board" width="760">
292
+
293
+ Same columns, same files: an idea added here lands in `inbox.md`, a run
294
+ started here opens your agent in a new terminal exactly as `r` does (a new herdr tab
295
+ or tmux window when one of those is running), and the board
296
+ redraws as your agents write to disk. Mouse first; the TUI's keys still work. Click a card for its plan, review and
297
+ backlog; `⋯` on a card runs, edits, rejects, abandons or archives. `Clear` on Done sends
298
+ every finished run to the archive (`.kaizen/archive.md`, a list, nothing moves), and
299
+ `Archive` in the strip shows what is there, with `Restore` on each card. A finished run in a project with a git remote gets `Commit & push` in its panel: it lists the changed files that run's report names, offers the commit message the builder wrote for the work (the `## Commit` section of its report; a message must start with a type such as `feat:` or `fix:`), commits those files and no others and pushes, and reads `Committed & pushed` afterwards (`Push` alone when the work is already committed). The `Review` tab of such a run, or of one waiting on you at the review, lists the findings with a checkbox each: `Fix all` or `Fix N selected` opens your agent in the project to fix exactly those and recheck them. The gear at the top right holds the browser's theme
300
+ and every `kaizen settings` knob, same rows, same `config.yml`. `--port N` picks a port, `--no-open` just
301
+ serves, the board opens on every project, or on the one picked last time in that browser; `?all=0` in the URL narrows it to the one it was started in. `--daemon` starts the server
302
+ detached so it outlives the terminal (pid kept in `~/.kaizen/web.pid`); `--stop` ends it. `kaizen web --shortcut` adds a launcher
303
+ the OS can find — Spotlight on macOS, the app menu on Linux, a Desktop shortcut on Windows. Each one starts the board in the background (`--daemon`) and opens it; `kaizen web --stop` ends it.
304
+
305
+ **Dictate instead of type.** Every text field on the board — a new idea, its notes, an
306
+ edit, a reject reason, a note on a run — has a mic. Press it, talk, press it again; the
307
+ words land at the caret next to whatever you had typed. Recognition is Whisper running
308
+ inside the page, so audio never leaves your machine. The first press downloads the model
309
+ from huggingface.co and caches it in the browser: `small` by default (about 410 MB,
310
+ accurate across languages); `kaizen settings` → *Dictation model* — or the gear on the
311
+ board — switches to `tiny`, `base`, or `large-v3-turbo` (about 1.5 GB, needs a capable GPU). The transformers.js library itself is fetched from jsDelivr the
312
+ first time you press the mic in a session, so that first press needs the network; the
313
+ model does not download again. Chromium and Edge qualify (Firefox falls back to the
314
+ slower CPU path); a browser without a microphone API or WebAssembly shows no mic.
315
+
316
+ ### Request sources
317
+
318
+ Requests that already live somewhere else — a team's Google Sheet, a Doc, a shared
319
+ note — do not have to be retyped. The link icon beside the gear opens **Request
320
+ sources**: paste a link, and kaizen reads it and adds every request it has not seen
321
+ before to Ideas, each with a note saying where it came from. In a sheet, a column headed
322
+ `Request`, `Idea`, `Title`, `Task`, `PBI`, `Summary` or `Name` is the request and the
323
+ other cells become its notes; without such a header the request is one column for the whole sheet, the one holding the most text. A row whose `Status` column says `Done`,
324
+ `Finish` or `Finished` is left out, and gathered later if its status changes. A doc or
325
+ a plain-text link gives one idea per line.
326
+
327
+ Nothing starts on its own: gathered requests sit in Ideas until you press Run.
328
+ Gathering twice adds nothing, and an idea you deleted, edited or rejected does not come
329
+ back. Rewording a row in the source makes it a new request. At most 50 arrive per
330
+ gather; the rest come with the next one.
331
+
332
+ While the board is running it checks each source every 24 hours — `kaizen settings` →
333
+ *Gather requests*, or the gear, sets `off`, `1h`, `6h` or `24h` — and **Gather now**
334
+ does it on demand. With the board stopped nothing is gathered. From a terminal:
335
+
336
+ ```
337
+ kaizen sources add <link> [label] kaizen sources kaizen sources rm <link>
338
+ kaizen gather
339
+ ```
340
+
341
+ Kaizen fetches public `https` links only, with no login and no cookies: share a sheet
342
+ or doc as "anyone with the link can view". A link that needs a sign-in, or a note app
343
+ that only renders in a browser, says so in the panel; run `/kaizen gather` in your
344
+ agent, which reads it with its own access and hands the requests over. Either way what
345
+ a source says is treated as text for an idea, never as instructions. The links live in
346
+ `<state.dir>/sources.json`.
347
+
348
+ ### Mouse
349
+
350
+ Off by default. Turn it on in `kaizen settings` under `ui.mouse`, and clicking a row or
351
+ card selects it, clicking it again opens or runs it, and the wheel scrolls — on the board,
352
+ the menu, runs, backlog, projects and settings.
353
+
354
+ It ships off because the trade is real: while the TUI holds the mouse, your terminal cannot
355
+ select text with it, so copying a run id out of the dashboard stops working until you
356
+ leave. Hold **Shift** and drag to select text anyway.
357
+
358
+ ## Install
359
+
360
+ Kaizen's installer and interactive dashboard require [Bun](https://bun.sh) — it is
361
+ the only prerequisite. Pick your platform:
362
+
363
+ <details open>
364
+ <summary><b>Windows</b></summary>
365
+
366
+ In PowerShell:
367
+
368
+ ```powershell
369
+ irm bun.sh/install.ps1 | iex; & "$env:USERPROFILE\.bun\bin\bunx.exe" kaizen-agent
370
+ ```
371
+
372
+ One line, because the shell that just installed Bun does not have it on `PATH` yet;
373
+ the full path sidesteps that. Next time, plain `bunx kaizen-agent`.
374
+
375
+ Git is not required. Where it is missing, kaizen copies itself into `%USERPROFILE%\kaizen`
376
+ instead of cloning, and `bunx kaizen-agent` is also how you update. Links are made as
377
+ directory junctions and file copies, so no administrator rights or Developer Mode are
378
+ needed. WSL users can follow the Linux instructions instead.
379
+
380
+ </details>
381
+
382
+ <details>
383
+ <summary><b>macOS</b></summary>
384
+
385
+ ```bash
386
+ curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
387
+ ```
388
+
389
+ Or `brew install oven-sh/bun/bun`, then `bunx kaizen-agent`.
390
+
391
+ </details>
392
+
393
+ <details>
394
+ <summary><b>Linux</b></summary>
395
+
396
+ ```bash
397
+ curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
398
+ ```
399
+
400
+ The full path is there because the shell that just installed Bun does not have it on
401
+ `PATH` until you open a new one. Next time, plain `bunx kaizen-agent`.
402
+
403
+ </details>
404
+
405
+ The installer walks you through where to install, prompts for your workflow preset (`medium`, `low`, or `ultra`), then tells you what to type next. Restart your editor afterwards.
406
+
407
+ Run from inside a project it asks whether to install globally or for that project
408
+ alone; anywhere else — your home directory, a plain folder, a script — it installs
409
+ globally without asking, since a project install outside a project has nothing to
410
+ belong to.
411
+
412
+ **It installs for every agent you already have.** The skill folders follow the open
413
+ Agent Skills standard, so the same workflow runs under any of them:
414
+
415
+ | Agent | Gets | Stages run |
416
+ |---|---|---|
417
+ | Claude Code | Skills, the three stage agents, the slash commands | Each as its own subagent |
418
+ | Codex | Skills | Sequentially, one session |
419
+ | Antigravity | Skills | Parallel agents where available, else sequentially |
420
+ | OpenCode, Cursor, Gemini CLI | Skills | Sequentially, one session |
421
+
422
+ An agent counts as present if it has a config directory or a command on your PATH.
423
+ Only what is already there is touched — installing does not create `~/.opencode` for
424
+ someone who does not use OpenCode. Install again after adding an agent and it picks
425
+ the new one up.
426
+
427
+ **No agent yet?** kaizen does nothing on its own — it is a workflow an agent runs.
428
+ If none is found, the installer says so and offers the list above, opening the
429
+ install page for whichever you pick. Install it, run `kaizen` again, and carry on.
430
+
431
+ The stage agents and slash commands are Claude Code's own formats and are not copied
432
+ elsewhere; under the others you invoke the skill by name. `.kaizen/` is plain files
433
+ either way, so a run started in one tool can be finished in another.
434
+
435
+ Run `kaizen` anytime to open the terminal dashboard:
436
+
437
+ ```
438
+ ⠀⠀⠀⣰⠖⠾⣟⣛⠋⢉⣩⠽⢛⡽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
439
+ ⠀⠀⢰⢻⠀⠀⢀⡬⠟⠉⢀⠴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
440
+ ⠀⢠⠇⣾⡠⠞⢩⠤⢄⡚⣁⣀⣀⣀⢀⣠⠤⡄⠀⠀⠀⠀⠀⠀ █ █ ▄▀█ █ ▀▀█ █▀▀ █▄ █
441
+ ⢠⣏⠔⣫⣀⡤⢸⠀⠀⠉⠁⠀⠀⠈⠉⠀⠀⡇⠀⠀⠀⠀⠀⠀ █▀▄ █▀█ █ ▄▀ ██▄ █ ▀█
442
+ ⢾⠥⢾⡅⢧⠀⢸⠃⡤⠖⠢⡀⢀⠔⠲⢤⠘⡇⠀⠀⣀⣀⠀⠀ █ █ █ █ █ █▄▄ █▄▄ █ █
443
+ ⠀⠀⠈⣇⠈⢠⣫⠞⠀⠘⢱⢣⡜⡎⠃⠀⠳⣝⡄⢠⠇⢻⢉⣷
444
+ ⠀⠀⠀⠘⢆⠀⠑⢦⣀⡀⠈⠓⠚⠁⢀⣀⣤⣊⣠⢾⡀⢠⣿⠃ 0.7.2 plan · approve · build · review
445
+ ⠀⠀⠀⠀⠈⠓⢄⠀⠀⠉⣉⣭⣭⣉⠉⠀⠈⢀⣠⢔⡩⠥⢥⡀ ~/Projects/app
446
+ ⠀⠀⠀⠀⠀⠀⢠⡇⠀⡞⠁⠀⠀⠈⢳⠀⢰⣍⣠⠚⠧⡀⠀⡷ Claude Code, Codex, Antigravity, OpenCode, Gemini CLI
447
+ ⠀⠀⠀⠀⠀⠀⠸⡇⠀⣇⠀⠀⠀⠀⣸⠀⢠⡏⠀⠀⢀⣳⠞⠁
448
+ ⠀⠀⠀⠀⠀⠀⠀⠳⣀⣨⠥⠤⠶⠾⣅⣀⠞⠉⠉⠉⠉⠀⠀⠀
449
+
450
+ ╭─ Runs ──────────────────────────────────╮ ╭─ Backlog — 4 open ──────────────────────────╮
451
+ │ ● fix-discount waiting on you │ │ cart.py:12 low use > not >= │
452
+ │ ● cache-headers in review │ │ headline med legal review │
453
+ │ ● 3 done │ │ … 2 more │
454
+ ╰─────────────────────────────────────────╯ ╰─────────────────────────────────────────────╯
455
+
456
+ › All projects every project kaizen knows about
457
+ Runs
458
+ Backlog
459
+ Settings
460
+ Upgrade
461
+ Quit
462
+ ```
463
+
464
+ It monitors your runs and backlog across all your projects without having to open an agent.
465
+ Installing puts the `kaizen` command on your PATH, so updating later is:
466
+
467
+ ```bash
468
+ kaizen upgrade
469
+ ```
470
+
471
+ That pulls the latest workflow, relinks anything new, and clears the installer cache
472
+ `bunx` keeps — which is what otherwise leaves you on an old version without saying
473
+ so. `bunx kaizen-agent upgrade` does the same thing if you would rather not have the
474
+ command. `kaizen --version` prints what is installed; `bunx kaizen-agent --version`
475
+ prints what npm has.
476
+
477
+ Then, in any project, just ask for something:
478
+
479
+ ```
480
+ /kaizen <what you want done>
481
+ ```
482
+
483
+ The first run sets the project up on its own — a `.kaizen/` folder holding the run's
484
+ files. Nothing to initialise by hand. (`/kaizen-init` exists if you want to do it
485
+ ahead of time, and the installer offers it for the project you install from.)
486
+
487
+ Setup also adds a short section to the project's `CLAUDE.md`, so you can stop typing
488
+ `/kaizen` entirely — ask for something the normal way and work worth a plan goes
489
+ through the stages on its own. It draws the line at work worth a plan: a change
490
+ across more than one file, anything with a migration or a rollback, a document
491
+ someone else will act on. Questions and one-line fixes are answered, not staged.
492
+ Delete that section to go back to `/kaizen` being explicit.
493
+
494
+ That is the whole thing. Everything below is detail.
495
+
496
+ ## How a run goes
497
+
498
+ | | Stage | What happens |
499
+ |---|---|---|
500
+ | 1 | **Plan** | Reads your request and the existing material, writes a plan. Changes nothing. |
501
+ | 2 | **You approve** | You see the plan and the work list. Say yes, or say what to change. |
502
+ | 3 | **Build** | Does the work, then proves it — runs the tests, checks the claim against its source, walks the steps — and records what actually came back. |
503
+ | 4 | **Review** | A different agent, which never saw stage 3's reasoning, checks the work and lists what is wrong, numbered and graded. |
504
+ | 5 | **Fix** | Serious findings get fixed and re-checked, up to a limit. Anything left over is handed to you, never quietly dropped. |
505
+
506
+ Each stage runs as its own agent with a clean slate, and writes a file before the
507
+ next one starts. That is what makes stage 4 worth anything: a reviewer that watched
508
+ itself do the work will defend it.
509
+
510
+ Stage 3 is the one you can move. Set `build.executor` to `inline` and the agent you
511
+ are already talking to does the work — you watch each step and can interrupt — or
512
+ leave it as `subagent` and it is handed off and reported back, which keeps your
513
+ conversation short and is the only workable choice on a big run. Set it to `ask` to
514
+ be offered the choice each time you approve a plan. Stage 4 does not move: the
515
+ reviewer is a separate agent either way, because that is the whole reason its
516
+ findings are worth reading.
517
+
518
+ ## How it knows what kind of work this is
519
+
520
+ kaizen is not a software workflow. The same five stages hold for a book chapter, a
521
+ launch email, a migration runbook, or a research memo — what changes is what
522
+ *deliverable*, *done*, and *wrong* mean.
523
+
524
+ Each run works that out for itself — its **track** — by answering three questions
525
+ from your request:
526
+
527
+ - **What is the deliverable?** A merged change, a chapter, a landing page, a runbook.
528
+ - **What counts as done?** Tests pass. The chapter reads end to end. A colleague can
529
+ follow the runbook unaided.
530
+ - **What would make it wrong?** A security hole. A claim that is not true. A step
531
+ that silently loses data.
532
+
533
+ The third answer is what the reviewer becomes. A reviewer hunting race conditions in
534
+ a book manuscript is worse than no reviewer at all, and the track is what prevents
535
+ it. You are never asked to categorise your own request — it reads the request and
536
+ tells you what it concluded, so you correct a sentence instead of filling in a form.
537
+
538
+ ## Commands
539
+
540
+ | Command | What it does |
541
+ |---|---|
542
+ | `/kaizen <request>` | Start a run |
543
+ | `/kaizen-plan <request>` | Plan only — stop before anything is built |
544
+ | `/kaizen-auto <request>` | No approval stops; report at the end |
545
+ | `/kaizen-lite <request>` | Every stage in this session — cheap, and the reviewer has seen the work |
546
+ | `/kaizen-full <request>` | Every stage its own cold agent — the independent review |
547
+ | `/kaizen-review [target]` | Review something that already exists |
548
+ | `/kaizen-status` | What is waiting on you, in flight, done |
549
+ | `/kaizen-approve` | Approve whatever the run is waiting on |
550
+ | `/kaizen-reject <reason>` | Send it back with a reason, or kill the run |
551
+ | `/kaizen-run` | Carry on with an approved plan |
552
+ | `/kaizen-backlog` | Everything noticed but not done, across all runs |
553
+ | `/kaizen-abort` | Abandon the current run |
554
+ | `/kaizen-gather` | Read the request sources kaizen cannot read by itself into Ideas |
555
+ | `kaizen sources [add\|rm <link>]` | In a terminal: list, add or remove request sources |
556
+ | `kaizen gather` | In a terminal: check every source now and add new requests to Ideas |
557
+ | `/kaizen-config` | Show this project's settings and change them |
558
+ | `/kaizen-init` | Set up the current project — optional, the first run does it |
559
+ | `/kaizen-help` | The full card |
560
+
561
+ ## What it writes
562
+
563
+ Everything a run knows lives in files next to the work, not in a chat window:
564
+
565
+ ```
566
+ .kaizen/
567
+ memory.md # what past reviews learned about this project
568
+ runs/2026-09-07-onboarding-email/
569
+ 00-request.md # what you asked, word for word
570
+ 01-plan.md # the plan you approved
571
+ 02-approval.md # what you decided, and why
572
+ 03-impl.md # what changed, and the proof it works
573
+ 04-review.md # findings, numbered and graded
574
+ 06-backlog.md # what was noticed but not done
575
+ ```
576
+
577
+ Plain files, so you can read them, commit them, and pick a run back up tomorrow —
578
+ or in another tool. kaizen also runs under Codex and Antigravity, and a run started
579
+ in one can be finished in another. See [adapters.md](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/adapters.md).
580
+
581
+ ## Settings
582
+
583
+ `~/.kaizen/config.yml` — one file, every project. The three worth knowing:
584
+
585
+ | Setting | Default | Meaning |
586
+ |---|---|---|
587
+ | `mode` | `approve` | `approve` stops for you; `auto` never does; `plan-only` stops after the plan |
588
+ | `runner` | `full` | `full` gives each stage its own agent, so the reviewer never saw the work — several times the cost. `lite` runs every stage here, at about the cost of doing it by hand |
589
+ | `build.executor` | `subagent` | Who does the work: a separate agent, `inline` in the current one, or `ask` each time |
590
+ | `auto_fix.min_severity` | `high` | Findings this bad or worse get fixed without asking |
591
+ | `approvals.plan` | `true` | Stop and show the plan before anything is built |
592
+ | `ui.mouse` | `false` | Click to select, click again to act; while on, the terminal cannot select text |
593
+ | `subagents.model` | `inherit` | Model the stage subagents run on: `inherit`, `opus`, `sonnet`, `haiku` (Claude Code only) |
594
+ | `agent.<cmd>.model`, `agent.<cmd>.effort` | — | Model/effort the board launches a session with, per tool: `claude`, `codex`, `agy`, `opencode`, `gemini`. Model names are the tool's own (`agy models`) |
595
+ | `subagents.effort` | `inherit` | Reasoning effort for the stage subagents: `inherit`, `low`, `medium`, `high` (Claude Code only) |
596
+
597
+ ```bash
598
+ kaizen settings
599
+ ```
600
+
601
+ opens a full-screen browser over the whole file — arrows to move and change, every
602
+ change written as you make it, esc to close:
603
+
604
+ ```
605
+ kaizen settings ~/.kaizen/config.yml
606
+
607
+ › preset medium
608
+ mode approve
609
+ runner full
610
+ build.executor subagent
611
+ approvals.plan true
612
+ approvals.review false
613
+ auto_fix.enabled true
614
+ auto_fix.min_severity high
615
+ auto_fix.max_iterations 2
616
+ ...
617
+
618
+ Quick preset — low: inline & manual, medium: balanced, ultra: autonomous subagents
619
+
620
+ ↑↓ move · ←→ change · esc close saved preset = medium
621
+ ```
622
+
623
+ One project can differ: put a `.kaizen/config.yml` in it with just the keys to
624
+ override, and it wins there while everything else follows the global file.
625
+ It edits each line in place, so the comment above every key survives. `/kaizen-config`
626
+ does the same thing from inside your agent if you would rather not leave it. Everything is also
627
+ in [`config.default.yml`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/config.default.yml),
628
+ with a comment on each key, if you would rather edit the file.
629
+
630
+ ## Under the hood
631
+
632
+ - [`SKILL.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/SKILL.md) — how the workflow behaves
633
+ - [`spec.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/spec.md) — the tool-neutral contract every stage follows
634
+ - [`adapters.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/adapters.md) — running it under Codex or Antigravity
635
+
636
+ <details>
637
+ <summary>Installer flags, updating, and installing without bun</summary>
638
+
639
+ | Flag | Effect |
640
+ |---|---|
641
+ | *(none)* | Ask when standing in a project, otherwise install globally |
642
+ | `--global` | Globally, no question asked |
643
+ | `--project` | Into the current directory only |
644
+ | `--check` | Report what is linked, exit non-zero if anything is missing |
645
+ | `--force` | Replace a real file sitting where a link belongs |
646
+ | `--preset <name>` | Pre-select workflow preset (`low`, `medium`, or `ultra`) |
647
+ | `--yes` | Take every default, ask nothing |
648
+ | `--verbose` | List every link instead of a one-line summary |
649
+ | `upgrade` | Pull, relink, and clear the installer cache. No prompts. |
650
+ | `uninstall` | Remove the links, the clone, and the launcher. Asks whether to keep your runs and settings. |
651
+ | `uninstall --purge` | The same, and delete `~/.kaizen` and this project's `.kaizen/` too. |
652
+ | `settings` | Open the settings browser for the nearest `.kaizen/`. Also `config`. |
653
+
654
+ Uninstalling works the same on Linux, macOS and Windows — `kaizen uninstall`, or
655
+ `bunx kaizen-agent uninstall` when the command itself is already gone. It offers three
656
+ answers — keep your runs and settings, remove everything, or cancel — and takes the
657
+ first without asking when the output is not a terminal. It lists what it removed; the `## Kaizen workflow` line in each project's `CLAUDE.md` is left for
658
+ you to delete, since you may have edited around it.
659
+
660
+ A global install also writes `~/.local/bin/kaizen` (`kaizen.cmd` in bun's bin
661
+ directory on Windows), a two-line launcher pointing at
662
+ the clone, so `kaizen upgrade` works from anywhere. It tells you if that directory is
663
+ not on your PATH. `uninstall` removes it; `--project` installs skip it.
664
+
665
+ Re-running is safe: correct links are left alone.
666
+
667
+ `bunx` extracts a package once and reuses it without re-resolving, so a plain
668
+ `bunx kaizen-agent` can keep running an old installer even after a new one is
669
+ published. `upgrade` clears that copy, so the next run resolves fresh. The workflow
670
+ itself — skills, agents, commands — comes from the clone and updates on any run.
671
+
672
+ To work on kaizen itself, install from your own checkout so the links point at it:
673
+
674
+ ```bash
675
+ git clone https://github.com/hfadhlullah/kaizen.git ~/kaizen
676
+ cd ~/kaizen && bun run cli/install.ts
677
+ ```
678
+
679
+ Without bun:
680
+
681
+ ```bash
682
+ mkdir -p ~/.claude/skills ~/.claude/agents ~/.claude/commands
683
+ ln -s ~/kaizen/skills/kaizen ~/.claude/skills/kaizen
684
+ ln -s ~/kaizen/skills/kaizen-help ~/.claude/skills/kaizen-help
685
+ for f in ~/kaizen/agents/kaizen-*.md; do ln -s "$f" ~/.claude/agents/"$(basename "$f")"; done
686
+ for f in ~/kaizen/commands/kaizen-*.md; do ln -s "$f" ~/.claude/commands/"$(basename "$f")"; done
687
+ ```
688
+
689
+ </details>
690
+
691
+ ## License
692
+
693
+ MIT. *Kaizen (改善) is Japanese for continuous improvement — small changes, checked
694
+ as you go.*