vue · vercel-labs — скилл для Claude Code: рендер Vue UI из JSON
Скилл для преобразования JSON-спецификаций в Vue 3 компоненты с привязкой данных, условиями видимости и обработкой действий. Нужен, если вы генерируете интерфейсы через ИИ или строите UI из JSON.
npx skills add vercel-labs/json-render --skill vue -a claude-codeЧто делает vue
vue — это renderer из библиотеки @json-render/vue, которая преобразует JSON-описания в живые Vue 3 компоненты. Вы определяете каталог (catalog) с типами компонентов, затем регистр (registry) с их реализацией через функции h(), а потом просто передаёте спецификацию в компонент Renderer.
В пакете уже встроена работа с состоянием через StateProvider, обработка действий через ActionProvider, условный рендер через VisibilityProvider и валидация форм. Есть composables для доступа к состоянию (useStateValue), привязке данных (useBoundProp), проверке видимости (useIsVisible). JSON-спец поддерживает динамические выражения: $state для чтения состояния, $bindState для двусторонней привязки, $cond для условий, $template для шаблонов.
При установке нужны peer-зависимости: vue ^3.5.0 и zod ^4.0.0 — убедитесь, что они уже в проекте.
Какие задачи решает
- генерировать Vue интерфейсы из JSON-спецификаций
- определить компоненты-каталог с типами props и slots
- связать состояние приложения с рендером компонентов
- добавить условный рендер и валидацию форм без ручного кода
Примеры запросов агенту
- Установи скилл vue и создай каталог компонентов с типами через `defineCatalog`
- Определи registry с Vue render-функциями и передай спецификацию в компонент `Renderer`
- Оборачи `Renderer` в `StateProvider` и `ActionProvider`, чтобы управлять состоянием и обработкой действий
Как установить vue
1Через Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill vue -a claude-code2Вручную: положить файлы
~/.claude/skills/vue/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/vue/
1Через Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill vue -a codex2Вручную: положить файлы
.agents/skills/vue/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill vue -a cursor2Вручную: положить файлы
.cursor/skills/vue/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install vercel-labs/json-render vue2Вручную: положить файлы
.github/skills/vue/SKILL.md1Через Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill vue -a gemini-cli2Командой платформы
gemini skills install https://github.com/vercel-labs/json-render --path skills/vueВручную: положить файлы
.devin/skills/vue/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add vercel-labs/json-render --skill vue -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Из того же набора20
Весь набор →Другие версии vue
Похожие
Вопросы о vue
Как установить vue скилл в Claude Code?
Выполни npx skills add vercel-labs/json-render --skill vue -a claude-code. Скилл будет доступен в ~/.claude/skills/vue/SKILL.md.
Что даёт vue скилл?
Позволяет рендерить Vue 3 компоненты из JSON-спецификаций с привязкой данных, условиями видимости и действиями. Полезно для ИИ-генерации интерфейсов.
Какие зависимости нужны для работы?
Нужны vue ^3.5.0 и zod ^4.0.0. Установи их в проект перед использованием скилла.
Исходный текст
SKILL.md · Apache-2.0
---
name: vue
description: Vue 3 renderer for json-render. Use when building Vue UIs from JSON specs, working with @json-render/vue, defining Vue component registries, or rendering AI-generated specs in Vue.
---
# @json-render/vue
Vue 3 renderer that converts JSON specs into Vue component trees with data binding, visibility, and actions.
## Installation
```bash
npm install @json-render/vue @json-render/core zod
```
Peer dependencies: `vue ^3.5.0` and `zod ^4.0.0`.
## Quick Start
### Create a Catalog
```typescript
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/vue/schema";
import { z } from "zod";
export const catalog = defineCatalog(schema, {
components: {
Card: {
props: z.object({ title: z.string(), description: z.string().nullable() }),
slots: ["default"],
description: "A card container",
},
Layout: {
props: z.object({}),
slots: ["default", "header", "footer"],
description: "Layout with named content regions",
},
Button: {
props: z.object({ label: z.string(), action: z.string() }),
description: "A clickable button",
},
},
actions: {},
});
```
### Define Registry with h() Render Functions
```typescript
import { h } from "vue";
import { defineRegistry } from "@json-render/vue";
import { catalog } from "./catalog";
export const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) =>
h("div", { class: "card" }, [
h("h3", null, props.title),
props.description ? h("p", null, props.description) : null,
children,
]),
Layout: ({ slots }) =>
h("div", null, [
h("header", null, slots.header?.()),
h("main", null, slots.default?.()),
h("footer", null, slots.footer?.()),
]),
Button: ({ props, emit }) =>
h("button", { onClick: () => emit("press") }, props.label),
},
});
```
## Named Slots
Use `children` for the `"default"` slot. Use the element's top-level `slots` object for other slot names declared by the catalog:
```json
{
"type": "Layout",
"props": {},
"children": ["main"],
"slots": {
"header": ["heading"],
"footer": ["actions"]
}
}
```
Registry components receive Vue-native slot functions. Render them with `slots.header?.()`, `slots.footer?.()`, and so on. `slots.default?.()` renders the spec's `children`; the `children` context field is a convenience alias for that rendered result. In the JSON spec, keep default content in `children` rather than adding a `default` entry to `slots`.
### Render Specs
```vue
<script setup lang="ts">
import { StateProvider, ActionProvider, Renderer } from "@json-render/vue";
import { registry } from "./registry";
const spec = { root: "card-1", elements: { /* ... */ } };
</script>
<template>
<StateProvider :initial-state="{ form: { name: '' } }">
<ActionProvider :handlers="{ submit: handleSubmit }">
<Renderer :spec="spec" :registry="registry" />
</ActionProvider>
</StateProvider>
</template>
```
## Providers
| Provider | Purpose |
|----------|---------|
| `StateProvider` | Share state across components (JSON Pointer paths). Accepts `initialState` or `store` for controlled mode. |
| `ActionProvider` | Handle actions dispatched via the event system |
| `VisibilityProvider` | Enable conditional rendering based on state |
| `ValidationProvider` | Form field validation |
## Composables
| Composable | Purpose |
|------------|---------|
| `useStateStore()` | Access state context (`state` as `ShallowRef`, `get`, `set`, `update`) |
| `useStateValue(path)` | Get single value from state |
| `useIsVisible(condition)` | Check if a visibility condition is met |
| `useActions()` | Access action context |
| `useAction(binding)` | Get a single action dispatch function |
| `useFieldValidation(path, config)` | Field validation state |
| `useBoundProp(propValue, bindingPath)` | Two-way binding for `$bindState`/`$bindItem` |
Note: `useStateStore().state` returns a `ShallowRef<StateModel>` — use `state.value` to access.
## External Store (StateStore)
Nested lists can set `repeat.statePath` to `{ "$item": "field" }` inside an enclosing repeat.
Pass a `StateStore` to `StateProvider` to wire json-render to Pinia, VueUse, or any state management:
```typescript
import { createStateStore, type StateStore } from "@json-render/vue";
const store = createStateStore({ count: 0 });
```
```vue
<StateProvider :store="store">
<Renderer :spec="spec" :registry="registry" />
</StateProvider>
```
## Dynamic Prop Expressions
Props support `$state`, `$bindState`, `$cond`, `$template`, `$computed`. Use `{ "$bindState": "/path" }` on the natural value prop for two-way binding.
## Visibility Conditions
```typescript
{ "$state": "/user/isAdmin" }
{ "$state": "/status", "eq": "active" }
{ "$state": "/maintenance", "not": true }
[ cond1, cond2 ] // implicit AND
```
## Built-in Actions
`setState`, `pushState`, `removeState`, and `validateForm` are built into the Vue schema and handled by `ActionProvider`:
```json
{
"action": "setState",
"params": { "statePath": "/activeTab", "value": "settings" }
}
```
## Event System
Components use `emit(event)` to fire events, or `on(event)` for metadata (`shouldPreventDefault`, `bound`).
## Streaming
`useUIStream` and `useChatUI` return Vue Refs for streaming specs from an API.
## BaseComponentProps
For catalog-agnostic reusable components:
```typescript
import type { BaseComponentProps } from "@json-render/vue";
const Card = ({ props, children }: BaseComponentProps<{ title?: string }>) =>
h("div", null, [props.title, children]);
```
## Key Exports
| Export | Purpose |
|--------|---------|
| `defineRegistry` | Create a type-safe component registry from a catalog |
| `Renderer` | Render a spec using a registry |
| `schema` | Element tree schema (from `@json-render/vue/schema`) |
| `StateProvider`, `ActionProvider`, `VisibilityProvider`, `ValidationProvider` | Context providers |
| `useStateStore`, `useStateValue`, `useBoundProp` | State composables |
| `useActions`, `useAction` | Action composables |
| `useFieldValidation`, `useIsVisible` | Validation and visibility |
| `useUIStream`, `useChatUI` | Streaming composables |
| `createStateStore` | Create in-memory `StateStore` |
| `BaseComponentProps` | Catalog-agnostic component props type |
© vercel-labs · Apache-2.0 · vercel-labs/json-render