Provider-neutral Crossref and Zenodo publication planning, execution, and settlement for OpenDevEd services.
The core owns:
- normalized publication records, identifiers, target policies, and SHA-256 file manifests;
- independent Crossref and Zenodo planning;
- deterministic provider payload and file snapshots;
- provider clients, retries, journals, and last-success settlement; and
- browser-safe DOI display helpers on the
./displayexport.
Host applications own:
- source adapters such as Zotero, Mendeley, or native database records;
- canonical records and published-file storage;
- file byte access through
PublicationFileReader; - durable jobs, leases, state persistence, credentials, scheduling, and UI; and
- source-system writeback after provider settlement.
The package does not infer source metadata, download from a specific storage provider, or perform source writeback.
- Parse a canonical
PublicationRecordSnapshot,PublicationFileManifest, andPublicationTargetPolicy. - Call
planPublicationSyncwith the environment-scoped last-success state. - Provide durable
CrossrefSubmissionJournalWriterandZenodoPublishJournalWriteradapters whose callbacks commit before their promises resolve. - Render
describeDryRun, or execute a write-required plan withexecuteLivePublicationSyncPlan; provider writes do not proceed past their journal boundary until that durable callback succeeds. - Apply the state patch returned by
settlePublicationSyncStateafter execution. Published Zenodo journal identifiers and any orphan-cleanup marker must be exposed in the nextProviderSyncStateuntil settlement clears them.
Prerequisites are Node.js 22 or newer and uv. The XSD gate uses uvx to run the pinned xmlschema==4.3.2 validator because the official Crossref 5.5 schema requires XSD 1.1.
npm install
npm run verifyZenodo license validation uses a generated snapshot of the official Zenodo license vocabulary. Refresh it directly from Zenodo when that vocabulary changes:
npm run zenodo:licenses:generate