grind-lab-core/night_owl_research_agent/lit-review

Claude Code and agent skill by grind-lab-core/night_owl_research_agent

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Retrieves papers from local folder or ArXiv and Semantic Scholar using domain-aware keyword expansion, builds synthesis matrix, identifies gaps. Calls tools/arxiv_fetch.py and tools/semantic_scholar_fetch.py. Writes to output/paper-cache/ and output/LIT_REVIEW_REPORT.md.

Install

npx vskill@latest install grind-lab-core/night_owl_research_agent/lit-review

SKILL.md

Skill: lit-review

You perform a targeted literature review for $ARGUMENTS. Your outputs feed idea discovery and paper writing. This skill checks multiple sources in priority order. All are optional — if a source is not configured or not requested, skip it silently.

Research topic: $ARGUMENTS


Constants

  • PAPER_LIBRARY — Local directory containing user's paper collection (PDFs). Check these paths in order:
  1. papers/ in the current project directory
  2. Custom path specified by user in CLAUDE.md under ## Constants
  • MAX_LOCAL_PAPERS = 30 — Maximum number of local PDFs to scan (read first 3 pages each). If more are found, prioritize by filename relevance to the topic.
  • ARXIV_DOWNLOAD = false — When true, download top 3-5 most relevant arXiv PDFs to PAPER_LIBRARY after search. When false (default), only fetch metadata (title, abstract, authors) via arXiv API — no files are downloaded.
  • ARXIV_MAX_DOWNLOAD = 5 — Maximum number of PDFs to download when ARXIV_DOWNLOAD = true.
💡 Overrides:
- /lit-review "topic" — paper library: ~/my_papers/ — custom local PDF path
Source Selection

Parse $ARGUMENTS for a — sources: directive:

  • If `— sources:` is specified: Only search the listed sources (comma-separated). Valid values: zotero, obsidian, local, web, semantic-scholar, all.
  • If not specified: Default to all — search every available source in priority order (semantic-scholar is excluded from all; it must be explicitly listed).

Examples:

/lit-review "diffusion models" → all (default, no S2)
/lit-review "diffusion models" — sources: all → all (default, no S2)
/lit-review "diffusion models" — sources: zotero → Zotero only
/lit-review "diffusion models" — sources: zotero, web → Zotero + web
/lit-review "diffusion models" — sources: local → local PDFs only
/lit-review "topic" — sources: obsidian, local, web → skip Zotero
/lit-review "topic" — sources: web, semantic-scholar → web + S2 API (IEEE/ACM venue papers)
/lit-review "topic" — sources: all, semantic-scholar → all + S2 API
Source Table
PrioritySourceIDHow to detectWhat it provides
1Zotero (via MCP)zoteroTry calling any mcp__zotero__* tool — if unavailable, skipCollections, tags, annotations, PDF highlights, BibTeX, semantic search
2Obsidian (via MCP)obsidianTry calling any mcp__obsidian-vault__* tool — if unavailable, skipResearch notes, paper summaries, tagged references, wikilinks
3Local PDFslocalGlob: papers/**/*.pdfRaw PDF content (first 3 pages)
4Web searchwebAlways available (WebSearch)arXiv, Semantic Scholar, Google Scholar
5Semantic Scholar APIsemantic-scholartools/semantic_scholar_fetch.py existsPublished venue papers (IEEE, ACM, Springer) with structured metadata: citation counts, venue info, TLDR. Only runs when explicitly requested via — sources: semantic-scholar or — sources: web, semantic-scholar
Graceful degradation: If no MCP servers are configured, the skill works exactly as before (local PDFs + web search). Zotero and Obsidian are pure additions.

Workflow

Step 0a: Search Zotero Library (if available)

Skip this step entirely if Zotero MCP is not configured.

