hmgr 0.0.43 → 0.0.44

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.
@@ -1,6 +1,9 @@
1
1
  {
2
2
  "fassung": 1,
3
3
  "versionen": {
4
+ "0.0.44": [
5
+ "Läuft gerade eine Aktualisierung, zeigt hmgr ein im Terminal hinzugefügtes Verzeichnis trotzdem sofort an, statt bis zum Ende der Aktualisierung zu warten."
6
+ ],
4
7
  "0.0.43": [
5
8
  "Fügst du im Terminal ein Arbeitsverzeichnis hinzu (hmgr dir add oder link mit einem neuen Verzeichnis), kommt ein offenes hmgr-Fenster nach vorn und zeigt das Verzeichnis sofort an."
6
9
  ],
package/dist/gui/main.js CHANGED
@@ -1374,7 +1374,7 @@ function fensterOeffnen() {
1374
1374
  // E110: CLI-Signal gegen die laufende GUI. Das Signal schreibt dieser Main-Prozess in das
1375
1375
  // Wegwerf-Home (der Renderer kann keine Dateien schreiben). Fall 1: ohne Dialog springt die
1376
1376
  // GUI aus einer anderen Ansicht zur Karte. Fall 2: mit offenem Dialog bleibt alles stehen,
1377
- // erst nach dem Schließen folgt der Sprung. Läuft nach der Neustart-Modal-Prüfung, weil der Fall
1377
+ // erst nach dem Schließen folgt der Sprung. Fall 3 (E112): bei laufendem Aktualisieren lädt das Signal trotzdem, der Watcher nicht. Läuft nach der Neustart-Modal-Prüfung, weil der Fall
1378
1378
  // offene Dialoge schließt.
1379
1379
  .then(async () => {
1380
1380
  const pfade = (process.env.HMGR_GUI_SMOKE_SIGNAL_PFADE ?? '').split('\n').filter((p) => p !== '');
@@ -1422,6 +1422,30 @@ function fensterOeffnen() {
1422
1422
  ergebnis.fall2NachWarten = await js(karteJs(pfad2));
1423
1423
  await js(`document.getElementById('d-einstellungen').close(); true`);
1424
1424
  ergebnis.fall2 = await warteAufSprung(pfad2);
1425
+ // Fall 3 (E112): ein Aktualisieren-Lauf läuft (so erkennt ihn der Renderer: der
1426
+ // Kringel ist gesperrt). Ein Watcher-/Fokus-Anstoß lädt nicht; das Signal lädt sofort
1427
+ // und springt trotzdem. Ein MutationObserver an der Zielliste belegt das Neuladen
1428
+ // (ladeAlles baut sie neu auf). Karte von Fall 1 vorher zuklappen, Ansicht wechseln.
1429
+ await js(`window.__e112Aenderungen = 0;
1430
+ window.__e112Beobachter = new MutationObserver(function (m) { window.__e112Aenderungen += m.length; });
1431
+ window.__e112Beobachter.observe(document.getElementById('zielliste'), { childList: true, subtree: true });
1432
+ document.getElementById('updatestart').disabled = true;
1433
+ document.querySelector('[data-ansicht="mcp"]').click(); true`);
1434
+ await js(`(function () {
1435
+ var k = Array.from(document.querySelectorAll('#zielliste .ziel.verzeichnis'))
1436
+ .find(function (x) { return x.dataset.verzKey === ${JSON.stringify(`dir:${pfad1}`)}; });
1437
+ var kopf = k.querySelector('.zielkopf');
1438
+ if (kopf.getAttribute('aria-expanded') === 'true') kopf.click();
1439
+ window.__e112Aenderungen = 0; return true; })()`);
1440
+ ergebnis.fall3Vorher = await js(karteJs(pfad1));
1441
+ fenster.webContents.send('hmgr:neuLadenAnstossen');
1442
+ await new Promise((r) => setTimeout(r, 1200));
1443
+ ergebnis.fall3WatcherAenderungen = await js(`window.__e112Aenderungen`);
1444
+ await signalSchreiben(umgebung.hmgrHome, { art: 'verzeichnis-zeigen', pfad: pfad1, zeit: Date.now() });
1445
+ ergebnis.fall3 = await warteAufSprung(pfad1);
1446
+ ergebnis.fall3Aenderungen = await js(`window.__e112Aenderungen`);
1447
+ ergebnis.fall3LaufNochGesperrt = await js(`document.getElementById('updatestart').disabled === true`);
1448
+ await js(`document.getElementById('updatestart').disabled = false; window.__e112Beobachter.disconnect(); true`);
1425
1449
  }
1426
1450
  catch (fehler) {
1427
1451
  ergebnis.fehler = String(fehler);
@@ -2797,14 +2797,13 @@
2797
2797
  var uhrzeit = new Date().toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' });
2798
2798
  standNachLauf(ergebnis, ausloeser, uhrzeit);
2799
2799
  await ladeVerlauf();
2800
- await ladeAlles();
2800
+ await ladeAllesNacheinander();
2801
2801
  } finally {
2802
2802
  standLaeuft = false;
2803
2803
  knopf.disabled = false;
2804
2804
  knopf.classList.remove('laeuft');
2805
2805
  // Scheiterte der Lauf, bliebe sonst „Prüft …" stehen.
2806
2806
  if ($('standtext').textContent === 'Prüft …') standText();
2807
- reloadWartendeFreigeben();
2808
2807
  }
2809
2808
  }
2810
2809
 
@@ -2884,20 +2883,14 @@
2884
2883
  // überholt. Fehler landen wie sonst über rufe() in der Meldungsleiste, kein stiller Absturz.
2885
2884
  var stillerReloadLaeuft = false;
2886
2885
  var stillerReloadVorgemerkt = false;
2887
- // Wer auf das Ende des Neuladens wartet (E110): die Auflöser werden frei, sobald weder ein
2888
- // stiller Reload noch ein Aktualisieren-Lauf (der mit ladeAlles endet) mehr läuft.
2889
- var reloadWartende = [];
2890
- function reloadWartendeFreigeben() {
2891
- if (stillerReloadLaeuft || stillerReloadVorgemerkt || $('updatestart').disabled) return;
2892
- var liste = reloadWartende;
2893
- reloadWartende = [];
2894
- liste.forEach(function (aufloeser) { aufloeser(); });
2895
- }
2896
- function stillerReloadAbwarten() {
2897
- return new Promise(function (aufloeser) {
2898
- reloadWartende.push(aufloeser);
2899
- void stillerReload();
2900
- });
2886
+ // Alle Neuaufbauten der stillen Wege, des Signals und des Laufendes (E112) laufen hintereinander,
2887
+ // nie gleichzeitig. Die Kette reißt nie: ein Fehler (rufe() hat ihn gemeldet) wird für die
2888
+ // Kette verschluckt, dem Aufrufer aber weitergereicht.
2889
+ var ladeKette = Promise.resolve();
2890
+ function ladeAllesNacheinander() {
2891
+ var lauf = ladeKette.then(function () { return ladeAlles(); });
2892
+ ladeKette = lauf.catch(function () {});
2893
+ return lauf;
2901
2894
  }
2902
2895
  async function stillerReload() {
2903
2896
  // Läuft gerade ein Aktualisieren-Lauf, wird nicht parallel geladen: er endet ohnehin mit
@@ -2909,7 +2902,7 @@
2909
2902
  }
2910
2903
  stillerReloadLaeuft = true;
2911
2904
  try {
2912
- await ladeAlles();
2905
+ await ladeAllesNacheinander();
2913
2906
  } catch (fehler) {
2914
2907
  // rufe() hat den Fehler schon gemeldet, hier bleibt nur: den Durchlauf nicht wiederholen.
2915
2908
  } finally {
@@ -2917,8 +2910,6 @@
2917
2910
  if (stillerReloadVorgemerkt) {
2918
2911
  stillerReloadVorgemerkt = false;
2919
2912
  void stillerReload();
2920
- } else {
2921
- reloadWartendeFreigeben();
2922
2913
  }
2923
2914
  }
2924
2915
  }
@@ -2939,9 +2930,11 @@
2939
2930
  zeigeAnsicht('ziele');
2940
2931
  springeZuVerzeichnis(pfad);
2941
2932
  }
2933
+ // Der Signalweg lädt sofort, auch während eines Aktualisieren-Laufs (E112); die Serialisierung
2934
+ // hält ihn von dessen Neuaufbau am Ende getrennt. Der Sprung folgt auch nach einem Fehler.
2942
2935
  window.hmgr.onVerzeichnisZeigen(function (pfad) {
2943
2936
  signalPfadVorgemerkt = pfad;
2944
- void stillerReloadAbwarten().then(signalSprungEinloesen);
2937
+ void ladeAllesNacheinander().catch(function () {}).then(signalSprungEinloesen);
2945
2938
  });
2946
2939
  // `close` bubbelt nicht, der Capture-Listener am Dokument sieht aber jeden geschlossenen Dialog.
2947
2940
  // Der Aufschub um einen Takt lässt einen unmittelbar folgenden Dialog zuerst aufgehen.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hmgr",
3
- "version": "0.0.43",
3
+ "version": "0.0.44",
4
4
  "description": "Harness Manager: Skills und Plugins für AI-Harnesses verwalten",
5
5
  "license": "MIT",
6
6
  "author": "Tim Kaufmann",