{"id":"wowerpoint","name":"wowerpoint","summary":"1つのドキュメントをkawaii NotebookLMのスライドデッキPDFに変換します。「wowerpoint this」「deck about <file>」「このレポートをスライドに変換する」、または単一の文書を共有可能なナラティブスライドとして表示するリクエストなどに使ってください。","body":"# Wowerpoint\n\nOne doc in, one PDF out. Slide-deck only — videos and podcasts from the same engine are noticeably worse and out of scope; refer the user to the `notebooklm` CLI directly if they want those.\n\n## Triggers\n\n- \"Wowerpoint <file>\"\n- \"Make a slide deck about <file>\"\n- \"Turn this report into slides\"\n- \"Kawaii-deck this\"\n\n## Setup (one-time per machine)\n\nIf `notebooklm auth check` returns 0 and `command -v jq` resolves, skip.\n\n```bash\nuv tool install --with playwright --force notebooklm-py\n$(uv tool dir)/notebooklm-py/bin/playwright install chromium\n```\n\n`jq` is required by the workflow's JSON parsing; install if missing (`brew install jq` on macOS, or your distro's package manager).\n\nThen the user authenticates interactively — do not script. Tell them to type `! notebooklm login` so the OAuth ENTER lands in their terminal.\n\n## Workflow\n\n### 1. The source doc\n\nYou need exactly one source doc. If it doesn't exist or is too thin to carry a deck, **write it first** — use mem-search and sequential thinking to make it comprehensive (long-form, narrative, several thousand words is normal). Do not paper over a weak source by adding more sources.\n\n### 2. Auth pre-flight\n\n```bash\nnotebooklm auth check 2>&1 | tail -5\n```\n\nExit 1 with `Run 'notebooklm login' to authenticate.` = halt and tell the user.\n\n### 3. Create notebook, add the source\n\n```bash\nNOTEBOOK_ID=$(notebooklm create \"<title>\" --json | jq -r .notebook.id)\nSOURCE_ID=$(notebooklm source add \"<doc-path>\" --notebook \"$NOTEBOOK_ID\" --json | jq -r .source.id)\n```\n\nTitle: H1 of the source doc, or its filename stem; append a date for dated work.\n\nJSON envelope keys differ — `create` → `.notebook.id`, `source add` → `.source.id`, `generate` → `.task_id`. Wrong key = empty string = silent downstream failure.\n\n### 4. Spawn the subagent\n\nGeneration takes ~10 minutes; never block on it. Use the template below with `run_in_background: true`.\n\n### 5. End your turn\n\nPrint the notebook URL so the user can watch live:\n\n```text\nhttps://notebooklm.google.com/notebook/<NOTEBOOK_ID>\n```\n\nThe subagent's completion notification fires when the file is on disk.\n\n## Output path\n\nAdjacent to the source, parallel filename:\n\n```text\n<source-dir>/<source-stem>-slides.pdf\n```\n\nIf the source isn't somewhere that makes sense as an output location, default to `reports/<stem>-slides.pdf`.\n\n## Share link (WOWerpoint Server)\n\nAfter the PDF lands on disk, the subagent also POSTs it to the WOWerpoint Server, which converts the 16:9 deck into a 9:16 mobile twin and returns a share URL. The share URL is the primary deliverable to the user; the PDF on disk is the backup.\n\nRequired env (exported in the user's shell — the subagent inherits the parent's environment, so plain `export` is enough; no dotenv loader runs):\n\n```bash\nWOWERPOINT_API_BASE=https://wowerpoint-api.<subdomain>.workers.dev\nWOWERPOINT_VIEWER_BASE=https://wowerpoint-viewer.<subdomain>.workers.dev\nWOWERPOINT_UPLOAD_TOKEN=<token>\n```\n\nIf any var is missing, skip the share-link step and just hand the PDF over.\n\nUpload pattern (run AFTER the subagent confirms the PDF exists on disk). Capture the full response so empty `id` and `error` payloads are handled — `jq -r '.id'` returns the literal string `null` on a missing key, so always pipe through `.id // empty`:\n\n```bash\nif [ -n \"$WOWERPOINT_API_BASE\" ] && [ -n \"$WOWERPOINT_UPLOAD_TOKEN\" ] && [ -n \"$WOWERPOINT_VIEWER_BASE\" ]; then\n  UPLOAD_JSON=$(curl -sS --connect-timeout 10 --max-time 30 -X POST \"$WOWERPOINT_API_BASE/api/decks\" \\\n    -H \"Authorization: Bearer $WOWERPOINT_UPLOAD_TOKEN\" \\\n    -F \"file=@<OUTPUT_PATH>\" \\\n    -F \"title=<TITLE>\")\n  DECK_ID=$(printf '%s' \"$UPLOAD_JSON\" | jq -r '.id // empty')\n  API_ERROR=$(printf '%s' \"$UPLOAD_JSON\" | jq -r '.error // empty')\n  if [ -n \"$API_ERROR\" ] || [ -z \"$DECK_ID\" ]; then\n    echo \"WOWerpoint upload warning: ${API_ERROR:-missing id}\"\n  else\n    echo \"Share URL: $WOWERPOINT_VIEWER_BASE/$DECK_ID\"\n  fi\nfi\n```\n\nThe returned `id` is a kebab-case slug derived from the title with a random creature suffix (e.g. `tokenrouter-quest-hawk`, or `velvet-comet-tiger` if the title is empty or non-ASCII). The share URL is:\n\n```text\n$WOWERPOINT_VIEWER_BASE/<id>\n```\n\nIt works immediately (shows a \"still converting…\" page that auto-reloads when ready). Conversion takes ~1–2 min per slide. Print the share URL in your final response.\n\n## The prompt\n\nOne sentence. Default:\n\n```text\nUse kawaii characters to tell the story of <subject>. Keep it warm and clear.\n```\n\nReplace `<subject>` with a one-phrase description from the source doc's H1 or the user's framing. If the user supplies their own prompt, pass it through verbatim — don't expand it.\n\n## Subagent template (copy-paste, parameterize)\n\n```text\nYou're handling NotebookLM slide-deck generation. Work in `<repo-absolute-path>`.\n\nContext:\n- The `notebooklm` CLI is installed and authenticated (parent verified with `notebooklm auth check`).\n- A notebook and source already exist.\n\nInputs:\n- Notebook ID: `<NOTEBOOK_ID>`\n- Source ID: `<SOURCE_ID>`\n- Generation prompt: `<PROMPT>`\n- Output path: `<OUTPUT_PATH>`\n- Deck title: `<TITLE>` (the notebook title, used by the share-link step)\n\nSteps:\n\n1. Wait for source: `notebooklm source wait <SOURCE_ID> -n <NOTEBOOK_ID> --timeout 600`\n   Exit 0 = ready, 1 = error, 2 = timeout. On timeout, run `notebooklm source list -n <NOTEBOOK_ID> --json` and report status.\n\n2. Generate: `notebooklm generate slide-deck \"<PROMPT>\" --format detailed --length default --notebook <NOTEBOOK_ID> --json --retry 2`\n   Parse `task_id` from the JSON (key is `task_id` at top level).\n   On `GENERATION_FAILED` or \"No result found for RPC ID\": sleep 300, retry once, then give up.\n\n3. Wait for artifact: `notebooklm artifact wait <task_id> -n <NOTEBOOK_ID> --timeout 1800`\n\n4. Download: `notebooklm download slide-deck <OUTPUT_PATH> -a <task_id> -n <NOTEBOOK_ID>`\n\n5. Verify: `ls -la <OUTPUT_PATH>` confirms the file exists.\n\n6. Upload to WOWerpoint Server for a mobile share link. Skip silently if any of `WOWERPOINT_API_BASE`, `WOWERPOINT_UPLOAD_TOKEN`, or `WOWERPOINT_VIEWER_BASE` is unset. Otherwise:\n\n   ```bash\n   if [ -n \"$WOWERPOINT_API_BASE\" ] && [ -n \"$WOWERPOINT_UPLOAD_TOKEN\" ] && [ -n \"$WOWERPOINT_VIEWER_BASE\" ]; then\n     UPLOAD_JSON=$(curl -sS --connect-timeout 10 --max-time 30 -X POST \"$WOWERPOINT_API_BASE/api/decks\" \\\n       -H \"Authorization: Bearer $WOWERPOINT_UPLOAD_TOKEN\" \\\n       -F \"file=@<OUTPUT_PATH>\" \\\n       -F \"title=<TITLE>\")\n     DECK_ID=$(printf '%s' \"$UPLOAD_JSON\" | jq -r '.id // empty')\n     API_ERROR=$(printf '%s' \"$UPLOAD_JSON\" | jq -r '.error // empty')\n     if [ -n \"$API_ERROR\" ] || [ -z \"$DECK_ID\" ]; then\n       echo \"WOWerpoint upload warning: ${API_ERROR:-missing id}\"\n     else\n       echo \"Share URL: $WOWERPOINT_VIEWER_BASE/$DECK_ID\"\n     fi\n   fi\n   ```\n\n   On warning, the PDF on disk is still a valid deliverable — do not retry the upload.\n\nReport briefly (under 200 words):\n- Final artifact ID\n- Time per phase (source wait, generation, render wait, download)\n- Output file path + size\n- Share URL (if produced)\n- Any retries or warnings\n- Exact error message if any step failed\n\nDo NOT poll status manually. The `wait` commands handle backoff.\n```\n\n## Failure modes\n\n- **`pip: command not found`** — modern macOS doesn't ship pip on PATH. Use `uv tool install`.\n- **`Playwright not installed`** — install `notebooklm-py` with `--with playwright`, then `playwright install chromium`.\n- **`Run 'notebooklm login' to authenticate`** — only the user can complete OAuth.\n- **`task_id` parsed as empty string** — wrong JSON envelope key. `generate` returns `{\"task_id\": \"...\"}` at top level.\n- **Rate-limit (`GENERATION_FAILED` or \"No result found for RPC ID\")** — `--retry 2` handles transients; persistent failure means wait 5–10 minutes or fall back to the web UI.\n- **Source upload denied for sensitive docs** — confirm before adding sources containing credentials, customer data, or unreleased product info. NotebookLM is a Google service.\n- **`--length long` does not exist** — only `default|short`. If the user asks for \"long slides,\" use `default` and explain.\n- **No `--style` flag** — kawaii lives in the prompt text.\n\n## Operational tips\n\n- **Rerun cheaply** — once the notebook + source exist, regenerating with a different prompt only repeats generation + download. Reuse `NOTEBOOK_ID` and `SOURCE_ID`.\n- **Web UI fallback** — if generation is rate-limited >30 minutes, open the notebook URL, trigger generation in the UI, then `notebooklm artifact list -n <NOTEBOOK_ID>` and `download`.","author":"@thedotmack","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/thedotmack/claude-mem/tree/main/plugin/skills/wowerpoint","license":"Apache-2.0","category":"writing","lang":"en","tokens":2297,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":["notebooklm.google.com"]}}