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:
1 parent
e8472409e9
commit
eb48f8822d
45 files changed
+8645
-262
No files matched your search
@@ -5,7 +5,7 @@ status: draft
|
||||
summary: "Legt waisen.py, waisen-ausnahmen.txt, faelle_waisen.py und ENTWURF-waisen.md an; der Treiber fährt die Angriffsliste, einen Rotlauf mit eingebauten Mutanten und eine Laufzeitmessung über den echten Vault."
|
||||
tags: [plan-task, vault-tools]
|
||||
created: 2026-09-29
|
||||
updated: 2026-09-29
|
||||
updated: 2026-09-30
|
||||
modell: haiku
|
||||
modell_begruendung: "Vier neue Dateien stehen wörtlich im Plan und werden per Skript angelegt; die Codeblöcke enthalten keine typografischen Anführungszeichen, Gedankenstriche oder Auslassungspunkte."
|
||||
---
|
||||
@@ -599,7 +599,7 @@ FAELLE = [
|
||||
Fall("frontmatter | Wikilink in einer Blockliste",
|
||||
neu("A/neu.md", "---\nverwandt:\n - \"[[C/allein]]\"\n---\n"), []),
|
||||
Fall("frontmatter | ohne Schlusszeile zaehlt als Text",
|
||||
neu("A/neu.md", "---\nverwandt: \"[[C/allein]]\"\n"), []),
|
||||
neu("A/neu.md", "---\nquelle: \"[x](../C/allein.md)\"\n"), []),
|
||||
Fall("frontmatter | Markdown-Link im Frontmatter zaehlt nicht",
|
||||
neu("A/neu.md", "---\nquelle: \"[x](../C/allein.md)\"\n---\n"),
|
||||
["A/neu.md", "C/allein.md"]),
|
||||
@@ -652,6 +652,13 @@ FAELLE = [
|
||||
Fall("ausblendung | andere Endung ist kein Knoten", neu("C/daten.txt", "[[B/ziel]]\n"), ["C/allein.md"]),
|
||||
Fall("ausblendung | Endung in Grossbuchstaben ist ein Knoten", neu("C/GROSS.MD", "# G\n"),
|
||||
["C/GROSS.MD", "C/allein.md"]),
|
||||
# Dateifilter: Der Ordner davor bleibt stehen, erst die Prüfung je Datei blendet aus.
|
||||
Fall("ausblendung | Dateifilter blendet eine Notiz aus",
|
||||
neu(".obsidian/app.json", '{"userIgnoreFilters": ["C/allein.md"]}'), []),
|
||||
Fall("ausblendung | per Dateifilter ausgeblendete Notiz ist keine Quelle",
|
||||
lambda v: (schreibe(v, ".obsidian/app.json", '{"userIgnoreFilters": ["D/quelle.md"]}'),
|
||||
schreibe(v, "D/quelle.md", "[[C/allein]]\n")),
|
||||
["C/allein.md"]),
|
||||
Fall("ausnahme | Muster trifft die Waise", nichts, [],
|
||||
["Ausgenommene Waisen: 1 über 1 Muster"], ausnahmen="C/**\n"),
|
||||
Fall("ausnahme | ausgenommene Notiz liefert Kanten", neu("D/quelle.md", "[[C/allein]]\n"), [],
|
||||
@@ -676,6 +683,10 @@ FAELLE = [
|
||||
ausnahmen="C/../**\n"),
|
||||
Fall("ausnahme | Laufwerk ist ungueltig", nichts, None, ["ungültiges Muster"],
|
||||
ausnahmen="D:/C/**\n"),
|
||||
Fall("ausnahme | Punkt als Pfadteil ist ungueltig", nichts, None, ["ungültiges Muster"],
|
||||
ausnahmen="./C/**\n"),
|
||||
Fall("ausnahme | leerer Pfadteil ist ungueltig", nichts, None, ["ungültiges Muster"],
|
||||
ausnahmen="C//allein.md\n"),
|
||||
Fall("ausnahme | doppeltes Muster", nichts, None, ["steht doppelt"], ausnahmen="C/**\nc/**\n"),
|
||||
Fall("ausnahme | Datei fehlt", nichts, None, ["Ausnahmedatei fehlt"], ausnahmen=None),
|
||||
Fall("ausnahme | ungueltiges UTF-8", nichts, None, ["Ausnahmedatei nicht lesbar"],
|
||||
@@ -724,14 +735,19 @@ FAELLE = [
|
||||
Fall("umgebung | ohne PYTHONIOENCODING mit Umlaut und Emoji im Namen",
|
||||
neu("C/Übersicht 🚀.md", "# U\n"), ["C/allein.md", "C/Übersicht 🚀.md"],
|
||||
ohne_pythonioencoding=True),
|
||||
# Mehrdeutig: Die richtige Wahl liegt jeweils alphabetisch hinten, sonst misst der Fall nichts.
|
||||
Fall("mehrdeutig | gleichnamige Notiz im selben Ordner gewinnt",
|
||||
lambda v: (schreibe(v, "C/doppelt.md", "# D\n"), schreibe(v, "E/doppelt.md", "# D\n"),
|
||||
schreibe(v, "C/verweis.md", "[[doppelt]]\n")),
|
||||
["C/allein.md", "E/doppelt.md"]),
|
||||
lambda v: (schreibe(v, "Q/X/doppelt.md", "# D\n"), schreibe(v, "A/X/doppelt.md", "# D\n"),
|
||||
schreibe(v, "Q/X/verweis.md", "[[X/doppelt]]\n")),
|
||||
["A/X/doppelt.md", "C/allein.md"]),
|
||||
Fall("mehrdeutig | relativ zur Quelle vor dem Namen",
|
||||
lambda v: (schreibe(v, "Z/sub/n.md", "# N\n"), schreibe(v, "A/sub/n.md", "# N\n"),
|
||||
schreibe(v, "Z/verweis.md", "[[sub/n]]\n")),
|
||||
["A/sub/n.md", "C/allein.md"]),
|
||||
Fall("mehrdeutig | sonst der kuerzeste Pfad",
|
||||
lambda v: (schreibe(v, "E/doppelt.md", "# D\n"), schreibe(v, "F/G/doppelt.md", "# D\n"),
|
||||
schreibe(v, "A/verweis.md", "[[doppelt]]\n")),
|
||||
["C/allein.md", "F/G/doppelt.md"]),
|
||||
lambda v: (schreibe(v, "A/B/doppelt.md", "# D\n"), schreibe(v, "Z/doppelt.md", "# D\n"),
|
||||
schreibe(v, "Q/verweis.md", "[[doppelt]]\n")),
|
||||
["A/B/doppelt.md", "C/allein.md"]),
|
||||
Fall("zahl | nur die Zahl", nichts, ["C/allein.md"], zahl=True),
|
||||
Fall("zahl | null Waisen", neu("A/neu.md", "[[C/allein]]\n"), [], zahl=True),
|
||||
Fall("zahl | Abbruch ohne Zahl", lambda v: shutil.rmtree(v / ".obsidian"), None,
|
||||
@@ -968,6 +984,35 @@ MUTANTEN = [
|
||||
" liste.append((\"regex\", re.compile(eintrag[1:-1])))",
|
||||
" liste.append((\"praefix\", eintrag))",
|
||||
["ausblendung | regulaerer Ausdruck in der Tiefe"]),
|
||||
("Frontmatter ohne Schlusszeile als Kopf",
|
||||
" return \"\", text",
|
||||
" return text, \"\"",
|
||||
["frontmatter | ohne Schlusszeile zaehlt als Text"]),
|
||||
("Punkt als Pfadteil erlaubt",
|
||||
" or \"..\" in teile or \".\" in teile or \"\" in teile[:-1]):",
|
||||
" or \"..\" in teile or \"\" in teile[:-1]):",
|
||||
["ausnahme | Punkt als Pfadteil ist ungueltig"]),
|
||||
("leerer Pfadteil erlaubt",
|
||||
" or \"..\" in teile or \".\" in teile or \"\" in teile[:-1]):",
|
||||
" or \"..\" in teile or \".\" in teile):",
|
||||
["ausnahme | leerer Pfadteil ist ungueltig"]),
|
||||
("Dateifilter ignoriert",
|
||||
" if not ausgeblendet(praefix + name, filter_liste):",
|
||||
" if True:",
|
||||
["ausblendung | Dateifilter blendet eine Notiz aus",
|
||||
"ausblendung | per Dateifilter ausgeblendete Notiz ist keine Quelle"]),
|
||||
("gleicher Ordner ignoriert",
|
||||
" gleich = sorted(r for r in kandidaten if posixpath.dirname(r).lower() == ordner)",
|
||||
" gleich = []",
|
||||
["mehrdeutig | gleichnamige Notiz im selben Ordner gewinnt"]),
|
||||
("kein Kandidat relativ zur Quelle",
|
||||
" kandidaten = [posixpath.normpath(ziel), posixpath.normpath(posixpath.join(ordner, ziel))]",
|
||||
" kandidaten = [posixpath.normpath(ziel)]",
|
||||
["mehrdeutig | relativ zur Quelle vor dem Namen"]),
|
||||
("mehrdeutig nur alphabetisch",
|
||||
" return sorted(kandidaten, key=lambda r: (r.count(\"/\"), len(r), r.lower()))[0]",
|
||||
" return sorted(kandidaten, key=lambda r: r.lower())[0]",
|
||||
["mehrdeutig | sonst der kuerzeste Pfad"]),
|
||||
]
|
||||
|
||||
|
||||
@@ -1111,13 +1156,13 @@ Die einzelnen Fälle stehen an genau einer Stelle, in `faelle_waisen.py`. Hier s
|
||||
|
||||
| Klasse | Fälle |
|
||||
|---|---|
|
||||
| fehlt | `.obsidian`, `app.json`, Schlüssel `userIgnoreFilters`, Ausnahmedatei, `linkcheck.py`, Vault-Ordner |
|
||||
| fehlt | `.obsidian`, `app.json`, Schlüssel `userIgnoreFilters`, Ausnahmedatei, `linkcheck.py`, Vault-Ordner, Schlusszeile des Frontmatters |
|
||||
| null | `userIgnoreFilters` ist null |
|
||||
| falscher Typ | `app.json` als Liste, Filtereintrag als Zahl, `app.json` ohne JSON |
|
||||
| leer | leere Filterliste, leerer Filtereintrag, leere Ausnahmedatei, nur Kommentare, leere Notiz, Vault ohne Notiz |
|
||||
| doppelt | doppeltes Muster, gleichnamige Notizen in zwei Ordnern |
|
||||
| zusätzlich | Punktordner, Punktdatei, andere Endung, Endung in Großbuchstaben |
|
||||
| Wertebereich | Muster mit Backslash, führendem Schrägstrich, `..`, Laufwerk; Stern über Ordnergrenze |
|
||||
| doppelt | doppeltes Muster, gleichnamige Notizen in zwei Ordnern: gleicher Ordner, relativ zur Quelle, kürzester Pfad; die richtige Wahl liegt jeweils alphabetisch hinten |
|
||||
| zusätzlich | Punktordner, Punktdatei, andere Endung, Endung in Großbuchstaben, per Dateifilter ausgeblendete Notiz als Knoten und als Quelle |
|
||||
| Wertebereich | Muster mit Backslash, führendem Schrägstrich, `..`, `.` als Pfadteil, leerem Pfadteil, Laufwerk; Stern über Ordnergrenze |
|
||||
| Verweis ins Leere | Wikilink ins Leere, auf Anhang, auf ausgeblendete Notiz, Selbstreferenz, Anker allein |
|
||||
| Reihenfolge | Waise an erster und letzter Stelle, Muster in erster und letzter Zeile, Filter an erster und letzter Stelle, Link am Dateiende ohne Zeilenumbruch |
|
||||
| Umgebung | CRLF, BOM, ungültiges UTF-8 in Notiz und Ausnahmedatei, Umlaut und Emoji im Namen ohne `PYTHONIOENCODING` |
|
||||
|
||||
Reference in new issue
Block a user