kimal3 0.5.0 → 0.6.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 +4 -0
- package/dist/befehle/plan-hoch.js +114 -0
- package/dist/befehle/plan.js +110 -0
- package/dist/befehle-katalog-en.js +14 -0
- package/dist/befehle-katalog.js +18 -0
- package/dist/befehlswoerter.js +5 -0
- package/dist/kimal3.js +5 -0
- package/dist/plan-datei.js +172 -0
- package/dist/slash-befehle.js +1 -0
- package/dist/texte/plan.js +93 -0
- package/package.json +30 -30
- package/skill/SKILL.md +2 -1
- package/skill/commands/k3.md +4 -3
- package/skill/commands/k3kurs.md +41 -41
- package/skill/commands/k3plan.md +347 -0
- package/skill/en/SKILL.md +3 -2
- package/skill/en/commands/k3.md +4 -3
- package/skill/en/commands/k3course.md +41 -41
- package/skill/en/commands/k3plan.md +342 -0
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Back into the Mini course — pick up where you left off
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<!-- kimal3:erzeugt — this file is maintained by `kimal3 skill install` and
|
|
6
|
-
overwritten on every update. Your own changes will be lost; if you want
|
|
7
|
-
to keep them, copy the file under a different name. -->
|
|
8
|
-
# Course
|
|
9
|
-
|
|
10
|
-
> Back into the Mini course: “Where was I again?” — picks up where you left off.
|
|
11
|
-
> `kimal3 course` fetches the status fresh from kimal3 — the same ticks the person sees in the browser at
|
|
12
|
-
> https://app.kimal3.de/kurs.
|
|
13
|
-
|
|
14
|
-
Carry out the steps in order. Stay in the coaching tone: English, friendly, one step at a
|
|
15
|
-
time, the why before the how, no prior knowledge assumed.
|
|
16
|
-
|
|
17
|
-
## 1. Fetch the status
|
|
18
|
-
- Run `kimal3 course` (on Windows the way `SKILL.md` describes).
|
|
19
|
-
- Exit code **2**: the person is not signed in. Show them `kimal3 login`, let them confirm in the browser themselves
|
|
20
|
-
and name **no** course status.
|
|
21
|
-
- Exit code **3**: the status can't be fetched right now. Say so in one sentence and **do not retell the course from
|
|
22
|
-
memory**.
|
|
23
|
-
- If the program doesn't know the command, it is too old: name `npm install -g kimal3@latest`, then `kimal3 skill install`.
|
|
24
|
-
|
|
25
|
-
## 2. Say where you stand in one sentence
|
|
26
|
-
- Say in **one** sentence where you are in the course — from the output (the `Course:` line), invent nothing. No lecture.
|
|
27
|
-
|
|
28
|
-
## 3. Lead on with what comes next
|
|
29
|
-
- The line `Next:` names the next step. Lead on **one** step at a time: show, let them do it, make sure they understand.
|
|
30
|
-
Never the whole list at once.
|
|
31
|
-
- If it says **“(you tick it off)”** after it and the person has obviously already done the step (for example “closed
|
|
32
|
-
Claude completely and reopened it” — they are sitting in Claude right now), don't lead it again: ask briefly and
|
|
33
|
-
ask them to tick it off at https://app.kimal3.de/kurs.
|
|
34
|
-
- If it says **“(Claude sets it)”** and it is open, run the setup once more — through the guide
|
|
35
|
-
`https://app.kimal3.de/setup` (load it the way the course sentence does and follow it), **not** with a freely called
|
|
36
|
-
`kimal3 setup`. If the step is still open afterwards, name the reason from the output of `setup` and don't suggest
|
|
37
|
-
a third run.
|
|
38
|
-
|
|
39
|
-
## 4. Finished
|
|
40
|
-
- If the output says `Course: complete`, congratulate them briefly and ask, with a suggestion, what they would like to
|
|
41
|
-
work on here. No more course talk.
|
|
1
|
+
---
|
|
2
|
+
description: Back into the Mini course — pick up where you left off
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<!-- kimal3:erzeugt — this file is maintained by `kimal3 skill install` and
|
|
6
|
+
overwritten on every update. Your own changes will be lost; if you want
|
|
7
|
+
to keep them, copy the file under a different name. -->
|
|
8
|
+
# Course
|
|
9
|
+
|
|
10
|
+
> Back into the Mini course: “Where was I again?” — picks up where you left off.
|
|
11
|
+
> `kimal3 course` fetches the status fresh from kimal3 — the same ticks the person sees in the browser at
|
|
12
|
+
> https://app.kimal3.de/kurs.
|
|
13
|
+
|
|
14
|
+
Carry out the steps in order. Stay in the coaching tone: English, friendly, one step at a
|
|
15
|
+
time, the why before the how, no prior knowledge assumed.
|
|
16
|
+
|
|
17
|
+
## 1. Fetch the status
|
|
18
|
+
- Run `kimal3 course` (on Windows the way `SKILL.md` describes).
|
|
19
|
+
- Exit code **2**: the person is not signed in. Show them `kimal3 login`, let them confirm in the browser themselves
|
|
20
|
+
and name **no** course status.
|
|
21
|
+
- Exit code **3**: the status can't be fetched right now. Say so in one sentence and **do not retell the course from
|
|
22
|
+
memory**.
|
|
23
|
+
- If the program doesn't know the command, it is too old: name `npm install -g kimal3@latest`, then `kimal3 skill install`.
|
|
24
|
+
|
|
25
|
+
## 2. Say where you stand in one sentence
|
|
26
|
+
- Say in **one** sentence where you are in the course — from the output (the `Course:` line), invent nothing. No lecture.
|
|
27
|
+
|
|
28
|
+
## 3. Lead on with what comes next
|
|
29
|
+
- The line `Next:` names the next step. Lead on **one** step at a time: show, let them do it, make sure they understand.
|
|
30
|
+
Never the whole list at once.
|
|
31
|
+
- If it says **“(you tick it off)”** after it and the person has obviously already done the step (for example “closed
|
|
32
|
+
Claude completely and reopened it” — they are sitting in Claude right now), don't lead it again: ask briefly and
|
|
33
|
+
ask them to tick it off at https://app.kimal3.de/kurs.
|
|
34
|
+
- If it says **“(Claude sets it)”** and it is open, run the setup once more — through the guide
|
|
35
|
+
`https://app.kimal3.de/setup` (load it the way the course sentence does and follow it), **not** with a freely called
|
|
36
|
+
`kimal3 setup`. If the step is still open afterwards, name the reason from the output of `setup` and don't suggest
|
|
37
|
+
a third run.
|
|
38
|
+
|
|
39
|
+
## 4. Finished
|
|
40
|
+
- If the output says `Course: complete`, congratulate them briefly and ask, with a suggestion, what they would like to
|
|
41
|
+
work on here. No more course talk.
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Check the specs against the code and upload the planning to the app
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<!-- kimal3:erzeugt — this file is maintained by `kimal3 skill install` and
|
|
6
|
+
overwritten on every update. Your own changes will be lost; if you want
|
|
7
|
+
to keep them, copy the file under a different name. -->
|
|
8
|
+
# Checking and uploading the planning
|
|
9
|
+
|
|
10
|
+
## 1. What for
|
|
11
|
+
|
|
12
|
+
You check the user stories in this project's specs against the code and upload **only the
|
|
13
|
+
result** to the app — never the code. There, on the project page (tab "Planning"), the person
|
|
14
|
+
sees what is open, what is waiting for their test and what is done, and gives a verdict with
|
|
15
|
+
"Works" or "Doesn't work".
|
|
16
|
+
|
|
17
|
+
Work through the sections in order. You need the rules (section 5) and the file format
|
|
18
|
+
(section 6) from section 2 onwards — read them first. What an exit code of `kimal3` means is in
|
|
19
|
+
**`~/.claude/skills/kimal3/SKILL.md`, section "Exit codes"**; this file does not repeat it.
|
|
20
|
+
|
|
21
|
+
🔑 **`/k3plan` checks, sorts and uploads — it builds nothing.** Whatever needs fixing is
|
|
22
|
+
attached to the story as a finding afterwards; building happens when the person says so.
|
|
23
|
+
|
|
24
|
+
## 2. Fetch the responses
|
|
25
|
+
|
|
26
|
+
Work in the **project folder** (where the specs and the code are). The file is always called
|
|
27
|
+
`plan/stand.json`, relative to that folder.
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
kimal3 plan
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**If you get `There's no plan/stand.json in this folder.`**, it is the first time (or you are in
|
|
34
|
+
the wrong folder — check that first):
|
|
35
|
+
|
|
36
|
+
1. `kimal3 project list` — look for the project this is about. If there is **no** matching one,
|
|
37
|
+
ask the person which one is meant and suggest `/k3project <what you built>`
|
|
38
|
+
(German: `/k3projekt`): without an entry in the success profile there is no project page.
|
|
39
|
+
Stop there, don't invent anything.
|
|
40
|
+
2. Create `plan/stand.json` with the name **exactly as the list writes it**:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"format": 1,
|
|
45
|
+
"projekt": "LinkedIn Content App",
|
|
46
|
+
"projekt_id": null,
|
|
47
|
+
"basis": null,
|
|
48
|
+
"geprueft_am": "2026-10-21T22:10:00+02:00",
|
|
49
|
+
"specs": [],
|
|
50
|
+
"themen": [],
|
|
51
|
+
"uebernommen": []
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
(Name and time are an example.) The field names are German and stay German. `kimal3 plan
|
|
56
|
+
upload` enters `projekt_id` and `basis` itself after the first upload — **leave them at
|
|
57
|
+
`null`**.
|
|
58
|
+
3. Run `kimal3 plan` again.
|
|
59
|
+
|
|
60
|
+
**What the output means** (example, made-up values):
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
#12 · doesn't work · 2026-09-23-content-planner / US-2 (round 1): When dragging, it jumps to Tuesday
|
|
64
|
+
#13 · Topic: The calendar should show public holidays
|
|
65
|
+
Confirmed: 2026-09-23-content-planner / US-1 (round 1)
|
|
66
|
+
View: https://app.kimal3.de/projekt/…
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
- `#12 · doesn't work · <spec> / <story> (round n): <sentence>` — the person tested the story and
|
|
70
|
+
it doesn't hold. → Rule 1 in section 5. You need the number later for `uebernommen`.
|
|
71
|
+
- `#13 · Topic: <sentence>` — something new they noted in the app. → Rule 3.
|
|
72
|
+
- `Confirmed: …` — for these stories they said "Works" in **this** round; they are done. You
|
|
73
|
+
never need to hand on a "Works".
|
|
74
|
+
- `View: …` — the link to the planning. Keep it for the report.
|
|
75
|
+
- `No open responses.` — nothing to hand on; carry on with section 3.
|
|
76
|
+
|
|
77
|
+
**Refusals:**
|
|
78
|
+
- `No project is called "…". Your projects: … Enter the name in plan/stand.json exactly like
|
|
79
|
+
that.` — copy the matching name **word for word** from the list into `"projekt"`. If two could
|
|
80
|
+
fit, ask.
|
|
81
|
+
- `Several of your projects are called "…" (ids: …).` — ask the person which one is meant and
|
|
82
|
+
enter its id as `"projekt_id"`.
|
|
83
|
+
- `The project number in plan/stand.json belongs to none of your projects.` — the number comes from
|
|
84
|
+
a copied folder or a deleted project. Set `"projekt_id"` to `null` (the line stays, the field is
|
|
85
|
+
required); then kimal3 searches by name. This is the **only** case in which you change
|
|
86
|
+
`projekt_id` yourself.
|
|
87
|
+
- `The plan can't be read: plan/stand.json doesn't contain a valid JSON object.` — repair the
|
|
88
|
+
brackets or commas in the file.
|
|
89
|
+
|
|
90
|
+
## 3. Find the specs
|
|
91
|
+
|
|
92
|
+
In the project folder, look in **`docs/superpowers/specs/`**, **`plan/`** and **`docs/specs/`**
|
|
93
|
+
for Markdown files with user stories ("As … I want … so that …", often `US-1`, `US-2`, with
|
|
94
|
+
acceptance criteria and a counter-check). `plan/stand.json` itself, status notes and task lists
|
|
95
|
+
are not specs.
|
|
96
|
+
|
|
97
|
+
One entry in `specs` per spec, one entry in `stories` per user story, one entry in `kriterien`
|
|
98
|
+
per acceptance criterion (in short, at most 500 characters: starting point → action → result).
|
|
99
|
+
|
|
100
|
+
🔴 **The keys are binding.** The app ties every "Works" and "Doesn't work" to spec key + story
|
|
101
|
+
key + round. If a spec or story is already in `plan/stand.json`, **keep its key unchanged** — a
|
|
102
|
+
renamed key makes the person's verdict disappear. New: spec key = file name without `.md`; story
|
|
103
|
+
key = the number from the spec (`US-3`); if the spec doesn't number them, count `US-1`, `US-2` …
|
|
104
|
+
yourself in their order.
|
|
105
|
+
|
|
106
|
+
- `titel`: the heading of the spec or the story. `datei`: the path of the spec in the project
|
|
107
|
+
folder (relative, ends in `.md`; otherwise `null`). `kimal3 plan upload` reads the **text** of the spec from
|
|
108
|
+
this file and sends it along — it does not read paths outside the project folder.
|
|
109
|
+
- The story key is **the same as in the heading of the spec**, where the spec numbers its stories
|
|
110
|
+
(`### US-3 · …` → `US-3`): the app finds the story in the spec text through this key.
|
|
111
|
+
- A spec without stories goes in with `"stories": []`; mention it in the report.
|
|
112
|
+
- Limits: at most 50 specs, 60 stories per spec, 400 altogether. If there are more, ask the
|
|
113
|
+
person which specs belong in.
|
|
114
|
+
|
|
115
|
+
**The state of each story (`stand`):**
|
|
116
|
+
- `offen` — nothing built yet.
|
|
117
|
+
- `in_arbeit` — partly built, or a finding is open. `gebaut_am` is then `null`.
|
|
118
|
+
- `gebaut` — built. `gebaut_am`: the date on which **this round** was finished (`YYYY-MM-DD`);
|
|
119
|
+
plus a `testen` sentence (section 4).
|
|
120
|
+
- `weggelassen` — deliberately not built, `grund` is required (rule 8). Only if the spec or the
|
|
121
|
+
person decided so — never on your own to tidy up. If in doubt: leave it `offen` and ask in the
|
|
122
|
+
report.
|
|
123
|
+
|
|
124
|
+
## 4. Check against the code
|
|
125
|
+
|
|
126
|
+
Run the counter-check of each criterion **wherever you can**: the project's guards or tests
|
|
127
|
+
(`npm test`, `npm run …`), a command, starting the app and calling the address, reading a file.
|
|
128
|
+
|
|
129
|
+
- `bestanden` (passed) — **only** if the counter-check ran in this session and showed the
|
|
130
|
+
expected result. Never from memory, never from last time, never because the code "looks right".
|
|
131
|
+
- `gescheitert` (failed) — it ran and showed something else. That is a finding (rule 1); the app
|
|
132
|
+
then puts the story and its spec under "In progress".
|
|
133
|
+
- `offen` (not run) — everything that did not run: needs a browser, a sign-in, real data or a
|
|
134
|
+
person. Reading only counts if the criterion says something about the file itself (a file
|
|
135
|
+
exists, a text is there as written) — reading does not prove a behaviour.
|
|
136
|
+
|
|
137
|
+
⚠️ A story with an `offen` criterion is shown under "Claude test pending", and the person can't
|
|
138
|
+
test it yet. Say in the report what is missing so the counter-check can run.
|
|
139
|
+
|
|
140
|
+
**The `testen` sentence** (on every `gebaut` story, at most 1000 characters) names **the address
|
|
141
|
+
or the command** and **what must be visible there**, for example: "Start `npm run dev`, open
|
|
142
|
+
http://localhost:3000/calendar and drag the post from Monday to Wednesday — it is then on
|
|
143
|
+
Wednesday." Without it the app shows: "Claude didn't write down how to test this".
|
|
144
|
+
|
|
145
|
+
**Findings** (`befunde`): only **open** ones. `quelle: "claude"` for something the story promises
|
|
146
|
+
and doesn't do, and that no criterion covers. `seit`: the date the finding came up — if it is
|
|
147
|
+
already in the file, it keeps its old date.
|
|
148
|
+
|
|
149
|
+
**The round** (`runde`) ties a verdict to a build — like a stamp on one version of a document:
|
|
150
|
+
- It starts at `1` and **never** goes down.
|
|
151
|
+
- **Raise it by exactly 1** when a story with a finding from the person (`quelle: "mensch"`) has
|
|
152
|
+
been fixed since (Git history, and the counter-checks pass now): then `befunde: []`,
|
|
153
|
+
`stand: "gebaut"`, a new `gebaut_am`, a new `testen` sentence. The person tests again. If it is
|
|
154
|
+
unclear whether it was fixed: leave the finding and ask in the report.
|
|
155
|
+
- **Also raise it** if you changed a **confirmed** story in a way the person would notice — their
|
|
156
|
+
old "Works" no longer applies (rule 7).
|
|
157
|
+
- Otherwise **leave it alone**: a confirmed story stays done as long as its round stays the same.
|
|
158
|
+
|
|
159
|
+
## 5. The eight rules
|
|
160
|
+
|
|
161
|
+
The app shows them to the person in exactly this wording ("How planning stays short"):
|
|
162
|
+
|
|
163
|
+
1. **A finding is not a new card.** If a story doesn't hold what it promises — Claude's check fails or you say "Doesn't work" — the finding is attached to that story and its spec goes back to "In progress".
|
|
164
|
+
2. **Only what nobody promised is new. It goes into the inbox, which has five places.**
|
|
165
|
+
3. **Claude sorts every topic at the next `/k3plan`:** as a new story in a spec, as a finding on a story, or dropped with a reason. There is no "later". What happened to it is shown under "Recently sorted".
|
|
166
|
+
4. **Nothing stays in the inbox longer than 14 days.**
|
|
167
|
+
5. **At most one spec in progress at once** ("In progress" and "Claude test pending" together). Finish it before starting the next.
|
|
168
|
+
6. **At most five stories wait for your test.** If there are more, Claude starts nothing new until you have tested.
|
|
169
|
+
7. **Done means checked twice:** Claude's checks passed, and you said "Works" — for exactly this version.
|
|
170
|
+
8. **A spec is only closed when every story is done or deliberately left out** — with a reason. There is no silent remainder.
|
|
171
|
+
|
|
172
|
+
**What you do with them:**
|
|
173
|
+
|
|
174
|
+
- **Rule 1 — every `doesn't work` from `kimal3 plan`:** if the story still exists, attach the
|
|
175
|
+
person's sentence to it as a finding (`{ "text": "<their sentence>", "quelle": "mensch",
|
|
176
|
+
"seit": "<today>" }`), `stand: "in_arbeit"`, `gebaut_am: null`. If it has already been fixed
|
|
177
|
+
since, raise the round by 1 and set `befunde: []` instead (section 4). Plus in `uebernommen`:
|
|
178
|
+
`{ "rueckmeldung": 12, "antwort": "Finding on US-2" }`. If the story no longer exists, the
|
|
179
|
+
`antwort` says why. ⚠️ Without a finding from `mensch` and without a higher round, the server
|
|
180
|
+
refuses the upload.
|
|
181
|
+
- **Rule 2 — something new:** what you notice while checking, or what the person says in the
|
|
182
|
+
conversation, and what **no** spec promises goes into `themen`:
|
|
183
|
+
`{ "schluessel": "T-1", "text": "…", "quelle": "claude" | "mensch", "seit": "<today>" }`.
|
|
184
|
+
The five places are shared by `themen` and the open notes from the app.
|
|
185
|
+
- **Rule 3 — sort:** every `Topic` from `kimal3 plan` **and** every topic already in `themen` from
|
|
186
|
+
earlier is sorted **now** — one of three:
|
|
187
|
+
- **new story:** write it into the spec it belongs to (user story, acceptance criterion with
|
|
188
|
+
counter-check) and into `plan/stand.json` with `stand: "offen"`. If no spec fits, ask where it
|
|
189
|
+
goes. Answer: `new story US-7 in "Content planner"`.
|
|
190
|
+
- **finding on a story:** as in rule 1. Answer: `finding on US-2 in "Content planner"`.
|
|
191
|
+
- **dropped:** answer `dropped: <reason in one sentence>`, for example
|
|
192
|
+
`dropped: public holidays are already in the calendar tool.`
|
|
193
|
+
|
|
194
|
+
For a note from the app, the answer goes into `uebernommen` as **one sentence** (the app shows
|
|
195
|
+
it under "Recently sorted" as `<note> → <answer>`); so write it **without** an arrow at the
|
|
196
|
+
start. A topic from the file you take out of `themen` and name how it was sorted in the
|
|
197
|
+
report.
|
|
198
|
+
- **Rule 4:** because you sort everything at every `/k3plan`, nothing stays long. A topic with
|
|
199
|
+
`seit` more than 14 days ago is sorted now **in any case**.
|
|
200
|
+
- **Rules 5 and 6 — don't start a new spec** while another spec is in progress (one of its
|
|
201
|
+
stories is `in_arbeit`, has a finding or a failed counter-check, or is `gebaut` with an `offen`
|
|
202
|
+
criterion or with no criteria at all), or while more than five stories are waiting for the person's test (`gebaut`, all
|
|
203
|
+
passed, no finding, not yet confirmed). **Tell the person what to test instead** — with the
|
|
204
|
+
`testen` sentences. If you sort a topic in as a new story in a spec, you do not start that spec
|
|
205
|
+
with it: it stays `offen`, and the spec does not count as in progress.
|
|
206
|
+
- **Rule 7:** only the person sets "Done", with "Works" in the app; the file has no field for it.
|
|
207
|
+
You only keep the round stable (section 4).
|
|
208
|
+
- **Rule 8:** `weggelassen` only with a `grund` (section 3).
|
|
209
|
+
|
|
210
|
+
## 6. The file
|
|
211
|
+
|
|
212
|
+
`plan/stand.json` is under Git. Example, shortened:
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"format": 1,
|
|
217
|
+
"projekt": "LinkedIn Content App",
|
|
218
|
+
"projekt_id": null,
|
|
219
|
+
"basis": null,
|
|
220
|
+
"geprueft_am": "2026-10-21T22:10:00+02:00",
|
|
221
|
+
"specs": [
|
|
222
|
+
{
|
|
223
|
+
"schluessel": "2026-09-23-content-planner",
|
|
224
|
+
"titel": "Content planner as a page",
|
|
225
|
+
"datei": "plan/2026-09-23-content-planner-page-spec.md",
|
|
226
|
+
"stories": [
|
|
227
|
+
{
|
|
228
|
+
"schluessel": "US-2",
|
|
229
|
+
"titel": "Move posts in the calendar",
|
|
230
|
+
"stand": "gebaut",
|
|
231
|
+
"runde": 1,
|
|
232
|
+
"gebaut_am": "2026-10-21",
|
|
233
|
+
"kriterien": [
|
|
234
|
+
{ "text": "Drag the post from Monday to Wednesday -> it is on Wednesday", "gegenprobe": "bestanden" }
|
|
235
|
+
],
|
|
236
|
+
"befunde": [],
|
|
237
|
+
"testen": "Open /calendar and drag the post from Monday to Wednesday.",
|
|
238
|
+
"grund": null
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
}
|
|
242
|
+
],
|
|
243
|
+
"themen": [
|
|
244
|
+
{ "schluessel": "T-1", "text": "The calendar should show public holidays", "quelle": "mensch", "seit": "2026-10-21" }
|
|
245
|
+
],
|
|
246
|
+
"uebernommen": [
|
|
247
|
+
{ "rueckmeldung": 12, "antwort": "Finding on US-2" }
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**The fields** — every one must be there, even if it is `null` or empty; the server refuses an
|
|
253
|
+
unknown field (a typo like `"befund"`):
|
|
254
|
+
|
|
255
|
+
- `format`: exactly `1`.
|
|
256
|
+
- `projekt`: the name as in the app, 1–200 characters.
|
|
257
|
+
- `projekt_id`, `basis`: `null` at first; after that `kimal3 plan upload` writes them — **never
|
|
258
|
+
change them by hand**. Only exception: the refusal "The project number in plan/stand.json
|
|
259
|
+
belongs to none of your projects." — then set `projekt_id` to `null` (section 2).
|
|
260
|
+
- `geprueft_am`: now, with time zone (`date +%Y-%m-%dT%H:%M:%S%:z` in Bash, `Get-Date -Format
|
|
261
|
+
"yyyy-MM-ddTHH:mm:sszzz"` in PowerShell).
|
|
262
|
+
- `specs[]`: `schluessel` (unique, 1–80 characters), `titel` (1–200), `datei` (path or `null`),
|
|
263
|
+
`stories[]`.
|
|
264
|
+
- `stories[]`: `schluessel` (unique within its spec), `titel`, `stand` (`offen` · `in_arbeit` ·
|
|
265
|
+
`gebaut` · `weggelassen`), `runde` (1–999), `gebaut_am` (`YYYY-MM-DD` for `gebaut`, otherwise
|
|
266
|
+
`null`), `kriterien[]`, `befunde[]`, `testen` (sentence or `null`), `grund` (required for
|
|
267
|
+
`weggelassen`, otherwise `null`).
|
|
268
|
+
- `kriterien[]`: `{ "text", "gegenprobe": "bestanden" | "gescheitert" | "offen" }`, at most 30
|
|
269
|
+
per story.
|
|
270
|
+
- `befunde[]`: `{ "text", "quelle": "claude" | "mensch", "seit": "YYYY-MM-DD" }` — open ones only,
|
|
271
|
+
at most 20.
|
|
272
|
+
- `themen[]`: `{ "schluessel", "text", "quelle", "seit" }`, at most 50 (the inbox has five places,
|
|
273
|
+
rule 2).
|
|
274
|
+
- `uebernommen[]`: `{ "rueckmeldung": <number from kimal3 plan>, "antwort": "<one sentence>" }`.
|
|
275
|
+
`kimal3 plan upload` empties it itself after uploading.
|
|
276
|
+
- The whole file: at most 300 KB.
|
|
277
|
+
|
|
278
|
+
## 7. Upload
|
|
279
|
+
|
|
280
|
+
First the dry run — it checks everything and saves nothing:
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
kimal3 plan upload --dry-run
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
`Dry run: would upload 9 stories and mark 2 responses as handled. Nothing was saved.` (numbers as
|
|
287
|
+
an example). **Compare the second number** with the open responses from `kimal3 plan`: if it is
|
|
288
|
+
smaller, you forgot one — it would stay in the app under "Waiting for Claude".
|
|
289
|
+
|
|
290
|
+
Then:
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
kimal3 plan upload
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
It worked if you see `✓ Planning for "…" uploaded: … stories, … waiting for your test.` and
|
|
297
|
+
`View: …`; the first time also `projekt_id and basis are now in plan/stand.json.` The CLI has
|
|
298
|
+
entered `projekt_id` and `basis` and emptied `uebernommen` — leave the file like that. Tell the
|
|
299
|
+
person that `plan/stand.json` has changed and belongs in the next commit.
|
|
300
|
+
|
|
301
|
+
After that comes a line `Spec texts uploaded: 1 of 3. Without text: …` — the text of the specs goes up too.
|
|
302
|
+
A spec without text is a **hint, not a failure** (exit code `0`): tell the person which specs are in
|
|
303
|
+
the brackets and what to do (correct the path in `datei`; over 300 KB cannot be uploaded).
|
|
304
|
+
|
|
305
|
+
**Refusals — read the message, fix it, dry run, again:**
|
|
306
|
+
|
|
307
|
+
| The message starts with | What you do |
|
|
308
|
+
|---|---|
|
|
309
|
+
| `The plan can't be read: <place> …` | Repair that place (`specs[0].stories[2].stand`) in the file. |
|
|
310
|
+
| `No project is called …` · `Several of your projects are called …` · `The project number in plan/stand.json belongs to none of your projects.` | As in section 2. For the project number you may set `projekt_id` to `null` — only here. |
|
|
311
|
+
| `<spec> / <story> has round 1, round 2 is already saved.` | The file is older than the saved state. Set the round to the saved value — never lower. |
|
|
312
|
+
| `Response 12 doesn't exist in this project or is listed twice …` | Only numbers from `kimal3 plan`, each one once. |
|
|
313
|
+
| `Response 12 ("…") is marked as handled, but US-2 has no finding from you …` | Attach the finding with `quelle: "mensch"` to the story (rule 1) — or raise the round by 1 if it has been fixed. |
|
|
314
|
+
| `The app has a newer plan (uploaded …).` | Another working copy has uploaded. **Do not overwrite.** Tell the person and ask whether you should first fetch that state (Git) and check again. `kimal3 plan upload --overwrite` **only after their explicit yes.** |
|
|
315
|
+
| `The planning saved in the app is damaged …` | Here too, `--overwrite` **only after their yes.** |
|
|
316
|
+
| `The planning is saved, but the responses aren't marked as handled yet.` | Run `kimal3 plan upload` **unchanged** once more — that is harmless, the CLI has already entered `basis` and left `uebernommen` in place. |
|
|
317
|
+
| ``The plan is saved, but the spec texts are not. Run `kimal3 plan upload` again.`` | Run `kimal3 plan upload` **unchanged** once more — the plan is already in the app, the CLI has entered `basis`. |
|
|
318
|
+
| `⚠ The planning is saved, but plan/stand.json couldn't be updated. Enter it yourself: …` | Write exactly these values into the file. |
|
|
319
|
+
| `… couldn't be loaded just now` / `… couldn't be saved just now` | Try once more; if it still fails, tell the person. |
|
|
320
|
+
|
|
321
|
+
🔴 **`--overwrite` replaces what someone else uploaded.** Never on your own decision, not even
|
|
322
|
+
when the message suggests it.
|
|
323
|
+
|
|
324
|
+
## 8. Report to the person
|
|
325
|
+
|
|
326
|
+
**At most five lines**, without jargon:
|
|
327
|
+
|
|
328
|
+
- what was **done** (confirmed since last time),
|
|
329
|
+
- what is **waiting for their test** — with the `testen` sentence, so they can start right away,
|
|
330
|
+
- what was decided in the **inbox** (each topic with its answer),
|
|
331
|
+
- a **warning** if rule 5 or 6 is broken: "Test … first" instead of a new story,
|
|
332
|
+
- the **link** from `View: …`.
|
|
333
|
+
|
|
334
|
+
Example (made-up values):
|
|
335
|
+
|
|
336
|
+
```
|
|
337
|
+
Done: US-1 "Create posts".
|
|
338
|
+
Your test: US-2 - open /calendar and drag the post from Monday to Wednesday.
|
|
339
|
+
Inbox: "The calendar should show public holidays" -> new story US-7 in "Content planner".
|
|
340
|
+
Claude test pending: US-4 needs a browser I don't have here.
|
|
341
|
+
Planning: https://app.kimal3.de/projekt/…
|
|
342
|
+
```
|