hmgr 0.0.4 → 0.0.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.
Files changed (41) hide show
  1. package/README.md +10 -0
  2. package/dist/adapter/checkout-pfad.js +10 -2
  3. package/dist/adapter/claude-code.js +251 -23
  4. package/dist/adapter/composer.js +4 -3
  5. package/dist/adapter/datei-text.js +18 -0
  6. package/dist/adapter/dateisystem.js +146 -8
  7. package/dist/adapter/git.js +129 -17
  8. package/dist/adapter/hermes.js +235 -10
  9. package/dist/adapter/marketplace-json.js +2 -1
  10. package/dist/adapter/mcp-katalog.js +124 -0
  11. package/dist/adapter/quelle-text.js +10 -1
  12. package/dist/adapter/skill-md.js +96 -19
  13. package/dist/adapter/terminal.js +1 -1
  14. package/dist/adapter/umgebung.js +43 -0
  15. package/dist/adapter/vergleich.js +20 -0
  16. package/dist/adapter/zustand-json.js +6 -1
  17. package/dist/cli/hilfe.js +227 -26
  18. package/dist/cli/main.js +362 -20
  19. package/dist/gui/beobachter.js +108 -0
  20. package/dist/gui/icons.js +114 -0
  21. package/dist/gui/login-pfad.js +120 -0
  22. package/dist/gui/main.js +823 -0
  23. package/dist/gui/mcp-ansicht.js +57 -0
  24. package/dist/gui/oeffnen.js +33 -0
  25. package/dist/gui/preload.cjs +70 -0
  26. package/dist/gui/renderer/fonts/Inter-LICENSE.txt +92 -0
  27. package/dist/gui/renderer/fonts/InterVariable.woff2 +0 -0
  28. package/dist/gui/renderer/fonts/JetBrainsMono-Medium.woff2 +0 -0
  29. package/dist/gui/renderer/fonts/JetBrainsMono-OFL.txt +93 -0
  30. package/dist/gui/renderer/fonts/JetBrainsMono-Regular.woff2 +0 -0
  31. package/dist/gui/renderer/index.html +581 -0
  32. package/dist/gui/renderer/renderer.js +3227 -0
  33. package/dist/gui/renderer/styles.css +701 -0
  34. package/dist/kern/anwendungsfaelle.js +859 -65
  35. package/dist/kern/modell.js +297 -0
  36. package/dist/kern/quelle-ort.js +14 -1
  37. package/dist/ports/harness.js +16 -0
  38. package/dist/ports/mcp-katalog.js +1 -0
  39. package/dist/ports/umgebung.js +1 -0
  40. package/dist/ports/zustand.js +1 -1
  41. package/package.json +47 -2
package/dist/cli/hilfe.js CHANGED
@@ -9,23 +9,35 @@ geklontes Vorhaben holt seinen Stand mit hmgr sync.
9
9
 
10
10
  hmgr <kommando> [schalter]
11
11
 
