Skip to content
Documentation
Skill

/notabene

notabene docs review loop: process review comments left on the docs and verify the docs. Use when the user says "address the comments", "process the doc comments", "apply the review feedback", "review/check the docs", or references the global /comments page. Reads the notabene

From plugin
notabene
53 skills5 commands

Claude Code

$ npx -y skills add z29k/notabene --skill notabene --agent claude-code

SKILL.md

notabene.SKILL.md
name: notabene
description: >-
  notabene docs review loop: process review comments left on the docs and verify
  the docs. Use when the user says "address the comments", "process the doc
  comments", "apply the review feedback", "review/check the docs", or references
  the global /comments page. Reads the notabene store, edits the docs per the
  feedback, marks them resolved + writes the journal, then verifies (renderer
  build, links, project checks). Ignores comments on "hold". This skill does NOT
  install, configure, or launch the review server — that's `notabene-setup`. Never
  commits without an explicit request.

<!-- Generated from docs/reference/agent-protocol.md + packages/claude-plugin/overlays/notabene.md by scripts/gen-protocol.mjs — do not edit. -->

Docs review loop (comments + verification)

**notabene**: a navigable renderer over a repo's docs + a human↔agent review loop. **Stateless** — the data lives in the consumer repo's git, not in the tool. What follows is the generic, agent-agnostic protocol; **three rules override it inside this plugin**:

1. **Not set up here?** No `notabene.config.mjs` or no `.notabene/` store → **hand off to the `notabene-setup` skill** (or `/notabene:setup`) to install/configure and launch, then resume. Don't fail; delegate — ignore the generic `npx … init` fallback below. 2. **Every CLI call goes through the plugin forwarder** — `node "${CLAUDE_PLUGIN_ROOT}/bin/nb.mjs" <cmd> --root <repo-root>` — never `npx notabene` (unscoped: not our package) and never a hardcoded version. This replaces **every** `npx -y @z29k/notabene@latest …` shown below (`comments ls`, `build`, `lint`, `journal add`). The loop still never depends on the CLI: file tools are enough. 3. **Authoring palette** — for what you can put in a page (Mermaid diagrams, GFM tables, code blocks, inter-doc links) and the MDX-safety rules, use the **`notabene-authoring`** skill rather than the web page linked in Step 4.

Discovery — EVERYTHING comes from the config (nothing hardcoded)

Read **`notabene.config.mjs`** at the repo root to learn:

  • **`store`** — comments + journal folder (e.g. `docs/.notabene`). **One file per

comment**: `<store>/<page>/<id>.json` (so branches don't conflict on merge). Journal: `<store>/journal.json`. Schema version: `<store>/meta.json` (`{ "schemaVersion": <n> }`, currently **3**). Older stores keep one array per page (`<store>/<page>.json`) — both are read; `notabene migrate` upgrades a store to the current schema (v3, one file per comment).

  • **`roots[]`** — the doc spaces: `{ key, label, path, exclude }`. A comment's `page`

field is prefixed by a root's `path` (e.g. root `docs/plans` → `page: "docs/plans/services/x"`).

  • **`i18n`** (optional, `{ locales, defaultLocale, strategy }`) — the doc is multi-language

and a comment's `page` key is **locale-encoded**, mapping straight to that language's file: `strategy: "directory"` → `page: "docs/fr/guide/x"` = file `docs/fr/guide/x.md`; `strategy: "suffix"` → `page: "docs/guide/x.fr"` = file `docs/guide/x.fr.md` (the default locale is unsuffixed: `page: "docs/guide/x"` = `docs/guide/x.md`). Edit **that** file — a comment belongs to one language; don't touch the other language's file or auto-translate unless asked.

  • **`verify[]`** — project-specific checks to run after editing.
  • **`review`** — `"auto"` (default) or `"approve"`. In **approve** mode you don't resolve

comments yourself: you edit, mark them **`addressed`**, and a human validates them (with a diff) at `/review`. See Step 5.

Assume **no** path, port or label. Do not require a live server or a port.

Strict rules (no exceptions)

  • **NEVER commit or run git operations without an explicit request** ("continue"/

"go on" ≠ commit). Offer the commit at the end.

  • **NEVER bulk-delete the store** (`rm -rf <store>`): those are the user's **real

comments** (precious, committed). To clean a test, delete a single comment by `id` (edit its page file), never the folder.

  • **Ignore `hold: true`** ("⏸ on hold") and `status` ≠ `open` (`addressed`/`resolved`

already handled): only process `open` **and not on hold**.

  • **Account for EVERY comment in the roster** (step 1). A pass is not "some of the

comments" — each id ends the pass either handled (`resolved`/`addressed`) or **explicitly declined**, with the reason posted as a `thread` reply so the human sees it. Leaving one silently untouched is a **failed pass**, not a partial success: an untouched comment is indistinguishable from one the human wrote a minute ago, so nothing downstream can flag it — not `/review`, which only ever shows what you DID, and not `comments verify`, for which an `open` comment is perfectly legal. You are the only check. A long roster is a reason to work in batches, never a reason to stop early.

  • **MDX-safety** (format `"mdx"` only): when editing a **`.mdx`** file, don't introduce

stray `{` or `<` outside code fences (MDX parses them as expression/JSX). **`.md`** files (CommonMark/GFM) are lenient — no such constraint. Validated by the renderer build.

  • **File-I/O first**: read/write the `<store>/` files **directly** with your file

tools. The `astro dev` server need NOT be running — the HTTP `/api/comments` is only a convenience when the site is already open. Depend on **neither a port nor a process**.

Step 1 — Read the comments to process

List the actionable set with the CLI (any agent can shell out — no store-parsing to reimplement, no `python3`):

npx -y @z29k/notabene@latest comments ls --open --json   # open AND not-on-hold, machine-readable
npx -y @z29k/notabene@latest comments ls --open          # …or human-readable

**That list is the pass's roster. Take it ONCE, whole, and write the ids down** — into your task list, a scratch file, whatever survives the pass. Every later step is measured against it, and step 6 reconciles with it. Neither the CLI nor the HTTP AP

Read more
@z29k
Ships withnotabene

Leave notes in the margins of your repo's docs then let your AI agent apply them, resolve the threads, and journal what changed & why.

Stars on GitHub

Momentum

stars in total
5
Star history of z29k/notabene on GitHub, a chart by star-history.com

Other skills on notabene.

notabene-authoring

notabene-authoring

What you can put in a notabene doc — the full rendering palette, so you can author or expand documentation using everything the…

@z29k@z29kInstall Skill
notabene-setup

notabene-setup

Install, configure, OR reconfigure notabene (the docs review tool) and start its review server — for a user who drives everything…

@z29k@z29kInstall Skill

More skills from other plugins.

context7-cli

context7-cli

Use the ctx7 CLI to fetch library documentation and configure Context7 MCP. Activate when the user mentions "ctx7" or "context7",…

@upstash@upstashInstall Skill
docs-components

docs-components

Comprehensive MDX component patterns (Note, Pitfall, DeepDive, Recipes, etc.) for all documentation types. Authoritative source…

@reactjs@reactjsInstall Skill
codebase-wiki

codebase-wiki

How to work in a Codebase Wiki project (the `codebase-wiki` starter pack): an agent-authored, source-grounded wiki of the…

@inkeep@inkeepInstall Skill

Questions about notabene.

Which coding agents can use notabene?
notabene installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.