К основному содержанию
скилл Claude Code CX Codex Cursor GitHub Copilot

devtools — скилл для Claude Code: инспектор json-render

Панель отладки для json-render: дерево компонентов, редактор состояния, лог действий, стриминг патчей и пикер элементов.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add vercel-labs/json-render --skill devtools -a claude-code
Открыть на GitHub

Что делает devtools

Скилл добавляет плавающую панель инспектора в любое json-render-приложение. Пять вкладок: дерево спецификации с пропсами и событиями, редактор состояния по JSON Pointer, таймлайн действий с длительностью и ошибками, стрим патчей и токенов от ИИ, каталог компонентов. Пикер элементов в тулбаре — кликаешь на страницу, панель прыгает к ключу компонента.

Работает с React, Vue, Svelte и Solid через адаптеры. Ставишь ядро плюс адаптер фреймворка, кидаешь <JsonRenderDevtools /> внутрь <JSONUIProvider> — никакой дополнительной обвязки. В продакшене панель не рендерится, если process.env.NODE_ENV === "production". Открывается по Cmd+Shift+J, стыкуется снизу или справа, одна панель может инспектировать несколько <Renderer /> на странице.

Требует json-render-приложение и установленный адаптер для фреймворка проекта.

Какие задачи решает

  • инспектировать дерево спецификации json-render в рантайме
  • редактировать состояние компонентов без правки кода
  • отследить dispatched-действия с таймингом и ошибками
  • следить за патчами спецификации от стриминга ИИ
  • найти ключ спецификации элемента на странице

Примеры запросов агенту

  • добавь devtools в проект
  • покажи дерево компонентов json-render
  • почему этот элемент не рендерится

Как установить devtools

1Через Skills CLI (Vercel)

npx skills add vercel-labs/json-render --skill devtools -a claude-code

2Вручную: положить файлы

~/.claude/skills/devtools/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/devtools/

Из того же набора20

Весь набор →
react vercel-labs Скилл помогает собирать React-интерфейсы из JSON-спецификаций через json-render. Нужен для каталогов компонентов и UI, который создаёт ИИ. Claude Code CX Codex Cursor +1 16 300установок core vercel-labs Описывает схему и каталог компонентов для json-render и собирает системный промпт, по которому ИИ выдаёт JSON-спеки интерфейсов. Claude Code CX Codex Cursor +1 15 000установок codegen vercel-labs Утилиты для генерации кода из json-render UI-деревьев. Помогает строить кастомные экспортеры кода для Next.js, Remix и других фреймворков, обходить спеки и сериализовать пропсы. Claude Code CX Codex Cursor +1 8 900установок next vercel-labs Генерирует многостраничные приложения Next.js из спецификаций JSON. Пригодится при сборке SSR-сайтов, маршрутов и макетов через @json-render/next. Claude Code CX Codex Cursor +1 8 600установок directives vercel-labs Готовые директивы для json-render: форматирование, математика, строки, i18n. Подключаются в каталог и рендерер за пару строк. Claude Code CX Codex Cursor +1 8 000установок mcp vercel-labs Скилл помогает собирать MCP-серверы с интерактивными json-render UI для Claude, ChatGPT, Cursor и VS Code. Claude Code CX Codex Cursor +1 5 800установок react-native vercel-labs Скилл помогает собирать нативные React Native-интерфейсы из JSON-спецификаций. Пригодится для мобильных UI с состоянием, условиями видимости и действиями. Claude Code CX Codex Cursor +1 3 200установок remotion-best-practices vercel-labs Скилл подсказывает агенту, как работать с Remotion в React: от анимации и звука до композиций и параметров видео. Пригодится, когда агент пишет или меняет код Remotion. Claude Code CX Codex Cursor +1 1 500установок

Похожие

react-best-practices mastra-ai 27 правил производительности и качества React-кода, упорядоченных по приоритету: от устранения водопадов запросов до типизации. Claude Code CX Codex Cursor +1 2 800установок react-native-design Seth Hobson Скилл помогает собирать React Native-приложения со стилями, навигацией и анимациями Reanimated. Пригодится для кроссплатформенной мобильной разработки. Claude Code CX Codex Cursor 15 522установок angular-developer Copyright 2026 Google LLC Генерирует Angular-код и подсказывает архитектурные решения для компонентов, сервисов, форм, маршрутизации и HTTP. Пригодится для новых и существующих проектов. Claude Code CX Codex Cursor +1 45 900установок react-state-management Seth Hobson Помогает выбрать и настроить управление состоянием в React: локальное, глобальное, серверное, URL и состояние форм. Claude Code CX Codex Cursor 15 286установок chakra-ui-migrate chakra-ui Скилл ведёт миграцию проекта с Chakra UI v2 на v3 по шагам. Он помогает удалить старые пакеты, запустить официальный кодемод, обновить провайдер и переписать устаревшие пропсы. Claude Code CX Codex Cursor +1 1 800установок react-native-architecture Seth Hobson Скилл для Claude Code, Codex и Cursor: подсказывает структуру проекта, навигацию, нативные модули и офлайн-синхронизацию в React Native на Expo. Claude Code CX Codex Cursor 15 087установок frontend-design официальный anthropics Скилл задаёт осмысленное визуальное направление для новых интерфейсов и редизайна. Подойдёт, когда стандартный шаблонный UI не устраивает. Claude Code Claude.ai 1 025 790установок design-taste-frontend Leonxlnx Скилл задаёт арт-дирекцию для публичных страниц и рабочих экранов, а затем проверяет результат в браузере по скриншотам. Нужен, когда интерфейс выглядит шаблонным или недоработанным. Claude Code CX Codex Cursor +1 673 100установок

