kimal3 0.2.3 → 0.2.5

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 CHANGED
@@ -1,134 +1,136 @@
1
- # kimal3
2
-
3
- **Trag deine KI-Projekte dort ein, wo sie entstehen: im Terminal.**
4
-
5
- Wer mit Claude Code arbeitet, baut echte Dinge — und dokumentiert sie hinterher nicht,
6
- weil das ein zweiter Arbeitsschritt in einem anderen Fenster wäre. `kimal3` schließt
7
- diese Lücke: Am Ende einer Sitzung trägt Claude das fertige Projekt selbst in dein
8
- KImal3-Erfolgsprofil ein. Du gibst es dort nur noch frei.
9
-
10
- > **Voraussetzung: ein KImal3-Konto mit Pro.**
11
- > Ohne Pro meldet sich dieses Werkzeug ab, ohne etwas zu tun.
12
- > Was Pro enthält und wie du es bekommst: **https://app.kimal3.de/pro**
13
-
14
- ## Loslegen
15
-
16
- Einmal pro Rechner:
17
-
18
- ```bash
19
- npm install -g kimal3 # das Werkzeug installieren (setzt Node.js voraus)
20
- kimal3 login # diesen Rechner mit deinem Konto verbinden
21
- kimal3 skill install # Claude beibringen, das Werkzeug zu benutzen
22
- ```
23
-
24
- > **In Claude Code?** Dann lass es einrichten, statt es zu tippen — der Satz zum Kopieren steht
25
- > auf **https://app.kimal3.de/pro**. Nur `kimal3 login` tippst du selbst (dort mit `!`
26
- > davor), weil die Bestätigung im Browser einen Menschen braucht.
27
-
28
- `login` zeigt dir eine Adresse und einen achtstelligen Code. Die Adresse rufst du selbst
29
- auf und bestätigst den Code dort in deinem eingeloggten Konto — so wie bei `gh auth login`.
30
- **Es wird kein Passwort ins Terminal getippt.**
31
-
32
- ## Befehle
33
-
34
- ```
35
- kimal3 Zeigt, ob dieser Rechner angemeldet ist
36
- kimal3 login Diesen Rechner mit deinem Konto verbinden
37
- kimal3 skill install Claude beibringen, dieses Werkzeug zu benutzen — und dir die /k3-Befehle geben
38
- kimal3 arbeitsplatz neu Den ganzen KI-Arbeitsplatz anlegen — Firmenebene und Werkbank
39
- kimal3 werkbank neu Nur eine eigene Werkbank in einer bestehenden Firma anlegen
40
- kimal3 kontext runter Den Firmenkontext holen — CLAUDE.md und die fünf Dateien in kontext/
41
- kimal3 kontext fragen Zeigen, welche Fragen über deine Firma noch unbeantwortet sind
42
- kimal3 kontext hoch Deine lokalen Änderungen an den fünf Kontext-Dateien hochschicken
43
- kimal3 projekt neu … Ein Projekt ins Erfolgsprofil eintragen
44
- kimal3 projekt liste Deine eingetragenen Projekte anzeigen
45
- kimal3 firma daten Die Daten deiner Firma holen, damit Claude sie auswerten kann
46
- kimal3 wache Läuft von selbst, einmal am Tag: prüft Zugang, Nachricht, Version, Skill
47
- kimal3 wache aus Die tägliche Prüfung abschalten — sie sagt dann nichts mehr
48
- kimal3 wache an Sie wieder einschalten
49
- kimal3 logout Verbindung wieder aufheben
50
- ```
51
-
52
- Mehr zu einem Befehl: `kimal3 projekt neu --help`
53
-
54
- ## Was eingetragen wird
55
-
56
- Nur, was du eingibst — Titel, Beschreibung, optional ein Link. **Dein Code wird nicht
57
- gelesen, nicht hochgeladen und nicht analysiert.** Das Werkzeug schreibt ausschließlich
58
- über die KImal3-App und hat keinen eigenen Datenbankzugang.
59
-
60
- Eingetragene Projekte sind zunächst **nicht öffentlich**. Sie erscheinen in deinem
61
- Erfolgsprofil, und du entscheidest dort, was sichtbar wird.
62
-
63
- ## Rückgabewerte
64
-
65
- Für Skripte und für Claude selbst:
66
-
67
- | Wert | Bedeutung | Hilft |
68
- |---|---|---|
69
- | `0` | hat geklappt | — |
70
- | `1` | Eingabe unvollständig, nichts gefunden — oder deine Claude-Einstellungen sind nicht lesbar | die Meldung lesen, sie nennt den Fall |
71
- | `2` | nicht angemeldet | `kimal3 login` |
72
- | `3` | gerade nicht erreichbar | später noch einmal |
73
- | `4` | kein Pro-Konto | erneutes Versuchen hilft **nicht** |
74
-
75
- Der Unterschied zwischen `3` und `4` ist Absicht: Bei `3` lohnt ein zweiter Versuch,
76
- bei `4` nie.
77
-
78
- ## Update-Hinweise
79
-
80
- Steht eine neuere Fassung bereit, schreibt `kimal3` nach dem Befehl eine eingerückte
81
- Zeile — höchstens **einmal am Tag**:
82
-
83
- ```
84
- → kimal3 0.2.0 ist da. npm i -g kimal3@latest && kimal3 skill install
85
- ```
86
-
87
- Sie geht auf **stderr**, nicht auf stdout: `kimal3 firma daten > firma.json` bleibt
88
- damit sauberes JSON. Sie **ändert den Rückgabewert nicht** — eine `0` bleibt eine `0`.
89
- Und `kimal3` **installiert nichts von selbst**; der Befehl steht in der Zeile, ausführen
90
- tust du ihn.
91
-
92
- Dasselbe gilt für die Skill-Dateien: Sind die in `~/.claude/skills/kimal3/` älter als
93
- das installierte Werkzeug, sagt `kimal3` es — dafür braucht es kein Netz.
94
-
95
- ## Die tägliche Prüfung — und wie du sie abstellst
96
-
97
- `kimal3 skill install` trägt eine Zeile in deine Claude-Einstellungen ein
98
- (`~/.claude/settings.json`). Sie sorgt dafür, dass beim Start von Claude einmal am Tag
99
- `kimal3 wache` läuft. Die Prüfung sieht nach, ob dein Zugang noch gilt, ob eine neuere
100
- Fassung bereitsteht, ob deine `/k3`-Befehle veraltet sind und ob eine Nachricht von uns
101
- anliegt.
102
-
103
- **Sie meldet sich nur, wenn wirklich etwas ansteht.** Ist alles in Ordnung, sagt sie nichts.
104
-
105
- Willst du sie nicht:
106
-
107
- ```
108
- kimal3 wache aus # ab jetzt still
109
- kimal3 wache an # doch wieder
110
- ```
111
-
112
- Nach `kimal3 wache aus` wird **nichts mehr an unseren Server geschickt** — die Prüfung
113
- steigt aus, bevor sie irgendetwas fragt. Gemessen: mit Prüfung rund 0,9 Sekunden, ohne
114
- rund 0,19 Sekunden, und in den 0,19 Sekunden verlässt kein Byte deinen Rechner.
115
-
116
- Die Zeile in den Einstellungen bleibt dabei stehen, damit `kimal3 wache an` sofort wirkt
117
- und wir deine Einstellungsdatei nicht noch einmal anfassen müssen. Es startet also weiter
118
- ein kleines Programm von uns, das nach rund 0,19 Sekunden wieder aufhört.
119
-
120
- **Soll auch das nicht mehr passieren**, nimm die Zeile selbst heraus: In
121
- `~/.claude/settings.json` steht unter `hooks` → `SessionStart` ein Eintrag mit dem Befehl
122
- `kimal3 wache`. Lösch diesen einen Eintrag — den Rest der Datei lass, wie er ist.
123
-
124
- ## Voraussetzungen
125
-
126
- Node.js 20 oder neuer. Sonst nichts — das Werkzeug bringt **keine fremden Bibliotheken**
127
- mit.
128
-
129
- ## Lizenz
130
-
131
- Proprietär. Die Nutzung ist Inhabern eines gültigen KImal3-Pro-Kontos gestattet;
132
- Weitergabe, Veränderung und Weiterverwendung des Codes sind nicht erlaubt.
133
-
134
- © KImal3 · https://kimal3.de
1
+ # kimal3
2
+
3
+ **Trag deine KI-Projekte dort ein, wo sie entstehen: im Terminal.**
4
+
5
+ Wer mit Claude Code arbeitet, baut echte Dinge — und dokumentiert sie hinterher nicht,
6
+ weil das ein zweiter Arbeitsschritt in einem anderen Fenster wäre. `kimal3` schließt
7
+ diese Lücke: Am Ende einer Sitzung trägt Claude das fertige Projekt selbst in dein
8
+ KImal3-Erfolgsprofil ein. Du gibst es dort nur noch frei.
9
+
10
+ > **Voraussetzung: ein KImal3-Konto mit Pro.**
11
+ > Ohne Pro meldet sich dieses Werkzeug ab, ohne etwas zu tun.
12
+ > Was Pro enthält und wie du es bekommst: **https://app.kimal3.de/pro**
13
+
14
+ ## Loslegen
15
+
16
+ Einmal pro Rechner:
17
+
18
+ ```bash
19
+ npm install -g kimal3 # das Werkzeug installieren (setzt Node.js voraus)
20
+ kimal3 login # diesen Rechner mit deinem Konto verbinden
21
+ kimal3 skill install # Claude beibringen, das Werkzeug zu benutzen
22
+ ```
23
+
24
+ > **In Claude Code?** Dann lass es einrichten, statt es zu tippen — der Satz zum Kopieren steht
25
+ > auf **https://app.kimal3.de/pro**. Nur `kimal3 login` tippst du selbst (dort mit `!`
26
+ > davor), weil die Bestätigung im Browser einen Menschen braucht.
27
+
28
+ `login` zeigt dir eine Adresse und einen achtstelligen Code. Die Adresse rufst du selbst
29
+ auf und bestätigst den Code dort in deinem eingeloggten Konto — so wie bei `gh auth login`.
30
+ **Es wird kein Passwort ins Terminal getippt.**
31
+
32
+ ## Befehle
33
+
34
+ ```
35
+ kimal3 Zeigt, ob dieser Rechner angemeldet ist
36
+ kimal3 login Diesen Rechner mit deinem Konto verbinden
37
+ kimal3 skill install Claude beibringen, dieses Werkzeug zu benutzen — und dir die /k3-Befehle geben
38
+ kimal3 arbeitsplatz neu Den ganzen KI-Arbeitsplatz anlegen — Firmenebene und Werkbank
39
+ kimal3 werkbank neu Nur eine eigene Werkbank in einer bestehenden Firma anlegen
40
+ kimal3 kontext runter Den Firmenkontext holen — CLAUDE.md und die fünf Dateien in kontext/
41
+ kimal3 kontext fragen Zeigen, welche Fragen über deine Firma noch unbeantwortet sind
42
+ kimal3 kontext hoch Deine lokalen Änderungen an den fünf Kontext-Dateien hochschicken
43
+ kimal3 projekt neu … Ein Projekt ins Erfolgsprofil eintragen
44
+ kimal3 projekt liste Deine eingetragenen Projekte anzeigen
45
+ kimal3 firma daten Die Daten deiner Firma holen, damit Claude sie auswerten kann
46
+ kimal3 wache Läuft von selbst, einmal am Tag: prüft Zugang, Nachricht, Version, Skill
47
+ kimal3 wache aus Die tägliche Prüfung abschalten — sie sagt dann nichts mehr
48
+ kimal3 wache an Sie wieder einschalten
49
+ kimal3 logout Verbindung wieder aufheben
50
+ ```
51
+
52
+ Mehr zu einem Befehl: `kimal3 projekt neu --help`
53
+
54
+ ## Was eingetragen wird
55
+
56
+ Nur, was du eingibst — Titel, Beschreibung, optional ein Link. **Dein Code wird nicht
57
+ gelesen, nicht hochgeladen und nicht analysiert.** Das Werkzeug schreibt ausschließlich
58
+ über die KImal3-App und hat keinen eigenen Datenbankzugang.
59
+
60
+ Eingetragene Projekte sind zunächst **nicht öffentlich**. Sie erscheinen in deinem
61
+ Erfolgsprofil, und du entscheidest dort, was sichtbar wird.
62
+
63
+ ## Rückgabewerte
64
+
65
+ Für Skripte und für Claude selbst:
66
+
67
+ | Wert | Bedeutung | Hilft |
68
+ |---|---|---|
69
+ | `0` | hat geklappt | — |
70
+ | `1` | Eingabe unvollständig, nichts gefunden — oder deine Claude-Einstellungen sind nicht lesbar | die Meldung lesen, sie nennt den Fall |
71
+ | `2` | nicht angemeldet | `kimal3 login` |
72
+ | `3` | gerade nicht erreichbar | später noch einmal |
73
+ | `4` | kein Pro-Konto | erneutes Versuchen hilft **nicht** |
74
+
75
+ Der Unterschied zwischen `3` und `4` ist Absicht: Bei `3` lohnt ein zweiter Versuch,
76
+ bei `4` nie.
77
+
78
+ ## Update-Hinweise
79
+
80
+ Steht eine neuere Fassung bereit, schreibt `kimal3` nach dem Befehl eine eingerückte
81
+ Zeile — höchstens **einmal am Tag**:
82
+
83
+ ```
84
+ → kimal3 0.2.0 ist da. npm i -g kimal3@latest && kimal3 skill install
85
+ ```
86
+
87
+ Sie geht auf **stderr**, nicht auf stdout: `kimal3 firma daten > firma.json` bleibt
88
+ damit sauberes JSON. Sie **ändert den Rückgabewert nicht** — eine `0` bleibt eine `0`.
89
+ Und `kimal3` **installiert nichts von selbst**; der Befehl steht in der Zeile, ausführen
90
+ tust du ihn.
91
+
92
+ Dasselbe gilt für die Skill-Dateien: Sind die in `~/.claude/skills/kimal3/` älter als
93
+ das installierte Werkzeug, sagt `kimal3` es — dafür braucht es kein Netz.
94
+
95
+ ## Die tägliche Prüfung — und wie du sie abstellst
96
+
97
+ `kimal3 skill install` trägt eine Zeile in deine Claude-Einstellungen ein
98
+ (`~/.claude/settings.json`). Sie sorgt dafür, dass beim Start von Claude einmal am Tag
99
+ `kimal3 wache` läuft. Die Prüfung sieht nach, ob dein Zugang noch gilt, ob eine neuere
100
+ Fassung bereitsteht, ob deine `/k3`-Befehle veraltet sind und ob eine Nachricht von uns
101
+ anliegt.
102
+
103
+ **Sie meldet sich nur, wenn wirklich etwas ansteht.** Ist alles in Ordnung, sagt sie nichts.
104
+
105
+ Willst du sie nicht:
106
+
107
+ ```
108
+ kimal3 wache aus # ab jetzt still
109
+ kimal3 wache an # doch wieder
110
+ ```
111
+
112
+ Nach `kimal3 wache aus` wird **nichts mehr an unseren Server geschickt** — die Prüfung
113
+ steigt aus, bevor sie irgendetwas fragt. Gemessen: mit Prüfung rund 0,9 Sekunden, ohne
114
+ rund 0,19 Sekunden, und in den 0,19 Sekunden verlässt kein Byte deinen Rechner.
115
+
116
+ Die Zeile in den Einstellungen bleibt dabei stehen, damit `kimal3 wache an` sofort wirkt
117
+ und wir deine Einstellungsdatei nicht noch einmal anfassen müssen. Es startet also weiter
118
+ ein kleines Programm von uns, das nach rund 0,19 Sekunden wieder aufhört.
119
+
120
+ **Soll auch das nicht mehr passieren**, nimm die Zeile selbst heraus: In
121
+ `~/.claude/settings.json` steht unter `hooks` → `SessionStart` ein Eintrag, dessen Befehl
122
+ mit `kimal3 wache` beginnt (heute: `kimal3 wache --hook`, in älteren Installationen ohne
123
+ den Zusatz). ⚠️ **Der Zusatz `--hook` gehört in die Einstellungsdatei, nicht ins Terminal** —
124
+ getippt wird immer nur `kimal3 wache`. Lösch diesen einen Eintrag — den Rest der Datei lass, wie er ist.
125
+
126
+ ## Voraussetzungen
127
+
128
+ Node.js 20 oder neuer. Sonst nichts — das Werkzeug bringt **keine fremden Bibliotheken**
129
+ mit.
130
+
131
+ ## Lizenz
132
+
133
+ Proprietär. Die Nutzung ist Inhabern eines gültigen KImal3-Pro-Kontos gestattet;
134
+ Weitergabe, Veränderung und Weiterverwendung des Codes sind nicht erlaubt.
135
+
136
+ © KImal3 · https://kimal3.de
@@ -5,7 +5,7 @@ import { leseGesehen, merkeGesehen } from "../gesehen.js";
5
5
  import { heuteAus, sollZeigen, skillZustand } from "../nachricht.js";
