kimal3 0.1.4 → 0.1.6
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 +19 -0
- package/dist/api.js +61 -1
- package/dist/arbeitsplatz-dateien.js +268 -0
- package/dist/befehle/arbeitsplatz.js +260 -0
- package/dist/befehle/skill-install.js +110 -4
- package/dist/befehle/werkbank.js +389 -0
- package/dist/befehle-katalog.js +59 -0
- package/dist/gesehen.js +85 -0
- package/dist/kimal3.js +172 -13
- package/dist/nachricht.js +198 -0
- package/dist/version.js +37 -0
- package/dist/werkbank-name.js +217 -0
- package/package.json +1 -1
- package/skill/SKILL.md +212 -125
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wie eine Werkbank heisst — **eine** Regel fuer beide Auslieferungswege.
|
|
3
|
+
*
|
|
4
|
+
* 🔑 **Warum das eine eigene Datei ist** (2026-08-20, bei der Umbenennung von
|
|
5
|
+
* `meine-werkbank` auf `werkbank-<name>`): Der Ordnername entsteht an ZWEI
|
|
6
|
+
* Stellen. Der Server setzt ihn beim Ausliefern (Zip-Download auf `/pro` UND
|
|
7
|
+
* `/api/cli/arbeitsplatz`), und die CLI setzt ihn noch einmal, wenn der Mensch
|
|
8
|
+
* einen Namen mitgegeben hat. Waeren das zwei Regeln, hiesse derselbe Mensch je
|
|
9
|
+
* nach Weg anders — genau die Sorte Unterschied, die man erst Tage spaeter
|
|
10
|
+
* bemerkt.
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ **DIESE DATEI IMPORTIERT NICHTS**, aus demselben Grund wie
|
|
13
|
+
* `befehle-katalog.ts`: Die CLI baut mit NodeNext (Import-Pfade enden auf
|
|
14
|
+
* `.js`), die App mit dem Bundler. Eine Datei ohne eigene Importe liest sich aus
|
|
15
|
+
* beiden Welten ohne Uebersetzung.
|
|
16
|
+
*
|
|
17
|
+
* 🔴 **Wozu das Ganze** (Entscheidung Dennis, 2026-08-20): *Besitz steht im
|
|
18
|
+
* Ordnernamen, nicht in einem Possessivpronomen.* Der Vorgaenger `meine-werkbank`
|
|
19
|
+
* hiess bei JEDEM gleich — liegen zwei davon nebeneinander oder gehen sie zu
|
|
20
|
+
* GitHub, ist nicht mehr erkennbar, wem welche gehoert. Wo ein Name steht
|
|
21
|
+
* (`werkbank-sabine`), gehoert der Ordner einer Person; wo keiner steht
|
|
22
|
+
* (`kontext/`, `KI-Arbeitsplatz/`), gehoert er allen. *Ein Nutzer muss diese
|
|
23
|
+
* Regel nicht lernen — er sieht sie im Baum.*
|
|
24
|
+
*/
|
|
25
|
+
/** Das Praefix, an dem man eine Werkbank erkennt. Bewacht von `check:arbeitsplatz` (11b). */
|
|
26
|
+
export const WERKBANK_PRAEFIX = "werkbank-";
|
|
27
|
+
/**
|
|
28
|
+
* Wie lang der Namensteil hoechstens werden darf.
|
|
29
|
+
*
|
|
30
|
+
* Nicht aus Geschmack: Windows deckelt einen ganzen Pfad bei 260 Zeichen, und
|
|
31
|
+
* dieser Ordner traegt darunter noch `projekte/<projekt>/referenzen/…`. Ein
|
|
32
|
+
* ellenlanger Name aus einer Sammel-Adresse wuerde erst dort unten Fehler
|
|
33
|
+
* erzeugen — an einer Stelle, an der niemand mehr an den Ordnernamen denkt.
|
|
34
|
+
*/
|
|
35
|
+
const MAX_LAENGE = 40;
|
|
36
|
+
/**
|
|
37
|
+
* Aus dem, was ein Mensch eingibt (oder aus seiner Adresse kommt), ein Ordnername.
|
|
38
|
+
*
|
|
39
|
+
* "Sabine" → "werkbank-sabine"
|
|
40
|
+
* "Sabine Müller" → "werkbank-sabine-mueller"
|
|
41
|
+
* "werkbank-sabine" → "werkbank-sabine" (nicht doppelt)
|
|
42
|
+
* "sabine@arno.de" → "werkbank-sabine" (der Teil vor dem @)
|
|
43
|
+
* "!!!" → null (nichts Brauchbares uebrig)
|
|
44
|
+
*
|
|
45
|
+
* 🔑 **Warum umgeschrieben und nicht abgelehnt wird:** Der Name landet als
|
|
46
|
+
* Ordner auf einer echten Platte. Ein `/` darin waere ein Unterordner, ein `:`
|
|
47
|
+
* unter Windows ein Laufwerk, ein Leerzeichen ein zweites Argument im naechsten
|
|
48
|
+
* `cd`. Wer „Sabine Müller" eingibt, hat nichts falsch gemacht — er hat einen
|
|
49
|
+
* Namen genannt, und Namen duerfen Umlaute und Leerzeichen haben.
|
|
50
|
+
*
|
|
51
|
+
* ⚠️ **Umlaute werden AUSGESCHRIEBEN, nicht entfernt.** `ü` einfach zu streichen
|
|
52
|
+
* machte aus „Müller" ein „Mller"; die deutsche Ersatzschreibung `ue` ist die,
|
|
53
|
+
* die jeder Mensch hier erwartet. Der Weg ueber `normalize("NFD")` allein reicht
|
|
54
|
+
* dafuer NICHT — er zerlegt `ü` in `u` + Trema und liefert damit „Muller".
|
|
55
|
+
* Deshalb stehen die vier deutschen Zeichen ausdruecklich davor.
|
|
56
|
+
*
|
|
57
|
+
* 📌 Gibt `null` zurueck, wenn nichts uebrig bleibt. Das ist **kein** Fehlerfall
|
|
58
|
+
* dieser Funktion, sondern eine Auskunft: Der Aufrufer entscheidet, ob er
|
|
59
|
+
* absagt (die CLI, wo ein Mensch etwas getippt hat) oder still beim Vordruck
|
|
60
|
+
* bleibt (der Server, wo niemand gefragt wurde).
|
|
61
|
+
*/
|
|
62
|
+
export function werkbankOrdnerAus(roh) {
|
|
63
|
+
/*
|
|
64
|
+
🔴 **Spitze Klammern sind eine ABSAGE, keine Zeichen zum Wegwerfen**
|
|
65
|
+
(Review-Runde 5 zu PR #25). Gemessen: `"<dein-vorname>"` wurde zu
|
|
66
|
+
`werkbank-dein-vorname` -- ein Ordner, der plausibel aussieht und den
|
|
67
|
+
niemand wollte.
|
|
68
|
+
|
|
69
|
+
Und die Zeichenkette kommt nicht aus dem Nichts: Beide Absagen dieser CLI
|
|
70
|
+
und die Tabelle in `SKILL.md` legen sie dem Menschen woertlich hin
|
|
71
|
+
(`kimal3 werkbank neu <dein-vorname>`). In einer rohen Shell rettet der
|
|
72
|
+
Zufall -- dort ist `<` eine Umleitung und der Aufruf scheitert vorher. In
|
|
73
|
+
Claude Code, wo der Aufruf als Zeichenkette weitergereicht wird, rettet
|
|
74
|
+
nichts.
|
|
75
|
+
|
|
76
|
+
*Genau der Fehler, gegen den `Anleitung.tsx` den Kopier-Kasten entworfen
|
|
77
|
+
hat: „Ein Platzhalter darin wird mitkopiert und ergibt einen Ordner, den
|
|
78
|
+
niemand wollte."* Er stand hier eine Ebene tiefer noch offen.
|
|
79
|
+
*/
|
|
80
|
+
if (roh.includes("<") || roh.includes(">"))
|
|
81
|
+
return null;
|
|
82
|
+
const vorDemAt = roh.split("@")[0] ?? "";
|
|
83
|
+
const grundform = vorDemAt
|
|
84
|
+
.toLowerCase()
|
|
85
|
+
.replaceAll("ä", "ae")
|
|
86
|
+
.replaceAll("ö", "oe")
|
|
87
|
+
.replaceAll("ü", "ue")
|
|
88
|
+
.replaceAll("ß", "ss")
|
|
89
|
+
// Alles andere mit Akzent auf den Grundbuchstaben zurueck (é → e, ç → c).
|
|
90
|
+
.normalize("NFD")
|
|
91
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
92
|
+
// Was jetzt noch kein a–z oder 0–9 ist, wird zum Trennstrich -- und
|
|
93
|
+
// mehrere Trennstriche werden einer.
|
|
94
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
95
|
+
.replace(/^-+|-+$/g, "");
|
|
96
|
+
// Ein bereits vollstaendiger Ordnername soll nicht `werkbank-werkbank-sabine`
|
|
97
|
+
// werden. Das ist kein Sonderfall fuer Feinschmecker: Die Hilfe von
|
|
98
|
+
// `werkbank neu` hat bis heute genau diese Schreibweise beigebracht
|
|
99
|
+
// (`kimal3 werkbank neu werkbank-sabine`), und alte Anleitungen ueberleben
|
|
100
|
+
// laenger als der Code, den sie beschreiben.
|
|
101
|
+
const ohnePraefix = grundform.startsWith(WERKBANK_PRAEFIX)
|
|
102
|
+
? grundform.slice(WERKBANK_PRAEFIX.length)
|
|
103
|
+
: grundform;
|
|
104
|
+
// ⚠️ Erst kuerzen, DANN den Trennstrich am Ende wegnehmen: Faellt der Schnitt
|
|
105
|
+
// mitten in „sabine-mueller", bliebe sonst ein „werkbank-sabine-" stehen.
|
|
106
|
+
const gekuerzt = ohnePraefix.slice(0, MAX_LAENGE).replace(/-+$/g, "");
|
|
107
|
+
if (gekuerzt === "")
|
|
108
|
+
return null;
|
|
109
|
+
return `${WERKBANK_PRAEFIX}${gekuerzt}`;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Die Vorlage auf einen anderen Werkbank-Namen umschreiben — **Pfade und Texte**.
|
|
113
|
+
*
|
|
114
|
+
* 🔑 **Warum auch die Texte** — und warum die Begruendung dafuer sich am
|
|
115
|
+
* 2026-08-20 zweimal gedreht hat:
|
|
116
|
+
*
|
|
117
|
+
* Zuerst hiess sie: *„Die `README.md` sagt woertlich `cd werkbank-dein-name`,
|
|
118
|
+
* und `check:arbeitsplatz` (Pruefung 11) haelt das fest."* Das stimmte —
|
|
119
|
+
* bis Review-Runde 3 zeigte, dass ein Name im GEMEINSAMEN Firmentext den Namen
|
|
120
|
+
* EINES Menschen ist, und Pruefung 11 daraufhin umgedreht wurde: Sie verbietet
|
|
121
|
+
* ihn dort jetzt.
|
|
122
|
+
*
|
|
123
|
+
* 🔬 **Heute nennt deshalb keine ausgelieferte Datei den Werkbank-Namen im
|
|
124
|
+
* Text** (nachgemessen: `grep` findet ihn nur im Ordnernamen). Die Ersetzung
|
|
125
|
+
* hat also aktuell **nichts zu tun** — und bleibt trotzdem drin, als Netz fuer
|
|
126
|
+
* den Fall, dass jemand in eine Werkbank-Datei `werkbank-sabine/projekte/`
|
|
127
|
+
* schreibt. Dort verbietet es keine Wache, und der Satz zeigte beim naechsten
|
|
128
|
+
* Menschen auf einen fremden Ordner.
|
|
129
|
+
*
|
|
130
|
+
* *Ein Netz, das heute niemand braucht, ist ehrlich zu beschreiben — nicht mit
|
|
131
|
+
* einer Zusicherung zu begruenden, die inzwischen das Gegenteil sagt.*
|
|
132
|
+
*
|
|
133
|
+
* ⚠️ Ersetzt wird der ganze Ordnername, nicht das Praefix — sonst traefe es
|
|
134
|
+
* jeden Text, der irgendeine Werkbank erwaehnt.
|
|
135
|
+
*
|
|
136
|
+
* 🔴 **Und das reicht NICHT, um erklaerende Beispiele zu schuetzen**
|
|
137
|
+
* (Review-Runde 1 zu PR #25). Hier stand, die Beispiele `werkbank-sabine` in der
|
|
138
|
+
* Vorlage blieben stehen. Das stimmt nur, solange `alt` der Vordruck ist — bei
|
|
139
|
+
* der CLI ist `alt` aber der Name, den der SERVER gesetzt hat. Heisst ein Konto
|
|
140
|
+
* `werkbank-sabine` und ruft `arbeitsplatz neu jonas` auf, wird aus dem
|
|
141
|
+
* erklaerenden Beispiel ebenfalls `werkbank-jonas`, und der Satz liest sich
|
|
142
|
+
* *„traegt seinen Namen: `werkbank-jonas`, `werkbank-jonas`"*.
|
|
143
|
+
*
|
|
144
|
+
* 🔑 Geschuetzt sind Beispiele deshalb nicht hier, sondern in der VORLAGE: Sie
|
|
145
|
+
* heissen `werkbank-<vorname>`, und diese Form kann kein echter Ordner tragen —
|
|
146
|
+
* `<` und `>` ueberleben `werkbankOrdnerAus` nicht. `check:arbeitsplatz` (11d)
|
|
147
|
+
* haelt das fest. *Eine Zusicherung, die nur fuer einen der beiden Aufrufer
|
|
148
|
+
* gilt, ist keine Zusicherung dieser Funktion.*
|
|
149
|
+
*
|
|
150
|
+
* 📌 Ist `alt` gleich `neu`, kommt die Liste unveraendert zurueck. Der Aufrufer
|
|
151
|
+
* muss also nicht selbst pruefen, ob sich etwas aendert.
|
|
152
|
+
*/
|
|
153
|
+
export function werkbankUmbenennen(dateien, alt, neu) {
|
|
154
|
+
if (alt === "" || neu === "" || alt === neu)
|
|
155
|
+
return [...dateien];
|
|
156
|
+
const altesPraefix = `${alt}/`;
|
|
157
|
+
const neuesPraefix = `${neu}/`;
|
|
158
|
+
/*
|
|
159
|
+
🔴 **Mit Wortgrenze, nicht mit `replaceAll`** (Review-Runde 5 zu PR #25).
|
|
160
|
+
Gemessen: Ein nacktes `replaceAll("werkbank-sabine", "werkbank-jonas")`
|
|
161
|
+
macht aus `werkbank-sabine-alt` ein `werkbank-jonas-alt` -- es zerlegt jedes
|
|
162
|
+
laengere Token, das mit dem Namen anfaengt.
|
|
163
|
+
|
|
164
|
+
Heute stolpert niemand darueber, weil `check:arbeitsplatz` (11d) solche
|
|
165
|
+
Token aus der Vorlage haelt. Aber der Doku-Block oben verkauft die
|
|
166
|
+
Inhalts-Ersetzung ausdruecklich als **Netz fuer kuenftige Texte** -- und ein
|
|
167
|
+
Netz mit einem Loch ist genau das, was man erst am Tag des Sturzes merkt.
|
|
168
|
+
|
|
169
|
+
Die Grenze gilt auf BEIDEN Seiten: `xwerkbank-sabine` ist ebenso wenig
|
|
170
|
+
gemeint wie `werkbank-sabine-alt`. Erlaubt sind nur Zeichen, die in keinem
|
|
171
|
+
Ordnernamen vorkommen koennen -- alles ausser `[a-z0-9-]`.
|
|
172
|
+
*/
|
|
173
|
+
const grenze = new RegExp(`(?<![a-z0-9-])${maskiere(alt)}(?![a-z0-9-])`, "g");
|
|
174
|
+
return dateien.map((datei) => ({
|
|
175
|
+
...datei,
|
|
176
|
+
pfad: datei.pfad.startsWith(altesPraefix)
|
|
177
|
+
? `${neuesPraefix}${datei.pfad.slice(altesPraefix.length)}`
|
|
178
|
+
: datei.pfad,
|
|
179
|
+
inhalt: datei.inhalt.replace(grenze, neu),
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Welcher Unterordner die Werkbank ist — **abgeleitet, nicht getippt**.
|
|
184
|
+
*
|
|
185
|
+
* Erkennungsregel: der einzige Unterordner, der DIREKT eine eigene `CLAUDE.md`
|
|
186
|
+
* traegt (Pfad `<ordner>/CLAUDE.md`, genau zwei Teile). Dass es genau einen gibt,
|
|
187
|
+
* sichert `check:arbeitsplatz` (Pruefung 10) — ohne diese Wache waehlte die Regel
|
|
188
|
+
* bei mehreren stumm den ersten.
|
|
189
|
+
*
|
|
190
|
+
* 🔴 Diese Regel stand vorher ZWEIMAL im Projekt, wortgleich: einmal in
|
|
191
|
+
* `cli/src/arbeitsplatz-dateien.ts` (Befund R2-3) und einmal in
|
|
192
|
+
* `src/lib/arbeitsplatz/ausliefern.ts` (Runde 3). Beide Male war die Begruendung
|
|
193
|
+
* „nicht austippen" — und trotzdem wurde die Ableitung selbst kopiert.
|
|
194
|
+
* *Zwei Kopien einer Ableitung sind dieselbe zweite Wahrheit wie zwei Kopien des
|
|
195
|
+
* Namens, nur besser getarnt.*
|
|
196
|
+
*/
|
|
197
|
+
export function werkbankAusDateien(dateien) {
|
|
198
|
+
for (const datei of dateien) {
|
|
199
|
+
const teile = datei.pfad.split("/");
|
|
200
|
+
if (teile.length === 2 && teile[1] === "CLAUDE.md")
|
|
201
|
+
return teile[0];
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Sonderzeichen eines regulaeren Ausdrucks entschaerfen.
|
|
207
|
+
*
|
|
208
|
+
* 🔑 Der Name kommt aus einer Server-Antwort. `werkbankOrdnerAus` laesst zwar
|
|
209
|
+
* nur `[a-z0-9-]` durch — aber `werkbankUmbenennen` bekommt `alt` NICHT von
|
|
210
|
+
* dort, sondern aus der gelieferten Dateiliste (`werkbankAusDateien`). Was von
|
|
211
|
+
* aussen kommt, wird nie zum Muster. *Eine Regel, die nur fuer den einen
|
|
212
|
+
* Aufrufer gilt, ist keine Regel dieser Funktion* -- dieselbe Lehre wie bei der
|
|
213
|
+
* Zusicherung ueber die Beispiele.
|
|
214
|
+
*/
|
|
215
|
+
function maskiere(text) {
|
|
216
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
217
|
+
}
|
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -1,125 +1,212 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: kimal3
|
|
3
|
-
description: Projekte ins kimal3-Erfolgsprofil eintragen oder auflisten — und
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# kimal3 — Projekte ins Erfolgsprofil eintragen
|
|
7
|
-
|
|
8
|
-
> **`kimal3` nicht gefunden?** Zwei Gründe, und sie brauchen verschiedene Antworten:
|
|
9
|
-
> die globale Installation fehlt (`npm install -g kimal3`) — **oder** sie ist da, aber diese
|
|
10
|
-
> Sitzung kennt den Suchpfad noch nicht, dann hilft nur ein Neustart von Claude.
|
|
11
|
-
|
|
12
|
-
## Wann
|
|
13
|
-
Sobald der Mensch sagt, ein Projekt sei fertig, oder ausdrücklich bittet, es einzutragen.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
1
|
+
---
|
|
2
|
+
name: kimal3
|
|
3
|
+
description: Projekte ins kimal3-Erfolgsprofil eintragen oder auflisten, Firmendaten auswerten — und den KI-Arbeitsplatz-Ordner anlegen. Sobald ein KI-Projekt fertig ist, jemand danach fragt, oder jemand seinen Arbeitsplatz einrichten will.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# kimal3 — Projekte ins Erfolgsprofil eintragen
|
|
7
|
+
|
|
8
|
+
> **`kimal3` nicht gefunden?** Zwei Gründe, und sie brauchen verschiedene Antworten:
|
|
9
|
+
> die globale Installation fehlt (`npm install -g kimal3`) — **oder** sie ist da, aber diese
|
|
10
|
+
> Sitzung kennt den Suchpfad noch nicht, dann hilft nur ein Neustart von Claude.
|
|
11
|
+
|
|
12
|
+
## Wann
|
|
13
|
+
Sobald der Mensch sagt, ein Projekt sei fertig, oder ausdrücklich bittet, es einzutragen.
|
|
14
|
+
**Oder** wenn er seinen KI-Arbeitsplatz anlegen will — dann s. „Den Arbeitsplatz anlegen".
|
|
15
|
+
|
|
16
|
+
## Den Arbeitsplatz anlegen (`kimal3 arbeitsplatz neu` · `kimal3 werkbank neu`)
|
|
17
|
+
|
|
18
|
+
**Wann:** Der Mensch will „seinen KI-Arbeitsplatz", „den Ordner", „die Struktur" — oder ist
|
|
19
|
+
frisch bei Pro und weiß nicht, wo er anfangen soll.
|
|
20
|
+
|
|
21
|
+
🔴 **Zuerst EINE Frage klären, bevor du irgendetwas vorschlägst: Gibt es den Firmen-Ordner
|
|
22
|
+
schon?** Sieh nach, ob neben dir ein `kontext/`-Ordner liegt (oder frag).
|
|
23
|
+
|
|
24
|
+
| Lage | Befehl |
|
|
25
|
+
|---|---|
|
|
26
|
+
| Noch nichts da — die erste Person in dieser Firma | `kimal3 arbeitsplatz neu <vorname>` |
|
|
27
|
+
| Firmen-Ordner steht schon — du brauchst nur deinen eigenen Platz | `kimal3 werkbank neu <vorname>` |
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
kimal3 arbeitsplatz neu # legt KI-Arbeitsplatz/ an (ganze Familie)
|
|
31
|
+
kimal3 arbeitsplatz neu sabine # dasselbe, Werkbank heisst werkbank-sabine
|
|
32
|
+
kimal3 werkbank neu # nur die Werkbank, im bestehenden Firmen-Ordner
|
|
33
|
+
kimal3 werkbank neu sabine # dasselbe, Ordner heisst werkbank-sabine
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
🔴 **Das Argument ist der NAME DES MENSCHEN, nicht der Ordnername** (seit 2026-08-20). Der
|
|
37
|
+
oberste Ordner heißt **immer** `KI-Arbeitsplatz`; mehrere Firmen trennt man über den Ordner
|
|
38
|
+
darüber (`Kunden/ARNO/KI-Arbeitsplatz/`). Der Name wirkt eine Ebene tiefer: aus `sabine` wird
|
|
39
|
+
`werkbank-sabine`.
|
|
40
|
+
|
|
41
|
+
⚠️ **Ohne Angabe rät der Befehl nicht** — der Server bildet den Namen aus der Anmelde-Adresse.
|
|
42
|
+
Das ist meist richtig, aber nicht immer schön (`s.mueller@…` wird zu `werkbank-s-mueller`).
|
|
43
|
+
**Frag den Menschen nach seinem Vornamen und gib ihn mit**, statt es dem Server zu überlassen —
|
|
44
|
+
er heißt selten so, wie seine Adresse aussieht.
|
|
45
|
+
|
|
46
|
+
⚠️ **`werkbank neu` verlangt ein eigenes Pro-Konto.** Die Route prüft den Plan **pro Person**
|
|
47
|
+
(`konto_plan`), nicht über die Firmen-Mitgliedschaft. Ein Kollege ohne eigenes Pro bekommt
|
|
48
|
+
Rückgabewert `4` — dann **nicht** wiederholen und nicht raten, sondern genau das sagen: Sein
|
|
49
|
+
Konto hat keinen Pro-Zugang.
|
|
50
|
+
|
|
51
|
+
**Was dabei entsteht:** ein Firmen-Ordner mit Regeln für Marke, Systeme und Sicherheit, darin
|
|
52
|
+
eine Werkbank zum Arbeiten und ein Beispiel-Projekt zum Ansehen. `werkbank neu` legt nur den
|
|
53
|
+
zweiten Teil an und **fasst die Firmenebene nicht an**.
|
|
54
|
+
|
|
55
|
+
🔑 **Er überschreibt nie etwas.** Ist der Zielordner vorhanden und nicht leer, bricht er ab
|
|
56
|
+
(Rückgabewert 1).
|
|
57
|
+
|
|
58
|
+
🔴 **Und dann NICHT einfach einen anderen Namen anbieten.** Hier stand genau dieser Rat, und er
|
|
59
|
+
war ein Fehler (2026-08-20): Wer im Firmen-Ordner steht und `arbeitsplatz neu <name>` bekommt,
|
|
60
|
+
erhält **eine zweite Firma im Bauch der ersten** — mit eigener `firma.md`, eigener `marke.md`,
|
|
61
|
+
eigener `sicherheit.md`. Es gibt keine Fehlermeldung, und es fällt erst Tage später auf.
|
|
62
|
+
**Frag stattdessen, welche der beiden Lagen oben zutrifft.**
|
|
63
|
+
|
|
64
|
+
🔑 Seit der Umbenennung kann dieser Fehler über `arbeitsplatz neu` gar nicht mehr passieren:
|
|
65
|
+
Der oberste Ordner heißt immer gleich, ein zweiter Name ist dort nicht mehr vorgesehen. Die
|
|
66
|
+
Frage bleibt trotzdem stehen — **weil sie die richtige ist**, nicht weil die Falle noch offen
|
|
67
|
+
wäre.
|
|
68
|
+
|
|
69
|
+
**Danach:** in die Werkbank wechseln und **jeden Platzhalter in eckigen Klammern** gemeinsam
|
|
70
|
+
ausfüllen — `[FIRMA]` und `[NAME]` sind nur die häufigsten, es sind zehn verschiedene. Sie
|
|
71
|
+
stehen absichtlich noch drin — frag nach, statt zu raten. `[DATUM]` ist schon gefüllt.
|
|
72
|
+
|
|
73
|
+
🔑 **Zuerst die zwei Dateien, die bei JEDEM Start mitladen** (`CLAUDE.md` der Firma und der
|
|
74
|
+
Werkbank) — dort kostet ein leerer Vordruck jede Sitzung. Der Rest (`kontext/firma.md`) kann
|
|
75
|
+
warten, bis er gebraucht wird.
|
|
76
|
+
|
|
77
|
+
⚠️ **Nicht nach dieser Liste suchen, sondern nach eckigen Klammern.** Hier stand bis zum
|
|
78
|
+
2026-08-19 eine Aufzählung mit einem Platzhalter, den es gar nicht gab — „Rolle“ ist eine
|
|
79
|
+
Beschriftung, kein Vordruck — und ohne sieben, die es gab. *Eine abgetippte Liste veraltet in dem Moment, in dem die Vorlage wächst.*
|
|
80
|
+
|
|
81
|
+
⚠️ **Nicht die Vorlage „aufräumen".** Das Beispiel-Projekt trägt oben groß, dass kein Code
|
|
82
|
+
darin liegt. Nichts davon ausführen und nicht versuchen, es lauffähig zu machen.
|
|
83
|
+
|
|
84
|
+
## Erst nachsehen, dann schreiben
|
|
85
|
+
`kimal3 projekt liste` — steht es schon da, **nicht** noch einmal eintragen.
|
|
86
|
+
|
|
87
|
+
## Eintragen
|
|
88
|
+
`kimal3 projekt neu --titel "…" [--stunden 6] [--ergebnis 1200] [--symbol bot]`
|
|
89
|
+
Alle Optionen: `kimal3 projekt neu --help`
|
|
90
|
+
|
|
91
|
+
## 🔑 Zahlen nie erfinden
|
|
92
|
+
Zeitersparnis, Umsatz und Ergebnis sind Behauptungen über die Wirklichkeit eines Menschen — und
|
|
93
|
+
sie stehen anschließend **öffentlich** auf einer Seite mit seinem Namen. Ist eine Zahl nicht
|
|
94
|
+
genannt worden: **fragen** oder das Feld weglassen. Niemals schätzen.
|
|
95
|
+
|
|
96
|
+
## Nicht angemeldet?
|
|
97
|
+
Dem Menschen `kimal3 login` zeigen und ihn selbst bestätigen lassen. Die Anmeldung **nie**
|
|
98
|
+
selbst versuchen — sie braucht einen Menschen, der im Browser bestätigt.
|
|
99
|
+
|
|
100
|
+
## Kein Pro-Zugang (Rückgabewert 4)
|
|
101
|
+
Die Meldung enthält bereits die Adresse. Dem Menschen **die Meldung zeigen** und den Befehl
|
|
102
|
+
**nicht wiederholen** — ein zweiter Versuch ändert nichts und wirkt wie ein Fehler im Werkzeug.
|
|
103
|
+
Auch **nicht** `kimal3 login` vorschlagen: Der Mensch *ist* angemeldet, ihm fehlt das Konto.
|
|
104
|
+
|
|
105
|
+
## Vorübergehende Störung (Rückgabewert 3)
|
|
106
|
+
Server nicht erreichbar — oder das Konto ließ sich gerade nicht prüfen. Das ist **kein**
|
|
107
|
+
endgültiges Nein: **einmal** wiederholen ist richtig. Klappt es wieder nicht, dem Menschen die
|
|
108
|
+
Meldung zeigen und es dabei belassen.
|
|
109
|
+
|
|
110
|
+
🔴 **Hierher gehört auch: „Diese Version der App kennt den Befehl noch nicht."** Dann ist die
|
|
111
|
+
Eingabe des Menschen **richtig** und die App zu alt — meist im Fenster zwischen einer neuen
|
|
112
|
+
CLI-Version und dem fertigen Deployment. **Sag ausdrücklich, dass er nichts falsch gemacht hat**,
|
|
113
|
+
und schlag vor, es in ein paar Minuten erneut zu versuchen. Rate ihm **nicht**, den Befehl,
|
|
114
|
+
Namen oder Schreibweisen zu prüfen — dort liegt der Fehler nicht.
|
|
115
|
+
|
|
116
|
+
## Firma auswerten (`kimal3 firma daten`)
|
|
117
|
+
|
|
118
|
+
Liefert die Firmendaten als JSON: Kennzahlen, Menschen, Projekte. **Nur auf ausdrücklichen
|
|
119
|
+
Wunsch abrufen** — es sind personenbezogene Daten von Kolleginnen und Kollegen.
|
|
120
|
+
|
|
121
|
+
`kimal3 firma daten` · bei mehreren Firmen: `kimal3 firma daten --firma "Name"`.
|
|
122
|
+
🔴 **Bricht der Befehl mit mehreren Firmen ab, WÄHLST DU NICHT** — du legst dem Menschen die
|
|
123
|
+
Liste vor und lässt ihn entscheiden. Auch dann nicht, wenn eine Firma offensichtlich die
|
|
124
|
+
gemeinte ist: leer, verschrieben, „TEst". *Der Abbruch IST die Mehrdeutigkeit — sie ist schon
|
|
125
|
+
festgestellt, du beurteilst sie nicht neu.* Wer hier auswählt, zeigt einem Menschen die
|
|
126
|
+
personenbezogenen Daten einer Belegschaft, nach der er nicht gefragt hat.
|
|
127
|
+
|
|
128
|
+
⚠️ Hier stand bis zum 2026-08-18 „nimm einen davon, statt zu raten" — und genau dieser Satz hat
|
|
129
|
+
den Fehler ausgelöst. Er war gegen *Raten* gemeint und übersah, dass **Auswählen sich anders
|
|
130
|
+
anfühlt als Raten, aber dasselbe Ergebnis hat**. (Befund von Dennis im Live-Durchlauf.)
|
|
131
|
+
|
|
132
|
+
**Voraussetzung, die du nennen musst, sobald jemand das für seine echte Firma nutzen will:**
|
|
133
|
+
Die Daten laufen durch das Claude-Konto der Firma. Dafür braucht es ein kommerzielles Konto
|
|
134
|
+
(Team/Enterprise/API) mit Auftragsverarbeitungsvertrag — dort wird nicht mit Kundendaten
|
|
135
|
+
trainiert. Und: Werden **Leistungen von Beschäftigten** ausgewertet, ist das in Deutschland
|
|
136
|
+
mitbestimmungspflichtig. Das entscheidet die Firma, nicht dieses Werkzeug.
|
|
137
|
+
|
|
138
|
+
### Regeln beim Auswerten
|
|
139
|
+
- **Zahlen nie erfinden** — hier doppelt. Für Summen die mitgelieferten `kennzahlen` nehmen;
|
|
140
|
+
rechnest du selbst etwas aus, sag dazu, dass du es gerechnet hast.
|
|
141
|
+
- `stand` ist der Tag der Abfrage. Bei älteren Daten nicht so tun, als wären sie von heute.
|
|
142
|
+
- **Ehemalige nicht verschweigen, aber kennzeichnen** (`ehemalig: true`). Ihre Projekte laufen
|
|
143
|
+
weiter — eine Automatisierung hört nicht auf zu wirken, weil der Mensch gegangen ist.
|
|
144
|
+
- `laeuft: false` heißt „noch nicht live". Solche Projekte haben noch nichts gebracht; ihre
|
|
145
|
+
Zahlen sind Erwartung, keine Bilanz. Wirf sie nie mit dem Laufenden in eine Summe.
|
|
146
|
+
- `abteilung: "Ohne Abteilung"` ist ein echter Wert, kein fehlender.
|
|
147
|
+
⚠️ Steht dort **„unbekannt"** und `abteilungen_bekannt: false`, ließen sich die Abteilungen
|
|
148
|
+
gerade nicht laden — dann **keine** Aussage über Abteilungen treffen, auch keine verneinende.
|
|
149
|
+
- 🔴 **Für „pro Kopf" gilt `mitglieder_aktiv`, nicht `personen.length`** — aber nur
|
|
150
|
+
**firmenweit**. In `personen` stehen nur Menschen mit Erfolgsprofil; hat erst die Hälfte eines
|
|
151
|
+
angelegt, verdoppelt die falsche Zahl jedes Ergebnis. Weichen beide ab, sag dazu, auf welche du
|
|
152
|
+
dich beziehst.
|
|
153
|
+
🔴 **Je Abteilung gibt es KEINE verlässliche Kopfzahl.** `mitglieder_aktiv` ist firmenweit und
|
|
154
|
+
für einen Abteilungsvergleich unbrauchbar — sie ist für beide Seiten dieselbe. Vergleiche
|
|
155
|
+
Abteilungen deshalb über **Summen** (Projekte, Zeitersparnis, Ergebnis). Musst du doch pro Kopf
|
|
156
|
+
rechnen, sag ausdrücklich dazu, dass du über die Menschen **mit Erfolgsprofil** gerechnet hast.
|
|
157
|
+
⚠️ **Und hat eine Abteilung keinen aktiven Menschen mehr, ist „pro Kopf" dort nicht definiert —
|
|
158
|
+
sag das, statt zu teilen.** Der Fall ist echt: Eine Abteilung, deren Projekte weiterlaufen,
|
|
159
|
+
während der letzte Mensch gegangen ist, hat kein Kopfzahl-Problem, sondern ein Betreuungsproblem.
|
|
160
|
+
**Das ist die Aussage, die zählt** — nenne sie, statt eine Zahl zu erzwingen.
|
|
161
|
+
📌 `mitglieder_gesamt` zählt **Ehemalige mit** — es ist die Zahl aller Mitgliedschaften, nicht
|
|
162
|
+
die Belegschaft von heute.
|
|
163
|
+
⚠️ **Und es ist NICHT die Zahl der Team-Karten auf `/firma`.** Genau das stand hier und war
|
|
164
|
+
falsch: Die Karten zeigen nur Menschen **mit** Erfolgsprofil. Wer eine Mitgliedschaft ohne
|
|
165
|
+
Profil hat, zählt in `mitglieder_gesamt` mit und erscheint als keine Karte. **Willst du sagen,
|
|
166
|
+
wie viele Karten dort stehen, ist das `personen.length`** — und weichen die beiden Zahlen ab,
|
|
167
|
+
sag dazu, welche du meinst.
|
|
168
|
+
- Zwei Menschen mit demselben Namen erscheinen als „Lena Meyer" und „Lena Meyer (2)". Das ist
|
|
169
|
+
kein Tippfehler, sondern die Unterscheidung — behandle sie als zwei Personen.
|
|
170
|
+
- ⚖️ **Umsatz und Ergebnis nicht in einen Topf, wenn du Abteilungen vergleichst.**
|
|
171
|
+
`umsatz_monat_eur` gibt es nur, wo Umsatz entsteht — Support oder Buchhaltung sparen Kosten und
|
|
172
|
+
erzeugen keinen Umsatz. Deren `0` ist die Natur der Arbeit, kein Versagen. Wer die Gesamtsumme
|
|
173
|
+
vergleicht, erklärt umsatznahe Abteilungen automatisch zu den besseren. Stell **Ergebnis und
|
|
174
|
+
Zeitersparnis** nebeneinander und nenne den Umsatz getrennt.
|
|
175
|
+
|
|
176
|
+
### Fragen, die sich lohnen
|
|
177
|
+
- „Welche drei Projekte bringen den meisten messbaren Ertrag — und welche Abteilung hat am
|
|
178
|
+
längsten nichts Neues geliefert?"
|
|
179
|
+
- „Vergleiche Vertrieb und Support: Projekte, Zeitersparnis, Ergebnis."
|
|
180
|
+
- „Was würdest du als Geschäftsführung als Nächstes automatisieren, gemessen an dem, was bisher
|
|
181
|
+
funktioniert hat — und was davon lässt sich auf andere Abteilungen übertragen?"
|
|
182
|
+
|
|
183
|
+
## Rückgabewerte
|
|
184
|
+
`0` erledigt · `1` **Wiederholen hilft nicht — LIES DIE MELDUNG** · `2` Anmeldung fehlt ·
|
|
185
|
+
`3` vorübergehende Störung, einmal wiederholen · `4` angemeldet, aber kein Pro-Zugang —
|
|
186
|
+
**nicht** wiederholen
|
|
187
|
+
|
|
188
|
+
🔴 **Die `1` hat mehrere Gründe, und sie verlangen Verschiedenes:** „wähl eine Firma", „leg
|
|
189
|
+
zuerst ein Erfolgsprofil an", „die Eingabe passt nicht", „das Paket ist unvollständig". **Gib
|
|
190
|
+
niemals einen Standard-Rat auf die Zahl allein** — die Meldung nennt jedes Mal, was zu tun ist.
|
|
191
|
+
|
|
192
|
+
⚠️ Hier stand kurzzeitig „dann ist `npm install -g kimal3` der Weg". Das hätte bei „du gehörst
|
|
193
|
+
zu zwei Firmen" eine Neuinstallation empfohlen — für einen völlig normalen Fall. *Ein
|
|
194
|
+
Rückgabewert sagt, OB man es noch einmal versuchen soll; WAS zu tun ist, steht im Text.*
|
|
195
|
+
|
|
196
|
+
## Die `→`-Zeile am Ende ist KEIN Fehler
|
|
197
|
+
|
|
198
|
+
Nach einem Befehl kann eine eingerückte Zeile mit `→` erscheinen — auf **stderr**, höchstens
|
|
199
|
+
einmal am Tag. Das ist ein **Update-Hinweis**, kein Fehler:
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
→ kimal3 0.2.0 ist da. npm i -g kimal3@latest && kimal3 skill install
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
🔴 **Sie ändert den Rückgabewert nicht.** Steht dort eine `0`, ist der Befehl **erledigt** —
|
|
206
|
+
auch wenn darunter noch eine `→`-Zeile steht. Wer die Zeile für eine Fehlermeldung hält,
|
|
207
|
+
wiederholt einen Befehl, der längst durchgelaufen ist, oder meldet dem Menschen einen Fehlschlag,
|
|
208
|
+
den es nicht gab.
|
|
209
|
+
|
|
210
|
+
**Was stattdessen richtig ist:** Sag dem Menschen in einem Satz, dass ein Update bereitsteht, und
|
|
211
|
+
biete an, den Befehl aus der Zeile auszuführen. **Führ ihn nicht ungefragt aus** — er
|
|
212
|
+
installiert etwas auf seinem Rechner.
|