From research-lab
NotebookLM-powered research: create a notebook, seed sources, fire deep web research, curate sources with the user, run synthesis queries, and produce a structured summary. Use standalone for any knowledge gathering task, not just as a pipeline step. Say "research this topic", "build a notebook on", "literary review of", or "gather research on". Migrated from ideate:research with improvements for engagement directory integration.
How this skill is triggered — by the user, by Claude, or both
Slash command
/research-lab:literary-reviewThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Gather and synthesize knowledge via NotebookLM. Works standalone or as Phase 3 of a research engagement.
Gather and synthesize knowledge via NotebookLM. Works standalone or as Phase 3 of a research engagement.
NotebookLM CLI reference: ${CLAUDE_PLUGIN_ROOT}/skills/literary-review/references/notebooklm-cli.md
NotebookLM scripts: ${CLAUDE_PLUGIN_ROOT}/scripts/notebook-*.sh — use these instead of calling notebooklm directly. They encode the correct CLI syntax.
Check for an existing research session:
ENGAGEMENT_DIR="${ENGAGEMENT_DIR:-.}"
test -f "$ENGAGEMENT_DIR/.research.json" && python3 -c "
import json
with open('$ENGAGEMENT_DIR/.research.json') as f:
d = json.load(f)
print(d.get('status', 'none'))
print(d.get('notebook_id', ''))
print(d.get('title', ''))
"
status: gathering → research still running. Check with notebooklm research status -n NOTEBOOK_ID.status: ready → sources imported. Skip to Phase 3 (Source Review).status: synthesized → already done. Report and offer to re-query.Extract from the user's message or PI's spawn prompt:
topic: research subject (notebook title and research query)seed_urls: starting point URLs (0 or more)focus: specific angle or constraintsnotebook_id: existing NotebookLM notebook to reuse (if provided)Before creating a new notebook, check if a relevant one already exists from a prior engagement. Topics like "Drupal cache optimization" or "CDN integration patterns" are project-agnostic — the same reference material applies across projects.
# List existing notebooks
notebooklm list 2>/dev/null | grep -i "<topic keywords>"
If an existing notebook covers the same domain, reuse it by passing its ID. You can still add project-specific seed URLs as new sources. Only create a new notebook if no relevant one exists.
Defaults:
"Research: <topic>"Write session state:
python3 -c "
import json
state = {
'version': '1.0',
'title': 'Research: TOPIC',
'topic': 'TOPIC',
'focus': 'FOCUS',
'seed_urls': [],
'notebook_id': '',
'status': 'creating'
}
with open('$ENGAGEMENT_DIR/.research.json', 'w') as f:
json.dump(state, f, indent=2)
"
Use the setup script to create, seed, and fire research in one step:
NOTEBOOK_ID=$(${CLAUDE_PLUGIN_ROOT}/scripts/notebook-setup.sh "Research: TOPIC" \
--seed-url "URL1" --seed-url "URL2" \
--research "TOPIC FOCUS" --no-wait)
Update .research.json with the notebook ID and set status to gathering.
If the user provided a notebook ID, skip creation. Set it in .research.json and proceed to Phase 3.
Spawn a background agent to wait:
Agent(
description="Wait for NotebookLM research",
subagent_type="general-purpose",
run_in_background=true,
prompt="Wait for NotebookLM deep research to complete.
Run: notebooklm research wait -n NOTEBOOK_ID
When complete, run: notebooklm source list -n NOTEBOOK_ID --json
Count sources with status=ready.
Update $ENGAGEMENT_DIR/.research.json: set status='ready', source_count=N."
)
Tell the user: research is running (15-30 minutes). Offer to add more URLs while waiting.
notebooklm source list -n NOTEBOOK_ID
Show the source list. Ask the user/PI:
"Here are the gathered sources. Remove any irrelevant ones? Add any missing URLs?"
Handle removals:
notebooklm source delete SOURCE_ID -n NOTEBOOK_ID
Handle additions:
notebooklm source add "URL" -n NOTEBOOK_ID --json
Run a structured synthesis query using the ask script:
${CLAUDE_PLUGIN_ROOT}/scripts/notebook-ask.sh NOTEBOOK_ID \
"Summarize the key themes, best practices, and important distinctions across all sources on: TOPIC FOCUS. Structure: (1) core concepts, (2) common patterns, (3) known pitfalls or debates."
Save the synthesis as a notebook note:
${CLAUDE_PLUGIN_ROOT}/scripts/notebook-ask.sh NOTEBOOK_ID \
"Summarize the key themes, best practices, and important distinctions across all sources on: TOPIC FOCUS. Structure: (1) core concepts, (2) common patterns, (3) known pitfalls or debates." \
--save-as-note --note-title "Research Summary: TOPIC"
Write 02-literary-review.md to the engagement directory. Structure:
# Literary Review: TOPIC
## Notebook
- ID: NOTEBOOK_ID
- Sources: N curated sources
- Research mode: deep web
## Core Concepts
<from synthesis>
## Common Patterns
<from synthesis>
## Known Pitfalls and Debates
<from synthesis>
## Key Sources
<top 5 sources with brief descriptions>
Update .research.json status to synthesized.
If running standalone (not inside research-lab:run):
VAULT_ROOT="$HOME/Vaults/${OBSIDIAN_VAULT_NAME:-Neurons}"
TOPIC_SLUG="<kebab-case-topic>"
DEST="Research/$TOPIC_SLUG/$(date +%Y-%m-%d)-literary-review.md"
mkdir -p "$VAULT_ROOT/$(dirname "$DEST")"
cp "$ENGAGEMENT_DIR/02-literary-review.md" "$VAULT_ROOT/$DEST"
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub cosmicdreams/claude-plugins --plugin research-lab