6
6
  import { eigeneVersion } from "../version.js";
7
7
  import { leseWacheDatei, merkeLauf, merkeSitzung, setzeWache, sitzungJetzt, sollHeuteLaufen, } from "../wache-schalter.js";
8
- import { wacheAntwortAusHttp, wacheZeilen } from "../wache-rechnung.js";
8
+ import { alsHookAusgabe, wacheAntwortAusHttp, wacheBlock, wacheZeilen } from "../wache-rechnung.js";
9
9
  import { skillDatei } from "./skill-install.js";
10
10
  /**
11
11
  * 🔴 BEWUSSTE VORGABE, KEINE MESSUNG (Aufgabe 0b ist vertagt). Der bestehende
@@ -119,8 +119,21 @@ async function frageServer(schluessel, heute) {
119
119
  * 2. keine Anmeldedatei -> still, KEIN NETZAUFRUF (US-5)
120
120
  * 3. heute schon gelaufen -> still, kein Netz
121
121
  * Erst danach wird ueberhaupt telefoniert.
122
+ *
123
+ * `alsHook` sagt, WOHIN die Meldung geht -- nicht, OB sie kommt. Beide Wege
124
+ * rechnen dieselben Zeilen aus; sie unterscheiden sich nur in der Verpackung.
125
+ * - `false`: ein Mensch hat `kimal3 wache` getippt und liest die Zeilen.
126
+ * - `true` : Claude Code hat sie beim Sitzungsstart gestartet. Dann geht die
127
+ * Meldung in der JSON-Huelle raus, die einen Absturz beim Beenden
128
+ * ueberlebt (Begruendung an `alsHookAusgabe`).
129
+ *
130
+ * 🔴 WARUM EIN ARGUMENT UND NICHT DIE UMGEBUNG: `CLAUDE_CODE_SESSION_ID` liegt
131
+ * auch dann an, wenn ein Mensch `! kimal3 wache` im Claude-Fenster tippt --
132
+ * gemessen am 2026-09-09. Wer daran erkennen wollte, ob er ein Startbefehl
133
+ * ist, bekaeme genau dort rohes JSON auf den Bildschirm statt seiner Meldung.
134
+ * *Das Erkennungsmerkmal muss die Aufrufstelle setzen, nicht der Ort raten.*
122
135
  */
