Automatischer Push: 45 Datei(en) geändert

- .claude/agents/planer.md
- .claude/agents/quorum-stimme.md
- .claude/skills/bookstack-upload/SKILL.md
- .claude/skills/bookstack-upload/scripts/bookstack/archiv.py
- .claude/skills/bookstack-upload/scripts/bookstack/auswahl.py
- .claude/skills/bookstack-upload/scripts/bookstack/beschreibung.py
- .claude/skills/bookstack-upload/scripts/bookstack/bilder.py
- .claude/skills/bookstack-upload/scripts/bookstack/ergebnis.py
- .claude/skills/bookstack-upload/scripts/bookstack/hochladen.py
- .claude/skills/bookstack-upload/scripts/bookstack/konvertierung.py
- .claude/skills/bookstack-upload/scripts/bookstack/struktur.py
- .claude/skills/bookstack-upload/scripts/bookstack/verweise.py
- … und 33 weitere

Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Pascal MichelandClaude Opus 5 committed 2026-10-01 04:00:02 +02:00
1 parent e8472409e9
commit eb48f8822d
45 files changed
+8645 -262

No files matched your search

@@ -1,4 +1,9 @@
"""Löst Regal-, Buch- und Kapitelnamen in IDs auf und legt Fehlendes auf Wunsch an."""
"""Löst Regal-, Buch- und Kapitelnamen in IDs auf und legt Fehlendes auf Wunsch an.
Ersteller: Pascal Michel
Erstellt: 2026-08-05
Doku: docs/code/struktur.md · Version und Änderungen: CHANGELOG.md
"""
from __future__ import annotations
@@ -13,8 +18,8 @@ class StrukturFehler(Exception):
@dataclass
class Ziel:
buch_id: int
kapitel_id: int | None = None
buch_id: int # 0: Buch ist im Probelauf nur geplant
kapitel_id: int | None = None # 0: Kapitel nur geplant, None: kein Kapitel
angelegt: list[str] = field(default_factory=list)
@@ -22,6 +27,11 @@ def _passt(eintrag: dict, name: str) -> bool:
return str(eintrag.get("name", "")).strip().casefold() == name.strip().casefold()
def _geplant_schluessel(sammlung: str, *namen: str) -> tuple[str, ...]:
"""Schlüssel für das Probelauf-Gedächtnis; Namen vergleicht er wie _passt."""
return (sammlung, *(name.strip().casefold() for name in namen))
class Strukturaufloeser:
def __init__(
self,
@@ -35,6 +45,8 @@ class Strukturaufloeser:
# Im Probelauf darf nichts entstehen. Fehlendes wird nur benannt.
self._nur_planen = nur_planen
self._speicher: dict[str, list[dict]] = {}
# Probelauf: schon als „wird angelegt“ gemeldete Regale, Bücher und Kapitel.
self._geplant: set[tuple[str, ...]] = set()
def _sammlung(self, name: str) -> list[dict]:
if name not in self._speicher:
@@ -63,14 +75,26 @@ class Strukturaufloeser:
zusatz = " (wird angelegt)" if self._nur_planen else ""
return f'{art} "{name.strip()}"{zusatz}'
def _plane(
self, schluessel: tuple[str, ...], art: str, name: str, angelegt: list[str]
) -> None:
"""Probelauf: meldet eine geplante Neuanlage nur beim ersten Mal."""
if schluessel in self._geplant:
return
self._geplant.add(schluessel)
angelegt.append(self._vermerke(art, name))
def _haenge_an_regal(self, regal_name: str, buch_id: int, angelegt: list[str]) -> None:
regal = self._finde("shelves", regal_name)
if regal is None:
if not self._anlegen_erlaubt:
raise self._fehlt("Regal", regal_name)
angelegt.append(self._vermerke("Regal", regal_name))
if self._nur_planen:
self._plane(
_geplant_schluessel("shelves", regal_name), "Regal", regal_name, angelegt
)
return
angelegt.append(self._vermerke("Regal", regal_name))
self._api.anfrage(
"POST", "/api/shelves", {"name": regal_name.strip(), "books": [buch_id]}
)
@@ -98,10 +122,11 @@ class Strukturaufloeser:
if gefunden is None:
if not self._anlegen_erlaubt:
raise self._fehlt("Buch", buch)
angelegt.append(self._vermerke("Buch", buch))
if self._nur_planen:
self._plane(_geplant_schluessel("books", buch), "Buch", buch, angelegt)
gefunden = {"id": 0}
else:
angelegt.append(self._vermerke("Buch", buch))
gefunden = self._api.anfrage("POST", "/api/books", {"name": buch.strip()})
self._verwerfe("books")
buch_id = int(gefunden["id"])
@@ -115,10 +140,13 @@ class Strukturaufloeser:
if treffer is None:
if not self._anlegen_erlaubt:
raise self._fehlt("Kapitel", kapitel)
angelegt.append(self._vermerke("Kapitel", kapitel))
if self._nur_planen:
self._plane(
_geplant_schluessel("chapters", buch, kapitel), "Kapitel", kapitel, angelegt
)
treffer = {"id": 0}
else:
angelegt.append(self._vermerke("Kapitel", kapitel))
treffer = self._api.anfrage(
"POST", "/api/chapters", {"book_id": buch_id, "name": kapitel.strip()}
)