The nimbus-docs CLI lists what’s in the registry, installs it, records what you own in nimbus.json, shows what’s fallen behind upstream, and lints your MDX content.
| Command | What it does |
|---|---|
list |
Lists what the registry has. |
add <slug> |
Installs a component, utility, feature or server adapter. |
add source <name|url> |
Hands your coding agent a guide for a content source. |
init |
Writes nimbus.json for a project that lacks one. |
migrate |
Applies package API migrations and lists upgrade reviews. |
outdated |
Lists starter files, components and package API work that changed upstream. |
diff [file] |
Shows, or takes, the upstream change to a starter file. |
check |
Checks the project’s setup, config and content without a build. |
lint |
Runs the authoring rules you’ve turned on. |
nimbus-docs list
Lists every installable component, utility, feature and content source.
npx @cloudflare/nimbus-docs listyarn nimbus-docs listpnpm nimbus-docs listbunx @cloudflare/nimbus-docs listFilter by type:
npx @cloudflare/nimbus-docs list --type uiyarn nimbus-docs list --type uipnpm nimbus-docs list --type uibunx @cloudflare/nimbus-docs list --type uinpx @cloudflare/nimbus-docs list --type libyarn nimbus-docs list --type libpnpm nimbus-docs list --type libbunx @cloudflare/nimbus-docs list --type libnpx @cloudflare/nimbus-docs list --type featureyarn nimbus-docs list --type featurepnpm nimbus-docs list --type featurebunx @cloudflare/nimbus-docs list --type featurenpx @cloudflare/nimbus-docs list --type sourceyarn nimbus-docs list --type sourcepnpm nimbus-docs list --type sourcebunx @cloudflare/nimbus-docs list --type sourceRunning nimbus-docs add with no slug shows the same list.
nimbus-docs add <slug>
Registry entries use two install modes based on their type. Special adapter-<id> slugs use a third flow that rewrites project configuration.
Components and utilities
For registry:ui and registry:lib slugs, the CLI resolves dependencies, copies files into your repo, and installs any npm packages they need.
npx @cloudflare/nimbus-docs add badgeyarn nimbus-docs add badgepnpm nimbus-docs add badgebunx @cloudflare/nimbus-docs add badgeResolve dependencies
Walks the slug’s
registryDependenciesand any npmdependenciesit needs.Copy files
Drops each file into the right path under
src/components/ui/,src/lib/, or wherever the entry declares.Update package.json
Adds npm dependencies if they’re not already present.
Already installed
add never overwrites files you own. It adds missing files, keeps files that differ from the registry, and lists both. A component that already matches the registry is reported as up to date.
Replace your copy
--overwrite replaces files that differ with the registry version, and lists each one. In a terminal, it asks first if you’ve edited the component or its dependencies.
Without a terminal, such as an agent, CI or a pipe, edited components are kept, listed with the command that replaces them, and the command exits 1. --overwrite --yes replaces them and says how many had edits.
add finds your edits from the install record in nimbus.json. For a component that came with the starter, it compares against your starter release, downloaded from GitHub. If that download is rate-limited, set GIGET_AUTH to a GitHub token, or pass --template-dir <path> to use a local checkout. With neither, it asks in a terminal and otherwise keeps the files.
Commit first, run it, and review the change with git diff:
npx @cloudflare/nimbus-docs add badge --overwriteyarn nimbus-docs add badge --overwritepnpm nimbus-docs add badge --overwritebunx @cloudflare/nimbus-docs add badge --overwriteFor add, --yes assents to prompts such as dependency installs but still keeps existing files. Use --overwrite when you actually mean “replace my files,” and --overwrite --yes only when you’ve decided to discard your edits.
Once installed, the component is yours to edit; there’s no upstream API to break. Each add records it in nimbus.json with its slug, registry, release and a content hash, so upgrades can tell what you changed.
Features
For registry:feature slugs, there’s nothing to copy. The recipe is a markdown prompt the agent reads, adapts to your project, and applies.
npx @cloudflare/nimbus-docs add 404-pageyarn nimbus-docs add 404-pagepnpm nimbus-docs add 404-pagebunx @cloudflare/nimbus-docs add 404-pageIf the CLI detects a coding agent in the environment, it prints the recipe to stdout for the agent to consume. Otherwise it prints pipe instructions you can run yourself:
npx @cloudflare/nimbus-docs add 404-page --print | claudeyarn nimbus-docs add 404-page --print | claudepnpm nimbus-docs add 404-page --print | claudebunx @cloudflare/nimbus-docs add 404-page --print | claudenpx @cloudflare/nimbus-docs add 404-page --print | codexyarn nimbus-docs add 404-page --print | codexpnpm nimbus-docs add 404-page --print | codexbunx @cloudflare/nimbus-docs add 404-page --print | codexUse --print to force the markdown output, skipping detection.
Server adapters
Add the adapter for the host you deploy to: adapter-cloudflare, adapter-netlify, adapter-node or adapter-vercel. The CLI installs the Astro adapter and rewrites the marked output block in astro.config. It refuses to replace a different adapter or a non-literal output value.
npx @cloudflare/nimbus-docs add adapter-cloudflareyarn nimbus-docs add adapter-cloudflarepnpm nimbus-docs add adapter-cloudflarebunx @cloudflare/nimbus-docs add adapter-cloudflareadapter-cloudflare also does two things:
- Rendering policy. It adds request rendering when the Nimbus config has none. An existing policy is kept, and an imported or ambiguous config gets a coding-agent handoff instead.
wrangler.jsonc. It writes a server-compatible one when none exists, or replaces an unchanged static one from Nimbus. A customizedwrangler.jsonc, or a JSON or TOML config, is left alone.
After completing the adapter install, expect:
const nimbusConfig = defineNimbusConfig({
rendering: { default: "request" },
// ...
});
export default defineConfig({
output: "server",
adapter: cloudflare({ prerenderEnvironment: "node" }),
integrations: [nimbus(nimbusConfig)],
});A coding agent running an adapter command gets the same edits as a shell.
Sometimes adapter-cloudflare can’t edit the config safely: there’s no marked output block, output isn’t a literal, the config is CommonJS or a symlink, the write fails, or the Nimbus config is imported. It then says why, prints a recipe for your agent to finish the job, and exits 0. --print prints that recipe without changing anything:
npx @cloudflare/nimbus-docs add adapter-cloudflare --print | claudeyarn nimbus-docs add adapter-cloudflare --print | claudepnpm nimbus-docs add adapter-cloudflare --print | claudebunx @cloudflare/nimbus-docs add adapter-cloudflare --print | claudeAlways run the project’s production build afterward. See Rendering policy for per-collection build/request overrides.
The equivalent long form is nimbus-docs add server-output --adapter <cloudflare|vercel|netlify|node>.
nimbus-docs add source <name|url>
Adds a content source: part of the site built from another git repository, a Notion database, or any provider. See Content from other sources.
npx @cloudflare/nimbus-docs add source github --print | claudeyarn nimbus-docs add source github --print | claudepnpm nimbus-docs add source github --print | claudebunx @cloudflare/nimbus-docs add source github --print | claude| Name | Source |
|---|---|
git, github, gitlab, bitbucket |
Another git repository. The aliases print the same guide with the host’s values. |
notion |
A Notion database. The agent installs @notionhq/client and notion-to-md and writes src/loaders/notion.ts. |
| a URL | A provider’s documentation: a guide for writing its loader, starting from that URL. |
add source alone lists them. Like a feature, the guide goes to your coding agent, and the agent writes any code the source needs; add source itself writes no files. A source’s name on its own, such as add notion, points you to add source notion.
nimbus-docs init
Writes a nimbus.json for a project that lacks one — a repo scaffolded before the record existed, an existing Astro site adopting Nimbus, or a deleted record. Fresh scaffolds already have one, so init is the on-ramp for everything else.
npx @cloudflare/nimbus-docs inityarn nimbus-docs initpnpm nimbus-docs initbunx @cloudflare/nimbus-docs initIt scans your installed components, matches each against the registry, and writes what it can recover — marking, never guessing:
- matched — byte-identical to the registry copy.
- modified — you’ve edited it; the record keeps the source identity so upgrades can still compare.
- hand-authored — yours, from no registry.
The starter version, templates-v* tag, and previously reviewed Nimbus version can’t be recovered from the repo alone, so they’re left blank (and flagged reconstructed). Use migrate --from <version> to establish the upgrade range.
# scan a nested package (monorepo)
npx @cloudflare/nimbus-docs init --root packages/docs# scan a nested package (monorepo)
yarn nimbus-docs init --root packages/docs# scan a nested package (monorepo)
pnpm nimbus-docs init --root packages/docs# scan a nested package (monorepo)
bunx @cloudflare/nimbus-docs init --root packages/docs# rebuild an existing record
npx @cloudflare/nimbus-docs init --force# rebuild an existing record
yarn nimbus-docs init --force# rebuild an existing record
pnpm nimbus-docs init --force# rebuild an existing record
bunx @cloudflare/nimbus-docs init --forceKeeping up to date
These commands keep a site current. Upgrade Nimbus puts them in order for a release.
nimbus-docs migrate
Composes every declared breaking change between the project’s lastReviewedNimbusVersion and the installed Nimbus version. It shows complete diffs for statically proven edits and bounded review tasks for everything else. Customized or ambiguous code is never forced.
Existing projects without a reviewed baseline must provide the exact Nimbus version whose migrations they last completed:
pnpm nimbus-docs migrate --from PREVIOUS_VERSION| Flag | Effect |
|---|---|
--dry-run, --diff |
Show the plan without changing files. |
--yes --json |
Apply and report as JSON, for agents. |
--print |
Print the remaining work as one Markdown handoff for an agent. |
--src-dir <relative-dir> |
Name Astro’s srcDir when the config computes it. |
The output lists the version range, required reviews, planned diffs, blockers and errors. Files outside the reported scan aren’t claimed as checked.
Optional upgrade entries come after required work. They never stop a build, but read each one: some describe a change the release makes on its own, such as newly published files. migrate --yes records them as reviewed.
After completing all reported work, explicitly confirm it and advance the committed reviewed baseline:
pnpm nimbus-docs migrate --from PREVIOUS_VERSION --yesPass --from only when the project has no recorded baseline. In a terminal, migrate asks before recording the reviewed version in nimbus.json; without one, it records it only with --yes. It never records it while a migration remains.
A pending required review also stops astro dev. With astro dev --background, the server only reports that it exited, so run nimbus-docs check to see which review.
Next, run outdated, then nimbus-docs check, astro check and the production build.
nimbus-docs outdated
The read-only “am I behind?” overview across package APIs, starter files, and registry components:
npx @cloudflare/nimbus-docs outdatedyarn nimbus-docs outdatedpnpm nimbus-docs outdatedbunx @cloudflare/nimbus-docs outdated- Package APIs — pending migrations and reviews, which
migratehandles. It also says when a newer Nimbus release is on npm. Reviews about API reference pages are skipped whensrc/content.config.*clearly doesn’t useapiCollection. - Registry components — components that changed upstream, and npm dependencies older than a component needs, with the command to update them. Updates stay review-only, because overwriting can change dependencies too.
- Starter files — your
src/files,AGENT.md,CLAUDE.mdandtsconfig.json, compared with the upstreamtemplates-v*tag.git diffcan’t show this, because that tag was never in your history. Content files are hidden unless you pass--all. Files every site rewrites, such aspackage.json,wrangler.jsoncandnimbus.json, aren’t compared.
--json gives agent-readable findings. summary.packageApis counts every migration and review, and summary.requiredPackageApis the required ones. A starter-needs-newer-package warning means the newer starter needs a newer package than you have, and it blocks diff --apply. Without a complete nimbus.json, you still get the package API results, marked as partial.
nimbus-docs diff [file]
Read-only detail for starter files — what you changed, and what changed upstream:
# every changed starter file
npx @cloudflare/nimbus-docs diff# every changed starter file
yarn nimbus-docs diff# every changed starter file
pnpm nimbus-docs diff# every changed starter file
bunx @cloudflare/nimbus-docs diff# one file
npx @cloudflare/nimbus-docs diff src/components/ui/aside/Aside.astro# one file
yarn nimbus-docs diff src/components/ui/aside/Aside.astro# one file
pnpm nimbus-docs diff src/components/ui/aside/Aside.astro# one file
bunx @cloudflare/nimbus-docs diff src/components/ui/aside/Aside.astro| Status | Meaning |
|---|---|
| clean to pull | Upstream changed it; you didn’t. |
| added or removed upstream | The file is new upstream, or gone. |
| hand-merge | You both changed it. |
| your changes | You changed it; upstream didn’t. Nothing to pull. |
For a clean update, addition or removal, the CLI can apply the change for one file:
npx @cloudflare/nimbus-docs diff src/components/ui/aside/Aside.astro --applyyarn nimbus-docs diff src/components/ui/aside/Aside.astro --applypnpm nimbus-docs diff src/components/ui/aside/Aside.astro --applybunx @cloudflare/nimbus-docs diff src/components/ui/aside/Aside.astro --apply--apply works one file at a time and never merges: it rechecks that the file is still unedited, then writes. It records the tag in nimbus.json (templatesTagByFile), so later diffs start from there. Review with git diff afterward. Starter route files are compared in your site’s rendering mode, so a route updated by check --fix doesn’t show as your change.
--to <templates-vX.Y.Z> compares against a specific tag, and --template-dir <path> against a local checkout.
nimbus-docs check
A build-free preflight. It checks the environment, project structure, pending migrations, authoring rules, and types, then reports whether the site can build:
pnpm nimbus-docs checkPass --env, --structure, --migrations, --lint, or --types to run only those categories. --fix applies the fixes it can make safely and asks before any fix that needs a value or installs a dependency. Without a terminal it skips the questions and installs only with --yes. --quiet shows errors only.
check reports each route file Nimbus manages whose mode disagrees with rendering (nimbus/route-file-mode). Without rendering, that’s building each of them ahead of time. --fix updates the file and lists every file it wrote. For a route it can’t fully edit, it makes the changes it can and lists what’s left.
--types type-checks your .ts and .tsx files with your own TypeScript. It doesn’t read .astro files; run astro check for those.
check exits 1 when an error-severity finding remains, and 0 otherwise. Warnings, informational findings, and checks that couldn’t run never change the exit code.
Pass --json for agent-readable output. status is passed, failed, or partial (some checks couldn’t run), and readiness is buildable, blocked, or unknown. Each finding has one of three severities:
| Severity | Meaning |
|---|---|
error |
Must be fixed. Counted in summary.errors and sets the exit code to 1. |
warn |
Advisory, such as the placeholder site URL. Counted in summary.warnings. |
info |
Informational only, such as an optional upgrade entry from migrate. Not counted in the summary. |
Checks that couldn’t run are listed as notes on their scope rather than as findings, each with the reason it was skipped. In the terminal, a scope with notes shows ◐ ok, partly checked.
check checks links only when an earlier astro build left .nimbus/routes.json; without it, link checking is a note, not an error. To gate CI on links, run astro build and then nimbus-docs lint; see Check links.
nimbus-docs lint
Runs the authoring rules you’ve turned on over src/content/, and over collections that load from elsewhere, such as content sources. It exits non-zero when an error finding remains. Lint never blocks the build.
npx @cloudflare/nimbus-docs lintyarn nimbus-docs lintpnpm nimbus-docs lintbunx @cloudflare/nimbus-docs lintFlags — combine with lint:
| Flag | Effect |
|---|---|
--format=json |
agent-readable diagnostics |
--rule=nimbus/single-h1 |
run one rule only |
--fix |
apply auto-fixes in place |
--quiet |
errors only, suppress warnings |
You set rules in the integration (nimbus(config, { rules })), and astro build, astro dev or astro sync writes them to .nimbus/lint.json. Without that file, lint exits 1 and asks you to build first, unless --rule names a rule. If the rules changed since, it asks you to run astro sync.
nimbusDisableRules frontmatter and inline comments turn rules off in one file, with no config.
nimbus/internal-link and nimbus/redirected-link need astro build to run first. Without the route list the build writes, lint exits 1 with an error on .nimbus/routes.json.
Help and version
npx @cloudflare/nimbus-docs --helpyarn nimbus-docs --helppnpm nimbus-docs --helpbunx @cloudflare/nimbus-docs --helpnpx @cloudflare/nimbus-docs --versionyarn nimbus-docs --versionpnpm nimbus-docs --versionbunx @cloudflare/nimbus-docs --version