kimal3 0.1.1 → 0.1.3
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/dist/api.js +6 -9
- package/dist/argumente.js +35 -7
- package/dist/befehle/firma-daten.js +147 -0
- package/dist/befehle/projekt-liste.js +90 -9
- package/dist/befehle/projekt-neu.js +8 -2
- package/dist/befehle/skill-install.js +271 -6
- package/dist/befehle-katalog.js +112 -0
- package/dist/fehler.js +66 -0
- package/dist/firmen-liste.js +70 -0
- package/dist/kimal3.js +70 -13
- package/dist/projekt-zeilen.js +253 -0
- package/package.json +27 -16
- package/skill/SKILL.md +125 -43
- package/skill/commands/k3.md +44 -0
- package/skill/commands/k3firma.md +57 -0
- package/skill/commands/k3liste.md +26 -0
- package/skill/commands/k3projekt.md +44 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Die Zeilen, die `kimal3 projekt liste` ausgibt — und das Lesen der Antwort.
|
|
3
|
+
*
|
|
4
|
+
* 🔑 Eine reine Rechnung, damit `check:cli` sie ohne Server pruefen kann --
|
|
5
|
+
* dieselbe Ueberlegung wie bei `firmen-liste.ts` und `fehler.ts`.
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ **Warum hier eigene Formatierer stehen, obwohl die App `euroBetrag` und
|
|
8
|
+
* `datumLang` schon hat:** Die CLI ist ein eigenstaendiges npm-Paket mit
|
|
9
|
+
* `rootDir: src` -- sie kann aus `../../src` nichts importieren. Das ist kein
|
|
10
|
+
* Versehen, sondern der Preis dafuer, dass das Paket ohne die App baut.
|
|
11
|
+
*
|
|
12
|
+
* 🔴 Und ein Unterschied ist ABSICHT, kein Drift: `euroBetrag` in der App
|
|
13
|
+
* rundet auf ganze Euro, weil eine Monats-Selbstauskunft keine Cent-Genauigkeit
|
|
14
|
+
* hat. Hier werden Cents ANGEZEIGT, sobald welche dastehen. Grund ist die
|
|
15
|
+
* Hausregel "erst runden, DANN entscheiden": Wer 0,10 € eingetragen hat und im
|
|
16
|
+
* Terminal "0 €" liest, haelt seine Eingabe fuer verloren. Das Terminal ist der
|
|
17
|
+
* Ort der Nachschau, die oeffentliche Karte der Ort der Aussage.
|
|
18
|
+
*/
|
|
19
|
+
/** Ein Zahlenfeld: `null` heisst "nicht angegeben", `false` heisst "unlesbar". */
|
|
20
|
+
function zahlFeld(o, name) {
|
|
21
|
+
const w = o[name];
|
|
22
|
+
if (w === undefined || w === null)
|
|
23
|
+
return null;
|
|
24
|
+
if (typeof w === "number" && Number.isFinite(w))
|
|
25
|
+
return w;
|
|
26
|
+
// 🔴 Eine Zahl, die als Zeichenkette ankommt, wird NICHT still zu "nicht
|
|
27
|
+
// angegeben". Genau das waere die Faktor-1000-Falle in ihrer leisen Form:
|
|
28
|
+
// Der Mensch sieht ein Projekt ohne Zahlen und glaubt, seine Eingabe sei nie
|
|
29
|
+
// angekommen. *Stilles Weglassen ist der schlechteste der drei Wege.*
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Die Projekte aus der Antwort lesen.
|
|
34
|
+
*
|
|
35
|
+
* ⚠️ **`null` und `[]` sind zwei verschiedene Wirklichkeiten.** `[]` heisst
|
|
36
|
+
* "du hast noch keine Projekte" -- eine gueltige Antwort auf eine gueltige
|
|
37
|
+
* Frage. `null` heisst "diese Antwort war nicht lesbar". Faellt beides auf
|
|
38
|
+
* denselben Rueckgabewert, feiert der Befehl eine Stoerung als Erfolg und
|
|
39
|
+
* raet zum Eintragen von etwas, das laengst dasteht.
|
|
40
|
+
*
|
|
41
|
+
* 🔑 Auch eine ALTE App-Fassung landet hier auf `null`: Sie antwortet mit
|
|
42
|
+
* `{ "titel": [...] }` und ohne `projekte`. **Das ist aber NICHT das Ende** --
|
|
43
|
+
* `projekt-liste.ts` fragt danach `titelAusAlterAntwort` und zeigt die Liste
|
|
44
|
+
* ohne Zahlen, mit Rueckgabewert `0`. Diese Funktion sagt also nur "ich kann
|
|
45
|
+
* es nicht lesen", nicht "es ist kaputt".
|
|
46
|
+
*
|
|
47
|
+
* ⚠️ Hier stand bis zur Review-Runde 3 (2026-08-18) das Gegenteil: "Der Befehl
|
|
48
|
+
* meldet dann eine unlesbare Antwort und den Rueckgabewert `3`." Das war vor
|
|
49
|
+
* L-7 richtig und danach falsch -- und der widersprechende Text stand vierzig
|
|
50
|
+
* Zeilen ueber der Funktion, die es besser weiss.
|
|
51
|
+
* *In diesem Projekt sind Kommentare tragend* (siehe
|
|
52
|
+
* `docs/regeln/messen-und-pruefen.md`, Abschnitt 11, in genau diesem Zweig
|
|
53
|
+
* hinzugefuegt): Der naechste Leser haette geglaubt, den Rueckfallweg gebe es
|
|
54
|
+
* nicht -- und ihn vielleicht ein zweites Mal gebaut.
|
|
55
|
+
*/
|
|
56
|
+
export function projekteAusAntwort(koerper) {
|
|
57
|
+
if (!koerper || typeof koerper !== "object")
|
|
58
|
+
return null;
|
|
59
|
+
const roh = koerper.projekte;
|
|
60
|
+
if (!Array.isArray(roh))
|
|
61
|
+
return null;
|
|
62
|
+
const projekte = [];
|
|
63
|
+
for (const eintrag of roh) {
|
|
64
|
+
if (!eintrag || typeof eintrag !== "object")
|
|
65
|
+
return null;
|
|
66
|
+
const o = eintrag;
|
|
67
|
+
if (typeof o.titel !== "string")
|
|
68
|
+
return null;
|
|
69
|
+
if (typeof o.laeuft !== "boolean")
|
|
70
|
+
return null;
|
|
71
|
+
const liveSeit = o.live_seit;
|
|
72
|
+
if (liveSeit !== null && liveSeit !== undefined && typeof liveSeit !== "string")
|
|
73
|
+
return null;
|
|
74
|
+
const stunden = zahlFeld(o, "zeitersparnis_std_wo");
|
|
75
|
+
const ergebnis = zahlFeld(o, "ergebnis_monat_eur");
|
|
76
|
+
const umsatz = zahlFeld(o, "umsatz_monat_eur");
|
|
77
|
+
if (stunden === false || ergebnis === false || umsatz === false)
|
|
78
|
+
return null;
|
|
79
|
+
projekte.push({
|
|
80
|
+
titel: o.titel,
|
|
81
|
+
live_seit: typeof liveSeit === "string" ? liveSeit : null,
|
|
82
|
+
laeuft: o.laeuft,
|
|
83
|
+
zeitersparnis_std_wo: stunden,
|
|
84
|
+
ergebnis_monat_eur: ergebnis,
|
|
85
|
+
umsatz_monat_eur: umsatz,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return projekte;
|
|
89
|
+
}
|
|
90
|
+
const MONATE = [
|
|
91
|
+
"Januar", "Februar", "März", "April", "Mai", "Juni",
|
|
92
|
+
"Juli", "August", "September", "Oktober", "November", "Dezember",
|
|
93
|
+
];
|
|
94
|
+
/**
|
|
95
|
+
* "2026-07-01" → "1. Juli 2026". Bewusst aus der Zeichenkette gerechnet statt
|
|
96
|
+
* ueber `new Date()`: Ein ISO-Datum ohne Uhrzeit gilt als UTC-Mitternacht und
|
|
97
|
+
* kippt sonst je nach Zeitzone einen Tag zurueck -- und ein Terminal steht
|
|
98
|
+
* irgendwo auf der Welt.
|
|
99
|
+
*
|
|
100
|
+
* ⚠️ Erwartet ein REINES Datum (`JJJJ-MM-TT`), wie es die `date`-Spalte
|
|
101
|
+
* `live_seit` liefert. Passt es nicht, steht lieber das rohe Datum da als ein
|
|
102
|
+
* kaputter Satz ("NaN. August 2026" -- der Fehler vom 2026-08-12).
|
|
103
|
+
*/
|
|
104
|
+
function datumLang(isoDatum) {
|
|
105
|
+
const [jahr, monat, tag] = isoDatum.split("-");
|
|
106
|
+
const monatsname = MONATE[Number(monat) - 1];
|
|
107
|
+
if (!monatsname || !jahr || !Number.isFinite(Number(tag)))
|
|
108
|
+
return isoDatum;
|
|
109
|
+
return `${Number(tag)}. ${monatsname} ${jahr}`;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* "1200" → "1.200 €", "0.1" → "0,10 €".
|
|
113
|
+
*
|
|
114
|
+
* Cents erscheinen nur, wenn welche da sind: "1.200,00 €" taeuscht eine
|
|
115
|
+
* Genauigkeit vor, die niemand behauptet hat -- "0 €" bei 0,10 € verschweigt
|
|
116
|
+
* dagegen eine, die dasteht.
|
|
117
|
+
*/
|
|
118
|
+
function euro(wert) {
|
|
119
|
+
const hatCent = Math.round(wert * 100) % 100 !== 0;
|
|
120
|
+
const stellen = hatCent ? 2 : 0;
|
|
121
|
+
return `${new Intl.NumberFormat("de-DE", {
|
|
122
|
+
minimumFractionDigits: stellen,
|
|
123
|
+
maximumFractionDigits: stellen,
|
|
124
|
+
}).format(wert)} €`;
|
|
125
|
+
}
|
|
126
|
+
/** "6" → "6", "6.5" → "6,5". Die Spalte ist numeric(6,2). */
|
|
127
|
+
function stunden(wert) {
|
|
128
|
+
return new Intl.NumberFormat("de-DE", { maximumFractionDigits: 2 }).format(wert);
|
|
129
|
+
}
|
|
130
|
+
/** Was oben in der zweiten Zeile steht: laeuft, geplant oder noch nicht live. */
|
|
131
|
+
function zustand(p) {
|
|
132
|
+
if (p.live_seit === null)
|
|
133
|
+
return "noch nicht live";
|
|
134
|
+
return p.laeuft
|
|
135
|
+
? `live seit ${datumLang(p.live_seit)}`
|
|
136
|
+
: `geplant ab ${datumLang(p.live_seit)}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Zwei Zeilen je Projekt: Titel, darunter die Angaben.
|
|
140
|
+
*
|
|
141
|
+
* 🔑 **Was fehlt, wird als fehlend gezeigt** -- nie durch 0 ersetzt. Ein
|
|
142
|
+
* Projekt ohne Zahlen ist der Normalfall: Nicht jede Automation hat einen
|
|
143
|
+
* Eurobetrag, und eine erfundene 0 stuende spaeter oeffentlich auf der Karte
|
|
144
|
+
* eines Menschen. Eine ausdrueckliche 0 ist dagegen eine ANGABE und wird
|
|
145
|
+
* gezeigt -- deshalb wird auf `null` geprueft, nicht auf Wahrheitswert.
|
|
146
|
+
*/
|
|
147
|
+
export function projektZeilen(projekte) {
|
|
148
|
+
const zeilen = [];
|
|
149
|
+
projekte.forEach((p, i) => {
|
|
150
|
+
if (i > 0)
|
|
151
|
+
zeilen.push("");
|
|
152
|
+
zeilen.push(` ${i + 1}. ${p.titel}`);
|
|
153
|
+
const teile = [zustand(p)];
|
|
154
|
+
if (p.zeitersparnis_std_wo !== null) {
|
|
155
|
+
teile.push(`${stunden(p.zeitersparnis_std_wo)} Std./Woche`);
|
|
156
|
+
}
|
|
157
|
+
if (p.ergebnis_monat_eur !== null) {
|
|
158
|
+
teile.push(`${euro(p.ergebnis_monat_eur)} Ergebnis/Monat`);
|
|
159
|
+
}
|
|
160
|
+
if (p.umsatz_monat_eur !== null) {
|
|
161
|
+
teile.push(`${euro(p.umsatz_monat_eur)} Umsatz/Monat`);
|
|
162
|
+
}
|
|
163
|
+
// Nur der Zustand steht da? Dann sagen wir das ausdruecklich, statt eine
|
|
164
|
+
// halbe Zeile hinzustellen, die aussieht, als sei etwas abgeschnitten.
|
|
165
|
+
if (teile.length === 1)
|
|
166
|
+
teile.push("keine Zahlen eingetragen");
|
|
167
|
+
zeilen.push(` ${teile.join(" · ")}`);
|
|
168
|
+
});
|
|
169
|
+
return zeilen;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Liest die ALTE Antwortform (`titel: string[]`, ohne `projekte`).
|
|
173
|
+
*
|
|
174
|
+
* 🔑 **Wofuer das da ist** (Befund L-7, 2026-08-18): Die CLI kann neuer sein
|
|
175
|
+
* als die App -- in jedem Deployment-Fenster zwischen `npm publish` und dem
|
|
176
|
+
* fertigen Vercel-Build. Dann antwortet der Server voellig korrekt, nur in der
|
|
177
|
+
* alten Form. Ohne diese Funktion faellt das in denselben Topf wie eine
|
|
178
|
+
* kaputte Antwort, und die CLI raet zum Wiederholen -- was hier NIE hilft.
|
|
179
|
+
*
|
|
180
|
+
* Gibt `null` zurueck, wenn es auch die alte Form nicht ist. Dann ist die
|
|
181
|
+
* Antwort wirklich unlesbar, und der Rat zum Wiederholen stimmt.
|
|
182
|
+
*/
|
|
183
|
+
export function titelAusAlterAntwort(koerper) {
|
|
184
|
+
if (!koerper || typeof koerper !== "object")
|
|
185
|
+
return null;
|
|
186
|
+
const o = koerper;
|
|
187
|
+
// ⚠️ Nur wenn `projekte` FEHLT. Ist es da und war trotzdem unlesbar, ist die
|
|
188
|
+
// Antwort defekt -- dann darf sie nicht als "alte Version" durchgehen.
|
|
189
|
+
if ("projekte" in o)
|
|
190
|
+
return null;
|
|
191
|
+
// Ab Runde 6 stuetzt sich das auf `titelFeldLesen` -- dieselbe Regel darf
|
|
192
|
+
// nicht an zwei Orten stehen.
|
|
193
|
+
return titelFeldLesen(koerper);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Wie viele Projekte ein Erfolgsprofil hoechstens traegt.
|
|
197
|
+
*
|
|
198
|
+
* ⚠️ **Das ist eine KOPIE von `MAX_PROJEKTE` aus
|
|
199
|
+
* `src/app/(erfolgsprofil)/typen.ts`** — die CLI ist ein eigenstaendiges
|
|
200
|
+
* npm-Paket mit `rootDir: src` und kann aus der App nichts importieren.
|
|
201
|
+
*
|
|
202
|
+
* 🔴 **Deshalb misst `npm run check:cli`, dass die beiden Zahlen gleich sind**
|
|
203
|
+
* (Review-Befund, 2026-08-18). Vorher stand die `12` an zwei Stellen in
|
|
204
|
+
* `projekt-liste.ts` fest im Text, und nichts pruefte sie gegen die App: Wer
|
|
205
|
+
* die Grenze dort anhebt, laesst die CLI still weiter "von 12" behaupten.
|
|
206
|
+
* *Dieselbe Zahl an drei Tueren — das Muster, das dieses Projekt schon zweimal
|
|
207
|
+
* eingefangen hat.*
|
|
208
|
+
*/
|
|
209
|
+
export const MAX_PROJEKTE_ANZEIGE = 12;
|
|
210
|
+
/**
|
|
211
|
+
* Sagt, ob die Antwort ueberhaupt ein Feld `projekte` mitbringt.
|
|
212
|
+
*
|
|
213
|
+
* 🔑 **Wofuer das da ist** (Review-Runde 4, 2026-08-18): Es schliesst die
|
|
214
|
+
* Vertraeglichkeits-Matrix in der letzten offenen Richtung. Bisher gab es
|
|
215
|
+
* zwei Faelle:
|
|
216
|
+
* - die App ist AELTER (kein `projekte`, nur `titel`) -> `titelAusAlterAntwort`
|
|
217
|
+
* - die Antwort ist Muell (WLAN-Portal, HTML) -> "nicht lesbar", noch mal
|
|
218
|
+
*
|
|
219
|
+
* Der dritte fehlte: **die App ist NEUER als die CLI.** Dann steht `projekte`
|
|
220
|
+
* da, aber ein Eintrag hat eine Form, die diese Fassung nicht kennt --
|
|
221
|
+
* `projekteAusAntwort` steigt beim ersten aus und gibt `null`. Elf gute
|
|
222
|
+
* Projekte verschwinden mit dem zwoelften, und der Mensch bekam den Rat,
|
|
223
|
+
* es gleich noch einmal zu versuchen. **Der Zustand ist aber stabil** --
|
|
224
|
+
* Wiederholen aendert nichts, bis das Werkzeug aktualisiert wird.
|
|
225
|
+
*
|
|
226
|
+
* *Genau die Form von B-5, B-7 und L-7 -- in der einen Richtung, die dieser
|
|
227
|
+
* Zweig noch nicht abgedeckt hatte.*
|
|
228
|
+
*/
|
|
229
|
+
export function antwortHatProjekteFeld(koerper) {
|
|
230
|
+
return !!koerper && typeof koerper === "object" && "projekte" in koerper;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Liest das Feld `titel` — **ohne** zu fragen, ob `projekte` daneben steht.
|
|
234
|
+
*
|
|
235
|
+
* 🔑 **Wofuer** (Review-Runde 6, 2026-08-18): Die neue Route liefert `titel`
|
|
236
|
+
* und `projekte` IMMER gemeinsam. Aendert eine spaetere App-Fassung die Form
|
|
237
|
+
* eines Eintrags, steigt `projekteAusAntwort` beim ersten aus -- die zwoelf
|
|
238
|
+
* Titel stehen aber unveraendert daneben. Sie dann nicht zu zeigen und
|
|
239
|
+
* stattdessen "npm install -g kimal3" zu sagen, wirft Daten weg, die man hat.
|
|
240
|
+
*
|
|
241
|
+
* *Wer dem Menschen etwas geben kann, gibt es ihm -- und sagt dazu, was
|
|
242
|
+
* fehlt.*
|
|
243
|
+
*/
|
|
244
|
+
export function titelFeldLesen(koerper) {
|
|
245
|
+
if (!koerper || typeof koerper !== "object")
|
|
246
|
+
return null;
|
|
247
|
+
const roh = koerper.titel;
|
|
248
|
+
if (!Array.isArray(roh))
|
|
249
|
+
return null;
|
|
250
|
+
if (!roh.every((t) => typeof t === "string"))
|
|
251
|
+
return null;
|
|
252
|
+
return roh;
|
|
253
|
+
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "kimal3",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Trag deine KI-Projekte dort ein, wo sie entstehen: im Terminal.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "kimal3",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Trag deine KI-Projekte dort ein, wo sie entstehen: im Terminal.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"kimal3": "dist/kimal3.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"skill",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -p tsconfig.json",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"kimal3",
|
|
23
|
+
"cli"
|
|
24
|
+
],
|
|
25
|
+
"homepage": "https://kimal3-app.vercel.app/pro",
|
|
26
|
+
"license": "SEE LICENSE IN README.md"
|
|
27
|
+
}
|
package/skill/SKILL.md
CHANGED
|
@@ -1,43 +1,125 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: kimal3
|
|
3
|
-
description:
|
|
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
|
-
## Erst nachsehen, dann schreiben
|
|
16
|
-
`kimal3 projekt liste` — steht es schon da, **nicht** noch einmal eintragen.
|
|
17
|
-
|
|
18
|
-
## Eintragen
|
|
19
|
-
`kimal3 projekt neu --titel "…" [--stunden 6] [--ergebnis 1200] [--symbol bot]`
|
|
20
|
-
Alle Optionen: `kimal3 projekt neu --help`
|
|
21
|
-
|
|
22
|
-
## 🔑 Zahlen nie erfinden
|
|
23
|
-
Zeitersparnis, Umsatz und Ergebnis sind Behauptungen über die Wirklichkeit eines Menschen — und
|
|
24
|
-
sie stehen anschließend **öffentlich** auf einer Seite mit seinem Namen. Ist eine Zahl nicht
|
|
25
|
-
genannt worden: **fragen** oder das Feld weglassen. Niemals schätzen.
|
|
26
|
-
|
|
27
|
-
## Nicht angemeldet?
|
|
28
|
-
Dem Menschen `kimal3 login` zeigen und ihn selbst bestätigen lassen. Die Anmeldung **nie**
|
|
29
|
-
selbst versuchen — sie braucht einen Menschen, der im Browser bestätigt.
|
|
30
|
-
|
|
31
|
-
## Kein Pro-Zugang (Rückgabewert 4)
|
|
32
|
-
Die Meldung enthält bereits die Adresse. Dem Menschen **die Meldung zeigen** und den Befehl
|
|
33
|
-
**nicht wiederholen** — ein zweiter Versuch ändert nichts und wirkt wie ein Fehler im Werkzeug.
|
|
34
|
-
Auch **nicht** `kimal3 login` vorschlagen: Der Mensch *ist* angemeldet, ihm fehlt das Konto.
|
|
35
|
-
|
|
36
|
-
## Vorübergehende Störung (Rückgabewert 3)
|
|
37
|
-
Server nicht erreichbar — oder das Konto ließ sich gerade nicht prüfen. Das ist **kein**
|
|
38
|
-
endgültiges Nein: **einmal** wiederholen ist richtig. Klappt es wieder nicht, dem Menschen die
|
|
39
|
-
Meldung zeigen und es dabei belassen.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
1
|
+
---
|
|
2
|
+
name: kimal3
|
|
3
|
+
description: Projekte ins kimal3-Erfolgsprofil eintragen oder auflisten — und Firmendaten auswerten. Sobald ein KI-Projekt fertig ist oder jemand danach fragt.
|
|
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
|
+
## Erst nachsehen, dann schreiben
|
|
16
|
+
`kimal3 projekt liste` — steht es schon da, **nicht** noch einmal eintragen.
|
|
17
|
+
|
|
18
|
+
## Eintragen
|
|
19
|
+
`kimal3 projekt neu --titel "…" [--stunden 6] [--ergebnis 1200] [--symbol bot]`
|
|
20
|
+
Alle Optionen: `kimal3 projekt neu --help`
|
|
21
|
+
|
|
22
|
+
## 🔑 Zahlen nie erfinden
|
|
23
|
+
Zeitersparnis, Umsatz und Ergebnis sind Behauptungen über die Wirklichkeit eines Menschen — und
|
|
24
|
+
sie stehen anschließend **öffentlich** auf einer Seite mit seinem Namen. Ist eine Zahl nicht
|
|
25
|
+
genannt worden: **fragen** oder das Feld weglassen. Niemals schätzen.
|
|
26
|
+
|
|
27
|
+
## Nicht angemeldet?
|
|
28
|
+
Dem Menschen `kimal3 login` zeigen und ihn selbst bestätigen lassen. Die Anmeldung **nie**
|
|
29
|
+
selbst versuchen — sie braucht einen Menschen, der im Browser bestätigt.
|
|
30
|
+
|
|
31
|
+
## Kein Pro-Zugang (Rückgabewert 4)
|
|
32
|
+
Die Meldung enthält bereits die Adresse. Dem Menschen **die Meldung zeigen** und den Befehl
|
|
33
|
+
**nicht wiederholen** — ein zweiter Versuch ändert nichts und wirkt wie ein Fehler im Werkzeug.
|
|
34
|
+
Auch **nicht** `kimal3 login` vorschlagen: Der Mensch *ist* angemeldet, ihm fehlt das Konto.
|
|
35
|
+
|
|
36
|
+
## Vorübergehende Störung (Rückgabewert 3)
|
|
37
|
+
Server nicht erreichbar — oder das Konto ließ sich gerade nicht prüfen. Das ist **kein**
|
|
38
|
+
endgültiges Nein: **einmal** wiederholen ist richtig. Klappt es wieder nicht, dem Menschen die
|
|
39
|
+
Meldung zeigen und es dabei belassen.
|
|
40
|
+
|
|
41
|
+
🔴 **Hierher gehört auch: „Diese Version der App kennt den Befehl noch nicht."** Dann ist die
|
|
42
|
+
Eingabe des Menschen **richtig** und die App zu alt — meist im Fenster zwischen einer neuen
|
|
43
|
+
CLI-Version und dem fertigen Deployment. **Sag ausdrücklich, dass er nichts falsch gemacht hat**,
|
|
44
|
+
und schlag vor, es in ein paar Minuten erneut zu versuchen. Rate ihm **nicht**, den Befehl,
|
|
45
|
+
Namen oder Schreibweisen zu prüfen — dort liegt der Fehler nicht.
|
|
46
|
+
|
|
47
|
+
## Firma auswerten (`kimal3 firma daten`)
|
|
48
|
+
|
|
49
|
+
Liefert die Firmendaten als JSON: Kennzahlen, Menschen, Projekte. **Nur auf ausdrücklichen
|
|
50
|
+
Wunsch abrufen** — es sind personenbezogene Daten von Kolleginnen und Kollegen.
|
|
51
|
+
|
|
52
|
+
`kimal3 firma daten` · bei mehreren Firmen: `kimal3 firma daten --firma "Name"`.
|
|
53
|
+
🔴 **Bricht der Befehl mit mehreren Firmen ab, WÄHLST DU NICHT** — du legst dem Menschen die
|
|
54
|
+
Liste vor und lässt ihn entscheiden. Auch dann nicht, wenn eine Firma offensichtlich die
|
|
55
|
+
gemeinte ist: leer, verschrieben, „TEst". *Der Abbruch IST die Mehrdeutigkeit — sie ist schon
|
|
56
|
+
festgestellt, du beurteilst sie nicht neu.* Wer hier auswählt, zeigt einem Menschen die
|
|
57
|
+
personenbezogenen Daten einer Belegschaft, nach der er nicht gefragt hat.
|
|
58
|
+
|
|
59
|
+
⚠️ Hier stand bis zum 2026-08-18 „nimm einen davon, statt zu raten" — und genau dieser Satz hat
|
|
60
|
+
den Fehler ausgelöst. Er war gegen *Raten* gemeint und übersah, dass **Auswählen sich anders
|
|
61
|
+
anfühlt als Raten, aber dasselbe Ergebnis hat**. (Befund von Dennis im Live-Durchlauf.)
|
|
62
|
+
|
|
63
|
+
**Voraussetzung, die du nennen musst, sobald jemand das für seine echte Firma nutzen will:**
|
|
64
|
+
Die Daten laufen durch das Claude-Konto der Firma. Dafür braucht es ein kommerzielles Konto
|
|
65
|
+
(Team/Enterprise/API) mit Auftragsverarbeitungsvertrag — dort wird nicht mit Kundendaten
|
|
66
|
+
trainiert. Und: Werden **Leistungen von Beschäftigten** ausgewertet, ist das in Deutschland
|
|
67
|
+
mitbestimmungspflichtig. Das entscheidet die Firma, nicht dieses Werkzeug.
|
|
68
|
+
|
|
69
|
+
### Regeln beim Auswerten
|
|
70
|
+
- **Zahlen nie erfinden** — hier doppelt. Für Summen die mitgelieferten `kennzahlen` nehmen;
|
|
71
|
+
rechnest du selbst etwas aus, sag dazu, dass du es gerechnet hast.
|
|
72
|
+
- `stand` ist der Tag der Abfrage. Bei älteren Daten nicht so tun, als wären sie von heute.
|
|
73
|
+
- **Ehemalige nicht verschweigen, aber kennzeichnen** (`ehemalig: true`). Ihre Projekte laufen
|
|
74
|
+
weiter — eine Automatisierung hört nicht auf zu wirken, weil der Mensch gegangen ist.
|
|
75
|
+
- `laeuft: false` heißt „noch nicht live". Solche Projekte haben noch nichts gebracht; ihre
|
|
76
|
+
Zahlen sind Erwartung, keine Bilanz. Wirf sie nie mit dem Laufenden in eine Summe.
|
|
77
|
+
- `abteilung: "Ohne Abteilung"` ist ein echter Wert, kein fehlender.
|
|
78
|
+
⚠️ Steht dort **„unbekannt"** und `abteilungen_bekannt: false`, ließen sich die Abteilungen
|
|
79
|
+
gerade nicht laden — dann **keine** Aussage über Abteilungen treffen, auch keine verneinende.
|
|
80
|
+
- 🔴 **Für „pro Kopf" gilt `mitglieder_aktiv`, nicht `personen.length`** — aber nur
|
|
81
|
+
**firmenweit**. In `personen` stehen nur Menschen mit Erfolgsprofil; hat erst die Hälfte eines
|
|
82
|
+
angelegt, verdoppelt die falsche Zahl jedes Ergebnis. Weichen beide ab, sag dazu, auf welche du
|
|
83
|
+
dich beziehst.
|
|
84
|
+
🔴 **Je Abteilung gibt es KEINE verlässliche Kopfzahl.** `mitglieder_aktiv` ist firmenweit und
|
|
85
|
+
für einen Abteilungsvergleich unbrauchbar — sie ist für beide Seiten dieselbe. Vergleiche
|
|
86
|
+
Abteilungen deshalb über **Summen** (Projekte, Zeitersparnis, Ergebnis). Musst du doch pro Kopf
|
|
87
|
+
rechnen, sag ausdrücklich dazu, dass du über die Menschen **mit Erfolgsprofil** gerechnet hast.
|
|
88
|
+
⚠️ **Und hat eine Abteilung keinen aktiven Menschen mehr, ist „pro Kopf" dort nicht definiert —
|
|
89
|
+
sag das, statt zu teilen.** Der Fall ist echt: Eine Abteilung, deren Projekte weiterlaufen,
|
|
90
|
+
während der letzte Mensch gegangen ist, hat kein Kopfzahl-Problem, sondern ein Betreuungsproblem.
|
|
91
|
+
**Das ist die Aussage, die zählt** — nenne sie, statt eine Zahl zu erzwingen.
|
|
92
|
+
📌 `mitglieder_gesamt` zählt **Ehemalige mit** — es ist die Zahl aller Mitgliedschaften, nicht
|
|
93
|
+
die Belegschaft von heute.
|
|
94
|
+
⚠️ **Und es ist NICHT die Zahl der Team-Karten auf `/firma`.** Genau das stand hier und war
|
|
95
|
+
falsch: Die Karten zeigen nur Menschen **mit** Erfolgsprofil. Wer eine Mitgliedschaft ohne
|
|
96
|
+
Profil hat, zählt in `mitglieder_gesamt` mit und erscheint als keine Karte. **Willst du sagen,
|
|
97
|
+
wie viele Karten dort stehen, ist das `personen.length`** — und weichen die beiden Zahlen ab,
|
|
98
|
+
sag dazu, welche du meinst.
|
|
99
|
+
- Zwei Menschen mit demselben Namen erscheinen als „Lena Meyer" und „Lena Meyer (2)". Das ist
|
|
100
|
+
kein Tippfehler, sondern die Unterscheidung — behandle sie als zwei Personen.
|
|
101
|
+
- ⚖️ **Umsatz und Ergebnis nicht in einen Topf, wenn du Abteilungen vergleichst.**
|
|
102
|
+
`umsatz_monat_eur` gibt es nur, wo Umsatz entsteht — Support oder Buchhaltung sparen Kosten und
|
|
103
|
+
erzeugen keinen Umsatz. Deren `0` ist die Natur der Arbeit, kein Versagen. Wer die Gesamtsumme
|
|
104
|
+
vergleicht, erklärt umsatznahe Abteilungen automatisch zu den besseren. Stell **Ergebnis und
|
|
105
|
+
Zeitersparnis** nebeneinander und nenne den Umsatz getrennt.
|
|
106
|
+
|
|
107
|
+
### Fragen, die sich lohnen
|
|
108
|
+
- „Welche drei Projekte bringen den meisten messbaren Ertrag — und welche Abteilung hat am
|
|
109
|
+
längsten nichts Neues geliefert?"
|
|
110
|
+
- „Vergleiche Vertrieb und Support: Projekte, Zeitersparnis, Ergebnis."
|
|
111
|
+
- „Was würdest du als Geschäftsführung als Nächstes automatisieren, gemessen an dem, was bisher
|
|
112
|
+
funktioniert hat — und was davon lässt sich auf andere Abteilungen übertragen?"
|
|
113
|
+
|
|
114
|
+
## Rückgabewerte
|
|
115
|
+
`0` erledigt · `1` **Wiederholen hilft nicht — LIES DIE MELDUNG** · `2` Anmeldung fehlt ·
|
|
116
|
+
`3` vorübergehende Störung, einmal wiederholen · `4` angemeldet, aber kein Pro-Zugang —
|
|
117
|
+
**nicht** wiederholen
|
|
118
|
+
|
|
119
|
+
🔴 **Die `1` hat mehrere Gründe, und sie verlangen Verschiedenes:** „wähl eine Firma", „leg
|
|
120
|
+
zuerst ein Erfolgsprofil an", „die Eingabe passt nicht", „das Paket ist unvollständig". **Gib
|
|
121
|
+
niemals einen Standard-Rat auf die Zahl allein** — die Meldung nennt jedes Mal, was zu tun ist.
|
|
122
|
+
|
|
123
|
+
⚠️ Hier stand kurzzeitig „dann ist `npm install -g kimal3` der Weg". Das hätte bei „du gehörst
|
|
124
|
+
zu zwei Firmen" eine Neuinstallation empfohlen — für einen völlig normalen Fall. *Ein
|
|
125
|
+
Rückgabewert sagt, OB man es noch einmal versuchen soll; WAS zu tun ist, steht im Text.*
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Übersicht — alle kimal3-Befehle und was du damit tun kannst
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<!-- kimal3:erzeugt — diese Datei wird von `kimal3 skill install` gepflegt und bei
|
|
6
|
+
jedem Update ueberschrieben. Eigene Aenderungen gehen dabei verloren; wer sie
|
|
7
|
+
behalten will, kopiert die Datei unter einem anderen Namen. -->
|
|
8
|
+
# kimal3 — Übersicht
|
|
9
|
+
|
|
10
|
+
Zeig dem Menschen, was dieses Werkzeug kann. **Nichts abrufen, nichts eintragen** — dieser
|
|
11
|
+
Befehl erklärt nur.
|
|
12
|
+
|
|
13
|
+
## 1. Die Befehlsliste holen, nicht auswendig aufsagen
|
|
14
|
+
|
|
15
|
+
Führe `kimal3 --version` aus, dann `kimal3 --help`. Die Liste kommt aus dem Werkzeug selbst —
|
|
16
|
+
so kann sie nicht veralten.
|
|
17
|
+
|
|
18
|
+
Antwortet die Shell mit „nicht gefunden", ist das einer von zwei Fällen; welcher, steht in
|
|
19
|
+
`~/.claude/skills/kimal3/SKILL.md` ganz oben. Nenn beide, rate nicht.
|
|
20
|
+
|
|
21
|
+
## 2. So aufbereiten, dass klar wird, WER tippt
|
|
22
|
+
|
|
23
|
+
Stell die Liste in zwei Gruppen dar:
|
|
24
|
+
|
|
25
|
+
**🧑 Was du selbst tippst** — alles, was einen Menschen braucht:
|
|
26
|
+
- `kimal3 login` bestätigst du im Browser. Das kann ich nicht für dich tun.
|
|
27
|
+
- `kimal3 skill install` einmal nach der Installation und nach jedem Update.
|
|
28
|
+
|
|
29
|
+
**🤖 Was du mir sagst** — hier tippe ich den Befehl:
|
|
30
|
+
|
|
31
|
+
| Slash-Befehl | Wofür |
|
|
32
|
+
|---|---|
|
|
33
|
+
| `/k3projekt <was du gebaut hast>` | Ein fertiges Projekt ins Erfolgsprofil eintragen |
|
|
34
|
+
| `/k3liste` | Deine eingetragenen Projekte zeigen |
|
|
35
|
+
| `/k3firma <deine Frage>` | Firmendaten holen und deine Frage dazu beantworten |
|
|
36
|
+
|
|
37
|
+
Sag dazu: Die Slash-Befehle sind der **sichere** Weg — du musst dir keinen Satz merken. Ohne
|
|
38
|
+
sie geht es auch: „das Projekt ist fertig" genügt, dann greife ich über den Skill.
|
|
39
|
+
|
|
40
|
+
## 3. Zum Schluss der Stand
|
|
41
|
+
|
|
42
|
+
Nenn aus der `--version`-Ausgabe die Version und mit welcher App das Werkzeug spricht, und ob
|
|
43
|
+
ein Konto angemeldet ist. Ist keins angemeldet, ist der nächste Schritt `kimal3 login` —
|
|
44
|
+
**vom Menschen getippt**.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Firmendaten holen und deine Frage dazu beantworten
|
|
3
|
+
argument-hint: <deine Frage zur Firma>
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- kimal3:erzeugt — diese Datei wird von `kimal3 skill install` gepflegt und bei
|
|
7
|
+
jedem Update ueberschrieben. Eigene Aenderungen gehen dabei verloren; wer sie
|
|
8
|
+
behalten will, kopiert die Datei unter einem anderen Namen. -->
|
|
9
|
+
# Firma auswerten
|
|
10
|
+
|
|
11
|
+
## 1. Zuerst die Regeln lesen — nicht aus dem Kopf auswerten
|
|
12
|
+
|
|
13
|
+
Lies **`~/.claude/skills/kimal3/SKILL.md`, Abschnitt „Firma auswerten"**. Dort stehen die
|
|
14
|
+
Fallen, die man den Zahlen nicht ansieht: wofür `mitglieder_aktiv` gilt und wofür nicht, warum
|
|
15
|
+
„pro Kopf" je Abteilung keine Aussage ist, wie Ehemalige und noch nicht gestartete Projekte
|
|
16
|
+
zählen, und warum Umsatz und Ergebnis nicht in denselben Vergleich gehören.
|
|
17
|
+
|
|
18
|
+
🔑 **Die Regeln stehen dort und nur dort.** Diese Datei wiederholt sie bewusst nicht — sonst
|
|
19
|
+
gäbe es zwei Wahrheiten, die auseinanderlaufen.
|
|
20
|
+
|
|
21
|
+
## 2. Die Daten holen
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
kimal3 firma daten
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
🔴 **Gehört der Mensch zu mehreren Firmen, bricht der Befehl ab — und dann WÄHLST DU NICHT.**
|
|
28
|
+
Leg ihm die Liste vor und frag, welche er meint. **Immer**, ohne Ausnahme: Der Abbruch ist die
|
|
29
|
+
Mehrdeutigkeit, du beurteilst sie nicht neu. Auch nicht, wenn eine Firma offensichtlich leer
|
|
30
|
+
oder verschrieben ist — „offensichtlich" ist deine Einschätzung, nicht seine Entscheidung.
|
|
31
|
+
|
|
32
|
+
⚠️ Hier stand bis zum 2026-08-18 „Nimm einen davon — rate nie … und frag, wenn die Liste
|
|
33
|
+
mehrdeutig ist." Der Satz lud genau den Fehler ein: Ich habe die Liste für *eindeutig* gehalten
|
|
34
|
+
und deshalb nicht gefragt. **In einer echten Firma zeigt das einem Menschen die
|
|
35
|
+
personenbezogenen Daten der falschen Belegschaft.**
|
|
36
|
+
|
|
37
|
+
Rückgabewerte deutest du nach `SKILL.md`, Abschnitt „Rückgabewerte". Vor allem: `4` heißt
|
|
38
|
+
**nicht wiederholen**, und „diese Version der App kennt den Befehl nicht" ist **kein** Fehler
|
|
39
|
+
des Menschen.
|
|
40
|
+
|
|
41
|
+
## 3. Die Frage beantworten
|
|
42
|
+
|
|
43
|
+
Die Frage des Menschen lautet:
|
|
44
|
+
|
|
45
|
+
$ARGUMENTS
|
|
46
|
+
|
|
47
|
+
Ist dort nichts angegeben, frag **eine** Frage zurück und schlag die drei Fragen aus
|
|
48
|
+
`SKILL.md` („Fragen, die sich lohnen") als Auswahl vor — nicht einfach drauflos auswerten.
|
|
49
|
+
|
|
50
|
+
Antworte in **Fließtext für einen Menschen**, nicht als JSON-Abschrift. Nenn Zahlen mit dem,
|
|
51
|
+
was sie bedeuten, und sag ausdrücklich dazu, was du selbst gerechnet hast und was mitgeliefert
|
|
52
|
+
war.
|
|
53
|
+
|
|
54
|
+
⚠️ **Es sind personenbezogene Daten von Kolleginnen und Kollegen.** Nur auf ausdrücklichen
|
|
55
|
+
Wunsch abrufen. Will jemand das für seine echte Firma nutzen, nenn die Voraussetzung aus
|
|
56
|
+
`SKILL.md` (kommerzielles Claude-Konto mit Auftragsverarbeitungsvertrag; Mitbestimmung, sobald
|
|
57
|
+
Leistungen von Beschäftigten ausgewertet werden).
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Deine eingetragenen Projekte zeigen
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<!-- kimal3:erzeugt — diese Datei wird von `kimal3 skill install` gepflegt und bei
|
|
6
|
+
jedem Update ueberschrieben. Eigene Aenderungen gehen dabei verloren; wer sie
|
|
7
|
+
behalten will, kopiert die Datei unter einem anderen Namen. -->
|
|
8
|
+
# Projekte zeigen
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
kimal3 projekt liste
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Gib die Liste **lesbar** wieder, nicht als rohe Ausgabe: Titel, seit wann live, und die
|
|
15
|
+
Zahlen, die dranstehen. Was fehlt, benenne als fehlend — erfinde nichts dazu.
|
|
16
|
+
|
|
17
|
+
Drei Zustände kommen vor, und sie bedeuten Verschiedenes: **live seit …** läuft heute,
|
|
18
|
+
**geplant ab …** liegt noch in der Zukunft, **noch nicht live** hat gar kein Datum. Wirf
|
|
19
|
+
sie nicht zusammen — „geplant" ist keine Aussage über heute.
|
|
20
|
+
|
|
21
|
+
Ist die Liste leer, ist das kein Fehler: Dann steht noch nichts im Erfolgsprofil, und der
|
|
22
|
+
nächste Schritt ist `/k3projekt <was du gebaut hast>`.
|
|
23
|
+
|
|
24
|
+
Klappt der Abruf nicht, deute den Rückgabewert nach **`~/.claude/skills/kimal3/SKILL.md`,
|
|
25
|
+
Abschnitt „Rückgabewerte"** — vor allem: `4` **nicht** wiederholen und **nicht** `login`
|
|
26
|
+
vorschlagen.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Ein fertiges Projekt ins Erfolgsprofil eintragen
|
|
3
|
+
argument-hint: <was du gebaut hast>
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- kimal3:erzeugt — diese Datei wird von `kimal3 skill install` gepflegt und bei
|
|
7
|
+
jedem Update ueberschrieben. Eigene Aenderungen gehen dabei verloren; wer sie
|
|
8
|
+
behalten will, kopiert die Datei unter einem anderen Namen. -->
|
|
9
|
+
# Projekt eintragen
|
|
10
|
+
|
|
11
|
+
## 1. Zuerst die Regeln lesen
|
|
12
|
+
|
|
13
|
+
Lies **`~/.claude/skills/kimal3/SKILL.md`** — vor allem „Erst nachsehen, dann schreiben",
|
|
14
|
+
„Eintragen" und „Zahlen nie erfinden". Diese Datei wiederholt die Regeln bewusst nicht.
|
|
15
|
+
|
|
16
|
+
## 2. Nachsehen, ob es schon drinsteht
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
kimal3 projekt liste
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Steht das Projekt schon da: **nicht** noch einmal eintragen. Sag dem Menschen, dass es bereits
|
|
23
|
+
drin ist, und frag, ob er es ändern will.
|
|
24
|
+
|
|
25
|
+
## 3. Eintragen
|
|
26
|
+
|
|
27
|
+
Das Projekt, um das es geht:
|
|
28
|
+
|
|
29
|
+
$ARGUMENTS
|
|
30
|
+
|
|
31
|
+
Bau daraus `kimal3 projekt neu --titel "…"` mit den passenden Optionen
|
|
32
|
+
(`kimal3 projekt neu --help` nennt alle).
|
|
33
|
+
|
|
34
|
+
🔴 **Zeitersparnis, Umsatz und Ergebnis nie schätzen.** Diese Zahlen stehen anschließend
|
|
35
|
+
**öffentlich** auf einer Seite mit dem Namen des Menschen. Wurde eine Zahl nicht genannt:
|
|
36
|
+
**frag danach** oder lass das Feld weg. Eine plausible Zahl ist hier schlimmer als keine.
|
|
37
|
+
|
|
38
|
+
Zeig dem Menschen **vor** dem Ausführen, was du eintragen wirst, und lass ihn bestätigen —
|
|
39
|
+
das Ergebnis ist öffentlich und nicht mit einem Tastendruck zurückgeholt.
|
|
40
|
+
|
|
41
|
+
## 4. Danach
|
|
42
|
+
|
|
43
|
+
Nenn den Rückgabewert-Fall nach `SKILL.md`, falls es nicht geklappt hat. Hat es geklappt,
|
|
44
|
+
zeig kurz, was jetzt im Profil steht.
|