diff --git a/Brewfile.work b/Brewfile.work index c2b49520..7b475322 100644 --- a/Brewfile.work +++ b/Brewfile.work @@ -50,7 +50,6 @@ brew "btop" brew "certifi" # Manage your dotfiles across multiple diverse machines, securely brew "chezmoi" -brew "defuddle" # Cross-platform make brew "cmake" # Linux virtual machines @@ -63,11 +62,12 @@ brew "coreutils" brew "curl" # Play, record, convert, and stream select audio and video codecs brew "ffmpeg" -brew "whisper-cpp" # Package compiler and linker metadata toolkit brew "pkgconf" # Duplicate file utility brew "czkawka" +# Extract article content and metadata from web pages +brew "defuddle" # Secure runtime for JavaScript and TypeScript brew "deno" # Tool for exploring each layer in a docker image @@ -122,16 +122,18 @@ brew "ghostscript" brew "git-delta" # Git extension for versioning large files brew "git-lfs" +# Turn any Git repository into a prompt-friendly text ingest for LLMs +brew "gitingest" # Interactive command-line tool for using emoji in commit messages brew "gitmoji" # Open source programming language to build simple/reliable/efficient software -brew "gitingest" brew "go" -brew "googleworkspace-cli" # Stricter gofmt brew "gofumpt" # Language server for `golangci-lint` brew "golangci-lint-langserver" +# CLI for Drive, Gmail, Calendar, Sheets, Docs, Chat, Admin, and more +brew "googleworkspace-cli" # Go Language's command-line interface for database migrations brew "goose" # Human friendly `go test` runner diff --git a/dot_agents/skills/listen-later/SKILL.md b/dot_agents/skills/listen-later/SKILL.md new file mode 100644 index 00000000..1d6cfced --- /dev/null +++ b/dot_agents/skills/listen-later/SKILL.md @@ -0,0 +1,66 @@ +--- +name: listen-later +description: Convert an article, newsletter, or document into a short Kokoro-narrated audio read-up and upload it as a private episode to the user's "📥 Listen Later" Spotify show. ONLY trigger on explicit phrases like "listen later", "read-up", "save as audio for the commute", "add to my listen-later feed". Do NOT trigger on generic summarize, TTS, save-to-spotify, podcast, or cover-art requests — those route to the `save-to-spotify` skill. +--- + +# Listen Later + +Opinionated pipeline: arbitrary text → Kokoro `af_heart` audio → private episode in the **📥 Listen Later** Spotify show. + +For voice cloning, multilingual, custom cover art, or full podcast production, stop and use `save-to-spotify` directly — this skill is intentionally rigid. + +## Defaults (do not ask unless user overrides) + +| | | +|---|---| +| Voice | Kokoro `af_heart`, 1.0× (`kokoro` on PATH) | +| Length | **Mode-dependent** — see below | +| Show | `📥 Listen Later` (must already exist; resolve URI via `save-to-spotify --json shows`) | +| Cover | Reuse show cover for the episode (no per-episode art) | +| Timeline | Chapters only — no images, no link companions | +| Chapter rule | Every chapter ≥30s (Spotify rejects too many short ones). Consolidate adjacent segments into chapters after rendering. First chapter MUST start at `0`. | + +## Mode selection (infer from the user's words, do not ask) + +- **Verbatim mode** — default when the user says *"read-up"*, *"save to listen later"*, *"add to my queue"*, or just pastes text. Narrate the **full text**, lightly cleaned for TTS (strip markdown / hashtags / emojis / URLs, expand abbreviations, em dash → hyphen). Do NOT cut content. Length follows the source: ~150 wpm → a 1500-word article becomes ~10 minutes. +- **Summarize mode** — only when the user says *"summarize"*, *"TL;DR"*, *"short version"*, or *"key points"*. Pick target length from source complexity: + + | Source | Target | + |---|---| + | Tweet thread / short blog post (<800 words) | 1–2 min | + | Newsletter / medium article (800–3000 words) | 3–5 min | + | Long-form essay / report / paper (>3000 words) | 5–8 min | + | Dense technical / multi-topic source | bias to the longer end | + + Within the target, write 6–12 declarative segments preserving the source's structure 1:1. + +Segment count rule of thumb: ~30–60 seconds of speech per segment. + +## Interview (one round, then proceed) + +Confirm only: **episode title** (propose one). Skip everything else. + +## Flow + +1. **Preflight**: `save-to-spotify --json auth status` and `which kokoro`. Resolve show URI from the shows list. +2. **Script**: 6–10 declarative segments, links stripped, abbreviations expanded for TTS, em dashes → hyphens. +3. **Render**: `kokoro -t "" -o seg_NN.wav` per segment. +4. **Convert**: each WAV → MP3 at `-ar 44100 -ac 1 -b:a 192k`. +5. **Silence**: `silence_300.mp3` between segments, `silence_600.mp3` as outer pad. +6. **Concat**: `pad + seg + (gap + seg)... + pad`, **re-encoded** (no `-c copy`). +7. **Normalize**: `ffmpeg -i raw.mp3 -af loudnorm episode.mp3`. +8. **Chapters**: cursor walks the actual MP3 durations. Force first chapter to `start_time_ms: 0`. Then merge adjacent segments until every chapter is ≥30s — typically ends up at 3–5 chapters for a 3-min episode. +9. **Description**: short HTML — one intro paragraph, `