This repository has four documentation surfaces that must stay in sync with the implementation. When you change the public API, update all of them:
| Surface | Path | Scope |
|---|---|---|
| README | README.md |
Full library overview, quick-start examples, feature summaries |
| Docs site | website/docs/**/*.mdx |
Detailed per-feature documentation |
| Docs intro | website/docs/index.mdx |
Landing page for docs site — feature cards and quick-start snippet |
| Home page | website/src/app/page.tsx |
Marketing site — FEATURES array, hero copy, CTA blocks |
Run this checklist every time you modify any of the files listed below:
- Update
README.mdOptions section - Update
website/docs/getting-started/index.mdxAgent constructor examples - Update the specific feature's docs page (e.g., if you add a new option for compaction, update
website/docs/compaction/index.mdx)
If you add/remove/rename a provider (i.e. add a new vendor to SUPPORTED_PROVIDERS in src/providers/resolve.ts or wire a new @ai-sdk/* factory into the CLI resolver)
- Update
README.mdProviders section (add a new subsection using the standardAiSdkProvider+@ai-sdk/<vendor>pattern) - Update
website/docs/providers/index.mdx(card list, description counts) - Update
website/docs/providers/meta.jsonto register the new page - Create or update the provider's dedicated docs page in
website/docs/providers/following theAiSdkProvider+createX(...)template used by the existing pages - Update
website/docs/getting-started.mdxprovider tabs - Update
website/src/app/page.tsxFEATURES array (provider count in "Eight providers, one interface") - Update
website/src/components/AdapterStack.tsxPROVIDERSarray (importName = thecreateXfactory, importPath = the@ai-sdk/<vendor>package) - Update
website/docs/index.mdxprovider descriptions
- Update
README.mdBuilt-in Tools section - Update
website/docs/tools/index.mdxtool reference tables - Update
website/docs/getting-started/index.mdxif it references tool counts
- Update
README.mdStream Events table - Update
website/docs/stream-events/index.mdxevent reference
If you add/remove/rename a sandbox factory (src/virtual/local-sandbox.ts, src/virtual/unsandboxed.ts, or a remote backend in src/virtual/*-sandbox.ts)
- Add a subpath entry in
src/(e.g.src/<backend>.ts) and register it intsup.config.ts+package.jsonexports - If adding a local backend, also consider adding a thin
{X}Agentfactory alongsideLocalAgent/UnsandboxedAgenton that subpath (seesrc/local.ts/src/unsandboxed.tsfor the pattern) - Update
README.mdSandboxes section (import table + per-backend example + shortcut table if applicable) - Update
website/docs/virtual.mdx(import table + per-backend example + shortcut section if applicable) - Update
website/src/app/page.tsxFEATURES array (sandbox count in "Seven sandbox backends") - Update
website/src/components/AdapterStack.tsx(LOCAL_SANDBOXESorREMOTE_SANDBOXES) so the picker emits the right import line
- Update
website/docs/stream-events/index.mdxRunOptions table
- Update
README.mdHooks section - Update
website/docs/hooks/index.mdxevent table - Update
website/docs/embedding/index.mdxif hook examples are affected
- Update
README.mdPresets section - Update
website/docs/getting-started/index.mdxpreset quick-start - Update
website/docs/embedding/index.mdxpreset examples
- Update
website/docs/embedding/index.mdxserver/client examples
- Update
README.mdPermissions section - Update
website/docs/permissions/index.mdxmodes table
- Update
README.mdCLI section (flags table, config example) - Update
website/docs/cli/index.mdx(flags reference, config keys table)
- Update
README.mdhealth checks snippet (in Embedding section) - Update
website/docs/embedding/index.mdxhealth checks section - Update
website/docs/cli/index.mdxdoctor command section - Update
src/__tests__/presets.test.tsdiagnose tests
- Update
website/docs/server-api/index.mdx(REST endpoints, WS messages, middleware) - Update
website/docs/embedding/index.mdxserver/client examples
- Update
website/docs/cli/index.mdxheadless mode section - Update
website/docs/server-api/index.mdxheadless CLI protocol section
If you change dot-directory handling (src/config/dot-dirs.ts, DotDirConfig, default names, or per-subsystem write paths)
- Update
README.mdOptions section (dotDirsfield) and the Project Context + Skills sections - Update
website/docs/context.mdx— the "Dot directories" section and theProjectContextConfigtable - Update
website/docs/skills.mdx— the "Auto-discovery" section (scan paths and precedence)
- Prefer the string provider shorthand for simple examples:
const agent = new Agent({ provider: "anthropic", cwd: "." });
sandboxis required onAgentand every preset (codingAgent,planningAgent,reviewAgent). The root barrel deliberately does not ship a default, so every example must either pass an explicitsandboxor use one of the local-backend shortcuts below.- Use the
sandboxpattern when showing explicit sandbox configuration:import { Agent } from "noumen"; import { LocalSandbox } from "noumen/local"; const agent = new Agent({ provider, sandbox: LocalSandbox({ cwd: "/my/project" }), options: { ... }, });
- For local sandboxes, prefer the shortcut factories in short snippets — they package
new Agent(...)+ sandbox construction into one call and keep the import line count down:These accept the fullimport { LocalAgent } from "noumen/local"; // OS-level sandboxing import { UnsandboxedAgent } from "noumen/unsandboxed"; // raw host access const agent = LocalAgent({ provider: "anthropic", cwd: "." });
AgentOptionsshape minussandbox, plus an optionallocalSandbox/unsandboxedblock for forwarding extra options to the underlying sandbox factory. Remote sandboxes have no shortcut — keep them onnew Agent({ provider, sandbox })because their config (tokens, templates, connection state) is clearer at the call site. - Use
AiSdkProvider+ a Vercel AI SDK factory for every vendor example. noumen no longer ships per-vendor provider classes — each vendor is just a thin@ai-sdk/<vendor>package hooked up to the unified adapter:Provider-family mapping table used in the docs:import { AiSdkProvider } from "noumen"; import { createAnthropic } from "@ai-sdk/anthropic"; const anthropic = createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY }); const provider = new AiSdkProvider({ model: anthropic("claude-opus-4.6"), providerFamily: "anthropic", cacheConfig: { enabled: true }, });
- OpenAI / Azure / OpenAI-compatible proxies →
createOpenAI(...).chat(id)(pin to chat/completions) orcreateOpenAI(...)(id)(Responses API).providerFamilyis inferred as"openai". - Anthropic →
createAnthropic(...)(id),providerFamily: "anthropic",cacheConfig: { enabled: true }. - Google Gemini →
createGoogleGenerativeAI(...)(id),providerFamily: "google". - Moonshot AI →
createMoonshotAI(...)(id),providerFamily: "moonshot". - OpenRouter →
createOpenRouter(...).chat(id)from@openrouter/ai-sdk-provider. - AWS Bedrock →
createAmazonBedrock(...)(id),providerFamily: "anthropic"for Claude. - Google Vertex →
createVertex(...).anthropic(id)for Claude,createVertex(...)(id)for Gemini. - Ollama →
createOllama(...)(id)fromollama-ai-provider-v2.
- OpenAI / Azure / OpenAI-compatible proxies →
- Import
AiSdkProviderfrom the main barrel:import { AiSdkProvider } from "noumen";
- No more
noumen/openai,noumen/anthropic,noumen/gemini,noumen/openrouter,noumen/bedrock,noumen/vertex, ornoumen/ollamasubpaths — these were removed in the 0.8 migration. Do not reintroduce them in docs, code, or examples. - Import every sandbox factory from its own subpath, mirroring the provider convention. The root barrel does not export any sandbox factory — only the
Sandbox/VirtualFs/VirtualComputerinterface types — so every sandbox is opted into by import and optional peer deps never enter the module graph unless requested:A vitest invariant atimport { LocalSandbox } from "noumen/local"; // OS-level sandboxing import { UnsandboxedLocal } from "noumen/unsandboxed"; // raw host access, no isolation import { DockerSandbox } from "noumen/docker"; // requires `dockerode` import { E2BSandbox } from "noumen/e2b"; // requires `e2b` import { FreestyleSandbox } from "noumen/freestyle"; // requires `freestyle-sandboxes` import { SshSandbox } from "noumen/ssh"; // requires `ssh2` import { SpritesSandbox } from "noumen/sprites"; // no peer dep
src/__tests__/barrel-cold-start.test.tsmocks every optional peer to throw on import, asserts the root barrel still loads, and asserts no sandbox factory or adapter is reachable from it. If you add a new optional peer, add it to the list there. - Local adapter primitives (
LocalFs,LocalComputer,SandboxedLocalComputer) live onnoumen/localnext toLocalSandbox:import { LocalFs } from "noumen/local";
- Import the Agent and interface types from the main barrel:
import { Agent, type Sandbox } from "noumen";
These numeric claims appear in multiple places. Grep for them when changing the relevant code:
- Provider count — currently 8 (OpenAI, Anthropic, Gemini, Moonshot, OpenRouter, Bedrock, Vertex, Ollama)
- Core tool count — currently 9 (ReadFile, WriteFile, EditFile, Bash, Glob, Grep, WebFetch, NotebookEdit, AskUser)
- Sandbox backend count — currently 7 (LocalSandbox, UnsandboxedLocal, Sprites, Docker, E2B, Freestyle, SshSandbox)
- Hook event count — currently 18 (PreToolUse, PostToolUse, PostToolUseFailure, TurnStart, TurnEnd, SessionStart, SessionEnd, SubagentStart, SubagentStop, PreCompact, PostCompact, PermissionRequest, PermissionDenied, FileWrite, ModelSwitch, RetryAttempt, MemoryUpdate, Error)
- Permission mode count — currently 6 (default, plan, acceptEdits, auto, bypassPermissions, dontAsk)
mcpServers is a Record<string, McpServerConfig>, not an array. Correct:
mcpServers: {
filesystem: { command: "npx", args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"] },
}lsp is a Record<string, LspServerConfig>, not an enableLsp boolean + lspServers array. Correct:
lsp: {
typescript: { command: "typescript-language-server", args: ["--stdio"], fileExtensions: [".ts", ".tsx"] },
}text_deltaandthinking_deltaevents useevent.text, notevent.content.
When making documentation changes, verify the docs site builds:
cd website && pnpm build