From 3c7f9dd28402ad748c43b5ee2d03048c4181ad4f Mon Sep 17 00:00:00 2001 From: Ryan Dombrowski Date: Tue, 14 Jul 2026 14:44:36 -0400 Subject: [PATCH] fix: re-pin vendored core to dspack-gen v0.1.1; golden-context + pin-drift checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The vendored core bundle was pinned at f651433, predating dspack-gen 0.1.1's generation-schema fixes for grammar-constrained decoders, so the published 0.3.0 served a schema that declared node text before props and degraded array-typed contract props to strings. - Re-pin the devDependency to 374e1cd, the v0.1.1 tag commit. Tag-pinned is the documented default posture: the vendored core corresponds exactly to a published dspack-gen version. - Golden-context test byte-compares get-generation-context output against dspack-gen's compiler golden (synced byte copy, tracked in check-sync). Byte-level on purpose: grammar decoders enforce property order, which deepEqual cannot see. Fails on the old bundle at schema line 40 (text before props); passes on 0.1.1. - check-core-pin.mjs + CI job: blob-exact src/core comparison (trees API; the compare API caps at 300 files and silently truncates) between the pin and dspack-gen's latest release tag. *.test.ts excluded — the documented escape for ahead-of-release pins. API failure warns and passes; real drift fails. - Release workflow: npm trusted publishing on version tags, mirroring dspack-gen (requires one-time trusted-publisher setup on npmjs.com). - 0.3.1, CHANGELOG. Co-Authored-By: Claude Fable 5 --- .github/workflows/release.yml | 52 + .github/workflows/test.yml | 13 + CHANGELOG.md | 39 + README.md | 12 +- package-lock.json | 19 +- package.json | 5 +- scripts/check-core-pin.mjs | 121 + scripts/check-sync.mjs | 6 + .../shadcn.destructive-action.context.json | 7210 +++++++++++++++++ src/tests/generation-context-golden.test.ts | 66 + 10 files changed, 7531 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 CHANGELOG.md create mode 100644 scripts/check-core-pin.mjs create mode 100644 src/tests/fixtures/shadcn.destructive-action.context.json create mode 100644 src/tests/generation-context-golden.test.ts 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'); +});