EZO Watcher ist eine Alarmwand und ein Pager, der direkt im Projekt des Benutzers installiert wird: Konfiguration als Code in .watcher/, ein lokaler Node-Prozess, kein Konto. Deine Aufgabe ist die vollständige, geprüfte Installation – keine Liste von Vorschlägen.
Die CLI ist die Quelle der Wahrheit. Jedes Thema unten wird daraus ausgegeben: watcher skills <topic> (Themen: install, discover, sources, channels, hosting, cloudflare, netdata, operate, fix, telemetry), oder lies references/<topic>.md neben dieser Datei. Führe jeden Befehl als watcher <verb> aus, niemals das nackte Wort (doctor kollidiert mit dem eigenen /doctor des Host-Agenten).
CLI installieren
CI=1 npm_config_yes=true npm i -g ezo-watcher
watcher --version
Keine globale Installation: npx -y ezo-watcher <verb> führt dieselbe CLI aus. Aus einem Checkout: npm ci && npm run build && npm link.
Node 24+. Vollständige Details, einschließlich der Installation des neuesten Hauptzweigs von GitHub: watcher skills install.
Der Ablauf
Wenn .watcher/ bereits existiert, führe zuerst watcher doctor --json und watcher scan --json aus und füge dann nur das hinzu, was das Ranking als fehlend bezeichnet; initialisiere nicht über eine funktionierende Installation hinweg neu.
- Init.
watcher initim Projektstamm. Idempotent, fragt nie nach; schreibt.watcher/config.json,.watcher/.env(0600),.watcher/data/, ignoriert die letzten beiden im Git, wählt einen freien Port ab 7717, gibt eine erste Doctor-Zusammenfassung aus. - Scan.
watcher scan --json→{signals, suggestedCommands}. In einer kleinen, manuell beschrifteten Stichprobe fand der Prototyp 15 von 19 HTTP/TLS-Punkten, aber nur 2 von 10 Stille-Punkten (watcher skills discover): Behandle seine Befehle als Kandidaten, führe dann den untenstehenden Stille-zuerst-Durchlauf durch, indem du den Code liest. - Wähle nach dem Ranking (nächster Abschnitt). Eine Quelle pro echtem Punkt; erfinde niemals eine Quelle, um grün auszusehen.
- Hinzufügen. Für jede ausgewählte Quelle:
watcher add <kind> --id <id> … --found-at <file:line> --read "<was es beweist>". Die Optionen--found-at/--readsind Herkunftsnachweise, undwatcher doctorwarnt ohne sie.--dry-runzeigt eine Vorschau. Dann ein Kanal:watcher add channel <type> --id <id> …(siehewatcher skills channels). Wenn keine Anmeldedaten verfügbar sind – eine box ohne Benutzeroberfläche, kein Anbieterkonto, ein Benutzer, der keinen Pager gewählt hat – füge den anmeldeinformationsfreien Fallback hinzu:watcher add channel file --id local: Es schreibt eine JSON-Zeile pro Benachrichtigung unter.watcher/data/und ist ein echter, testbarer Kanal, kein Platzhalter.watcher add … --replaceüberschreibt eine bestehende ID;watcher rm <id>entfernt eine. - Doctor-Schleife.
watcher doctor --json; wennok:false, behebe den erstenfailüber dessennextund führe es erneut aus. Wennchannel.missingwarnt und der Benutzer möchte, dass ein Telefon klingelt, führe jetzt den Kanal von Schritt 8 aus und komme zurück. Exit 0 ist bestanden, 1 ist fehlgeschlagen, 64 ist Nutzungsfehler. - Ausführen.
watcher run --detach(oderwatcher service install, damit es einen Neustart überlebt). Dannwatcher doctor --live --json, um den laufenden Server zu lesen. - Beweisen.
watcher doctor --live --prove --jsonausführen, bis es{"ok": true, "live": true}zurückgibt.--proveverschiebt den eigenen Messwert jeder Quelle über ihren Schwellenwert und schlägt fehl, es sei denn, die Regel schlägt tatsächlich um (source.assertion-not-red; eine nichtssagende http-probe-Behauptung schlägt fehl mitsource.assertion-vacuous): Eine http-probe-Antwort wird verändert, ein Heartbeat wird nach einem verpassten Durchlauf plus seiner Gnadenfrist ausgewertet, ein Host-Messwert wird über seine Festplatten-/Speicher-/Lastschwellenwerte verschoben, eine tcp-Verbindung schlägt fehl, ein Ablaufdatum fällt inpageDays. Eine Art, deren Alarm das ist, was ihr Sender meldet (grafana, vmalert, sentry, netdata, feed, webhook), ist ein benanntersource.prove-unsupported-Sprung, niemals ein Fehler. Wenn das Projekt keinen Server und keinen geplanten Job hat, fügewatcher add host --id hosthinzu – die Maschine selbst, lokal gelesen ohne installierte Software – und beweise es. Nur ein Projekt mit keinem Server, keinem geplanten Job und keinem zu überwachenden Host führtwatcher doctor --no-runtime-surface --jsonaus →{"ok": true, "live": false, "reason": "no-runtime-surface"}, klar gemeldet; eine konfigurierte Quelle gewinnt immer über--no-runtime-surface(der Bericht warnt danndoctor.no-runtime-surface-ignored). Rufe eine nicht bewiesene Installation nicht abgeschlossen. - Alarmieren. Füge einen Kanal hinzu und führe
watcher test-alertaus; bestätige, dass es auf dem relevanten Gerät angekommen ist. Fehlende Anmeldedaten sind ein benannter Sprung, niemals ein Bestehen. - Hosting (optional). Die Leiter ist lokal → Dienst → Docker/VPS → Cloudflare Tunnel (Standard für "mit meinem Cloudflare-Key hosten") → Container Beta.
watcher skills hosting,watcher skills cloudflare. - Installiere den Skill für das nächste Mal.
watcher skills install --target all --dir .schreibt es in das Projekt. Führe in Claude Code anschließend/reload-skillsaus – ein Skills-Verzeichnis auf oberster Ebene, das mitten in der Sitzung erstellt wurde, wird sonst nicht erkannt.
Am zweiten Tag – die Wand lesen, bestätigen, kommentieren, stummschalten, parken, erneut prüfen – ist watcher skills operate.
Wenn etwas kaputt geht
Ein Vorfall ist eine Behauptung mit Beweisen, keine Benachrichtigung. Der vollständige Ablauf ist watcher skills fix:
watcher status --brieffür eine Zeile, oderwatcher incidents --output jsonfür die Schlüssel (MCP:watch_state, dannlist_incidents).get_fix_context { key }(CLI:watcher incident <key> --fix-context): Der Vorfall, die Quell- und Zielkonfiguration mit Anmeldedaten als Umgebungsvariablennamen, die Regelbehauptungen und diejenige, die fehlgeschlagen ist, wo der Endpunkt gefunden wurde, die letzte gute neben der letzten schlechten Beobachtung, der genaue Befehl, der die Prüfung erneut ausführt, undnext.- Reproduziere es mit diesem Befehl. Ein Schwellenwert ist keine Ursache.
- Behebe die Ursache, stelle erneut bereit oder starte neu, damit die Behebung wirksam wird.
verify_fix { key, by }(CLI:watcher recheck <key> --wait): Es prüft erneut, wartet auf die frische Antwort der Quelle und zeichnet die Bestätigung auf, wenn alle Alarme gelöst sind – oder sagt, welche Behauptung immer noch fehlschlägt, damit die Behebung repariert werden kann. Markiere einen Vorfall niemals als gelöst, bevor eine erneute Prüfung grün ist;parkist für eine behobene Lösung, die zusammengeführt, aber noch nicht live ist,confirm_resolutionfür eine, die die Quelle bereits geschlossen hat.comment, was du auf dem Weg gefunden hast. Eine stille Behebung hinterlässt der nächsten Person nichts.
Ranking: Was überwacht werden soll, in der Reihenfolge
- Die tiefste Bereitschaftsroute des Produktionsprozesses, die ein Feld behauptet, das sich ändert, wenn eine Abhängigkeit ausfällt. Niemals ein hartcodiertes
{"ok": true}/{"status": "ok"}– das ist Liveness, und es kann für den relevanten Fehler nicht rot werden. - Ein Bereitschaftsprobe, die die Plattform bereits deklariert:
/readyz,/health/ready, ein composehealthcheck, ein KubernetesreadinessProbe, ein Fly/Railway/Render Health-Pfad. Spiegele es von außen mit demselben Pfad und Port. - Kein Server → ein Heartbeat pro geplantem Job. Stille ist das Signal.
- Kein Server und kein geplanter Job →
watcher add host --id host(Last, Speicher, freier Speicherplatz, optional eine PID-Datei; nichts installiert) und beweise es. Nur kein Server, kein geplanter Job und kein zu überwachender Host →watcher doctor --no-runtime-surface --json, meldeNO_RUNTIME_SURFACE, stoppe. Eine konfigurierte Quelle gewinnt immer über--no-runtime-surface. Erfinde niemals eine Quelle. - Dann die Systeme, die bereits existieren – Sentry, Grafana, Netdata, ein eingehender Sender – anmeldeinformationsgebunden. Fehlende Anmeldedaten sind ein benannter Sprung mit einem Code und einem
next, niemals ein stilles Bestehen.
Stille zuerst (die Scan-Ergebnisse übersehen diese)
Lies den Code für diese sechs Klassen; jede wird zu einem watcher add heartbeat oder einem watcher add webhook --stale-after:
- Zeitpläne, die zur Installationszeit generiert werden – Heredocs in
install.sh/setup.*, die eine plist, Unit oder crontab schreiben,launchctl load,systemctl enable,crontabschreibt. - Launchd/systemd/cron zur Laufzeit erstellt –
.plist-Vorlagen,OnCalendar=,StartInterval,KeepAlive,node-cron,schedule(,setIntervalum einen Job, celery beat. Ein Heartbeat pro Job (--every/--schedule+--grace); N Jobs bedeuten N Quellen. - Pull-Queue-Worker –
worker,queue,bullmq,sqs,claim,lease,dequeue. Fehler ist die Warteschlangentiefe oder kein Fortschritt, kein Port: Sende einen Heartbeat auf dem Erfolgspfad oder schiebe einenchecks.list-Eintrag mitstate: failing. - Veralterung in der eigenen Konfiguration des Produkts –
staleAfterSec,presenceTtlSec,maxAge,ttl,refreshInterval,lastRunAt. Erzwinge dasselbe Fenster:watcher add webhook --id <sender> --token-env <ENV> --stale-after-sec <sec>. - Beschreibbarkeit des Statusverzeichnisses –
mkdir,state/,data/, sqlite, Lock-Dateien. Sende nur nach einem erfolgreichen Schreibvorgang; ein bloßestest -wist keine Quelle. - Abhängigkeitsendpunkte, die als Codekonstanten gehalten werden –
process.env.X ?? "https://…", Host:Port-Literale, gRPC/ClickHouse/LLM-Basen.watcher add http-probe(HTTPS GET) oderwatcher add tcp-probe --host --port, mit--found-atder Konstanten.
Setze den Ping auf den Erfolgspfad des Jobs – POST /ingest/heartbeat/<id>, mit /fail für einen fehlgeschlagenen Durchlauf und /<exit-code> für einen bestimmten. watcher add heartbeat prägt das Token in .watcher/.env (0600), wenn die benannte Variable noch keinen Wert hat, oder schreibt das übergebene --secret-value und gibt die genauen Zeilen aus ($NIGHTLY_TOKEN unten ist der Name, den es für --id nightly wählt; ein übergebenes --token-env ist die Variable, die es stattdessen ausgibt):
set -a; . .watcher/.env
curl -fsS -m 10 "${WATCHER_URL:-http://127.0.0.1:7717}/ingest/heartbeat/<id>?token=$NIGHTLY_TOKEN" # nach einem erfolgreichen Durchlauf
curl -fsS -m 10 "${WATCHER_URL:-http://127.0.0.1:7717}/ingest/heartbeat/<id>/fail?token=$NIGHTLY_TOKEN" # nach einem fehlgeschlagenen Durchlauf
curl -fsS -m 10 "${WATCHER_URL:-http://127.0.0.1:7717}/ingest/heartbeat/<id>/<exit-code>?token=$NIGHTLY_TOKEN" # mit dem Exit-Code des Jobs
Ein Collector, der kein einzelner Job ist, pusht stattdessen seine gesamte Liste: POST /ingest/<source> mit {"checks":{"list":[{"id":"…","service":"…","state":"ok","lastRunAt":"…"}]}} – die vollständige Form und Zustände sind in watcher skills sources.
Wenn eine Health-Route nur ein Literal zurückgibt, finde eine tiefere oder füge eine hinzu: GET /readyz → 200 {"db":{"ok":true}}, wenn die Abhängigkeit antwortet, 503 {"db":{"ok":false}}, wenn nicht. Das Bearbeiten des Projekts des Benutzers ist erlaubt – du bist der Agent, der die Datei schreibt. Beantworte dann das sich ändernde Feld, niemals {"ok":true}.
Regeln
- Richte eine Quelle niemals auf das eigene
/healthzdes Watcher –source.self-probelehnt es ab. - Eine Quelle muss etwas behaupten, das umkippen kann. Ein bloßes 200 ist nur Liveness (
source.bare-200);watcher doctor --live --proveist das Tor,--found-atist eine Warnung (source.untraced). - Geheimnisse sind Umgebungsvariablennamen in der Konfiguration und Werte nur in
.watcher/.env. Lies niemals.env-Werte während des Scannens, committe niemals.watcher/.envoder.watcher/data/. - Ein funktionierender Kanal ist besser als fünf konfigurierte. Beweise es mit
watcher test-alert. Gar keine Anmeldedaten?watcher add channel file --id localund beweise das: Die Datei ist ein echter Kanal, und fehlende Anmeldedaten sind ein benannter Sprung, niemals ein Bestehen. - Melde, was du bewiesen hast – hinzugefügte Quellen, Befehlsausgabe und jeden benannten Sprung. Wenn der Agent eine Sprosse nicht abschließen kann (fehlende Anmeldedaten, keine Zone), sage in einer Zeile, welche und warum.
Mehr Details, wenn ein Schritt sie benötigt: watcher skills discover (vollständiger Signalkatalog und die Stille-Checkliste), watcher skills sources (jede Art, Flags, Beispiele), watcher skills channels, watcher skills hosting, watcher skills cloudflare, watcher skills netdata, watcher skills operate (MCP-Werkzeuge und Vorfall-Triage).