agentleFS
BuildHarborBuildHarbor/sciagent-skills/skills/literature-review/SKILL.md

literature-review

Skill1 starsChanged 3 months agoMITView on GitHub

Plan, execute, and report systematic literature reviews and meta-analyses. Use when running PRISMA 2020-compliant searches, screening PubMed/Crossref/OpenAlex/Semantic Scholar, deduplicating records, building citation networks, or performing meta-analysis. Triggers include "systematic review", "PRISMA", "PubMed", "semantic search", "citation graph", "meta-analysis", "ASReview".

  • Reads credentials
  • Installs packages

84 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use pdf-explore, paper-narrative and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • JimLiuSkill

    pdf-explore

    Use this skill when the user has attached a PDF, paper, report, or other document and the answer needs content from more than one place in it: summarize the methods or any other section, compare sections, find where a topic is discussed, read a value or label off a figure or chart, or find/list/extract every instance of something across the whole document (datasets, benchmarks, citations, figures, table rows, accession numbers — including appendices). Skip it only for a single lookup of 1–4 pages quoted in your very next response — `read_file(pages=[...])` attaches pages as images that are dropped from context after one turn, so multi-section answers end up re-reading the same ranges repeatedly. Parses the PDF once in the Python kernel: `pdf_pages` (pages as persistent text), `pdf_outline` (TOC), `pdf_scan` (rank pages by relevance), `pdf_map`/`pdf_extract` (per-page summary / structured fields via parallel haiku calls). For PDF creation/manipulation, use reportlab/pypdf directly.

    Also in 9 projects that use this

  • JimLiuSkill

    paper-narrative

    Judge and reshape the STORY a paper's figures tell. Input is the work itself — manuscript (or abstract) + figure deck — no hand-written brief. `derive_paper_brief(abstract, captions)` extracts pitch/vision/per-figure-claims; a handling-editor reviewer on the full deck returns hook_verdict (would Fig 1 make me send this for review?), arc (hook→mechanism→evidence→application), figure_moves (panels in the wrong figure), missing_panels (concrete analyses to RUN), kill_list, and boldest_defensible_fig1. Hands per-figure claims to `figure-composer`. Load when writing or revising a paper.

    Also in 5 projects that use this

  • Norman-burySkill

    brainstorming-research

    Use before writing any paper - clarifies paper type, discipline, topic, methodology, and chapter structure through natural dialogue

    Also in 4 projects that use this

  • lingzhi227Skill

    latex-formatting

    Handle LaTeX formatting, templates, and styling for academic papers. Set up conference templates (ICML, ICLR, NeurIPS, AAAI, ACL), fix formatting issues, manage packages, and ensure venue-specific compliance. Use when the user needs to set up a paper template, fix LaTeX formatting, or prepare for submission.

    Also in 4 projects that use this

  • lingzhi227Skill

    novelty-assessment

    Assess research idea novelty through systematic literature search. Multi-round search-evaluate loops with harsh critic persona. Binary novel/not-novel decision with justification. Use before committing to a research direction.

    Also in 4 projects that use this

  • +6 more from JimLiu
  • +1 more from lingzhi227

The file

We split this skill into the rules it gives an agent

12 rules. 0 are common, 10 are distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 64 edited versions we read keep these.

  • 10

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Search PubMed (NCBI E-Utilities), Crossref, OpenAlex, and Semantic Scholar, normalize to a common schema, and deduplicate.

    line 24
  2. Very specific:

    Do NOT use this skill for a single-paper lookup — use the citation-management skill instead.

    line 47
  3. Distinctive:

    Write and register the protocol (PROSPERO, OSF) BEFORE running the search.

    line 163
  4. Distinctive:

    Keep one record per row, one column per database field.

    line 170
  5. Very specific:

    Document every database, date, and number of hits in a searches/log.md.

    line 172
  6. Distinctive:

    Use two independent screeners for title/abstract and full text.

    line 173
  7. Distinctive:

    Search strings built from natural-language synonyms without MeSH/Emtree explode.

    line 188
  8. Distinctive:

    Not saving the exact API responses — the same query tomorrow may return a different result set, breaking reproducibility.

    line 200
  9. Distinctive:

    Honest reporting: Never cherry-pick studies or omit unfavourable results.

    line 277
  10. Distinctive:

    Authorship and contribution: Use the CRediT taxonomy to record each reviewer's role (search, screening, data extraction, analysis, writing, …

    line 280
  11. Distinctive:

    Citation accuracy: Use DOIs as the primary key.

    line 285
  12. Distinctive:

    Patient/public involvement: If the review concerns patients, document PPI in protocol, screening, and write-up.

    line 290

