Adapter field assessment — {{MANAGER}} ({{LIBRARY_NAME}})¶
Date: {{YYYY-MM-DD}} Result: in progress | passed | blocked
Use a copy of a small library (roughly 10–30 parents). Do not point EndNote at your only .enl. Do not commit OAuth secrets or client secrets.
Pass bar: every checklist row below is checked or has a filed incident with repro steps. One green CI run does not replace this report — adapters stay seeking testers until a real-library report exists.
Plan¶
Field |
Value |
|---|---|
Manager |
|
Paperful version |
|
Host OS |
|
Manager version |
Mendeley Reference Manager / EndNote 20–21 / 2025 |
Config |
path to throwaway |
Library copy |
path to test library |
Vendor doc oracle¶
Mendeley (Elsevier) — dev.mendeley.com:
Authorization code —
scope=all, redirect URI match, refresh rotationFiles — raw
POST /files+Link: rel="document";GET /files/{id}→ 303 signed URL; duplicate upload 400Documents change feed —
modified_since/deleted_sinceISO 8601; trashPOST /documents/{id}/trash
EndNote (Clarivate) — no public write API:
Import EndNote Generated XML — File → Import → EndNote Generated XML; Duplicates policy; Text Translation No Translation
PDF folder beside
sdb—Library.Data/PDF/sibling ofsdb/, not inside it
Paperful rules: mendeley.md, endnote.md, ROADMAP § Mendeley and EndNote.
Mendeley checklist (host OAuth — not inside Docker)¶
Run paperful session login mendeley on the host so http://127.0.0.1:8765/callback reaches the CLI. Mount the same state/ into Docker after login if you use compose.
# |
Step |
Expected |
OK |
|---|---|---|---|
M1 |
Register app at dev.mendeley.com/myapps.html; redirect |
App credentials in config or env only |
|
M2 |
Failed auth: remove/expire token or bad secret → |
Exit 2 + next-steps ladder (app → config → login → doctor) |
|
M3 |
|
|
|
M4 |
|
Mendeley API green |
|
M5 |
Nested folder: |
UUID keys; folder paths match UI |
|
M6 |
Mirror-first: second read after a small edit in Mendeley |
|
|
M7 |
Missing PDF: |
PDF in Mendeley UI; file on disk under |
|
M8 |
Notes: document |
Re-run updates annotation, not duplicate rows |
|
M9 |
|
Refused with clear message |
|
M10 |
|
Refused (no linked-file mode) |
Commands (reference):
uv run paperful session login mendeley
uv run paperful doctor
uv run paperful collections
uv run paperful run -C '<folder>' --dry-run
uv run paperful run -C '<folder>'
EndNote checklist (Windows or macOS desktop for import)¶
# |
Step |
Expected |
OK |
|---|---|---|---|
E1 |
Copy |
|
|
E2 |
|
Reads via temp copy ( |
|
E3 |
Type spot-check: Journal Article in UI |
Paperful |
|
E4 |
Online-search group ( |
Skipped in Paperful collections |
|
E5 |
|
|
|
E6 |
Write path: |
|
|
E7 |
EndNote: File → Import → File… → |
Import Option EndNote Generated XML; Duplicates per your policy; No Translation |
|
E8 |
PDFs |
Attached or import |
|
E9 |
Groups after import |
Rebuilt manually from Label field (XML has no groups) |
|
E10 |
|
Refused; live |
Commands (reference):
uv run paperful doctor
uv run paperful collections
uv run paperful snapshot -C '<Group>' --pdfs all
# after a write command, import the printed state/endnote-import/… folder in EndNote
Log¶
(timestamps, command lines, unexpected UI behaviour)
Incidents¶
ID |
Manager |
Summary |
Repro |
Severity |
|---|---|---|---|---|
Artifacts¶
Redacted
config.tomlexcerpt (no secrets)state/runs/or run report pathsScreenshots of Mendeley UI / EndNote import dialog (no secrets)
Bundle path:
state/endnote-import/<stamp>/(EndNote)
CI contract tests (repo)¶
Before field work, confirm unit tests pass:
uv run pytest -q tests/test_mendeley.py tests/test_endnote.py tests/test_interop.py
These encode Elsevier/Clarivate contracts (Accept headers, 303 without Bearer, ISO modified_since, XML ref-type 17 vs DB type 0, import README wording). They do not replace rows M1–M10 / E1–E10 above.