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:
1 parent
423377bade
commit
2e2bc27acf
4 files changed
+152
-3
No files matched your search
@@ -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.
|
||||
@@ -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.
|
||||
Reference in new issue
Block a user