hmgr 0.0.50 → 0.0.51

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.51": [
5
+ "Ein gelöschter Projektordner, an dem noch ein Bundle hing, wird beim Aktualisieren nicht mehr neu angelegt. `hmgr doctor` findet solche Ordner jetzt und bietet an, sie samt ihren Bundles zu vergessen."
6
+ ],
4
7
  "0.0.50": [
5
8
  "Die Suche in hmgr findet jetzt auch Ordner und Skills mit Umlauten, etwa „döring“. Unter macOS legt hmgr denselben Ordner nicht mehr doppelt an, wenn er einmal aus dem Finder und einmal getippt hinzugefügt wird."
6
9
  ],
package/dist/cli/hilfe.js CHANGED
@@ -315,6 +315,11 @@ Liegt am Ziel schon derselbe Skill aus derselben Quelle als hmgr-Link, wird er a
315
315
  übernommen: aus Bestand wird ein Bundle, ohne erst Links von Hand zu entfernen. Alles andere unter
316
316
  demselben Namen ist ein Konflikt und wird genannt.
317
317
 
318
+ Ein Bundle in einem Arbeitsverzeichnis, das es nicht mehr gibt, legen update und sync nicht wieder
319
+ an: update übergeht es still, sync --ort meldet es als fehlgeschlagen. hmgr doctor bietet an, das
320
+ Arbeitsverzeichnis samt seinen Bundle-Installationen zu vergessen. bundle add legt ein fehlendes
321
+ Verzeichnis weiterhin an, bundle remove trägt kein Arbeitsverzeichnis ein.
322
+
318
323
  hmgr unlink <skill> auf ein einzelnes Mitglied nimmt es aus dem Bundle heraus: nur dieser Link
319
324
  verschwindet, das Bundle bleibt im Ziel und merkt sich den Skill als herausgenommen. sync und
320
325
  update legen ihn nicht wieder an, neue Mitglieder der Definition ergänzen sie weiter. Zurück kommt
@@ -617,7 +622,9 @@ Prüft, ob jedes gemerkte Arbeitsverzeichnis (hmgr dir add) noch auf der Platte
617
622
  umbenanntes oder woanders neu geklontes Projekt hinterlässt sonst für immer einen toten Pfad im
618
623
  Zustand, den nur hmgr dir forget von Hand entfernt. Bei einem Fund fragt doctor wie hmgr update
619
624
  einmal für alle Funde, ob sie vergessen werden sollen; ohne Bestätigung bleiben sie gemeldet, aber
620
- gemerkt. Anders als update holt doctor nichts aus dem Netz.
625
+ gemerkt. Geprüft werden auch Arbeitsverzeichnisse, an denen nur Bundles oder Bindungen hängen
626
+ (E119); vergessen nimmt dann auch deren Bundle-Installationen aus dem Zustand. Anders als update
627
+ holt doctor nichts aus dem Netz.
621
628
 
622
629
  Dazu prüft doctor Dateien, die eine Quelle mit SOPS verschlüsselt (.gitattributes mit
623
630
  filter=sops_dotenv, sops_yaml oder sops_generic) und die noch verschlüsselt im Checkout liegen,
package/dist/cli/main.js CHANGED
@@ -483,7 +483,9 @@ export async function ausfuehren(argv, umgebung, optionen = {}) {
483
483
  'hmgr status zeigt die verlinkten Skills, hmgr source add <url|pfad> die Skills einer Quelle.');
484
484
  const ziel = { harness: werte.get('harness') ?? 'claude-code', ort: ortLesen(werte.get('ort'), ports.umgebung.plattform()) };
485
485
  const lokal = flaggen.has('local') || flaggen.has('lokal');