123
- export async function wache() {
136
+ export async function wache(alsHook) {
124
137
  try {
125
138
  const heute = heuteAus(new Date());
126
139
  /*
@@ -155,12 +168,10 @@ export async function wache() {
155
168
  // 🔴 VOR der Ausgabe -- sonst spricht die Wache bei einem Fehler in der
156
169
  // Ausgabe morgen wieder und uebermorgen wieder.
157
170
  merkeLauf(heute);
158
- if (zeilen.length === 0)
159
- return 0; // 🔴 Stille heisst WIRKLICH nichts --
160
- // auch keine leere Kopfzeile.
161
- console.log("🔑 kimal3");
162
- for (const z of zeilen)
163
- console.log(`• ${z}`);
171
+ const block = wacheBlock(zeilen);
172
+ if (block === null)
173
+ return 0;
174
+ console.log(alsHook ? alsHookAusgabe(block) : block);
164
175
  // Erst NACH dem Drucken vermerken, dass die Nachricht heute schon lief --
165
176
  // dieselbe Reihenfolge wie beim Update-Kanal in kimal3.ts.
166
177
  if (vomServer.hinweis)
@@ -9,6 +9,11 @@
9
9
  * Arbeitsplatz des Menschen. Das Lesen und Schreiben wohnt in
10
10
  * `befehle/skill-install.ts`, samt Sicherungskopie und Zurueckkontrolle.
11
11
  */
12
+ /**
13
+ * Woran wir einen Eintrag als UNSEREN erkennen -- unabhaengig davon, welche
14
+ * Argumente wir spaeter einmal anhaengen. Siehe `istUnserer`.
15
+ */
16
+ export const WACHE_MARKE = "kimal3 wache";
12
17
  /**
13
18
  * Der Befehl, der in die Einstellungen eingetragen wird.
14
19
  *
@@ -17,8 +22,22 @@
17
22
  * wir nicht. Die Fehlerbehandlung gehoert ins Programm, nicht in die Zeile.
18
23
  * *Ein Befehl, der beim Erbauer laeuft, ist keine Aussage ueber den Rechner
19
24
  * des Kunden.*
25
+ * 📌 Gemessen am 2026-09-09, und die Regel ist damit teuer bestaetigt: Claude
26
+ * Code startet einen Startbefehl auf Windows durch die Git-Bash und, wenn die
27
+ * fehlt, durch die PowerShell. In der PowerShell 5.1 ist `||` ein
28
+ * Syntaxfehler -- eine Zeile mit `||` haette dort den Startbefehl ganz
29
+ * umgeworfen. `--hook` ist ein Wort und laeuft in jeder der vier Huellen.
30
+ *
31
+ * 🔑 WOFUER `--hook` DA IST: Claude Code wirft die AUSGABE eines Startbefehls
32
+ * weg, sobald er einen Rueckgabewert ungleich 0 meldet (gemessen 2026-09-09:
33
+ * 0 -> Meldung kommt an, 1 und 127 -> nichts kommt an). `kimal3` stuerzt auf
34
+ * Windows gelegentlich beim BEENDEN ab, nachdem die Meldung vollstaendig
35
+ * geschrieben ist -- die Wache haette also stumm dagestanden, obwohl sie ihre
36
+ * Arbeit getan hatte. Mit `--hook` schreibt sie ihre Meldung stattdessen in
37
+ * der JSON-Form, die Claude Code fuer Startbefehle vorsieht, und die wird
38
+ * AUCH BEI RUECKGABEWERT 127 gelesen (ebenfalls gemessen).
20
39
  */
21
- export const WACHE_BEFEHL = "kimal3 wache";
40
+ export const WACHE_BEFEHL = `${WACHE_MARKE} --hook`;
22
41
  /**
23
42
  * Wie lange Claude auf die Wache wartet, in Sekunden.
24
43
  *
@@ -40,11 +59,19 @@ function istObjekt(wert) {
40
59
  * Wachen auf, und die alte zeigte auf etwas, das es nicht mehr gibt. Weder
41
60
  * Compiler noch Waechter faenden das -- es sieht ja aus wie ein fremder
42
61
  * Eintrag, den man hoeflich in Ruhe laesst.
62
+ *
63
+ * 🔴 ERKANNT WIRD AN DER MARKE, NICHT AM VOLLEN BEFEHL. Genau dieser Fall ist
64
+ * am 2026-09-09 eingetreten: Der Eintrag hiess `kimal3 wache` und heisst jetzt
65
+ * `kimal3 wache --hook`. Ein Vergleich gegen den vollen Befehlstext haette den
66
+ * alten Eintrag fuer fremd gehalten und stehen lassen -- jeder Bestandskunde
67
+ * haette ab dem naechsten `skill install` ZWEI Wachen bei jedem Claude-Start
68
+ * gestartet. *Die Vorsichtsmassnahme, die dieser Kommentar beschreibt, haette
69
+ * beim ersten echten Anlass versagt, wenn sie am ganzen Text gehangen haette.*
43
70
  */
44
71
  function istUnserer(eintrag) {
45
72
  if (!istObjekt(eintrag))
46
73
  return false;
47
- return typeof eintrag.command === "string" && eintrag.command.includes(WACHE_BEFEHL);
74
+ return typeof eintrag.command === "string" && eintrag.command.includes(WACHE_MARKE);
48
75
  }
49
76
  export function mischeEinstellungen(alt, befehl) {
50
77
  /*
package/dist/kimal3.js CHANGED
@@ -335,11 +335,34 @@ async function haupt() {
335
335
  if (argv[0] === "kontext" && argv[1] === "fragen")
336
336
  return kontextFragen(argv.slice(2));
337
337
  if (wort === "wache")
338
- return wache();
338
+ return wache(false);
339
+ // 🔴 Der Startbefehl aus `~/.claude/settings.json`, den `skill install`
340
+ // eintraegt. Er verpackt die Meldung anders -- Begruendung an `wache()`.
341
+ // ⚠️ Ein Mensch tippt das nie; der Katalog nennt ihn deshalb auch nicht.
342
+ if (wort === "wache --hook")
343
+ return wache(true);
339
344
  if (wort === "wache aus")
340
345
  return wacheSchalten(false);
341
346
  if (wort === "wache an")
342
347
  return wacheSchalten(true);
348
+ /*
349
+ 🔴 NACHSICHT GEGENUEBER FLAGGEN, DIE ES HIER NOCH NICHT GIBT.
350
+ Der Eintrag in `~/.claude/settings.json` ueberlebt jede Neuinstallation --
351
+ auch eine, die eine AELTERE Fassung bringt. Steht dort eines Tages
352
+ `wache --irgendwas`, das diese Fassung nicht kennt, faellt der Aufruf ohne
353
+ diese Zeile in den Unbekannt-Zweig: die volle Hilfe bei JEDEM Claude-Start,
354
+ Rueckgabewert 1, und `merkeSitzung` wird nie erreicht -- woraufhin
355
+ `wacheAusgefallen` bei jedem weiteren Befehl einen Rat gibt, der nichts
356
+ behebt. Aus einem fehlenden Zusatz wird so ein lauter Dauerschaden.
357
+ 🔑 Warum die MENSCHEN-Form die richtige Rueckfallebene ist: Sie endet
358
+ normal mit 0, ihre Meldung kommt also an. Die JSON-Form waere fuer einen
359
+ Menschen, der aus Neugier eine Flagge tippt, nur Kauderwelsch.
360
+ ⚠️ Fuer bereits veroeffentlichte Fassungen ist das nicht mehr zu retten --
361
+ `0.2.3` kennt `--hook` nicht. Diese Zeile sorgt dafuer, dass die naechste
362
+ Flagge die Falle nicht erneut stellt. (Befund der Durchsicht, 2026-09-09.)
363
+ */
364
+ if (argv[0] === "wache" && argv.slice(1).every((a) => a.startsWith("--")))
365
+ return wache(false);
343
366
  console.error(`Den Befehl „${wort}" kenne ich nicht.\n${HILFE}`);
344
367
  return 1;
345
368
  }
@@ -88,6 +88,51 @@ export function wacheAntwortAusHttp(status, koerper) {
88
88
  return { zugangGilt: true, hinweis: null };
89
89
  return { zugangGilt: true, hinweis: nachrichtAusAntwort(koerper) };
90
90
  }
91
+ /**
92
+ * Die fertige Meldung -- oder `null`, wenn nichts zu sagen ist.
93
+ *
94
+ * 🔑 EINE QUELLE FUER BEIDE AUSGABEWEGE. Dieselben Zeilen gehen einmal ins
95
+ * Terminalfenster und einmal in die JSON-Huelle fuer den Startbefehl. Waeren
96
+ * es zwei Textstellen, wuerden sie auseinanderlaufen, und niemand saehe es:
97
+ * Den einen Weg liest ein Mensch, den anderen nur Claude.
98
+ *
99
+ * 🔴 `null` HEISST WIRKLICH NICHTS -- auch keine leere Kopfzeile. Ein
100
+ * Startbefehl, der jeden Morgen ein einsames „🔑 kimal3" in den Kontext
101
+ * schreibt, ist Laerm, und Laerm bringt Menschen dazu, die eine Meldung zu
102
+ * ueberlesen, auf die es ankommt.
103
+ */
104
+ export function wacheBlock(zeilen) {
105
+ if (zeilen.length === 0)
106
+ return null;
107
+ return ["🔑 kimal3", ...zeilen.map((z) => `• ${z}`)].join("\n");
108
+ }
109
+ /**
110
+ * Dieselbe Meldung in der Form, die einen Absturz beim Beenden ueberlebt.
111
+ *
112
+ * 🔴 WARUM DAS NOETIG IST (gemessen am 2026-09-09): Claude Code wirft die
113
+ * Ausgabe eines Startbefehls WEG, sobald dieser einen Rueckgabewert ungleich 0
114
+ * meldet -- gemessen mit 1 und mit 127, beide Male kam nichts an. `kimal3`
115
+ * stuerzt auf Windows gelegentlich beim Beenden ab (libuv), und zwar
116
+ * NACHDEM die Meldung vollstaendig geschrieben ist. Die Wache haette also
117
+ * geschwiegen, obwohl sie ihre Arbeit getan hatte -- und niemand haette es
118
+ * gemerkt.
119
+ *
120
+ * 🔑 DIESE FORM WIRD AUCH BEI 127 GELESEN (ebenfalls gemessen, inklusive
121
+ * Laerm auf stderr und mit Umlauten). Und der Rueckgabewert bleibt trotzdem
122
+ * sichtbar: Claude Code protokolliert den Lauf weiter mit
123
+ * `exit_code: 127, outcome: "error"`. *Wir retten die Meldung, ohne das
124
+ * Signal „die Wache ist wirklich kaputt" zu loeschen* -- ein `|| exit 0` in
125
+ * der Befehlszeile haette genau das getan.
126
+ *
127
+ * ⚠️ Die Feldnamen sind vorgegeben und muessen GENAU so heissen; steht
128
+ * `additionalContext` eine Ebene zu weit oben, wird es stillschweigend
129
+ * ignoriert.
130
+ */
131
+ export function alsHookAusgabe(block) {
132
+ return JSON.stringify({
133
+ hookSpecificOutput: { hookEventName: "SessionStart", additionalContext: block },
134
+ });
135
+ }
91
136
  /**
92
137
  * Die Zeile, die erscheint, wenn die Wache fuer diese Claude-Sitzung nicht
93
138
  * nachgesehen hat.
package/package.json CHANGED
@@ -1,27 +1,27 @@
1
- {
2
- "name": "kimal3",
3
- "version": "0.2.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://app.kimal3.de/pro",
26
- "license": "SEE LICENSE IN README.md"
27
- }
1
+ {
2
+ "name": "kimal3",
3
+ "version": "0.2.5",
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://app.kimal3.de/pro",
26
+ "license": "SEE LICENSE IN README.md"
27
+ }