notabene · note this well
EN
On this page

CLI

The npm package is scoped (@z29k/notabene); the installed command is just notabene, so npx notabene … works as-is once the package is a dependency of your repo. Without a local install, always use the scoped name — npx -y @z29k/notabene@latest … — because unscoped notabene is not our package.

CommandWhat it does
notabene doctorRead-only state as JSON: config/store/port + detected doc folders — --json
notabene initWrite notabene.config.mjs + create the store (no-op if present); --detect auto-detects doc folders. Also writes the agent entry point: <store>/protocol.md + a bounded block in AGENTS.md — opt out with --no-protocol / --no-agents-md. Idempotent: re-run it to refresh both
notabene devStart the review server over this repo’s docs (live-reload); --detach runs it as a background daemon. With the optional pagefind dev dep, its search is full-text too
notabene statusIs the detached server running? (pid, port, URL) — --json
notabene stopStop the detached server
notabene buildBuild the site (Node standalone; docs prerendered, no write API in the artifact)
notabene build --publicRead-only static site for public hosting — see the guide. [--site URL] [--base /sub] [--out DIR]. With the optional pagefind dev dep installed, the artifact gets static full-text search
notabene previewServe the built site
notabene lintValidate inter-doc links against the last build’s emitted routes (did-you-mean suggestions; --json). After build --public, also catches links from public pages into private content. Exit 1 = broken links, 2 = no build yet
notabene pdfExport a PDF via headless Chromium (bookmark outline + page numbers); --scope doc|space:K|folder:K/P|page:K/I, --locale, --out, --chrome. Needs the optional puppeteer peer dep (or puppeteer-core + --chrome)
notabene migrateConvert the store to the one-file-per-comment layout (stamps schemaVersion 3)
notabene comments lsList comments — --open --json --page <p> (for agents/scripts)
notabene comments doneMark comment(s) handled: done <id…> [--note <text>] [--journal <entryId>]. The status comes from review (auto → resolved, approve → addressed) — --status overrides, --force acts on a comment that is on hold. Atomic; every other field preserved
notabene comments reopenSend comment(s) back to open: reopen <id…> [--reply <text>] [--author <name>] — the reason becomes a thread reply the agent reads on its next pass (the CLI side of rejecting at /review)
notabene comments verifyAudit the store: statuses, comment↔journal links both ways, layout, duplicates, dangling pages. --json; exit 1 on errors, 2 with no store. Run it after an agent pass, or in CI
notabene journal addAppend a JSON journal entry read from stdin (atomic; --json echoes { id } so an agent can chain it)
notabene protocolPrint the agent protocol on stdout — --path prints where it lives, --write refreshes <store>/protocol.md

Global flags

FlagMeaning
--root <path>Consumer repo root (default: cwd)
--config <path>Config path (default: <root>/notabene.config.mjs)
--port <n>Dev server port (else config port, else a free one)
--detachdev only: background daemon (status/stop manage it)
--detectinit only: prefill roots[] from the doc folders found
--no-protocol / --no-agents-mdinit only: skip the <store>/protocol.md copy / the AGENTS.md block
--hostExpose on the LAN — trusted networks only (safety)
--public / --site / --base / --outbuild only: the public site artifact
Updated Edit this page