[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7BKHVG4W4FBE8AC2VT47AV7":3,"skill-same:01M7BKHVG4W4FBE8AC2VT47AV7":52},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":31,"commitSha":32,"skillDirectory":33,"forksCount":34,"repositoryHtmlUrl":35,"repositoryHomepageUrl":6,"ownerHtmlUrl":36,"ownerBlogUrl":6,"ownerDescription":37,"updatedAt":38,"install":39,"resources":51},"01M7BKHVG4W4FBE8AC2VT47AV7","blog-notebooklm",null,"Query Google NotebookLM notebooks for source-grounded, citation-backed answers from user-uploaded documents. Manages notebook library, handles Google authentication, and supports smart discovery. Works standalone via \u002Fblog notebooklm or internally from blog-write and blog-researcher for Tier 1 research data. Falls back gracefully when not configured. Use when user says \"notebooklm\", \"notebook\", \"query notebook\", \"ask notebook\", \"notebook research\", \"source grounded research\", \"document query\", \"notebook library\".","om-scogo\u002Fskillsh-scraper","om-scogo","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160466840?v=4","01M79AWB6DFVCQ7RK70CS34B96","Om Achrekar","01M79AWB6ZM9SKR8KDH1WSSM22",0,"MIT","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fagricidaniel-claude-blog\u002Fblog-notebooklm\u002Fskills\u002Fblog-notebooklm\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: blog-notebooklm\ndescription: >\n  Query Google NotebookLM notebooks for source-grounded, citation-backed\n  answers from user-uploaded documents. Manages notebook library, handles\n  Google authentication, and supports smart discovery. Works standalone\n  via \u002Fblog notebooklm or internally from blog-write and blog-researcher\n  for Tier 1 research data. Falls back gracefully when not configured.\n  Use when user says \"notebooklm\", \"notebook\", \"query notebook\",\n  \"ask notebook\", \"notebook research\", \"source grounded research\",\n  \"document query\", \"notebook library\".\nuser-invokable: true\nargument-hint: \"[ask|discover|library|setup|status|cleanup] [question-or-url]\"\nlicense: MIT\nmetadata:\n  author: AgriciDaniel\n  version: \"1.9.1\"\n  source: \"https:\u002F\u002Fgithub.com\u002FPleasePrompto\u002Fnotebooklm-skill\"\n---\n\n# Blog NotebookLM: Source-Grounded Research from Your Documents\n\nQuery Google NotebookLM notebooks directly from Claude Code for citation-backed\nanswers from Gemini. Each question opens a headless browser session, retrieves\nthe answer exclusively from your uploaded documents, and closes. Responses are\nTier 1 quality (user's own primary sources): zero hallucination risk.\nAnswers satisfy the FLOW evidence triple: use the returned source title as the\ninline citation and the notebook URL plus retrieval date as the bibliography\nentry. This is the highest-confidence path to meeting the \"verified source\"\nbar that FLOW requires before any statistic goes public.\n\n## Quick Reference\n\n| Command | What it does |\n|---------|-------------|\n| `\u002Fblog notebooklm ask \u003Cquestion>` | Query a notebook for source-grounded answers |\n| `\u002Fblog notebooklm discover \u003Curl>` | Smart-discover notebook content before cataloging |\n| `\u002Fblog notebooklm library list` | List all notebooks in library |\n| `\u002Fblog notebooklm library add \u003Curl>` | Add a notebook to library |\n| `\u002Fblog notebooklm library search \u003Cquery>` | Search notebooks by keyword |\n| `\u002Fblog notebooklm library remove \u003Cid>` | Remove a notebook from library |\n| `\u002Fblog notebooklm setup` | One-time Google authentication (browser visible) |\n| `\u002Fblog notebooklm status` | Check authentication status |\n| `\u002Fblog notebooklm cleanup` | Clean browser state (preserves library) |\n\n## Prerequisites\n\n- Google account with NotebookLM access\n- Python 3.11+ (venv managed automatically by `run.py`)\n- Google Chrome (installed automatically on first run via Patchright)\n- One-time authentication setup (interactive Google login in visible browser)\n\n## Always Use run.py Wrapper\n\n**NEVER call scripts directly. ALWAYS use `python3 scripts\u002Frun.py [script]`:**\n\n```bash\n# CORRECT:\npython3 scripts\u002Frun.py auth_manager.py status\npython3 scripts\u002Frun.py ask_question.py --question \"...\"\n\n# WRONG -- fails without venv:\npython3 scripts\u002Fauth_manager.py status\n```\n\nThe `run.py` wrapper automatically creates `.venv`, installs dependencies,\nsets up Chrome, and executes the target script.\n\n## Auth Check (Gate Pattern)\n\nBefore any query operation, check authentication:\n\n```bash\npython3 scripts\u002Frun.py auth_manager.py status\n```\n\n- If authenticated: proceed with the query\n- If not authenticated: inform user and guide to setup:\n  \"NotebookLM requires Google login. Run `\u002Fblog notebooklm setup` to authenticate.\"\n- **When called internally** (from blog-write or blog-researcher): return silently\n  with no error if not authenticated. Never block the writing workflow.\n\n## Setup Workflow\n\nFor `\u002Fblog notebooklm setup`:\n\n```bash\n# Opens a visible browser for manual Google login (one-time)\npython3 scripts\u002Frun.py auth_manager.py setup\n```\n\nTell the user: \"A browser window will open. Please log in to your Google account.\"\nAuthentication persists via browser profile + cookie injection (hybrid approach).\n\nOther auth commands:\n```bash\npython3 scripts\u002Frun.py auth_manager.py status   # Check auth\npython3 scripts\u002Frun.py auth_manager.py reauth   # Re-authenticate\npython3 scripts\u002Frun.py auth_manager.py clear     # Clear all auth data\n```\n\n## Query Workflow\n\nFor `\u002Fblog notebooklm ask \u003Cquestion>`:\n\n### Step 1: Check Auth\nRun auth check (see gate pattern above). If not authenticated, guide to setup.\n\n### Step 2: Resolve Notebook\nDetermine which notebook to query:\n- If `--notebook-url` provided: use directly\n- If `--notebook-id` provided: look up in library\n- If neither: use active notebook from library\n- If no active notebook: show library and ask user to select\n\n### Step 3: Ask the Question\n```bash\n# Basic query (uses active notebook)\npython3 scripts\u002Frun.py ask_question.py --question \"Your question here\"\n\n# Query specific notebook by ID\npython3 scripts\u002Frun.py ask_question.py --question \"...\" --notebook-id notebook-id\n\n# Query by URL directly\npython3 scripts\u002Frun.py ask_question.py --question \"...\" --notebook-url \"https:\u002F\u002F...\"\n\n# JSON output (for internal\u002Fprogrammatic use)\npython3 scripts\u002Frun.py ask_question.py --question \"...\" --json\n\n# Show browser for debugging\npython3 scripts\u002Frun.py ask_question.py --question \"...\" --show-browser\n```\n\n### Step 4: Analyze and Follow Up\nEvery response ends with a follow-up prompt. **Required behavior:**\n1. **STOP**: do not immediately respond to the user\n2. **ANALYZE**: compare the answer to the user's original request\n3. **IDENTIFY GAPS**: determine if more information is needed\n4. **ASK FOLLOW-UP**: if gaps exist, immediately ask a follow-up question\n5. **REPEAT**: continue until information is complete\n6. **SYNTHESIZE**: combine all answers before responding to the user\n\n## Smart Discovery Workflow\n\nFor `\u002Fblog notebooklm discover \u003Curl>`:\n\nWhen adding a notebook without knowing its content, query it first:\n\n```bash\n# Step 1: Discover content\npython3 scripts\u002Frun.py ask_question.py \\\n  --question \"What is the content of this notebook? What topics are covered? Provide a complete overview briefly and concisely\" \\\n  --notebook-url \"\u003CURL>\"\n\n# Step 2: Add with discovered metadata\npython3 scripts\u002Frun.py notebook_manager.py add \\\n  --url \"\u003CURL>\" \\\n  --name \"\u003CBased on content>\" \\\n  --description \"\u003CBased on content>\" \\\n  --topics \"\u003CExtracted topics>\"\n```\n\n**NEVER guess or use generic descriptions.** Always discover or ask the user.\n\n## Library Management\n\n```bash\n# List all notebooks\npython3 scripts\u002Frun.py notebook_manager.py list\n\n# Add notebook (all params required -- discover or ask user!)\npython3 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\" \\\n  --topics \"topic1,topic2,topic3\"\n\n# Search by keyword\npython3 scripts\u002Frun.py notebook_manager.py search --query \"keyword\"\n\n# Set active notebook\npython3 scripts\u002Frun.py notebook_manager.py activate --id notebook-id\n\n# Remove notebook\npython3 scripts\u002Frun.py notebook_manager.py remove --id notebook-id\n\n# Library statistics\npython3 scripts\u002Frun.py notebook_manager.py stats\n```\n\n## Internal API (for blog-write \u002F blog-researcher)\n\nWhen invoked as a Task subagent from blog-write or blog-researcher:\n\n**Input** (provided by calling skill):\n- `question`: Research question relevant to the blog topic\n- `notebook_id` or `notebook_url`: Which notebook to query\n- `context`: \"internal\" (signals graceful fallback mode)\n\n**Process:**\n1. Check auth status: if not authenticated, return empty result silently\n2. Query the notebook with the research question\n3. Parse and return structured response\n\n**Output** (returned to calling skill):\n```markdown\n### NotebookLM Research\n- **Source:** [Notebook name]\n- **Question:** [What was asked]\n- **Answer:** [Source-grounded response from user's documents]\n- **Source Quality:** Tier 1 (user-uploaded primary documents)\n```\n\n**Graceful fallback:** If auth is missing or query fails, return immediately\nwith no error. The calling workflow continues with WebSearch-based research.\nNever block blog-write or blog-rewrite because NotebookLM is unavailable.\n\n## Data Storage\n\nAll data stored inside the skill directory:\n- `scripts\u002Fdata\u002Flibrary.json`: Notebook metadata and library\n- `scripts\u002Fdata\u002Fauth_info.json`: Authentication status\n- `scripts\u002Fdata\u002Fbrowser_state\u002F`: Chrome profile with cookies\n\n**Security:** All data directories are gitignored. Never commit auth or browser state.\n\n## Error Handling\n\n| Error | Resolution |\n|-------|-----------|\n| Not authenticated | Run `\u002Fblog notebooklm setup` |\n| ModuleNotFoundError | Always use `run.py` wrapper |\n| Browser crash | `cleanup_manager.py --confirm --preserve-library`, then re-auth |\n| Rate limit (50\u002Fday) | Wait until midnight PST or switch Google account |\n| Notebook not found | Check with `notebook_manager.py list` |\n| Query timeout (120s) | Retry with simpler question or `--show-browser` to debug |\n| MCP unavailable (internal) | Return silently: writing workflow uses WebSearch |\n\n## Limitations\n\n- No session persistence (each question = new browser session)\n- Rate limits on free Google accounts (50 queries\u002Fday)\n- Manual upload required (user must add docs to NotebookLM web UI)\n- Browser overhead (few seconds per question for launch + teardown)\n- Local Claude Code only (not available in web UI)\n\n## Reference Documentation\n\nLoad on-demand: do NOT load all at startup:\n- `references\u002Fcommands.md`: Full CLI commands, parameters, and workflow patterns\n- `references\u002Ftroubleshooting.md`: Error solutions, recovery procedures, debugging\n","# Blog NotebookLM: Source-Grounded Research from Your Documents\n\nQuery Google NotebookLM notebooks directly from Claude Code for citation-backed\nanswers from Gemini. Each question opens a headless browser session, retrieves\nthe answer exclusively from your uploaded documents, and closes. Responses are\nTier 1 quality (user's own primary sources): zero hallucination risk.\nAnswers satisfy the FLOW evidence triple: use the returned source title as the\ninline citation and the notebook URL plus retrieval date as the bibliography\nentry. This is the highest-confidence path to meeting the \"verified source\"\nbar that FLOW requires before any statistic goes public.\n\n## Quick Reference\n\n| Command | What it does |\n|---------|-------------|\n| `\u002Fblog notebooklm ask \u003Cquestion>` | Query a notebook for source-grounded answers |\n| `\u002Fblog notebooklm discover \u003Curl>` | Smart-discover notebook content before cataloging |\n| `\u002Fblog notebooklm library list` | List all notebooks in library |\n| `\u002Fblog notebooklm library add \u003Curl>` | Add a notebook to library |\n| `\u002Fblog notebooklm library search \u003Cquery>` | Search notebooks by keyword |\n| `\u002Fblog notebooklm library remove \u003Cid>` | Remove a notebook from library |\n| `\u002Fblog notebooklm setup` | One-time Google authentication (browser visible) |\n| `\u002Fblog notebooklm status` | Check authentication status |\n| `\u002Fblog notebooklm cleanup` | Clean browser state (preserves library) |\n\n## Prerequisites\n\n- Google account with NotebookLM access\n- Python 3.11+ (venv managed automatically by `run.py`)\n- Google Chrome (installed automatically on first run via Patchright)\n- One-time authentication setup (interactive Google login in visible browser)\n\n## Always Use run.py Wrapper\n\n**NEVER call scripts directly. ALWAYS use `python3 scripts\u002Frun.py [script]`:**\n\n```bash\n# CORRECT:\npython3 scripts\u002Frun.py auth_manager.py status\npython3 scripts\u002Frun.py ask_question.py --question \"...\"\n\n# WRONG -- fails without venv:\npython3 scripts\u002Fauth_manager.py status\n```\n\nThe `run.py` wrapper automatically creates `.venv`, installs dependencies,\nsets up Chrome, and executes the target script.\n\n## Auth Check (Gate Pattern)\n\nBefore any query operation, check authentication:\n\n```bash\npython3 scripts\u002Frun.py auth_manager.py status\n```\n\n- If authenticated: proceed with the query\n- If not authenticated: inform user and guide to setup:\n  \"NotebookLM requires Google login. Run `\u002Fblog notebooklm setup` to authenticate.\"\n- **When called internally** (from blog-write or blog-researcher): return silently\n  with no error if not authenticated. Never block the writing workflow.\n\n## Setup Workflow\n\nFor `\u002Fblog notebooklm setup`:\n\n```bash\n# Opens a visible browser for manual Google login (one-time)\npython3 scripts\u002Frun.py auth_manager.py setup\n```\n\nTell the user: \"A browser window will open. Please log in to your Google account.\"\nAuthentication persists via browser profile + cookie injection (hybrid approach).\n\nOther auth commands:\n```bash\npython3 scripts\u002Frun.py auth_manager.py status   # Check auth\npython3 scripts\u002Frun.py auth_manager.py reauth   # Re-authenticate\npython3 scripts\u002Frun.py auth_manager.py clear     # Clear all auth data\n```\n\n## Query Workflow\n\nFor `\u002Fblog notebooklm ask \u003Cquestion>`:\n\n### Step 1: Check Auth\nRun auth check (see gate pattern above). If not authenticated, guide to setup.\n\n### Step 2: Resolve Notebook\nDetermine which notebook to query:\n- If `--notebook-url` provided: use directly\n- If `--notebook-id` provided: look up in library\n- If neither: use active notebook from library\n- If no active notebook: show library and ask user to select\n\n### Step 3: Ask the Question\n```bash\n# Basic query (uses active notebook)\npython3 scripts\u002Frun.py ask_question.py --question \"Your question here\"\n\n# Query specific notebook by ID\npython3 scripts\u002Frun.py ask_question.py --question \"...\" --notebook-id notebook-id\n\n# Query by URL directly\npython3 scripts\u002Frun.py ask_question.py --question \"...\" --notebook-url \"https:\u002F\u002F...\"\n\n# JSON output (for internal\u002Fprogrammatic use)\npython3 scripts\u002Frun.py ask_question.py --question \"...\" --json\n\n# Show browser for debugging\npython3 scripts\u002Frun.py ask_question.py --question \"...\" --show-browser\n```\n\n### Step 4: Analyze and Follow Up\nEvery response ends with a follow-up prompt. **Required behavior:**\n1. **STOP**: do not immediately respond to the user\n2. **ANALYZE**: compare the answer to the user's original request\n3. **IDENTIFY GAPS**: determine if more information is needed\n4. **ASK FOLLOW-UP**: if gaps exist, immediately ask a follow-up question\n5. **REPEAT**: continue until information is complete\n6. **SYNTHESIZE**: combine all answers before responding to the user\n\n## Smart Discovery Workflow\n\nFor `\u002Fblog notebooklm discover \u003Curl>`:\n\nWhen adding a notebook without knowing its content, query it first:\n\n```bash\n# Step 1: Discover content\npython3 scripts\u002Frun.py ask_question.py \\\n  --question \"What is the content of this notebook? What topics are covered? Provide a complete overview briefly and concisely\" \\\n  --notebook-url \"\u003CURL>\"\n\n# Step 2: Add with discovered metadata\npython3 scripts\u002Frun.py notebook_manager.py add \\\n  --url \"\u003CURL>\" \\\n  --name \"\u003CBased on content>\" \\\n  --description \"\u003CBased on content>\" \\\n  --topics \"\u003CExtracted topics>\"\n```\n\n**NEVER guess or use generic descriptions.** Always discover or ask the user.\n\n## Library Management\n\n```bash\n# List all notebooks\npython3 scripts\u002Frun.py notebook_manager.py list\n\n# Add notebook (all params required -- discover or ask user!)\npython3 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\" \\\n  --topics \"topic1,topic2,topic3\"\n\n# Search by keyword\npython3 scripts\u002Frun.py notebook_manager.py search --query \"keyword\"\n\n# Set active notebook\npython3 scripts\u002Frun.py notebook_manager.py activate --id notebook-id\n\n# Remove notebook\npython3 scripts\u002Frun.py notebook_manager.py remove --id notebook-id\n\n# Library statistics\npython3 scripts\u002Frun.py notebook_manager.py stats\n```\n\n## Internal API (for blog-write \u002F blog-researcher)\n\nWhen invoked as a Task subagent from blog-write or blog-researcher:\n\n**Input** (provided by calling skill):\n- `question`: Research question relevant to the blog topic\n- `notebook_id` or `notebook_url`: Which notebook to query\n- `context`: \"internal\" (signals graceful fallback mode)\n\n**Process:**\n1. Check auth status: if not authenticated, return empty result silently\n2. Query the notebook with the research question\n3. Parse and return structured response\n\n**Output** (returned to calling skill):\n```markdown\n### NotebookLM Research\n- **Source:** [Notebook name]\n- **Question:** [What was asked]\n- **Answer:** [Source-grounded response from user's documents]\n- **Source Quality:** Tier 1 (user-uploaded primary documents)\n```\n\n**Graceful fallback:** If auth is missing or query fails, return immediately\nwith no error. The calling workflow continues with WebSearch-based research.\nNever block blog-write or blog-rewrite because NotebookLM is unavailable.\n\n## Data Storage\n\nAll data stored inside the skill directory:\n- `scripts\u002Fdata\u002Flibrary.json`: Notebook metadata and library\n- `scripts\u002Fdata\u002Fauth_info.json`: Authentication status\n- `scripts\u002Fdata\u002Fbrowser_state\u002F`: Chrome profile with cookies\n\n**Security:** All data directories are gitignored. Never commit auth or browser state.\n\n## Error Handling\n\n| Error | Resolution |\n|-------|-----------|\n| Not authenticated | Run `\u002Fblog notebooklm setup` |\n| ModuleNotFoundError | Always use `run.py` wrapper |\n| Browser crash | `cleanup_manager.py --confirm --preserve-library`, then re-auth |\n| Rate limit (50\u002Fday) | Wait until midnight PST or switch Google account |\n| Notebook not found | Check with `notebook_manager.py list` |\n| Query timeout (120s) | Retry with simpler question or `--show-browser` to debug |\n| MCP unavailable (internal) | Return silently: writing workflow uses WebSearch |\n\n## Limitations\n\n- No session persistence (each question = new browser session)\n- Rate limits on free Google accounts (50 queries\u002Fday)\n- Manual upload required (user must add docs to NotebookLM web UI)\n- Browser overhead (few seconds per question for launch + teardown)\n- Local Claude Code only (not available in web UI)\n\n## Reference Documentation\n\nLoad on-demand: do NOT load all at startup:\n- `references\u002Fcommands.md`: Full CLI commands, parameters, and workflow patterns\n- `references\u002Ftroubleshooting.md`: Error solutions, recovery procedures, debugging\n",{"name":5,"license":15,"metadata":24,"description":28,"argument-hint":29,"user-invokable":30},{"author":25,"source":26,"version":27},"AgriciDaniel","https:\u002F\u002Fgithub.com\u002FPleasePrompto\u002Fnotebooklm-skill","1.9.1","Query Google NotebookLM notebooks for source-grounded, citation-backed answers from user-uploaded documents. Manages notebook library, handles Google authentication, and supports smart discovery. Works standalone via \u002Fblog notebooklm or internally from blog-write and blog-researcher for Tier 1 research data. Falls back gracefully when not configured. Use when user says \"notebooklm\", \"notebook\", \"query notebook\", \"ask notebook\", \"notebook research\", \"source grounded research\", \"document query\", \"notebook library\".\n","[ask|discover|library|setup|status|cleanup] [question-or-url]",true,"main","8859218955d9504cd18b59e7892100718039d3b4","data\u002Fskills\u002Fagricidaniel-claude-blog\u002Fblog-notebooklm\u002Fskills\u002Fblog-notebooklm",1,"https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper","https:\u002F\u002Fgithub.com\u002Fom-scogo","SDE-1 @ Scogo ","2026-07-18 12:22:46",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":30},[41,44,47],{"tool":42,"command":43},"npx","npx skills add om-scogo\u002Fskillsh-scraper --skill blog-notebooklm",{"tool":45,"command":46},"bunx","bunx skills add om-scogo\u002Fskillsh-scraper --skill blog-notebooklm",{"tool":48,"command":49},"pnpm","pnpm dlx skills add om-scogo\u002Fskillsh-scraper --skill blog-notebooklm","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fagricidaniel-claude-blog\u002Fblog-notebooklm\u002Fskills\u002Fblog-notebooklm\u002FSKILL.md",[],[53,60,65,72,77,84],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M7D6MC9FAAEV4CMNYX8W7JTG","arxiv-search","Search arXiv physics, math, and computer science preprints using natural language queries. Powered by Valyu semantic search.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fyorkeccak-scientific-skills\u002Farxiv-search\u002Fskills\u002Farxiv-search\u002FSKILL.md",[],[],{"skillNo":61,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":19},"01M7D6M85CKKN87TA98VCQV4H7","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fyorkeccak-scientific-skills\u002Farxiv-search\u002FSkill.md",[],[],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":19},"01M7D4ZTCS4DR3CE4JY06X84T2","working-with-legacy-code","Safely change and test untested codebases using Feathers' \"Working Effectively with Legacy Code\". Use when the user mentions \"legacy code\", \"no tests\", \"untested codebase\", \"how do I test this\", \"seams\", \"characterization tests\", \"golden master\", \"sprout method\", \"afraid to change this code\", \"monster method\", \"dependency breaking\", or \"inherited a messy codebase\". Also trigger when changing code without tests safely, getting a class under test when constructors, statics, or singletons block it, adding features to tangled modules, or planning incremental test coverage for an old codebase. Covers the legacy-code change algorithm, seams, characterization tests, sprout\u002Fwrap, and dependency-breaking techniques. For refactoring code that already has tests, see refactoring-patterns. For day-to-day code quality, see clean-code.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fworking-with-legacy-code\u002Fworking-with-legacy-code\u002FSKILL.md",[],[],{"skillNo":73,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M7D4ZHZKJD2RSNGAF63V14P4","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fworking-with-legacy-code\u002FSkill.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M7D4ZB4CJBFW5JE67CPH2QRV","web-typography","Select, pair, and implement typefaces for web projects. Use when the user mentions \"font pairing\", \"which typeface\", \"line height\", \"responsive typography\", \"web font loading\", \"type hierarchy\", \"variable fonts\", \"FOUT\u002FFOIT\", \"typographic scale\", or \"the text is hard to read\". Also trigger when choosing between system fonts and web fonts, optimizing font-loading performance, or designing readable long-form content. Covers readability evaluation, CSS implementation, and performance optimization. For overall UI design systems, see refactoring-ui. For dramatic typographic experiences, see top-design.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fweb-typography\u002Fweb-typography\u002FSKILL.md",[],[],{"skillNo":85,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":19},"01M7D4Z4MVYVY3NMJ18BNV6WNA","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fweb-typography\u002FSkill.md",[],[]]