12
- source add <url|pfad> Quelle hinzufügen (URL wird geklont, Pfad bleibt Arbeitskopie)
13
- source list Quellen zeigen
14
- dir add <pfad> Arbeitsverzeichnis merken und an seinen Zeiger binden
15
- dir forget <pfad> Arbeitsverzeichnis und Bindung vergessen, Links bleiben
16
- dir list Arbeitsverzeichnisse mit ihrer Bindung zeigen
17
- link <skill> Skill in ein Ziel verlinken
18
- unlink <skill> Link entfernen
19
- adopt [name] Fremde Links im Ziel durch eigene hmgr-Links ersetzen
20
- plugin add <name> Plugin in ein Ziel legen (installieren oder Skills verlinken)
21
- plugin remove <name> Plugin aus einem Ziel entfernen
22
- plugin list Plugins der Marketplaces aller Quellen
23
- sync [pfad] Ziel auf den Stand seines Zeigers bringen
24
- update Alle Checkouts aktualisieren
25
- status Ist-Zustand der Ziele
12
+ source add <url|pfad> Quelle hinzufügen (URL wird geklont, Pfad bleibt Arbeitskopie)
13
+ source rename <url|pfad> <name> Anzeigename der Quelle ändern
14
+ source remove <url|pfad> Quelle vergessen, Checkouts und Links bleiben liegen
15
+ source list Quellen zeigen
16
+ dir add <pfad> Arbeitsverzeichnis merken und an seinen Zeiger binden
17
+ dir forget <pfad> Arbeitsverzeichnis und Bindung vergessen, Links bleiben
18
+ dir list Arbeitsverzeichnisse mit ihrer Bindung zeigen
19
+ link <skill> Skill in ein Ziel verlinken
20
+ unlink <skill> Link entfernen
21
+ adopt [name] Fremde Links im Ziel durch eigene hmgr-Links ersetzen
22
+ plugin add <name> Plugin in ein Ziel legen (installieren oder Skills verlinken)
23
+ plugin remove <name> Plugin aus einem Ziel entfernen
24
+ plugin list Plugins der Marketplaces aller Quellen
25
+ mcp add <name> MCP-Server aus dem Katalog in ein Ziel einhängen
26
+ mcp remove <name> MCP-Server aus einem Ziel aushängen
27
+ mcp migrate <name> MCP-Server aus der geteilten .mcp.json in den privaten Scope übernehmen
28
+ mcp list Katalog-Einträge zeigen, mit wo sie eingehängt sind
29
+ sync [pfad] Ziel auf den Stand seines Zeigers bringen
30
+ update Alle Checkouts aktualisieren
31
+ status Ist-Zustand der Ziele
32
+ harness list Harness-Typen mit Stand aktiv/inaktiv und vorhanden
33
+ harness enable <name> Harness-Typ aktivieren, hmgr richtet ihn künftig ein
34
+ harness disable <name> Harness-Typ deaktivieren, mit Angebot zum Säubern
35
+ harness skills-dir <name> Verwalteten Skill-Ordner zeigen, festlegen oder entfernen
26
36
 
27
37
  hmgr help <kommando> zeigt Schalter, Beispiele und Zusammenhänge.`;
28
- const SOURCE = `hmgr source add <url|pfad>
38
+ const SOURCE = `hmgr source add <url|pfad> [--name <name>]
39
+ hmgr source rename <url|pfad> <name>
40
+ hmgr source remove <url|pfad>
29
41
  hmgr source list
30
42
 
31
43
  Eine Quelle ist ein Git-Repo mit Skills. source add prüft, ob sie erreichbar ist, liest ihre Skills
@@ -35,21 +47,45 @@ dort schon liegt, und wird von hmgr nicht verändert.
35
47
 
36
48
  Welche Quelle gemeint ist, hängt an Host, Besitzer und Repo, nicht an der Schreibweise der URL. Ein
37
49
  Repo in SSH- und in HTTPS-Form ist dieselbe Quelle, mit und ohne .git-Suffix ebenso. Gefetcht wird
38
- unter der Schreibweise, die beim ersten source add stand.
50
+ unter der Schreibweise, die beim ersten source add stand. source remove trifft dieselbe Quelle auch
51
+ in anderer Schreibweise (E36).
52
+
53
+ Jede Quelle trägt einen Anzeigenamen (E59): ohne --name schlägt hmgr den Repo-Namen vor (letztes
54
+ Pfadsegment, bei einer lokalen Quelle der Ordnername) und speichert ihn. Namen sind eindeutig, trägt
55
+ eine andere geführte Quelle schon denselben, bricht source add ab. source rename ändert den Namen
56
+ später; die Identität der Quelle bleibt dabei ihre URL bzw. ihr Pfad, nicht der Name. Bei einer schon
57
+ bekannten Quelle (source add trifft sie erneut) bleibt ihr Name unverändert.
58
+
59
+ source remove vergisst die Quelle nur aus dem Zustand (E54), wie dir forget das
60
+ Arbeitsverzeichnis (E26): Checkouts und Links bleiben liegen, bestehende Links gelten danach als
61
+ „Link ohne bekannte Quelle" und tauchen so in hmgr status auf, hmgr update prüft sie nicht mehr. Ein
62
+ erneutes source add derselben Quelle macht sie wieder zu normalen Links.
63
+
64
+ Danach bietet hmgr als eigene Rückfrage an, die Skills dieser Quelle komplett vom Rechner zu löschen
65
+ (E58): alle ihre Links in allen Zielen und alle ihre Checkouts, alles oder nichts. Über die
66
+ Harness-CLI installierte Plugins deinstalliert hmgr dabei nicht, sie werden nur genannt, ebenso
67
+ Zeiger-Einträge (E57). Ohne Links und ohne Checkouts kommt die Rückfrage gar nicht erst. Ablehnen
68
+ lässt alles liegen wie bisher.
39
69
 
40
- Schalter: keine.
70
+ Schalter:
71
+ --name <name> nur bei add: Anzeigename statt des abgeleiteten Vorschlags
41
72
 
42
73
  Beispiele:
43
74
  hmgr source add https://github.com/tim/skills.git
44
- hmgr source add ~/.skills/tim-skills
75
+ hmgr source add ~/.skills/tim-skills --name tim-skills
76
+ hmgr source rename https://github.com/tim/skills.git meine-skills
77
+ hmgr source remove https://github.com/tim/skills.git
45
78
  hmgr source list
46
79
 
47
80
  Häufige Fälle:
48
81
  „Skill … liegt in keiner Quelle": die Quelle fehlt, erst source add, dann link.
49
82
  Neue Commits einer bekannten Quelle holt hmgr update, nicht source add.
50
83
  „Quelle ist schon bekannt": dasselbe Repo steht schon im Zustand, hier in anderer Schreibweise.
84
+ „Quelle … ist nicht bekannt": source remove und source rename kennen nur geführte Quellen,
85
+ hmgr source list zeigt sie.
86
+ „Name … ist schon vergeben": einen anderen Namen wählen, mit --name bzw. source rename.
51
87
 
52
- Siehe auch: hmgr help link, hmgr help plugin, hmgr help update`;
88
+ Siehe auch: hmgr help link, hmgr help plugin, hmgr help update, hmgr help status`;
53
89
  const DIR = `hmgr dir add <pfad> [--composer <pfad>]
