Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -368,11 +368,12 @@ Measured coupling (3.10.0):
<!-- kaizen:done -->
## Definition of done

- [ ] S1 and S2 merged, Kaizen 4.0.0 and kaizen-ops 1.0.0 in `marketplace.json`; S3 (4.1.0) merged after one
minor version.
- [ ] Every R covered by its tests or evals above; CI green on the matrix for each slice.
- [ ] No `/kaizen:deploy`, `/kaizen:monitor` or `/kaizen:postmortem` outside the stubs (4.0.x) and the
CHANGELOG.
- [x] S1 (#36) and S2 (#37) merged, Kaizen 4.0.0 and kaizen-ops 1.0.0 in `marketplace.json`; S3 (4.1.0)
shipped right after S2 at the user's request, without the one-minor-version delay (doctor's
`ops_plugin` warning remains the migration signal).
- [x] Every R covered by its tests or evals above; CI green on the matrix for each slice.
- [x] No `/kaizen:deploy`, `/kaizen:monitor` or `/kaizen:postmortem` outside the CHANGELOGs and
`old → new` migration notes (contract-enforced).
- [ ] Review recorded with no open P0/P1 on each slice.
- [ ] A learning captured if the split taught something durable (e.g. how a plugin reaches another one's
CLI).
8 changes: 6 additions & 2 deletions plugins/kaizen-ops/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,12 @@ stays complete without it.
Guides: [deploy](docs/guides/deploy.md) · [monitor](docs/guides/monitor.md) ·
[postmortem](docs/guides/postmortem.md) — index in [docs/](docs/README.md).

Until Kaizen 4.0 these commands were `/kaizen:deploy`, `/kaizen:monitor` and `/kaizen:postmortem`;
in Kaizen 4.0.x those names only answer where the command went.
Until Kaizen 4.0 these commands were part of Kaizen itself (stubs answered "moved" in 4.0.x; removed
in 4.1.0):

- `/kaizen:deploy` → `/kaizen-ops:deploy`
- `/kaizen:monitor` → `/kaizen-ops:monitor`
- `/kaizen:postmortem` → `/kaizen-ops:postmortem`

## How it works

