name: chatto-plugin-update description: "Use when an installed Chatto plugin must catch up to its remote and the changes must go live in the running Hermes gateway." version: 1.2.0 author: Paul Klumpp license: MIT metadata: hermes:
tags: [chatto, plugin, update, git, gateway]
Eine installierte Chatto-Plugin-Instanz soll auf den Stand ihrer Quelle gebracht werden, und die Änderungen sollen im laufenden Hermes Gateway aktiv werden.
Der Remote steht hier bewusst nicht: er gehört der Installation, nicht dem
Plugin. git remote -v des Checkouts ist die Wahrheit, und für einen selbst
geklonten Checkout ist das ein privater Remote, den kein mitgeliefertes
Dokument kennen kann.
Nicht raten — die Fälle haben verschiedene Türen, und nicht jede lässt sich mit git bedienen. Genau eine Tür pro Fall; nie beide.
Zuerst feststellen, welche Art die Installation ist:
# 1) User-Install unter ~/.hermes/plugins/ (hermes plugins install)
ls -d ~/.hermes/plugins/chatto-platform \
~/.hermes/plugins/platforms/hermes-chatto-plugin 2>/dev/null
# 2) Gebündeltes Plugin im Hermes-Agent-Checkout (Source: bundled)
# Hermes-Agent legt es als Symlink in plugins/platforms/ ab.
ls -Ld /home/paul/dev2/chatto-stuff/hermes-agent/plugins/platforms/hermes-chatto-plugin 2>/dev/null
readlink -f /home/paul/dev2/chatto-stuff/hermes-agent/plugins/platforms/hermes-chatto-plugin 2>/dev/null
Den Befund mit der Liste abgleichen:
| Befund | Art | Tür (genau eine) |
|---|---|---|
~/.hermes/plugins/chatto-platform/ mit .git und Provenance-Zeile |
per hermes plugins install |
hermes plugins update chatto-platform |
~/.hermes/plugins/chatto-platform/ mit .git, ohne Zeile |
selbst geklont | einmalig hermes plugins adopt chatto-platform, danach hermes plugins update chatto-platform |
~/.hermes/plugins/platforms/hermes-chatto-plugin/ ohne .git |
Dateien kopiert (README Option B) | kein Pull möglich — der User muss neu kopieren oder klonen |
Symlink in hermes-agent/plugins/platforms/hermes-chatto-plugin → Git-Checkout (Source: bundled) |
gebündeltes Plugin / Dev-Checkout | git pull im Checkout-Ziel (s.u.) — kein hermes plugins update |
Im dritten Fall gibt es keinen Remote und kein git log: hermes plugins update
verweigert hier ("no .git directory"). Das ist keine Störung, sondern der
Zustand des Verzeichnisses — es zu umgehen hieße, den Zustand zu erfinden. Dem
User sagen, dass er die Dateien neu holen muss, und dann bei Schritt 4
weitergehen.
Im vierten Fall (gebündelt) ist hermes plugins update chatto-platform
keine Tür: das Plugin ist bundled, und hermes plugins update verweigert
bundled Plugins ("This command only works on downloaded plugins; bundled ones
can only be enabled or disabled"). Hier ist git pull im Checkout-Ziel die
einzige Tür. git pull und hermes plugins update nicht mischen — das
ist genau der Fehler, den dieser Skill vermeiden soll.
Statusbericht: erst fetchen, nie behaupten — VOR der Tür. Für die Zusammenfassung in Schritt 4 wird der alte Stand gebraucht, also vor dem Update abgreifen:
git -C "$REPO" fetch --all
git -C "$REPO" status -sb
git -C "$REPO" branch -avv
Aussagen wie „synchron" nur NACH einem fetch — status -sb ohne fetch zeigt
ahead/behind nur gegen den zuletzt bekannten Remote-Stand. Den alten Commit
aus branch -avv ablesen und festhalten, nicht raten.
hermes plugins update chatto-platform — es
zieht den Stand, verwirft veralteten Bytecode aus __pycache__, schreibt
die neue Revision in die Install-Metadaten und fragt nach, wenn der neue
Stand Capabilities mitbringt, die noch nicht freigegeben sind (fail closed:
ohne Antwort bleiben sie nicht freigegeben). Zwei Fälle lehnt es ab und
sagt es: ein gepinnter Checkout (dann hermes plugins install <quelle>
--force --ref <40-stelliger SHA>) und ein Verzeichnis ohne .git.
Ein Katalog-Install wird auf die geprüfte SHA zurückgesetzt, nicht
gepullt — deshalb hier ausdrücklich kein git pull.readlink -f-Ergebnis aus
Schritt 1) git pull (bzw. git pull --ff-only) auf dem aktuellen
Branch — für main ist das main. Damit werden die Änderungen in den
Checkout gezogen, den der laufende Hermes-Gateway über den Symlink liest.
Vendored Updates (chattolib) kommen als dist-info-Rename + RECORD-
Änderungen mit — normal, und über den Neustart hinaus ohne Handlungsbedarf.bash
git -C "$REPO" log <alter_stand>..<neuer_stand> # oneline
git -C "$REPO" log <alter_stand>..<neuer_stand> --stat # Datei-Umfang
<alter_stand> aus Schritt 2, <neuer_stand> aus Schritt 3 (der Revision,
die Hermes gemeldet hat, oder HEAD des Checkouts). Commits haben
ausführliche Messages — daraus eine nutzerverständliche Zusammenfassung
machen: WAS ändert sich für den Bot-Nutzer, nicht Implementierungsdetails.
Für jede Änderung eine Quelle angeben (Commit-Hash).Gateway-Neustart ANBIETEN (nie selbst ausführen): Plugin-Code-Änderungen werden erst nach einem Neustart des Hermes-Gateways aktiv — die laufende Session hält das alte Modul im Speicher.
/restart als Chat-Nachricht (Gateway-Slash-Command,
„Restart gateway after draining active runs"). Der User tippt es direkt im
Channel/DM. IMMER zuerst diesen Weg nennen./restart genügt.hermes gateway restart oder systemctl restart … aus einer
Bediener-Shell außerhalb des Gateway-Prozesses funktioniert — aber nur
dort. Aus einem Tool-Aufruf dieser Session heraus ist es derselbe
blockierte Fall. Bei benannten Profilen heißt der Unit
hermes-gateway-<profil>, nicht hermes-gateway.service.Nach dem Neustart verifizieren: Plugin-Tools live testen
(chatto_list_rooms via tool_call), im Log prüfen, dass der Adapter sauber
lädt.
git -C in JEDEM git-Kommando. git pull oder git log ohne -C trifft den
Checkout der Session, nicht den Plugin-Checkout.git fetch treffen —
ohne fetch ist der lokale Status wertlos.hermes plugins adopt nur einmal und nur bei einem selbst geklonten
Verzeichnis. Hat Hermes bereits eine Provenance-Zeile, lehnt der Befehl ab
("already has a provenance row") — das ist kein Fehler, sondern heißt: der
Fall greift nicht.bash -n skript.sh mit
hermes gateway restart darin wird abgelehnt — auch unter einem anderen
Dateinamen und auch als sh -n. chmod, mv und cp sind nicht betroffen.
Ein Skript also nicht an den Interpreter geben, um es zu prüfen: Inhalt mit den
Datei-Tools lesen. Es lohnt auch nicht, es umzubenennen — der Guard liest
Bytes, nicht Namen./dev/null (oder /dev/zero, /dev/fd/N) lässt der Guard
bewusst fehlschlagen. Das ist keine Störung, sondern das gewollte Verhalten.
Eine Umleitung nach > /dev/null in einer Shell-Datei ist davon nicht
betroffen — die wird maskiert.