kimal3 0.7.0 → 0.9.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/claude-plugins/kimal3-plan/.claude-plugin/plugin.json +2 -2
- package/claude-plugins/kimal3-plan/hooks/erinnerung.ts +13 -9
- package/claude-plugins/kimal3-plan/hooks/gespraech.ts +134 -0
- package/claude-plugins/kimal3-plan/hooks/lauf.ts +50 -3
- package/claude-plugins/kimal3-plan/hooks/lebenszeichen.ts +61 -8
- package/claude-plugins/kimal3-plan/hooks/register.tsx +5 -2
- package/claude-plugins/kimal3-plan/hooks/spec-text.ts +8 -3
- package/claude-plugins/kimal3-plan/types/index.d.ts +4 -0
- package/coach/de/kimal3-coach.md +40 -12
- package/coach/en/kimal3-coach.md +38 -12
- package/dist/meldungen-speicher.js +5 -0
- package/dist/texte/meldungen.js +2 -2
- package/dist/texte/skill.js +12 -12
- package/package.json +1 -1
- package/skill/commands/k3feierabend.md +16 -7
- package/skill/commands/k3plan.md +44 -24
- package/skill/en/commands/k3plan.md +46 -26
- package/skill/en/commands/k3show.md +3 -1
- package/skill/en/commands/k3wrapup.md +15 -6
|
@@ -41,7 +41,7 @@ not needed any more — the state is in the app. You can delete it." You do not
|
|
|
41
41
|
**What the output means** (example, made-up values):
|
|
42
42
|
|
|
43
43
|
```
|
|
44
|
-
Spec 2026-09-23-content-planner · Content planner as a page (plan/2026-09-23-content-planner
|
|
44
|
+
Spec 2026-09-23-content-planner · Content planner as a page (plan/2026-09-23-content-planner.md)
|
|
45
45
|
US-1 · built · round 1 · Create posts
|
|
46
46
|
US-2 · in progress · round 1 · Move posts in the calendar
|
|
47
47
|
Noted topic T-3: Export as PDF
|
|
@@ -98,7 +98,7 @@ count `US-1`, `US-2` … yourself in their order.
|
|
|
98
98
|
**The state of each story (`stand`):**
|
|
99
99
|
- `offen` — nothing built yet.
|
|
100
100
|
- `in_arbeit` — partly built, or a finding is open.
|
|
101
|
-
- `gebaut` — built. The app sets the date; plus a `testen`
|
|
101
|
+
- `gebaut` — built. The app sets the date; plus a `testen` text (section 4).
|
|
102
102
|
- `weggelassen` — deliberately not built, `grund` is required (rule 8). Only if the spec or the
|
|
103
103
|
person decided so — never on your own to tidy up. If in doubt: leave it `offen` and ask in the
|
|
104
104
|
report.
|
|
@@ -110,8 +110,9 @@ Run the counter-check of each criterion **wherever you can**: the project's guar
|
|
|
110
110
|
|
|
111
111
|
- `bestanden` (passed) — **only** if the counter-check ran in this session and showed the
|
|
112
112
|
expected result. Never from memory, never from last time, never because the code "looks right".
|
|
113
|
-
- `gescheitert` (failed) — it ran and showed something else. That is a finding (rule 1)
|
|
114
|
-
then
|
|
113
|
+
- `gescheitert` (failed) — it ran and showed something else. That is a finding (rule 1): the story
|
|
114
|
+
then carries ⚠ and sits under "In progress" while a session is working on it, otherwise under
|
|
115
|
+
"Open" — its spec does not move to "Your test".
|
|
115
116
|
- `offen` (not run) — everything that did not run: needs a browser, a sign-in, real data or a
|
|
116
117
|
person. Reading only counts if the criterion says something about the file itself (a file
|
|
117
118
|
exists, a text is there as written) — reading does not prove a behaviour.
|
|
@@ -122,7 +123,11 @@ built or checked (the spec is then under "Your test"). Until then the app calls
|
|
|
122
123
|
already passed "Checked by Claude". Say in the report what is missing so the counter-check can
|
|
123
124
|
run.
|
|
124
125
|
|
|
125
|
-
**The `testen`
|
|
126
|
+
**The `testen` text** (on every `gebaut` story, at most 1000 characters) is a guide for someone without technical knowledge. If the story sits in a spec with the box "How you test it", you take it from there, word for word; if the box is missing, you write it yourself. **One line per step** — where to find it, what to do, what must appear —, **without** the box heading, and **last** the line "Doesn't work if: …". In the JSON you separate the lines with `\n`: a real line break inside the text breaks the JSON, and `kimal3 plan report` cannot read the report. If the text is longer than 1000 characters, shorten the steps — never cut off in the middle of a sentence; the line "Doesn't work if: …" must stay at the end. A command only if there is no other way - then say where to type it (in Claude Code in the project folder, with `!` in front) and put it in backticks. If the text is missing, the app shows: "Claude didn't write down how to test this".
|
|
127
|
+
|
|
128
|
+
**Checking is work.** Before you check a story with pending counter-checks (column "Claude test pending") against the code, you report it as `in_arbeit` **with** the session (so without `--no-session`) **and with `"pruefen": true`**: while you check, the dot at the project glows, but the card doesn't come into discussion — without the field the blue frame would wander through every spec you check. After the check you report the result (`gebaut`, or `in_arbeit` with a finding — every `in_arbeit` report from `/k3plan` carries `"pruefen": true`). Stories under "Your test" or "Done" you do **not** report again during the reconciliation, even if you look through them: `in_arbeit` followed by `gebaut` sets their build date to today, and every report shows the label "changed" and, with two sessions, the ⚠ "changed at the same time". What stays unfinished at the end of `/k3plan`, you report with `--no-session` (section 6).
|
|
129
|
+
|
|
130
|
+
**How a spec is built.** If you find a spec while checking that is not built like this, say so in the report — you do not rewrite it. A story in it sits in four boxes: **User story** (the title names the person's goal) · **Acceptance criterion** (with counter-check) · **How you test it** (numbered steps, below them "Doesn't work if: …") · **Technical note**.
|
|
126
131
|
|
|
127
132
|
**Findings** (`befunde`): only **open** ones. `quelle: "claude"` for something the story promises
|
|
128
133
|
and doesn't do, and that no criterion covers. `seit`: the date the finding came up. A `befunde`
|
|
@@ -133,7 +138,7 @@ just the new one. If the field is missing, the list stays as it is.
|
|
|
133
138
|
- It starts at `1` and **never** goes down; if a report has no `runde`, it stays.
|
|
134
139
|
- **Raise it by exactly 1** when a story with a finding from the person (`quelle: "mensch"`) has
|
|
135
140
|
been fixed since (Git history, and the counter-checks pass now): then `befunde: []`,
|
|
136
|
-
`stand: "gebaut"`, `runde` + 1, a new `testen`
|
|
141
|
+
`stand: "gebaut"`, `runde` + 1, a new `testen` text. The person tests again. If it is
|
|
137
142
|
unclear whether it was fixed: leave the finding and ask in the report.
|
|
138
143
|
- **Also raise it** if you changed a **confirmed** story in a way the person would notice — their
|
|
139
144
|
old "Works" no longer applies (rule 7).
|
|
@@ -143,11 +148,11 @@ just the new one. If the field is missing, the list stays as it is.
|
|
|
143
148
|
|
|
144
149
|
The app shows them to the person in exactly this wording ("How planning stays short"):
|
|
145
150
|
|
|
146
|
-
1. **A problem does not become a new card.** If a story doesn't hold what it promises — Claude's check fails or you say "Doesn't work" — the problem (finding) is attached to that story
|
|
151
|
+
1. **A problem does not become a new card.** If a story doesn't hold what it promises — Claude's check fails or you say "Doesn't work" — the problem (finding) is attached to that story. It stays in "Open" until someone works on it.
|
|
147
152
|
2. **Only what nobody promised is new. It goes into the inbox, which has five places.**
|
|
148
|
-
3. **Claude sorts every topic at the next check (`/k3plan`):** as a new story in a spec, as a finding on a story, or dropped with a reason. There is no "later".
|
|
153
|
+
3. **Claude sorts every topic at the next check (`/k3plan`):** as a new story in a spec, as a finding on a story, or dropped with a reason. There is no "later".
|
|
149
154
|
4. **Nothing stays in the inbox longer than 14 days.**
|
|
150
|
-
5. **At most one spec in progress at once** ("In progress" and "Claude test pending" together). Finish it before starting the next.
|
|
155
|
+
5. **At most one spec in progress at once** ("In progress" and "Claude test pending" together). "In progress" means: a Claude session is working on it right now. Finish it before starting the next.
|
|
151
156
|
6. **At most five stories wait for your test.** If there are more, Claude starts nothing new until you have tested.
|
|
152
157
|
7. **Done means checked twice:** Claude tried everything itself, and you said "Works" — for exactly this version.
|
|
153
158
|
8. **A spec is only closed when every story is done or deliberately left out** — with a reason. There is no silent remainder.
|
|
@@ -155,8 +160,8 @@ The app shows them to the person in exactly this wording ("How planning stays sh
|
|
|
155
160
|
**What you do with them** (every time a report, section 6):
|
|
156
161
|
|
|
157
162
|
- **Rule 1 — every `doesn't work` from `kimal3 plan`:** if the story still exists, report it with
|
|
158
|
-
the person's sentence as a finding (`quelle: "mensch"`, `seit: "<today>"`)
|
|
159
|
-
`stand: "in_arbeit"`, and right behind it in the same list `uebernommen` with the number:
|
|
163
|
+
the person's sentence as a finding (`quelle: "mensch"`, `seit: "<today>"`),
|
|
164
|
+
`stand: "in_arbeit"` and `"pruefen": true`, and right behind it in the same list `uebernommen` with the number:
|
|
160
165
|
`{ "art": "uebernommen", "rueckmeldung": 12, "antwort": "Finding on US-2" }`. If it has already
|
|
161
166
|
been fixed since, raise `runde` by 1 instead, with `befunde: []` and `stand: "gebaut"`
|
|
162
167
|
(section 4). If the story no longer exists, the `antwort` says why. ⚠️ Without a finding from
|
|
@@ -177,10 +182,9 @@ The app shows them to the person in exactly this wording ("How planning stays sh
|
|
|
177
182
|
`dropped: public holidays are already in the calendar tool.`
|
|
178
183
|
|
|
179
184
|
For a note from the app (`#13 · Topic`), the answer goes into an `uebernommen` report as **one
|
|
180
|
-
sentence**
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
"Recently sorted" for 14 days. Name how it was sorted in the report too.
|
|
185
|
+
sentence**, **without** an arrow at the start. A `Noted topic` of yours you sort with an `eingeordnet`
|
|
186
|
+
report (key, text as above, answer) — the app takes it out of the topics.
|
|
187
|
+
The page doesn't show the answer; so name how it was sorted in the report.
|
|
184
188
|
- **Rule 4:** because you sort everything at every `/k3plan`, nothing stays long. A topic that has
|
|
185
189
|
been waiting more than 14 days is sorted now **in any case**.
|
|
186
190
|
- **Rules 5 and 6 — don't start a new spec** while another spec is in progress (one of its
|
|
@@ -188,7 +192,7 @@ The app shows them to the person in exactly this wording ("How planning stays sh
|
|
|
188
192
|
criterion or with no criteria at all), or while more than five stories are waiting for the person's test (`gebaut`, all
|
|
189
193
|
passed, no finding, not yet confirmed — **and** no story of their spec keeps the spec in progress: only then
|
|
190
194
|
is it under "Your test", and only then does the app count the story). **Tell the person what to test instead** — with the
|
|
191
|
-
`testen`
|
|
195
|
+
`testen` texts. If you sort a topic in as a new story in a spec, you do not start that spec
|
|
192
196
|
with it: it stays `offen`, and the spec does not count as in progress.
|
|
193
197
|
- **Rule 7:** only the person sets "Done", with "Works" in the app; a report has no field for it.
|
|
194
198
|
You only keep the round stable (section 4).
|
|
@@ -196,46 +200,60 @@ The app shows them to the person in exactly this wording ("How planning stays sh
|
|
|
196
200
|
|
|
197
201
|
## 6. The reports
|
|
198
202
|
|
|
199
|
-
A report is a JSON object, several are a list. It goes through the input to `kimal3 plan report
|
|
203
|
+
A report is a JSON object, several are a list. It goes through the input to `kimal3 plan report`;
|
|
200
204
|
the program sets the time itself, and the project comes from the folder note
|
|
201
|
-
`plan/projekt.json`. Checking is
|
|
205
|
+
`plan/projekt.json`. Checking is work — reported with the session, the dot on the board glows while you check; `"pruefen": true` on every `in_arbeit` report keeps the card out of discussion meanwhile.
|
|
202
206
|
|
|
203
207
|
```
|
|
204
|
-
echo '[ … ]' | kimal3 plan report
|
|
208
|
+
echo '[ … ]' | kimal3 plan report
|
|
205
209
|
```
|
|
206
210
|
|
|
207
|
-
(In PowerShell: `'[ … ]' | kimal3 plan report
|
|
211
|
+
(In PowerShell: `'[ … ]' | kimal3 plan report`. For long texts, use a file.) The examples are
|
|
208
212
|
made up.
|
|
209
213
|
|
|
214
|
+
**At the very end** you report the stories that stay unfinished (in progress, a finding open) once more —
|
|
215
|
+
in their **own** call with `--no-session`, separate from the list of the finished ones: a mixed list
|
|
216
|
+
without the flag ties the unfinished story to the session too, and the dot keeps glowing. With the flag
|
|
217
|
+
the plan state stays `in_arbeit`, but the dot stops glowing while the window stays open — on the board the
|
|
218
|
+
story then sits under "Open" as started.
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
echo '[ … ]' | kimal3 plan report --no-session
|
|
222
|
+
```
|
|
223
|
+
|
|
210
224
|
**A spec** — when checking, and when stories are added:
|
|
211
225
|
|
|
212
226
|
```json
|
|
213
|
-
{ "art": "spec", "schluessel": "2026-10-24-test-month", "titel": "Test month",
|
|
227
|
+
{ "art": "spec", "schluessel": "2026-10-24-test-month-design", "titel": "Test month",
|
|
214
228
|
"datei": "docs/superpowers/specs/2026-10-24-test-month-design.md",
|
|
215
229
|
"stories": [ { "schluessel": "US-1", "titel": "The test month starts" },
|
|
216
230
|
{ "schluessel": "US-2", "titel": "The test month ends" },
|
|
217
231
|
{ "schluessel": "US-3", "titel": "Export of the test month" } ] }
|
|
218
232
|
```
|
|
219
233
|
|
|
234
|
+
Leave out `wartet_auf_lesen` here: if the field is missing, the label "Waiting for you to read" stays as it is. It is set
|
|
235
|
+
and removed when you hand a spec to the person to read and they approve it (coach, section 3.6) — the same goes for the report
|
|
236
|
+
`gespraech`; `/k3plan` sends none.
|
|
237
|
+
|
|
220
238
|
**A story** — one deviation, one entry. Built, with a counter-check:
|
|
221
239
|
|
|
222
240
|
```json
|
|
223
|
-
{ "art": "story", "spec": "2026-10-24-test-month", "story": "US-1", "stand": "gebaut",
|
|
241
|
+
{ "art": "story", "spec": "2026-10-24-test-month-design", "story": "US-1", "stand": "gebaut",
|
|
224
242
|
"kriterien": [ { "text": "If Sabine starts on 1 Nov, the test month ends on 30 Nov.", "gegenprobe": "bestanden" } ],
|
|
225
|
-
"testen": "In the app open 'Test month'
|
|
243
|
+
"testen": "1. In the app open 'Test month'.\n2. Click Start.\n3. Below it says 'Ends on 30 Nov'.\nDoesn't work if: it shows another date." }
|
|
226
244
|
```
|
|
227
245
|
|
|
228
246
|
With an open finding (here from you; `quelle: "mensch"` only for the person's sentence):
|
|
229
247
|
|
|
230
248
|
```json
|
|
231
|
-
{ "art": "story", "spec": "2026-10-24-test-month", "story": "US-2", "stand": "in_arbeit",
|
|
249
|
+
{ "art": "story", "spec": "2026-10-24-test-month-design", "story": "US-2", "stand": "in_arbeit", "pruefen": true,
|
|
232
250
|
"befunde": [ { "text": "On 30 Nov the reminder mail the spec promises is missing.", "quelle": "claude", "seit": "2026-10-23" } ] }
|
|
233
251
|
```
|
|
234
252
|
|
|
235
253
|
Deliberately left out (`grund` is required):
|
|
236
254
|
|
|
237
255
|
```json
|
|
238
|
-
{ "art": "story", "spec": "2026-10-24-test-month", "story": "US-3", "stand": "weggelassen", "grund": "The spec drops the export." }
|
|
256
|
+
{ "art": "story", "spec": "2026-10-24-test-month-design", "story": "US-3", "stand": "weggelassen", "grund": "The spec drops the export." }
|
|
239
257
|
```
|
|
240
258
|
|
|
241
259
|
**A topic** (rule 2), **sorting a topic of yours** (rule 3), **handing on a response from the
|
|
@@ -264,6 +282,8 @@ send it again. `2` — no longer signed in: tell the person `kimal3 login`; the
|
|
|
264
282
|
| `Response 12 doesn't exist in this project or is listed twice …` | Only numbers from `kimal3 plan`, each once. |
|
|
265
283
|
| `Response 12 ("…") is marked as handled, but US-2 has no finding from you …` | Report the story with the finding `quelle: "mensch"` first (rule 1) — or `runde` + 1 if it has been fixed — then `uebernommen`. |
|
|
266
284
|
| `The plan can't be read: <place> …` | Correct the named place in the report (length, `grund` on `weggelassen`, duplicate key). |
|
|
285
|
+
| `The “in discussion” report needs the chat it comes from.` | Report again with the session, not with `--no-session`. |
|
|
286
|
+
| `Another chat is discussing this card right now.` | Do nothing: another chat carries the discussion. |
|
|
267
287
|
| `The report arrived, but the text of <file> didn't …` | Send the report again — sending twice does no harm. If the text no longer fits (over 300 KB), tell the person. |
|
|
268
288
|
| `The reports are saved, but not fully recorded yet.` | Send again — sending twice does no harm. |
|
|
269
289
|
| `The planning saved in the app is damaged …` | Tell the person. `kimal3 plan upload --overwrite` replaces the planning with a whole file `plan/stand.json` — **only after their explicit yes.** |
|
|
@@ -276,7 +296,7 @@ message suggests it.
|
|
|
276
296
|
**At most five lines**, without jargon — and nothing about the reports themselves:
|
|
277
297
|
|
|
278
298
|
- what became **done** (confirmed since last time),
|
|
279
|
-
- what is **waiting for their test** (only stories from specs under "Your test") — with the `testen`
|
|
299
|
+
- what is **waiting for their test** (only stories from specs under "Your test") — with the `testen` text so they can start right away,
|
|
280
300
|
- what was decided in the **inbox** (each topic with its answer),
|
|
281
301
|
- a **warning** if rule 5 or 6 is broken: "Test first …" instead of a new story,
|
|
282
302
|
- the **link** from `View: …`.
|
|
@@ -60,7 +60,9 @@ workbench) · “The project folder is nested too deeply for the recorder …”
|
|
|
60
60
|
|
|
61
61
|
If the session is in the workbench, say **that first**, in one sentence: the recording belongs in
|
|
62
62
|
a project, and you'll suggest one in a moment. Then explain in at most five short sentences what
|
|
63
|
-
happens, and ask **one** question:
|
|
63
|
+
happens, and ask **one** question. **Word for word: the first sentence of that explanation is
|
|
64
|
+
exactly this one: “You show me the task once and talk while you do it.”** Don't open with anything
|
|
65
|
+
else and don't reword it (only the workbench sentence above may come before it); the rest follows as written:
|
|
64
66
|
|
|
65
67
|
> “You show me the task once and talk while you do it. I record the screen, sound, clicks and
|
|
66
68
|
> keys. It stays on your computer. Before I read any of it, I'll ask you. Which task do you want
|
|
@@ -21,21 +21,30 @@ and skip it — no filler.
|
|
|
21
21
|
- **Reconcile the board — only in a project folder that has a project in the app** (otherwise skip
|
|
22
22
|
it and say nothing). `kimal3 plan` shows the state the app knows; hold it against what really
|
|
23
23
|
happened today. What is done and whose counter-checks ran in this session is `gebaut` with
|
|
24
|
-
criteria and a `testen`
|
|
25
|
-
up today and no spec promises goes in as a `thema`. Report only what differs from that state
|
|
24
|
+
criteria and a `testen` text; what was started and isn't done stays `in_arbeit` — and goes into its **own** call `kimal3 plan report --no-session`, separate from the list of the finished ones (a mixed list without the flag ties the unfinished story to the session too, and the dot keeps glowing although the window is merely open); what came
|
|
25
|
+
up today and no spec promises goes in as a `thema`. Report only what differs from that state: the finished ones in
|
|
26
26
|
one list with `kimal3 plan report` (format and exit codes: the coach, section 3.6, and
|
|
27
27
|
`/k3plan`, section 6; what an exit code means is in `~/.claude/skills/kimal3/SKILL.md`):
|
|
28
28
|
|
|
29
29
|
```json
|
|
30
|
-
[ { "art": "story", "spec": "2026-10-24-test-month", "story": "US-1", "stand": "gebaut",
|
|
30
|
+
[ { "art": "story", "spec": "2026-10-24-test-month-design", "story": "US-1", "stand": "gebaut",
|
|
31
31
|
"kriterien": [ { "text": "If Sabine starts on 1 Nov, it ends on 30 Nov.", "gegenprobe": "bestanden" } ],
|
|
32
|
-
"testen": "Open /test-month
|
|
33
|
-
|
|
32
|
+
"testen": "1. Open /test-month.\n2. Click Start.\n3. Below it says Ends on 30 Nov.\nDoesn't work if: it shows another date." } ]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
And what stays unfinished, separately, with the flag:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
[ { "art": "story", "spec": "2026-10-24-test-month-design", "story": "US-2", "stand": "in_arbeit" } ]
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
echo '[ … ]' | kimal3 plan report --no-session
|
|
34
43
|
```
|
|
35
44
|
|
|
36
45
|
On success you say nothing about it. If you mention the board in the wrap-up (step 6), then only
|
|
37
46
|
what did **not** work (a refusal, or kept because the app was not reachable). The dot at the
|
|
38
|
-
project on the project page stays as long as the window is open; when the person closes it, it
|
|
47
|
+
project on the project page stays for work in progress, as long as the window is open; when the person closes it, it
|
|
39
48
|
is gone in under a second.
|
|
40
49
|
|
|
41
50
|
## 2. Update the status file — and tidy it up
|