hmgr 0.0.48 → 0.0.49

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.
@@ -54,12 +54,15 @@ export const claudeAusfuehrer = (args, cwd) => new Promise((aufloesen) => {
54
54
  });
55
55
  /**
56
56
  * Pfadvergleich für E102: abschließende Trenner zählen nicht; bei Windows-Pfaden (Laufwerk oder
57
- * UNC) sind außerdem `\\` und `/` sowie Groß-/Kleinschreibung gleich.
57
+ * UNC) sind außerdem `\\` und `/` sowie Groß-/Kleinschreibung gleich. Beide Seiten werden in NFC
58
+ * verglichen (E117), weil Claude Code Pfade zusammengesetzt führt, hmgr sie aber oft zerlegt (NFD) merkt.
58
59
  */
59
60
  export function pfadGleich(a, b) {
60
61
  const windows = (p) => /^[a-zA-Z]:[\\/]/.test(p) || p.startsWith('\\\\');
61
62
  const norm = (p, win) => {
62
- let t = win ? p.replaceAll('\\', '/').toLowerCase() : p;
63
+ let t = p.normalize('NFC');
64
+ if (win)
65
+ t = t.replaceAll('\\', '/').toLowerCase();
63
66
  while (t.length > 1 && t.endsWith('/'))
64
67
  t = t.slice(0, -1);
65
68
  return t;
@@ -467,6 +470,9 @@ class ClaudeMcp {
467
470
  *
468
471
  * In WSL (E100) ist es die `~/.claude.json` der Distro, über die Bridge gelesen; der Schlüssel ist
469
472
  * der Linux-Pfad, zusätzlich in der Distro aufgelöst (`realpath`).
473
+ *
474
+ * Claude Code führt den Schlüssel immer in NFC, hmgr merkt Pfade oft in NFD: Probiert werden
475
+ * Pfad, aufgelöster Pfad und beide in NFC (E117).
470
476
  */
471
477
  async mcpServersAm(ort) {
472
478
  const distro = wslDistroVonOrt(ort);
@@ -476,13 +482,21 @@ class ClaudeMcp {
476
482
  if (ort.art === 'arbeitsverzeichnis') {
477
483
  const projects = objektFeld(daten, 'projects');
478
484
  const pfad = this.cliPfad(ort.pfad);
479
- const direkt = objektFeld(projects, pfad);
485
+ const gesehen = new Set();
486
+ const versuchen = (schluessel) => {
487
+ if (schluessel === undefined || gesehen.has(schluessel))
488
+ return undefined;
489
+ gesehen.add(schluessel);
490
+ const treffer = objektFeld(projects, schluessel);
491
+ return treffer === undefined ? undefined : mcpServersVon(treffer);
492
+ };
493
+ const direkt = versuchen(pfad) ?? versuchen(pfad.normalize('NFC'));
480
494
  if (direkt !== undefined)
481
- return mcpServersVon(direkt);
495
+ return direkt;
482
496
  const echt = distro === undefined
483
497
  ? aufgeloest(pfad)
484
498
  : await this.harness.bruecke(distro).aufgeloest(pfad).catch(() => undefined);
485
- return mcpServersVon(echt === undefined ? undefined : objektFeld(projects, echt));
499
+ return versuchen(echt) ?? versuchen(echt?.normalize('NFC')) ?? {};
486
500
  }
487
501
  throw new OrtNichtUnterstuetzt(this.harness.name, ort.art);
488
502
  }
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "fassung": 1,
3
3
  "versionen": {
4
+ "0.0.49": [
5
+ "MCP-Server in Projektordnern mit Umlauten im Namen (etwa „Döring“) erscheinen jetzt in hmgr. Bisher fehlten sie dort, obwohl Claude Code sie benutzte. Dasselbe gilt für Plugins in solchen Ordnern."
6
+ ],
4
7
  "0.0.48": [
5
8
  "Die Meldung „Unexpected end of JSON input“ taucht nicht mehr auf, wenn hmgr an mehreren Stellen gleichzeitig läuft, etwa die Oberfläche und die Kommandozeile: hmgr schreibt seinen Zustand und den Verlauf jetzt so, dass nie eine halb geschriebene Datei gelesen wird."
6
9
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hmgr",
3
- "version": "0.0.48",
3
+ "version": "0.0.49",
4
4
  "description": "Harness Manager: Skills und Plugins für AI-Harnesses verwalten",
5
5
  "license": "MIT",
6
6
  "author": "Tim Kaufmann",