“Common” is measured: kept by at least 6 in 10 of the 64 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Literature Review

Overview

A literature review is a structured, reproducible survey of the published record on a question. Done well it is more than a reading list: it is an audit trail from the search strategy, through screening, to a synthesis (narrative, scoping, or meta-analytic). This skill covers the full pipeline that a research agent can execute programmatically:

  1. Translate a research question (PICO/PECO/SPIDER) into multi-database search strings.
  2. Search PubMed (NCBI E-Utilities), Crossref, OpenAlex, and Semantic Scholar, normalize to a common schema, and deduplicate.
  3. Screen title/abstract and full text using a published checklist and, when the result set is large, active learning (ASReview).
  4. Build citation networks (forward/backward snowballing) with networkx.
  5. Extract effect sizes and run a meta-analysis (random-effects DerSimonian and Laird, or fixed-effect) and render a forest plot.

Outputs follow the PRISMA 2020 reporting standard (flow diagram, search strings, exclusions, included-items list).

When to use this skill

  • You need a systematic review following PRISMA 2020 (medicine, public health, ecology, education, social sciences).
  • You need a scoping review (Arksey & O'Malley / JBI) mapping a field.
  • You are doing a rapid review with a documented shortcut.
  • You need to snowball an included-paper set forward and backward.
  • You need a meta-analysis with forest plot and heterogeneity stats.
  • You need a bibliometric / citation network view of a topic.
  • You need to deduplicate records pulled from several databases before screening.

Do NOT use this skill for a single-paper lookup — use the citation-management skill instead.

Prerequisites

  • Python 3.10 or newer.
  • Install canonical libraries:
    pip install biopython habanero pyalex requests pandas networkx matplotlib
    pip install asreview pymeta
  • Accounts / keys:
  • A project workspace with protocol.md, searches/, records/, screening/, analysis/, prisma/.

Core workflows

1. Build a PICO-grounded search string and run it on PubMed

from Bio import Entrez
import os, json, time
Entrez.email = os.environ["NCBI_EMAIL"]
Entrez.api_key = os.environ.get("NCBI_API_KEY", "")

query = (
    '("low back pain"[MeSH] OR "low back pain"[tiab]) AND '
    '("exercise therapy"[MeSH] OR "motor control exercise"[tiab]) AND '
    '("randomized controlled trial"[pt])'
)
handle = Entrez.esearch(db="pubmed", term=query, retmax=500, sort="relevance")
ids = Entrez.read(handle)["IdList"]
print(f"PubMed hits: {len(ids)}")

# Fetch records in batches of 100 to stay under rate limits
records = []
for i in range(0, len(ids), 100):
    h = Entrez.efetch(db="pubmed", id=",".join(ids[i:i+100]),
                      rettype="medline", retmode="xml")
    records.extend(Entrez.read(h)["PubmedArticle"])
    time.sleep(0.34)  # ~3 req/s without API key
json.dump(records, open("records/pubmed.json", "w"))

2. Query OpenAlex and Semantic Scholar for coverage and citation graph

import pyalex, requests, os
pyalex.settings.email = os.environ["OPENALEX_EMAIL"]
works = pyalex.Works().search("motor control exercise low back pain").get(per_page=200)
print(f"OpenAlex hits: {len(works)}")

def s2_refs(doi, limit=100):
    url = f"https://api.semanticscholar.org/graph/v1/paper/DOI:{doi}"
    url += f"?fields=title,year,references.title,references.year&limit={limit}"
    headers = {"x-api-key": os.environ.get("S2_API_KEY", "")}
    return requests.get(url, headers=headers, timeout=30).json()

3. Deduplicate records and stage for screening (Rayyan / CSV)

import pandas as pd
from rapidfuzz import fuzz
df = pd.read_csv("records/merged.csv")
df["norm_title"] = (df["title"].str.lower().str.strip()
                              .str.replace(r"[^\w\s]", "", regex=True))
keep = []
for i, row in df.iterrows():
    if any(fuzz.token_set_ratio(row["norm_title"], df.loc[j, "norm_title"]) > 95
           and abs(int(row["year"]) - int(df.loc[j, "year"])) < 2
           for j in keep):
        continue
    keep.append(i)
dedup = df.loc[keep].reset_index(drop=True)
dedup.to_csv("records/dedup.csv", index=False)

4. Active-learning screening with ASReview

# One-time: convert dedup.csv to ASReview 0.x dataset
# asreview simulate records/dedup.csv --n_prior_included 5 --n_prior_excluded 5
# Then run an interactive screening:
#   asreview link records/dedup.asreview
# Export labeled set:
#   asreview export records/dedup.asreview -o screening/labeled.csv

5. Random-effects meta-analysis with forest plot

import pandas as pd, numpy as np
import matplotlib.pyplot as plt
from pymeta.linalg import rma  # or use statsmodels/PUB_Bonett
# Hedges g and variances per study:
df = pd.read_csv("analysis/effects.csv")
# Random-effects via DerSimonian-Laird (illustrative; use metafor/R via rpy2 for production)
w = 1.0 / df["var"]
Q = (w * (df["g"] - (w*df["g"]).sum()/w.sum())**2).sum()
df_w = len(df) - 1
tau2 = max(0, (Q - df_w) / (w.sum() - (w*w).sum()/w.sum()))
w_re = 1.0 / (df["var"] + tau2)
pooled = (w_re * df["g"]).sum() / w_re.sum()
se = np.sqrt(1.0 / w_re.sum())
print(f"pooled g = {pooled:.3f}  95% CI {pooled-1.96*se:.3f} to {pooled+1.96*se:.3f}")

Best practices

  • Write and register the protocol (PROSPERO, OSF) BEFORE running the search; document PICO, databases, dates, limits, and the screening rules.
  • Translate the question into database-specific syntax — MeSH for PubMed, Emtree for Embase, free-text for Scopus; never copy-paste the same string across databases.
  • Report the search with PRISMA 2020: identification, screening, eligibility, included; document exclusions with reasons.
  • Keep one record per row, one column per database field; never drop PMIDs/DOIs — they are your join keys.
  • Document every database, date, and number of hits in a searches/log.md.
  • Use two independent screeners for title/abstract and full text; record a Cohen kappa for agreement.
  • Cap automated screening at a defensible threshold and keep a human in the loop for the included set.
  • Pre-register the meta-analysis model (random vs fixed); report I-squared, tau-squared, prediction interval, and a funnel plot.
  • Archive the raw JSON responses from each API so the review is reproducible years later even if APIs change.
  • Version everything: protocol, search strings, datasets, scripts, report — push to a public OSF or Zenodo record at submission.

Common pitfalls

  • Treating PubMed as the entire literature — Embase, Scopus, Web of Science, grey literature, and trial registries add studies that PubMed misses.
  • Search strings built from natural-language synonyms without MeSH/Emtree explode; coverage and recall suffer.
  • Failing to deduplicate before screening — same study counted twice inflates apparent yield and biases meta-analysis.
  • Letting ASReview (or any active-learning tool) fully automate inclusion; always review its "stopped" set manually before locking the included list.
  • Combining effect sizes with the wrong unit (SMD vs OR vs RR) or pooling pre/post versus between-group differences in the same forest plot.
  • Reporting only pooled estimate and p-value; omit I-squared, prediction interval, subgroup analyses, and risk-of-bias (RoB 2 / ROBINS-I).
  • Over-stating conclusions from 2-3 small studies, or ignoring publication bias/funnel-plot asymmetry.
  • Not saving the exact API responses — the same query tomorrow may return a different result set, breaking reproducibility.

Worked example

A PRISMA 2020-compliant mini-review: "Motor control exercise for chronic non-specific low back pain, RCTs 2015-2025".

# 1) Search
from Bio import Entrez
import os, json
Entrez.email = os.environ["NCBI_EMAIL"]
q = ('("motor control exercise"[tiab] OR "core stabilization"[tiab]) AND '
     '"low back pain"[MeSH] AND 2015:2025[dp] AND "randomized controlled trial"[pt]')
ids = Entrez.read(Entrez.esearch(db="pubmed", term=q, retmax=200))["IdList"]
arts = Entrez.read(Entrez.efetch(db="pubmed", id=",".join(ids),
                                 rettype="medline", retmode="xml"))["PubmedArticle"]
json.dump(arts, open("records/pubmed.json", "w"))

# 2) Normalize to a CSV
import pandas as pd
rows = [{"pmid": a["MedlineCitation"]["PMID"],
         "title": a["MedlineCitation"]["Article"]["ArticleTitle"],
         "year": a["MedlineCitation"]["Article"]["Journal"]["JournalIssue"]["PubDate"].get("Year","")}
        for a in arts]
pd.DataFrame(rows).to_csv("records/pubmed.csv", index=False)

# 3) Screen with ASReview (CLI shown)
#    asreview link records/pubmed.csv --label-included 1,5,9 --label-excluded 2,3,4
#    asreview export records/pubmed.asreview -o screening/included.csv

# 4) Snowball included set forward via OpenAlex
import pyalex, os
pyalex.settings.email = os.environ["OPENALEX_EMAIL"]
snowball = []
for doi in pd.read_csv("screening/included.csv")["doi"].dropna():
    w = pyalex.Works(doi)
    snowball.extend([r["doi"] for r in w.get(references=True)[:50]])
print(f"forward snowball candidates: {len(set(snowball))}")

The final prisma/flow.md records: identification (n from PubMed, n from OpenAlex snowball), screening (n excluded by title/abstract), eligibility (n excluded at full text, with reasons), included (n quantitative, n qualitative).

Tools & libraries

ToolPurposeInstall
biopython (Bio.Entrez)NCBI E-Utilities: PubMed, MeSH, GEOpip install biopython
habaneroCrossref, DataCite, ContentNegotiationpip install habanero
pyalexOpenAlex works, concepts, citationspip install pyalex
semanticscholar (Python)Semantic Scholar Graph APIpip install semanticscholar
ASReviewActive-learning screening (ELAS, NB, logistic)pip install asreview
RayyanCollaborative screening (web app)https://rayyan.qcri.org
networkxCitation graph, snowball traversalpip install networkx
pandasRecord normalization, dedup, exportpip install pandas
rapidfuzzFuzzy-title deduplicationpip install rapidfuzz
pymeta / statsmodelsRandom-effects meta-analysispip install pymeta statsmodels
matplotlibForest, funnel, PRISMA flow plotspip install matplotlib
RoB 2 / ROBINS-IRisk-of-bias assessment (templates)rob-tools / robvis (R + Python CLI)

References

Ethics & safety

  • Honest reporting. Never cherry-pick studies or omit unfavourable results; report every database searched, every date, and every exclusion reason.
  • Authorship and contribution. Use the CRediT taxonomy to record each reviewer's role (search, screening, data extraction, analysis, writing, supervision). State competing interests for every author.
  • Plagiarism. Paraphrase and cite; never copy abstracts verbatim into the review. Direct quotes need quotation marks and a citation.
  • Citation accuracy. Use DOIs as the primary key; verify every included reference against the source PDF before publication.
  • Risk of bias. Report RoB 2 (RCTs) or ROBINS-I (non-randomized) for every included study; do not pool studies with critical risk of bias without sensitivity analysis.
  • Patient/public involvement. If the review concerns patients, document PPI in protocol, screening, and write-up.
  • Data sharing. Deposit the search strings, dedup CSV, screening decisions, and analysis scripts in a public OSF or Zenodo record with a DOI at submission.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.