Expand Down
9 changes: 7 additions & 2 deletions plugins/kaizen-ops/tests/contracts.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,13 @@ test('every cited path exists: ${CLAUDE_PLUGIN_ROOT} in this plugin, core-root i
test('every command reference names an existing skill, here or in core', () => {
for (const { file, text } of docs) {
for (const [, s] of text.matchAll(/\/kaizen-ops:([a-z-]+)/g)) assert.ok(skills.includes(s), `${file}: /kaizen-ops:${s} does not exist`);
for (const [, s] of text.matchAll(/kaizen:([a-z][a-z-]*)/g)) {
assert.ok(coreSkills.includes(s) || coreAgents.includes(s), `${file}: kaizen:${s} is not a Kaizen core skill or agent`);
if (file.endsWith('CHANGELOG.md')) continue; // history keeps the names of its time
for (const line of text.split('\n')) {
for (const [, s] of line.matchAll(/(?<![\w-])kaizen:([a-z][a-z-]*)/g)) {
// A former /kaizen:<name> is fine as a migration note next to its /kaizen-ops:<name>.
if (skills.includes(s) && line.includes(`kaizen-ops:${s}`)) continue;
assert.ok(coreSkills.includes(s) || coreAgents.includes(s), `${file}: kaizen:${s} is not a Kaizen core skill or agent`);
}
}
}
});
Expand Down
2 changes: 1 addition & 1 deletion plugins/kaizen/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "kaizen",
"description": "High-quality AI SDLC adapted from the Compound Engineering loop: engineering constitution enforced as gates, brainstorm, plan (traceability, threats, rollout, PR-sized slices) with independent doc review, test-first work with a Stop-hook quality gate, multi-agent code review, ship and PR watching, UI polish, learnings in docs/learnings/ read back by every cycle, ADRs, blameless postmortems, DORA metrics and releases; production commands (deploy, monitor, postmortem) in kaizen-ops",
"version": "4.0.0",
"version": "4.1.0",
"author": {
"name": "Angelo LIMA",
"email": "[email protected]"
Expand Down
12 changes: 12 additions & 0 deletions plugins/kaizen/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@

Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versions: [SemVer](https://semver.org/).

## [4.1.0] - 2026-10-20

### Removed
- The `/kaizen:deploy`, `/kaizen:monitor` and `/kaizen:postmortem` stubs and their guides (deprecated
in 4.0.0): Kaizen's command list no longer carries the production commands. They are
`/kaizen-ops:deploy`, `/kaizen-ops:monitor`, `/kaizen-ops:postmortem` in the kaizen-ops plugin;
`kaizen doctor` still tells a repository that declares deployments or signals to enable it.

### Changed
- Contract tests: a changelog keeps the command names of its time; elsewhere a former `/kaizen:<name>`
may only appear as a migration note, on the line that names its `/kaizen-ops:<name>`.

## [4.0.0] - 2026-10-20

### Breaking
Expand Down
10 changes: 7 additions & 3 deletions plugins/kaizen/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,13 @@ run next.
### Deploy and monitor — in kaizen-ops

Since 4.0 the production commands live in the [**kaizen-ops**](../kaizen-ops/README.md) plugin, for
teams that deploy through Kaizen: `/kaizen:deploy` → `/kaizen-ops:deploy`, `/kaizen:monitor` →
`/kaizen-ops:monitor`, `/kaizen:postmortem` → `/kaizen-ops:postmortem` (until 4.1.0 the old names only
answer where the command went). Enable it next to Kaizen:
teams that deploy through Kaizen (the old names were removed in 4.1.0):

- `/kaizen:deploy` → `/kaizen-ops:deploy`
- `/kaizen:monitor` → `/kaizen-ops:monitor`
- `/kaizen:postmortem` → `/kaizen-ops:postmortem`

Enable it next to Kaizen:
`"enabledPlugins": { "kaizen@dojo": true, "kaizen-ops@dojo": true }`. The CLI, the configuration and
every gate behind them — typed approval for protected environments, deployment tags, DORA from real
deployments — stay here, so nothing is weaker without it.
Expand Down
4 changes: 2 additions & 2 deletions plugins/kaizen/docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,12 @@ In-depth pages: what each mechanism does exactly, with its rules, limits and dia
- [address-feedback](guides/address-feedback.md) — handle review feedback
- [watch-pr](guides/watch-pr.md) — drive a PR to "ready"
- [release](guides/release.md) — prepare a version
- [deploy](guides/deploy.md), [monitor](guides/monitor.md) — moved to [kaizen-ops](../../kaizen-ops/docs/README.md) in 4.0
- deploy, monitor — in [kaizen-ops](../../kaizen-ops/docs/README.md) since 4.0

**Learn and measure**
- [learn](guides/learn.md) — capture a learning
- [prune-learnings](guides/prune-learnings.md) — maintain the learnings
- [postmortem](guides/postmortem.md) — moved to [kaizen-ops](../../kaizen-ops/docs/README.md) in 4.0
- postmortem — in [kaizen-ops](../../kaizen-ops/docs/README.md) since 4.0
- [metrics](guides/metrics.md) — measure delivery and the compounding effect

**Orchestrate**
Expand Down
10 changes: 0 additions & 10 deletions plugins/kaizen/docs/guides/deploy.md

This file was deleted.

10 changes: 0 additions & 10 deletions plugins/kaizen/docs/guides/monitor.md

This file was deleted.

10 changes: 0 additions & 10 deletions plugins/kaizen/docs/guides/postmortem.md

This file was deleted.

2 changes: 1 addition & 1 deletion plugins/kaizen/docs/troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ does not run them — `git config core.hooksPath .githooks`.

| Message | What to do |
|---|---|
| `/kaizen:deploy` (or monitor, postmortem) only says "moved", or `/kaizen-ops:deploy` is unknown | since Kaizen 4.0 the production commands are in the kaizen-ops plugin: `"enabledPlugins": { "kaizen-ops@dojo": true }` in `.claude/settings.json` (`node $K audit fix claude_settings` does it), then a new session; `kaizen doctor` reports it |
| `/kaizen:deploy` (or monitor, postmortem) is unknown, or `/kaizen-ops:deploy` is unknown | since Kaizen 4.0 the production commands are in the kaizen-ops plugin (`/kaizen-ops:deploy`, `/kaizen-ops:monitor`, `/kaizen-ops:postmortem`): `"enabledPlugins": { "kaizen-ops@dojo": true }` in `.claude/settings.json` (`node $K audit fix claude_settings` does it), then a new session; `kaizen doctor` reports it |
| "Direct deployment of production refused" | go through `/kaizen-ops:deploy production`: it asks for your approval, creates the tag and watches |
| "production is protected: approval required" | type the displayed code yourself: `kaizen deploy <code>` (30 min, for this commit) |
| "unknown environment" | declare it in `.kaizen/config.json` → `deploy.environments` ([configuration](configuration.md#deploy--deployment-and-rollback)), or `node $K deploy detect` |
Expand Down
16 changes: 0 additions & 16 deletions plugins/kaizen/skills/deploy/SKILL.md

This file was deleted.

16 changes: 0 additions & 16 deletions plugins/kaizen/skills/monitor/SKILL.md

This file was deleted.

16 changes: 0 additions & 16 deletions plugins/kaizen/skills/postmortem/SKILL.md

This file was deleted.

13 changes: 10 additions & 3 deletions plugins/kaizen/tests/contracts.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,18 @@ test('every kaizen:<name> reference names an existing skill or agent', () => {
const known = new Set([...skills, ...agents]);
// Plan section markers (kaizen:goal…) and artifact contracts: not skills.
const markers = new Set(['goal', 'product', 'relationships', 'planning', 'constitution', 'threats', 'rollout', 'units', 'verification', 'done', 'id', 'section', 'name']);
// Commands moved to kaizen-ops in 4.0: a changelog keeps them as history; elsewhere an old name may
// only appear as a migration note, on the line that names its /kaizen-ops: replacement.
const moved = new Set(['deploy', 'monitor', 'postmortem']);
const bad = [];
for (const { file, text } of docs) {
for (const m of text.matchAll(/kaizen:([a-z][a-z-]*)/g)) {
if (markers.has(m[1]) || known.has(m[1])) continue;
bad.push(`${file} → kaizen:${m[1]}`);
if (file.endsWith('CHANGELOG.md')) continue;
for (const line of text.split('\n')) {
for (const m of line.matchAll(/(?<![\w-])kaizen:([a-z][a-z-]*)/g)) {
if (markers.has(m[1]) || known.has(m[1])) continue;
if (moved.has(m[1]) && line.includes(`kaizen-ops:${m[1]}`)) continue;
bad.push(`${file} → kaizen:${m[1]}`);
}
}
}
assert.deepEqual(bad, []);
Expand Down
Loading