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 +136 -134
- package/dist/befehle/wache.js +19 -8
- package/dist/einstellungen-mischen.js +29 -2
- package/dist/kimal3.js +24 -1
- package/dist/wache-rechnung.js +45 -0
- package/package.json +27 -27
- package/skill/SKILL.md +428 -381
- package/skill/commands/k3feierabend.md +43 -0
- package/skill/commands/k3kurs.md +52 -0
- package/skill/commands/k3liste.md +26 -26
- package/skill/commands/k3start.md +46 -0
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
|
|
122
|
-
`kimal3 wache
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
package/dist/befehle/wache.js
CHANGED
|
@@ -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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
console.log(
|
|
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 =
|
|
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(
|
|
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
|
}
|
package/dist/wache-rechnung.js
CHANGED
|
@@ -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.
|
|
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
|
+
}
|