Auto-Push: Werkzeuge täglich nach claude-werkzeuge spiegeln

taeglich_push.py ruft nach dem Vault-Push werkzeuge_spiegel.py auf:
committeter Stand von .vault-tools/ und .claude/ ohne Trading-Werkzeuge
und watermarks-remover, README aus werkzeuge-README.md. Fallkatalog
14 von 14, drei Mutanten erkannt. veroeffentlichung.md und Stamm
nachgezogen; Gitea seit heute anonym lesbar.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Pascal MichelandClaude Opus 5.5 committed 2026-10-14 11:51:42 +02:00
1 parent 6f9659ad06
commit fe20d21d6e
7 files changed
+1243 -33

No files matched your search

+54 -30
View File
@@ -1,7 +1,8 @@
"""Täglicher Lauf: committet und pusht die Anweisungsschicht, für die Windows-Aufgabenplanung.
"""Täglicher Lauf: committet und pusht die Anweisungsschicht und spiegelt die Werkzeuge.
Ersteller: Pascal Michel
Erstellt: 2026-09-17
Geändert: 2026-10-14 (Werkzeug-Spiegel nach claude-werkzeuge)
WARUM LOKAL UND NICHT ALS COWORK-ROUTINE
Eine Cowork-Routine läuft in Anthropics Cloud und hat weder Zugriff auf
@@ -10,18 +11,23 @@ WARUM LOKAL UND NICHT ALS COWORK-ROUTINE
nichts committen. Deshalb die Windows-Aufgabenplanung.
WAS ES TUT
Genau dasselbe wie der PostToolUse-Hook: die Arbeitsfunktion aus
auto_push.py, unter derselben Sperre. Der Umfang steht in der .gitignore
des Vault-Roots, nicht hier.
1. Genau dasselbe wie der frühere PostToolUse-Hook: die Arbeitsfunktion
aus auto_push.py, unter derselben Sperre. Der Umfang steht in der
.gitignore des Vault-Roots, nicht hier.
2. Danach, noch unter der Sperre, spiegelt werkzeuge_spiegel.py den
committeten Stand von .vault-tools/ und .claude/ in das öffentliche
Repo claude-werkzeuge. Scheitert Schritt 1, entfällt Schritt 2.
WAS ES MELDET
Jeder Lauf schreibt eine Zeile nach lauf.log im selben Ordner — auch ein
Lauf ohne Änderung. Eine Protokolldatei, die nur bei Erfolg schreibt,
lässt sich von einer nicht gestarteten Aufgabe nicht unterscheiden, und
genau das war am 2026-09-07 beim Depotbericht das Problem.
Jeder Lauf schreibt eine Zeile je Schritt nach lauf.log im selben Ordner,
auch ein Lauf ohne Änderung. Eine Protokolldatei, die nur bei Erfolg
schreibt, lässt sich von einer nicht gestarteten Aufgabe nicht
unterscheiden, und genau das war am 2026-09-07 beim Depotbericht das
Problem.
Exit 0: gepusht oder nichts zu tun. Exit 1: Befund, Text steht im
Protokoll. Die Aufgabenplanung zeigt den Code als „Letztes Ergebnis".
Exit 0: gepusht oder nichts zu tun, in beiden Schritten. Exit 1: Befund in
einem Schritt, Text steht im Protokoll. Die Aufgabenplanung zeigt den Code
als „Letztes Ergebnis".
"""
from __future__ import annotations
@@ -37,10 +43,10 @@ PROTOKOLL = HIER / "lauf.log"
MAX_PROTOKOLL_ZEILEN = 400
def lade_hook():
spec = importlib.util.spec_from_file_location("auto_push", HIER / "auto_push.py")
def lade(name: str):
spec = importlib.util.spec_from_file_location(name, HIER / f"{name}.py")
if spec is None or spec.loader is None:
raise RuntimeError(f"auto_push.py nicht ladbar: {HIER / 'auto_push.py'}")
raise RuntimeError(f"{name}.py nicht ladbar: {HIER / f'{name}.py'}")
modul = importlib.util.module_from_spec(spec)
spec.loader.exec_module(modul)
return modul
@@ -58,9 +64,40 @@ def schreibe(zeile: str) -> None:
sys.stdout.write(text)
def vault_push(hook, wurzel: Path) -> int:
try:
vorher = hook.git(wurzel, "rev-parse", "HEAD").strip()
hook.arbeite(wurzel)
nachher = hook.git(wurzel, "rev-parse", "HEAD").strip()
except hook.GitFehler as fehler:
schreibe(f"BEFUND {fehler.kopf} | {' '.join(fehler.rumpf.split())[:400]}")
return 1
except Exception as fehler: # noqa: BLE001
schreibe(f"BEFUND unerwarteter Abbruch: {type(fehler).__name__}: {fehler}")
schreibe(" " + " ".join(traceback.format_exc().split())[:400])
return 1
if vorher == nachher:
schreibe(f"ok nichts zu tun, HEAD {nachher[:8]}")
else:
schreibe(f"ok gepusht, HEAD {vorher[:8]} -> {nachher[:8]}")
return 0
def werkzeuge_spiegeln(wurzel: Path) -> int:
try:
spiegel = lade("werkzeuge_spiegel")
status, text = spiegel.spiegele(wurzel)
except Exception as fehler: # noqa: BLE001 - SpiegelFehler und jeder Absturz sind Befunde
schreibe(f"BEFUND werkzeuge: {type(fehler).__name__}: {' '.join(str(fehler).split())[:400]}")
return 1
schreibe(f"ok werkzeuge {status}, {text}")
return 0
def main() -> int:
try:
hook = lade_hook()
hook = lade("auto_push")
except Exception as fehler: # noqa: BLE001
schreibe(f"BEFUND auto_push.py nicht ladbar: {type(fehler).__name__}: {fehler}")
return 1
@@ -74,25 +111,12 @@ def main() -> int:
return 0
try:
vorher = hook.git(wurzel, "rev-parse", "HEAD").strip()
hook.arbeite(wurzel)
nachher = hook.git(wurzel, "rev-parse", "HEAD").strip()
except hook.GitFehler as fehler:
schreibe(f"BEFUND {fehler.kopf} | {' '.join(fehler.rumpf.split())[:400]}")
return 1
except Exception as fehler: # noqa: BLE001
schreibe(f"BEFUND unerwarteter Abbruch: {type(fehler).__name__}: {fehler}")
schreibe(" " + " ".join(traceback.format_exc().split())[:400])
return 1
if vault_push(hook, wurzel) != 0:
return 1
return werkzeuge_spiegeln(wurzel)
finally:
hook.gib_sperre_frei(deskriptor, sperre)
if vorher == nachher:
schreibe(f"ok nichts zu tun, HEAD {nachher[:8]}")
else:
schreibe(f"ok gepusht, HEAD {vorher[:8]} -> {nachher[:8]}")
return 0
if __name__ == "__main__":
try: