Files
talk/.superpowers/sdd/plan/task-1-report.md
T

5.7 KiB

Task 1 Report: Repo-Skeleton & CI-Backbone

Status: DONE Branch: feat/v1 (Basis c8f3902, nie gepusht) Commits:

  • 24dfe4d chore: bootstrap go module, license, readme and package skeleton
  • 33b97a5 feat(cli): add subcommand dispatch, --version and stub commands
  • fa4f193 ci: add gitea actions test workflow (vet, gofmt, test, build)

Implementiert

Go-Modul & Layout

  • go.mod: module code.m3ta.dev/m3tam3re/talk, go 1.26.8 (aktuelle stabile Version des Dev-Hosts; CI liest sie per go-version-file: go.mod). Keine externen Dependencies, keine go.sum.
  • Verzeichnisgerüst komplett:
    • cmd/talk/ (3 Dateien), cmd/talkd/ (1 Datei)
    • internal/{provider,queue,audio,notify,config,api,langdetect}/doc.go — jeweils nur Package-Doku mit Zweck + Task-Verweis, kein toter Code.

CLI (cmd/talk/)

  • main.go: ldflags-Variablen version = "dev", commit = "" verdrahtet (Paket main, injizierbar per -X main.version=… -X main.commit=…); main() delegiert an run() mit injizierbaren Writer/Return-Code-Design.
  • cli.go: datengetriebene Befehlstabelle (alle 10 Subcommands aus der bindenden CLI-Surface: say, wrap, mute, unmute, status, cancel, voices, test, doctor, setup) + Dispatch:
    • talk "Text" → Default-Pfad, mappt auf say (Stub vermeldet talk say is not implemented yet).
    • talk <Befehl> → Subcommand-Stub: non-zero (Exit 1) + klare not implemented yet-Meldung auf stderr.
    • --version → talk version dev (bzw. talk version <v> (<commit>) wenn Commit injiziert — manuell verifiziert: talk version 1.0.0-test (abc1234)).
    • --help / help [Befehl] / <Befehl> --help → Hilfe aus derselben Tabelle generiert (keine Drift zwischen Hilfe und Dispatch möglich).
    • say-Flags gemäß Spec bereits registriert und dokumentiert: --wait, --now, --priority, --voice, --lang, --provider (gelten auch für den Default-Pfad talk "Text" --wait …).
    • Exit-Code-Konvention: 0 = OK (inkl. help/version), 1 = Stub/Fehler, 2 = Benutzungsfehler (unbekannte Flags, Aufruf ohne Argumente).
    • Erweiterbar für Task 09 (Bubble Tea): neuer Eintrag in commands bzw. austauschbares register/Run-Verhalten, ohne run()-Dispatch-Umbau.

Daemon-Stub (cmd/talkd/main.go)

Startet, loggt eine Zeile (talkd: Platzhalter — Daemon-Implementierung folgt in Task 04), beendet mit Exit 0. Verifiziert.

CI (.gitea/workflows/test.yml)

Push + PR; Steps: checkout@v4 → setup-go@v5 (go-version-file: go.mod) → go vet ./... → gofmt-Check (gofmt -l ., fail bei nicht-leerem Output) → go test ./... → go build ./.... YAML validiert (nixpkgs-yq-Parser).

Meta

  • .gitignore: /talk, /talkd, .exe-Varianten, *.test, *.out, /dist/.
  • LICENSE: MIT, Copyright (c) 2026 m3tam3re.
  • README.md (deutsch): Zweck (1 Satz), Status WIP + Spec/Plan-Verweis, Befehlstabelle, say-Flags, Entwicklungs-/CI-Hinweise, Lizenz.

Getestet (Ergebnisse)

cmd/talk/cli_test.go — 9 Black-Box-Tests über die run()-Seam (in-process, kein Subprocess-Bedarf, alle extern beobachtbares Verhalten):

Test Assertion
TestHelpListetAlleSubcommands --help listet alle 10 Befehle (zeilenpräzise, hartkodierte Soll-Liste aus der Spec, nicht aus der Tabelle abgeleitet)
TestVersionDefault --version → Exit 0, exakt talk version dev\n
TestVersionStringMitCommit Commit-Injection → talk version dev (c0ffee1)
TestSubcommandStubs alle 10 Befehle: Exit non-zero, stderr enthält Befehlsnamen + not implemented yet, stdout leer
TestDefaultAufrufMapptAufSay talk "Hallo Welt" → talk say is not implemented yet
TestSayHelpZeigtFlags say --help zeigt alle 6 say-Flags
TestHelpSubcommand help + help mute → Exit 0, korrekte Hilfe
TestOhneArgumenteZeigtUsage nackter Aufruf → Usage auf stderr, Exit 2
TestUnbekanntesFlag --bogus → Exit 2 + Fehlermeldung

Vollständige Abnahme vor Commit und final auf dem Commit-Stand: gofmt -l . leer · go vet ./... grün · go test -count=1 ./... grün · go build ./... grün · Working Tree clean.

Manuelle Smoke-Tests: --version, --help, say --help, talk "Hallo Welt" (Exit 1), talk mute (Exit 1), talk --bogus (Exit 2), talkd (loggt, Exit 0), ldflags-Injection.

Self-Review

  • Vollständigkeit gegen Brief: jedes Punkt abgedeckt (Modul ✓, Gerüst ✓, Dispatch ✓, Version ✓, talkd ✓, CI ✓, .gitignore/LICENSE/README ✓, sinnvoller Test ✓, Conventional Commits ✓, kein Push ✓, .superpowers// .scratch/ unangetastet ✓).
  • YAGNI-Check: Say-Flags im Stub bewusst registriert — sie sind Teil der bindenden CLI-Surface und machen <Befehl> --help korrekt (Brief fordert „korrektes --help“); keine weiteren Vorab-Strukturen gebaut.
  • Test-Hygiene: nur extern beobachtbares Verhalten (Exit-Codes, stdout, stderr); keine Implementationsdetails; Spec-Liste hartcodiert als Drift-Wächter.

Concerns / Hinweise für Folgetasks

  1. Stdlib-flag-Parsing-Stil: Flags müssen vor dem Text stehen (talk --wait "Text", nicht talk "Text" --wait) — stdlib-Limitierung. Task 02 sollte das Parsing-Verhalten explizit festlegen.
  2. Nackter talk-Aufruf ist aktuell Benutzungsfehler (Exit 2); Task 02 ändert das ggf. zu stdin-Lesung (Kommentar im Code markiert die Stelle).
  3. --version nur auf Root-Ebene (talk --version); Subcommand-Flagsets kennen es nicht (talk say --version → Exit 2) — bewusst, Standard bei Subcommand-CLIs.
  4. .gitea/workflows/test.yml ist noch nie in echter Gitea-Runner-Umgebung gelaufen (Syntax validiert, Semantik nach bekannten Actions-Konventionen); erster echter Push zeigt es.