[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-a7649fa9-c145-4632-be06-7bb96ed3f21f":3,"$fP6fQ-3vGqMnieLGXiInBV6lVd0uZLyFQKJL9AlOuakw":42},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":33},"a7649fa9-c145-4632-be06-7bb96ed3f21f","notebooklm","与Google NotebookLM交互，使用Gemini的源定位答案查询文档。每个问题都会打开一个新的浏览器会话，仅从您上传的文档中检索答案，然后关闭。","cat_coding_backend","mod_coding","sickn33,coding","---\nname: notebooklm\ndescription: \"Interact with Google NotebookLM to query documentation with Gemini's source-grounded answers. Each question opens a fresh browser session, retrieves the answer exclusively from your uploaded documents, and closes.\"\nrisk: unknown\nsource: community\ndate_added: \"2026-02-27\"\n---\n\n# NotebookLM Research Assistant Skill\n\nInteract with Google NotebookLM to query documentation with Gemini's source-grounded answers. Each question opens a fresh browser session, retrieves the answer exclusively from your uploaded documents, and closes.\n\n## When to Use This Skill\n\nTrigger when user:\n- Mentions NotebookLM explicitly\n- Shares NotebookLM URL (`https:\u002F\u002Fnotebooklm.google.com\u002Fnotebook\u002F...`)\n- Asks to query their notebooks\u002Fdocumentation\n- Wants to add documentation to NotebookLM library\n- Uses phrases like \"ask my NotebookLM\", \"check my docs\", \"query my notebook\"\n\n## ⚠️ CRITICAL: Add Command - Smart Discovery\n\nWhen user wants to add a notebook without providing details:\n\n**SMART ADD (Recommended)**: Query the notebook first to discover its content:\n```bash\n# Step 1: Query the notebook about its content\npython scripts\u002Frun.py ask_question.py --question \"What is the content of this notebook? What topics are covered? Provide a complete overview briefly and concisely\" --notebook-url \"[URL]\"\n\n# Step 2: Use the discovered information to add it\npython scripts\u002Frun.py notebook_manager.py add --url \"[URL]\" --name \"[Based on content]\" --description \"[Based on content]\" --topics \"[Based on content]\"\n```\n\n**MANUAL ADD**: If user provides all details:\n- `--url` - The NotebookLM URL\n- `--name` - A descriptive name\n- `--description` - What the notebook contains (REQUIRED!)\n- `--topics` - Comma-separated topics (REQUIRED!)\n\nNEVER guess or use generic descriptions! If details missing, use Smart Add to discover them.\n\n## Critical: Always Use run.py Wrapper\n\n**NEVER call scripts directly. ALWAYS use `python scripts\u002Frun.py [script]`:**\n\n```bash\n# ✅ CORRECT - Always use run.py:\npython scripts\u002Frun.py auth_manager.py status\npython scripts\u002Frun.py notebook_manager.py list\npython scripts\u002Frun.py ask_question.py --question \"...\"\n\n# ❌ WRONG - Never call directly:\npython scripts\u002Fauth_manager.py status  # Fails without venv!\n```\n\nThe `run.py` wrapper automatically:\n1. Creates `.venv` if needed\n2. Installs all dependencies\n3. Activates environment\n4. Executes script properly\n\n## Core Workflow\n\n### Step 1: Check Authentication Status\n```bash\npython scripts\u002Frun.py auth_manager.py status\n```\n\nIf not authenticated, proceed to setup.\n\n### Step 2: Authenticate (One-Time Setup)\n```bash\n# Browser MUST be visible for manual Google login\npython scripts\u002Frun.py auth_manager.py setup\n```\n\n**Important:**\n- Browser is VISIBLE for authentication\n- Browser window opens automatically\n- User must manually log in to Google\n- Tell user: \"A browser window will open for Google login\"\n\n### Step 3: Manage Notebook Library\n\n```bash\n# List all notebooks\npython scripts\u002Frun.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\u002Frun.py notebook_manager.py add \\\n  --url \"https:\u002F\u002Fnotebooklm.google.com\u002Fnotebook\u002F...\" \\\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\u002Frun.py notebook_manager.py search --query \"keyword\"\n\n# Set active notebook\npython scripts\u002Frun.py notebook_manager.py activate --id notebook-id\n\n# Remove notebook\npython scripts\u002Frun.py notebook_manager.py remove --id notebook-id\n```\n\n### Quick Workflow\n1. Check library: `python scripts\u002Frun.py notebook_manager.py list`\n2. Ask question: `python scripts\u002Frun.py ask_question.py --question \"...\" --notebook-id ID`\n\n### Step 4: Ask Questions\n\n```bash\n# Basic query (uses active notebook if set)\npython scripts\u002Frun.py ask_question.py --question \"Your question here\"\n\n# Query specific notebook\npython scripts\u002Frun.py ask_question.py --question \"...\" --notebook-id notebook-id\n\n# Query with notebook URL directly\npython scripts\u002Frun.py ask_question.py --question \"...\" --notebook-url \"https:\u002F\u002F...\"\n\n# Show browser for debugging\npython scripts\u002Frun.py ask_question.py --question \"...\" --show-browser\n```\n\n## Follow-Up Mechanism (CRITICAL)\n\nEvery NotebookLM answer ends with: **\"EXTREMELY IMPORTANT: Is that ALL you need to know?\"**\n\n**Required Claude Behavior:**\n1. **STOP** - Do not immediately respond to user\n2. **ANALYZE** - Compare answer to user's original request\n3. **IDENTIFY GAPS** - Determine if more information needed\n4. **ASK FOLLOW-UP** - If gaps exist, immediately ask:\n   ```bash\n   python scripts\u002Frun.py ask_question.py --question \"Follow-up with context...\"\n   ```\n5. **REPEAT** - Continue until information is complete\n6. **SYNTHESIZE** - Combine all answers before responding to user\n\n## Script Reference\n\n### Authentication Management (`auth_manager.py`)\n```bash\npython scripts\u002Frun.py auth_manager.py setup    # Initial setup (browser visible)\npython scripts\u002Frun.py auth_manager.py status   # Check authentication\npython scripts\u002Frun.py auth_manager.py reauth   # Re-authenticate (browser visible)\npython scripts\u002Frun.py auth_manager.py clear    # Clear authentication\n```\n\n### Notebook Management (`notebook_manager.py`)\n```bash\npython scripts\u002Frun.py notebook_manager.py add --url URL --name NAME --description DESC --topics TOPICS\npython scripts\u002Frun.py notebook_manager.py list\npython scripts\u002Frun.py notebook_manager.py search --query QUERY\npython scripts\u002Frun.py notebook_manager.py activate --id ID\npython scripts\u002Frun.py notebook_manager.py remove --id ID\npython scripts\u002Frun.py notebook_manager.py stats\n```\n\n### Question Interface (`ask_question.py`)\n```bash\npython scripts\u002Frun.py ask_question.py --question \"...\" [--notebook-id ID] [--notebook-url URL] [--show-browser]\n```\n\n### Data Cleanup (`cleanup_manager.py`)\n```bash\npython scripts\u002Frun.py cleanup_manager.py                    # Preview cleanup\npython scripts\u002Frun.py cleanup_manager.py --confirm          # Execute cleanup\npython scripts\u002Frun.py cleanup_manager.py --preserve-library # Keep notebooks\n```\n\n## Environment Management\n\nThe virtual environment is automatically managed:\n- First run creates `.venv` automatically\n- Dependencies install automatically\n- Chromium browser installs automatically\n- Everything isolated in skill directory\n\nManual setup (only if automatic fails):\n```bash\npython -m venv .venv\nsource .venv\u002Fbin\u002Factivate  # Linux\u002FMac\npip install -r requirements.txt\npython -m patchright install chromium\n```\n\n## Data Storage\n\nAll data stored in `~\u002F.claude\u002Fskills\u002Fnotebooklm\u002Fdata\u002F`:\n- `library.json` - Notebook metadata\n- `auth_info.json` - Authentication status\n- `browser_state\u002F` - Browser cookies and session\n\n**Security:** Protected by `.gitignore`, never commit to git.\n\n## Configuration\n\nOptional `.env` file in skill directory:\n```env\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```\n\n## Decision Flow\n\n```\nUser mentions NotebookLM\n    ↓\nCheck auth → python scripts\u002Frun.py auth_manager.py status\n    ↓\nIf not authenticated → python scripts\u002Frun.py auth_manager.py setup\n    ↓\nCheck\u002FAdd notebook → python scripts\u002Frun.py notebook_manager.py list\u002Fadd (with --description)\n    ↓\nActivate notebook → python scripts\u002Frun.py notebook_manager.py activate --id ID\n    ↓\nAsk question → python scripts\u002Frun.py ask_question.py --question \"...\"\n    ↓\nSee \"Is that ALL you need?\" → Ask follow-ups until complete\n    ↓\nSynthesize and respond to user\n```\n\n## Troubleshooting\n\n| Problem | Solution |\n|---------|----------|\n| ModuleNotFoundError | Use `run.py` wrapper |\n| Authentication fails | Browser must be visible for setup! --show-browser |\n| Rate limit (50\u002Fday) | Wait or switch Google account |\n| Browser crashes | `python scripts\u002Frun.py cleanup_manager.py --preserve-library` |\n| Notebook not found | Check with `notebook_manager.py list` |\n\n## Best Practices\n\n1. **Always use run.py** - Handles environment automatically\n2. **Check auth first** - Before any operations\n3. **Follow-up questions** - Don't stop at first answer\n4. **Browser visible for auth** - Required for manual login\n5. **Include context** - Each question is independent\n6. **Synthesize answers** - Combine multiple responses\n\n## Limitations\n\n- No session persistence (each question = new browser)\n- Rate limits on free Google accounts (50 queries\u002Fday)\n- Manual upload required (user must add docs to NotebookLM)\n- Browser overhead (few seconds per question)\n\n## Resources (Skill Structure)\n\n**Important directories and files:**\n\n- `scripts\u002F` - All automation scripts (ask_question.py, notebook_manager.py, etc.)\n- `data\u002F` - Local storage for authentication and notebook library\n- `references\u002F` - Extended documentation:\n  - `api_reference.md` - Detailed API documentation for all scripts\n  - `troubleshooting.md` - Common issues and solutions\n  - `usage_patterns.md` - Best practices and workflow examples\n- `.venv\u002F` - Isolated Python environment (auto-created on first run)\n- `.gitignore` - Protects sensitive data from being committed\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,84,1907,"2026-05-16 13:31:09",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":25,"skillCount":32,"createdAt":26},"后端开发","backend","mdi-server","API、数据库、服务端架构",296,[34],{"id":35,"skillId":4,"version":36,"fileName":37,"fileSize":38,"filePath":39,"fileHash":40,"manifest":41,"createdAt":19},"90ccf78d-8552-489c-9a83-7f33bdadf9d6","1.0.0","notebooklm.zip",181310,"uploads\u002Fskills\u002Fa7649fa9-c145-4632-be06-7bb96ed3f21f\u002Fnotebooklm.zip","93c1c8da83c91a7753a5a9261e2a44252f889396ed74aa439c30f9a6adbc5cee","[{\"path\":\".gitignore\",\"isDirectory\":false,\"size\":723},{\"path\":\"AUTHENTICATION.md\",\"isDirectory\":false,\"size\":5729},{\"path\":\"CHANGELOG.md\",\"isDirectory\":false,\"size\":1774},{\"path\":\"LICENSE\",\"isDirectory\":false,\"size\":1072},{\"path\":\"README.md\",\"isDirectory\":false,\"size\":15901},{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":9449},{\"path\":\"images\u002Fexample_notebookchat.png\",\"isDirectory\":false,\"size\":137552},{\"path\":\"references\u002Fapi_reference.md\",\"isDirectory\":false,\"size\":7630},{\"path\":\"references\u002Ftroubleshooting.md\",\"isDirectory\":false,\"size\":8994},{\"path\":\"references\u002Fusage_patterns.md\",\"isDirectory\":false,\"size\":9574},{\"path\":\"requirements.txt\",\"isDirectory\":false,\"size\":326},{\"path\":\"scripts\u002F__init__.py\",\"isDirectory\":false,\"size\":2627},{\"path\":\"scripts\u002Fask_question.py\",\"isDirectory\":false,\"size\":8196},{\"path\":\"scripts\u002Fauth_manager.py\",\"isDirectory\":false,\"size\":11903},{\"path\":\"scripts\u002Fbrowser_session.py\",\"isDirectory\":false,\"size\":8969},{\"path\":\"scripts\u002Fbrowser_utils.py\",\"isDirectory\":false,\"size\":3491},{\"path\":\"scripts\u002Fcleanup_manager.py\",\"isDirectory\":false,\"size\":9777},{\"path\":\"scripts\u002Fconfig.py\",\"isDirectory\":false,\"size\":1228},{\"path\":\"scripts\u002Fnotebook_manager.py\",\"isDirectory\":false,\"size\":13843},{\"path\":\"scripts\u002Frun.py\",\"isDirectory\":false,\"size\":2967},{\"path\":\"scripts\u002Fsetup_environment.py\",\"isDirectory\":false,\"size\":7168}]",{"code":43,"message":44,"data":45},200,"success",{"items":46,"stats":47,"page":50},[],{"averageRating":48,"totalRatings":48,"ratingCounts":49},0,[48,48,48,48,48],{"limit":51,"offset":48,"hasMore":52,"nextOffset":51,"ratedOnly":16},15,false]