54
90
  hmgr dir forget <pfad>
55
91
  hmgr dir list
@@ -57,7 +93,8 @@ hmgr dir list
57
93
  Ein Arbeitsverzeichnis ist ein Verzeichnis, in dem ein Harness gestartet wird. dir add merkt es und
58
94
  bindet es an seinen Zeiger, also an die composer.json, in deren extra-Abschnitt Quellen, Skills und
59
95
  Plugins des Vorhabens stehen. Ohne Zeiger bleibt das Verzeichnis gemerkt und jeder Link dort lokal
60
- (E26). dir forget löst Bindung und Eintrag, die gelegten Links bleiben liegen.
96
+ (E26). dir forget löst Bindung und Eintrag, die gelegten Links bleiben liegen. Gebunden wird nur für
97
+ Harnesses, die hmgr verwaltet: standardmäßig nur claude-code (E38).
61
98
 
62
99
  Schalter:
63
100
  --composer <pfad> nur bei add: composer.json wählen, wenn unter dem Verzeichnis mehrere in
@@ -74,13 +111,16 @@ Häufige Fälle:
74
111
  link --ort dir:<pfad> merkt das Verzeichnis von selbst. dir add braucht es vorher nur, wenn die
75
112
  composer.json mehrdeutig ist.
76
113
 
77
- Siehe auch: hmgr help link, hmgr help sync`;
114
+ Siehe auch: hmgr help link, hmgr help sync, hmgr help harness`;
78
115
  const LINK = `hmgr link <skill> [schalter]
79
116
 
80
117
  Legt im Ziel einen Symlink auf den Skill an, der aus einer bekannten Quelle stammt, und trägt ihn
81
118
  in den Zeiger des Ziels ein, damit hmgr sync ihn anderswo reproduzieren kann. Einen Zeiger gibt es
82
119
  nur für ein Arbeitsverzeichnis mit composer.json, an Home und Profil bleibt jeder Link lokal.
83
120
 
121
+ Das Schreiben in einen Zeiger ist gesperrt, bis das Composer-Thema entschieden ist (E57): an einem
122
+ Arbeitsverzeichnis mit Zeiger bricht link ohne --local ab, der Link wird nicht gelegt.
123
+
84
124
  Schalter:
85
125
  --harness <name> claude-code, hermes oder agents, Standard claude-code
86
126
  --ort <ort> home, dir:<pfad> oder profil:<name>, Standard home. profil kennt nur hermes
@@ -108,6 +148,9 @@ const UNLINK = `hmgr unlink <skill> [schalter]
108
148
  Entfernt den Link aus dem Ziel und, wenn das Ziel an einen Zeiger gebunden ist, den Skill aus dem
109
149
  Zeiger. Der Checkout unter ~/.hmgr bleibt liegen, Links anderer Ziele bleiben unberührt.
110
150
 
