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
@@ -0,0 +1,581 @@
1
+ <!doctype html>
2
+ <html lang="de">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>hmgr — The Harness Manager</title>
7
+ <!-- Nichts aus dem Netz: der Entwurf holt Inter und JetBrains Mono von Google, eine Desktop-App
8
+ lädt keine fremden Ressourcen. Beide Schriften liegen deshalb als woff2 unter renderer/fonts/
9
+ und werden in styles.css per @font-face eingebunden, 'self' deckt sie ab. -->
10
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; script-src 'self'; img-src 'self' data:">
11
+ <link rel="stylesheet" href="styles.css">
12
+ </head>
13
+ <body>
14
+
15
+ <div class="app">
16
+
17
+ <aside class="leiste">
18
+ <div class="marke">
19
+ <b>hmgr</b>
20
+ <span id="version"></span>
21
+ </div>
22
+
23
+ <nav class="nav" aria-label="Ansichten">
24
+ <button class="plakette" data-ansicht="ziele" aria-current="page">
25
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M1 5h14M1 11h14"/><path d="M4 3v4M9 3v4M6 9v4M12 9v4"/></svg>
26
+ Ziele <span class="zahl" id="navzahlziele"></span>
27
+ </button>
28
+ <!-- Stecker mit zwei Stiften: der MCP-Katalog haengt Server in Harnesses ein, mehr sagt das
29
+ Zeichen nicht (entwurf/gui.html, keine Marken-Logos wie bei den Harnessen). -->
30
+ <button class="plakette" data-ansicht="mcp">
31
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M1.4 8h3.2"/><path d="M4.6 3.9h4v8.2h-4z"/><path d="M8.6 6.2h5.8M8.6 9.8h5.8"/></svg>
32
+ MCP <span class="zahl" id="navzahlmcp"></span>
33
+ </button>
34
+ <button class="plakette" data-ansicht="plugins">
35
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M3 3h10v10H3z"/><path d="M6 1v2M10 1v2M6 13v2M10 13v2"/></svg>
36
+ Plugins <span class="zahl" id="navzahlplugins"></span>
37
+ </button>
38
+ <button class="plakette" data-ansicht="katalog">
39
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M2 3h12v10H2z"/><path d="M2 6h12M6 6v7"/></svg>
40
+ Skills <span class="zahl" id="navzahlskills"></span>
41
+ </button>
42
+ </nav>
43
+
44
+ <div class="stand">
45
+ <p id="standtext">Noch nicht aktualisiert</p>
46
+ <button class="standknopf" type="button" id="standknopf">Prüfen</button>
47
+ </div>
48
+
49
+ <!-- Harness-Schalter des Entwurfs (GRILL.md Entwurfskritik 4) docken hier an. Der Kern hält
50
+ die Aktiv-Liste seit E38, verdrahtet ist sie in der GUI noch nicht: es gilt, was im
51
+ Zustand steht, standardmäßig nur claude-code. -->
52
+ <button class="einstellungen" type="button" id="einstellungen" aria-haspopup="dialog">
53
+ <!-- Zahnrad mit sechs Zaehnen: acht werden bei 18px zum Klumpen (entwurf/gui.html). -->
54
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round" aria-hidden="true"><path d="M6.47 3.56 6.45 1.28h3.1l-.02 2.28 1.55.89 1.97-1.16 1.55 2.69-1.99 1.12v1.8l1.99 1.12-1.55 2.69-1.97-1.16-1.55.89.02 2.28h-3.1l.02-2.28-1.55-.89-1.97 1.16-1.55-2.69L3.39 8.9V7.1L1.4 5.98l1.55-2.69 1.97 1.16z"/><circle cx="8" cy="8" r="2.3"/></svg>
55
+ Einstellungen
56
+ </button>
57
+ </aside>
58
+
59
+ <div>
60
+ <header class="kopf">
61
+ <span class="mono" id="kopfzahlen"></span>
62
+ </header>
63
+
64
+ <div class="meldung" id="meldung" role="status" hidden>
65
+ <p id="meldungtext"></p>
66
+ <button type="button" id="meldungzu" aria-label="Meldung schliessen">Schliessen</button>
67
+ </div>
68
+
69
+ <main class="buehne">
70
+
71
+ <!-- ============ SKILLS ============ -->
72
+ <section id="ansicht-katalog" hidden>
73
+ <div class="ansichtskopf">
74
+ <h1>Skills</h1>
75
+ <p>Alle Skills aus deinen Quellen. Such dir einen aus und verlink ihn dorthin, wo du ihn brauchst.</p>
76
+ </div>
77
+
78
+ <div class="werkzeuge">
79
+ <div class="suche">
80
+ <svg viewBox="0 0 16 16" stroke-width="1.6" aria-hidden="true"><circle cx="7" cy="7" r="4.5"/><path d="M10.5 10.5 14.5 14.5"/></svg>
81
+ <input type="search" id="suchfeld" placeholder="Skill oder Pfad suchen" aria-label="Skills durchsuchen">
82
+ </div>
83
+ <div class="filter" role="group" aria-label="Nach Quelle filtern" id="quellenfilter"></div>
84
+ </div>
85
+
86
+ <p class="katalogzahl" id="katalogzahl"></p>
87
+ <ul class="zeilen" id="katalog"></ul>
88
+ </section>
89
+
90
+ <!-- ============ ZIELE ============ -->
91
+ <section id="ansicht-ziele">
92
+ <div class="ansichtskopf">
93
+ <h1>Ziele auf diesem Rechner</h1>
94
+ <p>Jedes Ziel ist ein Verzeichnis, aus dem ein Harness Skills liest. hmgr legt dort Links ab. Was du vorher von Hand installiert hast, bleibt als nicht von hmgr verwalteter Eintrag liegen, bis du es übernimmst.</p>
95
+ </div>
96
+
97
+ <div class="werkzeuge">
98
+ <div class="filter" role="group" aria-label="Ziele filtern">
99
+ <button class="chip" data-zielfilter="alle" aria-pressed="true">Alle</button>
100
+ <button class="chip" data-zielfilter="achtung" aria-pressed="false">Benötigt Aufmerksamkeit (0)</button>
101
+ </div>
102
+ </div>
103
+
104
+ <p class="katalogzahl" id="zielzahl"></p>
105
+ <div class="ziele" id="zielliste"></div>
106
+ <!-- Unter der letzten Verzeichnis-Karte, nicht oben bei den Agents: dort gehört er
107
+ thematisch hin (2026-09-05). Fester Fuß statt Teil der neu gebauten Liste, so bleibt
108
+ der Klick-Listener aus der Startphase gebunden. -->
109
+ <div class="zielfussleiste">
110
+ <button class="knopf leise mitsymbol" type="button" id="verzneu">
111
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M1.2 13.2V4.1h3.9l1.3 1.8h5.2v7.3z"/><path d="M13.2 1.9v4.6M10.9 4.2h4.6"/></svg>
112
+ Verzeichnis hinzufügen
113
+ </button>
114
+ </div>
115
+ </section>
116
+
117
+ <!-- ============ MCP ============ -->
118
+ <!-- E61, abgespeckt zum reinen Katalog (F46, Korrektur an E61): der Katalog wird hier nicht
119
+ bearbeitet, hmgr liest ~/.hmgr/mcp.yaml und schreibt sie nie, also gibt es in dieser
120
+ Ansicht kein Anlegen und kein Ändern eines Eintrags, nur Einhängen. Wo ein Server hängt
121
+ und das Aushängen zeigen seither nur noch die Ziel-Karten. -->
122
+ <section id="ansicht-mcp" hidden>
123
+ <div class="ansichtskopf">
124
+ <h1>MCP-Server</h1>
125
+ <!-- Der Pfad steht hier in POSIX-Schreibweise und wird beim Start in die Schreibweise
126
+ der Plattform gesetzt (E68, ladeUmgebung im Renderer). -->
127
+ <p>Dein Katalog aus <span class="mono" id="mcpkatalogpfad">~/.hmgr/mcp.yaml</span>. Häng einen Server dorthin ein, wo du ihn brauchst: in ein Arbeitsverzeichnis, damit er nur dort Kontext kostet, oder global. Den Katalog selbst pflegst du in der Datei, hmgr liest sie nur.</p>
128
+ </div>
129
+
130
+ <div class="mcpliste" id="mcpliste"></div>
131
+ </section>
132
+
133
+ <!-- ============ AKTUALISIEREN ============ -->
134
+ <section id="ansicht-update" hidden>
135
+ <div class="ansichtskopf">
136
+ <h1>Aktualisieren</h1>
137
+ <p>Holt jede Quelle auf den neuesten Stand ihres Refs, zieht die Plugins nach und erneuert alle Links. Checkouts mit lokalen Änderungen bleiben unangetastet, du siehst sie hinterher im Bericht.</p>
138
+ </div>
139
+
140
+ <div class="startfeld">
141
+ <p id="updatestand">Noch nicht in dieser Sitzung gelaufen.</p>
142
+ <button class="knopf signal gross" id="updatestart">Jetzt aktualisieren</button>
143
+ </div>
144
+
145
+ <div class="bericht" id="bericht" hidden></div>
146
+ </section>
147
+
148
+ <!-- ============ PLUGINS ============ -->
149
+ <section id="ansicht-plugins" hidden>
150
+ <div class="ansichtskopf">
151
+ <h1>Plugins</h1>
152
+ <p>Ein Marketplace ist eine Quelle mit einer <span class="mono">marketplace.json</span>. Die Plugins darin bündeln Skills und können voneinander abhängen. Harnesses ohne Plugin-Konzept bekommen von hmgr stattdessen die flache Skill-Liste verlinkt.</p>
153
+ </div>
154
+ <div id="pluginliste"></div>
155
+ </section>
156
+
157
+ </main>
158
+ </div>
159
+ </div>
160
+
161
+ <!-- ================= DIALOGE ================= -->
162
+
163
+ <!-- Rückfrage im Lauf (E28, E34): Ja/Nein, vom Main-Prozess über den Rückfrage-Port gestellt. -->
164
+ <dialog id="d-bestaetigen">
165
+ <form method="dialog">
166
+ <div class="dkopf">
167
+ <span class="etikett">Rückfrage im Lauf</span>
168
+ <h3 id="db-frage"></h3>
169
+ </div>
170
+ <div class="dfuss">
171
+ <button class="knopf leise" value="nein">Nein</button>
172
+ <button class="knopf signal" value="ja">Ja</button>
173
+ </div>
174
+ </form>
175
+ </dialog>
176
+
177
+ <!-- Rückfrage im Lauf, Auswahl (E26): nummerierte Liste, wie am Terminal. -->
178
+ <dialog id="d-auswahl">
179
+ <form method="dialog">
180
+ <div class="dkopf">
181
+ <span class="etikett">Rückfrage im Lauf</span>
182
+ <h3 id="da-frage"></h3>
183
+ </div>
184
+ <div class="dkoerper"><div class="wahl" id="da-optionen"></div></div>
185
+ <div class="dfuss">
186
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
187
+ <button class="knopf signal" value="weiter">Weiter</button>
188
+ </div>
189
+ </form>
190
+ </dialog>
191
+
192
+ <dialog id="d-ziel">
193
+ <form method="dialog">
194
+ <div class="dkopf">
195
+ <span class="etikett">Verlinken</span>
196
+ <h3>Wohin soll <span id="dz-skill">der Skill</span>?</h3>
197
+ <p>Kreuz jedes Ziel an, in dem der Skill auftauchen soll.</p>
198
+ </div>
199
+ <div class="dkoerper"><div class="wahl" id="dz-ziele"></div></div>
200
+ <div class="dfuss">
201
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
202
+ <button class="knopf signal" value="los" id="dz-los">Verlinken</button>
203
+ </div>
204
+ </form>
205
+ </dialog>
206
+
207
+ <dialog id="d-skills">
208
+ <form method="dialog">
209
+ <div class="dkopf">
210
+ <span class="etikett">Skills hinzufügen</span>
211
+ <h3>Welche Skills sollen in <span id="dsk-ziel">diesem Ziel</span> landen?</h3>
212
+ <p>Kreuz jeden Skill an, der hier verlinkt werden soll.</p>
213
+ </div>
214
+ <div class="dkoerper">
215
+ <div class="suche">
216
+ <svg viewBox="0 0 16 16" stroke-width="1.6" aria-hidden="true"><circle cx="7" cy="7" r="4.5"/><path d="M10.5 10.5 14.5 14.5"/></svg>
217
+ <input type="search" id="dsk-suche" placeholder="Skill suchen" aria-label="Skills durchsuchen">
218
+ </div>
219
+ <div class="wahl" id="dsk-liste"></div>
220
+ </div>
221
+ <div class="dfuss">
222
+ <span class="links mono" id="dsk-bilanz">0 ausgewählt</span>
223
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
224
+ <button class="knopf signal" value="los" id="dsk-los">Verlinken</button>
225
+ </div>
226
+ </form>
227
+ </dialog>
228
+
229
+ <dialog id="d-erfolg">
230
+ <form method="dialog">
231
+ <div class="dkopf">
232
+ <span class="etikett">Fertig</span>
233
+ <h3 id="de-titel">Verlinkt</h3>
234
+ <p id="de-text"></p>
235
+ <!-- Hinweise des Kerns zum Zeiger (E26, F32), nur wenn es welche gibt. -->
236
+ <p id="de-hinweis" hidden></p>
237
+ </div>
238
+ <div class="dkoerper"><ul class="erfolgliste" id="de-liste"></ul></div>
239
+ <div class="dfuss"><button class="knopf" value="ok">Schliessen</button></div>
240
+ </form>
241
+ </dialog>
242
+
243
+ <dialog id="d-uebernahme">
244
+ <form method="dialog">
245
+ <div class="dkopf">
246
+ <span class="etikett" id="du-etikett">Probelauf, nichts wird verändert</span>
247
+ <h3 id="du-titel">Nicht von hmgr verwalteten Eintrag übernehmen?</h3>
248
+ <p id="du-text">hmgr liest, aus welcher Quelle und welchem Ref der Eintrag stammt, checkt die Quelle selbst aus und ersetzt den Eintrag durch einen Link. Lässt sich das nicht auflösen, bleibt er liegen.</p>
249
+ </div>
250
+ <div class="dkoerper"><ul class="probeliste" id="du-liste"></ul></div>
251
+ <div class="dfuss">
252
+ <span class="links mono" id="du-bilanz"></span>
253
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
254
+ <button class="knopf signal" value="los" id="du-los">Übernehmen</button>
255
+ </div>
256
+ </form>
257
+ </dialog>
258
+
259
+ <dialog id="d-harness">
260
+ <form method="dialog">
261
+ <div class="dkopf">
262
+ <span class="etikett">Rückfrage</span>
263
+ <h3 id="dh-titel">Harness deaktivieren?</h3>
264
+ <p id="dh-text"></p>
265
+ </div>
266
+ <div class="dkoerper">
267
+ <span class="etikett feldtitel">Betroffen</span>
268
+ <ul class="pfadliste" id="dh-liste"></ul>
269
+ </div>
270
+ <div class="dfuss">
271
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
272
+ <button class="knopf leise" value="nur">Nur deaktivieren</button>
273
+ <button class="knopf signal" value="saeubern">Deaktivieren und säubern</button>
274
+ </div>
275
+ </form>
276
+ </dialog>
277
+
278
+ <dialog id="d-saeubern">
279
+ <form method="dialog">
280
+ <div class="dkopf">
281
+ <span class="etikett">Rückfrage</span>
282
+ <h3 id="ds-titel">Säubern?</h3>
283
+ <p id="ds-text"></p>
284
+ </div>
285
+ <div class="dkoerper">
286
+ <span class="etikett feldtitel">Betroffen</span>
287
+ <ul class="pfadliste" id="ds-liste"></ul>
288
+ </div>
289
+ <div class="dfuss">
290
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
291
+ <button class="knopf signal" value="los">Säubern</button>
292
+ </div>
293
+ </form>
294
+ </dialog>
295
+
296
+ <dialog id="d-entfernen">
297
+ <form method="dialog">
298
+ <div class="dkopf">
299
+ <span class="etikett">Rückfrage</span>
300
+ <h3 id="dx-titel">Link entfernen?</h3>
301
+ <p id="dx-text"></p>
302
+ </div>
303
+ <div class="dfuss">
304
+ <button class="knopf leise" value="nein">Nein, behalten</button>
305
+ <button class="knopf signal" value="ja">Ja, entfernen</button>
306
+ </div>
307
+ </form>
308
+ </dialog>
309
+
310
+ <dialog id="d-vergessen">
311
+ <form method="dialog">
312
+ <div class="dkopf">
313
+ <span class="etikett">Rückfrage</span>
314
+ <h3>Arbeitsverzeichnis entfernen?</h3>
315
+ <p id="dg-text"></p>
316
+ </div>
317
+ <div class="dfuss">
318
+ <button class="knopf leise" value="nein">Behalten</button>
319
+ <button class="knopf signal" value="ja">Entfernen</button>
320
+ </div>
321
+ </form>
322
+ </dialog>
323
+
324
+ <dialog id="d-loeschen">
325
+ <form method="dialog">
326
+ <div class="dkopf">
327
+ <span class="etikett">Rückfrage</span>
328
+ <h3 id="dl-titel">Eintrag löschen?</h3>
329
+ <p id="dl-text"></p>
330
+ </div>
331
+ <div class="dfuss">
332
+ <button class="knopf leise" value="nein">Nein, behalten</button>
333
+ <button class="knopf signal" value="ja">Löschen</button>
334
+ </div>
335
+ </form>
336
+ </dialog>
337
+
338
+ <dialog id="d-verzeichnis">
339
+ <form method="dialog">
340
+ <div class="dkopf">
341
+ <span class="etikett">Verzeichnis hinzufügen</span>
342
+ <h3>Welches Arbeitsverzeichnis?</h3>
343
+ <p>hmgr sucht dort nach einem Zeiger (composer.json) und legt für jeden Harness, den es verwaltet, ein Ziel an.</p>
344
+ </div>
345
+ <div class="dkoerper">
346
+ <div class="feld">
347
+ <label class="etikett" for="dv-pfad">Pfad</label>
348
+ <span class="pfadzeile">
349
+ <span class="pfadfeld">
350
+ <svg viewBox="0 0 16 16" stroke-width="1.5" aria-hidden="true"><path d="M1.5 12.9V3.4h4.3l1.4 1.9h7.3v7.6z"/></svg>
351
+ <input type="text" id="dv-pfad" spellcheck="false" autocomplete="off" autocapitalize="off">
352
+ </span>
353
+ <button class="knopf leise klein" type="button" id="dv-auswaehlen" aria-label="Ordner auswählen">Auswählen…</button>
354
+ </span>
355
+ </div>
356
+ </div>
357
+ <div class="dfuss">
358
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
359
+ <button class="knopf signal" value="los" id="dv-los">Hinzufügen</button>
360
+ </div>
361
+ </form>
362
+ </dialog>
363
+
364
+ <dialog id="d-quelle">
365
+ <form method="dialog">
366
+ <div class="dkopf">
367
+ <span class="etikett">Quelle hinzufügen</span>
368
+ <h3>Welche Quelle?</h3>
369
+ <p>Eine URL für ein Git-Repo oder ein Pfad zu einer lokalen Arbeitskopie. hmgr prüft, ob sie erreichbar ist, und liest ihre Skills und ihren Marketplace.</p>
370
+ </div>
371
+ <div class="dkoerper">
372
+ <div class="feld">
373
+ <label class="etikett" for="dq-text">URL oder Pfad</label>
374
+ <input type="text" id="dq-text" spellcheck="false" autocomplete="off" autocapitalize="off">
375
+ </div>
376
+ <div class="feld">
377
+ <label class="etikett" for="dq-name">Anzeigename</label>
378
+ <input type="text" id="dq-name" spellcheck="false" autocomplete="off" autocapitalize="off">
379
+ </div>
380
+ <p id="dq-fehler" class="dialogfehler" hidden></p>
381
+ </div>
382
+ <div class="dfuss">
383
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
384
+ <button class="knopf signal" value="los" id="dq-los">Hinzufügen</button>
385
+ </div>
386
+ </form>
387
+ </dialog>
388
+
389
+ <dialog id="d-quelle-umbenennen">
390
+ <form method="dialog">
391
+ <div class="dkopf">
392
+ <span class="etikett">Quelle umbenennen</span>
393
+ <h3>Neuer Anzeigename</h3>
394
+ <p id="dqu-text"></p>
395
+ </div>
396
+ <div class="dkoerper">
397
+ <div class="feld">
398
+ <label class="etikett" for="dqu-name">Anzeigename</label>
399
+ <input type="text" id="dqu-name" spellcheck="false" autocomplete="off" autocapitalize="off">
400
+ </div>
401
+ <p id="dqu-fehler" class="dialogfehler" hidden></p>
402
+ </div>
403
+ <div class="dfuss">
404
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
405
+ <button class="knopf signal" value="los" id="dqu-los">Umbenennen</button>
406
+ </div>
407
+ </form>
408
+ </dialog>
409
+
410
+ <dialog id="d-quelle-vergessen">
411
+ <form method="dialog">
412
+ <div class="dkopf">
413
+ <span class="etikett">Rückfrage</span>
414
+ <h3 id="dqv-titel">Quelle entfernen?</h3>
415
+ <p id="dqv-text"></p>
416
+ </div>
417
+ <div class="dfuss">
418
+ <button class="knopf leise" value="nein">Behalten</button>
419
+ <button class="knopf signal" value="ja">Entfernen</button>
420
+ </div>
421
+ </form>
422
+ </dialog>
423
+
424
+ <dialog id="d-quelle-aufraeumen">
425
+ <form method="dialog">
426
+ <div class="dkopf">
427
+ <span class="etikett">Rückfrage</span>
428
+ <h3>Skills komplett löschen?</h3>
429
+ <p id="dqa-text"></p>
430
+ </div>
431
+ <div class="dfuss">
432
+ <button class="knopf leise" value="behalten">Behalten</button>
433
+ <button class="knopf signal" value="loeschen">Löschen</button>
434
+ </div>
435
+ </form>
436
+ </dialog>
437
+
438
+ <dialog id="d-skillordner">
439
+ <form method="dialog">
440
+ <div class="dkopf">
441
+ <span class="etikett">Skill-Ordner festlegen</span>
442
+ <h3>Welcher Ordner?</h3>
443
+ <p>hmgr trägt den Ordner in Hermes' config.yaml ein (skills.external_dirs) und legt ihn an, falls er fehlt. Er muss unterhalb des Hermes-Home liegen, nicht Hermes' eigener Ordner „skills".</p>
444
+ </div>
445
+ <div class="dkoerper">
446
+ <div class="feld">
447
+ <label class="etikett" for="dso-pfad">Pfad</label>
448
+ <input type="text" id="dso-pfad" spellcheck="false" autocomplete="off" autocapitalize="off">
449
+ </div>
450
+ <p id="dso-fehler" class="dialogfehler" hidden></p>
451
+ </div>
452
+ <div class="dfuss">
453
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
454
+ <button class="knopf signal" value="los" id="dso-los">Festlegen</button>
455
+ </div>
456
+ </form>
457
+ </dialog>
458
+
459
+ <dialog id="d-skillordner-entfernen">
460
+ <form method="dialog">
461
+ <div class="dkopf">
462
+ <span class="etikett">Rückfrage</span>
463
+ <h3 id="dsoe-titel">Skill-Ordner-Eintrag entfernen?</h3>
464
+ <p id="dsoe-text"></p>
465
+ </div>
466
+ <div class="dfuss">
467
+ <button class="knopf leise" value="nein">Behalten</button>
468
+ <button class="knopf signal" value="ja">Entfernen</button>
469
+ </div>
470
+ </form>
471
+ </dialog>
472
+
473
+ <dialog id="d-skillordner-loeschen">
474
+ <form method="dialog">
475
+ <div class="dkopf">
476
+ <span class="etikett">Rückfrage</span>
477
+ <h3>Ordner löschen?</h3>
478
+ <p id="dsol-text"></p>
479
+ </div>
480
+ <div class="dfuss">
481
+ <button class="knopf leise" value="behalten">Behalten</button>
482
+ <button class="knopf signal" value="loeschen">Löschen</button>
483
+ </div>
484
+ </form>
485
+ </dialog>
486
+
487
+ <dialog id="d-mcp">
488
+ <form method="dialog">
489
+ <div class="dkopf">
490
+ <span class="etikett">Einhängen</span>
491
+ <h3>Wohin soll <span id="dm-name">der Server</span>?</h3>
492
+ <p id="dm-text">Ein Ort je Einhängen. agents kennt keine MCP-Server und steht deshalb nicht zur Wahl.</p>
493
+ </div>
494
+ <div class="dkoerper"><div class="wahl" id="dm-orte"></div></div>
495
+ <div class="dfuss">
496
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
497
+ <button class="knopf signal" value="los" id="dm-los">Einhängen</button>
498
+ </div>
499
+ </form>
500
+ </dialog>
501
+
502
+ <dialog id="d-mcp-hinzufuegen">
503
+ <form method="dialog">
504
+ <div class="dkopf">
505
+ <span class="etikett">MCP hinzufügen</span>
506
+ <h3>Welche MCP-Server sollen in <span id="dmh-ziel">diesem Ziel</span> hängen?</h3>
507
+ <p>Kreuz jeden Server an, der hier eingehängt werden soll. Schon Eingehängtes ist ausgegraut.</p>
508
+ </div>
509
+ <div class="dkoerper">
510
+ <div class="wahl" id="dmh-liste"></div>
511
+ </div>
512
+ <div class="dfuss">
513
+ <span class="links mono" id="dmh-bilanz">0 ausgewählt</span>
514
+ <button class="knopf leise" value="abbruch">Abbrechen</button>
515
+ <button class="knopf signal" value="los" id="dmh-los">Einhängen</button>
516
+ </div>
517
+ </form>
518
+ </dialog>
519
+
520
+ <dialog id="d-mcpaus">
521
+ <form method="dialog">
522
+ <div class="dkopf">
523
+ <span class="etikett">Rückfrage</span>
524
+ <h3 id="dma-titel">Aushängen?</h3>
525
+ <p id="dma-text"></p>
526
+ </div>
527
+ <div class="dfuss">
528
+ <button class="knopf leise" value="nein">Nein, behalten</button>
529
+ <button class="knopf signal" value="ja">Ja, aushängen</button>
530
+ </div>
531
+ </form>
532
+ </dialog>
533
+
534
+ <!-- Uebernehmen aus der geteilten .mcp.json (E64): die einzige Aktion, mit der hmgr diese Datei
535
+ schreibt, deshalb eine eigene Rueckfrage vor dem Ausfuehren. -->
536
+ <dialog id="d-mcpueb">
537
+ <form method="dialog">
538
+ <div class="dkopf">
539
+ <span class="etikett">Rückfrage</span>
540
+ <h3 id="dmu-titel">Übernehmen?</h3>
541
+ <p id="dmu-text"></p>
542
+ </div>
543
+ <div class="dfuss">
544
+ <button class="knopf leise" value="nein">Nein, so lassen</button>
545
+ <button class="knopf signal" value="ja">Ja, übernehmen</button>
546
+ </div>
547
+ </form>
548
+ </dialog>
549
+
550
+ <dialog id="d-einstellungen">
551
+ <form method="dialog">
552
+ <div class="dkopf">
553
+ <span class="etikett">Einstellungen</span>
554
+ <h3>Was hmgr auf diesem Rechner bedient</h3>
555
+ <p>Welche Harnesses hmgr verwaltet und aus welchen Quellen deine Skills kommen. Beides gilt für alle Ansichten.</p>
556
+ </div>
557
+ <div class="dkoerper">
558
+ <section class="abschnitt">
559
+ <span class="etikett" id="harnesstitel">Harnesses</span>
560
+ <p>Schalt aus, was hmgr nicht anfassen soll. Ein abgeschalteter Harness bleibt auf dem Rechner, hmgr pflegt seine Ziele nur nicht mehr.</p>
561
+ <ul class="harnessliste" id="harnessliste" aria-labelledby="harnesstitel"></ul>
562
+ </section>
563
+ <section class="abschnitt">
564
+ <span class="etikett" id="quellentitel">Quellen</span>
565
+ <p>Die Repos, aus denen die Skills kommen.</p>
566
+ <ul class="quellenliste" id="quellenliste" aria-labelledby="quellentitel"></ul>
567
+ <button class="knopf leise mitsymbol" type="button" id="quelleneu">
568
+ <svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M8 2.5v11M2.5 8h11"/></svg>
569
+ Quelle hinzufügen …
570
+ </button>
571
+ </section>
572
+ </div>
573
+ <div class="dfuss">
574
+ <button class="knopf" value="zu">Schliessen</button>
575
+ </div>
576
+ </form>
577
+ </dialog>
578
+
579
+ <script src="renderer.js"></script>
580
+ </body>
581
+ </html>