# Devframe > Framework-neutral foundation for building devtools: one definition becomes a Web Standard handler, a CLI, a static report, an MCP server, or a hub dock. ## Documentation Every page below is available as raw markdown. Fetch any URL directly. - [Landing page](https://devfra.me/raw/index.md): Overview of Devframe ## Documentation Sets - [Devframe Documentation](https://devfra.me/llms-full.txt): Complete Devframe documentation as plain markdown: guide, adapters, frameworks, add-ons, references, and the error reference. ## Guide - [Guide](https://devfra.me/raw/guide.md) - [Introduction](https://devfra.me/raw/guide.md): Devframe is a framework-neutral foundation for building a devtool once and running it everywhere - inside any host framework, as a standalone tool, or through a coding agent. - [Getting Started](https://devfra.me/raw/guide/getting-started.md): Answer a few questions about the devtool you want to build and get a reading list tailored to it. - [Tutorial: Build a Server Data Inspector](https://devfra.me/raw/guide/tutorial-server-data-inspector.md): Build a devtool that displays and queries live server-side data, then ship it as a hub dock entry, a static build, a standalone dev server, and a CLI. - [Devframe Definition](https://devfra.me/raw/guide/devframe-definition.md): One defineDevframe call returns a portable DevframeDefinition any adapter consumes. - [RPC](https://devfra.me/raw/guide/rpc.md): Type-safe, bidirectional RPC built on birpc, validated against any Standard Schema validator. Dev runs over WebSocket; build/SPA serves a pre-computed static dump. - [Shared State](https://devfra.me/raw/guide/shared-state.md): Shared state is observable, immutable-by-default state synced between the node side and every RPC client, surviving reconnects: a new RPC client gets the snapshot. - [Streaming](https://devfra.me/raw/guide/streaming.md): Streaming channels push chunk-style data from the node side to the browser side over the RPC socket. - [Client Assets](https://devfra.me/raw/guide/client-assets.md): A devframe's UI is a built SPA; clientAssets says where it lives: a local directory or published npm package. - [Scoped Context](https://devfra.me/raw/guide/scoped-context.md): A scoped context is a namespaced view of the context: it auto-prefixes every RPC id, shared-state key, and streaming channel with your tool's id, and adds a typed, persisted settings store, used from a single tool's code. - [JSON-Render](https://devfra.me/raw/guide/json-render.md): JSON-render describes a UI as data: a serializable component spec any frontend renders. Opt-in: a plain devframe pulls zero JSON-render dependencies. Two packages: - [Structured Diagnostics](https://devfra.me/raw/guide/diagnostics.md): ctx.diagnostics is a thin layer over nostics for author-defined coded diagnostics, each with a stable code, docs URL, and structured payload. - [Standalone CLI with Devframe](https://devfra.me/raw/guide/standalone-cli.md): npx my-tool starts a dev server serving a Vue/Nuxt/React SPA over type-safe RPC, plus build/mcp. - [Client](https://devfra.me/raw/guide/client.md): The RPC client connects any surface (dock iframe, remote page, standalone SPA) to a devframe's node side with type-safe RPC, shared state, and a trust handshake. - [In-Page Channel](https://devfra.me/raw/guide/in-page-channel.md): The in-page channel connects a devframe's page script to its panels entirely in the browser: typed events, calls, and page-script-authoritative shared state, with no server involved. - [Transports](https://devfra.me/raw/guide/transports.md): Devframe serves live RPC over two interchangeable transports, WebSocket and SSE, so an RPC client connects even where the WebSocket upgrade is unavailable (serverless, buffering proxies). Both speak the identical birpc wire protocol, transparent to your RPC code. - [Security](https://devfra.me/raw/guide/security.md): Devframe tools are secure by default: connections bind to localhost, and dev-mode RPC requires a trust handshake before accepting a browser. - [Agent-Native Devframe](https://devfra.me/raw/guide/agent-native.md): Devframe exposes its API (RPC functions, resources, shared state) to agents, over MCP on the node side and WebMCP on the browser side, opt-in per function. - [Hub](https://devfra.me/raw/guide/hub.md): @devframes/hub orchestrates many devtools sharing a UI: a dock registry, terminal aggregation, message/toast queue, and command palette. It ships no UI; hub UI providers provide their own atop the hub's RPC + shared-state protocol. - [Client Scripts & Client Context](https://devfra.me/raw/guide/client-context.md): A dock client script runs a devframe's code inside the host page; the client context is how client scripts reach the hub. - [Serve a Hub Anywhere](https://devfra.me/raw/guide/hub-initiate.md): initHub() from @devframes/hub/initiate serves a whole multi-devframe devtools install from one web-standard handler on a catch-all route. - [Cross-Devframe Services](https://devfra.me/raw/guide/services.md): ctx.services lets one devframe expose a typed, namespaced capability visible to every devframe. Two tiers: in-process services (provide/get) share live objects between devframes; wire services also register RPC and advertise to RPC clients. - [Deep Linking](https://devfra.me/raw/guide/deep-linking.md): Send a user to a view inside a devframe (from another dock, a coding agent, or a copied URL) two ways: the hub relays a dock activation to focus a dock in place; a standalone SPA reads its URL hash to restore the view. - [Build Your Own JSON-Render Frontend](https://devfra.me/raw/guide/build-your-own-json-render-frontend.md): @devframes/json-render-ui is the reference frontend, not the protocol; any implementation of the renderer contract replaces it. The Next hub witness ships a React one at src/client/json-render/. - [Build Your Own Hub UI](https://devfra.me/raw/guide/build-your-own-hub-ui.md): A hub UI provider implements two contracts, the node-side ui slot and the browser-side context. @devframes/hub-ui is the reference. - [Built with Devframe](https://devfra.me/raw/guide/built-with.md): Real-world devtools and hub UI providers built on devframe, from Vite DevTools to ESLint Config Inspector. ## Adapters - [Adapters](https://devfra.me/raw/adapters.md) - [Adapters](https://devfra.me/raw/adapters.md): The lowest-level path is the standard handler, initDevframe(def, { base }): a Web Standard (request: Request) => Promise for any catch-all route. Every path below builds on it. - [The Standard Handler](https://devfra.me/raw/adapters/initiate.md): initDevframe() turns a DevframeDefinition into a running devframe whose .handler (a Web Standard (request: Request) => Promise) carries everything a devframe serves (SPA, __connection.json discovery, RPC socket, auth gate, MCP route) under one mount base. Every other serving path (adapters,… - [CLI (cac)](https://devfra.me/raw/adapters/cac.md): A cac CLI around a DevframeDefinition with dev, build, and mcp commands. cac is an optional peer: - [Dev](https://devfra.me/raw/adapters/dev.md): createCac's building block: h3 + WebSocket RPC + the SPA at the resolved base path. - [Build](https://devfra.me/raw/adapters/build.md): Produces a static deploy: - [Vite](https://devfra.me/raw/adapters/vite.md): Wraps a DevframeDefinition so Vite DevTools' kit plugin-scan picks it up. The factory lives in @vitejs/devtools-kit/node, keeping devframe Vite-free. - [Embedded](https://devfra.me/raw/adapters/embedded.md): Register a devframe into an already-running context at runtime: dynamic, post-startup registration (unlike vite's plugin-scan). Inherits the hosted /__/ default. - [MCP](https://devfra.me/raw/adapters/mcp.md): Exposes a devframe's agent-facing API as a Model Context Protocol server: coding agents call flagged RPCs and read resources. ## Frameworks - [Frameworks](https://devfra.me/raw/frameworks.md) - [Frameworks](https://devfra.me/raw/frameworks.md): The framework kits (@devframes/vite, @devframes/nuxt, @devframes/next) integrate devframe with a meta-framework's dev server. Two subpaths: - [Vite](https://devfra.me/raw/frameworks/vite.md): @devframes/vite splits into @devframes/vite/single (dev-serve one devframe's SPA) and @devframes/vite/hub (mount a hub); the bare import throws. - [Nuxt](https://devfra.me/raw/frameworks/nuxt.md): @devframes/nuxt splits into @devframes/nuxt/single (author one devframe) and @devframes/nuxt/hub (mount a hub); the bare import throws. - [Next](https://devfra.me/raw/frameworks/next.md): @devframes/next hosts devframes from a Next.js App Router app via a route handler: one fetch handler serves each SPA and its __connection.json via serveStaticHandler. ## Add-ons - [Add-ons](https://devfra.me/raw/add-ons.md) - [Add-ons](https://devfra.me/raw/add-ons.md): Ready-to-run packages built on Devframe: built-in devframes you can run, compose, or learn from, and wire services that share one node-side capability across every devframe on a host. - [Devframes](https://devfra.me/raw/add-ons/devframes.md): Ready-to-run built-in example devframes. Compose your own DevTools solution from them, run one standalone, or read one as a reference for building your own. - [Devframes](https://devfra.me/raw/add-ons/devframes.md): Ready-to-run built-in example devframes. Compose your own DevTools solution from them, run one standalone, or read one as a reference for building your own. - [Data Inspector](https://devfra.me/raw/add-ons/devframes/data-inspector.md): A Vue query workbench for live server-side objects: register data sources, then compose jora queries in the owning process. - [Devframe Inspector](https://devfra.me/raw/add-ons/devframes/inspect.md): A self-inspector for any devframe connection, including the host framework's: a Vue SPA. - [Open Graph Viewer](https://devfra.me/raw/add-ons/devframes/og.md): Inspect a page's Open Graph / Twitter metadata and social cards, built as a Vue + Vite SPA. - [Accessibility Inspector](https://devfra.me/raw/add-ons/devframes/a11y.md): Runs axe-core against the user app, lists WCAG A/AA violations in a Solid panel, and highlights the element on hover. - [Git](https://devfra.me/raw/add-ons/devframes/git.md): A repository dashboard: a Next.js + shadcn/ui SPA that shells out to git. The same bundle runs live or static. - [Terminals](https://devfra.me/raw/add-ons/devframes/terminals.md): A terminal panel: a Svelte SPA on xterm.js. - [Code Server](https://devfra.me/raw/add-ons/devframes/code-server.md): Run VS Code in the browser as a devframe panel: detect a local editor, launch on demand, embed in an auto-authenticated iframe. - [Assets](https://devfra.me/raw/add-ons/devframes/assets.md): Browse, preview, and manage files in a directory, porting Nuxt DevTools' Assets tab. - [Services](https://devfra.me/raw/add-ons/services.md): Built-in wire services (@devframes/service-*): one node-side capability installed once per host and consumed by every devframe and RPC client, without re-implementing or re-bundling it. - [Services](https://devfra.me/raw/add-ons/services.md): Built-in wire services (@devframes/service-*): one node-side capability installed once per host and consumed by every devframe and RPC client, without re-implementing or re-bundling it. - [Open](https://devfra.me/raw/add-ons/services/open.md): The @devframes/service-open wire service: open files in an editor or reveal them in the OS explorer over RPC, with workspace-root path containment and editor gating. - [Git](https://devfra.me/raw/add-ons/services/git.md): The @devframes/service-git wire service: typed read/write git operations over RPC on one repository, shared by every devframe on the host. - [Shiki](https://devfra.me/raw/add-ons/services/shiki.md): The @devframes/service-shiki wire service: node-side Shiki syntax highlighting shared over RPC, LRU-cached and dual-theme, so client bundles stop shipping their own grammars and themes. ## Errors - [Errors](https://devfra.me/raw/errors.md) - [Error Reference](https://devfra.me/raw/errors.md): Devframe surfaces warnings and errors as structured diagnostics: each with a unique code, a human-readable message, and a link to this documentation. - [DF0006: RPC Function Not Registered](https://devfra.me/raw/errors/DF0006.md): RPC function "{name}" is not registered - [DF0007: AsyncLocalStorage Not Set](https://devfra.me/raw/errors/DF0007.md): AsyncLocalStorage is not set, it likely to be an internal bug of the Devframe foundation - [DF0008: View distDir Not Found](https://devfra.me/raw/errors/DF0008.md): distDir {distDir} does not exist - [DF0012: Storage Parse Failed](https://devfra.me/raw/errors/DF0012.md): Failed to parse storage file: {filepath}, falling back to defaults. - [DF0013: Shared State Not Found](https://devfra.me/raw/errors/DF0013.md): Shared state of "{key}" is not found, please provide an initial value for the first time - [DF0014: Invalid Agent Field](https://devfra.me/raw/errors/DF0014.md): RPC function "{name}" has an invalid agent field: description must be a non-empty string. - [DF0015: Agent Tool Already Registered](https://devfra.me/raw/errors/DF0015.md): Agent tool "{id}" is already registered. - [DF0016: Agent Resource Already Registered](https://devfra.me/raw/errors/DF0016.md): Agent resource "{id}" is already registered. - [DF0017: MCP Server Start Failure](https://devfra.me/raw/errors/DF0017.md): Failed to start MCP server ({transport}): {reason} - [DF0019: Agent Requires JSON-Serializable RPC](https://devfra.me/raw/errors/DF0019.md): RPC function "{name}" has agent set but jsonSerializable is not true; MCP requires JSON-serializable data. - [DF0020: Non-JSON Value in JSON-Serializable RPC](https://devfra.me/raw/errors/DF0020.md): RPC function "{name}" declares jsonSerializable: true but the value at "{path}" is a {type}. - [DF0021: RPC Function Already Registered](https://devfra.me/raw/errors/DF0021.md): RPC function "{name}" is already registered - [DF0022: RPC Function Not Registered (Update)](https://devfra.me/raw/errors/DF0022.md): RPC function "{name}" is not registered. Use register() to add new functions. - [DF0023: RPC Function Not Registered (Get)](https://devfra.me/raw/errors/DF0023.md): RPC function "{name}" is not registered - [DF0024: Missing RPC Handler](https://devfra.me/raw/errors/DF0024.md): Either handler or setup function must be provided for RPC function "{name}" - [DF0025: Function Not in Dump Store](https://devfra.me/raw/errors/DF0025.md): Function "{name}" not found in dump store - [DF0026: No Dump Match](https://devfra.me/raw/errors/DF0026.md): No dump match for "{name}" with args: {args} - [DF0027: Invalid Dump Configuration](https://devfra.me/raw/errors/DF0027.md): Function "{name}" with type "{type}" cannot have dump configuration. Only "static" and "query" types support dumps. - [DF0028: Snapshot Type Mismatch](https://devfra.me/raw/errors/DF0028.md): Function "{name}" with type "{type}" cannot use snapshot: true. Only "query" functions support this sugar; "static" functions have equivalent default behavior already. - [DF0029: Stream Buffer Overflow](https://devfra.me/raw/errors/DF0029.md): Stream "{channel}#{id}" dropped {dropped} chunk(s) after exceeding the client high-water mark. - [DF0030: Unknown Stream ID](https://devfra.me/raw/errors/DF0030.md): Stream "{channel}#{id}" is unknown; no producer has called channel.start({ id: "{id}" }). - [DF0031: Write to Closed Stream](https://devfra.me/raw/errors/DF0031.md): Cannot write to closed stream "{channel}#{id}". - [DF0032: Streaming Channel Already Registered](https://devfra.me/raw/errors/DF0032.md): Streaming channel "{channel}" is already registered. - [DF0033: Dev RPC Bridge Failed to Start](https://devfra.me/raw/errors/DF0033.md): Failed to start dev RPC bridge for "{id}": {reason} - [DF0034: Already-Namespaced Scoped Registration](https://devfra.me/raw/errors/DF0034.md): Scoped RPC registration for namespace "{namespace}" received an already-namespaced function name "{name}". - [DF0035: Storage File Persist Failed](https://devfra.me/raw/errors/DF0035.md): Failed to persist storage file: {filepath} - [DF0036: RPC Call Rejected, Not Authorized](https://devfra.me/raw/errors/DF0036.md): RPC call to "{name}" was rejected: the caller is not authorized. - [DF0037: Duplicate Service Provider](https://devfra.me/raw/errors/DF0037.md): A service is already provided under "{id}". - [DF0038: Invalid JSON-Render Element Props](https://devfra.me/raw/errors/DF0038.md): JSON-render view "{id}" received invalid props on element "{key}": {issues} - [DF0039: Duplicate JSON-Render View](https://devfra.me/raw/errors/DF0039.md): A JSON-render view with id "{id}" already exists in scope "{scope}". - [DF0040: JSON-Render View Used After Disposal](https://devfra.me/raw/errors/DF0040.md): JSON-render view "{id}" was used after it was disposed. - [DF0041: JSON-Render Spec Is Not JSON-Serializable](https://devfra.me/raw/errors/DF0041.md): JSON-render view "{id}" spec is not JSON-serializable: {reason} - [DF0042: Static Build Disabled By The Definition](https://devfra.me/raw/errors/DF0042.md): "{id}" declares capabilities.build: false; its static export is not meaningful (writes are excluded and any live-served data won't be there). - [DF0043: Invalid RPC Argument](https://devfra.me/raw/errors/DF0043.md): RPC function "{name}" received an invalid argument at position {index}: {issues} - [DF0044: Invalid RPC Return Value](https://devfra.me/raw/errors/DF0044.md): RPC function "{name}" returned a value that failed its returns schema: {issues} - [DF0045: Instance Registry Update Failed](https://devfra.me/raw/errors/DF0045.md): Failed to update the devframe instance registry at "{file}": {reason} - [DF0046: Connector Requires the MCP SDK](https://devfra.me/raw/errors/DF0046.md): devframe connect requires the optional peer dependency @modelcontextprotocol/client: {reason} - [DF0047: Agent Tool Wire-Name Collision](https://devfra.me/raw/errors/DF0047.md): Agent tool "{id}" is hidden from the MCP surface: its wire name "{name}" collides with the tool "{existing}". - [DF0048: Unknown Shared-State Key](https://devfra.me/raw/errors/DF0048.md): Unknown shared-state key "{key}". - [DF0049: Connector Call Requires Port and Tool](https://devfra.me/raw/errors/DF0049.md): The devframe_connect_call-tool tool requires { port: number, tool: string }. - [DF0050: No Devframe Instance on Port](https://devfra.me/raw/errors/DF0050.md): No running devframe instance on port {port}. - [DF0051: Instance Has No MCP Endpoint](https://devfra.me/raw/errors/DF0051.md): The devframe instance on port {port} has no MCP endpoint. - [DF0052: HTTP Server Failed to Listen](https://devfra.me/raw/errors/DF0052.md): Failed to listen on {host}:{port}: {reason} - [DF0054: connectionMeta() Before Instance Ready](https://devfra.me/raw/errors/DF0054.md): connectionMeta() was called before initDevframe("{id}") finished initializing. - [DF0055: Instance Already Owns Its WebSocket Transport](https://devfra.me/raw/errors/DF0055.md): This instance already owns its WebSocket transport ({tier}), so it cannot take over the host's upgrade events. - [DF0056: Instance Advertises an External WebSocket Endpoint](https://devfra.me/raw/errors/DF0056.md): This instance advertises an external WebSocket endpoint ({url}), so it serves no socket of its own. - [DF0057: WebSocket Transport Disabled](https://devfra.me/raw/errors/DF0057.md): This instance disables its WebSocket transport (ws: false), so there is no socket to drive upgrades into. - [DF0058: Dev Server Disabled By The Definition](https://devfra.me/raw/errors/DF0058.md): "{id}" declares capabilities.dev: false; it does not support a live dev server (its value is a static export only). - [DF0059: Remote Assets File Listing Failed](https://devfra.me/raw/errors/DF0059.md): Failed to fetch the file listing for "{package}@{version}" from {provider}: {reason} - [DF0060: Remote Asset Fetch Failed](https://devfra.me/raw/errors/DF0060.md): Failed to fetch a remote asset of "{package}" ({url}): {reason} - [DF0061: Installed Assets Package Major Version Mismatch](https://devfra.me/raw/errors/DF0061.md): The locally installed "{package}@{installed}" is a different major version than the required "{required}". - [DF0062: Installed Assets Package Version Skew](https://devfra.me/raw/errors/DF0062.md): The locally installed "{package}@{installed}" differs from the required "{required}"; serving the installed one. - [DF0063: Remote Asset Cache Write Failed](https://devfra.me/raw/errors/DF0063.md): Failed to persist a remote asset into the cache at "{filepath}": {reason} - [DF0064: Remote Assets Materialization Failed](https://devfra.me/raw/errors/DF0064.md): Failed to materialize the remote assets of "{package}@{version}": {reason} - [DF0065: Invalid Remote Assets Package Or Version](https://devfra.me/raw/errors/DF0065.md): Invalid remote-assets {field} "{value}". - [DF0066: Service Already Installed](https://devfra.me/raw/errors/DF0066.md): Service "{package}" is already installed; keeping the first installation and ignoring this one's options. - [DF0067: Required Service Package Not Importable](https://devfra.me/raw/errors/DF0067.md): Failed to import the required service package "{package}": {reason} - [DF0068: Required Service Version Range Not Satisfied](https://devfra.me/raw/errors/DF0068.md): The installed service "{package}@{installed}" does not satisfy the required range "{required}". - [DF0069: Service Version Range Not Satisfied](https://devfra.me/raw/errors/DF0069.md): The installed service "{package}@{installed}" does not satisfy the declared range "{required}"; installing it anyway. - [DF0070: Invalid Service](https://devfra.me/raw/errors/DF0070.md): Invalid service "{package}": {reason} - [DF0072: Snapshot Names Unknown RPC Method](https://devfra.me/raw/errors/DF0072.md): rpc.snapshot names "{method}", but no RPC function is registered under that id, so there is nothing to bake into the static build. - [DF0073: JSON-Render Spec Does Not Match Its Schema](https://devfra.me/raw/errors/DF0073.md): JSON-render view "{id}" does not match its configured schema: {issues} - [DF0074: JSON-Render Schema Is Asynchronous](https://devfra.me/raw/errors/DF0074.md): JSON-render view "{id}" uses an asynchronous Standard Schema. - [DF0075: No RPC Transport On This Runtime](https://devfra.me/raw/errors/DF0075.md): On Bun/Deno a shared server needs crossws Node adapter and SSE is disabled, so no RPC transport is advertised. - [DF0076: WebSocket Upgrade Unsupported On This Runtime](https://devfra.me/raw/errors/DF0076.md): attach / handleUpgrade drive a raw node:http upgrade into crossws Node adapter, which refuses to run on Bun/Deno. - [DF0077: In-Page Channel Function Not Registered](https://devfra.me/raw/errors/DF0077.md): An in-page channel call names a function that is not registered on its endpoint. - [DF8000: Devframe Id Collides With a Reserved Hub Path](https://devfra.me/raw/errors/DF8000.md): Devframe id "{id}" collides with a reserved hub path; it cannot be mounted directly under the hub base. - [DF8002: Both devframes and context Passed to initHub/buildHub](https://devfra.me/raw/errors/DF8002.md): initHub/buildHub received both devframes and context; the two assembly modes are mutually exclusive. - [DF8003: connectionMeta() Before Hub Instance Ready](https://devfra.me/raw/errors/DF8003.md): connectionMeta() was called before initHub finished initializing. - [DF8004: Devframe Id Is Not a Mountable URL Segment](https://devfra.me/raw/errors/DF8004.md): Devframe id "{id}" is not a mountable URL segment; the hub mounts each frame at /. - [DF8005: Devframe MCP Ignored While Hub MCP Is Off](https://devfra.me/raw/errors/DF8005.md): Devframe "{id}" requests an MCP route, but the hub's aggregate MCP is off (`mcp: false`), so its tools are not exposed over MCP. - [DF8006: Static Build Mount Base Is Not Absolute](https://devfra.me/raw/errors/DF8006.md): A static hub build writes each mount either under its base ("{base}") or as an absolute-path sibling of it, but "{urlBase}" is neither. - [DF8100: Dock Already Registered](https://devfra.me/raw/errors/DF8100.md): Dock with id "{id}" is already registered - [DF8101: Cannot Change Dock Id](https://devfra.me/raw/errors/DF8101.md): Cannot change the id of dock "{id}" to "{attempted}". Dock ids are immutable once registered - [DF8102: Dock Not Registered](https://devfra.me/raw/errors/DF8102.md): Dock with id "{id}" is not registered and cannot be updated - [DF8103: Dock Entry Cannot Group Itself](https://devfra.me/raw/errors/DF8103.md): Dock entry "{id}" cannot set groupId to its own id - [DF8104: Nested Dock Groups Unsupported](https://devfra.me/raw/errors/DF8104.md): Dock group "{id}" cannot itself belong to a group (nested groups are unsupported) - [DF8105: Devframe Already Mounted](https://devfra.me/raw/errors/DF8105.md): Devframe "{name}" (id "{id}") is already mounted on this hub - [DF8106: Connection Meta Not Served](https://devfra.me/raw/errors/DF8106.md): The host cannot serve the RPC connection meta for devframe "{name}" (id "{id}") at "{base}"; its DevframeHost does not implement mountConnectionMeta. - [DF8107: Unknown Dock Activation Target](https://devfra.me/raw/errors/DF8107.md): Dock activation requested for unknown dock id "{id}" - [DF8108: Duplicate Renderer Module Type](https://devfra.me/raw/errors/DF8108.md): A renderer module is already registered for dock type "{type}" - [DF8109: Renderer Module File Missing](https://devfra.me/raw/errors/DF8109.md): The renderer module registered for dock type "{type}" does not exist at "{file}" - [DF8110: Renderer Type Is Not URL-Safe](https://devfra.me/raw/errors/DF8110.md): Dock type "{type}" is not a servable renderer-module name; the hub serves each module at __renderers/.mjs - [DF8111: Bare-Specifier Client Script Without Host Resolution](https://devfra.me/raw/errors/DF8111.md): Dock "{id}" declares the bare-specifier client script "{specifier}", but this host advertises no client-module resolution; the browser cannot resolve a bare npm specifier natively, so the script will fail to load. - [DF8200: Terminal Session Already Registered](https://devfra.me/raw/errors/DF8200.md): Terminal session with id "{id}" already registered - [DF8201: Terminal Session Not Registered](https://devfra.me/raw/errors/DF8201.md): Terminal session with id "{id}" not registered - [DF8202: Terminal Session Does Not Accept Input](https://devfra.me/raw/errors/DF8202.md): Terminal session "{id}" does not accept input - [DF8203: Failed To Spawn PTY Session](https://devfra.me/raw/errors/DF8203.md): Failed to spawn PTY session for "{command}": {reason} - [DF8204: Terminal Session Cannot Be Controlled](https://devfra.me/raw/errors/DF8204.md): Terminal session "{id}" cannot be controlled (no lifecycle handle) - [DF8205: Terminal Session Is Not Restartable](https://devfra.me/raw/errors/DF8205.md): Terminal session "{id}" is not restartable - [DF8206: Terminal Session Restart on Closed Stream](https://devfra.me/raw/errors/DF8206.md): Terminal session "{id}" cannot be restarted; its output stream is already closed - [DF8400: Command Already Registered](https://devfra.me/raw/errors/DF8400.md): Command "{id}" is already registered - [DF8401: Cannot Change Command Id](https://devfra.me/raw/errors/DF8401.md): Cannot change the id of a command. Use register() to add new commands - [DF8402: Command Not Registered](https://devfra.me/raw/errors/DF8402.md): Command "{id}" is not registered - [DF8403: Duplicate Command Id](https://devfra.me/raw/errors/DF8403.md): Command id "{id}" is already used by another command or child command - [DF8404: Agent Exposure Without Handler](https://devfra.me/raw/errors/DF8404.md): Command "{id}" declares agent exposure but has no handler ## Migrations - [Migrations](https://devfra.me/raw/migrations.md) - [Migrations](https://devfra.me/raw/migrations.md): Version-by-version upgrade guides for devframe and @devframes/hub. Each release below has a drop-in path from the previous one. - [Migrating to 0.9](https://devfra.me/raw/migrations/migration-0.9.md): 0.9 removes the compatibility shims deprecated across the 0.7 series, trims the public API of devframe and @devframes/hub, and moves the MCP surface to the stateless MCP 2026-07-28 protocol. - [Migrating to 0.8](https://devfra.me/raw/migrations/migration-0.8.md): 0.8 makes RPC schemas validator-neutral and runtime-validated, upgrades the MCP adapter to @modelcontextprotocol/sdk v2, and adds the agent-native MCP API. See the v0.8.0 release notes. - [Migrating to 0.7](https://devfra.me/raw/migrations/migration-0.7.md): 0.7 makes cac an optional peer and moves json-render out of @devframes/hub into an opt-in package. - [Migrating to 0.6](https://devfra.me/raw/migrations/migration-0.6.md): 0.6 tightens defineDevframe's metadata, replaces terminal and WebSocket transports, and adds enforced auth. ## References - [References](https://devfra.me/raw/references.md) - [References](https://devfra.me/raw/references.md): Lookup pages the guides link into: the canonical terms, the when-clause contexts, every event name on the wire, the API tables for the node side, the browser side, and the hub. - [Terms](https://devfra.me/raw/references/terms.md): The canonical vocabulary of these docs: one name per concept, the API or package that anchors it, and how the pieces talk to each other. - [When Clauses](https://devfra.me/raw/references/when-clauses.md): When clauses gate visibility and executability of docks, commands, and custom UI via VS Code's when-clause contexts. The evaluator whenexpr re-exports at devframe/utils/when. - [Events Reference](https://devfra.me/raw/references/events.md): Devframe carries change notifications through client contexts, node event buses, RPC, broadcasts, and shared state. - [Node-Side API](https://devfra.me/raw/references/node-api.md): Lookup tables for the node side: DevframeDefinition fields, CLI options, storage scopes, RPC function types, broadcast options, streaming lifecycle, remote assets, the cross-devframe services surface, diagnostics prefixes, and the auth surface. - [Browser-Side API](https://devfra.me/raw/references/browser-api.md): Lookup tables for the browser side: connectDevframe options, RPC client events, connection statuses, and in-page channels error codes. - [Hub API](https://devfra.me/raw/references/hub-api.md): Lookup tables for the hub: subsystems, launcher fields, duplication strategies, dock categories, the hub UI protocol, the namespace routes, the client runtime, the client context, and dock entry types. - [Utilities](https://devfra.me/raw/references/utilities.md): Small, stable helpers under devframe/utils/*, bundled in, no npm install. - [Interactive Auth](https://devfra.me/raw/references/interactive-auth.md): An OTP auth layer over devframe's node-side primitives (exchangeTempAuthCode / verifyAuthToken / revokeAuthToken), so a host framework needn't re-implement the protocol. ## Blog - [Pluggable, Extensible, and Playful DevTools](https://devfra.me/raw/posts/pluggable-extensible-playful-devtools.md): Why DevTools should be portable devframes: one definition, many host frameworks, and shared interfaces for people and coding agents.