From 19b1ee17da1ccc4475976a1eec056e17dc058d48 Mon Sep 17 00:00:00 2001 From: Alex Newman Date: Mon, 11 May 2026 18:27:57 -0700 Subject: [PATCH] feat(skills): add wowerpoint for one-doc kawaii NotebookLM slide decks (#2430) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(skills): add wowerpoint for one-doc kawaii NotebookLM slide decks A skill that turns one source document into a kawaii NotebookLM slide-deck PDF. Wraps the `notebooklm` CLI with the kawaii-prompt + `--format detailed` defaults, and the spawn-subagent-and-end-turn pattern so generation (~10 min) never blocks the main conversation. Single-source-per-deck is enforced by the workflow shape: step 1 is "confirm or write the source doc"; step 3 adds exactly one source. If the doc is non-existent or thin, write it first using mem-search and sequential thinking — don't paper over a weak source by stacking more sources. 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. Co-Authored-By: Claude Opus 4.7 (1M context) * fix(skills): address CodeRabbit findings on wowerpoint - Document `jq` as a required workflow dependency in setup - Add `text` language identifier to three unlabeled fenced code blocks (MD040 lint compliance) Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: Claude Opus 4.7 (1M context) --- plugin/skills/wowerpoint/SKILL.md | 143 ++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 plugin/skills/wowerpoint/SKILL.md diff --git a/plugin/skills/wowerpoint/SKILL.md b/plugin/skills/wowerpoint/SKILL.md new file mode 100644 index 00000000..5efc0687 --- /dev/null +++ b/plugin/skills/wowerpoint/SKILL.md @@ -0,0 +1,143 @@ +--- +name: wowerpoint +description: Turn one document into a kawaii NotebookLM slide-deck PDF. Use for "wowerpoint this", "make a deck about ", "turn this report into slides", or any request to render a single document as shareable narrative slides. +--- + +# Wowerpoint + +One 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. + +## Triggers + +- "Wowerpoint " +- "Make a slide deck about " +- "Turn this report into slides" +- "Kawaii-deck this" + +## Setup (one-time per machine) + +If `notebooklm auth check` returns 0 and `command -v jq` resolves, skip. + +```bash +uv tool install --with playwright --force notebooklm-py +$(uv tool dir)/notebooklm-py/bin/playwright install chromium +``` + +`jq` is required by the workflow's JSON parsing; install if missing (`brew install jq` on macOS, or your distro's package manager). + +Then the user authenticates interactively — do not script. Tell them to type `! notebooklm login` so the OAuth ENTER lands in their terminal. + +## Workflow + +### 1. The source doc + +You 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. + +### 2. Auth pre-flight + +```bash +notebooklm auth check 2>&1 | tail -5 +``` + +Exit 1 with `Run 'notebooklm login' to authenticate.` = halt and tell the user. + +### 3. Create notebook, add the source + +```bash +NOTEBOOK_ID=$(notebooklm create "" --json | jq -r .notebook.id) +SOURCE_ID=$(notebooklm source add "<doc-path>" --notebook "$NOTEBOOK_ID" --json | jq -r .source.id) +``` + +Title: H1 of the source doc, or its filename stem; append a date for dated work. + +JSON envelope keys differ — `create` → `.notebook.id`, `source add` → `.source.id`, `generate` → `.task_id`. Wrong key = empty string = silent downstream failure. + +### 4. Spawn the subagent + +Generation takes ~10 minutes; never block on it. Use the template below with `run_in_background: true`. + +### 5. End your turn + +Print the notebook URL so the user can watch live: + +```text +https://notebooklm.google.com/notebook/<NOTEBOOK_ID> +``` + +The subagent's completion notification fires when the file is on disk. + +## Output path + +Adjacent to the source, parallel filename: + +```text +<source-dir>/<source-stem>-slides.pdf +``` + +If the source isn't somewhere that makes sense as an output location, default to `reports/<stem>-slides.pdf`. + +## The prompt + +One sentence. Default: + +```text +Use kawaii characters to tell the story of <subject>. Keep it warm and clear. +``` + +Replace `<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. + +## Subagent template (copy-paste, parameterize) + +```text +You're handling NotebookLM slide-deck generation. Work in `<repo-absolute-path>`. + +Context: +- The `notebooklm` CLI is installed and authenticated (parent verified with `notebooklm auth check`). +- A notebook and source already exist. + +Inputs: +- Notebook ID: `<NOTEBOOK_ID>` +- Source ID: `<SOURCE_ID>` +- Generation prompt: `<PROMPT>` +- Output path: `<OUTPUT_PATH>` + +Steps: + +1. Wait for source: `notebooklm source wait <SOURCE_ID> -n <NOTEBOOK_ID> --timeout 600` + Exit 0 = ready, 1 = error, 2 = timeout. On timeout, run `notebooklm source list -n <NOTEBOOK_ID> --json` and report status. + +2. Generate: `notebooklm generate slide-deck "<PROMPT>" --format detailed --length default --notebook <NOTEBOOK_ID> --json --retry 2` + Parse `task_id` from the JSON (key is `task_id` at top level). + On `GENERATION_FAILED` or "No result found for RPC ID": sleep 300, retry once, then give up. + +3. Wait for artifact: `notebooklm artifact wait <task_id> -n <NOTEBOOK_ID> --timeout 1800` + +4. Download: `notebooklm download slide-deck <OUTPUT_PATH> -a <task_id> -n <NOTEBOOK_ID>` + +5. Verify: `ls -la <OUTPUT_PATH>` confirms the file exists. + +Report briefly (under 200 words): +- Final artifact ID +- Time per phase (source wait, generation, render wait, download) +- Output file path + size +- Any retries or warnings +- Exact error message if any step failed + +Do NOT poll status manually. The `wait` commands handle backoff. +``` + +## Failure modes + +- **`pip: command not found`** — modern macOS doesn't ship pip on PATH. Use `uv tool install`. +- **`Playwright not installed`** — install `notebooklm-py` with `--with playwright`, then `playwright install chromium`. +- **`Run 'notebooklm login' to authenticate`** — only the user can complete OAuth. +- **`task_id` parsed as empty string** — wrong JSON envelope key. `generate` returns `{"task_id": "..."}` at top level. +- **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. +- **Source upload denied for sensitive docs** — confirm before adding sources containing credentials, customer data, or unreleased product info. NotebookLM is a Google service. +- **`--length long` does not exist** — only `default|short`. If the user asks for "long slides," use `default` and explain. +- **No `--style` flag** — kawaii lives in the prompt text. + +## Operational tips + +- **Rerun cheaply** — once the notebook + source exist, regenerating with a different prompt only repeats generation + download. Reuse `NOTEBOOK_ID` and `SOURCE_ID`. +- **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`.