Вопросы о devtools

Как установить devtools в Claude Code?

Выполни npx skills add vercel-labs/json-render --skill devtools -a claude-code, скилл появится в ~/.claude/skills/devtools/SKILL.md.

Что делает devtools?

Панель инспектора для json-render-приложений: дерево компонентов, редактор состояния, лог действий, стрим патчей и пикер элементов.

Какие фреймворки поддерживает devtools?

React, Vue, Svelte и Solid через отдельные адаптеры — ставишь @json-render/devtools плюс @json-render/devtools-react (или -vue, -svelte, -solid).

Исходный текст

SKILL.md · Apache-2.0
---
name: devtools
description: Drop-in inspector panel for any json-render app. Use when the user wants to debug a generative UI, inspect the spec tree, edit state at runtime, see dispatched actions, follow stream patches live, browse a catalog, or pick DOM elements to find their spec keys. Triggers include "add devtools", "debug json-render", "inspect the spec", "why is this element not rendering", "see the state at runtime", or requests to tap streams / capture action logs for `@json-render/devtools`.
---

# @json-render/devtools

A floating inspector panel for json-render apps. Framework-agnostic core + per-framework adapters (React, Vue, Svelte, Solid).

Production-safe: the component renders no devtools UI when `process.env.NODE_ENV === "production"`, including when a bundler replaces the expression in a browser without a `process` global. Unbundled environments without `process.env` retain development behavior.

## Install

Install the core package plus the adapter that matches the host app's renderer.

```bash
# React
npm install @json-render/devtools @json-render/devtools-react

# Vue
npm install @json-render/devtools @json-render/devtools-vue

# Svelte
npm install @json-render/devtools @json-render/devtools-svelte

# Solid
npm install @json-render/devtools @json-render/devtools-solid
```

## Drop-in usage

Place `<JsonRenderDevtools />` anywhere inside the existing `<JSONUIProvider>` (or framework equivalent). No other wiring required.

### React

```tsx
import { JsonRenderDevtools } from "@json-render/devtools-react";

<JSONUIProvider registry={registry} handlers={handlers}>
  <Renderer spec={spec} registry={registry} />
  <JsonRenderDevtools spec={spec} catalog={catalog} messages={messages} />
</JSONUIProvider>;
```

### Vue

```vue
<script setup>
import { JsonRenderDevtools } from "@json-render/devtools-vue";
</script>

<template>
  <JSONUIProvider :registry="registry">
    <Renderer :spec="spec" :registry="registry" />
    <JsonRenderDevtools :spec="spec" :catalog="catalog" :messages="messages" />
  </JSONUIProvider>
</template>
```

### Svelte

```svelte
<script>
  import { JsonRenderDevtools } from "@json-render/devtools-svelte";
</script>

<JSONUIProvider {registry}>
  <Renderer {spec} {registry} />
  <JsonRenderDevtools {spec} {catalog} {messages} />
</JSONUIProvider>
```

### Solid

```tsx
import { JsonRenderDevtools } from "@json-render/devtools-solid";

<JSONUIProvider registry={registry}>
  <Renderer spec={spec()} registry={registry} />
  <JsonRenderDevtools
    spec={spec()}
    catalog={catalog}
    messages={messages()}
  />
</JSONUIProvider>;
```

## Controls

- Floating toggle appears bottom-right.
- Hotkey: `Ctrl`/`Cmd` + `Shift` + `J` (configurable via `hotkey` prop).
- Drawer is resizable; height persists to localStorage.

## Props

- `spec` (`Spec | null`) — current spec.
- `catalog` (`Catalog | null`) — catalog definition; required for the Catalog panel.
- `messages` (`UIMessage[]`) — AI SDK `useChat` messages; scanned for spec data parts.
- `initialOpen` (`boolean`) — start open.
- `position` (`"bottom-right" | "bottom-left" | "right"`) — dock + toggle corner. `"bottom-*"` docks at the bottom; `"right"` docks at the right edge full-height (recommended for app-shells that already use `100vh` or fixed bottom bars).
- `hotkey` (`string | false`) — `"mod+shift+j"` by default.
- `bufferSize` (`number`) — event ring-buffer cap, default 500.
- `reserveSpace` (`boolean`, default `true`) — when true the panel pushes the host app by applying `padding-bottom` / `padding-right` on `body`. Set to `false` to keep the panel as a pure overlay.
- `allowDockToggle` (`boolean`, default `true`) — show a toolbar button so the user can flip the panel between bottom-dock and right-dock. User choice persists to `localStorage` and overrides `position` on subsequent mounts. Pass `false` to lock the dock to `position`.
- `onEvent` (`(DevtoolsEvent) => void`) — optional tap.

