docs: talk-Skill mit Opt-in-Etikette, AGENTS-Snippet, README Installation/Release/Toast

skills/talk/SKILL.md: wann sprechen (nur auf Trigger in der Session oder
Standing-Order in der AGENTS.md, session-sticky bis Widerruf), wann nicht,
was eine gute Ansage ist (Status · nächster Schritt · wofür der Nutzer
gebraucht wird; Beispiele gut/schlecht), Umgang mit muted/discarded/
--now/Prioritäten, Pitfalls. AGENTS-snippet.md: der Block für Projekt-
AGENTS.md.

README: Installation (Release-Asset mit Prüfsumme, Nix-Flake, go install),
Skill-Abschnitt, Toast als echte Desktop-Benachrichtigung, Release-Ablauf
und nix build in „Entwicklung". Spec-Nachtrag: Release ohne GoReleaser,
Notifications ohne beeep.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
m3ta-chironandClaude Fable 5.1 committed 2026-10-24 10:37:46 +02:00
1 parent 423377bade
commit 2e2bc27acf
4 files changed
+152 -3

No files matched your search

+13
View File
@@ -0,0 +1,13 @@
# Standing-Order für talk (in die AGENTS.md des Projekts kopieren)
```markdown
## Voice notifications (talk)
Sprich per `talk "<1–2 Sätze>"`, wenn eine Aufgabe länger als ~30 s lief und
fertig ist, wenn du blockiert bist und mich brauchst (dann `talk --now`),
oder wenn etwas fehlgeschlagen ist. Inhalt: Status, nächster Schritt, wofür
du mich brauchst — nie die Antwort selbst. `muted` und `discarded` sind
meine Entscheidung: respektieren, nicht umgehen.
```
Ohne diesen Block (und ohne Aufforderung in der Session) spricht ein Agent
nicht — talk ist striktes Opt-in.
+86
View File
@@ -0,0 +1,86 @@
---
name: talk
description: "Use when the user has asked for voice notifications — explicitly in this session or as a standing order in the project's AGENTS.md — and (1) a long-running task finishes (build, tests, deploy, data job), (2) the agent is blocked and needs the user's decision or approval, (3) something failed that the user should know about now. Triggers: talk, say it, sag Bescheid, melde dich, notify me, let me know when done, voice, Ansage. Strict opt-in: never speak without the user's trigger or standing order."
compatibility: opencode, claude-code, codex
---
# talk — Voice-Notifications für Agenten
`talk "Build fertig"` spricht eine kurze Ansage über den lokalen talk-Daemon
(Queue, Rate-Limit, Mute, Ruhezeiten). Ein Binary, startet den Daemon beim
ersten Aufruf selbst. Nichts zu installieren außer `talk` im PATH.
## When to Use — striktes Opt-in
Sprich **nur**, wenn eines davon gilt:
1. Der Nutzer hat es in dieser Session verlangt („sag Bescheid, wenn der
Build durch ist", „melde dich, wenn du mich brauchst"). Das gilt dann
**session-sticky bis Widerruf** — nicht bei jeder Antwort neu fragen.
2. Die AGENTS.md des Projekts enthält eine Standing-Order (siehe
`AGENTS-snippet.md`).
Dann sprich bei: Abschluss langer Aufgaben (> ~30 s), Blockern, die den
Nutzer brauchen (Entscheidung, Freigabe, Passwort), Fehlern, die sofort
zählen.
## When NOT to Use
- Ohne Trigger oder Standing-Order. Nie „von sich aus plappern".
- Für kurze Antworten, Zwischenstände, jede Tool-Ausgabe.
- Um die Langantwort vorzulesen. Der Daemon kürzt bei 400 Zeichen —
aber Ziel sind 1–2 Sätze.
- Wenn `talk` `muted` oder `discarded: quiet_hours` zurückgibt: Das ist
die Entscheidung des Nutzers. Nicht umgehen, nicht `--now` nachschieben.
## Was eine gute Ansage ist
**Status · nächster Schritt · wofür der Nutzer gebraucht wird.** Nie die
Antwort selbst.
| gut | schlecht |
| --- | --- |
| „Tests grün, PR ist bereit zum Review." | „Ich habe die Tests ausgeführt und alle 247 Tests sind erfolgreich durchgelaufen, außerdem habe ich …" |
| „Deploy fehlgeschlagen, Code 1. Ich brauche deine Entscheidung zur Migration." | „Fehler." |
| „Brauche dein sudo-Passwort im Terminal." | (stumm warten) |
Sprache: in der Sprache des Nutzers schreiben; talk erkennt de/en selbst
(`--lang` erzwingt).
## Usage
```bash
talk "Tests grün, PR bereit zum Review." # non-blocking, Item-ID auf stdout
talk --wait "Deploy fertig." # erst zurückkehren, wenn gesprochen
talk --priority high "Build rot, Code 2." # darf das Rate-Limit verletzen
talk --now "Ich brauche dich: Freigabe im Terminal." # vor die Queue, auch in der Ruhezeit — nur für Blocker
echo "Import fertig" | talk # stdin geht auch
talk wrap -- make test # Befehl ausführen, Erfolg/Misserfolg + Dauer ansagen
```
Antworten auf stdout: eine Item-ID (angenommen), `muted`, oder
`discarded: rate_limit|quiet_hours`. Exit 0 in allen drei Fällen — ein
Verwurf ist kein Fehler. Exit ≠ 0 nur bei echten Problemen (kein Text,
ungültige Flags, Config kaputt); dann nicht wiederholen, sondern dem
Nutzer sagen.
## Etikette gegenüber dem Daemon
- **Rate-Limit** (Default 1 Ansage / 30 s): `normal` parkt, `low` wird
verworfen, `high` darf durch. Nicht alles ist `high`.
- **`--now`** ist für Blocker, die den Nutzer brauchen — nicht für
„fertig". Es bricht aus Ruhezeit und Rate-Limit aus; das ist eine
bewusste Störung.
- **Mute und Ruhezeit** sind Nutzerentscheidungen. Respektieren, nicht
umgehen. Der Daemon erzwingt sie ohnehin.
- Mehrere Dinge gleichzeitig? **Eine** Ansage, die zusammenfasst — nicht
fünf.
## Pitfalls
- `talk` nicht gefunden → nicht improvisieren (kein `say`, `espeak`,
`notify-send`). Dem Nutzer sagen, dass talk fehlt.
- Kein Ton beim Nutzer → `talk doctor` schlagen vorschlagen; nicht selbst
an Keys oder Config drehen.
- Keys kommen aus `TALK_ELEVENLABS_KEY` / `TALK_OPENAI_KEY` (Env). Nie in
Dateien schreiben, nie in Ansagen oder Logs ausgeben.