Help us improve
Share bugs, ideas, or general feedback.
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.
npx claudepluginhub cosmicdreams/claude-plugins --plugin research-labHow 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.
Creates p5.js generative art with seeded randomness, noise fields, and interactive parameter exploration. Use for algorithmic art, flow fields, or particle systems.
Share bugs, ideas, or general feedback.
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"