kaizen-agent 1.11.0 → 1.12.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.
- package/README.md +65 -585
- package/agents/kaizen-planner.md +16 -8
- package/package.json +1 -1
- package/skills/kaizen/SKILL.md +11 -0
- package/skills/kaizen/spec-build.md +5 -0
- package/skills/kaizen/spec-main.md +5 -2
- package/skills/kaizen/spec-plan.md +26 -9
- package/skills/kaizen/spec.md +16 -2
- package/web/board.html +7 -5
package/README.md
CHANGED
|
@@ -2,59 +2,55 @@
|
|
|
2
2
|
<img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/main/assets/banner.png" alt="kaizen" width="760">
|
|
3
3
|
</div>
|
|
4
4
|
|
|
5
|
-
<p align="center"><
|
|
5
|
+
<p align="center"><b>Stop finding your AI's mistakes next week.</b><br><i>See the plan before it starts. Get a second opinion when it is done.</i></p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
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
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
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
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">
|
|
12
|
+
<img alt="works with" src="https://img.shields.io/badge/Claude%20Code%20%C2%B7%20Codex%20%C2%B7%20Antigravity%20%C2%B7%20OpenCode%20%C2%B7%20Cursor%20%C2%B7%20Gemini%20CLI-2d50a5">
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
You ask an AI for something real: a feature, a launch email, a migration plan. It goes
|
|
18
|
+
quiet, then hands you a finished thing. Did it understand you? What did it change? What
|
|
19
|
+
is wrong that you won't notice until next week?
|
|
20
|
+
|
|
21
|
+
**kaizen adds two checkpoints:**
|
|
22
|
+
|
|
23
|
+
1. **Before:** you see the plan and say yes or no. Nothing is built until you approve.
|
|
24
|
+
2. **After:** a *second* agent reviews the work. It never saw the first one's reasoning, so it has nothing to defend. It tells you what's wrong, numbered and graded.
|
|
25
|
+
|
|
26
|
+
You decide what gets fixed.
|
|
27
|
+
|
|
28
|
+
<p align="center"><img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/main/assets/demo.gif" alt="kaizen shows a plan, you approve, a second agent reports two findings" width="760"></p>
|
|
29
|
+
|
|
30
|
+
## Install
|
|
18
31
|
|
|
19
32
|
```bash
|
|
33
|
+
# macOS · Linux · WSL
|
|
20
34
|
curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
|
|
21
35
|
```
|
|
22
36
|
|
|
23
|
-
Windows PowerShell — one paste:
|
|
24
|
-
|
|
25
37
|
```powershell
|
|
38
|
+
# Windows PowerShell
|
|
26
39
|
irm bun.sh/install.ps1 | iex; & "$env:USERPROFILE\.bun\bin\bunx.exe" kaizen-agent
|
|
27
40
|
```
|
|
28
41
|
|
|
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.
|
|
42
|
+
Already have Bun? `bunx kaizen-agent`. It sets itself up for every agent you already use.
|
|
38
43
|
|
|
39
|
-
|
|
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.
|
|
44
|
+
Then, in any project:
|
|
42
45
|
|
|
43
|
-
|
|
46
|
+
```
|
|
47
|
+
/kaizen <what you want done>
|
|
48
|
+
```
|
|
44
49
|
|
|
45
|
-
|
|
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.
|
|
50
|
+
That's it. No init and no config.
|
|
48
51
|
|
|
49
52
|
## See it
|
|
50
53
|
|
|
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
54
|
```
|
|
59
55
|
you /kaizen rewrite the onboarding email — the new pricing starts on the 1st
|
|
60
56
|
|
|
@@ -70,8 +66,6 @@ kaizen Here is the plan.
|
|
|
70
66
|
2. Add one line on what happens if they do nothing
|
|
71
67
|
3. Keep the existing sign-off and legal footer untouched
|
|
72
68
|
|
|
73
|
-
Not doing: touching the pricing page itself — say the word if you want that too.
|
|
74
|
-
|
|
75
69
|
Approve this plan? [ approve ] [ change something ]
|
|
76
70
|
|
|
77
71
|
you approve
|
|
@@ -85,71 +79,32 @@ kaizen Done, and reviewed. Two things found:
|
|
|
85
79
|
Fix them? [ both ] [ just 1 ] [ leave it ]
|
|
86
80
|
```
|
|
87
81
|
|
|
88
|
-
Nobody told the reviewer to
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
</details>
|
|
82
|
+
Nobody told the reviewer to hunt for untrue claims. It worked out that this was a customer
|
|
83
|
+
email and reviewed it as one.
|
|
92
84
|
|
|
93
85
|
<details>
|
|
94
|
-
<summary><b>Code</b
|
|
86
|
+
<summary><b>Code</b>: a bug in checkout</summary>
|
|
95
87
|
|
|
96
88
|
```
|
|
97
89
|
you /kaizen the discount field lets you enter more than 100%
|
|
98
90
|
|
|
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
91
|
kaizen Done, and reviewed.
|
|
114
92
|
Verified: ran the suite — 47 passed, 0 failed. Before the change: 44 passed.
|
|
115
93
|
|
|
116
|
-
One problem found:
|
|
117
|
-
|
|
118
94
|
1. cart.py:12 medium A discount of exactly 100 now returns 0 instead of
|
|
119
95
|
being rejected. Fix: use > not >=.
|
|
120
96
|
```
|
|
121
97
|
|
|
122
|
-
|
|
123
|
-
before and after. "It should work" is not accepted in any track.
|
|
98
|
+
"It should work" is never accepted. The builder has to show the run and the numbers.
|
|
124
99
|
|
|
125
100
|
</details>
|
|
126
101
|
|
|
127
102
|
<details>
|
|
128
|
-
<summary><b>Marketing</b
|
|
103
|
+
<summary><b>Marketing</b>: a landing page for a launch</summary>
|
|
129
104
|
|
|
130
105
|
```
|
|
131
106
|
you /kaizen landing page copy for the Pro tier launch
|
|
132
107
|
|
|
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
108
|
kaizen Done, and reviewed. Three things found:
|
|
154
109
|
|
|
155
110
|
1. benefits 3 high "Unlimited exports" — the shipped limit is 500/month.
|
|
@@ -157,35 +112,16 @@ kaizen Done, and reviewed. Three things found:
|
|
|
157
112
|
3. CTA low "Get started" appears on the free signup too. Ambiguous.
|
|
158
113
|
```
|
|
159
114
|
|
|
160
|
-
|
|
161
|
-
fix on its own and handed to you — deliberately.
|
|
115
|
+
Every claim is checked against what actually ships.
|
|
162
116
|
|
|
163
117
|
</details>
|
|
164
118
|
|
|
165
119
|
<details>
|
|
166
|
-
<summary><b>Research</b
|
|
120
|
+
<summary><b>Research</b>: a decision memo</summary>
|
|
167
121
|
|
|
168
122
|
```
|
|
169
123
|
you /kaizen should we move from per-seat to usage-based pricing? write it up
|
|
170
124
|
|
|
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
125
|
kaizen Done, and reviewed. Two things found:
|
|
190
126
|
|
|
191
127
|
1. section 3 high The recommendation rests on 4 accounts out of 60. That
|
|
@@ -194,34 +130,16 @@ kaizen Done, and reviewed. Two things found:
|
|
|
194
130
|
they are the ones the model treats worst.
|
|
195
131
|
```
|
|
196
132
|
|
|
197
|
-
|
|
198
|
-
leap and cherry-picked data, so that is what the reviewer went looking for.
|
|
133
|
+
No tests, no tone check. It looked for unsupported leaps and cherry-picked data.
|
|
199
134
|
|
|
200
135
|
</details>
|
|
201
136
|
|
|
202
137
|
<details>
|
|
203
|
-
<summary><b>Operations</b
|
|
138
|
+
<summary><b>Operations</b>: a migration runbook</summary>
|
|
204
139
|
|
|
205
140
|
```
|
|
206
141
|
you /kaizen runbook for moving the database to the new region on Saturday
|
|
207
142
|
|
|
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
143
|
kaizen Done, and reviewed. Two things found:
|
|
226
144
|
|
|
227
145
|
1. step 7 critical No rollback after the DNS cutover, and it is not marked
|
|
@@ -232,491 +150,53 @@ kaizen Done, and reviewed. Two things found:
|
|
|
232
150
|
|
|
233
151
|
</details>
|
|
234
152
|
|
|
235
|
-
##
|
|
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.
|
|
153
|
+
## How it works
|
|
280
154
|
|
|
281
|
-
|
|
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
|
-
On Windows `kaizen web` starts in the background unless `--foreground` is given; `kaizen web --stop` ends it.
|
|
305
|
-
|
|
306
|
-
**A notebook beside the board.** The note icon in the board's header opens
|
|
307
|
-
`/notebook`: markdown notes for the project, kept as plain files in `.kaizen/notes/`
|
|
308
|
-
(folders included, so Obsidian can open the same folder). Notes are edited in place —
|
|
309
|
-
the line you are on shows its markdown, the rest reads typeset, and `/` at the start of a line offers checkboxes, dividers, headings and the other blocks. `[[Other note]]` links
|
|
310
|
-
notes and creates the one that does not exist yet, every note lists what links to it,
|
|
311
|
-
`#tags` filter the list, and a `/` in a note's name puts it in a folder. Notes save as
|
|
312
|
-
you type; a note changed elsewhere since you opened it is never overwritten without
|
|
313
|
-
asking, and a deleted one goes to `.kaizen/notes/.trash/`. Notes link to the board too: `[[run:<id>#finding-2]]`, a tab (`#review`, `#backlog`), a backlog item (`#backlog-3`) or `[[idea:…]]` show as chips that open the board on that item, and a run's Notes tab lists the notes that link to it. The editor is CodeMirror,
|
|
314
|
-
bundled into the package, so the notebook works offline.
|
|
315
|
-
|
|
316
|
-
**Dictate instead of type.** Every text field on the board — a new idea, its notes, an
|
|
317
|
-
edit, a reject reason, a note on a run — has a mic. Press it, talk, press it again; the
|
|
318
|
-
words land at the caret next to whatever you had typed. Recognition is Whisper running
|
|
319
|
-
inside the page, so audio never leaves your machine. The first press downloads the model
|
|
320
|
-
from huggingface.co and caches it in the browser: `small` by default (about 410 MB,
|
|
321
|
-
accurate across languages); `kaizen settings` → *Dictation model* — or the gear on the
|
|
322
|
-
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
|
|
323
|
-
first time you press the mic in a session, so that first press needs the network; the
|
|
324
|
-
model does not download again. Chromium and Edge qualify (Firefox falls back to the
|
|
325
|
-
slower CPU path); a browser without a microphone API or WebAssembly shows no mic.
|
|
326
|
-
|
|
327
|
-
### Request sources
|
|
328
|
-
|
|
329
|
-
Requests that already live somewhere else — a team's Google Sheet, a Doc, a shared
|
|
330
|
-
note — do not have to be retyped. The link icon beside the gear opens **Request
|
|
331
|
-
sources**: paste a link, and kaizen reads it at once and adds every request it has not
|
|
332
|
-
seen before to Ideas, each with a note saying where it came from and a *gathered* chip;
|
|
333
|
-
the panel says what came back, or why the link could not be read. In a sheet, the header
|
|
334
|
-
is looked for in the first five rows that hold anything, and a column headed `Request`,
|
|
335
|
-
`Idea`, `Title`, `Task`, `PBI`, `Summary`, `Name`, `Detail`, `Details`, `Description`,
|
|
336
|
-
`Deskripsi`, `Feedback`, `Issue`, `Permintaan` or `Judul` is the request; the other
|
|
337
|
-
cells become its notes. Without such
|
|
338
|
-
a header the request is one column for the whole sheet, the one holding the most text. A row whose `Status` column says `Done`,
|
|
339
|
-
`Finish` or `Finished` is left out, and gathered later if its status changes. A doc or
|
|
340
|
-
a plain-text link gives one idea per line.
|
|
341
|
-
|
|
342
|
-
Nothing starts on its own: gathered requests sit in Ideas until you press Run.
|
|
343
|
-
Gathering twice adds nothing, and an idea you deleted, edited or rejected does not come
|
|
344
|
-
back. Rewording a row in the source makes it a new request. At most 50 arrive per
|
|
345
|
-
gather; the rest come with the next one.
|
|
346
|
-
|
|
347
|
-
While the board is running it checks each source every 24 hours — `kaizen settings` →
|
|
348
|
-
*Gather requests*, or the gear, sets `off`, `1h`, `6h` or `24h` — and **Gather now**
|
|
349
|
-
does it on demand. With the board stopped nothing is gathered. From a terminal:
|
|
350
|
-
|
|
351
|
-
```
|
|
352
|
-
kaizen sources add <link> [label] kaizen sources kaizen sources rm <link>
|
|
353
|
-
kaizen gather
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
Kaizen fetches public `https` links only, with no login and no cookies: share a sheet
|
|
357
|
-
or doc as "anyone with the link can view". A link that needs a sign-in, or a note app
|
|
358
|
-
that only renders in a browser, says so in the panel; run `/kaizen gather` in your
|
|
359
|
-
agent, which reads it with its own access and hands the requests over. Either way what
|
|
360
|
-
a source says is treated as text for an idea, never as instructions. The links live in
|
|
361
|
-
`<state.dir>/sources.json`.
|
|
362
|
-
|
|
363
|
-
### Mouse
|
|
364
|
-
|
|
365
|
-
Off by default. Turn it on in `kaizen settings` under `ui.mouse`, and clicking a row or
|
|
366
|
-
card selects it, clicking it again opens or runs it, and the wheel scrolls — on the board,
|
|
367
|
-
the menu, runs, backlog, projects and settings.
|
|
368
|
-
|
|
369
|
-
It ships off because the trade is real: while the TUI holds the mouse, your terminal cannot
|
|
370
|
-
select text with it, so copying a run id out of the dashboard stops working until you
|
|
371
|
-
leave. Hold **Shift** and drag to select text anyway.
|
|
372
|
-
|
|
373
|
-
## Install
|
|
374
|
-
|
|
375
|
-
Kaizen's installer and interactive dashboard require [Bun](https://bun.sh) — it is
|
|
376
|
-
the only prerequisite. Pick your platform:
|
|
377
|
-
|
|
378
|
-
<details open>
|
|
379
|
-
<summary><b>Windows</b></summary>
|
|
380
|
-
|
|
381
|
-
In PowerShell:
|
|
382
|
-
|
|
383
|
-
```powershell
|
|
384
|
-
irm bun.sh/install.ps1 | iex; & "$env:USERPROFILE\.bun\bin\bunx.exe" kaizen-agent
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
One line, because the shell that just installed Bun does not have it on `PATH` yet;
|
|
388
|
-
the full path sidesteps that. Next time, plain `bunx kaizen-agent`.
|
|
389
|
-
|
|
390
|
-
Git is not required. Where it is missing, kaizen copies itself into `%USERPROFILE%\kaizen`
|
|
391
|
-
instead of cloning, and `bunx kaizen-agent` is also how you update. Links are made as
|
|
392
|
-
directory junctions and file copies, so no administrator rights or Developer Mode are
|
|
393
|
-
needed. WSL users can follow the Linux instructions instead.
|
|
394
|
-
|
|
395
|
-
</details>
|
|
396
|
-
|
|
397
|
-
<details>
|
|
398
|
-
<summary><b>macOS</b></summary>
|
|
399
|
-
|
|
400
|
-
```bash
|
|
401
|
-
curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
Or `brew install oven-sh/bun/bun`, then `bunx kaizen-agent`.
|
|
405
|
-
|
|
406
|
-
</details>
|
|
407
|
-
|
|
408
|
-
<details>
|
|
409
|
-
<summary><b>Linux</b></summary>
|
|
410
|
-
|
|
411
|
-
```bash
|
|
412
|
-
curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bunx kaizen-agent
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
The full path is there because the shell that just installed Bun does not have it on
|
|
416
|
-
`PATH` until you open a new one. Next time, plain `bunx kaizen-agent`.
|
|
417
|
-
|
|
418
|
-
</details>
|
|
419
|
-
|
|
420
|
-
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.
|
|
421
|
-
|
|
422
|
-
Run from inside a project it asks whether to install globally or for that project
|
|
423
|
-
alone; anywhere else — your home directory, a plain folder, a script — it installs
|
|
424
|
-
globally without asking, since a project install outside a project has nothing to
|
|
425
|
-
belong to.
|
|
426
|
-
|
|
427
|
-
**It installs for every agent you already have.** The skill folders follow the open
|
|
428
|
-
Agent Skills standard, so the same workflow runs under any of them:
|
|
429
|
-
|
|
430
|
-
| Agent | Gets | Stages run |
|
|
155
|
+
| | Stage | |
|
|
431
156
|
|---|---|---|
|
|
432
|
-
|
|
|
433
|
-
|
|
|
434
|
-
|
|
|
435
|
-
|
|
|
436
|
-
|
|
437
|
-
An agent counts as present if it has a config directory or a command on your PATH.
|
|
438
|
-
Only what is already there is touched — installing does not create `~/.opencode` for
|
|
439
|
-
someone who does not use OpenCode. Install again after adding an agent and it picks
|
|
440
|
-
the new one up.
|
|
441
|
-
|
|
442
|
-
**No agent yet?** kaizen does nothing on its own — it is a workflow an agent runs.
|
|
443
|
-
If none is found, the installer says so and offers the list above, opening the
|
|
444
|
-
install page for whichever you pick. Install it, run `kaizen` again, and carry on.
|
|
445
|
-
|
|
446
|
-
The stage agents and slash commands are Claude Code's own formats and are not copied
|
|
447
|
-
elsewhere; under the others you invoke the skill by name. `.kaizen/` is plain files
|
|
448
|
-
either way, so a run started in one tool can be finished in another.
|
|
449
|
-
|
|
450
|
-
Run `kaizen` anytime to open the terminal dashboard:
|
|
451
|
-
|
|
452
|
-
```
|
|
453
|
-
⠀⠀⠀⣰⠖⠾⣟⣛⠋⢉⣩⠽⢛⡽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
|
454
|
-
⠀⠀⢰⢻⠀⠀⢀⡬⠟⠉⢀⠴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
|
455
|
-
⠀⢠⠇⣾⡠⠞⢩⠤⢄⡚⣁⣀⣀⣀⢀⣠⠤⡄⠀⠀⠀⠀⠀⠀ █ █ ▄▀█ █ ▀▀█ █▀▀ █▄ █
|
|
456
|
-
⢠⣏⠔⣫⣀⡤⢸⠀⠀⠉⠁⠀⠀⠈⠉⠀⠀⡇⠀⠀⠀⠀⠀⠀ █▀▄ █▀█ █ ▄▀ ██▄ █ ▀█
|
|
457
|
-
⢾⠥⢾⡅⢧⠀⢸⠃⡤⠖⠢⡀⢀⠔⠲⢤⠘⡇⠀⠀⣀⣀⠀⠀ █ █ █ █ █ █▄▄ █▄▄ █ █
|
|
458
|
-
⠀⠀⠈⣇⠈⢠⣫⠞⠀⠘⢱⢣⡜⡎⠃⠀⠳⣝⡄⢠⠇⢻⢉⣷
|
|
459
|
-
⠀⠀⠀⠘⢆⠀⠑⢦⣀⡀⠈⠓⠚⠁⢀⣀⣤⣊⣠⢾⡀⢠⣿⠃ 0.7.2 plan · approve · build · review
|
|
460
|
-
⠀⠀⠀⠀⠈⠓⢄⠀⠀⠉⣉⣭⣭⣉⠉⠀⠈⢀⣠⢔⡩⠥⢥⡀ ~/Projects/app
|
|
461
|
-
⠀⠀⠀⠀⠀⠀⢠⡇⠀⡞⠁⠀⠀⠈⢳⠀⢰⣍⣠⠚⠧⡀⠀⡷ Claude Code, Codex, Antigravity, OpenCode, Gemini CLI
|
|
462
|
-
⠀⠀⠀⠀⠀⠀⠸⡇⠀⣇⠀⠀⠀⠀⣸⠀⢠⡏⠀⠀⢀⣳⠞⠁
|
|
463
|
-
⠀⠀⠀⠀⠀⠀⠀⠳⣀⣨⠥⠤⠶⠾⣅⣀⠞⠉⠉⠉⠉⠀⠀⠀
|
|
464
|
-
|
|
465
|
-
╭─ Runs ──────────────────────────────────╮ ╭─ Backlog — 4 open ──────────────────────────╮
|
|
466
|
-
│ ● fix-discount waiting on you │ │ cart.py:12 low use > not >= │
|
|
467
|
-
│ ● cache-headers in review │ │ headline med legal review │
|
|
468
|
-
│ ● 3 done │ │ … 2 more │
|
|
469
|
-
╰─────────────────────────────────────────╯ ╰─────────────────────────────────────────────╯
|
|
470
|
-
|
|
471
|
-
› All projects every project kaizen knows about
|
|
472
|
-
Runs
|
|
473
|
-
Backlog
|
|
474
|
-
Settings
|
|
475
|
-
Upgrade
|
|
476
|
-
Quit
|
|
477
|
-
```
|
|
478
|
-
|
|
479
|
-
It monitors your runs and backlog across all your projects without having to open an agent.
|
|
480
|
-
Installing puts the `kaizen` command on your PATH, so updating later is:
|
|
481
|
-
|
|
482
|
-
```bash
|
|
483
|
-
kaizen upgrade
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
That pulls the latest workflow, relinks anything new, and clears the installer cache
|
|
487
|
-
`bunx` keeps — which is what otherwise leaves you on an old version without saying
|
|
488
|
-
so. `bunx kaizen-agent upgrade` does the same thing if you would rather not have the
|
|
489
|
-
command. `kaizen --version` prints what is installed; `bunx kaizen-agent --version`
|
|
490
|
-
prints what npm has.
|
|
157
|
+
| 1 | **Plan** | Reads your request, writes a plan. Changes nothing. |
|
|
158
|
+
| 2 | **You approve** | Say yes, or say what to change. |
|
|
159
|
+
| 3 | **Build** | Does the work, then *proves* it: runs the tests, checks each claim, walks each step. |
|
|
160
|
+
| 4 | **Review** | A fresh agent checks the work and lists what's wrong. |
|
|
161
|
+
| 5 | **Fix** | Serious findings get fixed and rechecked. The rest comes to you, never silently dropped. |
|
|
491
162
|
|
|
492
|
-
|
|
163
|
+
## Why people use it
|
|
493
164
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
165
|
+
- **It isn't just for code.** Emails, docs, runbooks, research. kaizen works out what *done* and *wrong* mean for each request, so a book chapter is never reviewed for race conditions.
|
|
166
|
+
- **The reviewer has nothing to defend.** It starts cold, sees only the plan and the result, and finds what the builder talked itself past.
|
|
167
|
+
- **A board for all your work.** Run `kaizen` in a terminal, or `kaizen web` in the browser. Ideas, plans, builds and reviews across every project, updating live. Start a run, approve or revise a plan, answer its questions, pick which findings to fix, then commit and push, all without opening a terminal.
|
|
168
|
+
- **Requests come to you.** Paste a Google Sheet or Doc link and every request in it lands on the board as an idea.
|
|
169
|
+
- **Notes and voice, offline.** A markdown notebook beside the board, plus dictation on every field. Whisper runs in the page, so audio never leaves your machine.
|
|
170
|
+
- **Plain files, any agent.** Every run is a folder of markdown in `.kaizen/`. Start in Claude Code, finish in Codex, Antigravity, OpenCode, Cursor or Gemini CLI.
|
|
497
171
|
|
|
498
|
-
|
|
499
|
-
files. Nothing to initialise by hand. (`/kaizen-init` exists if you want to do it
|
|
500
|
-
ahead of time, and the installer offers it for the project you install from.)
|
|
501
|
-
|
|
502
|
-
Setup also adds a short section to the project's `CLAUDE.md`, so you can stop typing
|
|
503
|
-
`/kaizen` entirely — ask for something the normal way and work worth a plan goes
|
|
504
|
-
through the stages on its own. It draws the line at work worth a plan: a change
|
|
505
|
-
across more than one file, anything with a migration or a rollback, a document
|
|
506
|
-
someone else will act on. Questions and one-line fixes are answered, not staged.
|
|
507
|
-
Delete that section to go back to `/kaizen` being explicit.
|
|
508
|
-
|
|
509
|
-
That is the whole thing. Everything below is detail.
|
|
510
|
-
|
|
511
|
-
## How a run goes
|
|
512
|
-
|
|
513
|
-
| | Stage | What happens |
|
|
514
|
-
|---|---|---|
|
|
515
|
-
| 1 | **Plan** | Reads your request and the existing material, writes a plan. Changes nothing. |
|
|
516
|
-
| 2 | **You approve** | You see the plan and the work list. Say yes, or say what to change. |
|
|
517
|
-
| 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. |
|
|
518
|
-
| 4 | **Review** | A different agent, which never saw stage 3's reasoning, checks the work and lists what is wrong, numbered and graded. |
|
|
519
|
-
| 5 | **Fix** | Serious findings get fixed and re-checked, up to a limit. Anything left over is handed to you, never quietly dropped. |
|
|
520
|
-
|
|
521
|
-
Each stage runs as its own agent with a clean slate, and writes a file before the
|
|
522
|
-
next one starts. That is what makes stage 4 worth anything: a reviewer that watched
|
|
523
|
-
itself do the work will defend it.
|
|
524
|
-
|
|
525
|
-
Stage 3 is the one you can move. Set `build.executor` to `inline` and the agent you
|
|
526
|
-
are already talking to does the work — you watch each step and can interrupt — or
|
|
527
|
-
leave it as `subagent` and it is handed off and reported back, which keeps your
|
|
528
|
-
conversation short and is the only workable choice on a big run. Set it to `ask` to
|
|
529
|
-
be offered the choice each time you approve a plan. Stage 4 does not move: the
|
|
530
|
-
reviewer is a separate agent either way, because that is the whole reason its
|
|
531
|
-
findings are worth reading.
|
|
532
|
-
|
|
533
|
-
## How it knows what kind of work this is
|
|
534
|
-
|
|
535
|
-
kaizen is not a software workflow. The same five stages hold for a book chapter, a
|
|
536
|
-
launch email, a migration runbook, or a research memo — what changes is what
|
|
537
|
-
*deliverable*, *done*, and *wrong* mean.
|
|
538
|
-
|
|
539
|
-
Each run works that out for itself — its **track** — by answering three questions
|
|
540
|
-
from your request:
|
|
541
|
-
|
|
542
|
-
- **What is the deliverable?** A merged change, a chapter, a landing page, a runbook.
|
|
543
|
-
- **What counts as done?** Tests pass. The chapter reads end to end. A colleague can
|
|
544
|
-
follow the runbook unaided.
|
|
545
|
-
- **What would make it wrong?** A security hole. A claim that is not true. A step
|
|
546
|
-
that silently loses data.
|
|
547
|
-
|
|
548
|
-
The third answer is what the reviewer becomes. A reviewer hunting race conditions in
|
|
549
|
-
a book manuscript is worse than no reviewer at all, and the track is what prevents
|
|
550
|
-
it. You are never asked to categorise your own request — it reads the request and
|
|
551
|
-
tells you what it concluded, so you correct a sentence instead of filling in a form.
|
|
172
|
+
<img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/c858bb6d666a65780d09c06032c8819489b87da5/assets/board.png" alt="kaizen web board" width="760">
|
|
552
173
|
|
|
553
174
|
## Commands
|
|
554
175
|
|
|
555
|
-
| Command |
|
|
176
|
+
| Command | |
|
|
556
177
|
|---|---|
|
|
557
178
|
| `/kaizen <request>` | Start a run |
|
|
558
|
-
| `/kaizen-plan <request>` | Plan only
|
|
559
|
-
| `/kaizen-auto <request>` | No
|
|
560
|
-
| `/kaizen-lite <request>` | Every stage in this session
|
|
561
|
-
| `/kaizen-full <request>` | Every stage its own cold agent
|
|
179
|
+
| `/kaizen-plan <request>` | Plan only |
|
|
180
|
+
| `/kaizen-auto <request>` | No stops; report at the end |
|
|
181
|
+
| `/kaizen-lite <request>` | Every stage in this session: cheaper |
|
|
182
|
+
| `/kaizen-full <request>` | Every stage its own cold agent: the independent review |
|
|
562
183
|
| `/kaizen-review [target]` | Review something that already exists |
|
|
563
|
-
| `/kaizen-
|
|
564
|
-
| `/kaizen-
|
|
565
|
-
| `/kaizen-
|
|
566
|
-
| `/kaizen-
|
|
567
|
-
| `/kaizen-
|
|
568
|
-
| `/kaizen-abort` | Abandon the current run |
|
|
569
|
-
| `/kaizen-gather` | Read the request sources kaizen cannot read by itself into Ideas |
|
|
570
|
-
| `kaizen sources [add\|rm <link>]` | In a terminal: list, add or remove request sources |
|
|
571
|
-
| `kaizen gather` | In a terminal: check every source now and add new requests to Ideas |
|
|
572
|
-
| `/kaizen-config` | Show this project's settings and change them |
|
|
573
|
-
| `/kaizen-init` | Set up the current project — optional, the first run does it |
|
|
184
|
+
| `/kaizen-approve` · `/kaizen-reject <reason>` | Answer whatever the run is waiting on |
|
|
185
|
+
| `/kaizen-run` · `/kaizen-abort` | Carry on with an approved plan, or drop the run |
|
|
186
|
+
| `/kaizen-status` · `/kaizen-backlog` | What's waiting, in flight, done, or left over |
|
|
187
|
+
| `/kaizen-gather` | Pull new requests from your sources onto the board |
|
|
188
|
+
| `/kaizen-config` | Change this project's settings |
|
|
574
189
|
| `/kaizen-help` | The full card |
|
|
575
190
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
Everything a run knows lives in files next to the work, not in a chat window:
|
|
579
|
-
|
|
580
|
-
```
|
|
581
|
-
.kaizen/
|
|
582
|
-
memory.md # what past reviews learned about this project
|
|
583
|
-
runs/2026-09-07-onboarding-email/
|
|
584
|
-
00-request.md # what you asked, word for word
|
|
585
|
-
01-plan.md # the plan you approved
|
|
586
|
-
02-approval.md # what you decided, and why
|
|
587
|
-
03-impl.md # what changed, and the proof it works
|
|
588
|
-
04-review.md # findings, numbered and graded
|
|
589
|
-
06-backlog.md # what was noticed but not done
|
|
590
|
-
```
|
|
591
|
-
|
|
592
|
-
Plain files, so you can read them, commit them, and pick a run back up tomorrow —
|
|
593
|
-
or in another tool. kaizen also runs under Codex and Antigravity, and a run started
|
|
594
|
-
in one can be finished in another. See [adapters.md](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/adapters.md).
|
|
595
|
-
|
|
596
|
-
## Settings
|
|
597
|
-
|
|
598
|
-
`~/.kaizen/config.yml` — one file, every project. The three worth knowing:
|
|
599
|
-
|
|
600
|
-
| Setting | Default | Meaning |
|
|
601
|
-
|---|---|---|
|
|
602
|
-
| `mode` | `approve` | `approve` stops for you; `auto` never does; `plan-only` stops after the plan |
|
|
603
|
-
| `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 |
|
|
604
|
-
| `build.executor` | `subagent` | Who does the work: a separate agent, `inline` in the current one, or `ask` each time |
|
|
605
|
-
| `auto_fix.min_severity` | `high` | Findings this bad or worse get fixed without asking |
|
|
606
|
-
| `approvals.plan` | `true` | Stop and show the plan before anything is built |
|
|
607
|
-
| `ui.mouse` | `false` | Click to select, click again to act; while on, the terminal cannot select text |
|
|
608
|
-
| `subagents.model` | `inherit` | Model the stage subagents run on: `inherit`, `opus`, `sonnet`, `haiku` (Claude Code only) |
|
|
609
|
-
| `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`) |
|
|
610
|
-
| `subagents.effort` | `inherit` | Reasoning effort for the stage subagents: `inherit`, `low`, `medium`, `high` (Claude Code only) |
|
|
611
|
-
|
|
612
|
-
```bash
|
|
613
|
-
kaizen settings
|
|
614
|
-
```
|
|
615
|
-
|
|
616
|
-
opens a full-screen browser over the whole file — arrows to move and change, every
|
|
617
|
-
change written as you make it, esc to close:
|
|
618
|
-
|
|
619
|
-
```
|
|
620
|
-
kaizen settings ~/.kaizen/config.yml
|
|
621
|
-
|
|
622
|
-
› preset medium
|
|
623
|
-
mode approve
|
|
624
|
-
runner full
|
|
625
|
-
build.executor subagent
|
|
626
|
-
approvals.plan true
|
|
627
|
-
approvals.review false
|
|
628
|
-
auto_fix.enabled true
|
|
629
|
-
auto_fix.min_severity high
|
|
630
|
-
auto_fix.max_iterations 2
|
|
631
|
-
...
|
|
632
|
-
|
|
633
|
-
Quick preset — low: inline & manual, medium: balanced, ultra: autonomous subagents
|
|
634
|
-
|
|
635
|
-
↑↓ move · ←→ change · esc close saved preset = medium
|
|
636
|
-
```
|
|
637
|
-
|
|
638
|
-
One project can differ: put a `.kaizen/config.yml` in it with just the keys to
|
|
639
|
-
override, and it wins there while everything else follows the global file.
|
|
640
|
-
It edits each line in place, so the comment above every key survives. `/kaizen-config`
|
|
641
|
-
does the same thing from inside your agent if you would rather not leave it. Everything is also
|
|
642
|
-
in [`config.default.yml`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/config.default.yml),
|
|
643
|
-
with a comment on each key, if you would rather edit the file.
|
|
644
|
-
|
|
645
|
-
## Under the hood
|
|
646
|
-
|
|
647
|
-
- [`SKILL.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/SKILL.md) — how the workflow behaves
|
|
648
|
-
- [`spec.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/spec.md) — the tool-neutral contract every stage follows
|
|
649
|
-
- [`adapters.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/adapters.md) — running it under Codex or Antigravity
|
|
650
|
-
|
|
651
|
-
<details>
|
|
652
|
-
<summary>Installer flags, updating, and installing without bun</summary>
|
|
653
|
-
|
|
654
|
-
| Flag | Effect |
|
|
655
|
-
|---|---|
|
|
656
|
-
| *(none)* | Ask when standing in a project, otherwise install globally |
|
|
657
|
-
| `--global` | Globally, no question asked |
|
|
658
|
-
| `--project` | Into the current directory only |
|
|
659
|
-
| `--check` | Report what is linked, exit non-zero if anything is missing |
|
|
660
|
-
| `--force` | Replace a real file sitting where a link belongs |
|
|
661
|
-
| `--preset <name>` | Pre-select workflow preset (`low`, `medium`, or `ultra`) |
|
|
662
|
-
| `--yes` | Take every default, ask nothing |
|
|
663
|
-
| `--verbose` | List every link instead of a one-line summary |
|
|
664
|
-
| `upgrade` | Pull, relink, and clear the installer cache. No prompts. |
|
|
665
|
-
| `uninstall` | Remove the links, the clone, and the launcher. Asks whether to keep your runs and settings. The clone goes only when it is `~/kaizen`, cloned from kaizen's repository, with no local changes; any other `KAIZEN_HOME` is kept and named. |
|
|
666
|
-
| `uninstall --purge` | The same, and delete `~/.kaizen` and this project's `.kaizen/` too. |
|
|
667
|
-
| `settings` | Open the settings browser for the nearest `.kaizen/`. Also `config`. |
|
|
668
|
-
|
|
669
|
-
Uninstalling works the same on Linux, macOS and Windows — `kaizen uninstall`, or
|
|
670
|
-
`bunx kaizen-agent uninstall` when the command itself is already gone. It offers three
|
|
671
|
-
answers — keep your runs and settings, remove everything, or cancel — and takes the
|
|
672
|
-
first without asking when the output is not a terminal. It lists what it removed and what it kept; the `## Kaizen workflow` line in each project's `CLAUDE.md` is left for
|
|
673
|
-
you to delete, since you may have edited around it.
|
|
674
|
-
|
|
675
|
-
A global install also writes `~/.local/bin/kaizen` (`kaizen.cmd` in bun's bin
|
|
676
|
-
directory on Windows), a two-line launcher pointing at
|
|
677
|
-
the clone, so `kaizen upgrade` works from anywhere. It tells you if that directory is
|
|
678
|
-
not on your PATH. `uninstall` removes it; `--project` installs skip it.
|
|
679
|
-
|
|
680
|
-
Re-running is safe: correct links are left alone.
|
|
681
|
-
|
|
682
|
-
`bunx` extracts a package once and reuses it without re-resolving, so a plain
|
|
683
|
-
`bunx kaizen-agent` can keep running an old installer even after a new one is
|
|
684
|
-
published. `upgrade` clears that copy, so the next run resolves fresh. The workflow
|
|
685
|
-
itself — skills, agents, commands — comes from the clone and updates on any run.
|
|
686
|
-
|
|
687
|
-
To work on kaizen itself, install from your own checkout so the links point at it:
|
|
688
|
-
|
|
689
|
-
```bash
|
|
690
|
-
git clone https://github.com/hfadhlullah/kaizen.git ~/kaizen
|
|
691
|
-
cd ~/kaizen && bun run cli/install.ts
|
|
692
|
-
```
|
|
693
|
-
|
|
694
|
-
Without bun:
|
|
695
|
-
|
|
696
|
-
```bash
|
|
697
|
-
mkdir -p ~/.claude/skills ~/.claude/agents ~/.claude/commands
|
|
698
|
-
ln -s ~/kaizen/skills/kaizen ~/.claude/skills/kaizen
|
|
699
|
-
ln -s ~/kaizen/skills/kaizen-help ~/.claude/skills/kaizen-help
|
|
700
|
-
for f in ~/kaizen/agents/kaizen-*.md; do ln -s "$f" ~/.claude/agents/"$(basename "$f")"; done
|
|
701
|
-
for f in ~/kaizen/commands/kaizen-*.md; do ln -s "$f" ~/.claude/commands/"$(basename "$f")"; done
|
|
702
|
-
```
|
|
703
|
-
|
|
704
|
-
</details>
|
|
705
|
-
|
|
706
|
-
## Reporting a bug
|
|
191
|
+
In a terminal: `kaizen` (dashboard), `kaizen web` (board), `kaizen settings`, `kaizen upgrade`.
|
|
707
192
|
|
|
708
|
-
|
|
709
|
-
kaizen issue [what happened]
|
|
710
|
-
```
|
|
193
|
+
## Learn more
|
|
711
194
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
is sent until you read it and press Submit on GitHub. `kaizen issue --env` only prints
|
|
717
|
-
the details.
|
|
195
|
+
- **[The guide](https://github.com/hfadhlullah/kaizen/blob/main/docs/guide.md)**: the board, request sources, notebook, settings, installer flags, uninstall
|
|
196
|
+
- [`spec.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/spec.md): the contract every stage follows
|
|
197
|
+
- [`adapters.md`](https://github.com/hfadhlullah/kaizen/blob/main/skills/kaizen/adapters.md): running outside Claude Code, with Codex and Antigravity as the worked examples. OpenCode, Cursor and Gemini CLI load the same skill folder
|
|
198
|
+
- Found a bug? `kaizen issue`, or *Report an issue* on the board, opens a GitHub bug form with your system details filled in. Nothing is sent until you press Submit on GitHub.
|
|
718
199
|
|
|
719
200
|
## License
|
|
720
201
|
|
|
721
|
-
MIT. *Kaizen (改善) is Japanese for continuous improvement
|
|
722
|
-
as you go.*
|
|
202
|
+
MIT. *Kaizen (改善) is Japanese for continuous improvement: small changes, checked as you go.*
|
package/agents/kaizen-planner.md
CHANGED
|
@@ -165,10 +165,15 @@ Write `01-plan.md` with exactly these sections:
|
|
|
165
165
|
- **Track** — one or two sentences opening the plan: what kind of work this is, the
|
|
166
166
|
deliverable, what done means, what wrong means. Stated as your reading of the
|
|
167
167
|
request, so it can be corrected in a breath.
|
|
168
|
-
- **Framing** — the problem in your own words
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
168
|
+
- **Framing** — the problem in your own words, as short labelled bullets, not a
|
|
169
|
+
paragraph: **Problem** (what is wrong now, as the user meets it), **Fix** (what will
|
|
170
|
+
be true instead, and the approach you chose), **Rejected** (each alternative, one
|
|
171
|
+
line on why). This section is what the human checks first; if your restatement is
|
|
172
|
+
off, everything after it is off too.
|
|
173
|
+
- **Work list** — the plan in plain bullets, one line per thing that will actually be
|
|
174
|
+
done, no jargon. It sits right after Framing and is shown again right before the
|
|
175
|
+
builder starts, so write it for someone who has not read the rest of the plan. Five
|
|
176
|
+
bullets is usually plenty; if it needs fifteen, the run is too big.
|
|
172
177
|
- **Goal** — one paragraph in the user's terms describing what will be true when done.
|
|
173
178
|
- **Scope** — bullets for what is included, then an explicit **Not included** list.
|
|
174
179
|
- **Reuse** — existing material to build on: `path:line` for code, a section or page
|
|
@@ -182,10 +187,6 @@ Write `01-plan.md` with exactly these sections:
|
|
|
182
187
|
it unaided for a runbook. Real and checkable, never a placeholder.
|
|
183
188
|
- **Risks** — what could break, what is irreversible, what needs a backup or
|
|
184
189
|
migration first. Call out anything touching data, auth, or production config.
|
|
185
|
-
- **Work list** — the plan in plain bullets, one line per thing that will actually be
|
|
186
|
-
done, no jargon. This is shown to the user right before the builder starts, so
|
|
187
|
-
write it for someone who has not read the rest of the plan. Five bullets is usually
|
|
188
|
-
plenty; if it needs fifteen, the run is too big.
|
|
189
190
|
- **Open questions** — every assumption that survived your analysis. Leave the list
|
|
190
191
|
empty only if it genuinely is.
|
|
191
192
|
|
|
@@ -210,6 +211,13 @@ Write `01-plan.md` with exactly these sections:
|
|
|
210
211
|
run's backlog, so write each as a standalone one-liner that still makes sense read
|
|
211
212
|
months later with no plan around it.
|
|
212
213
|
|
|
214
|
+
Write Track, Framing, Work list, Goal, Scope, Risks and Out of scope suggestions for a
|
|
215
|
+
person deciding whether to approve, often on a narrow panel: everyday words, short
|
|
216
|
+
sentences, one idea per bullet, things named by what the user sees rather than by
|
|
217
|
+
function, file, CSS value or gate id. Code names, `path:line` and gate ids belong in
|
|
218
|
+
Reuse, Steps and Verification, where the builder and reviewer need them exact. If a
|
|
219
|
+
sentence only makes sense to someone who has read the code, it is in the wrong section.
|
|
220
|
+
|
|
213
221
|
## The goals are the user's, the solution is yours
|
|
214
222
|
|
|
215
223
|
Expanding a one-liner into a clear problem statement is your job. Deciding what is
|
package/package.json
CHANGED
package/skills/kaizen/SKILL.md
CHANGED
|
@@ -108,6 +108,17 @@ worth two more stages to confirm a one-line message now reads correctly. A findi
|
|
|
108
108
|
`high` or above pulls the run back onto the full path whatever its size, since that
|
|
109
109
|
severity is the loop's whole reason for existing.
|
|
110
110
|
|
|
111
|
+
**Trivial changes take the direct path.** Where the request is one obvious change with
|
|
112
|
+
nothing to decide — a typo, a label, a one-line copy or config tweak — a plan is longer
|
|
113
|
+
than the work and a review re-reads what the user is about to look at anyway. Write
|
|
114
|
+
`00-request.md`, build straight away, write `03-impl.md`, and stop at
|
|
115
|
+
`stage: "review"`, `awaiting: "approvals.review"`: the user checks the result and
|
|
116
|
+
approves it or says what to change. No `01-plan.md`, no plan approval, no
|
|
117
|
+
`04-review.md` — the user's check is the review. Never the direct path for money, data,
|
|
118
|
+
a migration, security, anything hard to undo, or a request with an open question; in
|
|
119
|
+
`plan-only`, `auto`, or `/kaizen full`; or when in doubt. Work that turns out bigger
|
|
120
|
+
mid-build stops and goes back to a plan.
|
|
121
|
+
|
|
111
122
|
This is a judgement, not a threshold to enforce: fifty lines that change how money is
|
|
112
123
|
rounded are not a small change. Say which path you took and why, in one line, when the
|
|
113
124
|
run starts.
|
|
@@ -9,6 +9,11 @@ builder's contract. The planner and reviewer do not read it.
|
|
|
9
9
|
**Agent:** builder. **Input:** `01-plan.md`, `02-approval.md`, the track.
|
|
10
10
|
**Output:** the deliverable itself, plus `03-impl.md`.
|
|
11
11
|
|
|
12
|
+
On the direct path (see `spec.md`, Stage 0) there is no plan: the input is
|
|
13
|
+
`00-request.md`, and the request is the scope. If the work turns out to need a
|
|
14
|
+
decision, more than the one obvious change, or anything the direct path excludes,
|
|
15
|
+
stop and send the run back to `stage: "plan"`.
|
|
16
|
+
|
|
12
17
|
The builder produces whatever the track's deliverable is — code, a chapter, the
|
|
13
18
|
campaign copy, the runbook — and nothing else.
|
|
14
19
|
|
|
@@ -84,12 +84,15 @@ subagents at all.
|
|
|
84
84
|
|
|
85
85
|
## Final approval
|
|
86
86
|
|
|
87
|
-
Controlled by `approvals.review`, skipped in `auto`.
|
|
87
|
+
Controlled by `approvals.review`, skipped in `auto`. A direct-path run always stops here,
|
|
88
|
+
whatever `approvals.review` says: the user's check is its only review.
|
|
88
89
|
|
|
89
90
|
Report: what was built, verification results, findings fixed, findings still open,
|
|
90
91
|
and anything the builder noted as out of scope. Where the run used `runner: lite`, say
|
|
91
92
|
so in that report — the reviewer saw the work, and nobody should read a same-session
|
|
92
|
-
review as an independent one because the output looked the same.
|
|
93
|
+
review as an independent one because the output looked the same. Where the run took
|
|
94
|
+
the direct path, say there was no plan and no review: the user's check is the review.
|
|
95
|
+
Then stop. Committing, pushing, or
|
|
93
96
|
opening a pull request happens only if the user asks.
|
|
94
97
|
|
|
95
98
|
**Open findings are offered by number.** List them with the reviewer's numbering
|
|
@@ -44,10 +44,17 @@ scope suggestions* for a separate decision.
|
|
|
44
44
|
|
|
45
45
|
The planner reads code but writes none. Its plan must contain:
|
|
46
46
|
|
|
47
|
-
0. **Framing** — the problem in the planner's own words
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
0. **Framing** — the problem in the planner's own words, as a few short labelled
|
|
48
|
+
bullets rather than a paragraph: **Problem** (what is wrong now, as the user meets
|
|
49
|
+
it), **Fix** (what will be true instead, and the approach), **Rejected** (each
|
|
50
|
+
alternative with its reason, one line), then the track in one line. The human
|
|
51
|
+
checks this first; a wrong restatement makes everything after it wrong.
|
|
52
|
+
|
|
53
|
+
Right below it, the **Work list**: plain bullets, one line per thing that will
|
|
54
|
+
actually be done, written for someone who has not read the rest of the plan.
|
|
55
|
+
Five bullets is usually plenty. It sits second so the reader learns what will
|
|
56
|
+
happen before the detail; the plan approval shows it verbatim and the builder
|
|
57
|
+
tracks progress against it.
|
|
51
58
|
1. **Goal** — one paragraph, in the user's terms, on what will be true when done.
|
|
52
59
|
2. **Scope** — what is included, and an explicit *not included* list. The second list
|
|
53
60
|
is what prevents the builder from wandering.
|
|
@@ -115,12 +122,22 @@ installs packages.
|
|
|
115
122
|
fix loop reads it again per iteration, so a line written once is read five or six
|
|
116
123
|
times. Sections 3 to 6 — the material to reuse, the file manifest, the steps, the
|
|
117
124
|
verification — earn their length: they are what stop every later stage searching the
|
|
118
|
-
material again, and cutting them costs more than it saves. Sections 0
|
|
119
|
-
read once by a human at the approval and should be as
|
|
120
|
-
|
|
125
|
+
material again, and cutting them costs more than it saves. Sections 0 (Framing and the
|
|
126
|
+
Work list), 1, 8 and 10 are read once by a human at the approval and should be as
|
|
127
|
+
short as they can be and still be correct: a few labelled lines of framing, a short
|
|
128
|
+
work list, a paragraph of goal, the risks that are real, the
|
|
121
129
|
questions that are open. An alternative rejected gets a line saying what and why, not
|
|
122
130
|
a case against it.
|
|
123
131
|
|
|
132
|
+
**Write the parts a person reads for a person.** Framing, the Work list, Goal, Scope,
|
|
133
|
+
Risks and Out of scope suggestions are read by someone deciding whether to approve,
|
|
134
|
+
often on a narrow panel. Write them in everyday words: short sentences, one idea per
|
|
135
|
+
bullet, things named by what the user sees ("the chat bubble", "the Plan tab") rather
|
|
136
|
+
than by function, file, CSS value or gate id. Code names, `path:line` and gate ids
|
|
137
|
+
belong in Reuse, the File manifest, Steps and Verification, where the builder and
|
|
138
|
+
reviewer need them exact. If a sentence only makes sense to someone who has read the
|
|
139
|
+
code, it is in the wrong section.
|
|
140
|
+
|
|
124
141
|
A plan whose framing is longer than its steps is a plan that spent the run's budget
|
|
125
142
|
explaining itself.
|
|
126
143
|
|
|
@@ -133,8 +150,8 @@ Controlled by `approvals.plan` (default on), skipped in `auto`.
|
|
|
133
150
|
Present to the user, in this order:
|
|
134
151
|
|
|
135
152
|
1. The track, the goal, and the top risk — a few lines, not the whole plan file.
|
|
136
|
-
2. **The work list**, verbatim from the plan
|
|
137
|
-
done. This is the last thing the user sees before anything is produced, so it must
|
|
153
|
+
2. **The work list**, verbatim from the plan, where it sits right after Framing:
|
|
154
|
+
plain bullets of what will actually be done. This is the last thing the user sees before anything is produced, so it must
|
|
138
155
|
be readable on its own, without the plan's reasoning around it.
|
|
139
156
|
3. The open questions, **as a pick list** — see below.
|
|
140
157
|
|
package/skills/kaizen/spec.md
CHANGED
|
@@ -5,7 +5,8 @@ follow this document; only the way stages are dispatched differs per tool. If an
|
|
|
5
5
|
adapter and this file disagree, this file wins.
|
|
6
6
|
|
|
7
7
|
A stage may only start when the previous stage's artifact exists on disk and the approval
|
|
8
|
-
between them, if enabled, has been resolved.
|
|
8
|
+
between them, if enabled, has been resolved. The one exception is the direct path
|
|
9
|
+
(see *Stage 0*), which skips the plan and the review on purpose.
|
|
9
10
|
|
|
10
11
|
---
|
|
11
12
|
|
|
@@ -108,7 +109,10 @@ write, refreshed on every later one.
|
|
|
108
109
|
`stage` takes exactly one of five words, and boards key their columns on them:
|
|
109
110
|
`plan`, `build`, `review`, `done`, `abandoned`. Set it when the stage starts —
|
|
110
111
|
`build` before the builder touches anything, `review` before the reviewer reads — as
|
|
111
|
-
its own write, not tacked onto a longer command that may not finish.
|
|
112
|
+
its own write, not tacked onto a longer command that may not finish. Fixing findings
|
|
113
|
+
is building and a recheck is reviewing, whoever runs them and whether the loop or the
|
|
114
|
+
user picked the findings: `build` with `iteration` raised and `awaiting: null` before
|
|
115
|
+
each iteration's first edit, `review` before its recheck reads. Any other word
|
|
112
116
|
(`implement`, `fix`, `building`) is unknown to every reader and shows as still planning.
|
|
113
117
|
|
|
114
118
|
`awaiting` is `null` or the config key of the approval being waited on —
|
|
@@ -131,6 +135,16 @@ the config said the day someone came back to it.
|
|
|
131
135
|
If the request remains ambiguous enough that a plan would be guesswork, ask now. One
|
|
132
136
|
round of questions here is cheaper than a rejected plan.
|
|
133
137
|
|
|
138
|
+
**The direct path.** Where the request is one obvious change with nothing to decide —
|
|
139
|
+
a typo, a label, a one-line copy or config tweak — and being wrong is cheap and
|
|
140
|
+
visible, intake may skip the plan and the review: say so in one line, set
|
|
141
|
+
`stage: "build"`, build against `00-request.md`, write `03-impl.md`, then set
|
|
142
|
+
`stage: "review"`, `awaiting: "approvals.review"` and stop for the user to check the
|
|
143
|
+
result. No `01-plan.md` or `04-review.md` is written, and no `02-approval.md` unless
|
|
144
|
+
the user revises at that stop. Never for money, data, a migration, security, anything
|
|
145
|
+
hard to undo, or a request with an open question; never in `plan-only` or `auto`
|
|
146
|
+
mode or under `runner: full`; and when in doubt, not.
|
|
147
|
+
|
|
134
148
|
---
|
|
135
149
|
|
|
136
150
|
## Stage files
|
package/web/board.html
CHANGED
|
@@ -210,7 +210,7 @@ aside .foot .more .menu-pop{left:0;right:auto;top:auto;bottom:calc(100% + 4px)}.
|
|
|
210
210
|
.srow .hint{grid-column:1;margin:0;font-size:12px;color:var(--dim);line-height:1.45;max-width:46ch}
|
|
211
211
|
.srow input.sel{width:170px}
|
|
212
212
|
.fpick{display:inline-flex;gap:6px;align-items:center}
|
|
213
|
-
.srow[hidden],.sg[hidden],.sjump button[hidden]{display:none}
|
|
213
|
+
.srow[hidden],.yolo[hidden],.sg[hidden],.sjump button[hidden]{display:none}
|
|
214
214
|
/* search and section chips: pinned to the top of the panel while the rows scroll under it */
|
|
215
215
|
.sq{position:sticky;top:-24px;z-index:1;background:var(--bg-2);padding:24px 0 12px;margin:-24px 0 4px;border-bottom:1px solid var(--line)}.sq input{width:100%;max-width:none}.sq+.sg{margin-top:16px}
|
|
216
216
|
.sjump{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}.sjump button{padding:3px 10px;border:1px solid var(--line);border-radius:var(--r-pill);font-size:12px;color:var(--dim)}.sjump button:hover{background:var(--hover);color:var(--ink)}
|
|
@@ -232,7 +232,9 @@ aside .foot .more .menu-pop{left:0;right:auto;top:auto;bottom:calc(100% + 4px)}.
|
|
|
232
232
|
.toast.on{opacity:1}
|
|
233
233
|
.toast.on.rep{pointer-events:auto}.toast a{color:inherit;margin-left:8px;text-decoration:underline;text-underline-offset:2px}
|
|
234
234
|
.help{position:fixed;inset:0;z-index:12;display:none;align-items:center;justify-content:center;background:color-mix(in srgb,var(--bg) 60%,transparent);backdrop-filter:blur(3px)}
|
|
235
|
-
.help.on{display:flex}.help div{background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);padding:24px 28px;
|
|
235
|
+
.help.on{display:flex}.help div{background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);padding:24px 28px;box-shadow:var(--shadow-2)}
|
|
236
|
+
.help p{margin:0 0 16px;color:var(--dim)}.help dl{display:grid;grid-template-columns:auto 1fr;gap:10px 20px;align-items:center;margin:0}.help dt{display:flex;gap:6px;justify-content:flex-end}.help dd{margin:0}
|
|
237
|
+
.help kbd{font:12px/1 ui-monospace,monospace;padding:4px 7px;border:1px solid var(--line);border-bottom-width:2px;border-radius:var(--r-s);background:var(--bg);color:var(--ink-hi)}
|
|
236
238
|
/* request sources: cards, status badges, top bar, and add-box */
|
|
237
239
|
.src-topbar{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;background:var(--bg);border:1px solid var(--line);border-radius:var(--r);margin:14px 0 16px;gap:12px}
|
|
238
240
|
.src-topbar .meta{display:flex;flex-direction:column;gap:2px}
|
|
@@ -346,8 +348,8 @@ aside .foot .more .menu-pop{left:0;right:auto;top:auto;bottom:calc(100% + 4px)}.
|
|
|
346
348
|
</aside>
|
|
347
349
|
<div class="toast" id="toast" role="status"></div>
|
|
348
350
|
<div class="help" id="help"><div>
|
|
349
|
-
Optional. Everything here is also a button
|
|
350
|
-
<kbd>←↓↑→</kbd><kbd>hjkl</kbd>move between cards
|
|
351
|
+
<p>Optional. Everything here is also a button.</p>
|
|
352
|
+
<dl><dt><kbd>←↓↑→</kbd><kbd>hjkl</kbd></dt><dd>move between cards</dd><dt><kbd>Enter</kbd></dt><dd>open</dd><dt><kbd>←→</kbd><kbd>hl</kbd></dt><dd>tabs, in an open run</dd><dt><kbd>↑↓</kbd><kbd>jk</kbd></dt><dd>scroll, in an open run</dd><dt><kbd>n</kbd></dt><dd>new idea</dd><dt><kbd>e</kbd></dt><dd>edit</dd><dt><kbd>x</kbd></dt><dd>reject / abandon</dd><dt><kbd>r</kbd></dt><dd>run</dd><dt><kbd>a</kbd></dt><dd>all projects</dd><dt><kbd>Esc</kbd></dt><dd>close</dd><dt><kbd>?</kbd></dt><dd>this list</dd></dl></div></div>
|
|
351
353
|
|
|
352
354
|
<script>
|
|
353
355
|
// The page never touches the filesystem. Everything comes from /state and the run
|
|
@@ -747,7 +749,7 @@ async function openRun(c,refresh,again){
|
|
|
747
749
|
// run last moved: the same approval reached again after a revise is a new question.
|
|
748
750
|
// The footer's More menu is a <details>: close it on a click anywhere else.
|
|
749
751
|
document.addEventListener("click",e=>{for(const d of document.querySelectorAll(".more[open]"))if(!d.contains(e.target))d.open=false});
|
|
750
|
-
const APPROVAL={"approvals.plan":"The plan is ready. Read it in the Plan tab, then approve or send it back.","approvals.review":"The work is
|
|
752
|
+
const APPROVAL={"approvals.plan":"The plan is ready. Read it in the Plan tab, then approve or send it back.","approvals.review":"The work is ready to check. Approve to finish it, or revise with what to change."},decided=new Set(),answer=c=>key(c)+":"+c.awaiting+":"+c.moved;
|
|
751
753
|
async function decide(c,b,why,answers){b.disabled=true;askNotify();const r=await post("/decide",{dir:c.state,id:c.id,awaiting:c.awaiting,...(why===undefined?{}:{why}),...(answers?{answers}:{})});
|
|
752
754
|
// A failed send keeps the footer, and with it a typed comment.
|
|
753
755
|
if(!r.ok){b.disabled=false;return}
|