151
+ Das Schreiben in einen Zeiger ist gesperrt, bis das Composer-Thema entschieden ist (E57): an einem
152
+ Arbeitsverzeichnis mit Zeiger bricht unlink ohne --local ab, der Link bleibt liegen.
153
+
111
154
  Schalter:
112
155
  --harness <name> claude-code, hermes oder agents, Standard claude-code
113
156
  --ort <ort> home, dir:<pfad> oder profil:<name>, Standard home. profil kennt nur hermes
@@ -130,6 +173,10 @@ ein Link stammt, nimmt deren remote.origin.url als Quelle, legt einen Checkout a
130
173
  und verlinkt den Skill daraus. Ohne Namen laufen alle fremden Einträge des Ziels durch, mit Namen
131
174
  nur dieser eine. Was sich nicht auflösen lässt, bleibt liegen und wird mit Grund gemeldet.
132
175
 
176
+ Das Schreiben in einen Zeiger ist gesperrt, bis das Composer-Thema entschieden ist (E57): an einem
177
+ Arbeitsverzeichnis mit Zeiger bricht adopt ohne --local ab, bevor etwas übernommen wird. Der
178
+ Probelauf bleibt frei, er schreibt ohnehin nichts.
179
+
133
180
  Schalter:
134
181
  --harness <name> claude-code, hermes oder agents, Standard claude-code
135
182
  --ort <ort> home, dir:<pfad> oder profil:<name>, Standard home. profil kennt nur hermes
@@ -159,6 +206,10 @@ Plugin von dessen CLI installieren, sonst verlinkt es die flache Skill-Liste des
159
206
  seinen Abhängigkeiten. In den Zeiger kommt das Plugin, nicht seine Einzelskills. plugin list zeigt
160
207
  die Marketplaces aller bekannten Quellen mit ihren Plugins.
161
208
 
209
+ Das Schreiben in einen Zeiger ist gesperrt, bis das Composer-Thema entschieden ist (E57): an einem
210
+ Arbeitsverzeichnis mit Zeiger brechen add und remove ohne --local ab, nichts wird installiert,
211
+ verlinkt oder entfernt.
212
+
162
213
  Schalter (add und remove):
163
214
  --harness <name> claude-code, hermes oder agents, Standard claude-code
164
215
  --ort <ort> home, dir:<pfad> oder profil:<name>, Standard home. profil kennt nur hermes
@@ -179,13 +230,107 @@ Häufige Fälle:
179
230
  kann nur die Quelle beheben.
180
231
 
