Turns a topic into a curated, formatted Excel table of papers, and optionally downloads the
PDFs and fills method/detail columns from their full text. Helper scripts in this skill dir do
the mechanical work; you drive the search and curation in between. Papers default to
economics journals + economics-adjacent working papers unless the user says otherwise.
-
Scope the run. Confirm: topic/question; any field scope (default economics + adjacent
working papers); year range; roughly how many papers; and any custom columns for this
run (e.g. "method", "identification strategy", "relevance to my project"). Ask whether they
want the PDFs downloaded (default: no).
-
Search. OpenAlex is the backbone; widen with the other helpers + WebSearch, pull more
than you need, then cut.
PY="C:/Users/Admin/anaconda3/python.exe"; SK=".claude/skills/lit-review-table"
"$PY" $SK/openalex_search.py "<topic>" -n 40 -o candidates.json
"$PY" $SK/search_more.py "<topic>" -n 25 -o more.json
Each record has authors, year, title, journal, paper_type, doi, link, keywords, abstract,
citation_count, oa_status, and pdf_candidates (used by the downloader).
- Beyond these APIs: for specific econ working-paper series (IZA, CEPR, SSRN, recent NBER)
that none index well, use
WebSearch with the series name in the query, then verify
each hit by fetching its PDF directly. RePEc/IDEAS and EconPapers have no usable API
(their search URLs return a homepage to a fetcher), so don't rely on them programmatically.
Merge all sources and de-dup by normalized title.
-
Curate - this is the part only you can do. Read candidates.json and:
- drop off-topic hits, duplicates, and non-economics noise (keep economics-adjacent working
papers if relevant);
- add the papers OpenAlex missed (from
WebSearch / your knowledge), as records with the
same fields - fill what you can, leave unknowns blank;
- add the run's custom columns by writing an extra key onto every record (e.g.
"identification": "DiD"); any non-standard key becomes its own column automatically;
- you may overwrite
full_citation with a hand-checked AEA string; otherwise the builder
constructs one from the fields. Save the curated list as papers.json.
-
Build the table.
"$PY" .claude/skills/lit-review-table/build_xlsx.py papers.json -o literature_<topic>.xlsx
Columns, in order: authors, year, title, journal, full_citation, keywords, abstract,
citation_count, paper_type, oa_status, link, then any custom columns. Header is frozen +
auto-filtered; link cells are clickable.
-
(Optional) Download PDFs - only if the user asked.
"$PY" .claude/skills/lit-review-table/download_papers.py papers.json --dir papers_<topic> --email <user-email>
Tries each paper's open-access / working-paper URLs in turn; writes the PDFs plus a
download_manifest.json recording, per paper, downloaded (+ file) or not available.
Re-running after adding papers renames files by position - clear the folder first (or prune
to the manifest) to avoid stale duplicates.
-
(Optional) Fill detail columns from full text. Abstracts rarely state the exact model,
number of runs/iterations, or prompt. After downloading, read the PDFs and write the verified
values into your records, then rebuild.
"$PY" $SK/extract_pdf_text.py papers_<topic>/ --methods
Update the relevant record keys (e.g. model, n_runs, prompt) and re-run build_xlsx.py.
-
Report to the user: the xlsx path, paper count, field/year scope, and (if downloaded)
how many PDFs landed vs were unavailable.