* chore: replace the command ids left over from the CLI consolidation The scheduler and template-print documentation still named `schedule sync` and `skills:sync`, the template reference pages showed `pnpm migrate`, and the global create-app Skill taught `pnpm config:*` scripts that applications no longer carry. The create-app smoke test now records `<topic> <command>` ids directly instead of mapping them back to the old script names. * chore: drop references to the removed client:inspect and server:inspect Application inspection was removed in #329, but the plugin-development Skill, skills/README.md and a few comments still sent readers to `client:inspect` and `server:inspect`. `plugin inspect` covers registration state only, so the guidance now points there for registration and drops the composition diagnostics. The authentication test that asserts no command is prescribed now checks for `config init` rather than the old script name. * fix: clear the remaining leftovers of the CLI consolidation A second sweep after #431, #434, #437 and #438 found guidance and code that still described the old command line. - `plugin inspect` suggested the removed `pnpm plugin:register` and `pnpm skills:sync` scripts; it now suggests `pnpm nocobase plugin register` and `skills sync` with the flags that located the App, and the remaining colon-form hints name the real commands. - The Default template never registered the scheduler's CLI entry, so the documented `pnpm nocobase scheduler sync` did not exist there. - `@refinedev/cli` and `tsc-alias` are spawned by `nocobase build` and are now declared as optional peers of `@nocobase/app-cli`. - `peers:check` covers `@nocobase/app-cli` again after its move to `packages/app`, and `deps:check` scans plugin `cli/` sources and source directories named `dist`. - Skills, templates, plugin AGENTS.md copies, READMEs and the docs site now describe current commands, the `metadata/` directory from #437, the Hub archive path, `release` availability and the two `dist/package.json` scripts. Examples and Hub ignore `/.env`. * fix: address review threads on the CLI leftovers - the templates' Docker build contexts exclude build output where builds write it (each workspace package's dist/, the documentation sites') instead of every directory named dist/, so a source directory with that name, such as app-cli's dist commands, needs no exception - `plugin inspect` suggests `skills sync --package <full name>` rather than the compatibility `--plugin`, and a test covers suggestions for a `--workspace-root`/`--app` inspection - the CLI example Skill states when two plugin topics collide: once the scope and an `app-plugin-` prefix are removed - `peers:check` fails on a manifest that does not parse instead of leaving the package out - the smoke test's fake pnpm records a top-level command such as `nocobase build` by its own id, reading the top-level commands from app-cli - the plugins changeset no longer lists create-app, whose change another changeset already covers
NocoBase Documentation
The documentation site, built with Rspress. It is a workspace package (@nocobase/docs), so pnpm install at the repository root installs its dependencies along with everything else.
pnpm --filter @nocobase/docs dev
pnpm --filter @nocobase/docs build
--lang
Each language is built as a separate site: en is served from / and every other language from /<lang>/. The language is selected by --lang or by the DOCS_LANG environment variable, defaulting to en.
pnpm --filter @nocobase/docs dev --lang=cn
pnpm --filter @nocobase/docs build --lang=cn
pnpm --filter @nocobase/docs preview --lang=cn
pnpm --filter @nocobase/docs build --lang=all
The site framework carries translations for cn / en / ja / es / pt / de / fr / ru / id / vi, but only the languages that have a directory under docs/ are actually built. Today that is cn and en; adding a language is a matter of creating its directory.
--check-dead-links
Dead-link checking is on by default during build and covers links in Markdown bodies. Links in frontmatter — the home page hero actions and feature cards — are not checked, so a route named there can be missing without failing the build.
pnpm --filter @nocobase/docs build --lang=en --check-dead-links=false
Structural checks
check.sh runs the same structural checks CI does: file-tree, _meta.json, _nav.json and home-page alignment across languages, plus bloated-file and deprecated-reference detection. cn is the baseline every other language is compared against.
./check.sh
./check.sh --lang=es
gh pr view <pr> --json files --jq '.files[].path' | ./check.sh --with-i18n-coverage
scripts/README.md documents each script individually.
Documentation AI assistant
The documentation assistant calls an independent Rust backend from the docs-ai-service repository. The backend searches and verifies live pages under docs.nocobase.com; the documentation build does not generate a local AI index. With DOCS_AI_API_URL unset the assistant renders but has nothing to call, which is the expected state for local documentation work.
cd <path-to-docs-ai-service>
cargo run
cd <path-to-nocobase3>
DOCS_AI_API_URL=http://127.0.0.1:3100 pnpm --filter @nocobase/docs dev --lang=cn
Configure the backend for the approved DeepSeek online search provider before starting it. The UI always displays server-provided official citations and renders answer text without raw HTML.
Toolchain
Prettier is the repository baseline, @nocobase/dev-config/prettier. ESLint is this package's own flat config, with eslint-plugin-react-hooks covering hook dependency lists, conditionally called hooks, and missing list keys. Both should report nothing.
pnpm --filter @nocobase/docs lint
pnpm --filter @nocobase/docs format
theme/components/{Nav,NavHamburger,NavScreen,Search,HomeHero} are vendored from Rspress's ejectable theme and excluded from both tools. They are kept byte-for-byte so that a Rspress upgrade is a diff against the new upstream copy; formatting or lint-fixing them destroys that. Fix a problem in one of them upstream and re-copy. Search/SearchPanel.tsx and Search/SuggestItem.tsx do carry deliberate local changes, each with a header naming them.
The exclusion is spelled out in three places, and adding a sixth vendored directory means editing all three:
| Where | Covers |
|---|---|
eslint.config.mjs, VENDORED_FROM_RSPRESS |
ESLint, wherever it runs from |
.prettierignore |
Prettier run inside this directory |
the repository root .prettierignore |
Prettier run from the repository root — the pre-commit hook and pnpm format:all |
The pre-commit hook runs this package's own ESLint because lint-staged.config.mjs at the repository root lists docs in SELF_LINTING_DIRECTORIES. Without that entry it would run the root ESLint, which matches nothing here and would exit zero without checking anything.
eject rspress components
Customize the theme by ejecting the components. After ejecting, you can find the components in ./theme/components and modify them as you like.
pnpm --filter @nocobase/docs eject <ComponentName>
demo preview
Use @docs/* to import demo components; the alias resolves to docs/ at build time.
import { HelloModel } from '@docs/cn/flow-engine/_demos/HelloModel';
Then use the demo component in the markdown file:
```tsx file="./_demos/flow-model-renderer.tsx" preview
```