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:
1 parent
d06516097c
commit
57e2f64f98
7 files changed
+1243
-33
No files matched your search
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user