agentsclimarketplace

Zenodo publish

Skill aradar46/zenodo-publish/zenodo-publish

Use when preparing a research codebase for Zenodo deposition, auditing Zenodo-readiness, generating .zenodo.json or CITATION.cff metadata, or setting up GitHub-Zenodo integration. Also use when the user says 'publish to zenodo', 'zenodo audit', 'prepare for zenodo', 'make this zenodo ready', 'generate citation file', 'DOI for my code', or 'deposit to zenodo'.From its SKILL.md

Install
npx -y skills add aradar46/zenodo-publish --skill zenodo-publish

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

14.9 KB, ~4.0k tokens by cl100k_base, as published. Nobody here has run it

Zenodo Publish

Prepare research codebases for Zenodo deposition. Three modes: audit (score readiness), metadata (generate files), integrate (GitHub↔Zenodo setup).

Mode Detection

digraph mode_detection {
    "User request" [shape=box];
    "Contains audit/check/ready/score?" [shape=diamond];
    "Contains metadata/zenodo.json/citation/cff?" [shape=diamond];
    "Contains github/integrate/webhook/release?" [shape=diamond];
    "Ask which mode" [shape=box];
    "→ AUDIT mode" [shape=doublecircle];
    "→ METADATA mode" [shape=doublecircle];
    "→ INTEGRATE mode" [shape=doublecircle];

    "User request" -> "Contains audit/check/ready/score?";
    "Contains audit/check/ready/score?" -> "→ AUDIT mode" [label="yes"];
    "Contains audit/check/ready/score?" -> "Contains metadata/zenodo.json/citation/cff?" [label="no"];
    "Contains metadata/zenodo.json/citation/cff?" -> "→ METADATA mode" [label="yes"];
    "Contains metadata/zenodo.json/citation/cff?" -> "Contains github/integrate/webhook/release?" [label="no"];
    "Contains github/integrate/webhook/release?" -> "→ INTEGRATE mode" [label="yes"];
    "Contains github/integrate/webhook/release?" -> "Ask which mode" [label="no"];
}

