r-pkg-cran-checklist
Walks through the standard items CRAN expects before accepting a package submission or update. This skill doesn’t duplicate the mechanics of a full check or a NEWS entry — it points at r-pkg-check and r-pkg-news for those sub-steps and covers everything else.
Why this exists: nothing in the repo tracked the CRAN-specific items beyond a plain package check — version bump discipline, cran-comments.md, reverse-dependency checks, and the win-builder/rhub cross-platform checks CRAN’s own submission form expects an answer about.
Procedure
Work through each item; don’t submit until every one is checked.
Clean
R CMD check --as-cran. Run ther-pkg-checkskill, usingdevtools::check(args = "--as-cran")as the invocation (that skill notes this variant for CRAN submissions), and resolve every NOTE, WARNING, and ERROR it reports — CRAN’s own submission processing runs this exact check and rejects anything short of clean or fully-explained.Version bump. Confirm
DESCRIPTION’sVersion:field increased from the last version CRAN has (checkhttps://cran.r-project.org/package=<pkg>oravailable.packages()["<pkg>", "Version"]), following semantic versioning appropriate to the change (patch for a fix, minor for a new feature, major for a breaking change).NEWS.md entry. Confirm an entry exists for the version being submitted, under a heading matching that version. Use
r-pkg-newsto draft one if it’s missing.cran-comments.md. Confirm the package root has acran-comments.md(CRAN’s expected file for submission notes) stating:- The R versions and platforms checked (typically via
devtools::check()locally,devtools::check_win_devel()/check_win_release()for win-builder, andrhub::rhub_check()for cross-platform checks). - Any remaining NOTEs and why they’re expected/harmless (e.g. “This is a new submission” or a known false-positive spelling flag).
- A
## Downstream dependenciessection, even if just “There are currently no downstream dependencies for this package” — required for every submission, not just ones with revdeps.
- The R versions and platforms checked (typically via
win-builder and r-hub checks. Run (or confirm recently run):
devtools::check_win_devel() devtools::check_win_release() rhub::rhub_check()These catch platform-specific failures (Windows path handling, Solaris/ macOS compiler differences) that a local check on one platform can’t. Wait for the emailed/posted results before submitting if they were just triggered — they run asynchronously.
Reverse-dependency checks. If the package has downstream dependents (check
https://cran.r-project.org/package=<pkg>“Reverse dependencies” or runtools::package_dependencies(<pkg>, reverse = TRUE)), run their checks against this version (revdepcheck::revdep_check()) and report any new failures to their maintainers before submitting, per CRAN policy. Skip this step only if there truly are no reverse dependencies — state that explicitly incran-comments.mdeither way (step 4).Submit via
devtools::release()(interactive, walks through a final confirmation of the above) or the CRAN web form at https://cran.r-project.org/submit.html, attaching the built tarball fromdevtools::build().