486
- if (ziel.ort.art === 'arbeitsverzeichnis') {
486
+ // E119: unlink trägt ein Verzeichnis, das es nicht mehr gibt, nicht neu ein.
487
+ if (ziel.ort.art === 'arbeitsverzeichnis' &&
488
+ (kommando === 'link' || (await ports.zeiger.verzeichnisExistiert(ziel.ort.pfad)))) {
487
489
  // Verzeichnis merken und binden, damit status es wiederfindet und der Zeiger bekannt ist (E21).
488
490
  const composer = werte.get('composer');
489
491
  const verz = composer === undefined
@@ -657,7 +659,7 @@ export async function ausfuehren(argv, umgebung, optionen = {}) {
657
659
  if (name === undefined && unterkommando !== 'sync')
658
660
  throw new Error(`bundle ${unterkommando} braucht einen Bundle-Namen. hmgr bundle list zeigt die Bundles der bekannten Quellen.`);
659
661
  const ziel = { harness: werte.get('harness') ?? 'claude-code', ort: ortLesen(werte.get('ort'), ports.umgebung.plattform()) };
660
- if (ziel.ort.art === 'arbeitsverzeichnis') {
662
+ if (unterkommando !== 'remove' && ziel.ort.art === 'arbeitsverzeichnis') {
661
663
  // Wie bei link: Verzeichnis merken und binden, damit status es wiederfindet (E21).
662
664
  const composer = werte.get('composer');
663
665
  const verz = composer === undefined
@@ -1279,6 +1279,21 @@ export class Anwendungsfaelle {
1279
1279
  for (const installation of installationen) {
1280
1280
  const ziel = Anwendungsfaelle.installationZiel(installation);
1281
1281
  const kopf = { ziel, bundle: installation.bundle, quelle: installation.quelle };
1282
+ // E119: Ein Arbeitsverzeichnis, das es nicht mehr gibt, legt der Abgleich nicht neu an. Ohne
1283
+ // genanntes Ziel übergeht er es still (die Meldung übernimmt doctor), mit Ziel ist es ein Fehlschlag.
1284
+ if (ziel.ort.art === 'arbeitsverzeichnis' && !(await this.p.zeiger.verzeichnisExistiert(ziel.ort.pfad))) {
1285
+ if (args?.ziel === undefined)
1286
+ continue;
1287
+ ergebnis.push({
1288
+ ...kopf,
1289
+ ergebnis: 'fehlgeschlagen',
1290
+ gelegt: [],
1291
+ entfernt: [],
1292
+ neueQuellen: [],
1293
+ fehler: `Das Arbeitsverzeichnis ${ziel.ort.pfad} gibt es nicht mehr. hmgr doctor bietet an, es zu vergessen.`,
1294
+ });
1295
+ continue;
1296
+ }
1282
1297
  try {
1283
1298
  const harness = await this.harnessGeprueft(ziel.harness);
1284
1299
  // Die Definition liegt in der Quelle: ohne Nachziehen bliebe eine Änderung unsichtbar,
@@ -1383,6 +1398,7 @@ export class Anwendungsfaelle {
1383
1398
  const zustand = await this.p.zustand.lesen();
1384
1399
  zustand.arbeitsverzeichnisse = zustand.arbeitsverzeichnisse.filter((p) => p !== verzeichnis);
1385
1400
  zustand.bindungen = zustand.bindungen.filter((b) => !(b.ziel.ort.art === 'arbeitsverzeichnis' && b.ziel.ort.pfad === verzeichnis));
1401
+ zustand.bundleInstallationen = zustand.bundleInstallationen.filter((i) => !(i.ort.art === 'arbeitsverzeichnis' && i.ort.pfad === verzeichnis));
1386
1402
  await this.p.zustand.schreiben(zustand);
1387
1403
  }
1388
1404
  /**
@@ -1406,7 +1422,15 @@ export class Anwendungsfaelle {
1406
1422
  async doctorPruefen(rueckfragen) {
1407
1423
  const zustand = await this.p.zustand.lesen();
1408
1424
  const fehlend = [];
1409
- for (const pfad of zustand.arbeitsverzeichnisse)
1425
+ // E119: auch Pfade, an denen nur Bindungen oder Bundle-Installationen hängen.
1426
+ const pfade = new Set(zustand.arbeitsverzeichnisse);
1427
+ for (const b of zustand.bindungen)
1428
+ if (b.ziel.ort.art === 'arbeitsverzeichnis')
1429
+ pfade.add(b.ziel.ort.pfad);
1430
+ for (const i of zustand.bundleInstallationen)
1431
+ if (i.ort.art === 'arbeitsverzeichnis')
1432
+ pfade.add(i.ort.pfad);
1433
+ for (const pfad of pfade)
1410
1434
  if (!(await this.p.zeiger.verzeichnisExistiert(pfad)))
1411
1435
  fehlend.push(pfad);
1412
1436
  let vergessen = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hmgr",
3
- "version": "0.0.50",
3
+ "version": "0.0.51",
4
4
  "description": "Harness Manager: Skills und Plugins für AI-Harnesses verwalten",
5
5
  "license": "MIT",
6
6
  "author": "Tim Kaufmann",