181
232
  Siehe auch: hmgr help source, hmgr help sync`;
233
+ const MCP = `hmgr mcp add <name> [schalter]
234
+ hmgr mcp remove <name> [schalter]
235
+ hmgr mcp migrate <name> [schalter]
236
+ hmgr mcp list
237
+
238
+ Ein MCP-Server ist ein Eintrag im persönlichen Katalog ~/.hmgr/mcp.yaml, nicht in einer Quelle: kein
239
+ Download, keine Installation, kein Update. hmgr liest den Katalog nur, er wird von Hand oder von
240
+ einem LLM gepflegt, das den MCP ohnehin gerade einrichtet. mcp add hängt einen Katalog-Eintrag in
241
+ ein Ziel ein (Projekt oder global), mcp remove hängt ihn wieder aus, mcp list zeigt den Katalog mit
242
+ je Eintrag, wo er eingehängt ist, dazu Einträge, die in Harness-Konfigurationen liegen, aber nicht
243
+ im Katalog stehen (nur genannt, hmgr fasst sie nicht an). mcp list sieht dabei in den Homes und
244
+ Profilen der Harnesses nach und in den Arbeitsverzeichnissen, die hmgr kennt (hmgr dir add); ein
245
+ MCP in einem Verzeichnis, das hmgr nicht kennt, taucht dort nicht auf.
246
+
247
+ Format von ~/.hmgr/mcp.yaml: ein Objekt, Schlüssel ist der MCP-Name. Je Eintrag:
248
+
249
+ beschreibung Pflicht, kurzer Text
250
+ homepage optional, URL
251
+ notizen optional, mehrzeilig
252
+ konfig Pflicht: entweder command (Pflicht), optional args und env,
253
+ oder url (Pflicht), optional headers
254
+
255
+ Andere Schlüssel im konfig-Block sind ein Fehler, mit Eintrag und Feld in der Meldung. Secrets
256
+ stehen als \${VAR}- oder \${env:VAR}-Verweise im Block, nie im Klartext; aufgelöst werden sie vom
257
+ Harness gegen dessen Umgebung, hmgr prüft beim Einhängen nur, ob die Variablen gesetzt sind, und
258
+ warnt sonst. Fehlt die Datei, ist der Katalog leer, kein Fehler; kaputtes YAML ist ein Fehler mit
259
+ dem Dateipfad.
260
+
261
+ Beispiel:
262
+
263
+ teamwork:
264
+ beschreibung: Teamwork.com Projektmanagement
265
+ homepage: https://teamwork.com
266
+ notizen: |
267
+ Erfordert TEAMWORK_API_KEY, siehe Teamwork-Profil.
268
+ konfig:
269
+ command: npx
270
+ args: ["-y", "@teamwork/mcp-server"]
271
+ env:
272
+ TEAMWORK_API_KEY: \${TEAMWORK_API_KEY}
273
+
274
+ context7:
275
+ beschreibung: Context7 Doku-Suche
276
+ konfig:
277
+ url: https://mcp.context7.com/mcp
278
+ headers:
279
+ Authorization: Bearer \${env:CONTEXT7_TOKEN}
280
+
281
+ Die Fähigkeit hängt am Harness-Adapter, nicht am Namen (E16): claude-code kennt Projekt (Scope
282
+ local, nie die geteilte .mcp.json der Projektwurzel, das bleibt Team-Sache wie beim Zeiger, E57) und
283
+ global (Scope user). Hermes kennt nur global, mcp_servers in seiner config.yaml (Home oder Profil
284
+ mit --ort profil:<name>); ein Projekt-Ziel ist bei Hermes ein Fehler, es kennt keine Projektebene für
285
+ MCPs. agents kennt MCP-Server gar nicht.
286
+
287
+ mcp migrate ist der einzige Weg, auf dem hmgr die geteilte .mcp.json anfasst (E64): der Eintrag
288
+ wandert 1:1 aus der Datei in deinen privaten Scope am selben Ort und wird dort gelöscht. Auch ein
289
+ Eintrag, der nicht im Katalog steht, lässt sich so übernehmen — der Konfigblock kommt aus der Datei,
290
+ nicht aus dem Katalog. Ist die Datei mit dem Team geteilt, verlieren die anderen den Server, sobald
291
+ die Änderung committet ist. Nur claude-code hat eine solche Datei und nur an einem
292
+ Arbeitsverzeichnis. Gearbeitet wird in zwei Schritten, erst eintragen, dann entfernen: bricht der
293
+ zweite ab, steht der Eintrag doppelt statt gar nicht mehr, und die Meldung sagt, was zu tun bleibt.
294
+
295
+ Nach dem Einhängen/Aushängen nennt hmgr den Weg zur Wirkung: Claude Code übernimmt die Änderung erst
296
+ mit der nächsten Sitzung, Hermes lädt seine config.yaml selbst nach, dafür gibt es keinen Hinweis.
297
+
298
+ Fehlende \${VAR}-Verweise beim Einhängen sind kein Abbruch, nur eine Warnung (F39): hmgr kann nicht
299
+ wissen, was die Shell beim Start des Harness setzt. Geprüft wird gegen die eigene Prozess-Umgebung
300
+ und, bei einem Hermes-Ziel, zusätzlich gegen <hermes-home>/.env.
301
+
302
+ Schalter (add, remove und migrate):
303
+ --harness <name> claude-code oder hermes, Standard claude-code
304
+ --ort <ort> home, dir:<pfad> oder profil:<name>, Standard home
305
+
306
+ Beispiele:
307
+ hmgr mcp list
308
+ hmgr mcp add teamwork --ort dir:.
309
+ hmgr mcp add context7 --harness hermes --ort profil:researcher
310
+ hmgr mcp remove teamwork --ort dir:.
311
+ hmgr mcp migrate kollegen-tool --ort dir:.
312
+
313
+ Häufige Fälle:
314
+ „steht nicht im Katalog": hmgr mcp list zeigt die bekannten Namen, ~/.hmgr/mcp.yaml pflegt sie.
315
+ „kennt keine MCP-Server": nur claude-code und hermes haben diese Fähigkeit, agents nicht.
316
+ „kennt für MCP-Server den Ort … nicht – Hermes kennt keine Projektebene für MCPs": bei Hermes
317
+ --ort home oder --ort profil:<name> nutzen, kein dir:<pfad>.
318
+ „liegt schon ein MCP-Server …, der nicht von hmgr stammt oder vom Katalogblock abweicht": von Hand
319
+ angleichen oder hmgr mcp remove, dann erneut versuchen.
320
+ „steht in der geteilten …/.mcp.json": mcp remove fasst sie nicht an, hmgr mcp migrate <name> holt
321
+ den Eintrag in den privaten Scope und löscht ihn aus der Datei.
322
+ „gibt es keine geteilte Konfigurationsdatei": mcp migrate geht nur mit --harness claude-code und
323
+ --ort dir:<pfad>.
324
+
325
+ Siehe auch: hmgr help harness, hmgr help status`;
182
326
  const SYNC = `hmgr sync [pfad]
