{
  "schemaVersion": "1.0",
  "item": {
    "slug": "nblm",
    "name": "NotebookLM Skill",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/magicseek/nblm",
    "canonicalUrl": "https://clawhub.ai/magicseek/nblm",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/nblm",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=nblm",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "AUTHENTICATION.md",
      "CHANGELOG.md",
      "README.md",
      "README.zh-CN.md",
      "SKILL.md",
      "references/api_reference.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/nblm"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/nblm",
    "agentPageUrl": "https://openagent3.xyz/skills/nblm/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nblm/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nblm/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "NotebookLM Quick Commands",
        "body": "Query Google NotebookLM for source-grounded, citation-backed answers."
      },
      {
        "title": "Environment",
        "body": "All dependencies and authentication are handled automatically by run.py:\n\nFirst run creates .venv and installs Python/Node.js dependencies\nIf Google auth is missing or expired, a browser window opens automatically\nNo manual pre-flight steps required"
      },
      {
        "title": "Usage",
        "body": "/nblm <command> [args]"
      },
      {
        "title": "Notebook Management",
        "body": "CommandDescriptionloginAuthenticate with GooglestatusShow auth and library statusaccountsList all Google accountsaccounts addAdd a new Google accountaccounts switch <id>Switch active account (by index or email)accounts remove <id>Remove an accountlocalList notebooks in local libraryremoteList all notebooks from NotebookLM APIcreate <name>Create a new notebookdelete [--id ID]Delete a notebookrename <name> [--id ID]Rename a notebooksummary [--id ID]Get AI-generated summarydescribe [--id ID]Get description and suggested topicsadd <url-or-id>Add notebook to local library (auto-detects URL vs notebook ID)activate <id>Set active notebook"
      },
      {
        "title": "Source Management",
        "body": "CommandDescriptionsources [--id ID]List sources in notebookupload <file>Upload a single fileupload <folder>Sync a folder of files to NotebookLMupload-zlib <url>Download from Z-Library and uploadupload-url <url>Add URL as sourceupload-youtube <url>Add YouTube video as sourceupload-text <title> [--content TEXT]Add text as sourcesource-text <source-id>Get full indexed textsource-guide <source-id>Get AI summary and keywordssource-rename <source-id> <name>Rename a sourcesource-refresh <source-id>Re-fetch URL contentsource-delete <source-id>Delete a source\n\nUpload options:\n\n--use-active - Upload to the currently active notebook\n--create-new - Create a new notebook named after the file/folder\n--notebook-id <id> - Upload to a specific notebook\n--dry-run - Show sync plan without executing (folder sync)\n--rebuild - Force rebuild tracking file (folder sync)\n\nImportant: When user runs upload without specifying a target, ASK them first:\n\n\"Would you like to upload to the active notebook, or create a new notebook?\"\nThen pass the appropriate flag (--use-active or --create-new)."
      },
      {
        "title": "Chat & Audio/Media",
        "body": "CommandDescriptionask <question>Query NotebookLMpodcast [--instructions TEXT]Generate audio podcastpodcast-status <task-id>Check podcast generation statuspodcast-download [output-path]Download latest podcastbriefing [--instructions TEXT]Generate brief audio summarydebate [--instructions TEXT]Generate debate-style audioslides [--instructions TEXT]Generate slide deckslides-download [output-path]Download slide deck as PDFinfographic [--instructions TEXT]Generate infographicinfographic-download [output-path]Download infographicmedia-list [--type TYPE]List generated media (audio/video/slides/infographic)media-delete <id>Delete a generated media item"
      },
      {
        "title": "Command Routing",
        "body": "Based on $ARGUMENTS, execute the appropriate command:\n\n$IF($ARGUMENTS,\nParse the command from: \"$ARGUMENTS\"\n\nlogin → python scripts/run.py auth_manager.py setup --service google\n\naccounts → python scripts/run.py auth_manager.py accounts list\n\naccounts add → python scripts/run.py auth_manager.py accounts add\n\naccounts switch <id> → python scripts/run.py auth_manager.py accounts switch \"<id>\"\n\naccounts remove <id> → python scripts/run.py auth_manager.py accounts remove \"<id>\"\n\nstatus → Run both:\n\npython scripts/run.py auth_manager.py status\npython scripts/run.py notebook_manager.py list\n\nlocal → python scripts/run.py notebook_manager.py list\n\nremote → python scripts/run.py nblm_cli.py notebooks\n\ncreate <name> → python scripts/run.py nblm_cli.py create \"<name>\"\n\ndelete [--id ID] → python scripts/run.py nblm_cli.py delete <args>\n\nrename <name> [--id ID] → python scripts/run.py nblm_cli.py rename \"<name>\" <args>\n\nsummary [--id ID] → python scripts/run.py nblm_cli.py summary <args>\n\ndescribe [--id ID] → python scripts/run.py nblm_cli.py describe <args>\n\nadd <url-or-id> → Smart add workflow (auto-detects URL vs notebook ID)\n\nactivate <id> → python scripts/run.py notebook_manager.py activate --id \"<id>\"\n\nsources [--id ID] → python scripts/run.py nblm_cli.py sources <args>\n\nupload <file> → First ASK user: \"Upload to active notebook or create new?\" Then:\n- Active: python scripts/run.py source_manager.py add --file \"<file>\" --use-active\n- New: python scripts/run.py source_manager.py add --file \"<file>\" --create-new\n\nupload <folder> → Sync a folder:\n- First ASK user: \"Sync to active notebook, create new, or specify notebook?\"\n- Active: python scripts/run.py source_manager.py sync \"<folder>\" --use-active\n- New: python scripts/run.py source_manager.py sync \"<folder>\" --create-new\n- Specific: python scripts/run.py source_manager.py sync \"<folder>\" --notebook-id ID\n- Dry-run: python scripts/run.py source_manager.py sync \"<folder>\" --dry-run\n- Rebuild: python scripts/run.py source_manager.py sync \"<folder>\" --rebuild\n\nupload-zlib <url> → First ASK user: \"Upload to active notebook or create new?\" Then:\n- Active: python scripts/run.py source_manager.py add --url \"<url>\" --use-active\n- New: python scripts/run.py source_manager.py add --url \"<url>\" --create-new\n\nupload-url <url> → python scripts/run.py nblm_cli.py upload-url \"<url>\"\n\nupload-youtube <url> → python scripts/run.py nblm_cli.py upload-youtube \"<url>\"\n\nupload-text <title> → python scripts/run.py nblm_cli.py upload-text \"<title>\" <args>\n\nsource-text <id> → python scripts/run.py nblm_cli.py source-text \"<id>\"\n\nsource-guide <id> → python scripts/run.py nblm_cli.py source-guide \"<id>\"\n\nsource-rename <id> <name> → python scripts/run.py nblm_cli.py source-rename \"<id>\" \"<name>\"\n\nsource-refresh <id> → python scripts/run.py nblm_cli.py source-refresh \"<id>\"\n\nsource-delete <id> → python scripts/run.py nblm_cli.py source-delete \"<id>\"\n\nask <question> → python scripts/run.py nblm_cli.py ask \"<question>\"\n\npodcast → python scripts/run.py artifact_manager.py generate --format DEEP_DIVE <args>\n\npodcast-status <task-id> → python scripts/run.py artifact_manager.py status --task-id \"<task-id>\"\n\npodcast-download [output-path] → python scripts/run.py artifact_manager.py download \"<output-path>\"\n\nbriefing → python scripts/run.py artifact_manager.py generate --format BRIEF <args>\n\ndebate → python scripts/run.py artifact_manager.py generate --format DEBATE <args>\n\nslides → python scripts/run.py artifact_manager.py generate-slides <args>\n\nslides-download [output-path] → python scripts/run.py artifact_manager.py download \"<output-path>\" --type slide-deck\n\ninfographic → python scripts/run.py artifact_manager.py generate-infographic <args>\n\ninfographic-download [output-path] → python scripts/run.py artifact_manager.py download \"<output-path>\" --type infographic\n\nmedia-list [--type TYPE] → python scripts/run.py artifact_manager.py list <args>\n\nmedia-delete <id> → python scripts/run.py artifact_manager.py delete \"<id>\"\n\nIf command not recognized, show usage help.,\n\nShow available commands with /nblm (no arguments)\n)"
      },
      {
        "title": "Podcast Options",
        "body": "/nblm podcast --length DEFAULT --wait --output ./podcast.mp3\n/nblm podcast --instructions \"Focus on the key findings\"\n/nblm briefing --wait --output ./summary.mp3\n/nblm debate --instructions \"Compare the two approaches\"\n\nOptionValues--lengthSHORT, DEFAULT, LONG--instructionsCustom instructions for the content--waitWait for generation to complete--outputDownload path (requires --wait)"
      },
      {
        "title": "Slide Deck Options",
        "body": "/nblm slides --format DETAILED_DECK --wait --output ./presentation.pdf\n/nblm slides --instructions \"Focus on key diagrams\" --format PRESENTER_SLIDES\n\nOptionValues--formatDETAILED_DECK, PRESENTER_SLIDES--lengthSHORT, DEFAULT--instructionsCustom instructions for the content--waitWait for generation to complete--outputDownload path (requires --wait)"
      },
      {
        "title": "Infographic Options",
        "body": "/nblm infographic --orientation LANDSCAPE --wait --output ./visual.png\n/nblm infographic --instructions \"Highlight comparison\" --detail-level DETAILED\n\nOptionValues--orientationLANDSCAPE, PORTRAIT, SQUARE--detail-levelCONCISE, STANDARD, DETAILED--instructionsCustom instructions for the content--waitWait for generation to complete--outputDownload path (requires --wait)"
      },
      {
        "title": "Media Generation",
        "body": "CommandDescriptionOutput/nblm podcastDeep-dive audio discussionMP3/nblm briefingBrief audio summaryMP3/nblm debateDebate-style audioMP3/nblm slidesSlide deck presentationPDF/nblm infographicVisual infographicPNG"
      },
      {
        "title": "Examples",
        "body": "/nblm podcast --wait --output ./deep-dive.mp3\n/nblm briefing --instructions \"Focus on chapter 3\" --wait\n/nblm debate --length LONG --wait --output ./debate.mp3\n/nblm slides --instructions \"Include key diagrams\" --format DETAILED_DECK --wait --output ./presentation.pdf\n/nblm infographic --orientation LANDSCAPE --detail-level DETAILED --wait --output ./summary.png"
      },
      {
        "title": "Download & Manage",
        "body": "/nblm podcast-download ./my-podcast.mp3\n/nblm slides-download ./presentation.pdf\n/nblm infographic-download ./visual.png\n/nblm media-list                     # List all generated media\n/nblm media-list --type audio        # List only audio\n/nblm media-delete <id>              # Delete a media item"
      },
      {
        "title": "When to Use This Skill",
        "body": "Trigger when user:\n\nMentions NotebookLM explicitly\nShares NotebookLM URL (https://notebooklm.google.com/notebook/...)\nAsks to query their notebooks/documentation\nWants to add documentation to NotebookLM library\nUses phrases like \"ask my NotebookLM\", \"check my docs\", \"query my notebook\""
      },
      {
        "title": "⚠️ CRITICAL: Add Command - Smart Discovery",
        "body": "The add command now automatically discovers metadata from the notebook:\n\n# Smart Add (auto-discovers name, description, topics)\npython scripts/run.py notebook_manager.py add <notebook-id-or-url>\n\n# With optional overrides\npython scripts/run.py notebook_manager.py add <id> --name \"Custom Name\" --topics \"custom,topics\"\n\nWhat Smart Add does:\n\nFetches notebook title from NotebookLM API\nQueries the notebook content to generate description and topics\nAdds to local library with discovered metadata\n\nSupported input formats:\n\nNotebook ID: 5fd9f36b-8000-401d-a7a0-7aa3f7832644\nFull URL: https://notebooklm.google.com/notebook/5fd9f36b-8000-401d-a7a0-7aa3f7832644\n\nNEVER manually specify --name, --description, or --topics unless the user explicitly provides them."
      },
      {
        "title": "Critical: Always Use run.py Wrapper",
        "body": "NEVER call scripts directly. ALWAYS use python scripts/run.py [script]:\n\n# ✅ CORRECT - Always use run.py:\npython scripts/run.py auth_manager.py status\npython scripts/run.py notebook_manager.py list\npython scripts/run.py ask_question.py --question \"...\"\n\n# ❌ WRONG - Never call directly:\npython scripts/auth_manager.py status  # Fails without venv!\n\nThe run.py wrapper automatically:\n\nCreates .venv if needed\nInstalls all dependencies\nActivates environment\nExecutes script properly"
      },
      {
        "title": "Step 1: Check Authentication Status",
        "body": "python scripts/run.py auth_manager.py status\n\nIf not authenticated, proceed to setup."
      },
      {
        "title": "Step 2: Authenticate (One-Time Setup)",
        "body": "# Browser MUST be visible for manual Google login\npython scripts/run.py auth_manager.py setup\n\nImportant:\n\nBrowser is VISIBLE for authentication\nBrowser window opens automatically\nUser must manually log in to Google\nTell user: \"A browser window will open for Google login\""
      },
      {
        "title": "Step 3: Manage Notebook Library",
        "body": "# List all notebooks\npython scripts/run.py notebook_manager.py list\n\n# BEFORE ADDING: Ask user for metadata if unknown!\n# \"What does this notebook contain?\"\n# \"What topics should I tag it with?\"\n\n# Add notebook to library (ALL parameters are REQUIRED!)\npython scripts/run.py notebook_manager.py add \\\n  --url \"https://notebooklm.google.com/notebook/...\" \\\n  --name \"Descriptive Name\" \\\n  --description \"What this notebook contains\" \\  # REQUIRED - ASK USER IF UNKNOWN!\n  --topics \"topic1,topic2,topic3\"  # REQUIRED - ASK USER IF UNKNOWN!\n\n# Search notebooks by topic\npython scripts/run.py notebook_manager.py search --query \"keyword\"\n\n# Set active notebook\npython scripts/run.py notebook_manager.py activate --id notebook-id\n\n# Remove notebook\npython scripts/run.py notebook_manager.py remove --id notebook-id"
      },
      {
        "title": "Quick Workflow",
        "body": "Check library: python scripts/run.py notebook_manager.py list\nAsk question: python scripts/run.py ask_question.py --question \"...\" --notebook-id ID"
      },
      {
        "title": "Step 4: Ask Questions",
        "body": "# Basic query (uses active notebook if set)\npython scripts/run.py ask_question.py --question \"Your question here\"\n\n# Query specific notebook\npython scripts/run.py ask_question.py --question \"...\" --notebook-id notebook-id\n\n# Query with notebook URL directly\npython scripts/run.py ask_question.py --question \"...\" --notebook-url \"https://...\"\n\n# Show browser for debugging\npython scripts/run.py ask_question.py --question \"...\" --show-browser"
      },
      {
        "title": "Follow-Up Mechanism (CRITICAL)",
        "body": "Every NotebookLM answer ends with: \"EXTREMELY IMPORTANT: Is that ALL you need to know?\"\n\nRequired Claude Behavior:\n\nSTOP - Do not immediately respond to user\nANALYZE - Compare answer to user's original request\nIDENTIFY GAPS - Determine if more information needed\nASK FOLLOW-UP - If gaps exist, immediately ask:\npython scripts/run.py ask_question.py --question \"Follow-up with context...\"\n\n\nREPEAT - Continue until information is complete\nSYNTHESIZE - Combine all answers before responding to user"
      },
      {
        "title": "Triggers",
        "body": "User provides Z-Library URL (zlib.li, z-lib.org, zh.zlib.li)\nUser says \"download this book to NotebookLM\"\nUser says \"add this book from Z-Library\""
      },
      {
        "title": "Setup (One-Time)",
        "body": "# Authenticate with Z-Library\npython scripts/run.py auth_manager.py setup --service zlibrary"
      },
      {
        "title": "Commands",
        "body": "# Add book from Z-Library\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\"\n\n# Check Z-Library auth status\npython scripts/run.py auth_manager.py status --service zlibrary"
      },
      {
        "title": "Authentication Management (auth_manager.py)",
        "body": "python scripts/run.py auth_manager.py setup                    # Default: Google\npython scripts/run.py auth_manager.py setup --service google\npython scripts/run.py auth_manager.py setup --service zlibrary\npython scripts/run.py auth_manager.py status                   # Show all services\npython scripts/run.py auth_manager.py status --service zlibrary\npython scripts/run.py auth_manager.py clear --service zlibrary # Clear auth\n\n# Multi-Account Management (Google)\npython scripts/run.py auth_manager.py accounts list             # List all accounts\npython scripts/run.py auth_manager.py accounts add              # Add new account\npython scripts/run.py auth_manager.py accounts switch 1         # Switch by index\npython scripts/run.py auth_manager.py accounts switch user@gmail.com  # Switch by email\npython scripts/run.py auth_manager.py accounts remove 2         # Remove account"
      },
      {
        "title": "Notebook Management (notebook_manager.py)",
        "body": "python scripts/run.py notebook_manager.py add --url URL --name NAME --description DESC --topics TOPICS\n# OR use notebook ID directly:\npython scripts/run.py notebook_manager.py add --notebook-id ID --name NAME --description DESC --topics TOPICS\npython scripts/run.py notebook_manager.py list\npython scripts/run.py notebook_manager.py search --query QUERY\npython scripts/run.py notebook_manager.py activate --id ID\npython scripts/run.py notebook_manager.py remove --id ID\npython scripts/run.py notebook_manager.py stats"
      },
      {
        "title": "Question Interface (ask_question.py)",
        "body": "python scripts/run.py ask_question.py --question \"...\" [--notebook-id ID] [--notebook-url URL] [--show-browser]"
      },
      {
        "title": "Source Manager (source_manager.py)",
        "body": "# Upload to active notebook\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --use-active\n\n# Create new notebook for upload\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --create-new\n\n# Upload to specific notebook\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --notebook-id NOTEBOOK_ID\n\n# Z-Library download and upload\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\" --use-active\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\" --create-new\n\n# Sync a folder (new!)\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --use-active\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --create-new\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --notebook-id NOTEBOOK_ID\n\n# Sync options (new!)\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --dry-run    # Preview only\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --rebuild   # Force re-hash all files\n\nFolder Sync:\n\nScans folder for supported types: PDF, TXT, MD, DOCX, HTML, EPUB\nTracks sync state internally (no per-folder tracking file to manage)\nSync strategy: add new, update modified (delete + re-upload), skip unchanged\nMulti-account aware (tracks which Google account was used)\nNote: One of --use-active, --create-new, or --notebook-id is REQUIRED.\nUploads wait for NotebookLM processing and print progress as Ready: N/T. Press Ctrl+C to stop waiting.\nLocal file uploads use browser automation and require Google authentication.\nIf browser automation is unavailable, set NOTEBOOKLM_UPLOAD_MODE=text to upload extracted text instead (PDFs require pypdf)."
      },
      {
        "title": "Data Cleanup (cleanup_manager.py)",
        "body": "python scripts/run.py cleanup_manager.py                    # Preview cleanup\npython scripts/run.py cleanup_manager.py --confirm          # Execute cleanup\npython scripts/run.py cleanup_manager.py --preserve-library # Keep notebooks"
      },
      {
        "title": "Watchdog Status (auth_manager.py)",
        "body": "python scripts/run.py auth_manager.py watchdog-status"
      },
      {
        "title": "Environment Management",
        "body": "The virtual environment is automatically managed:\n\nFirst run creates .venv automatically\nDependencies install automatically\nNode.js dependencies install automatically\nagent-browser daemon starts on demand and keeps browser state in memory\ndaemon stops after 10 minutes of inactivity (any agent-browser command resets the timer)\nset AGENT_BROWSER_OWNER_PID to auto-stop when the agent process exits\nscripts/run.py sets AGENT_BROWSER_OWNER_PID to its parent PID by default\nEverything isolated in skill directory\n\nManual setup (only if automatic fails):\n\npython -m venv .venv\nsource .venv/bin/activate  # Linux/Mac\npip install -r requirements.txt\nnpm install\nnpm run install-browsers"
      },
      {
        "title": "Data Storage",
        "body": "All data stored in ~/.claude/skills/notebooklm/data/:\n\nlibrary.json - Notebook metadata (with account associations)\nauth/google/ - Multi-account Google auth\n\nindex.json - Account index (active account, list)\n<n>-<email>.json - Per-account credentials\n\n\nauth/zlibrary.json - Z-Library auth state\nagent_browser/session_id - Current daemon session ID\nagent_browser/last_activity.json - Last activity timestamp for idle shutdown\nagent_browser/watchdog.pid - Idle watchdog process ID\n\nSecurity: Protected by .gitignore, never commit to git."
      },
      {
        "title": "Configuration",
        "body": "Optional .env file in skill directory:\n\nHEADLESS=false           # Browser visibility\nSHOW_BROWSER=false       # Default browser display\nSTEALTH_ENABLED=true     # Human-like behavior\nTYPING_WPM_MIN=160       # Typing speed\nTYPING_WPM_MAX=240\nDEFAULT_NOTEBOOK_ID=     # Default notebook"
      },
      {
        "title": "Decision Flow",
        "body": "User mentions NotebookLM\n    ↓\nCheck auth → python scripts/run.py auth_manager.py status\n    ↓\nIf not authenticated → python scripts/run.py auth_manager.py setup\n    ↓\nCheck/Add notebook → python scripts/run.py notebook_manager.py list/add (with --description)\n    ↓\nActivate notebook → python scripts/run.py notebook_manager.py activate --id ID\n    ↓\nAsk question → python scripts/run.py ask_question.py --question \"...\"\n    ↓\nSee \"Is that ALL you need?\" → Ask follow-ups until complete\n    ↓\nSynthesize and respond to user"
      },
      {
        "title": "Troubleshooting",
        "body": "ProblemSolutionModuleNotFoundErrorUse run.py wrapperAuthentication failsBrowser must be visible for setup! --show-browserDAEMON_UNAVAILABLEEnsure Node.js/npm installed, run npm install, retryAUTH_REQUIREDRun python scripts/run.py auth_manager.py setupELEMENT_NOT_FOUNDVerify notebook URL and re-run with fresh page loadRate limit (50/day)Wait or add another Google account with accounts addBrowser crashespython scripts/run.py cleanup_manager.py --preserve-libraryNotebook not foundCheck with notebook_manager.py list"
      },
      {
        "title": "Best Practices",
        "body": "Always use run.py - Handles environment automatically\nCheck auth first - Before any operations\nFollow-up questions - Don't stop at first answer\nBrowser visible for auth - Required for manual login\nInclude context - Each question is independent\nSynthesize answers - Combine multiple responses"
      },
      {
        "title": "Limitations",
        "body": "No session persistence (each question = new browser)\nRate limits on free Google accounts (50 queries/day per account; use multiple accounts to increase)\nManual upload required (user must add docs to NotebookLM)\nBrowser overhead (few seconds per question)"
      },
      {
        "title": "Resources (Skill Structure)",
        "body": "Important directories and files:\n\nscripts/ - All automation scripts (ask_question.py, notebook_manager.py, etc.)\ndata/ - Local storage for authentication and notebook library\nreferences/ - Extended documentation:\n\napi_reference.md - Detailed API documentation for all scripts\ntroubleshooting.md - Common issues and solutions\nusage_patterns.md - Best practices and workflow examples\n\n\n.venv/ - Isolated Python environment (auto-created on first run)\n.gitignore - Protects sensitive data from being committed"
      }
    ],
    "body": "NotebookLM Quick Commands\n\nQuery Google NotebookLM for source-grounded, citation-backed answers.\n\nEnvironment\n\nAll dependencies and authentication are handled automatically by run.py:\n\nFirst run creates .venv and installs Python/Node.js dependencies\nIf Google auth is missing or expired, a browser window opens automatically\nNo manual pre-flight steps required\nUsage\n\n/nblm <command> [args]\n\nCommands\nNotebook Management\nCommand\tDescription\nlogin\tAuthenticate with Google\nstatus\tShow auth and library status\naccounts\tList all Google accounts\naccounts add\tAdd a new Google account\naccounts switch <id>\tSwitch active account (by index or email)\naccounts remove <id>\tRemove an account\nlocal\tList notebooks in local library\nremote\tList all notebooks from NotebookLM API\ncreate <name>\tCreate a new notebook\ndelete [--id ID]\tDelete a notebook\nrename <name> [--id ID]\tRename a notebook\nsummary [--id ID]\tGet AI-generated summary\ndescribe [--id ID]\tGet description and suggested topics\nadd <url-or-id>\tAdd notebook to local library (auto-detects URL vs notebook ID)\nactivate <id>\tSet active notebook\nSource Management\nCommand\tDescription\nsources [--id ID]\tList sources in notebook\nupload <file>\tUpload a single file\nupload <folder>\tSync a folder of files to NotebookLM\nupload-zlib <url>\tDownload from Z-Library and upload\nupload-url <url>\tAdd URL as source\nupload-youtube <url>\tAdd YouTube video as source\nupload-text <title> [--content TEXT]\tAdd text as source\nsource-text <source-id>\tGet full indexed text\nsource-guide <source-id>\tGet AI summary and keywords\nsource-rename <source-id> <name>\tRename a source\nsource-refresh <source-id>\tRe-fetch URL content\nsource-delete <source-id>\tDelete a source\n\nUpload options:\n\n--use-active - Upload to the currently active notebook\n--create-new - Create a new notebook named after the file/folder\n--notebook-id <id> - Upload to a specific notebook\n--dry-run - Show sync plan without executing (folder sync)\n--rebuild - Force rebuild tracking file (folder sync)\n\nImportant: When user runs upload without specifying a target, ASK them first:\n\n\"Would you like to upload to the active notebook, or create a new notebook?\" Then pass the appropriate flag (--use-active or --create-new).\n\nChat & Audio/Media\nCommand\tDescription\nask <question>\tQuery NotebookLM\npodcast [--instructions TEXT]\tGenerate audio podcast\npodcast-status <task-id>\tCheck podcast generation status\npodcast-download [output-path]\tDownload latest podcast\nbriefing [--instructions TEXT]\tGenerate brief audio summary\ndebate [--instructions TEXT]\tGenerate debate-style audio\nslides [--instructions TEXT]\tGenerate slide deck\nslides-download [output-path]\tDownload slide deck as PDF\ninfographic [--instructions TEXT]\tGenerate infographic\ninfographic-download [output-path]\tDownload infographic\nmedia-list [--type TYPE]\tList generated media (audio/video/slides/infographic)\nmedia-delete <id>\tDelete a generated media item\nCommand Routing\n\nBased on $ARGUMENTS, execute the appropriate command:\n\n$IF($ARGUMENTS, Parse the command from: \"$ARGUMENTS\"\n\nlogin → python scripts/run.py auth_manager.py setup --service google\n\naccounts → python scripts/run.py auth_manager.py accounts list\n\naccounts add → python scripts/run.py auth_manager.py accounts add\n\naccounts switch <id> → python scripts/run.py auth_manager.py accounts switch \"<id>\"\n\naccounts remove <id> → python scripts/run.py auth_manager.py accounts remove \"<id>\"\n\nstatus → Run both:\n\npython scripts/run.py auth_manager.py status\npython scripts/run.py notebook_manager.py list\n\nlocal → python scripts/run.py notebook_manager.py list\n\nremote → python scripts/run.py nblm_cli.py notebooks\n\ncreate <name> → python scripts/run.py nblm_cli.py create \"<name>\"\n\ndelete [--id ID] → python scripts/run.py nblm_cli.py delete <args>\n\nrename <name> [--id ID] → python scripts/run.py nblm_cli.py rename \"<name>\" <args>\n\nsummary [--id ID] → python scripts/run.py nblm_cli.py summary <args>\n\ndescribe [--id ID] → python scripts/run.py nblm_cli.py describe <args>\n\nadd <url-or-id> → Smart add workflow (auto-detects URL vs notebook ID)\n\nactivate <id> → python scripts/run.py notebook_manager.py activate --id \"<id>\"\n\nsources [--id ID] → python scripts/run.py nblm_cli.py sources <args>\n\nupload <file> → First ASK user: \"Upload to active notebook or create new?\" Then: - Active: python scripts/run.py source_manager.py add --file \"<file>\" --use-active - New: python scripts/run.py source_manager.py add --file \"<file>\" --create-new\n\nupload <folder> → Sync a folder: - First ASK user: \"Sync to active notebook, create new, or specify notebook?\" - Active: python scripts/run.py source_manager.py sync \"<folder>\" --use-active - New: python scripts/run.py source_manager.py sync \"<folder>\" --create-new - Specific: python scripts/run.py source_manager.py sync \"<folder>\" --notebook-id ID - Dry-run: python scripts/run.py source_manager.py sync \"<folder>\" --dry-run - Rebuild: python scripts/run.py source_manager.py sync \"<folder>\" --rebuild\n\nupload-zlib <url> → First ASK user: \"Upload to active notebook or create new?\" Then: - Active: python scripts/run.py source_manager.py add --url \"<url>\" --use-active - New: python scripts/run.py source_manager.py add --url \"<url>\" --create-new\n\nupload-url <url> → python scripts/run.py nblm_cli.py upload-url \"<url>\"\n\nupload-youtube <url> → python scripts/run.py nblm_cli.py upload-youtube \"<url>\"\n\nupload-text <title> → python scripts/run.py nblm_cli.py upload-text \"<title>\" <args>\n\nsource-text <id> → python scripts/run.py nblm_cli.py source-text \"<id>\"\n\nsource-guide <id> → python scripts/run.py nblm_cli.py source-guide \"<id>\"\n\nsource-rename <id> <name> → python scripts/run.py nblm_cli.py source-rename \"<id>\" \"<name>\"\n\nsource-refresh <id> → python scripts/run.py nblm_cli.py source-refresh \"<id>\"\n\nsource-delete <id> → python scripts/run.py nblm_cli.py source-delete \"<id>\"\n\nask <question> → python scripts/run.py nblm_cli.py ask \"<question>\"\n\npodcast → python scripts/run.py artifact_manager.py generate --format DEEP_DIVE <args>\n\npodcast-status <task-id> → python scripts/run.py artifact_manager.py status --task-id \"<task-id>\"\n\npodcast-download [output-path] → python scripts/run.py artifact_manager.py download \"<output-path>\"\n\nbriefing → python scripts/run.py artifact_manager.py generate --format BRIEF <args>\n\ndebate → python scripts/run.py artifact_manager.py generate --format DEBATE <args>\n\nslides → python scripts/run.py artifact_manager.py generate-slides <args>\n\nslides-download [output-path] → python scripts/run.py artifact_manager.py download \"<output-path>\" --type slide-deck\n\ninfographic → python scripts/run.py artifact_manager.py generate-infographic <args>\n\ninfographic-download [output-path] → python scripts/run.py artifact_manager.py download \"<output-path>\" --type infographic\n\nmedia-list [--type TYPE] → python scripts/run.py artifact_manager.py list <args>\n\nmedia-delete <id> → python scripts/run.py artifact_manager.py delete \"<id>\"\n\nIf command not recognized, show usage help.,\n\nShow available commands with /nblm (no arguments) )\n\nPodcast Options\n/nblm podcast --length DEFAULT --wait --output ./podcast.mp3\n/nblm podcast --instructions \"Focus on the key findings\"\n/nblm briefing --wait --output ./summary.mp3\n/nblm debate --instructions \"Compare the two approaches\"\n\nOption\tValues\n--length\tSHORT, DEFAULT, LONG\n--instructions\tCustom instructions for the content\n--wait\tWait for generation to complete\n--output\tDownload path (requires --wait)\nSlide Deck Options\n/nblm slides --format DETAILED_DECK --wait --output ./presentation.pdf\n/nblm slides --instructions \"Focus on key diagrams\" --format PRESENTER_SLIDES\n\nOption\tValues\n--format\tDETAILED_DECK, PRESENTER_SLIDES\n--length\tSHORT, DEFAULT\n--instructions\tCustom instructions for the content\n--wait\tWait for generation to complete\n--output\tDownload path (requires --wait)\nInfographic Options\n/nblm infographic --orientation LANDSCAPE --wait --output ./visual.png\n/nblm infographic --instructions \"Highlight comparison\" --detail-level DETAILED\n\nOption\tValues\n--orientation\tLANDSCAPE, PORTRAIT, SQUARE\n--detail-level\tCONCISE, STANDARD, DETAILED\n--instructions\tCustom instructions for the content\n--wait\tWait for generation to complete\n--output\tDownload path (requires --wait)\nMedia Generation\nCommand\tDescription\tOutput\n/nblm podcast\tDeep-dive audio discussion\tMP3\n/nblm briefing\tBrief audio summary\tMP3\n/nblm debate\tDebate-style audio\tMP3\n/nblm slides\tSlide deck presentation\tPDF\n/nblm infographic\tVisual infographic\tPNG\nExamples\n/nblm podcast --wait --output ./deep-dive.mp3\n/nblm briefing --instructions \"Focus on chapter 3\" --wait\n/nblm debate --length LONG --wait --output ./debate.mp3\n/nblm slides --instructions \"Include key diagrams\" --format DETAILED_DECK --wait --output ./presentation.pdf\n/nblm infographic --orientation LANDSCAPE --detail-level DETAILED --wait --output ./summary.png\n\nDownload & Manage\n/nblm podcast-download ./my-podcast.mp3\n/nblm slides-download ./presentation.pdf\n/nblm infographic-download ./visual.png\n/nblm media-list                     # List all generated media\n/nblm media-list --type audio        # List only audio\n/nblm media-delete <id>              # Delete a media item\n\nExtended Documentation\nWhen to Use This Skill\n\nTrigger when user:\n\nMentions NotebookLM explicitly\nShares NotebookLM URL (https://notebooklm.google.com/notebook/...)\nAsks to query their notebooks/documentation\nWants to add documentation to NotebookLM library\nUses phrases like \"ask my NotebookLM\", \"check my docs\", \"query my notebook\"\n⚠️ CRITICAL: Add Command - Smart Discovery\n\nThe add command now automatically discovers metadata from the notebook:\n\n# Smart Add (auto-discovers name, description, topics)\npython scripts/run.py notebook_manager.py add <notebook-id-or-url>\n\n# With optional overrides\npython scripts/run.py notebook_manager.py add <id> --name \"Custom Name\" --topics \"custom,topics\"\n\n\nWhat Smart Add does:\n\nFetches notebook title from NotebookLM API\nQueries the notebook content to generate description and topics\nAdds to local library with discovered metadata\n\nSupported input formats:\n\nNotebook ID: 5fd9f36b-8000-401d-a7a0-7aa3f7832644\nFull URL: https://notebooklm.google.com/notebook/5fd9f36b-8000-401d-a7a0-7aa3f7832644\n\nNEVER manually specify --name, --description, or --topics unless the user explicitly provides them.\n\nCritical: Always Use run.py Wrapper\n\nNEVER call scripts directly. ALWAYS use python scripts/run.py [script]:\n\n# ✅ CORRECT - Always use run.py:\npython scripts/run.py auth_manager.py status\npython scripts/run.py notebook_manager.py list\npython scripts/run.py ask_question.py --question \"...\"\n\n# ❌ WRONG - Never call directly:\npython scripts/auth_manager.py status  # Fails without venv!\n\n\nThe run.py wrapper automatically:\n\nCreates .venv if needed\nInstalls all dependencies\nActivates environment\nExecutes script properly\nCore Workflow\nStep 1: Check Authentication Status\npython scripts/run.py auth_manager.py status\n\n\nIf not authenticated, proceed to setup.\n\nStep 2: Authenticate (One-Time Setup)\n# Browser MUST be visible for manual Google login\npython scripts/run.py auth_manager.py setup\n\n\nImportant:\n\nBrowser is VISIBLE for authentication\nBrowser window opens automatically\nUser must manually log in to Google\nTell user: \"A browser window will open for Google login\"\nStep 3: Manage Notebook Library\n# List all notebooks\npython scripts/run.py notebook_manager.py list\n\n# BEFORE ADDING: Ask user for metadata if unknown!\n# \"What does this notebook contain?\"\n# \"What topics should I tag it with?\"\n\n# Add notebook to library (ALL parameters are REQUIRED!)\npython scripts/run.py notebook_manager.py add \\\n  --url \"https://notebooklm.google.com/notebook/...\" \\\n  --name \"Descriptive Name\" \\\n  --description \"What this notebook contains\" \\  # REQUIRED - ASK USER IF UNKNOWN!\n  --topics \"topic1,topic2,topic3\"  # REQUIRED - ASK USER IF UNKNOWN!\n\n# Search notebooks by topic\npython scripts/run.py notebook_manager.py search --query \"keyword\"\n\n# Set active notebook\npython scripts/run.py notebook_manager.py activate --id notebook-id\n\n# Remove notebook\npython scripts/run.py notebook_manager.py remove --id notebook-id\n\nQuick Workflow\nCheck library: python scripts/run.py notebook_manager.py list\nAsk question: python scripts/run.py ask_question.py --question \"...\" --notebook-id ID\nStep 4: Ask Questions\n# Basic query (uses active notebook if set)\npython scripts/run.py ask_question.py --question \"Your question here\"\n\n# Query specific notebook\npython scripts/run.py ask_question.py --question \"...\" --notebook-id notebook-id\n\n# Query with notebook URL directly\npython scripts/run.py ask_question.py --question \"...\" --notebook-url \"https://...\"\n\n# Show browser for debugging\npython scripts/run.py ask_question.py --question \"...\" --show-browser\n\nFollow-Up Mechanism (CRITICAL)\n\nEvery NotebookLM answer ends with: \"EXTREMELY IMPORTANT: Is that ALL you need to know?\"\n\nRequired Claude Behavior:\n\nSTOP - Do not immediately respond to user\nANALYZE - Compare answer to user's original request\nIDENTIFY GAPS - Determine if more information needed\nASK FOLLOW-UP - If gaps exist, immediately ask:\npython scripts/run.py ask_question.py --question \"Follow-up with context...\"\n\nREPEAT - Continue until information is complete\nSYNTHESIZE - Combine all answers before responding to user\nZ-Library Integration\nTriggers\nUser provides Z-Library URL (zlib.li, z-lib.org, zh.zlib.li)\nUser says \"download this book to NotebookLM\"\nUser says \"add this book from Z-Library\"\nSetup (One-Time)\n# Authenticate with Z-Library\npython scripts/run.py auth_manager.py setup --service zlibrary\n\nCommands\n# Add book from Z-Library\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\"\n\n# Check Z-Library auth status\npython scripts/run.py auth_manager.py status --service zlibrary\n\nScript Reference\nAuthentication Management (auth_manager.py)\npython scripts/run.py auth_manager.py setup                    # Default: Google\npython scripts/run.py auth_manager.py setup --service google\npython scripts/run.py auth_manager.py setup --service zlibrary\npython scripts/run.py auth_manager.py status                   # Show all services\npython scripts/run.py auth_manager.py status --service zlibrary\npython scripts/run.py auth_manager.py clear --service zlibrary # Clear auth\n\n# Multi-Account Management (Google)\npython scripts/run.py auth_manager.py accounts list             # List all accounts\npython scripts/run.py auth_manager.py accounts add              # Add new account\npython scripts/run.py auth_manager.py accounts switch 1         # Switch by index\npython scripts/run.py auth_manager.py accounts switch user@gmail.com  # Switch by email\npython scripts/run.py auth_manager.py accounts remove 2         # Remove account\n\nNotebook Management (notebook_manager.py)\npython scripts/run.py notebook_manager.py add --url URL --name NAME --description DESC --topics TOPICS\n# OR use notebook ID directly:\npython scripts/run.py notebook_manager.py add --notebook-id ID --name NAME --description DESC --topics TOPICS\npython scripts/run.py notebook_manager.py list\npython scripts/run.py notebook_manager.py search --query QUERY\npython scripts/run.py notebook_manager.py activate --id ID\npython scripts/run.py notebook_manager.py remove --id ID\npython scripts/run.py notebook_manager.py stats\n\nQuestion Interface (ask_question.py)\npython scripts/run.py ask_question.py --question \"...\" [--notebook-id ID] [--notebook-url URL] [--show-browser]\n\nSource Manager (source_manager.py)\n# Upload to active notebook\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --use-active\n\n# Create new notebook for upload\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --create-new\n\n# Upload to specific notebook\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --notebook-id NOTEBOOK_ID\n\n# Z-Library download and upload\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\" --use-active\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\" --create-new\n\n# Sync a folder (new!)\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --use-active\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --create-new\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --notebook-id NOTEBOOK_ID\n\n# Sync options (new!)\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --dry-run    # Preview only\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --rebuild   # Force re-hash all files\n\n\nFolder Sync:\n\nScans folder for supported types: PDF, TXT, MD, DOCX, HTML, EPUB\nTracks sync state internally (no per-folder tracking file to manage)\nSync strategy: add new, update modified (delete + re-upload), skip unchanged\nMulti-account aware (tracks which Google account was used) Note: One of --use-active, --create-new, or --notebook-id is REQUIRED. Uploads wait for NotebookLM processing and print progress as Ready: N/T. Press Ctrl+C to stop waiting. Local file uploads use browser automation and require Google authentication. If browser automation is unavailable, set NOTEBOOKLM_UPLOAD_MODE=text to upload extracted text instead (PDFs require pypdf).\nData Cleanup (cleanup_manager.py)\npython scripts/run.py cleanup_manager.py                    # Preview cleanup\npython scripts/run.py cleanup_manager.py --confirm          # Execute cleanup\npython scripts/run.py cleanup_manager.py --preserve-library # Keep notebooks\n\nWatchdog Status (auth_manager.py)\npython scripts/run.py auth_manager.py watchdog-status\n\nEnvironment Management\n\nThe virtual environment is automatically managed:\n\nFirst run creates .venv automatically\nDependencies install automatically\nNode.js dependencies install automatically\nagent-browser daemon starts on demand and keeps browser state in memory\ndaemon stops after 10 minutes of inactivity (any agent-browser command resets the timer)\nset AGENT_BROWSER_OWNER_PID to auto-stop when the agent process exits\nscripts/run.py sets AGENT_BROWSER_OWNER_PID to its parent PID by default\nEverything isolated in skill directory\n\nManual setup (only if automatic fails):\n\npython -m venv .venv\nsource .venv/bin/activate  # Linux/Mac\npip install -r requirements.txt\nnpm install\nnpm run install-browsers\n\nData Storage\n\nAll data stored in ~/.claude/skills/notebooklm/data/:\n\nlibrary.json - Notebook metadata (with account associations)\nauth/google/ - Multi-account Google auth\nindex.json - Account index (active account, list)\n<n>-<email>.json - Per-account credentials\nauth/zlibrary.json - Z-Library auth state\nagent_browser/session_id - Current daemon session ID\nagent_browser/last_activity.json - Last activity timestamp for idle shutdown\nagent_browser/watchdog.pid - Idle watchdog process ID\n\nSecurity: Protected by .gitignore, never commit to git.\n\nConfiguration\n\nOptional .env file in skill directory:\n\nHEADLESS=false           # Browser visibility\nSHOW_BROWSER=false       # Default browser display\nSTEALTH_ENABLED=true     # Human-like behavior\nTYPING_WPM_MIN=160       # Typing speed\nTYPING_WPM_MAX=240\nDEFAULT_NOTEBOOK_ID=     # Default notebook\n\nDecision Flow\nUser mentions NotebookLM\n    ↓\nCheck auth → python scripts/run.py auth_manager.py status\n    ↓\nIf not authenticated → python scripts/run.py auth_manager.py setup\n    ↓\nCheck/Add notebook → python scripts/run.py notebook_manager.py list/add (with --description)\n    ↓\nActivate notebook → python scripts/run.py notebook_manager.py activate --id ID\n    ↓\nAsk question → python scripts/run.py ask_question.py --question \"...\"\n    ↓\nSee \"Is that ALL you need?\" → Ask follow-ups until complete\n    ↓\nSynthesize and respond to user\n\nTroubleshooting\nProblem\tSolution\nModuleNotFoundError\tUse run.py wrapper\nAuthentication fails\tBrowser must be visible for setup! --show-browser\nDAEMON_UNAVAILABLE\tEnsure Node.js/npm installed, run npm install, retry\nAUTH_REQUIRED\tRun python scripts/run.py auth_manager.py setup\nELEMENT_NOT_FOUND\tVerify notebook URL and re-run with fresh page load\nRate limit (50/day)\tWait or add another Google account with accounts add\nBrowser crashes\tpython scripts/run.py cleanup_manager.py --preserve-library\nNotebook not found\tCheck with notebook_manager.py list\nBest Practices\nAlways use run.py - Handles environment automatically\nCheck auth first - Before any operations\nFollow-up questions - Don't stop at first answer\nBrowser visible for auth - Required for manual login\nInclude context - Each question is independent\nSynthesize answers - Combine multiple responses\nLimitations\nNo session persistence (each question = new browser)\nRate limits on free Google accounts (50 queries/day per account; use multiple accounts to increase)\nManual upload required (user must add docs to NotebookLM)\nBrowser overhead (few seconds per question)\nResources (Skill Structure)\n\nImportant directories and files:\n\nscripts/ - All automation scripts (ask_question.py, notebook_manager.py, etc.)\ndata/ - Local storage for authentication and notebook library\nreferences/ - Extended documentation:\napi_reference.md - Detailed API documentation for all scripts\ntroubleshooting.md - Common issues and solutions\nusage_patterns.md - Best practices and workflow examples\n.venv/ - Isolated Python environment (auto-created on first run)\n.gitignore - Protects sensitive data from being committed"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/magicseek/nblm",
    "publisherUrl": "https://clawhub.ai/magicseek/nblm",
    "owner": "magicseek",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/nblm",
    "downloadUrl": "https://openagent3.xyz/downloads/nblm",
    "agentUrl": "https://openagent3.xyz/skills/nblm/agent",
    "manifestUrl": "https://openagent3.xyz/skills/nblm/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/nblm/agent.md"
  }
}