## Panels

- **Spec** — element tree rooted at `spec.root`; props/visibility/events/watchers detail; integrated `validateSpec` warnings.
- **State** — every JSON Pointer path with inline edit via `store.set`.
- **Actions** — dispatched actions timeline (name, params, result/error, duration).
- **Stream** — spec patches, text chunks, token usage, lifecycle markers grouped by generation.
- **Catalog** — components + actions declared in the catalog with prop chips.

## Picker (toolbar)

The element picker is a toolbar button in the panel header (Chrome-DevTools-style), not a tab. Click it to activate pick mode, then click any rendered element in the page — selection jumps to the Spec tab with that element focused. `Esc` cancels.

## Reserved space & docking

The panel can dock at the bottom or the right edge, and by default the user can flip between the two with a toolbar button (the choice persists to `localStorage`). Set `allowDockToggle={false}` if the host app only works with one dock — the button is hidden and the dock is locked to `position`.

Pick an initial dock that fits your layout:

- **Bottom dock (default)** — works best for docs / marketing / content-flow sites and for app shells built with a `height: 100%` chain (`html { height: 100% }` → `body { height: 100% }` → `.app { height: 100% }`). The panel writes its height to `--jr-devtools-offset-bottom` and applies matching `padding-bottom` to `body`, so non-fixed content naturally makes room.
- **Right dock** (`position="right"`) — recommended for app-shell layouts that use `100vh` or `position: fixed; bottom: 0`. Right docking sidesteps the bottom edge entirely and writes its width to `--jr-devtools-offset-right` instead.

Apps that use `100vh`, `position: fixed`, or `position: sticky` can opt specific elements in with the published CSS custom properties:

```css
.composer   { bottom: var(--jr-devtools-offset-bottom, 0); }
.sidebar    { right:  var(--jr-devtools-offset-right,  0); }
.app-shell  { height: calc(100vh - var(--jr-devtools-offset-bottom, 0)); }
```

If the automatic body padding causes problems with a particular layout, pass `reserveSpace={false}` to make the panel a pure overlay — the CSS custom properties are still published so you can reserve space manually.

(`--jr-devtools-offset` is kept as a back-compat alias for whichever edge is currently active.)

## Multiple renderers on one page (e.g. a chat)

A single `<JsonRenderDevtools />` can inspect many `<Renderer />` instances at once — a chat where each assistant message renders its own spec, a dashboard made of several independent widgets, etc. The recipe:

1. **One top-level `<JSONUIProvider>`** so every renderer shares one state store and one action dispatcher. Devtools lives inside this provider and sees everything through it.
2. **Per-renderer specs, shared state** — each assistant message renders `<Renderer spec={msgSpec} registry={registry} />` directly, not wrapped in its own `StateProvider`. State paths from different messages must not collide.
3. **Namespace state per turn** — when the source is an AI stream, hand the agent a unique `messageId` and require every element key (`<id>-root`) and state path (`/<id>/count`) to be prefixed with it.
4. **Pass `spec={latest}` + `messages={all}`** — `spec` drives the Spec panel (usually the newest assistant message's spec), while `messages` feeds the Stream panel with patches from every turn.
5. **Actions and the picker are already global** — `registerActionObserver` captures dispatches from any `ActionProvider` in the tree, and `data-jr-key` is written by the renderer itself, so Pick works across every rendered element regardless of which message produced it.

See `examples/devtools` for a full AI chat wired this way.

## Imperative API (React only)

```tsx
import { useJsonRenderDevtools } from "@json-render/devtools-react";

const devtools = useJsonRenderDevtools();
devtools?.open();
devtools?.toggle();
devtools?.recordEvent({ kind: "stream-text", at: Date.now(), text: "hi" });
```

Returns `null` in production or before the component mounts.

## Server-side stream tap

Capture spec patches at the API route so events persist server-side or flow into your own telemetry.

```ts
import { tapJsonRenderStream, createEventStore } from "@json-render/devtools";
import { pipeJsonRender } from "@json-render/core";

const events = createEventStore({ bufferSize: 1000 });
const tapped = tapJsonRenderStream(result.toUIMessageStream(), events);
writer.merge(pipeJsonRender(tapped));
```

YAML equivalent: `tapYamlStream`.

## Under the hood

- **Shadow-DOM isolated panel** — the panel's styles never leak into the host app and vice versa.
- **Ring-buffered event store** — capped log of devtools events (state changes, action dispatches, stream patches, etc.).
- **Action observer registry** — each framework's `ActionProvider` reports via `notifyActionDispatch` / `notifyActionSettle` in `@json-render/core`; devtools subscribes via `registerActionObserver`.
- **Picker element tagging** — while devtools is mounted, `ElementRenderer` wraps each rendered element in `<span data-jr-key="..." style="display:contents">` so the picker can map DOM → spec key. No layout impact.

© vercel-labs · Apache-2.0 · vercel-labs/json-render

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой