← Commit history

Publish 1.0.0

John Lauer ·b55daabc0c ·4mo ago ·parent 4bcda93
6 files changed +111
SKILL.mdadded+57
@@ -0,0 +1,57 @@+---+name: im-driving+description: >+  Hands-free / drive-mode. The MOMENT the user signals they're driving or can't+  look at the screen, STOP writing text walls — narrate your answer ALOUD through+  the Adom Desktop TTS player (adom-tts). Read + apply this skill immediately on+  any hands-free phrase, and keep narrating every reply until they say they're done.+  TRIGGERS (invoke instantly on ANY of these, exact or paraphrased):+  "I'm driving", "I am driving", "while I drive", "while driving", "I'm in the car",+  "on the road", "hands free", "hands-free", "drive mode", "driving now",+  "read me", "read it to me", "read that back", "read me your last",+  "read me that", "read me the last", "read your last answer", "speak that",+  "say that out loud", "play it back", "play that", "narrate this", "talk to me",+  "I can't look at the screen", "can't read the screen", "can't see the screen".+metadata:+  type: reference+---++# I'm Driving — hands-free narration++When the user is driving, **your reply is AUDIO, not text.** Narrate it through+`adom-tts` (the Adom Desktop TTS player). Don't make them read.++## ⚠️ The one rule that makes it actually audible (the usual failure)++`adom-tts` defaults to a **hydrogen webview** player. If the user's window mode is+**pup**, that webview tab isn't open and **they hear NOTHING** — the clip+synthesizes, you think it played, and they get silence. So ALWAYS match the play+**surface** to their window mode:++```bash+# 1. Detect the surface+MODE=$(adom-cli hydrogen probe | python3 -c "import sys,json;print(json.load(sys.stdin).get('window_mode','hydrogen'))")+SURFACE=$([ "$MODE" = "pup" ] && echo pup || echo hydrogen)++# 2. Narrate to THAT surface+adom-tts say "This is the <thread> thread — <your spoken answer>" \+  --thread "<thread>" --play --surface "$SURFACE" --out /tmp/reply.mp3+```++## How to narrate well++- **Start with** "This is the `<thread name>` thread —" (all Claude threads share+  one player, so the user needs to know who's speaking). Also pass `--thread`.+- **Conversational + short.** No markdown, no code, no slugs/jargon read aloud.+- **Proactive.** While they're driving, narrate EVERY reply automatically — don't+  wait to be asked again.+- **Replay:** `adom-tts play last --surface "$SURFACE"`.+- **Confirm if it matters:** add `--wait` (blocks until the audio's `ended` event).+  If it times out, the surface was wrong — re-check `window_mode`.++## Why this skill exists++The hands-free capability lives in the `adom-tts` tool, but it was undiscoverable+(the `driving-*` skills are about driving *software*, not a car) and it silently+failed when the play surface didn't match the user's window mode. This skill is the+discoverable entry point + the surface-matching fix.
docs/shot.pngadded
⋯ 1 unchanged line ⋯
docs/shot.svgadded+15
@@ -0,0 +1,15 @@+<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="600" viewBox="0 0 1000 600">+  <rect width="1000" height="600" fill="#0d1117"/>+  <rect x="60" y="70" width="880" height="460" rx="12" fill="#161b22" stroke="#30363d" stroke-width="1.5"/>+  <circle cx="92" cy="100" r="7" fill="#ff5f56"/><circle cx="116" cy="100" r="7" fill="#ffbd2e"/><circle cx="140" cy="100" r="7" fill="#27c93f"/>+  <text x="500" y="105" fill="#8b949e" font-family="monospace" font-size="15" text-anchor="middle">im-driving — hands-free narration</text>+  <line x1="60" y1="128" x2="940" y2="128" stroke="#30363d" stroke-width="1.5"/>+  <text x="92" y="180" fill="#7ee787" font-family="monospace" font-size="18">$ # user says: "I'm driving — read me that"</text>+  <text x="92" y="224" fill="#79c0ff" font-family="monospace" font-size="18">$ adom-cli hydrogen probe  </text>+  <text x="92" y="252" fill="#c9d1d9" font-family="monospace" font-size="17">  window_mode = pup</text>+  <text x="92" y="300" fill="#79c0ff" font-family="monospace" font-size="18">$ adom-tts say "..." --play --surface pup</text>+  <text x="92" y="344" fill="#e6edf3" font-family="monospace" font-size="18">  🔊  Narrating to the pup player… </text>+  <text x="92" y="372" fill="#7ee787" font-family="monospace" font-size="18">  ✓ audible (surface matched window_mode)</text>+  <text x="92" y="452" fill="#f0883e" font-family="monospace" font-size="16">  default hydrogen surface → SILENT on pup. match it.</text>+  <rect x="92" y="476" width="14" height="22" fill="#58a6ff"/>+</svg>
install.shadded+6
@@ -0,0 +1,6 @@+#!/usr/bin/env bash+set -e+SKILL_DIR="${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/im-driving"+mkdir -p "$SKILL_DIR"+cp "$(dirname "$0")/SKILL.md" "$SKILL_DIR/SKILL.md"+echo "Installed im-driving skill to $SKILL_DIR"
package.jsonadded+30
@@ -0,0 +1,30 @@+{+  "schema_version": 1,+  "type": "skill",+  "slug": "im-driving",+  "title": "I'm Driving \u2014 hands-free narration",+  "brief": "When the user is driving, narrate replies aloud via adom-tts (to the correct pup/hydrogen surface).",+  "version": "1.0.0",+  "description": "Hands-free / drive-mode entry skill. On any 'I'm driving' / 'read me' signal, narrate the answer through the Adom Desktop TTS player instead of text \u2014 and match the play surface to the user's window_mode so it's actually audible.",+  "license": "MIT",+  "dependencies": {+    "adom/adom-tts": "*"+  },+  "scripts": {+    "install": "./install.sh",+    "uninstall": "./uninstall.sh"+  },+  "tags": [+    "skill",+    "tts",+    "accessibility",+    "hands-free",+    "voice",+    "driving"+  ],+  "hero": {+    "headline": "I'm Driving",+    "subhead": "Hands-free: Claude narrates the answer aloud \u2014 to the surface you can actually hear.",+    "screenshot": "docs/shot.png"+  }+}\ No newline at end of file
uninstall.shadded+3
@@ -0,0 +1,3 @@+#!/usr/bin/env bash+rm -rf "${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}/im-driving"+echo "Removed im-driving skill"