183
327
 
184
328
  Bringt ein Arbeitsverzeichnis auf den Stand seines Zeigers: fehlende Quellen übernehmen, fehlende
185
329
  Links legen, Links auf einen anderen Ref umlegen, Plugins herstellen. Ohne Pfad gilt das aktuelle
186
330
  Verzeichnis. Das ist der Befehl nach einem frischen Clone eines Vorhabens und nach jeder Änderung
187
331
  am Zeiger. Eigene Links, die im Zeiger fehlen, werden als abweichend gemeldet und nicht entfernt,
188
- fremde Einträge bleiben unberührt.
332
+ fremde Einträge bleiben unberührt. Eingerichtet wird nur für Harnesses, die hmgr verwaltet:
333
+ standardmäßig nur claude-code (E38).
189
334
 
190
335
  Schalter: keine.
191
336
 
@@ -200,7 +345,7 @@ Häufige Fälle:
200
345
  hmgr unlink <skill> --ort dir:<pfad> --local entfernen.
201
346
  „Kein Harness auf diesem Rechner": weder ~/.claude noch ~/.hermes noch ~/.agents ist angelegt.
202
347
 
203
- Siehe auch: hmgr help dir, hmgr help link, hmgr help update`;
348
+ Siehe auch: hmgr help dir, hmgr help link, hmgr help update, hmgr help harness`;
204
349
  const UPDATE = `hmgr update
205
350
 
206
351
  Holt für jeden Checkout unter ~/.hmgr den neuesten Stand seines Refs und zieht bei Harnesses mit
@@ -232,9 +377,11 @@ Siehe auch: hmgr help sync, hmgr help status`;
232
377
  const STATUS = `hmgr status
233
378
 
234
379
  Liest den Ist-Zustand vom Dateisystem: je Ziel eines vorhandenen Harness die Einträge mit Quelle
235
- und Ref, davor die Versionseinschränkung, falls der Zeiger eine nennt. Fremde Einträge und Links
236
- ohne bekannte Quelle sind eigens gekennzeichnet, dazu kommen die Plugins des Ziels. Am Ende stehen
237
- die Harnesses, die auf diesem Rechner nicht liegen.
380
+ und Ref, davor die Versionseinschränkung, falls der Zeiger eine nennt. Dahinter steht der
381
+ abgeleitete Grund des Links: das Plugin, zu dem er gehört, oder „über Zeiger", von Hand gelegte
382
+ Links bleiben ohne Zusatz. Fremde Einträge und Links ohne bekannte Quelle sind eigens
383
+ gekennzeichnet, dazu kommen die Plugins des Ziels. Am Ende stehen die Harnesses, die auf diesem
384
+ Rechner nicht liegen.
238
385
 
239
386
  Schalter: keine.
240
387
 
@@ -249,6 +396,58 @@ Häufige Fälle:
249
396
  überspringt seine Ziele.
250
397
 
251
398
  Siehe auch: hmgr help adopt, hmgr help sync`;
