diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..b1c06a4 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,52 @@ +name: release + +# Publishes @aestheticfunction/ds-mcp to npm when a version tag is pushed. +# Mirrors dspack-gen's release workflow (PHASE-NEXT WS0, task 0.5): with the +# pin-drift check in test.yml, a red check leads to a re-pin PR and the +# release is one merge plus one tag away. +# +# Auth: npm trusted publishing (OIDC) — no NPM_TOKEN secret in the repo. +# One-time setup on npmjs.com (package settings -> Trusted publisher): +# repository aestheticfunction/ds-mcp, workflow release.yml. +# Provenance attestations are generated automatically for trusted publishes. +# +# Guards: +# - tag must equal the package.json version (prevents accidental mismatches) +# - full test suite runs before publish (build is pretest, so the vendored +# core bundle published is the one the suite just validated) +# - publishing an already-published version fails the job (npm rejects dupes) + +on: + push: + tags: + - "v*" + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write # OIDC for npm trusted publishing / provenance + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + # Node 24 bundles npm >= 11.5, the minimum for OIDC trusted + # publishing. Node 20's npm 10 skips the token exchange entirely + # and the unauthenticated PUT fails as E404 (dspack-gen v0.1.1's + # first release run hit exactly this). + node-version: 24 + cache: npm + registry-url: https://registry.npmjs.org + - name: Verify tag matches package.json version + run: | + pkg="$(node -p "require('./package.json').version")" + tag="${GITHUB_REF_NAME#v}" + if [ "$pkg" != "$tag" ]; then + echo "tag v$tag does not match package.json version $pkg" >&2 + exit 1 + fi + - run: npm ci + - run: npm test + - name: Publish (public, with provenance) + run: npm publish --access public diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d714f4a..fff8757 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,3 +19,16 @@ jobs: - run: npm test - name: Copy drift check (dspack-gen#7) run: node scripts/check-sync.mjs + + core-pin-drift: + # Report-only posture: red means dspack-gen published a release whose + # src/core differs from the vendored-core pin — the fix is the re-pin + # ritual (README). API failures warn and pass; real drift fails. + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Vendored-core pin matches dspack-gen's latest release + run: node scripts/check-core-pin.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4521e40 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,39 @@ +# Changelog + +## 0.3.1 + +The vendored `@aestheticfunction/dspack-gen/core` bundle moves from commit +`f651433` to the v0.1.1 release tag (`374e1cd`), picking up the 0.1.1 +generation-schema fixes for grammar-constrained decoders: array-typed +contract props emit as arrays (with contract-declared `items` passthrough), +and node properties declare `component, id, props, text, children` in that +order. The published 0.3.0 served the pre-fix schema from +`get-generation-context`; a grammar-constrained decoder driven by that +schema could not emit node text after props and degraded array props to +strings. + +- Re-pin: `@aestheticfunction/dspack-gen` devDependency -> + `374e1cd` (the v0.1.1 tag commit), vendor bundle rebuilt. +- New golden-context test: `get-generation-context` output byte-compares + against dspack-gen's own compiler golden + (`fixtures/golden/context/shadcn.destructive-action.json`), synced as a + tracked byte copy in `scripts/check-sync.mjs`. Byte-level on purpose: + grammar-constrained decoders enforce property order, which deepEqual + cannot see. The test fails on the 0.3.0 bundle with the pre-fix + signature (`text` declared before `props`). +- New pin-drift CI check: `scripts/check-core-pin.mjs` compares the pinned + commit's shipped `src/core` files (blob-exact, via the git trees API) + against dspack-gen's latest release tag and fails loudly on drift. + Test files are excluded; GitHub API failures warn and pass (report-only + posture); real drift always fails. +- Release workflow: npm trusted publishing (OIDC) on version tags, + mirroring dspack-gen's. Requires one-time trusted-publisher registration + on npmjs.com. + +## 0.3.0 + +Baseline for this changelog. Self-contained npm package: dspack-gen's +`core` subpath bundled at build time (`dist/vendor/dspack-gen-core.js`) +from a commit-pinned devDependency; generation tools +(`get-generation-context`, `validate-ui`) backed by the bundle; network +boundary enforced by test. diff --git a/README.md b/README.md index d0b3615..024895c 100644 --- a/README.md +++ b/README.md @@ -154,8 +154,16 @@ the guarantee. dspack-gen is a **build-time** dependency: its `core` subpath is bundled into the published package (`dist/vendor/dspack-gen-core.js`) from a commit-pinned devDependency, so installing ds-mcp from npm pulls nothing -from git. Updating governance semantics means re-pinning that commit, -rebuilding, and republishing ds-mcp. +from git. The default posture is **tag-pinned**: the pin is the commit of +dspack-gen's latest release tag, so the vendored core corresponds exactly +to a published dspack-gen version. CI watches this two ways: +`scripts/check-core-pin.mjs` fails loudly when a newer dspack-gen release +changes shipped `src/core` files (test files are excluded — the documented +escape for intentional ahead-of-release pins), and the golden-context test +byte-compares `get-generation-context` output against dspack-gen's own +compiler golden. Updating governance semantics means re-pinning to the new +release tag commit, `npm install`, `npm run build`, verifying the golden +tests, and republishing ds-mcp. ## Requirements diff --git a/package-lock.json b/package-lock.json index 4d62687..9f6a429 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "ds-mcp": "dist/index.js" }, "devDependencies": { - "@aestheticfunction/dspack-gen": "git+https://github.com/aestheticfunction/dspack-gen.git#f6514330964ed7b62371e17eec4cdadaeeef9d52", + "@aestheticfunction/dspack-gen": "git+https://github.com/aestheticfunction/dspack-gen.git#374e1cd91f02701c0d4829ece0a79dd9b381f67b", "@types/minimist": "^1.2.5", "@types/node": "^20.0.0", "esbuild": "^0.25.0", @@ -29,9 +29,9 @@ } }, "node_modules/@aestheticfunction/dspack-emit": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.3.0.tgz", - "integrity": "sha512-TE3dhCDoMOzfNyponuq7oleYCS5smlWzCJLJ4iLpBjpaujhJIbMzi6WZDiaarToMlbjfhItxjmPZb3pTRzVMUQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@aestheticfunction/dspack-emit/-/dspack-emit-0.3.1.tgz", + "integrity": "sha512-0vCFP5rvWGoIPvnBlB3puXkhoJhEyq/FQHrfj3JfPwf37WfASZb5ZOK3tPzB8ZhZTFkxvhjrvHeEYgRDOGm04w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -40,18 +40,21 @@ } }, "node_modules/@aestheticfunction/dspack-gen": { - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/aestheticfunction/dspack-gen.git#f6514330964ed7b62371e17eec4cdadaeeef9d52", - "integrity": "sha512-I3s4RmNrQVunXAWICcT5/YxI9HExXnoDSIUObaklbuO2fK6JC30myoQTHEjK0KUGvRnxgaVuBJSvmVQgQtvz4A==", + "version": "0.1.1", + "resolved": "git+ssh://git@github.com/aestheticfunction/dspack-gen.git#374e1cd91f02701c0d4829ece0a79dd9b381f67b", + "integrity": "sha512-S3BP2oRstk8UaMx1xxQsBpCnVcC3J7RMLAqeqAN6U1ZYHPwQeGqB5w/cWjGRTKoBPgL0O8p2P5zupBZGPL5KGg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aestheticfunction/dspack-emit": "^0.3.0", + "@aestheticfunction/dspack-emit": "^0.3.1", "@anthropic-ai/sdk": "^0.109.1", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "undici": "^6.27.0" }, + "bin": { + "dspack-gen": "dist/cli.js" + }, "engines": { "node": ">=20.0.0" } diff --git a/package.json b/package.json index 38cade2..cc904b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@aestheticfunction/ds-mcp", - "version": "0.3.0", + "version": "0.3.1", "description": "MCP server for exposing dspack design system corpora to AI coding agents", "license": "Apache-2.0", "type": "module", @@ -14,6 +14,7 @@ "examples/", "docs/", "README.md", + "CHANGELOG.md", "LICENSE", "SECURITY.md" ], @@ -62,7 +63,7 @@ "zod": "^3.25 || ^4.0" }, "devDependencies": { - "@aestheticfunction/dspack-gen": "git+https://github.com/aestheticfunction/dspack-gen.git#f6514330964ed7b62371e17eec4cdadaeeef9d52", + "@aestheticfunction/dspack-gen": "git+https://github.com/aestheticfunction/dspack-gen.git#374e1cd91f02701c0d4829ece0a79dd9b381f67b", "@types/minimist": "^1.2.5", "esbuild": "^0.25.0", "@types/node": "^20.0.0", diff --git a/scripts/check-core-pin.mjs b/scripts/check-core-pin.mjs new file mode 100644 index 0000000..29ec41b --- /dev/null +++ b/scripts/check-core-pin.mjs @@ -0,0 +1,121 @@ +#!/usr/bin/env node +/** + * Vendored-core pin drift check (PHASE-NEXT WS0, report-only posture). + * + * ds-mcp bundles @aestheticfunction/dspack-gen/core at build time from a + * commit-pinned devDependency. The invariant this job watches: the pinned + * commit corresponds exactly to dspack-gen's latest published release, so + * the schema and linter semantics ds-mcp serves are the ones consumers get + * from `npm install @aestheticfunction/dspack-gen`. When a new dspack-gen + * release changes anything under src/core/, this check fails loudly and the + * fix is the documented re-pin ritual: move the pin to the new release tag, + * rebuild, republish ds-mcp. + * + * The diff excludes *.test.ts — test files never ship in the esbuild vendor + * bundle, which is the documented escape for intentional ahead-of-release + * pins. The default posture is tag-pinned, where this check is green by + * construction. + * + * Report-only discipline: a GitHub API failure logs a warning and exits 0 + * (infrastructure noise never blocks unrelated work); a real content diff + * always exits 1. + * + * Boring by design: node builtins + global fetch, one retry, no deps. + */ +import { readFileSync } from "node:fs"; + +const REPO = "aestheticfunction/dspack-gen"; +const API = `https://api.github.com/repos/${REPO}`; + +async function gh(path) { + for (let attempt = 1; ; attempt++) { + try { + const response = await fetch(`${API}${path}`, { + headers: { accept: "application/vnd.github+json", "user-agent": "ds-mcp-check-core-pin" }, + }); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + return await response.json(); + } catch (error) { + if (attempt >= 2) throw new Error(`GET ${path}: ${error.message ?? error}`); + await new Promise((resolve) => setTimeout(resolve, 2000)); + } + } +} + +const pkg = JSON.parse(readFileSync("package.json", "utf-8")); +const spec = pkg.devDependencies?.["@aestheticfunction/dspack-gen"] ?? ""; +const pinned = spec.split("#")[1]; +if (!/^[0-9a-f]{40}$/.test(pinned ?? "")) { + console.error(`could not read a 40-char commit pin from the devDependency spec: ${spec}`); + process.exit(1); +} + +let tags; +try { + tags = await gh("/tags?per_page=100"); +} catch (error) { + console.warn(`WARN GitHub API unavailable (${error.message}); pin-drift check skipped this run.`); + process.exit(0); +} + +const releases = tags + .filter((t) => /^v\d+\.\d+\.\d+$/.test(t.name)) + .sort((a, b) => { + const va = a.name.slice(1).split(".").map(Number); + const vb = b.name.slice(1).split(".").map(Number); + return vb[0] - va[0] || vb[1] - va[1] || vb[2] - va[2]; + }); +if (releases.length === 0) { + console.warn("WARN no release tags found on dspack-gen; pin-drift check skipped this run."); + process.exit(0); +} +const latest = releases[0]; +console.log(`pinned commit: ${pinned}`); +console.log(`latest dspack-gen release: ${latest.name} (${latest.commit.sha})`); + +if (latest.commit.sha === pinned) { + console.log("in sync the pin is exactly the latest release tag."); + process.exit(0); +} + +// Compare the two src/core trees blob by blob. The compare API is NOT used: +// its file list caps at 300 entries and silently truncates larger diffs — +// the exact silent-drift class this check exists to prevent. Two recursive +// tree fetches are exact at any diff size. +async function coreTree(ref) { + const tree = await gh(`/git/trees/${ref}?recursive=1`); + if (tree.truncated) throw new Error(`tree listing for ${ref} was truncated by the API`); + const files = new Map(); + for (const entry of tree.tree) { + if (entry.type !== "blob") continue; + if (!entry.path.startsWith("src/core/") || entry.path.endsWith(".test.ts")) continue; + files.set(entry.path, entry.sha); + } + return files; +} + +let pinnedCore, latestCore; +try { + [pinnedCore, latestCore] = await Promise.all([coreTree(pinned), coreTree(latest.commit.sha)]); +} catch (error) { + console.warn(`WARN GitHub API unavailable (${error.message}); pin-drift check skipped this run.`); + process.exit(0); +} + +const coreDiff = [...new Set([...pinnedCore.keys(), ...latestCore.keys()])] + .filter((path) => pinnedCore.get(path) !== latestCore.get(path)) + .sort(); + +if (coreDiff.length === 0) { + console.log( + `in sync pin differs from ${latest.name} but no shipped src/core files differ ` + + "(test-only or non-core drift; the vendor bundle is unaffected).", + ); + process.exit(0); +} + +console.error(`DRIFT the vendored core pin diverges from dspack-gen ${latest.name} in shipped src/core files:`); +for (const f of coreDiff) console.error(` ${f}`); +console.error(" fix: re-pin the devDependency to the release tag commit, npm install,"); +console.error(" npm run build, verify the golden-context test, release a new ds-mcp version."); +process.exit(1); diff --git a/scripts/check-sync.mjs b/scripts/check-sync.mjs index 77e4558..779ade6 100644 --- a/scripts/check-sync.mjs +++ b/scripts/check-sync.mjs @@ -34,6 +34,12 @@ const MANIFEST = [ "https://raw.githubusercontent.com/aestheticfunction/dspack-gen/main/fixtures/golden/violating/F1-dialog-for-delete.expected.json", note: "F1 expected findings — the deliberate validator-semantics coupling to dspack-gen", }, + { + local: "src/tests/fixtures/shadcn.destructive-action.context.json", + source: + "https://raw.githubusercontent.com/aestheticfunction/dspack-gen/main/fixtures/golden/context/shadcn.destructive-action.json", + note: "golden generation context — pins get-generation-context's served output to dspack-gen's compiler", + }, ]; const write = process.argv.includes("--write"); diff --git a/src/tests/fixtures/shadcn.destructive-action.context.json b/src/tests/fixtures/shadcn.destructive-action.context.json new file mode 100644 index 0000000..eb088b3 --- /dev/null +++ b/src/tests/fixtures/shadcn.destructive-action.context.json @@ -0,0 +1,7210 @@ +{ + "system": "You generate user interface surfaces for the \"shadcn/ui\" design system. You must respond\nwith a single JSON object conforming to the provided schema — a dspack surface document.\n\n## Component vocabulary\nYou may use only these components (with the listed props and allowed values):\n- button — An interactive element that triggers an action when activated. Built on a native button element with support for Radix UI Slot composition via asChild. Props: variant ∈ {default, destructive, outline, secondary, ghost, link}; size ∈ {default, sm, lg, icon}; disabled; asChild.\n- alert-dialog — A modal dialog that interrupts the user with important content and expects a response. Built on Radix UI AlertDialog. Renders with a required action and a cancel option. The user cannot dismiss it by clicking the overlay or pressing Escape — they must choose an explicit action. Props: open; onOpenChange. Sub-components (used as children): alert-dialog-trigger, alert-dialog-content, alert-dialog-header, alert-dialog-title, alert-dialog-description, alert-dialog-footer, alert-dialog-action, alert-dialog-cancel.\n- dialog — A modal window that appears over the page content. Built on Radix UI Dialog. Can be dismissed by clicking the overlay, pressing Escape, or activating a close button. Props: open; onOpenChange; modal. Sub-components (used as children): dialog-trigger, dialog-content, dialog-header, dialog-title, dialog-description, dialog-footer, dialog-close.\n- card — A container for grouping related content and actions. Provides visual separation through a bordered surface. Props: className. Sub-components (used as children): card-header, card-title, card-description, card-content, card-footer.\n- input — A single-line text input field built on the native element. Supports all standard HTML input types. Props: type; placeholder; disabled.\n- badge — A small label for categorization, status indication, or metadata. Renders as an inline element. Props: variant ∈ {default, secondary, outline, destructive}.\n- dropdown-menu — A menu that appears on activation of a trigger element. Built on Radix UI DropdownMenu. Supports items, checkboxes, radio groups, sub-menus, separators, and keyboard navigation. Props: open; onOpenChange; modal. Sub-components (used as children): dropdown-menu-trigger, dropdown-menu-content, dropdown-menu-item, dropdown-menu-checkbox-item, dropdown-menu-radio-group, dropdown-menu-radio-item, dropdown-menu-label, dropdown-menu-separator, dropdown-menu-group, dropdown-menu-sub, dropdown-menu-sub-trigger, dropdown-menu-sub-content.\n- table — A set of primitives for presenting tabular data with a meaningful row-and-column relationship. These are thin, presentational wrappers over the native table elements — Table renders a inside a horizontally scrollable container, and the sub-components render thead, tbody, tfoot, tr, th, td, and caption. There is no built-in sorting, filtering, pagination, or selection; those are composed on top. Sub-components (used as children): table-header, table-body, table-footer, table-row, table-head, table-cell, table-caption.\n\n## Governance rules in effect (intent: destructive-action)\nThese are hard requirements. Surfaces violating them will be rejected:\n1. [rule.destructive-requires-alertdialog / must] Use alert-dialog for this surface; dialog is forbidden. Why: Dialog can be dismissed by clicking the overlay or pressing Escape, so a user can bypass a destructive confirmation without making a conscious choice. AlertDialog forces an explicit confirm/cancel decision and is announced with greater urgency by screen readers.\n2. [rule.alertdialog-requires-cancel / must] Every alert-dialog must contain alert-dialog-cancel and alert-dialog-title. Why: A confirmation without an explicit cancel action and a title naming the consequence funnels the user toward the destructive action; the title is also required for aria-labelledby.\n3. [rule.button-no-interactive-descendants / must] Never place button or input inside a button. Why: Nested interactive elements create ambiguous click targets and are an accessibility violation: screen readers cannot determine intent and click handling varies across browsers.\n4. [rule.trigger-carries-label / must] Every alert-dialog-trigger must contain non-empty text (its own `text` field or a descendant's). Why: The trigger must present an accessible label: non-empty text somewhere under the trigger. Protocol projections lift the label from the trigger's subtree (preferring a label-bearing button; lifts are audited) — a trigger with no label text anywhere yields a control with no accessible name and an instance downstream emitters must refuse.\n5. [rule.alertdialog-no-nested-overlays / must] never place overlay-category components (alert-dialog, dialog, dropdown-menu) inside alert-dialog. Why: An alert dialog is a single focused interruption. Stacking another overlay (dialog, dropdown menu, another alert dialog) inside it breaks focus containment and dismiss semantics and buries the confirmation decision under a second layer.\n\n## Design intent\nIntent \"destructive-action\": The requested UI performs an irreversible or high-consequence operation: deleting records or accounts, revoking access, removing members.\nRelated pattern \"Destructive Action Confirmation\": Use AlertDialog, not Dialog, for destructive confirmations. The trigger should clearly indicate the destructive nature of the action. Inside the AlertDialog, provide a clear title stating what will happen, a description of the consequences, and two actions: a cancel option and a confirm option. The confirm button MUST use the destructive variant. Place the cancel action before the confirm action in the footer. The description should state specifically what will be affected (e.g., 'This will permanently delete 3 projects and all associated data').\n\nOutput only the JSON object. No commentary.", + "schema": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "additionalProperties": false, + "required": [ + "dspackSurface", + "system", + "intent", + "root" + ], + "properties": { + "dspackSurface": { + "const": "0.1" + }, + "system": { + "const": "shadcn/ui" + }, + "intent": { + "const": "destructive-action" + }, + "root": { + "$ref": "#/$defs/node_0" + } + }, + "$defs": { + "node_0": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "button" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "destructive", + "outline", + "secondary", + "ghost", + "link" + ] + }, + "size": { + "enum": [ + "default", + "sm", + "lg", + "icon" + ] + }, + "disabled": { + "type": "boolean" + }, + "asChild": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-action" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-cancel" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-close" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "className": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "input" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "disabled": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "badge" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "secondary", + "outline", + "destructive" + ] + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-checkbox-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-label" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-separator" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-body" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-row" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-head" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-cell" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-caption" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_1" + } + } + } + } + ] + }, + "node_1": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "button" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "destructive", + "outline", + "secondary", + "ghost", + "link" + ] + }, + "size": { + "enum": [ + "default", + "sm", + "lg", + "icon" + ] + }, + "disabled": { + "type": "boolean" + }, + "asChild": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-action" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-cancel" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-close" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "className": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "input" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "disabled": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "badge" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "secondary", + "outline", + "destructive" + ] + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-checkbox-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-label" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-separator" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-body" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-row" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-head" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-cell" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-caption" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_2" + } + } + } + } + ] + }, + "node_2": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "button" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "destructive", + "outline", + "secondary", + "ghost", + "link" + ] + }, + "size": { + "enum": [ + "default", + "sm", + "lg", + "icon" + ] + }, + "disabled": { + "type": "boolean" + }, + "asChild": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-action" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-cancel" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-close" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "className": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "input" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "disabled": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "badge" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "secondary", + "outline", + "destructive" + ] + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-checkbox-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-label" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-separator" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-body" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-row" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-head" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-cell" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-caption" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_3" + } + } + } + } + ] + }, + "node_3": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "button" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "destructive", + "outline", + "secondary", + "ghost", + "link" + ] + }, + "size": { + "enum": [ + "default", + "sm", + "lg", + "icon" + ] + }, + "disabled": { + "type": "boolean" + }, + "asChild": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-action" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-cancel" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-close" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "className": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "input" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "disabled": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "badge" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "secondary", + "outline", + "destructive" + ] + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-checkbox-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-label" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-separator" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-body" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-row" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-head" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-cell" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-caption" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_4" + } + } + } + } + ] + }, + "node_4": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "button" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "destructive", + "outline", + "secondary", + "ghost", + "link" + ] + }, + "size": { + "enum": [ + "default", + "sm", + "lg", + "icon" + ] + }, + "disabled": { + "type": "boolean" + }, + "asChild": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-action" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-cancel" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-close" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "className": { + "type": "string" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "input" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "disabled": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "badge" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "secondary", + "outline", + "destructive" + ] + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-checkbox-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-label" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-separator" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-body" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-row" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-head" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-cell" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-caption" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "children": { + "type": "array", + "items": { + "$ref": "#/$defs/node_5" + } + } + } + } + ] + }, + "node_5": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "button" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "destructive", + "outline", + "secondary", + "ghost", + "link" + ] + }, + "size": { + "enum": [ + "default", + "sm", + "lg", + "icon" + ] + }, + "disabled": { + "type": "boolean" + }, + "asChild": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + } + } + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-action" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "alert-dialog-cancel" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dialog-close" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "className": { + "type": "string" + } + } + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-title" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-description" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "card-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "input" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "disabled": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "badge" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "variant": { + "enum": [ + "default", + "secondary", + "outline", + "destructive" + ] + } + } + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu" + }, + "id": { + "type": "string" + }, + "props": { + "type": "object", + "additionalProperties": false, + "properties": { + "open": { + "type": "boolean" + }, + "onOpenChange": { + "type": "string" + }, + "modal": { + "type": "boolean" + } + } + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-checkbox-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-radio-item" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-label" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-separator" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-group" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-trigger" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "dropdown-menu-sub-content" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-header" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-body" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-footer" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-row" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-head" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-cell" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "component" + ], + "properties": { + "component": { + "const": "table-caption" + }, + "id": { + "type": "string" + }, + "text": { + "type": "string" + } + } + } + ] + } + } + }, + "fewshot": [ + { + "role": "user", + "content": "a screen to delete my account" + }, + { + "role": "assistant", + "content": "{\"dspackSurface\":\"0.1\",\"system\":\"shadcn/ui\",\"intent\":\"destructive-action\",\"root\":{\"component\":\"card\",\"children\":[{\"component\":\"alert-dialog\",\"children\":[{\"component\":\"alert-dialog-trigger\",\"children\":[{\"component\":\"button\",\"props\":{\"variant\":\"destructive\"},\"text\":\"Delete account\"}]},{\"component\":\"alert-dialog-content\",\"children\":[{\"component\":\"alert-dialog-title\",\"text\":\"Delete your account?\"},{\"component\":\"alert-dialog-description\",\"text\":\"This will permanently delete your account and all associated data. This action cannot be undone.\"},{\"component\":\"alert-dialog-footer\",\"children\":[{\"component\":\"alert-dialog-cancel\",\"text\":\"Cancel\"},{\"component\":\"alert-dialog-action\",\"text\":\"Delete account\"}]}]}]}]}}" + } + ] +} diff --git a/src/tests/generation-context-golden.test.ts b/src/tests/generation-context-golden.test.ts new file mode 100644 index 0000000..9226ddf --- /dev/null +++ b/src/tests/generation-context-golden.test.ts @@ -0,0 +1,66 @@ +/** + * Golden generation-context honesty check (PHASE-NEXT WS0, task 0.1). + * + * What ds-mcp serves from get-generation-context MUST be what dspack-gen's + * compiler computes for the same contract and intent — byte for byte after + * JSON serialization (the wire shape an MCP client receives). The golden is + * a byte-synced copy of dspack-gen's own compiler golden + * (fixtures/golden/context/shadcn.destructive-action.json, tracked in + * scripts/check-sync.mjs), compiled from the same shadcn v0.4 contract this + * repo carries as examples/shadcn-ui-v04.dspack.json. + * + * This is deliberate pinned-semantics coupling, the same posture as the F1 + * lint goldens: if the vendored core's generation schema drifts from the + * published dspack-gen's, this fails loudly and the fix is a re-pin (see + * README, "dspack-gen is a build-time dependency"). It exists because the + * pre-0.1.1 pin served a schema that degraded array-typed contract props to + * strings and declared node `text` before `props` — divergence a prompt + * consumer cannot detect on its own. + */ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; +import { loadDspack } from '../loader.js'; +import { getGenerationContext } from '../tools/get-generation-context.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, '..', '..'); + +const doc = loadDspack(join(root, 'examples', 'shadcn-ui-v04.dspack.json')); +const golden = JSON.parse( + readFileSync(join(root, 'src', 'tests', 'fixtures', 'shadcn.destructive-action.context.json'), 'utf-8'), +) as { system: string; schema: unknown; fewshot: unknown }; + +/** + * The comparison is BYTE equality of the canonical serialization, not + * deepEqual: grammar-constrained decoders enforce declared property ORDER, + * so two schemas that deepEqual can still constrain a model differently. + * The pre-0.1.1 divergence is exactly that class (node `text` declared + * before `props`), which deepEqual cannot see. + */ +const bytes = (value: unknown): string => JSON.stringify(value, null, 2); + +test('get-generation-context serves exactly dspack-gen\'s golden context (schema semantics pinned, byte-level)', () => { + const outcome = getGenerationContext(doc, { intent: 'destructive-action' }); + assert.ok(outcome.found, 'expected found'); + const served = JSON.parse(JSON.stringify(outcome.result)) as { + system: string; + schema: unknown; + fewshot: unknown; + }; + assert.equal(served.system, golden.system, 'system prompt drifted from the dspack-gen golden'); + const servedSchema = bytes(served.schema); + const goldenSchema = bytes(golden.schema); + if (servedSchema !== goldenSchema) { + const s = servedSchema.split('\n'); + const g = goldenSchema.split('\n'); + const at = s.findIndex((line, i) => line !== g[i]); + assert.fail( + `generation schema drifted from the dspack-gen golden — the vendored core pin should move.\n` + + `first divergence at schema line ${at}:\n served: ${s[at]}\n golden: ${g[at]}`, + ); + } + assert.equal(bytes(served.fewshot), bytes(golden.fewshot), 'few-shot exemplars drifted from the dspack-gen golden'); +});