Try calling a Zotero MCP tool (e.g., search). If it succeeds:

  1. Search by topic: Use the Zotero search tool to find papers matching the research topic
  2. Read collections: Check if the user has a relevant collection/folder for this topic
  3. Extract annotations: For highly relevant papers, pull PDF highlights and notes — these represent what the user found important
  4. Export BibTeX: Get citation data for relevant papers (useful for /paper-draft later)
  5. Compile results: For each relevant Zotero entry, extract:
  • Title, authors, year, venue
  • User's annotations/highlights (if any)
  • Tags the user assigned
  • Which collection it belongs to
📚 Zotero annotations are gold — they show what the user personally highlighted as important, which is far more valuable than generic summaries.
Step 0b: Search Obsidian Vault (if available)

Skip this step entirely if Obsidian MCP is not configured.

Try calling an Obsidian MCP tool (e.g., search). If it succeeds:

  1. Search vault: Search for notes related to the research topic
  2. Check tags: Look for notes tagged with relevant topics (e.g., #diffusion-models, #paper-review)
  3. Read research notes: For relevant notes, extract the user's own summaries and insights
  4. Follow links: If notes link to other relevant notes (wikilinks), follow them for additional context
  5. Compile results: For each relevant note:
  • Note title and path
  • User's summary/insights
  • Links to other notes (research graph)
  • Any frontmatter metadata (paper URL, status, rating)
📝 Obsidian notes represent the user's processed understanding — more valuable than raw paper content for understanding their perspective.
Step 0c: Scan Local Paper Library

Before searching online, check if the user already has relevant papers locally:

  1. Locate library: Check PAPER_LIBRARY paths for PDF files

`` Glob: papers/**/*.pdf ``

  1. De-duplicate against Zotero: If Step 0a found papers, skip any local PDFs already covered by Zotero results (match by filename or title).
  1. Filter by relevance: Match filenames and first-page content against the research topic. Skip clearly unrelated papers.
  1. Summarize relevant papers: For each relevant local PDF (up to MAX_LOCAL_PAPERS):
  • Read first 3 pages (title, abstract, intro)
  • Extract: title, authors, year, core contribution, relevance to topic
  • Flag papers that are directly related vs tangentially related
  1. Build local knowledge base: Compile summaries into a "papers you already have" section. This becomes the starting point — external search fills the gaps.
📚 If no local papers are found, skip to Step 1. If the user has a comprehensive local collection, the external search can be more targeted (focus on what's missing).
Step 1: Search (external)
  • Use WebSearch to find recent papers on the topic
  • Check arXiv, Semantic Scholar, Google Scholar
  • Focus on papers from last 3 years unless studying foundational work
  • De-duplicate: Skip papers already found in Zotero, Obsidian, or local library

arXiv API search (always runs, no download by default):

Locate the fetch script and search arXiv directly:

bash
# Try to find arxiv_fetch.py
SCRIPT=$(find tools/ -name "arxiv_fetch.py" 2>/dev/null | head -1)
# If not found
[ -z "$SCRIPT" ] && SCRIPT=$(find ~/.claude/skills/arxiv/ -name "arxiv_fetch.py" 2>/dev/null | head -1)
# Search arXiv API for structured results (title, abstract, authors, categories)
python3 "$SCRIPT" search "QUERY" --max 10

If arxiv_fetch.py is not found, fall back to WebSearch for arXiv (same as before).

The arXiv API returns structured metadata (title, abstract, full author list, categories, dates) — richer than WebSearch snippets. Merge these results with WebSearch findings and de-duplicate.

Semantic Scholar API search (only when semantic-scholar is in sources):

When the user explicitly requests — sources: semantic-scholar (or — sources: web, semantic-scholar), search for published venue papers beyond arXiv:

bash
S2_SCRIPT=$(find tools/ -name "semantic_scholar_fetch.py" 2>/dev/null | head -1)
[ -z "$S2_SCRIPT" ] && S2_SCRIPT=$(find ~/.claude/skills/semantic-scholar/ -name "semantic_scholar_fetch.py" 2>/dev/null | head -1)
# Search for published papers with quality filters
python3 "$S2_SCRIPT" search "QUERY" --max 10 \
--fields-of-study "GIScience, GeoAI" \
--publication-types "JournalArticle, Conference"

If semantic_scholar_fetch.py is not found, skip silently.

Why use Semantic Scholar? Many IEEE/ACM journal papers are NOT on arXiv. S2 fills the gap for published venue-only papers with citation counts and venue metadata.

De-duplication between arXiv and S2: Match by arXiv ID (S2 returns externalIds.ArXiv):

  • If a paper appears in both: check S2's venue/publicationVenue — if it has been published in a journal/conference (e.g. IEEE TWC, JSAC), use S2's metadata (venue, citationCount, DOI) as the authoritative version, since the published version supersedes the preprint. Keep the arXiv PDF link for download.
  • If the S2 match has no venue (still just a preprint indexed by S2): keep the arXiv version as-is.
  • S2 results without externalIds.ArXiv are venue-only papers not on arXiv — these are the unique value of this source.

Optional PDF download (only when ARXIV_DOWNLOAD = true):

After all sources are searched and papers are ranked by relevance:

bash
# Download top N most relevant arXiv papers
python3 "$SCRIPT" download ARXIV_ID --dir papers/
  • Only download papers ranked in the top ARXIV_MAX_DOWNLOAD by relevance
  • Skip papers already in the local library
  • 1-second delay between downloads (rate limiting)
  • Verify each PDF > 10 KB
Step 2: Analyze Each Paper

For each relevant paper (from all sources), extract:

  • Problem: What gap does it address?
  • Method: Core technical contribution (1-2 sentences)
  • Results: Key numbers/claims
  • Relevance: How does it relate to our work?
  • Source: Where we found it (Zotero/Obsidian/local/web) — helps user know what they already have vs what's new
Step 3: Synthesize
  • Group papers by approach/theme
  • Identify consensus vs disagreements in the field
  • Find gaps that our work could fill
  • If Obsidian notes exist, incorporate the user's own insights into the synthesis

Read skills/knowledge/synthesis-analyst.md for the synthesis protocol. Ignore if skills/knowledge/synthesis-analyst.md not found. then:

  1. Group papers by theme (not chronology).
  2. Build a synthesis matrix: paper × (method, dataset, key metric, finding, limitation).
  3. Identify consensus views, contradictions, and geographic biases.
  4. Write synthesis to the Synthesis section of output/LIT_REVIEW_REPORT.md.

Find gaps that our work can fill. For each gap dimension (Methodological, Geographic, Temporal, Data, Equity, Validation):

  • Score gap: Novelty × 0.4 + Feasibility × 0.35 + Impact × 0.25
  • Rank top 5 gaps
  • Write to the Gap Analysis section of output/LIT_REVIEW_REPORT.md
Step 4: Output

Present as a structured literature table:

| Paper | Venue | Method | Key Result | Relevance to Us | Source |
|-------|-------|--------|------------|-----------------|--------|

Plus a narrative summary of the landscape (3-5 paragraphs).

If Zotero BibTeX was exported, include a references.bib snippet for direct use in paper writing.

Step 5: Save (if requested)
  • Save paper PDFs to papers/
  • Update related work notes in project memory
  • Update memory/MEMORY.md
  • If Obsidian is available, optionally create a literature review note in the vault

Outputs

  • output/paper-cache/ — JSON paper metadata files
  • output/LIT_REVIEW_REPORT.md — single consolidated report containing:
  1. Findings — one-line summaries of key discoveries (appended across runs; dated entries)
  2. Synthesis (YYYY-MM-DD) — thematic synthesis with paper × (method, dataset, metric, finding, limitation) matrix
  3. Gap Analysis — ranked top-5 gaps across Methodological, Geographic, Temporal, Data, Equity, Validation dimensions
When re-running the skill, append new dated Synthesis and Gap Analysis sections rather than overwriting — preserves history. Findings entries are always appended.

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
79
Repository forks
21
7-day trend score
22

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 15 May 2026, 5 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/grind-lab-core/night_owl_research_agent/lit-review/badge)](https://verified-skill.com/skills/grind-lab-core/night_owl_research_agent/lit-review)

Something wrong with this skill or its page? Tell us.