399
+ const HARNESS = `hmgr harness list
400
+ hmgr harness enable <name>
401
+ hmgr harness disable <name>
402
+ hmgr harness skills-dir <name> [--profil <name>]
403
+ hmgr harness skills-dir <name> add <pfad> [--profil <name>]
404
+ hmgr harness skills-dir <name> remove [--profil <name>]
405
+
406
+ Welche Harness-Typen hmgr verwaltet, ist eine Einstellung, kein gescannter Zustand: nur für aktive
407
+ Harnesses richten dir add und sync Ziele ein, standardmäßig nur claude-code (E38). harness list zeigt
408
+ alle bekannten Harness-Typen mit ihrem Stand: aktiv oder inaktiv, dazu vorhanden oder nicht vorhanden
409
+ (auf diesem Rechner installiert oder nicht). enable und disable sind idempotent, ein zweites Mal
410
+ ändert nichts und ist kein Fehler.
411
+
412
+ disable säubert nicht von selbst: liegen noch eigene Links oder eine harness-eigene Konfiguration wie
413
+ Hermes' external_dirs-Eintrag, fragt hmgr, ob sie entfernt werden sollen. Ohne Terminal, etwa in einem
414
+ Script, gilt Nein und die Konfiguration bleibt liegen. Ein Link mit ausdrücklich genanntem --harness
415
+ (hmgr link, hmgr plugin add) legt weiterhin an jedem vorhandenen Harness an, aktiv oder nicht, das ist
416
+ Sache des Nutzers.
417
+
418
+ skills-dir zeigt, legt fest oder entfernt den Ordner, aus dem Hermes externe Skills liest
419
+ (skills.external_dirs in seiner config.yaml, E13, E56). hmgr verwaltet je Ziel (Home oder ein Profil
420
+ mit --profil) genau einen Eintrag, den ersten unterhalb des Hermes-Home, ohne Hermes' eigenen Ordner
421
+ „skills"; alle anderen Einträge der config.yaml rührt hmgr nicht an. add erlaubt nur einen Pfad
422
+ unterhalb des Hermes-Home und legt ihn an, falls er fehlt; ein zweiter add ohne vorheriges remove ist
423
+ ein Fehler. remove löscht nur den Eintrag aus der config.yaml, der Ordner bleibt liegen; danach fragt
424
+ hmgr (mit Inhaltsangabe), ob der Ordner samt Inhalt gelöscht werden soll. Ohne Terminal, etwa in einem
425
+ Script, gilt Nein und der Ordner bleibt liegen, ohne weitere Meldung. Ohne verwalteten Eintrag richtet
426
+ das nächste hmgr link wieder den Standard-Ordner external-skills ein (E13). Hermes übernimmt eine
427
+ Änderung an external_dirs ohne Neustart.
428
+
429
+ Schalter (nur skills-dir):
430
+ --profil <name> Ziel ist das genannte Profil statt Home
431
+
432
+ Beispiele:
433
+ hmgr harness list
434
+ hmgr harness enable hermes
435
+ hmgr harness disable hermes
436
+ hmgr harness skills-dir hermes
437
+ hmgr harness skills-dir hermes add ~/.hermes/external-skills
438
+ hmgr harness skills-dir hermes remove --profil researcher
439
+
440
+ Häufige Fälle:
441
+ „ist kein bekannter Harness-Typ": hmgr harness list zeigt die bekannten Namen.
442
+ Konfiguration bleibt nach disable liegen, wenn die Rückfrage mit Nein oder ohne Terminal beantwortet
443
+ wird. Ein erneutes hmgr harness disable <name> bietet das Säubern wieder an.
444
+ „kennt keinen verwalteten Skill-Ordner": skills-dir kennt heute nur hermes.
445
+ „ist schon ein Skill-Ordner verwaltet": erst hmgr harness skills-dir <name> remove, dann add.
446
+ „ist kein Skill-Ordner verwaltet": remove kennt nur einen vorhandenen Eintrag, add legt ihn fest.
447
+ „liegt nicht unterhalb des Hermes-Home" oder „ist Hermes' eigener Skill-Ordner": einen anderen
448
+ Pfad unter ~/.hermes (bzw. dem Profil-Ordner) nennen, nicht „skills" selbst.
449
+
450
+ Siehe auch: hmgr help dir, hmgr help sync, hmgr help status`;
252
451
  /** Ebene 2, je Kommandofamilie ein Text. Unterkommandos teilen sich die Hilfe ihrer Familie. */
253
452
  const THEMEN = new Map([
254
453
  ['source', SOURCE],
@@ -257,9 +456,11 @@ const THEMEN = new Map([
257
456
  ['unlink', UNLINK],
258
457
  ['adopt', ADOPT],
259
458
  ['plugin', PLUGIN],
459
+ ['mcp', MCP],
260
460
  ['sync', SYNC],
261
461
  ['update', UPDATE],
262
462
  ['status', STATUS],
463
+ ['harness', HARNESS],
263
464
  ['help', HILFE],
264
465
  ]);
265
466
  /** Hilfetext zu einem Kommando, undefined für ein unbekanntes Thema. */