Skip to content

Commit fdb3193

Browse files
antfuclaude
andauthored
refactor(devframe)!: relocate json-render from devframe to devtools-kit (#327)
JSON-render is a hub-layer concern: the spec is rendered by the Vite DevTools component catalog, the renderer handle is only consumable via a `DevToolsViewJsonRender` dock entry (kit type), and every example pairs `createJsonRenderer` with `ctx.docks.register({ type: 'json-render', ui })`. Move types, factory, and `defineJsonRenderSpec` to `@vitejs/devtools-kit` so the API lives in the package that owns the runtime contract; `DevToolsNodeContext` is now framework-neutral as intended. BREAKING: `ctx.createJsonRenderer` is no longer on `DevToolsNodeContext`; use `KitNodeContext` (passed to `Plugin.devtools.setup` and `createPluginFromDevframe`'s `options.setup`). All in-repo consumers already run under kit. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent cd7d0f9 commit fdb3193

15 files changed

Lines changed: 43 additions & 65 deletions

File tree

AGENTS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ flowchart TD
4949

5050
## Architecture
5151

52-
- **Devframe context** (`devframe/packages/devframe/src/node/context.ts`): `createHostContext` returns a `DevToolsNodeContext` carrying `rpc`, `views` (HTTP file-serving via `hostStatic`), `diagnostics`, `agent`, plus `cwd`/`workspaceRoot`/`mode`/`host`/`createJsonRenderer`. No docks, no terminals.
53-
- **Kit context** (`packages/kit/src/node/context.ts`): `createKitContext` wraps `createHostContext` and attaches the four hub hosts — `docks`, `terminals`, `messages`, `commands`. Optionally surfaces `viteConfig`/`viteServer` when mounted inside Vite DevTools. Wires the `'devframe:docks'` / `'devframe:commands'` shared-state sync.
52+
- **Devframe context** (`devframe/packages/devframe/src/node/context.ts`): `createHostContext` returns a `DevToolsNodeContext` carrying `rpc`, `views` (HTTP file-serving via `hostStatic`), `diagnostics`, `agent`, plus `cwd`/`workspaceRoot`/`mode`/`host`. No docks, no terminals, no json-render.
53+
- **Kit context** (`packages/kit/src/node/context.ts`): `createKitContext` wraps `createHostContext` and attaches the four hub hosts — `docks`, `terminals`, `messages`, `commands` — plus the `createJsonRenderer` factory. Optionally surfaces `viteConfig`/`viteServer` when mounted inside Vite DevTools. Wires the `'devframe:docks'` / `'devframe:commands'` shared-state sync.
5454
- **Bridge** (`packages/kit/src/node/create-plugin-from-devframe.ts`): `createPluginFromDevframe(d, opts?)` returns `PluginWithDevTools`; in its `setup`, mounts the SPA via `views.hostStatic`, auto-registers an iframe dock entry from `id`/`name`/`icon`/`basePath`, runs `d.setup(ctx)` for the devframe-level wiring, then runs `opts.setup?.(ctx)` for kit-only extensions.
5555
- **Vite DevTools entry** (`packages/core/src/node/context.ts`): `createDevToolsContext` calls `createKitContext`, registers Vite-specific commands (`vite:open-in-editor`, `vite:open-in-finder`), then scans Vite plugins for `.devtools.setup` hooks (which now receive the kit-augmented context).
5656
- **Client context**: webcomponents/Nuxt UI state (`packages/core/src/client/webcomponents/state/*`) — dock entries, panels, RPC client. Two modes: `embedded` (overlay in host app) and `standalone` (independent page).

devframe/docs/guide/devtool-definition.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,10 @@ interface DevToolsNodeContext {
8181
views: DevToolsViewHost // static file hosting (`hostStatic`)
8282
diagnostics: DevToolsDiagnosticsHost
8383
agent: DevToolsAgentHost // experimental
84-
85-
createJsonRenderer: (spec) => JsonRenderer
8684
}
8785
```
8886

89-
Hub-level subsystems — `docks`, `terminals`, `messages`, `commands` — live on the kit-augmented context owned by `@vitejs/devtools-kit`. A devframe app that wants to register kit-only behavior does so through the optional `setup` hook on `createPluginFromDevframe`.
87+
Hub-level subsystems — `docks`, `terminals`, `messages`, `commands`, `createJsonRenderer` — live on the kit-augmented context owned by `@vitejs/devtools-kit`. A devframe app that wants to register kit-only behavior does so through the optional `setup` hook on `createPluginFromDevframe`.
9088

9189
Each host has a dedicated page:
9290
- [RPC](./rpc)`ctx.rpc`
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
import type { DevToolsNodeContext, JsonRenderSpec } from 'devframe/types'
1+
import type { DevToolsNodeContext } from 'devframe/types'
22
import { createDefineWrapperWithContext } from 'devframe/rpc'
33

44
export const defineRpcFunction = createDefineWrapperWithContext<DevToolsNodeContext>()
5-
6-
export function defineJsonRenderSpec(spec: JsonRenderSpec): JsonRenderSpec {
7-
return spec
8-
}

devframe/packages/devframe/src/node/context.ts

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { RpcFunctionDefinitionAny } from 'devframe/rpc'
2-
import type { DevToolsHost, DevToolsNodeContext, JsonRenderer, JsonRenderSpec } from 'devframe/types'
2+
import type { DevToolsHost, DevToolsNodeContext } from 'devframe/types'
33
import { diagnostics as rpcDiagnostics } from '../rpc/diagnostics'
44
import { diagnostics as devframeDiagnostics } from './diagnostics'
55
import { DevToolsAgentHost } from './host-agent'
@@ -24,8 +24,8 @@ export interface CreateHostContextOptions {
2424
/**
2525
* Framework-neutral core of the DevTools node context. Wires the RPC
2626
* host, view (HTTP file-serving) host, diagnostics, and agent
27-
* subsystems plus the JSON-render factory. Hub-level subsystems
28-
* (`docks`, `terminals`, `messages`, `commands`) are owned by
27+
* subsystems. Hub-level subsystems (`docks`, `terminals`, `messages`,
28+
* `commands`, `createJsonRenderer`) are owned by
2929
* `@vitejs/devtools-kit` — its `createKitContext` wraps this and
3030
* attaches them when the devtool is mounted into a multi-integration
3131
* hub.
@@ -42,7 +42,6 @@ export async function createHostContext(options: CreateHostContextOptions): Prom
4242
views: undefined!,
4343
diagnostics: undefined!,
4444
agent: undefined!,
45-
createJsonRenderer: undefined!,
4645
} as unknown as DevToolsNodeContext
4746

4847
const rpcHost = new RpcFunctionsHost(context)
@@ -58,28 +57,6 @@ export async function createHostContext(options: CreateHostContextOptions): Prom
5857
const agentHost = new DevToolsAgentHost(context)
5958
context.agent = agentHost
6059

61-
let jrCounter = 0
62-
context.createJsonRenderer = (initialSpec: JsonRenderSpec): JsonRenderer => {
63-
const stateKey = `devframe:json-render:${jrCounter++}`
64-
const statePromise = rpcHost.sharedState.get(stateKey as any, {
65-
initialValue: initialSpec as any,
66-
})
67-
68-
return {
69-
_stateKey: stateKey,
70-
async updateSpec(spec) {
71-
const state = await statePromise
72-
state.mutate(() => spec as any)
73-
},
74-
async updateState(newState) {
75-
const state = await statePromise
76-
state.mutate((draft: any) => {
77-
draft.state = { ...draft.state, ...newState }
78-
})
79-
},
80-
}
81-
}
82-
8360
// Auto-register devframe's own agent introspection RPCs. These power
8461
// the MCP adapter and any future agent CLI. They are not themselves
8562
// agent-exposed (no `agent` field).

devframe/packages/devframe/src/types/context.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { DevToolsAgentHost } from './agent'
22
import type { DevToolsDiagnosticsHost } from './diagnostics'
33
import type { DevToolsHost } from './host'
4-
import type { JsonRenderer, JsonRenderSpec } from './json-render'
54
import type { DevToolsViewHost } from './views'
65

76
export interface DevToolsCapabilities {
@@ -52,10 +51,6 @@ export interface DevToolsNodeContext {
5251
* @experimental
5352
*/
5453
agent: DevToolsAgentHost
55-
/**
56-
* Create a JsonRenderer handle for building json-render powered UIs.
57-
*/
58-
createJsonRenderer: (spec: JsonRenderSpec) => JsonRenderer
5954
}
6055

6156
export interface ConnectionMeta {

devframe/packages/devframe/src/types/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ export * from './devtool'
44
export * from './diagnostics'
55
export * from './events'
66
export * from './host'
7-
export * from './json-render'
87
export * from './rpc'
98
export * from './rpc-augments'
109
export * from './utils'

devframe/skills/devframe/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ See `templates/counter-devtool.ts` for a runnable counter example, `templates/sp
8686
| `ctx.host` | Runtime abstraction — `mountStatic`, `resolveOrigin`, `getStorageDir` |
8787
| `ctx.mode` | `'dev'` or `'build'` — gate setup work per runtime |
8888

89-
> Hub-only hosts (`ctx.docks`, `ctx.terminals`, `ctx.messages`, `ctx.commands`) only exist when the devtool is mounted into Vite DevTools via `createPluginFromDevframe`. See the [`vite-devtools-kit` skill](../../skills/vite-devtools-kit) for those.
89+
> Hub-only hosts (`ctx.docks`, `ctx.terminals`, `ctx.messages`, `ctx.commands`, `ctx.createJsonRenderer`) only exist when the devtool is mounted into Vite DevTools via `createPluginFromDevframe`. See the [`vite-devtools-kit` skill](../../skills/vite-devtools-kit) for those.
9090
9191
## RPC contracts
9292

devframe/tests/__snapshots__/tsnapi/devframe/index.snapshot.d.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
/**
22
* Generated by tsnapi — public API snapshot of `devframe`
33
*/
4-
// #region Functions
5-
export declare function defineJsonRenderSpec(_: JsonRenderSpec): JsonRenderSpec;
6-
// #endregion
7-
84
// #region Variables
95
export declare const defineRpcFunction: <NAME extends string, TYPE extends RpcFunctionType, ARGS extends any[], RETURN = void, const AS extends RpcArgsSchema | undefined = undefined, const RS extends RpcReturnSchema | undefined = undefined>(definition: RpcFunctionDefinition<NAME, TYPE, ARGS, RETURN, AS, RS, DevToolsNodeContext>) => RpcFunctionDefinition<NAME, TYPE, ARGS, RETURN, AS, RS, DevToolsNodeContext>;
106
// #endregion
@@ -44,9 +40,6 @@ export { EntriesToObject }
4440
export { EventEmitter }
4541
export { EventsMap }
4642
export { EventUnsubscribe }
47-
export { JsonRenderElement }
48-
export { JsonRenderer }
49-
export { JsonRenderSpec }
5043
export { PartialWithoutId }
5144
export { RpcBroadcastOptions }
5245
export { RpcFunctionAgentOptions }
Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
/**
22
* Generated by tsnapi — public API snapshot of `devframe`
33
*/
4-
// #region Functions
5-
export function defineJsonRenderSpec(_) {}
6-
// #endregion
7-
84
// #region Variables
95
export var defineRpcFunction /* const */
106
// #endregion

devframe/tests/__snapshots__/tsnapi/devframe/types.snapshot.d.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ export { EntriesToObject }
3636
export { EventEmitter }
3737
export { EventsMap }
3838
export { EventUnsubscribe }
39-
export { JsonRenderElement }
40-
export { JsonRenderer }
41-
export { JsonRenderSpec }
4239
export { PartialWithoutId }
4340
export { RpcBroadcastOptions }
4441
export { RpcFunctionAgentOptions }

0 commit comments

Comments
 (0)