$npx -y skills add PangenomeAI/academic-skills-food-nutrition --skill food-fetchLawfully acquire the full text of academic articles so the research and review skills can read papers, not just abstracts. Routes each article through legal open access (Unpaywall/OpenAlex/PMC/arXiv), the user's own reference-manager library (EndNote/Zotero/Mendeley PDFs), and —
| 1 | # Food-Fetch — Lawful Full-Text Acquisition |
| 2 | |
| 3 | Turn a list of references or DOIs into **read full text**, so `food-research`, |
| 4 | `food-deep-research`, and `food-review` build their knowledge base from the actual |
| 5 | papers rather than abstracts. Original work; the routing/manifest architecture is |
| 6 | informed by the open-source `nature-downloader` skill (see the repo README |
| 7 | Acknowledgements). Legal-access-only, and **it never fabricates** — a paper that was |
| 8 | not obtained is recorded as not obtained, never summarized as if read. |
| 9 | |
| 10 | ## First-run setup — ask once, remember, remind if skipped |
| 11 | On the **first** run that needs full text, help the user set up access — this is what |
| 12 | decides whether the review reads real papers. Check |
| 13 | `python3 scripts/food_fetch_setup.py status` (exit 3 = not set up): |
| 14 | |
| 15 | - If **not set up**, surface a **highlighted request** offering the choices, then save |
| 16 | the answer so it isn't asked again: |
| 17 | > 📚 **Set up full-text access (one-time).** To read papers, not just abstracts, |
| 18 | > pick one: |
| 19 | > 1. **Reference-manager library** — send the path to your **EndNote `.Data` |
| 20 | > folder** (or Zotero `storage/` / Mendeley). Best coverage for cited work. |
| 21 | > 2. **Institutional access** — I'll reach entitled full text through **your own |
| 22 | > logged-in library session** in the browser when needed. |
| 23 | > 3. **Open access only** — no setup, but see the warning below. |
| 24 | > |
| 25 | > ⚠️ **Without access to non-open-access articles, the accuracy of the results is |
| 26 | > substantially limited** — most published papers are paywalled, so the knowledge |
| 27 | > base and every claim's grounding would rest on abstracts + the ~half of literature |
| 28 | > that is open access. |
| 29 | |
| 30 | Save the choice: `food_fetch_setup.py set --library <path>` / `--institutional` / |
| 31 | `--open-access-only`. |
| 32 | - If **already set up** (exit 0), use the saved mode silently — **do not re-ask**. |
| 33 | - If the saved mode is **`open_access_only`**, **remind** at the start of each |
| 34 | full-text run — briefly, once — that non-OA access is not configured and that this |
| 35 | **substantially limits accuracy**, and offer to switch (options 1–2). Don't block; |
| 36 | proceed at open-access + abstract level. |
| 37 | |
| 38 | The store holds only a folder path and a mode — **never** a password, cookie, or token. |
| 39 | |
| 40 | ## Access ladder (each article, in order) — see `references/access-routing.md` |
| 41 | 1. **Open access** — resolve a legal free PDF (Unpaywall → OpenAlex; PMC/Europe PMC |
| 42 | full text; arXiv/preprints) and **download it**. `oa_fetcher` runs |
| 43 | `scripts/fetch_oa.py`. **Open-access full text is always fetched and read — never |
| 44 | left at abstract-level.** |
| 45 | 2. **The user's reference-manager library** — `library_fetcher` reads the PDFs the |
| 46 | user already downloaded in **EndNote** (`<Library>.Data/PDF/`), **Zotero** |
| 47 | (`storage/`), or **Mendeley**, mapping each reference by DOI/title. Read-only. |
| 48 | 3. **The user's entitled institutional access** — `institutional_fetcher` reuses the |
| 49 | user's **own logged-in library session in the browser** (Claude-in-Chrome) to open |
| 50 | the article through their library resolver / EZproxy / Shibboleth-CARSI / WebVPN |
| 51 | and save the entitled PDF. **User-driven login only.** See |
| 52 | `references/institutional-access.md`. |
| 53 | 4. **User-supplied PDFs** — anything the user drops in the project folder. |
| 54 | |
| 55 | If none reaches it, the article is `oa_not_found` / `library_no_permission` — the |
| 56 | user is told plainly, and the source stays unread (not summarized). |
| 57 | |
| 58 | ## Subagents (dispatch via the Agent tool) |
| 59 | 1. **`fetch_coordinator`** — takes the reference list / DOIs, confirms the **Supporting Information** choice once, ru |