Cross-mode nudge: If user runs metadata or integrate but has never run audit in this session, suggest (don't force): "Want me to run a quick Zenodo-readiness audit first?"


Mode 1: AUDIT

Score the repo's Zenodo-readiness. Report only — make NO changes.

What to Scan

Scan the repo root and up to 2 levels deep. Check these 4 dimensions:

1. Metadata (40% weight)

CheckPassFail
.zenodo.json exists✅ Found❌ Missing
.zenodo.json valid schema✅ All required fields present⚠️ Missing required fields
CITATION.cff exists✅ Found⚠️ Missing (recommended)
CITATION.cff valid✅ CFF v1.2.0 compliant⚠️ Invalid format
LICENSE file present✅ Found❌ Missing — Zenodo requires a license
README.md exists✅ Found with description❌ Missing
Authors identifiable✅ Names in metadata/git⚠️ Only usernames, no real names

2. Repository Structure (25% weight)

CheckPassFail
Clear entry point✅ Main script/notebook obvious⚠️ Unclear where to start
Scripts ordered/numbered✅ Logical order (01_, 02_...) or workflow file⚠️ Flat unordered scripts
Data separated from codedata/ dir or external data refs⚠️ Data mixed with scripts
No junk files✅ Clean.DS_Store, __pycache__, Thumbs.db, .Rhistory, etc.
.gitignore present✅ Found⚠️ Missing
No IDE/editor configs committed✅ Clean⚠️ .vscode/, .idea/, .Rproj.user/

3. Reproducibility (20% weight)

CheckPassFail
Environment lock filerenv.lock / requirements.txt / environment.yml / conda.lock❌ Missing
No hardcoded absolute paths✅ Relative paths or here::here()/home/user/..., C:\Users\...
Random seeds documentedset.seed() / random_state= present⚠️ Stochastic code without seeds
Software versions recordedsessionInfo() / version pins⚠️ No version info
Workflow documented✅ Makefile / Snakefile / README instructions⚠️ No execution order documented

4. Content Policy (15% weight)

CheckPassFail
Total repo size✅ Under 50GB❌ Exceeds Zenodo limit
Large files flagged✅ No files > 100MB⚠️ Large files found (list them)
No secrets/credentials✅ Clean🔴 API keys, passwords, tokens detected
No sensitive data patterns✅ Clean🔴 Email lists, patient IDs, SSNs
Binary files justified✅ None or documented⚠️ Unexplained .exe, .dll, large binaries

Scoring

Each dimension: count passes / total checks → percentage.

Weighted total = (Metadata × 0.40) + (Structure × 0.25) + (Reproducibility × 0.20) + (Content × 0.15)

ScoreBadgeMeaning
71-100🟢 ReadyCan deposit with minor tweaks
41-70🟡 Needs WorkFixable issues, address before deposit
0-40🔴 Not ReadySignificant gaps, needs cleanup first

Report Output

Produce a markdown artifact with:

# Zenodo Readiness Report
**Repository:** <repo name>
**Date:** <date>
**Score:** <score>/100 <badge>

## Dimension Scores
| Dimension | Score | Weight | Weighted |
|-----------|-------|--------|----------|
| Metadata | X% | 40% | X |
| Structure | X% | 25% | X |
| Reproducibility | X% | 20% | X |
| Content Policy | X% | 15% | X |

## Findings

### 🔴 Critical (must fix)
- ...

### 🟡 Recommended (should fix)
- ...

### 💡 Nice to Have
- ...

## Action Plan
Prioritized list with estimated effort per item.

Mode 2: METADATA

Generate .zenodo.json and CITATION.cff for the repository.

Step 1: Pre-fill Scan

Before presenting the form, scan for existing info:

SourceFields extracted
DESCRIPTION (R packages)Title, authors, license, description
pyproject.toml / setup.py / setup.cfgTitle, authors, license, version
package.jsonName, authors, license
git log --format='%aN <%aE>' | sort -uAuthor names and emails
Existing CITATION.cffAll fields
Existing .zenodo.jsonAll fields
LICENSE file contentLicense type (SPDX detection)
README.md first paragraphDescription candidate

Step 2: Present Form

Present a single fill-in template. Pre-fill what was found, mark the rest blank:

Please fill in the metadata below. Pre-filled values are from your repo — edit as needed.
Leave blank if unknown. ★ = required.

★ Title: <pre-filled or blank>
★ Upload type: [dataset / software / publication / poster / presentation / lesson / image / video / other]
★ Description: <pre-filled or blank>

★ Authors (one per line — format: Last, First | ORCID | Affiliation):
  1. <pre-filled or blank>
  2.
  3.

★ License (SPDX identifier, e.g. MIT, GPL-3.0-only, CC-BY-4.0): <pre-filled or blank>

  Version: <pre-filled or blank>
  Language: <e.g. eng>
  Keywords (comma-separated):
  Publication date (YYYY-MM-DD):

  Grants (one per line — format: Funder: GrantID):
  1.
  2.

  Related identifiers (one per line — format: DOI relationship, e.g. 10.1234/foo isSupplementTo):
  1.
  2.

  Communities (Zenodo community slugs):
  1.

  Notes:

Wait for the user to fill in and reply.

Step 3: Generate Files

From the filled form, generate two files:

.zenodo.json

{
  "title": "...",
  "upload_type": "software",
  "description": "...",
  "creators": [
    {
      "name": "Last, First",
      "orcid": "0000-0000-0000-0000",
      "affiliation": "..."
    }
  ],
  "license": { "id": "MIT" },
  "keywords": ["..."],
  "related_identifiers": [
    {
      "identifier": "10.1234/foo",
      "relation": "isSupplementTo",
      "scheme": "doi"
    }
  ],
  "grants": [
    { "id": "10.13039/501100000780::123456" }
  ],
  "communities": [
    { "identifier": "zenodo" }
  ],
  "version": "1.0.0",
  "language": "eng",
  "publication_date": "2026-01-01",
  "notes": "..."
}

CITATION.cff

cff-version: 1.2.0
title: "..."
message: "If you use this software, please cite it as below."
type: software
authors:
  - family-names: "Last"
    given-names: "First"
    orcid: "https://orcid.org/0000-0000-0000-0000"
    affiliation: "..."
license: MIT
version: "1.0.0"
date-released: "2026-01-01"
keywords:
  - "..."

Overwrite protection: If either file already exists, show a diff between existing and generated content. Ask before overwriting.

Step 4: Validate Generated Files

Run these checks on the generated files:

ValidationRule
Required fieldstitle, upload_type, description, creators present in .zenodo.json
ORCID formatMatches ^[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]$
License SPDXMust be a valid SPDX identifier
Upload type enumMust be one of: publication, poster, presentation, dataset, image, video, software, lesson, physicalobject, other
Date formatYYYY-MM-DD
Cross-file consistencyIf both files generated, warn if title/authors/license/version differ between them
.zenodo.json winsRemind user: when both files exist, Zenodo uses .zenodo.json and ignores CITATION.cff

Report all validation results. Fix any issues interactively.


Mode 3: INTEGRATE

Guide GitHub↔Zenodo integration. Validate existing metadata first.

Step 1: Validate Existing Metadata

  • Check if .zenodo.json exists → validate against schema (same checks as Mode 2 Step 4)
  • Check if CITATION.cff exists → validate format
  • If neither exists → tell user to run metadata mode first, stop here
  • If both exist → warn about precedence:

⚠️ Both .zenodo.json and CITATION.cff found. Zenodo will use .zenodo.json exclusively and ignore CITATION.cff. GitHub's citation widget will still use CITATION.cff. Make sure they're consistent.

Step 2: Integration Instructions

Present these steps:

## Setting Up GitHub↔Zenodo Integration

1. Go to https://zenodo.org/account/settings/github/
2. Log in with your Zenodo account (create one if needed)
3. Click "Connect" to link your GitHub account
4. Find your repository in the list and flip the toggle ON
5. Go to your GitHub repository
6. Create a new **Release** (not a pre-release):
   - Click "Releases" → "Create a new release"
   - Choose a tag (e.g., v1.0.0) — use semantic versioning
   - Title: match your .zenodo.json title + version
   - Click "Publish release" (NOT "Save draft", NOT "Pre-release")
7. Wait ~60 seconds, then check https://zenodo.org/account/settings/github/
   for the deposit status
8. Your DOI will appear on the Zenodo deposit page

Step 3: Pitfall Warnings

Always display these warnings after the instructions:

## ⚠️ Common Pitfalls

1. **Pre-releases are ignored** — Zenodo only processes full releases.
   Draft releases and pre-releases will NOT trigger a deposit.

2. **Metadata comes from the default branch** — Zenodo reads .zenodo.json
   from your DEFAULT branch (usually main/master) at the time of release,
   NOT from the tagged commit. Merge metadata changes before releasing.

3. **`.zenodo.json` overrides everything** — If .zenodo.json exists,
   CITATION.cff and GitHub repo metadata are completely ignored.

4. **~10GB snapshot limit** — GitHub integration snapshots your repo.
   Very large repos may fail. Consider using the Zenodo REST API directly
   for large deposits.

5. **Public repos only** — GitHub integration does not work with private
   repositories.

6. **Concept DOI vs Version DOI:**
   - Concept DOI: resolves to the LATEST version (changes over time)
   - Version DOI: permanent link to THIS specific version (never changes)
   - Use the Version DOI in your paper. Use the Concept DOI in your README.

7. **Failed deposits** — Check https://zenodo.org/account/settings/github/
   for error details. Common causes: invalid .zenodo.json, repo too large,
   or GitHub webhook misconfigured.

8. **Updating metadata after deposit** — You can edit metadata on Zenodo
   after deposit, but changes won't sync back to GitHub.

9. **Versioning** — Each new GitHub release creates a new version on Zenodo
   with its own Version DOI. The Concept DOI always points to the latest.

Zenodo-Specific Knowledge Reference

Upload Types

TypeWhen to use
softwareCode, scripts, packages, tools
datasetData files, databases, processed results
publicationPapers, preprints, reports
posterConference posters
presentationSlides, talks
lessonTeaching materials, tutorials
imageFigures, photos, diagrams
videoRecordings, animations
otherAnything else

Common SPDX Licenses for Research

LicenseSPDX IDGood for
MITMITPermissive, simple
GPL 3.0GPL-3.0-onlyCopyleft, derivative must be open
Apache 2.0Apache-2.0Permissive with patent grant
CC BY 4.0CC-BY-4.0Data/text, attribution required
CC BY-SA 4.0CC-BY-SA-4.0Data/text, share-alike
CC0 1.0CC0-1.0Public domain dedication
BSD 3-ClauseBSD-3-ClausePermissive, no endorsement

Rule of thumb: MIT or Apache-2.0 for code, CC-BY-4.0 for data/text, CC0-1.0 for maximum reuse.

Zenodo Content Policies (from FAQ)

  • ✅ Research data, software, publications, posters, presentations
  • ✅ Open data from funded research
  • ❌ No military or export-controlled content
  • ❌ No purely commercial content without research basis
  • ❌ No AI-generated content without verifiable research basis
  • ❌ No malware, spam, or illegal content
  • ⚠️ Sensitive data must be anonymized or access-restricted

Rate Limits

  • Default: 5,000 requests/hour (REST API)
  • Authenticated users get higher limits
  • OAI-PMH harvesting available for bulk metadata retrieval

File Size Limits

  • Per file: 50GB (default, can request increase)
  • Per record: 50GB total (default, can request increase)
  • For larger deposits: contact Zenodo support before uploading

Common Mistakes

MistakeFix
Forgetting LICENSE fileZenodo requires a license. Add one before deposit.
Using .zenodo.json AND CITATION.cff with different dataKeep them in sync, or use only .zenodo.json
Creating a pre-release expecting Zenodo depositUse a full release, not pre-release
Hardcoded paths in scriptsReplace with relative paths or here::here() before deposit
Committing large data filesUse .gitignore, link to external data sources
Missing ORCIDAdd ORCIDs for all authors — improves discoverability
No keywordsAdd 3-5 descriptive keywords for search visibility
Wrong upload_typesoftware for code, dataset for data — not interchangeable
Publishing sensitive dataAudit for API keys, patient data, credentials before deposit
Not using semantic versioningUse v1.0.0 format for releases, matches Zenodo expectations

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,452. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.