cascivo 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -526,7 +526,7 @@ function indexHtml(opts) {
|
|
|
526
526
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
527
527
|
<title>${opts.name}</title>
|
|
528
528
|
<style>
|
|
529
|
-
@layer cascivo.reset, cascivo.tokens, cascivo.component, cascivo.theme;
|
|
529
|
+
@layer cascivo.reset, cascivo.base, cascivo.tokens, cascivo.component, cascivo.theme, cascivo.override;
|
|
530
530
|
@layer cascivo.reset {
|
|
531
531
|
*,
|
|
532
532
|
*::before,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["resolvePath","flagValue","DEFAULT_CONFIG","item"],"sources":["../src/utils/exec.ts","../src/utils/resolve.ts","../src/utils/directory.ts","../src/commands/add.ts","../src/commands/create.ts","../src/commands/doctor.ts","../src/commands/generate.ts","../src/commands/init.ts","../src/commands/list.ts","../src/commands/registry.ts","../src/commands/search.ts","../../theme-kit/src/config.ts","../../theme-kit/src/hash.ts","../../theme-kit/src/css.ts","../src/commands/theme.ts","../src/utils/diff.ts","../src/utils/merge.ts","../src/commands/update.ts","../src/commands/view.ts","../src/index.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process'\nimport { detectPackageManager, installCommand } from './config.js'\n\n/**\n * Install npm packages using the detected package manager, inheriting stdio so\n * the user sees install progress. Returns false if the install failed.\n */\nexport function installPackages(packages: string[], cwd: string = process.cwd()): boolean {\n if (packages.length === 0) return true\n const [cmd, args] = installCommand(detectPackageManager(cwd), packages)\n console.log(`Installing ${packages.join(', ')} with ${cmd}…`)\n const result = spawnSync(cmd, args, {\n cwd,\n stdio: 'inherit',\n shell: process.platform === 'win32',\n })\n if (result.status !== 0) {\n console.error(`Failed to install: ${packages.join(', ')}`)\n return false\n }\n return true\n}\n","import { CASCIVO_HOST, type CascadeConfig, type RegistryNamespaceConfig } from './config.js'\nimport { fetchJson } from './http.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\nexport type AddressKind = 'bare' | 'namespace' | 'url' | 'github'\n\nexport interface ParsedAddress {\n kind: AddressKind\n namespace?: string\n name: string\n ref?: string\n raw: string\n}\n\nconst GITHUB_RE = /^([^/]+)\\/([^/]+)\\/([^#]+)(?:#(.+))?$/\n\nfunction expandEnv(str: string, env: NodeJS.ProcessEnv = process.env): string {\n return str.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => {\n const val = env[key]\n if (val === undefined) throw new Error(`Environment variable ${key} is not set`)\n return val\n })\n}\n\nexport function parseAddress(spec: string, _env: NodeJS.ProcessEnv = process.env): ParsedAddress {\n if (\n spec.startsWith('http://') ||\n spec.startsWith('https://') ||\n spec.startsWith('./') ||\n spec.startsWith('/')\n ) {\n return { kind: 'url', name: spec, raw: spec }\n }\n\n if (spec.startsWith('@')) {\n const slash = spec.indexOf('/', 1)\n if (slash === -1) throw new Error(`Invalid namespace address: ${spec} (expected @ns/name)`)\n const namespace = spec.slice(0, slash)\n const name = spec.slice(slash + 1)\n return { kind: 'namespace', namespace, name, raw: spec }\n }\n\n // GitHub: owner/repo/item[#ref] — at least 3 path segments, no leading protocol/dot\n const specWithoutRef = spec.includes('#') ? spec.slice(0, spec.indexOf('#')) : spec\n const githubMatch = GITHUB_RE.exec(spec)\n if (githubMatch && !specWithoutRef.includes('.') && specWithoutRef.split('/').length >= 3) {\n const [, owner, repo, item, ref] = githubMatch\n return {\n kind: 'github',\n name: `${owner}/${repo}/${item}`,\n ref: ref ?? 'main',\n raw: spec,\n }\n }\n\n return { kind: 'bare', name: spec, raw: spec }\n}\n\nfunction resolveNamespaceUrl(\n ns: string,\n name: string,\n nsCfg: RegistryNamespaceConfig,\n env: NodeJS.ProcessEnv,\n): string {\n const template = typeof nsCfg === 'string' ? nsCfg : nsCfg.url\n if (!template.includes('{name}')) {\n throw new Error(`Registry namespace \"${ns}\" URL template must contain {name}: ${template}`)\n }\n return expandEnv(template.replace('{name}', name), env)\n}\n\nexport async function resolveItemUrl(\n addr: ParsedAddress,\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n resolveNamespaceHook?: (ns: string) => Promise<RegistryNamespaceConfig | null>,\n): Promise<{ url: string; headers?: Record<string, string>; params?: Record<string, string> }> {\n switch (addr.kind) {\n case 'url':\n return { url: addr.name }\n\n case 'bare': {\n const base = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\n return { url: `${base}/r/${addr.name}.json` }\n }\n\n case 'github': {\n const parts = addr.name.split('/')\n const owner = parts[0]!\n const repo = parts[1]!\n const item = parts.slice(2).join('/')\n const ref = addr.ref ?? 'main'\n return {\n url: `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/r/${item}.json`,\n }\n }\n\n case 'namespace': {\n const ns = addr.namespace!\n const name = addr.name\n\n // Config-defined namespaces always win\n if (config.registries?.[ns]) {\n const nsCfg = config.registries[ns]!\n const url = resolveNamespaceUrl(ns, name, nsCfg, env)\n const headers = typeof nsCfg !== 'string' ? nsCfg.headers : undefined\n const params = typeof nsCfg !== 'string' ? nsCfg.params : undefined\n const expandedHeaders = headers\n ? Object.fromEntries(Object.entries(headers).map(([k, v]) => [k, expandEnv(v, env)]))\n : undefined\n const expandedParams = params\n ? Object.fromEntries(Object.entries(params).map(([k, v]) => [k, expandEnv(v, env)]))\n : undefined\n const result: {\n url: string\n headers?: Record<string, string>\n params?: Record<string, string>\n } = { url }\n if (expandedHeaders) result.headers = expandedHeaders\n if (expandedParams) result.params = expandedParams\n return result\n }\n\n // Directory fallback hook (injected from T3)\n if (resolveNamespaceHook) {\n const hookResult = await resolveNamespaceHook(ns)\n if (hookResult) {\n const url = resolveNamespaceUrl(ns, name, hookResult, env)\n return { url }\n }\n }\n\n // Built-in first-party namespace fallback (@cascade is the legacy alias)\n if (ns === '@cascivo' || ns === '@cascade') {\n return { url: `${CASCIVO_HOST}/r/${name}.json` }\n }\n\n throw new Error(\n `Unknown namespace \"${ns}\". Add it to registries in cascivo.config.ts or check the directory at cascivo.com`,\n )\n }\n }\n}\n\nexport interface InstallPlan {\n items: {\n spec: string\n addr: ParsedAddress\n itemUrl: string\n headers?: Record<string, string>\n params?: Record<string, string>\n item: RegistryItem\n registryBase: string\n }[]\n}\n\nexport async function resolveClosure(\n specs: string[],\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n resolveNamespaceHook?: (ns: string) => Promise<RegistryNamespaceConfig | null>,\n): Promise<InstallPlan> {\n const seen = new Set<string>()\n const queue: string[] = [...specs]\n const plan: InstallPlan['items'] = []\n\n while (queue.length > 0) {\n const spec = queue.shift()!\n const addr = parseAddress(spec, env)\n const identity = addr.raw\n\n if (seen.has(identity)) continue\n seen.add(identity)\n\n const { url, headers, params } = await resolveItemUrl(addr, config, env, resolveNamespaceHook)\n const fetchOpts: Parameters<typeof fetchJson>[1] = {}\n if (headers) fetchOpts.headers = headers\n if (params) fetchOpts.params = params\n const raw = await fetchJson(url, fetchOpts)\n const item = raw as RegistryItem\n\n const base = url.replace(/\\/[^/]+\\.json$/, '')\n\n const entry: InstallPlan['items'][number] = {\n spec,\n addr,\n itemUrl: url,\n item,\n registryBase: base,\n }\n if (headers) entry.headers = headers\n if (params) entry.params = params\n plan.push(entry)\n\n for (const dep of item.registryDependencies ?? []) {\n queue.push(dep)\n }\n }\n\n return { items: plan }\n}\n","import type { RegistryNamespaceConfig } from './config.js'\nimport { fetchJson } from './http.js'\nimport type { FetchFn } from './http.js'\n\nimport { CASCIVO_HOST } from './config.js'\n\nexport const DIRECTORY_URL = `${CASCIVO_HOST}/r/registries.json`\n\ninterface DirectoryEntry {\n namespace: string\n registryUrl: string\n}\n\ninterface DirectoryResponse {\n registries?: DirectoryEntry[]\n}\n\nexport async function resolveFromDirectory(\n ns: string,\n fetchFn?: FetchFn,\n): Promise<RegistryNamespaceConfig | null> {\n try {\n // fetchJson uses the module-level _fetchFn; if a custom fetchFn is provided, we use it directly\n let data: DirectoryResponse\n if (fetchFn) {\n const res = await fetchFn(DIRECTORY_URL, { headers: { Accept: 'application/json' } })\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n data = (await res.json()) as DirectoryResponse\n } else {\n data = (await fetchJson(DIRECTORY_URL)) as DirectoryResponse\n }\n const entry = data.registries?.find((r) => r.namespace === ns)\n if (!entry) return null\n return entry.registryUrl\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n console.warn(`Could not reach cascivo.com directory: ${msg}`)\n return null\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { join, resolve as resolvePath } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchTextRetry } from '../utils/http.js'\nimport {\n fetchRegistry,\n fileName,\n findComponent,\n type Registry,\n type RegistryComponent,\n} from '../utils/registry.js'\nimport { createLock, readLock, sha256, updateLockEntry, writeLock } from '../utils/lock.js'\nimport { checkPeerVersions } from '../utils/peer-versions.js'\nimport { resolveClosure } from '../utils/resolve.js'\nimport { resolveFromDirectory } from '../utils/directory.js'\nimport { isTemplateItem, type RegistryItem } from '@cascivo/registry'\n\n/** Dependencies always present in a cascade project — never auto-installed. */\nconst ASSUMED_DEPS = new Set(['react', 'react-dom'])\n\n/**\n * Copied components read `--cascivo-*` custom properties; without\n * @cascivo/tokens or @cascivo/themes imported somewhere, they render unstyled.\n * Print the wiring once after a successful install if neither is a dependency.\n */\nfunction hintThemesIfMissing(cwd: string): void {\n let deps: Record<string, unknown> = {}\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n // No package.json — still worth printing the hint.\n }\n if (deps['@cascivo/themes'] !== undefined || deps['@cascivo/tokens'] !== undefined) return\n console.log(\n '\\nStyling: cascivo components read --cascivo-* tokens, which this project does not import yet.',\n )\n console.log(' npm install @cascivo/themes')\n console.log(\" import '@cascivo/themes/all' // once, in your entry file\")\n console.log(' <html data-theme=\"light\"> // or any container')\n}\n\n/** Resolve where a template's own file is written — relative to the project root. */\nexport function resolveTemplateTarget(cwd: string, target: string): string {\n return resolvePath(cwd, target)\n}\n\nexport interface ResolvedBareEntry {\n entry: RegistryComponent\n /** True if reached via an original `cascivo add` argument; false if pulled as a transitive dependency. */\n requested: boolean\n}\n\n/**\n * Names from other libraries → the cascivo layout primitive that fills the same\n * role, so `cascivo add flex` installs `layout/stack`. Bare names that already\n * resolve (e.g. `stack` → `layout/stack` via suffix match) need no alias.\n */\nexport const LAYOUT_ALIASES: Record<string, string> = {\n flex: 'stack',\n box: 'stack',\n hstack: 'stack',\n vstack: 'stack',\n gap: 'spacer',\n}\n\n/**\n * Resolve the transitive closure of bare-name registry entries, following each\n * entry's `registryDependencies`. De-duped by resolved registry name and\n * cycle-safe (an entry is processed at most once). Returns resolved entries in\n * install order plus the names that could not be found. Pure — no I/O.\n */\nexport function resolveBareClosure(\n registry: Registry,\n bareSpecs: string[],\n): { resolved: ResolvedBareEntry[]; missing: string[] } {\n const queue: { name: string; requested: boolean }[] = bareSpecs.map((name) => ({\n name,\n requested: true,\n }))\n const installed = new Set<string>()\n const resolved: ResolvedBareEntry[] = []\n const missing: string[] = []\n\n while (queue.length > 0) {\n const { name, requested } = queue.shift()!\n const resolvedName = LAYOUT_ALIASES[name.toLowerCase()] ?? name\n const entry = findComponent(registry, resolvedName)\n if (!entry) {\n missing.push(name)\n continue\n }\n if (installed.has(entry.name)) continue\n installed.add(entry.name)\n resolved.push({ entry, requested })\n for (const dep of entry.registryDependencies ?? []) {\n queue.push({ name: dep, requested: false })\n }\n }\n\n return { resolved, missing }\n}\n\n/**\n * First-party items are hosted on cascivo.com or the cascivo/cascivo GitHub\n * repo (raw file URLs). Anything else gets a review-before-use notice.\n */\nconst FIRST_PARTY_URL = /^https:\\/\\/(cascivo\\.com|raw\\.githubusercontent\\.com\\/cascivo\\/cascivo)\\//\n\nexport function isThirdParty(itemUrl: string): boolean {\n return !FIRST_PARTY_URL.test(itemUrl)\n}\n\nfunction isMultiRegistrySpec(name: string): boolean {\n return (\n name.startsWith('@') ||\n name.startsWith('http://') ||\n name.startsWith('https://') ||\n name.startsWith('./') ||\n name.startsWith('/') ||\n name.split('/').length >= 3\n )\n}\n\nexport async function add(\n names: string[],\n config: CascadeConfig,\n opts: { dryRun?: boolean; yes?: boolean; cwd?: string } = {},\n): Promise<void> {\n if (names.length === 0) {\n console.error('Usage: cascivo add <component...>')\n return\n }\n\n const cwd = opts.cwd ?? process.cwd()\n const multiSpecs = names.filter(isMultiRegistrySpec)\n let bareSpecs = names.filter((n) => !isMultiRegistrySpec(n))\n\n // Bare names that match a first-party template install through the per-item\n // path (they carry file targets the bare component path cannot express).\n let registry: Registry | null = null\n if (bareSpecs.length > 0) {\n registry = await fetchRegistry(config.registry)\n const templateNames = new Set(registry.templates.map((t) => t.toLowerCase()))\n const templateSpecs = bareSpecs.filter((n) => templateNames.has(n.toLowerCase()))\n if (templateSpecs.length > 0) {\n bareSpecs = bareSpecs.filter((n) => !templateNames.has(n.toLowerCase()))\n multiSpecs.push(...templateSpecs.map((n) => `@cascivo/${n.toLowerCase()}`))\n }\n }\n\n let lock = (await readLock(cwd)) ?? createLock()\n\n // Handle multi-registry specs (namespaces, URLs, GitHub)\n if (multiSpecs.length > 0) {\n const plan = await resolveClosure(multiSpecs, config, process.env, resolveFromDirectory)\n\n if (opts.dryRun) {\n console.log('Dry run — would install:')\n for (const item of plan.items) {\n const kind = isTemplateItem(item.item) ? ' [template]' : ''\n console.log(\n ` ${item.spec} (${item.item.name}@${item.item.version})${kind} from ${item.itemUrl}`,\n )\n for (const f of item.item.files) {\n const arrow = isTemplateItem(item.item) && f.target ? ` → ${f.target}` : ''\n console.log(` ${f.url}${arrow}`)\n }\n if (item.item.registryDependencies?.length) {\n console.log(` components: ${item.item.registryDependencies.join(', ')}`)\n }\n }\n return\n }\n\n for (const { item, itemUrl, registryBase } of plan.items) {\n if (isThirdParty(itemUrl)) {\n console.log(\n `\\nReview before use — files from non-directory registry: ${registryBase}\\n` +\n (item.files ?? []).map((f) => ` ${f.url}`).join('\\n'),\n )\n }\n\n let fileHashes: Record<string, string>\n try {\n fileHashes = await installItem(item, config, cwd)\n } catch (e) {\n // Nothing was written for this item (fetch-all-then-write), so the\n // lockfile must not record it either.\n console.error(`Failed to install ${item.name}: ${e instanceof Error ? e.message : e}`)\n process.exitCode = 1\n continue\n }\n lock = updateLockEntry(lock, item.name, {\n registry: registryBase,\n version: item.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: fileHashes,\n })\n }\n await writeLock(lock, cwd)\n if (bareSpecs.length === 0) {\n hintThemesIfMissing(cwd)\n return\n }\n }\n\n if (bareSpecs.length === 0) return\n // Legacy bare-name path (uses the registry fetched above for template\n // detection). Resolves the transitive closure of registry (component)\n // dependencies so a component that imports a shared hook/sibling\n // (e.g. `../popover/use-popover`) installs that dependency too.\n registry ??= await fetchRegistry(config.registry)\n const missingDeps = new Set<string>()\n const registryBase = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\n\n for (const spec of bareSpecs) {\n const alias = LAYOUT_ALIASES[spec.toLowerCase()]\n if (!alias) continue\n const target = findComponent(registry, alias)\n if (target) {\n console.log(\n `\"${spec}\" is not a cascivo component — installing ${target.name} (its ${spec} primitive).`,\n )\n }\n }\n\n const { resolved, missing } = resolveBareClosure(registry, bareSpecs)\n for (const name of missing) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n }\n\n // Aggregate each resolved entry's peer-version floors (e.g. \"install data-table\n // needs @cascivo/i18n >= 0.2.1\") so we can verify what actually got installed.\n const peerFloors: Record<string, string> = {}\n for (const { entry } of resolved) {\n for (const [pkg, floor] of Object.entries(entry.peerVersions ?? {})) {\n peerFloors[pkg] = floor\n }\n }\n\n for (const { entry, requested } of resolved) {\n if (entry.install) {\n const pkg = entry.install\n console.log(`\"${entry.name}\" is distributed as the npm package ${pkg}.`)\n console.log(`Install it with: npm install ${pkg}`)\n console.log(`Then import: import { ${entry.meta.name} } from '${pkg}'`)\n if (entry.styles) {\n console.log(`And import its stylesheet once: import '${entry.styles}'`)\n }\n continue\n }\n\n const outputName = entry.name.includes('/') ? entry.name.split('/').pop()! : entry.name\n const fileHashes: Record<string, string> = {}\n\n // Two-phase: fetch every file before writing any, so a mid-install network\n // failure can never leave a half-copied component (or a lockfile entry\n // pointing at one).\n let fetched: { url: string; content: string }[]\n try {\n fetched = await Promise.all(\n entry.files.map(async (url) => ({ url, content: await fetchTextRetry(url) })),\n )\n } catch (e) {\n console.error(`Failed to install ${entry.name}: ${e instanceof Error ? e.message : e}`)\n process.exitCode = 1\n continue\n }\n for (const { url, content } of fetched) {\n const dest = resolveOutputPath(config.outputDir, outputName, fileName(url), cwd)\n await writeFileSafe(dest, content)\n fileHashes[dest] = sha256(content)\n }\n\n for (const dep of entry.dependencies) {\n if (!ASSUMED_DEPS.has(dep)) missingDeps.add(dep)\n }\n\n lock = updateLockEntry(lock, entry.name, {\n registry: registryBase,\n version: entry.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: fileHashes,\n })\n\n const suffix = requested ? '' : ' (dependency)'\n console.log(`Added ${entry.name} to ${config.outputDir}/${outputName}/${suffix}`)\n }\n\n if (missingDeps.size > 0) {\n installPackages([...missingDeps])\n }\n\n if (Object.keys(peerFloors).length > 0) {\n const violations = await checkPeerVersions(cwd, peerFloors)\n for (const v of violations) {\n console.error(\n `\\nWarning: ${v.pkg} ${v.installed ? `${v.installed} is` : 'is not'} installed, but ` +\n `the copied component source needs ${v.pkg} ${v.required}. ` +\n `Run: npm install ${v.pkg}@latest`,\n )\n process.exitCode = 1\n }\n }\n\n await writeLock(lock, cwd)\n hintThemesIfMissing(cwd)\n}\n\n/**\n * Install a single resolved item, returning a map of written path → content\n * hash for the lockfile. A template writes its own files to their `target`\n * paths (relative to the project root); every other item writes its files under\n * the components output directory. A template's components are installed\n * separately as their own plan entries (via `registryDependencies`).\n */\nasync function installItem(\n item: RegistryItem,\n config: CascadeConfig,\n cwd: string,\n): Promise<Record<string, string>> {\n const fileHashes: Record<string, string> = {}\n const missingDeps = new Set<string>()\n const template = isTemplateItem(item)\n const outputName = item.name.includes('/') ? item.name.split('/').pop()! : item.name\n\n // Two-phase: fetch every file before writing any. A failed fetch aborts the\n // whole item (throws to the caller) instead of silently installing a subset.\n const fetched = await Promise.all(\n (item.files ?? []).map(async (file) => ({\n file,\n content: await fetchTextRetry(file.url),\n })),\n )\n for (const { file, content } of fetched) {\n const dest =\n template && file.target\n ? resolveTemplateTarget(cwd, file.target)\n : resolveOutputPath(config.outputDir, outputName, fileName(file.url), cwd)\n await writeFileSafe(dest, content)\n fileHashes[dest] = sha256(content)\n }\n\n for (const dep of item.dependencies ?? []) {\n if (!ASSUMED_DEPS.has(dep)) missingDeps.add(dep)\n }\n\n if (missingDeps.size > 0) {\n installPackages([...missingDeps])\n }\n\n if (template) {\n const pages = item.files?.filter((f) => f.target).map((f) => f.target) ?? []\n console.log(`Installed template ${item.name} (${pages.length} files)`)\n } else {\n console.log(`Added ${item.name} to ${config.outputDir}/${outputName}/`)\n }\n\n return fileHashes\n}\n","import { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { stdin, stdout } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\nimport { CASCIVO_HOST, THEMES, type ThemeName } from '../utils/config.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\n/** Version specifier used for every `@cascivo/*` dependency in generated apps. */\nconst CASCIVO_DEP = 'latest'\n\nexport interface ScaffoldOptions {\n /** Project directory + package name. */\n name: string\n /** Theme imported in the entry CSS and set on `<html data-theme>`. */\n theme: ThemeName\n /** Display labels for the side-nav sections (one section component each). */\n sections: string[]\n}\n\nexport interface ScaffoldFile {\n /** Path relative to the project root. */\n path: string\n contents: string\n}\n\ninterface Section {\n /** Discriminant used in the section signal + conditional render. */\n key: string\n /** Human-readable label shown in the nav and section heading. */\n label: string\n /** PascalCase component + file name. */\n component: string\n}\n\n/** Slug suitable for a union-member string literal: lower-kebab, alnum only. */\nfunction slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'section'\n )\n}\n\n/** PascalCase identifier derived from a free-text label. */\nfunction pascalCase(label: string): string {\n const parts = label\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n const joined = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')\n const safe = joined || 'Section'\n return /^[0-9]/.test(safe) ? `Section${safe}` : safe\n}\n\n/** Normalize the project name into a valid npm package name. */\nfunction packageName(name: string): string {\n return (\n name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'cascivo-app'\n )\n}\n\n/** Turn raw section labels into unique keyed/component-named sections. */\nfunction resolveSections(labels: string[]): Section[] {\n const seenKeys = new Set<string>()\n const seenComponents = new Set<string>()\n const sections: Section[] = []\n for (const label of labels) {\n const trimmed = label.trim()\n if (!trimmed) continue\n let key = slug(trimmed)\n let component = pascalCase(trimmed)\n let n = 2\n while (seenKeys.has(key) || seenComponents.has(component)) {\n key = `${slug(trimmed)}-${n}`\n component = `${pascalCase(trimmed)}${n}`\n n++\n }\n seenKeys.add(key)\n seenComponents.add(component)\n sections.push({ key, label: trimmed, component })\n }\n return sections.length > 0 ? sections : [{ key: 'home', label: 'Home', component: 'Home' }]\n}\n\nfunction packageJson(opts: ScaffoldOptions): string {\n const pkg = {\n name: packageName(opts.name),\n private: true,\n version: '0.0.0',\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n },\n dependencies: {\n '@cascivo/core': CASCIVO_DEP,\n '@cascivo/react': CASCIVO_DEP,\n '@cascivo/themes': CASCIVO_DEP,\n '@cascivo/tokens': CASCIVO_DEP,\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n },\n devDependencies: {\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n '@vitejs/plugin-react': '^5.0.0',\n typescript: '^5.7.0',\n vite: '^7.0.0',\n },\n }\n return JSON.stringify(pkg, null, 2) + '\\n'\n}\n\nfunction tsconfig(): string {\n const cfg = {\n compilerOptions: {\n target: 'ES2022',\n useDefineForClassFields: true,\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n moduleDetection: 'force',\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n }\n return JSON.stringify(cfg, null, 2) + '\\n'\n}\n\nfunction viteConfig(): string {\n return `import react from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [react()],\n})\n`\n}\n\nfunction indexHtml(opts: ScaffoldOptions): string {\n return `<!doctype html>\n<html lang=\"en\" data-theme=\"${opts.theme}\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${opts.name}</title>\n <style>\n @layer cascivo.reset, cascivo.tokens, cascivo.component, cascivo.theme;\n @layer cascivo.reset {\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n }\n html,\n body,\n #root {\n height: 100%;\n }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}\n\nfunction mainTsx(): string {\n return `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\n\nconst root = document.getElementById('root')\nif (root) {\n ReactDOM.createRoot(root).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n )\n}\n`\n}\n\nfunction viteEnv(): string {\n return `/// <reference types=\"vite/client\" />\\n`\n}\n\nfunction appTsx(opts: ScaffoldOptions, sections: Section[]): string {\n const sectionImports = sections\n .map((s) => `import { ${s.component} } from './sections/${s.component}'`)\n .join('\\n')\n\n const unionType = sections.map((s) => `'${s.key}'`).join(' | ')\n\n const navItems = sections\n .map(\n (s) => ` {\n label: '${s.label.replace(/'/g, \"\\\\'\")}',\n active: section.value === '${s.key}',\n onClick: (e) => {\n e.preventDefault()\n section.value = '${s.key}'\n },\n },`,\n )\n .join('\\n')\n\n const renderedSections = sections\n .map((s) => ` {section.value === '${s.key}' && <${s.component} />}`)\n .join('\\n')\n\n return `'use client'\nimport { signal, useSignals } from '@cascivo/core'\nimport { AppShell, ShellHeader, SideNav, type SideNavItem } from '@cascivo/react'\n${sectionImports}\n\nimport '@cascivo/tokens'\nimport '@cascivo/themes/${opts.theme}.css'\nimport '@cascivo/react/styles.css'\n\ntype Section = ${unionType}\n\nconst section = signal<Section>('${sections[0]!.key}')\n\nexport default function App() {\n useSignals()\n\n const navItems: SideNavItem[] = [\n${navItems}\n ]\n\n return (\n <AppShell\n header={<ShellHeader brand={{ name: '${opts.name.replace(/'/g, \"\\\\'\")}' }} />}\n nav={<SideNav items={navItems} />}\n >\n${renderedSections}\n </AppShell>\n )\n}\n`\n}\n\nfunction sectionTsx(section: Section): string {\n return `import { Card, CardContent, CardHeader, CardTitle, Heading, Text } from '@cascivo/react'\n\nexport function ${section.component}() {\n return (\n <div\n style={{\n display: 'grid',\n gap: 'var(--cascivo-space-6)',\n padding: 'var(--cascivo-space-6)',\n maxWidth: '64rem',\n }}\n >\n <div style={{ display: 'grid', gap: 'var(--cascivo-space-2)' }}>\n <Heading level={1}>${section.label}</Heading>\n <Text muted>\n Edit <code>src/sections/${section.component}.tsx</code> to build out this page.\n </Text>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Get started</CardTitle>\n </CardHeader>\n <CardContent>\n <Text>\n This page is wired into the app shell. Add components with{' '}\n <code>npx cascivo add <component></code>.\n </Text>\n </CardContent>\n </Card>\n </div>\n )\n}\n`\n}\n\nfunction cascivoConfig(opts: ScaffoldOptions): string {\n return `import type { CascadeConfig } from 'cascivo'\n\nconst config: CascadeConfig = {\n registry: '${CASCIVO_HOST}/registry.json',\n outputDir: 'src/components/ui',\n theme: '${opts.theme}',\n}\n\nexport default config\n`\n}\n\nfunction gitignore(): string {\n return `node_modules\ndist\n*.local\n.DS_Store\n`\n}\n\nfunction readme(opts: ScaffoldOptions): string {\n return `# ${opts.name}\n\nA [cascivo](https://cascivo.com) app — Vite + React + TypeScript, pre-wired with\nthe cascivo app shell, side navigation, and the \\`${opts.theme}\\` theme.\n\n## Develop\n\n\\`\\`\\`sh\nnpm install\nnpm run dev\n\\`\\`\\`\n\n## Structure\n\n- \\`src/App.tsx\\` — app shell, navigation, and section routing\n- \\`src/sections/\\` — one component per nav item\n\nAdd more components with \\`npx cascivo add <component>\\`.\n`\n}\n\n/** Build the full set of files for a new cascivo app. Pure — no filesystem I/O. */\nexport function buildScaffold(opts: ScaffoldOptions): ScaffoldFile[] {\n const sections = resolveSections(opts.sections)\n return [\n { path: 'package.json', contents: packageJson(opts) },\n { path: 'tsconfig.json', contents: tsconfig() },\n { path: 'vite.config.ts', contents: viteConfig() },\n { path: 'index.html', contents: indexHtml(opts) },\n { path: 'cascivo.config.ts', contents: cascivoConfig(opts) },\n { path: '.gitignore', contents: gitignore() },\n { path: 'README.md', contents: readme(opts) },\n { path: 'src/main.tsx', contents: mainTsx() },\n { path: 'src/vite-env.d.ts', contents: viteEnv() },\n { path: 'src/App.tsx', contents: appTsx(opts, sections) },\n ...sections.map((s) => ({\n path: `src/sections/${s.component}.tsx`,\n contents: sectionTsx(s),\n })),\n ]\n}\n\nfunction flagValue(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\nconst DEFAULT_SECTIONS = ['Dashboard', 'Reports', 'Settings']\n\nexport async function create(args: string[], cwd: string = process.cwd()): Promise<void> {\n const yes = args.includes('--yes') || args.includes('-y')\n const nameArg = args.find((a) => !a.startsWith('-'))\n const themeArg = flagValue(args, 'theme')\n const sectionsArg = flagValue(args, 'sections')\n\n const interactive = !yes && stdin.isTTY\n const rl = interactive ? createInterface({ input: stdin, output: stdout }) : null\n\n try {\n let name = nameArg\n if (!name && rl) {\n name = (await rl.question('Project name? [my-cascivo-app]: ')).trim()\n }\n name = name || 'my-cascivo-app'\n\n let theme = (themeArg ?? '').toLowerCase()\n if (!(THEMES as readonly string[]).includes(theme) && rl) {\n theme = (await rl.question(`Theme? (${THEMES.join('/')}) [light]: `)).trim().toLowerCase()\n }\n const resolvedTheme: ThemeName = (THEMES as readonly string[]).includes(theme)\n ? (theme as ThemeName)\n : 'light'\n\n let sectionsInput = sectionsArg\n if (!sectionsInput && rl) {\n sectionsInput = (\n await rl.question(`Nav sections? (comma-separated) [${DEFAULT_SECTIONS.join(', ')}]: `)\n ).trim()\n }\n const sections = (sectionsInput ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n\n const opts: ScaffoldOptions = {\n name,\n theme: resolvedTheme,\n sections: sections.length > 0 ? sections : DEFAULT_SECTIONS,\n }\n\n const targetDir = join(cwd, name)\n if (existsSync(targetDir) && readdirSync(targetDir).length > 0) {\n console.error(`Target directory \"${name}\" already exists and is not empty.`)\n process.exitCode = 1\n return\n }\n\n const files = buildScaffold(opts)\n for (const file of files) {\n await writeFileSafe(join(targetDir, file.path), file.contents)\n }\n\n console.log(`\\nCreated ${name} with the ${resolvedTheme} theme (${files.length} files).`)\n\n const templateSpec = flagValue(args, 'template')\n if (templateSpec) {\n const { add } = await import('./add.js')\n const { loadConfig } = await import('../utils/config.js')\n console.log(`\\nInstalling template \"${templateSpec}\"…`)\n await add([templateSpec], await loadConfig(), { cwd: targetDir })\n }\n\n console.log('\\nNext steps:')\n console.log(` cd ${name}`)\n console.log(' npm install')\n console.log(' npm run dev')\n } finally {\n rl?.close()\n }\n}\n","import { readFileSync, readdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport interface DoctorViolation {\n file: string\n rule: string\n detail: string\n}\n\nexport interface DoctorResult {\n violations: DoctorViolation[]\n passed: boolean\n}\n\nconst BANNED_HOOKS = ['useState', 'useEffect', 'useLayoutEffect', 'useContext', 'useReducer']\n\n/**\n * Blank out comments and string/template-literal contents so identifier scans\n * only match real code. A mention of `useEffect` in a comment must not trip\n * the no-react-hooks rule. Single pass — a `//` inside a string (URLs) is not\n * treated as a comment.\n */\nexport function stripCommentsAndStrings(source: string): string {\n let out = ''\n let i = 0\n const n = source.length\n while (i < n) {\n const c = source[i]!\n const next = source[i + 1]\n if (c === '/' && next === '/') {\n while (i < n && source[i] !== '\\n') i++\n } else if (c === '/' && next === '*') {\n i += 2\n while (i < n && !(source[i] === '*' && source[i + 1] === '/')) i++\n i += 2\n } else if (c === \"'\" || c === '\"') {\n i++\n while (i < n && source[i] !== c) {\n if (source[i] === '\\\\') i++\n i++\n }\n i++\n out += c + c\n } else if (c === '`') {\n i++\n while (i < n && source[i] !== '`') {\n if (source[i] === '\\\\') i++\n i++\n }\n i++\n out += '``'\n } else {\n out += c\n i++\n }\n }\n return out\n}\n\nexport async function runDoctor(root: string): Promise<DoctorResult> {\n const violations: DoctorViolation[] = []\n const componentsDir = join(root, 'packages', 'components', 'src')\n if (!existsSync(componentsDir)) return { violations: [], passed: true }\n\n const components = readdirSync(componentsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n\n const reactIndex = join(root, 'packages', 'react', 'src', 'index.ts')\n const indexContent = existsSync(reactIndex) ? readFileSync(reactIndex, 'utf8') : ''\n\n for (const name of components) {\n const tsxPath = join(componentsDir, name, `${name}.tsx`)\n if (!existsSync(tsxPath)) continue\n const content = readFileSync(tsxPath, 'utf8')\n // Hook scan runs on code only; the aria-label scan below needs the\n // original source because it matches inside JSX string attributes.\n const code = stripCommentsAndStrings(content)\n\n for (const hook of BANNED_HOOKS) {\n if (new RegExp(`\\\\b${hook}\\\\b`).test(code)) {\n violations.push({\n file: tsxPath,\n rule: 'no-react-hooks',\n detail: `Banned hook '${hook}' in ${name}.tsx`,\n })\n }\n }\n\n if (/aria-label=\"[A-Z]/.test(content)) {\n violations.push({\n file: tsxPath,\n rule: 'no-hardcoded-strings',\n detail: `Hardcoded aria-label in ${name}.tsx — use t(builtin.*)`,\n })\n }\n\n if (!new RegExp(`from.*components/src/${name}`).test(indexContent)) {\n violations.push({\n file: tsxPath,\n rule: 'missing-react-export',\n detail: `${name} not exported from @cascivo/react`,\n })\n }\n }\n\n return { violations, passed: violations.length === 0 }\n}\n","import { writeFileSync } from 'node:fs'\nimport { basename, dirname, join } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry } from '../utils/registry.js'\n\n// Inline validation types to avoid runtime dep on @cascivo/render\ninterface PropMeta {\n name: string\n type: string\n required?: boolean\n default?: string\n}\n\ninterface ComponentNode {\n component: string\n props?: Record<string, unknown>\n bind?: Record<string, string>\n events?: Record<string, string>\n children?: ComponentNode[] | string | { $t: string; params?: Record<string, string | number> }\n}\n\ninterface ViewConfig {\n view: {\n layout?: string\n regions: Record<string, ComponentNode[]>\n }\n}\n\nfunction isTranslationRef(v: unknown): v is { $t: string } {\n return typeof v === 'object' && v !== null && '$t' in v\n}\n\nfunction serializeProp(value: unknown): string {\n if (typeof value === 'string') return `\"${value.replace(/\"/g, '\\\\\"')}\"`\n if (typeof value === 'number' || typeof value === 'boolean') return `{${value}}`\n if (value === null) return `{null}`\n if (isTranslationRef(value))\n return `{\"${(value as { $t: string }).$t}\"} {/* i18n: ${(value as { $t: string }).$t} */}`\n return `{${JSON.stringify(value)}}`\n}\n\nfunction renderChildren(\n children: ComponentNode['children'],\n indent: string,\n componentPropNames: string[],\n knownComponents: Set<string>,\n): string {\n if (children === undefined) return ''\n if (typeof children === 'string') return children\n if (isTranslationRef(children)) {\n const key = (children as { $t: string }).$t\n return `{/* i18n: ${key} */}`\n }\n if (Array.isArray(children)) {\n return children\n .map((child) =>\n renderNode(child as ComponentNode, indent + ' ', componentPropNames, knownComponents),\n )\n .join('\\n')\n }\n return ''\n}\n\nfunction renderNode(\n node: ComponentNode,\n indent: string,\n _parentPropNames: string[],\n knownComponents: Set<string>,\n): string {\n const compName = node.component\n knownComponents.add(compName)\n const propParts: string[] = []\n\n if (node.props) {\n for (const [k, v] of Object.entries(node.props)) {\n propParts.push(`${k}=${serializeProp(v)}`)\n }\n }\n\n if (node.bind) {\n for (const [k, ref] of Object.entries(node.bind)) {\n const path = ref.replace(/^\\$data\\./, '').replace(/\\./g, '.')\n propParts.push(`${k}={data.${path}}`)\n }\n }\n\n if (node.events) {\n for (const [k, ref] of Object.entries(node.events)) {\n const actionName = ref.replace(/^\\$actions\\./, '')\n propParts.push(`${k}={actions.${actionName}}`)\n }\n }\n\n const propsStr = propParts.length > 0 ? ' ' + propParts.join(' ') : ''\n const childrenStr =\n node.children !== undefined\n ? renderChildren(node.children, indent, [], knownComponents)\n : undefined\n\n if (childrenStr !== undefined && childrenStr !== '') {\n return `${indent}<${compName}${propsStr}>\\n${indent} ${childrenStr}\\n${indent}</${compName}>`\n }\n return `${indent}<${compName}${propsStr} />`\n}\n\nfunction collectBindAndEvents(nodes: ComponentNode[]): {\n boundProps: string[]\n actionProps: string[]\n} {\n const boundProps: string[] = []\n const actionProps: string[] = []\n function walk(node: ComponentNode) {\n if (node.bind) {\n for (const ref of Object.values(node.bind)) {\n const path = ref.replace(/^\\$data\\./, '')\n if (!boundProps.includes(path)) boundProps.push(path)\n }\n }\n if (node.events) {\n for (const ref of Object.values(node.events)) {\n const name = ref.replace(/^\\$actions\\./, '')\n if (!actionProps.includes(name)) actionProps.push(name)\n }\n }\n if (Array.isArray(node.children)) {\n node.children.forEach(walk)\n }\n }\n nodes.forEach(walk)\n return { boundProps, actionProps }\n}\n\nfunction generateTsx(\n config: ViewConfig,\n _propMetas: Map<string, PropMeta[]>,\n componentsPath: string,\n): string {\n const knownComponents = new Set<string>()\n const allNodes = Object.values(config.view.regions).flat()\n const { boundProps, actionProps } = collectBindAndEvents(allNodes)\n\n const regionBlocks = Object.entries(config.view.regions)\n .map(([regionName, nodes]) => {\n const rendered = nodes.map((n) => renderNode(n, ' ', [], knownComponents)).join('\\n')\n return ` <div className=\"region-${regionName}\">\\n${rendered}\\n </div>`\n })\n .join('\\n')\n\n const importLines = [...knownComponents]\n .sort()\n .map((c) => `import { ${c} } from '${componentsPath}/${c.toLowerCase()}/${c.toLowerCase()}'`)\n .join('\\n')\n\n const hasData = boundProps.length > 0\n const hasActions = actionProps.length > 0\n\n const dataParam = hasData\n ? `data: {\\n${boundProps.map((p) => ` ${p.replace(/\\./g, '_')}: unknown // TODO: type your data`).join('\\n')}\\n }`\n : ''\n\n const actionsParam = hasActions\n ? `actions: {\\n${actionProps.map((a) => ` ${a}: (...args: unknown[]) => unknown`).join('\\n')}\\n }`\n : ''\n\n const params = [dataParam, actionsParam].filter(Boolean).join(',\\n ')\n const propsType = params ? `{\\n ${params}\\n}` : '{}'\n\n return `import React from 'react'\n${importLines}\n\ninterface PageProps ${propsType}\n\nexport function GeneratedPage({ ${hasData ? 'data, ' : ''}${hasActions ? 'actions' : ''} }: PageProps) {\n return (\n <div className=\"cascade-view\">\n${regionBlocks}\n </div>\n )\n}\n`\n}\n\nexport async function generate(args: string[], config: CascadeConfig): Promise<void> {\n const outArg = args.find((_, i) => args[i - 1] === '--out')\n const inputArg = args.find((a) => !a.startsWith('--'))\n const componentsDirArg = args.find((_, i) => args[i - 1] === '--components-dir')\n\n if (!inputArg) {\n console.error(\n 'Usage: cascivo generate <config.json> [--out output.tsx] [--components-dir ./src/components/ui]',\n )\n process.exitCode = 1\n return\n }\n\n const { readFileSync } = await import('node:fs')\n const configJson = readFileSync(inputArg, 'utf-8')\n const viewConfig = JSON.parse(configJson) as ViewConfig\n\n // prop metas not available from CLI registry type — pass empty map\n const _registry = await fetchRegistry(config.registry)\n const propMetas = new Map<string, PropMeta[]>()\n\n const componentsDir = componentsDirArg ?? config.outputDir ?? './src/components/ui'\n const tsx = generateTsx(viewConfig, propMetas, componentsDir)\n\n const outPath = outArg ?? join(dirname(inputArg), `${basename(inputArg, '.json')}.tsx`)\n\n writeFileSync(outPath, tsx, 'utf-8')\n console.log(`Generated ${outPath}`)\n\n // Try to format with vp fmt or prettier\n try {\n const { spawnSync } = await import('node:child_process')\n const fmtResult = spawnSync('pnpm', ['exec', 'vp', 'fmt', outPath], {\n encoding: 'utf8',\n stdio: 'inherit',\n })\n if (fmtResult.status !== 0) {\n const prettyResult = spawnSync('npx', ['--yes', 'prettier', '--write', outPath], {\n encoding: 'utf8',\n stdio: 'inherit',\n })\n if (prettyResult.status !== 0) {\n console.log('(Note: formatter not found — output may need manual formatting)')\n }\n }\n } catch {\n // formatting is best-effort\n }\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport { join } from 'node:path'\nimport { DEFAULT_CONFIG, THEMES, type ThemeName } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nfunction flagValue(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\nasync function promptTheme(): Promise<ThemeName> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question(`Theme? (${THEMES.join('/')}) [light]: `))\n .trim()\n .toLowerCase()\n return (THEMES as readonly string[]).includes(answer) ? (answer as ThemeName) : 'light'\n } finally {\n rl.close()\n }\n}\n\nfunction configFileContents(theme: ThemeName): string {\n return `import type { CascadeConfig } from 'cascivo'\n\nconst config: CascadeConfig = {\n registry: '${DEFAULT_CONFIG.registry}',\n outputDir: '${DEFAULT_CONFIG.outputDir}',\n theme: '${theme}',\n}\n\nexport default config\n`\n}\n\nexport async function init(args: string[] = [], cwd: string = process.cwd()): Promise<void> {\n const yes = args.includes('--yes') || args.includes('-y')\n const themeArg = flagValue(args, 'theme')?.toLowerCase()\n\n if (themeArg !== undefined && !(THEMES as readonly string[]).includes(themeArg)) {\n console.error(`Unknown theme \"${themeArg}\". Available: ${THEMES.join(', ')}`)\n process.exitCode = 1\n return\n }\n\n installPackages(['@cascivo/core', '@cascivo/tokens'], cwd)\n\n // Prompt only when interactive: --yes, a valid --theme, or a non-TTY stdin\n // (CI, agents, pipes) all take the default without blocking.\n const interactive = themeArg === undefined && !yes && stdin.isTTY\n const theme: ThemeName = (themeArg as ThemeName) ?? (interactive ? await promptTheme() : 'light')\n\n const configPath = join(cwd, 'cascivo.config.ts')\n await writeFileSafe(configPath, configFileContents(theme))\n\n console.log(`\\nCreated cascivo.config.ts (theme: ${theme})`)\n console.log('Import the theme in your root CSS or entry file:')\n console.log(` import '@cascivo/themes/${theme}.css'`)\n console.log(`Then set the theme on your root element:`)\n console.log(` <html data-theme=\"${theme}\">`)\n console.log('\\nAdd components with: cascivo add <name>')\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry, type RegistryComponent } from '../utils/registry.js'\n\nexport interface ListOptions {\n installed?: boolean\n}\n\nconst TYPE_LABELS: Record<string, string> = {\n component: 'Components',\n layout: 'Layouts (copy-paste)',\n block: 'Blocks (copy-paste)',\n section: 'Sections (copy-paste)',\n chart: 'Charts (npm: @cascivo/charts)',\n flow: 'Flow (npm: @cascivo/flow)',\n editor: 'Editor (npm: @cascivo/editor)',\n}\n\n/** Render a group of entries as an aligned text table (no section header). */\nfunction formatGroup(entries: RegistryComponent[]): string {\n const rows = entries.map((c) => [c.name, c.category, c.description] as const)\n const headers = ['Name', 'Category', 'Description'] as const\n const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)))\n\n const line = (cells: readonly string[]) =>\n cells\n .map((cell, i) => cell.padEnd(widths[i] ?? cell.length))\n .join(' ')\n .trimEnd()\n\n const sep = widths.map((w) => '-'.repeat(w)).join(' ')\n return [line(headers), sep, ...rows.map(line)].join('\\n')\n}\n\n/** Render the component list as an aligned text table, grouped by type. */\nexport function formatList(components: RegistryComponent[]): string {\n if (components.length === 0) return 'No components found.'\n\n // Determine whether any entry has an explicit type — if not, render flat.\n const hasTypes = components.some((c) => c.type !== undefined)\n if (!hasTypes) return formatGroup(components)\n\n // Group by type, preserving insertion order of first occurrence.\n const groups = new Map<string, RegistryComponent[]>()\n for (const c of components) {\n const key = c.type ?? 'component'\n if (!groups.has(key)) groups.set(key, [])\n groups.get(key)!.push(c)\n }\n\n const sections: string[] = []\n for (const [key, entries] of groups) {\n const label = TYPE_LABELS[key] ?? key\n sections.push(`${label}\\n${formatGroup(entries)}`)\n }\n return sections.join('\\n\\n')\n}\n\nexport async function list(config: CascadeConfig, options: ListOptions = {}): Promise<void> {\n const registry = await fetchRegistry(config.registry)\n let components = registry.components\n\n if (options.installed) {\n components = components.filter((c) => {\n const outputName = c.name.includes('/') ? c.name.split('/').pop()! : c.name\n return existsSync(join(process.cwd(), config.outputDir, outputName))\n })\n }\n\n console.log(formatList(components))\n console.log(\n '\\nTip: install any entry by its bare name — `cascivo add stack` resolves to ' +\n '`layout/stack`. Layout primitives (Stack, Grid, AutoGrid, Columns, Spacer, ' +\n 'Center) replace inline-style layout; see docs/cookbooks/layout-and-spacing.md.',\n )\n}\n","import { existsSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { resolve, dirname } from 'node:path'\nimport {\n buildRegistry,\n validateIndex,\n parseLegacyRegistry,\n isTemplateItem,\n validateTemplate,\n type RegistryIndex,\n} from '@cascivo/registry'\n\n/**\n * Validate every template item in an index: each must pass `validateTemplate`,\n * and any bare `registryDependencies` not present in the same index produce a\n * warning (they are expected to resolve from another registry at install time).\n * Returns `{ errors, warnings }`.\n */\nexport function validateTemplates(index: RegistryIndex): { errors: string[]; warnings: string[] } {\n const errors: string[] = []\n const warnings: string[] = []\n const localNames = new Set(index.items.map((i) => i.name))\n\n for (const item of index.items) {\n if (!isTemplateItem(item)) continue\n for (const e of validateTemplate(item)) errors.push(`template \"${item.name}\": ${e}`)\n for (const dep of item.registryDependencies ?? []) {\n const isCrossRegistry = dep.includes('/') || dep.startsWith('@') || dep.startsWith('http')\n if (!isCrossRegistry && !localNames.has(dep)) {\n warnings.push(\n `template \"${item.name}\": component \"${dep}\" is not in this index — it must resolve from another registry at install time`,\n )\n }\n }\n }\n\n return { errors, warnings }\n}\n\nexport async function registryBuild(args: string[]): Promise<void> {\n let inFile = 'cascade-registry.json'\n let outDir = 'public/r'\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--in' && args[i + 1]) {\n inFile = args[i + 1]!\n i++\n } else if (args[i] === '--out' && args[i + 1]) {\n outDir = args[i + 1]!\n i++\n }\n }\n\n const inPath = resolve(inFile)\n if (!existsSync(inPath)) {\n console.error(`cascade registry build: file not found: ${inPath}`)\n process.exitCode = 1\n return\n }\n\n const raw = JSON.parse(await readFile(inPath, 'utf8')) as unknown\n const indexBase = dirname(inPath)\n void indexBase\n\n let index = (() => {\n if (\n typeof raw === 'object' &&\n raw !== null &&\n (raw as Record<string, unknown>)['schemaVersion'] === 2\n ) {\n return raw\n }\n return parseLegacyRegistry(raw)\n })()\n\n const result = validateIndex(index)\n if (result.warnings.length > 0) {\n for (const w of result.warnings) console.warn(`warn: ${w}`)\n }\n if (!result.ok) {\n for (const e of result.errors) console.error(`error: ${e}`)\n process.exitCode = 1\n return\n }\n\n const templateResult = validateTemplates(index as RegistryIndex)\n for (const w of templateResult.warnings) console.warn(`warn: ${w}`)\n if (templateResult.errors.length > 0) {\n for (const e of templateResult.errors) console.error(`error: ${e}`)\n process.exitCode = 1\n return\n }\n\n const outPath = resolve(outDir)\n await buildRegistry(index as Parameters<typeof buildRegistry>[0], outPath)\n console.log(`cascade registry build: wrote static output to ${outPath}`)\n}\n","import type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry } from '../utils/registry.js'\nimport { fetchJson } from '../utils/http.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\ninterface SearchResult {\n name: string\n version: string\n description: string\n registry?: string\n}\n\nfunction matchesQuery(item: RegistryItem, query: string): boolean {\n const q = query.toLowerCase()\n return (\n item.name.toLowerCase().includes(q) ||\n item.description.toLowerCase().includes(q) ||\n item.tags.some((t) => t.toLowerCase().includes(q))\n )\n}\n\nexport async function search(args: string[], config: CascadeConfig): Promise<void> {\n const nsFlag = args.indexOf('--registry')\n const registryFilter = nsFlag !== -1 ? args[nsFlag + 1] : undefined\n const queryParts = args.filter((a, i) => a !== '--registry' && args[i - 1] !== '--registry')\n const query = queryParts.join(' ').trim()\n\n if (!query) {\n console.error('Usage: cascivo search <query> [--registry @ns]')\n return\n }\n\n const results: SearchResult[] = []\n\n if (!registryFilter) {\n // Search default registry\n const registry = await fetchRegistry(config.registry)\n for (const c of registry.components) {\n const item = c as unknown as RegistryItem\n if (matchesQuery(item, query)) {\n results.push({ name: c.name, version: c.version, description: c.description })\n }\n }\n }\n\n // Search configured namespace registries\n const registries = config.registries ?? {}\n for (const [ns, nsCfg] of Object.entries(registries)) {\n if (registryFilter && ns !== registryFilter) continue\n try {\n const template = typeof nsCfg === 'string' ? nsCfg : nsCfg.url\n const indexUrl = template.replace(/{name}[^$]*$/, '').replace(/\\/$/, '') + '/registry.json'\n const raw = (await fetchJson(indexUrl)) as { items?: RegistryItem[] }\n for (const item of raw.items ?? []) {\n if (matchesQuery(item, query)) {\n results.push({\n name: `${ns}/${item.name}`,\n version: item.version,\n description: item.description,\n registry: ns,\n })\n }\n }\n } catch {\n console.warn(` [warn] Could not search ${ns} registry`)\n }\n }\n\n if (results.length === 0) {\n console.log('No results found.')\n return\n }\n\n for (const r of results) {\n const reg = r.registry ? ` (${r.registry})` : ''\n console.log(`${r.name}@${r.version}${reg} — ${r.description}`)\n }\n}\n","export type FontFamily = 'system' | 'geometric' | 'humanist' | 'transitional' | 'mono'\n\nexport const RADIUS_STOPS = [0, 0.25, 0.375, 0.5, 0.75, 1.5] as const\nexport type RadiusStop = (typeof RADIUS_STOPS)[number]\n\nexport const RADIUS_LABELS: Record<RadiusStop, string> = {\n 0: 'none',\n 0.25: 'sm',\n 0.375: 'md',\n 0.5: 'lg',\n 0.75: 'xl',\n 1.5: 'pill',\n}\n\nexport type ThemeConfig = {\n baseMode: 'light' | 'dark'\n accentHue: number\n accentChroma: number\n radiusBase: RadiusStop\n fontFamily: FontFamily\n presetId: string | null\n}\n\nexport const DEFAULT_CONFIG: ThemeConfig = {\n baseMode: 'light',\n accentHue: 250,\n accentChroma: 0.2,\n radiusBase: 0.375,\n fontFamily: 'system',\n presetId: 'light',\n}\n","import { DEFAULT_CONFIG, type ThemeConfig } from './config.js'\n\n/** Encode a theme config as a URL-safe base64 string (shared by the /create URL\n * hash and the CLI `--from` handoff, so the two never drift). */\nexport function configToHash(config: ThemeConfig): string {\n const json = JSON.stringify(config)\n return btoa(json).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Decode a hash produced by {@link configToHash}. Returns null on malformed\n * input; unknown/missing fields fall back to {@link DEFAULT_CONFIG}. */\nexport function hashToConfig(hash: string): ThemeConfig | null {\n if (!hash) return null\n try {\n const base64 = hash.replace(/-/g, '+').replace(/_/g, '/')\n const json = atob(base64)\n const parsed = JSON.parse(json) as Partial<ThemeConfig>\n return {\n baseMode: parsed.baseMode === 'dark' ? 'dark' : 'light',\n accentHue: typeof parsed.accentHue === 'number' ? parsed.accentHue : DEFAULT_CONFIG.accentHue,\n accentChroma:\n typeof parsed.accentChroma === 'number' ? parsed.accentChroma : DEFAULT_CONFIG.accentChroma,\n radiusBase: (typeof parsed.radiusBase === 'number'\n ? parsed.radiusBase\n : DEFAULT_CONFIG.radiusBase) as ThemeConfig['radiusBase'],\n fontFamily: parsed.fontFamily ?? DEFAULT_CONFIG.fontFamily,\n presetId: parsed.presetId ?? null,\n }\n } catch {\n return null\n }\n}\n","import type { ThemeConfig } from './config.js'\n\nconst FONT_STACKS: Record<string, string> = {\n geometric: \"'Futura', 'Century Gothic', 'Trebuchet MS', ui-sans-serif, sans-serif\",\n humanist: \"'Gill Sans', 'Trebuchet MS', 'Calibri', ui-sans-serif, sans-serif\",\n transitional: \"'Optima', 'Candara', 'Palatino Linotype', ui-sans-serif, sans-serif\",\n mono: \"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace\",\n}\n\n// Resolved concrete values from packages/themes/src/light.css + primitives\nconst BASE_LIGHT = `\n color-scheme: light;\n --cascivo-color-background: oklch(1 0 0);\n --cascivo-color-surface: oklch(0.985 0.002 264);\n --cascivo-color-surface-2: oklch(0.967 0.003 264);\n --cascivo-color-bg: var(--cascivo-color-background);\n --cascivo-color-bg-subtle: var(--cascivo-color-surface);\n --cascivo-color-surface-raised: var(--cascivo-color-surface);\n --cascivo-color-surface-overlay: var(--cascivo-color-background);\n --cascivo-color-border: oklch(0.928 0.006 264);\n --cascivo-color-border-strong: oklch(0.872 0.008 264);\n --cascivo-border-subtle: oklch(0.928 0.006 264);\n --cascivo-border-default: oklch(0.872 0.008 264);\n --cascivo-border-strong: oklch(0.707 0.015 264);\n --cascivo-color-foreground: oklch(0.145 0.005 264);\n --cascivo-color-foreground-muted: oklch(0.554 0.018 264);\n --cascivo-color-text: var(--cascivo-color-foreground);\n --cascivo-color-text-subtle: oklch(0.446 0.018 264);\n --cascivo-color-text-muted: oklch(0.707 0.015 264);\n --cascivo-color-text-on-accent: oklch(1 0 0);\n --cascivo-color-text-on-destructive: oklch(1 0 0);\n --cascivo-color-primary: oklch(0.205 0 0);\n --cascivo-color-primary-fg: oklch(0.985 0 0);\n --cascivo-color-primary-hover: oklch(0.27 0 0);\n --cascivo-color-primary-active: oklch(0.32 0 0);\n --cascivo-color-active-bg: oklch(0.145 0.005 264 / 6%);\n --cascivo-color-destructive: oklch(0.54 0.188 22);\n --cascivo-color-destructive-hover: oklch(0.448 0.17 22);\n --cascivo-color-destructive-subtle: oklch(0.971 0.013 22);\n --cascivo-color-error: oklch(0.628 0.188 22);\n --cascivo-color-warning: oklch(0.768 0.145 75);\n --cascivo-color-success: oklch(0.648 0.15 145);\n --cascivo-color-success-subtle: oklch(0.982 0.018 145);\n --cascivo-color-warning-subtle: oklch(0.98 0.02 75);\n --cascivo-color-info: oklch(0.546 0.224 250);\n --cascivo-color-info-subtle: oklch(0.97 0.025 250);\n --cascivo-color-success-foreground: oklch(0.45 0.14 145);\n --cascivo-color-warning-foreground: oklch(0.5 0.14 75);\n --cascivo-shadow-xs: 0 1px 2px oklch(0 0 0 / 0.05);\n --cascivo-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.07), 0 1px 2px oklch(0 0 0 / 0.04);\n --cascivo-shadow-md: 0 2px 8px oklch(0 0 0 / 0.07), 0 1px 2px oklch(0 0 0 / 0.04);\n --cascivo-shadow-overlay: 0 4px 32px oklch(0 0 0 / 0.16), 0 0 0 1px oklch(0 0 0 / 0.04);\n --cascivo-shadow-lg: var(--cascivo-shadow-overlay);\n --cascivo-ring-width: 2px;\n --cascivo-ring-offset: 0px;\n --cascivo-ring-color: color-mix(in oklch, var(--cascivo-color-accent) 55%, transparent);\n --cascivo-focus-ring: 0 0 0 var(--cascivo-ring-width) var(--cascivo-ring-color);`\n\n// Resolved concrete values from packages/themes/src/dark.css + primitives\nconst BASE_DARK = `\n color-scheme: dark;\n --cascivo-color-background: oklch(0.145 0.005 250);\n --cascivo-color-surface: oklch(0.185 0.007 250);\n --cascivo-color-surface-2: oklch(0.22 0.008 250);\n --cascivo-color-bg: var(--cascivo-color-background);\n --cascivo-color-bg-subtle: var(--cascivo-color-surface);\n --cascivo-color-surface-raised: var(--cascivo-color-surface-2);\n --cascivo-color-surface-overlay: var(--cascivo-color-surface);\n --cascivo-color-border: oklch(1 0 0 / 10%);\n --cascivo-color-border-strong: oklch(1 0 0 / 16%);\n --cascivo-border-subtle: oklch(1 0 0 / 0.06);\n --cascivo-border-default: oklch(1 0 0 / 0.1);\n --cascivo-border-strong: oklch(1 0 0 / 0.2);\n --cascivo-color-foreground: oklch(0.985 0.002 264);\n --cascivo-color-foreground-muted: oklch(0.707 0.015 264);\n --cascivo-color-text: var(--cascivo-color-foreground);\n --cascivo-color-text-subtle: oklch(0.707 0.015 264);\n --cascivo-color-text-muted: oklch(0.554 0.018 264);\n --cascivo-color-text-on-accent: oklch(0.145 0.005 250);\n --cascivo-color-text-on-destructive: oklch(1 0 0);\n --cascivo-color-primary: oklch(0.922 0 0);\n --cascivo-color-primary-fg: oklch(0.205 0 0);\n --cascivo-color-primary-hover: oklch(0.86 0 0);\n --cascivo-color-primary-active: oklch(0.8 0 0);\n --cascivo-color-active-bg: oklch(1 0 0 / 8%);\n --cascivo-color-destructive: oklch(0.72 0.16 22);\n --cascivo-color-destructive-hover: oklch(0.628 0.188 22);\n --cascivo-color-destructive-subtle: oklch(0.628 0.188 22 / 0.1);\n --cascivo-color-error: oklch(0.72 0.16 22);\n --cascivo-color-warning: oklch(0.82 0.13 75);\n --cascivo-color-success: oklch(0.72 0.13 145);\n --cascivo-color-success-subtle: oklch(0.72 0.13 145 / 0.1);\n --cascivo-color-warning-subtle: oklch(0.82 0.13 75 / 0.1);\n --cascivo-color-info: oklch(0.65 0.2 250);\n --cascivo-color-info-subtle: oklch(0.65 0.2 250 / 0.1);\n --cascivo-color-success-foreground: oklch(0.72 0.13 145);\n --cascivo-color-warning-foreground: oklch(0.82 0.13 75);\n --cascivo-shadow-xs: none;\n --cascivo-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.4);\n --cascivo-shadow-md: 0 2px 8px oklch(0 0 0 / 0.45);\n --cascivo-shadow-overlay: 0 4px 32px oklch(0 0 0 / 0.6), 0 0 0 1px oklch(1 0 0 / 0.06);\n --cascivo-shadow-lg: var(--cascivo-shadow-overlay);\n --cascivo-ring-width: 2px;\n --cascivo-ring-offset: 0px;\n --cascivo-ring-color: color-mix(in oklch, var(--cascivo-color-accent) 65%, transparent);\n --cascivo-focus-ring: 0 0 0 var(--cascivo-ring-width) var(--cascivo-ring-color);`\n\nexport interface ConfigToCSSOptions {\n /** When true, inline the full base theme token set so the block is\n * self-contained (used by the live preview). The exported theme omits these —\n * users import the base theme themselves. */\n previewMode?: boolean\n /** The `data-theme` selector value the generated tokens attach to. */\n themeName?: string\n}\n\nexport function configToCSS(config: ThemeConfig, options: ConfigToCSSOptions = {}): string {\n const { previewMode = false, themeName = 'create-custom' } = options\n const light = config.baseMode === 'light'\n const h = config.accentHue\n const c = config.accentChroma\n\n const acc = (l: number, chroma = c) => `oklch(${l} ${chroma.toFixed(3)} ${h})`\n\n const lines: string[] = [\n `/* Add to your project CSS after importing the base theme: */`,\n `/* @import '@cascivo/themes/${config.baseMode}.css'; */`,\n `/* @import './theme.css'; */`,\n ``,\n `@layer cascivo.theme {`,\n ` [data-theme=\"${themeName}\"] {`,\n ]\n\n if (previewMode) {\n lines.push(light ? BASE_LIGHT : BASE_DARK)\n lines.push(``)\n }\n\n lines.push(\n ` /* ── Accent ─────────────────────────────────── */`,\n ` --cascivo-color-accent: ${acc(light ? 0.52 : 0.65)};`,\n ` --cascivo-color-accent-foreground: ${light ? 'oklch(1 0 0)' : `oklch(0.145 0.005 ${h})`};`,\n ` --cascivo-color-accent-hover: ${acc(light ? 0.45 : 0.707)};`,\n ` --cascivo-color-accent-active: ${acc(light ? 0.373 : 0.808, Math.min(c, 0.155))};`,\n ` --cascivo-color-accent-subtle: ${acc(light ? 0.97 : 0.623, 0.025)};`,\n ` --cascivo-color-accent-muted: ${acc(light ? 0.932 : 0.623, light ? 0.055 : c * 0.2)};`,\n ``,\n ` /* ── Radius ─────────────────────────────────── */`,\n ` --cascivo-radius-base: ${config.radiusBase}rem;`,\n ` --cascivo-radius-control: var(--cascivo-radius-base);`,\n ` --cascivo-radius-surface: calc(var(--cascivo-radius-base) * 1.66);`,\n ` --cascivo-radius-indicator: calc(var(--cascivo-radius-base) / 2);`,\n ` --cascivo-radius-full: 9999px;`,\n ` --cascivo-radius-component: var(--cascivo-radius-base);`,\n ` --cascivo-radius-button: var(--cascivo-radius-base);`,\n ` --cascivo-radius-input: var(--cascivo-radius-base);`,\n ` --cascivo-radius-card: calc(var(--cascivo-radius-base) * 1.66);`,\n ` --cascivo-radius-badge: var(--cascivo-radius-full);`,\n ` --cascivo-radius-modal: calc(var(--cascivo-radius-base) * 2);`,\n )\n\n if (config.fontFamily !== 'system') {\n lines.push(``)\n lines.push(` /* ── Font ───────────────────────────────────── */`)\n lines.push(\n ` --cascivo-font-sans: ${FONT_STACKS[config.fontFamily] ?? FONT_STACKS['humanist']};`,\n )\n }\n\n lines.push(` }`)\n lines.push(`}`)\n\n return lines.join('\\n')\n}\n","import { resolve } from 'node:path'\nimport { configToCSS, hashToConfig } from '@cascivo/theme-kit'\nimport { THEMES } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nconst THEME_NAME_RE = /^[a-z][a-z0-9-]*$/\n\n/** Read a `--key value` or `--key=value` flag from an argv slice. */\nfunction flag(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\n/**\n * `cascivo theme create <name> --from <hash>` — turn a /create theme-builder\n * config (the `#hash` in the builder URL, or its \"Copy CLI command\" output) into\n * an owned `<name>.theme.css` in the project. Uses the same generator the builder\n * previews with, so the file matches the preview exactly.\n */\nasync function themeCreate(args: string[], cwd: string): Promise<void> {\n const name = args.find((a) => !a.startsWith('--'))\n const hash = flag(args, 'from')\n const dryRun = args.includes('--dry-run')\n\n if (!name || !hash) {\n console.error('Usage: cascivo theme create <name> --from <hash> [--out <path>]')\n console.error(\n 'Get <hash> from the theme builder at https://cascivo.com/create (Copy CLI command).',\n )\n return\n }\n if (!THEME_NAME_RE.test(name)) {\n console.error(`Invalid theme name \"${name}\". Use lowercase letters, digits, and dashes.`)\n return\n }\n\n const config = hashToConfig(hash)\n if (!config) {\n console.error('Could not decode --from. Copy the command again from the theme builder.')\n return\n }\n\n const css = configToCSS(config, { themeName: name })\n if (dryRun) {\n console.log(css)\n return\n }\n\n const outPath = resolve(cwd, flag(args, 'out') ?? `${name}.theme.css`)\n await writeFileSafe(outPath, css)\n\n console.log(`\\n✓ Wrote ${name}.theme.css`)\n console.log(`\\nImport the base theme and your overlay in your entry CSS:`)\n console.log(` @import '@cascivo/themes/${config.baseMode}.css';`)\n console.log(` @import './${name}.theme.css';`)\n console.log(`Then set it on a container:`)\n console.log(` <div data-theme=\"${name}\">…</div>`)\n}\n\nexport async function theme(args: string[]): Promise<void> {\n const [sub, name] = args\n\n if (sub === 'create') {\n await themeCreate(args.slice(1), process.cwd())\n return\n }\n\n if (sub !== 'add' || !name) {\n console.error(`Usage: cascivo theme add <${THEMES.join('|')}>`)\n console.error(` cascivo theme create <name> --from <hash>`)\n return\n }\n if (!(THEMES as readonly string[]).includes(name)) {\n console.error(`Unknown theme \"${name}\". Available: ${THEMES.join(', ')}`)\n return\n }\n\n installPackages(['@cascivo/themes'])\n\n console.log(`\\nImport the theme in your root CSS or entry file:`)\n console.log(` import '@cascivo/themes/${name}.css'`)\n console.log(`Then set it on a container:`)\n console.log(` <div data-theme=\"${name}\">…</div>`)\n}\n","/**\n * Minimal line-based diff (LCS) rendered in a unified-ish format. Zero deps —\n * good enough to preview what `cascade update` will change.\n */\nexport function diffLines(oldStr: string, newStr: string): string[] {\n const a = oldStr.split('\\n')\n const b = newStr.split('\\n')\n const n = a.length\n const m = b.length\n\n // LCS length table.\n const lcs: number[][] = Array.from({ length: n + 1 }, () =>\n Array.from({ length: m + 1 }, () => 0),\n )\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i]![j] =\n a[i] === b[j] ? lcs[i + 1]![j + 1]! + 1 : Math.max(lcs[i + 1]![j]!, lcs[i]![j + 1]!)\n }\n }\n\n const out: string[] = []\n let i = 0\n let j = 0\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n out.push(` ${a[i]}`)\n i++\n j++\n } else if (lcs[i + 1]![j]! >= lcs[i]![j + 1]!) {\n out.push(`- ${a[i]}`)\n i++\n } else {\n out.push(`+ ${b[j]}`)\n j++\n }\n }\n while (i < n) out.push(`- ${a[i++]}`)\n while (j < m) out.push(`+ ${b[j++]}`)\n return out\n}\n\n/** True when the two strings differ. */\nexport function hasChanges(oldStr: string, newStr: string): boolean {\n return oldStr !== newStr\n}\n","export interface MergeResult {\n text: string\n conflicts: number\n}\n\nfunction lcs(a: string[], b: string[]): number[][] {\n const m = a.length\n const n = b.length\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array.from({ length: n + 1 }, () => 0))\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i]![j] =\n a[i - 1] === b[j - 1] ? dp[i - 1]![j - 1]! + 1 : Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!)\n }\n }\n return dp\n}\n\ninterface Chunk {\n type: 'common' | 'left' | 'right'\n lines: string[]\n}\n\nfunction diff(base: string[], changed: string[]): Chunk[] {\n const dp = lcs(base, changed)\n const chunks: Chunk[] = []\n let i = base.length\n let j = changed.length\n const leftOnly: string[] = []\n const rightOnly: string[] = []\n const common: string[] = []\n\n function flush() {\n if (leftOnly.length > 0 || rightOnly.length > 0) {\n if (common.length > 0) {\n chunks.unshift({ type: 'common', lines: [...common] })\n common.length = 0\n }\n chunks.unshift({\n type: leftOnly.length > 0 ? 'left' : 'right',\n lines: leftOnly.length > 0 ? [...leftOnly] : [...rightOnly],\n })\n leftOnly.length = 0\n rightOnly.length = 0\n } else if (common.length > 0) {\n chunks.unshift({ type: 'common', lines: [...common] })\n common.length = 0\n }\n }\n\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && base[i - 1] === changed[j - 1]) {\n if (leftOnly.length > 0 || rightOnly.length > 0) flush()\n common.unshift(base[i - 1]!)\n i--\n j--\n } else if (j > 0 && (i === 0 || dp[i]![j - 1]! >= dp[i - 1]![j]!)) {\n flush()\n rightOnly.unshift(changed[j - 1]!)\n j--\n } else {\n flush()\n leftOnly.unshift(base[i - 1]!)\n i--\n }\n }\n flush()\n return chunks\n}\n\nexport function merge(base: string, local: string, upstream: string): MergeResult {\n const baseLines = base.split('\\n')\n const localLines = local.split('\\n')\n const upstreamLines = upstream.split('\\n')\n\n const localChunks = diff(baseLines, localLines)\n\n const localMap = new Map<string, string[]>()\n const upstreamMap = new Map<string, string[]>()\n\n let li = 0\n\n for (const c of localChunks) {\n if (c.type === 'left') {\n localMap.set(`del:${li}`, c.lines)\n } else if (c.type === 'right') {\n localMap.set(`ins:${li}`, c.lines)\n li += c.lines.length\n } else {\n li += c.lines.length\n }\n }\n void localMap\n void upstreamMap\n\n // Simple line-by-line three-way merge\n const result: string[] = []\n let conflicts = 0\n let bi = 0\n let lli = 0\n let uui = 0\n\n // Build index maps: base line → local and upstream lines\n // Use a simpler approach: if local == base, take upstream; if upstream == base, take local;\n // if both differ, conflict.\n const bLen = baseLines.length\n const lLen = localLines.length\n const uLen = upstreamLines.length\n\n // If local unchanged vs base, fast-forward to upstream\n if (local === base) {\n return { text: upstream, conflicts: 0 }\n }\n // If upstream unchanged vs base, keep local\n if (upstream === base) {\n return { text: local, conflicts: 0 }\n }\n // Both changed — try line-by-line\n void bi\n void lli\n void uui\n void bLen\n void lLen\n void uLen\n\n const localDiffs = diff(baseLines, localLines)\n const upstreamDiffs = diff(baseLines, upstreamLines)\n\n // Reconstruct base position aligned chunks\n let basePos = 0\n let lPos = 0\n let uPos = 0\n const localOut: { baseStart: number; baseEnd: number; lines: string[] }[] = []\n const upstreamOut: { baseStart: number; baseEnd: number; lines: string[] }[] = []\n\n for (const c of localDiffs) {\n if (c.type === 'common') {\n lPos += c.lines.length\n basePos += c.lines.length\n } else if (c.type === 'right') {\n localOut.push({ baseStart: basePos, baseEnd: basePos, lines: c.lines })\n lPos += c.lines.length\n } else {\n localOut.push({ baseStart: basePos, baseEnd: basePos + c.lines.length, lines: [] })\n basePos += c.lines.length\n }\n }\n basePos = 0\n for (const c of upstreamDiffs) {\n if (c.type === 'common') {\n uPos += c.lines.length\n basePos += c.lines.length\n } else if (c.type === 'right') {\n upstreamOut.push({ baseStart: basePos, baseEnd: basePos, lines: c.lines })\n uPos += c.lines.length\n } else {\n upstreamOut.push({ baseStart: basePos, baseEnd: basePos + c.lines.length, lines: [] })\n basePos += c.lines.length\n }\n }\n void lPos\n void uPos\n\n // Simple merge: walk base lines; apply local and upstream edits\n // When both touch the same region, emit conflict markers\n const localByBase = new Map<number, { end: number; lines: string[] }>()\n for (const e of localOut) {\n localByBase.set(e.baseStart, { end: e.baseEnd, lines: e.lines })\n }\n const upstreamByBase = new Map<number, { end: number; lines: string[] }>()\n for (const e of upstreamOut) {\n upstreamByBase.set(e.baseStart, { end: e.baseEnd, lines: e.lines })\n }\n\n let b = 0\n while (b <= baseLines.length) {\n const lEdit = localByBase.get(b)\n const uEdit = upstreamByBase.get(b)\n\n if (lEdit && uEdit) {\n const lEnd = Math.max(lEdit.end, b)\n const uEnd = Math.max(uEdit.end, b)\n const lLines = lEdit.lines\n const uLines = uEdit.lines\n if (JSON.stringify(lLines) === JSON.stringify(uLines)) {\n result.push(...lLines)\n } else {\n result.push('<<<<<<< local')\n result.push(...lLines)\n result.push('=======')\n result.push(...uLines)\n result.push('>>>>>>> upstream')\n conflicts++\n }\n b = Math.max(lEnd, uEnd, b + 1)\n } else if (lEdit) {\n result.push(...lEdit.lines)\n b = Math.max(lEdit.end, b + 1)\n } else if (uEdit) {\n result.push(...uEdit.lines)\n b = Math.max(uEdit.end, b + 1)\n } else {\n if (b < baseLines.length) result.push(baseLines[b]!)\n b++\n }\n }\n\n return { text: result.join('\\n'), conflicts }\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport { readFile } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { diffLines, hasChanges } from '../utils/diff.js'\nimport { readFileSafe, resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchRegistry, fileName, findComponent } from '../utils/registry.js'\nimport { readLock, writeLock, updateLockEntry } from '../utils/lock.js'\nimport { fetchJson, fetchTextRetry } from '../utils/http.js'\nimport { merge } from '../utils/merge.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question(`${question} (y/N): `)).trim().toLowerCase()\n return answer === 'y' || answer === 'yes'\n } finally {\n rl.close()\n }\n}\n\nexport async function update(\n name: string | undefined,\n config: CascadeConfig,\n opts: { check?: boolean; yes?: boolean } = {},\n): Promise<void> {\n if (opts.check) {\n return updateCheck(config)\n }\n\n if (!name) {\n console.error('Usage: cascivo update <component>')\n return\n }\n\n const lock = await readLock()\n const lockEntry = lock?.items[name]\n\n const registry = await fetchRegistry(config.registry)\n const entry = findComponent(registry, name)\n if (!entry) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n return\n }\n\n if (lockEntry) {\n // Three-way merge path\n const lockedVersion = lockEntry.version\n const registryBase = lockEntry.registry\n const baseItemUrl = `${registryBase}/r/${name}@${lockedVersion}.json`\n\n let baseItem: RegistryItem | null = null\n try {\n baseItem = (await fetchJson(baseItemUrl)) as RegistryItem\n } catch {\n console.warn(\n `Warning: could not fetch base version ${lockedVersion} from ${baseItemUrl}. Falling back to two-way diff.`,\n )\n }\n\n if (baseItem) {\n await threeWayUpdate(name, entry, baseItem, config, opts)\n } else {\n await twoWayUpdate(name, entry, config, opts)\n }\n } else {\n console.warn(\n `Warning: \"${name}\" has no lock entry. Falling back to two-way diff update (pre-v11 install).`,\n )\n await twoWayUpdate(name, entry, config, opts)\n }\n}\n\nasync function threeWayUpdate(\n name: string,\n upstreamEntry: ReturnType<typeof findComponent>,\n baseItem: RegistryItem,\n config: CascadeConfig,\n opts: { yes?: boolean },\n): Promise<void> {\n if (!upstreamEntry) return\n const outputName = name.includes('/') ? name.split('/').pop()! : name\n const summaries: { file: string; result: 'clean' | 'conflict' | 'unchanged' }[] = []\n const pending: { dest: string; content: string; conflicts: number }[] = []\n\n for (const url of upstreamEntry.files) {\n const fname = fileName(url)\n const baseFile = baseItem.files.find((f) => fileName(f.url) === fname)\n const dest = resolveOutputPath(config.outputDir, outputName, fname)\n\n const upstream = await fetchTextRetry(url)\n const local = existsSync(dest) ? await readFile(dest, 'utf8') : ''\n const base = baseFile ? await fetchTextRetry(baseFile.url) : ''\n\n if (base === '' && local === '') {\n summaries.push({ file: fname, result: 'clean' })\n pending.push({ dest, content: upstream, conflicts: 0 })\n continue\n }\n\n const { text, conflicts } = merge(base, local, upstream)\n\n if (conflicts > 0) {\n summaries.push({ file: fname, result: 'conflict' })\n } else if (text === local) {\n summaries.push({ file: fname, result: 'unchanged' })\n continue\n } else {\n summaries.push({ file: fname, result: 'clean' })\n }\n pending.push({ dest, content: text, conflicts })\n }\n\n if (pending.length === 0) {\n console.log(`${name} is already up to date.`)\n return\n }\n\n for (const s of summaries) {\n const icon = s.result === 'conflict' ? '⚠' : s.result === 'clean' ? '✓' : '·'\n console.log(` ${icon} ${s.file} (${s.result})`)\n }\n\n const conflicted = pending.filter((p) => p.conflicts > 0)\n const shouldApply = opts.yes\n ? conflicted.length === 0 // --yes skips items with conflicts\n : await confirm(`\\nApply ${pending.length} change(s) to ${name}?`)\n\n if (shouldApply || opts.yes) {\n const lock = await readLock()\n let updatedLock = lock\n\n for (const { dest, content, conflicts } of pending) {\n if (opts.yes && conflicts > 0) {\n console.log(` skipped (conflicts): ${dest}`)\n continue\n }\n await writeFileSafe(dest, content)\n }\n\n if (lock && updatedLock) {\n const hasConflicts = conflicted.length > 0\n updatedLock = updateLockEntry(updatedLock, name, {\n ...lock.items[name]!,\n version: upstreamEntry.version,\n ...(hasConflicts ? { conflicted: true as const } : {}),\n })\n await writeLock(updatedLock)\n }\n\n console.log(`Updated ${name}.`)\n if (conflicted.length > 0) {\n console.log(`${conflicted.length} file(s) have conflict markers — resolve them manually.`)\n }\n } else {\n console.log('Aborted. No files changed.')\n }\n}\n\nasync function twoWayUpdate(\n name: string,\n entry: ReturnType<typeof findComponent>,\n config: CascadeConfig,\n opts: { yes?: boolean },\n): Promise<void> {\n if (!entry) return\n const pending: { path: string; content: string }[] = []\n\n for (const url of entry.files) {\n let latest: string\n try {\n latest = await fetchTextRetry(url)\n } catch (e) {\n console.error(e instanceof Error ? e.message : String(e))\n return\n }\n const dest = resolveOutputPath(config.outputDir, entry.name, fileName(url))\n const current = await readFileSafe(dest)\n\n if (current === null) {\n console.log(`New file: ${dest}`)\n pending.push({ path: dest, content: latest })\n } else if (hasChanges(current, latest)) {\n console.log(`\\n--- ${dest}`)\n console.log(diffLines(current, latest).join('\\n'))\n pending.push({ path: dest, content: latest })\n }\n }\n\n if (pending.length === 0) {\n console.log(`${name} is already up to date.`)\n return\n }\n\n const shouldApply = opts.yes || (await confirm(`\\nApply ${pending.length} change(s) to ${name}?`))\n\n if (shouldApply) {\n for (const { path, content } of pending) {\n await writeFileSafe(path, content)\n }\n console.log(`Updated ${name}.`)\n } else {\n console.log('Aborted. No files changed.')\n }\n}\n\nasync function updateCheck(config: CascadeConfig): Promise<void> {\n const lock = await readLock()\n if (!lock || Object.keys(lock.items).length === 0) {\n console.log('No installed components found in cascivo.lock.')\n return\n }\n\n const registry = await fetchRegistry(config.registry)\n let outdated = 0\n\n for (const [name, entry] of Object.entries(lock.items)) {\n const current = findComponent(registry, name)\n if (!current) continue\n // Content hashes are the accurate signal (they change with every source\n // edit); the version compare is the fallback for older registries.\n if (current.fileHashes && Object.keys(current.fileHashes).length > 0) {\n const lockByBase = new Map(\n Object.entries(entry.files).map(([dest, hash]) => [dest.split('/').pop()!, hash]),\n )\n const changed = Object.entries(current.fileHashes).filter(\n ([file, hash]) => lockByBase.get(file) !== hash,\n )\n if (changed.length > 0) {\n console.log(\n `${name}: ${changed.length} file(s) changed upstream (${entry.version} → ${current.version})`,\n )\n outdated++\n }\n } else if (current.version !== entry.version) {\n console.log(`${name}: ${entry.version} → ${current.version}`)\n outdated++\n }\n }\n\n if (outdated > 0) {\n console.log(`${outdated} component(s) outdated.`)\n process.exitCode = 1\n } else {\n console.log('All components up to date.')\n }\n}\n","import type { CascadeConfig } from '../utils/config.js'\nimport { parseAddress, resolveItemUrl } from '../utils/resolve.js'\nimport { fetchJson } from '../utils/http.js'\nimport { asTemplateMeta, isTemplateItem, type RegistryItem } from '@cascivo/registry'\n\n/** Render an item's details as text. Pure, so it can be unit-tested. */\nexport function formatItem(item: RegistryItem): string {\n const lines: string[] = []\n lines.push(`\\n${item.name} v${item.version}`)\n lines.push(`Type: ${item.type}${item.category ? ` / ${item.category}` : ''}`)\n lines.push(item.description)\n if (item.author) lines.push(`Author: ${item.author}`)\n if (item.license) lines.push(`License: ${item.license}`)\n if (item.homepage) lines.push(`Homepage: ${item.homepage}`)\n\n if (item.install) {\n lines.push(`Distribution: npm package — pnpm add ${item.install}`)\n if (item.styles) lines.push(`Stylesheet: import '${item.styles}' (required)`)\n } else if (!isTemplateItem(item)) {\n lines.push(`Distribution: copy-paste — npx cascivo add ${item.name}`)\n }\n\n if (isTemplateItem(item)) {\n try {\n const meta = asTemplateMeta(item.meta)\n lines.push(`\\nTemplate: ${meta.intent}`)\n lines.push(`Framework: ${meta.framework}`)\n if (meta.demoUrl) lines.push(`Demo: ${meta.demoUrl}`)\n if (meta.pages?.length) {\n lines.push('Pages:')\n for (const p of meta.pages) lines.push(` ${p.name} → ${p.target}`)\n }\n } catch {\n // meta is malformed — base fields above are still useful.\n }\n }\n\n if (item.changelog?.length) {\n lines.push('\\nChangelog:')\n for (const c of item.changelog.slice(0, 5)) lines.push(` ${c.version}: ${c.note}`)\n }\n\n if (item.files?.length) {\n lines.push('\\nFiles:')\n for (const f of item.files) lines.push(` ${f.url}${f.target ? ` → ${f.target}` : ''}`)\n }\n\n if (item.dependencies?.length) lines.push(`\\nDependencies: ${item.dependencies.join(', ')}`)\n\n if (item.registryDependencies?.length) {\n const label = isTemplateItem(item) ? 'Components' : 'Registry dependencies'\n lines.push(`${label}: ${item.registryDependencies.join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n\nexport async function view(args: string[], config: CascadeConfig): Promise<void> {\n const spec = args[0]\n if (!spec) {\n console.error('Usage: cascivo view <component-spec>')\n return\n }\n\n const addr = parseAddress(spec)\n const { url, headers, params } = await resolveItemUrl(addr, config)\n const fetchOpts: Parameters<typeof fetchJson>[1] = {}\n if (headers) fetchOpts.headers = headers\n if (params) fetchOpts.params = params\n const item = (await fetchJson(url, fetchOpts)) as RegistryItem\n\n console.log(formatItem(item))\n}\n","import { createRequire } from 'node:module'\nimport { argv } from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { add } from './commands/add.js'\nimport { create } from './commands/create.js'\nimport { runDoctor } from './commands/doctor.js'\nimport { generate } from './commands/generate.js'\nimport { init } from './commands/init.js'\nimport { list } from './commands/list.js'\nimport { registryBuild } from './commands/registry.js'\nimport { search } from './commands/search.js'\nimport { theme } from './commands/theme.js'\nimport { update } from './commands/update.js'\nimport { view } from './commands/view.js'\nimport { loadConfig, THEMES } from './utils/config.js'\n\n// Read at runtime: this file lives one level below the package root both in\n// src/ (dev, tests) and in dist/ (published bundle), so ../package.json is\n// always the cascivo package manifest.\nexport const VERSION: string = (\n createRequire(import.meta.url)('../package.json') as { version: string }\n).version\n\nexport type { CascadeConfig, ThemeName } from './utils/config.js'\n\nconst HELP = `cascivo ${VERSION} — the CSS-native, signal-driven, AI-first design system\n\nUsage: cascivo <command> [options]\n\nCommands:\n create [name] Scaffold a new ready-to-run app (shell + nav + theme)\n (--template <spec>: start from a marketplace template)\n init Set up cascivo in the current project\n add <component...> Add components or a template to your project\n list [--installed] List available components\n update [component] Update installed components (--check: list outdated)\n search <query> Search components across registries\n view <spec> View a component before installing\n theme <add|create> Install a first-party theme, or build a custom one from /create\n eject <component> Eject specific tokens into a scoped local override file\n generate <config.json> Generate TSX from a ViewConfig JSON file\n doctor [--ci] Check components for rule violations\n audit --ai <paths...> Audit AI-generated code against the cascivo contract\n registry build Build a static registry from a cascivo-registry.json file\n template init <name> Scaffold a new template (source + manifest + registry entry)\n tokens import <file> Import external design tokens as cascivo overrides\n\nRun \"cascivo <command> --help\" for details.`\n\nconst THEME_LIST = THEMES.join(' | ')\n\nconst COMMAND_HELP: Record<string, string> = {\n create: `Usage: cascivo create [name] [options]\n\nScaffold a new ready-to-run app — Vite + React + TypeScript, pre-wired with the\ncascivo app shell, side navigation, header, and a theme.\n\nOptions:\n --template <spec> Start from a marketplace template (@ns/name or owner/repo/name)\n --theme <name> Theme to install (${THEME_LIST})\n --sections \"<a, b>\" Comma-separated nav section labels (one component each)\n --yes, -y Accept defaults, never prompt`,\n init: `Usage: cascivo init [options]\n\nSet up cascivo in the current project: installs @cascivo/core + @cascivo/tokens\nand writes cascivo.config.ts.\n\nOptions:\n --theme <name> Theme to configure (${THEME_LIST})\n --yes, -y Accept defaults, never prompt (implied when stdin is not a TTY)`,\n add: `Usage: cascivo add <component...> [options]\n\nCopy component source (TSX + CSS module) from the registry into your project,\nresolving component dependencies. Also installs templates (@ns/name) and\nthird-party components (owner/repo/name).\n\nOptions:\n --dry-run Show what would be written without writing\n --yes, -y Skip confirmation prompts`,\n list: `Usage: cascivo list [options]\n\nList components available in the configured registry.\n\nOptions:\n --installed Only list components already installed in this project`,\n update: `Usage: cascivo update [component] [options]\n\nUpdate installed components to the current registry version. Without a\ncomponent argument, updates everything in the lockfile.\n\nOptions:\n --check List outdated components without writing\n --yes, -y Skip confirmation prompts`,\n search: `Usage: cascivo search <query> [options]\n\nSearch components across the configured registries.\n\nOptions:\n --registry <@ns> Restrict the search to one registry namespace`,\n view: `Usage: cascivo view <spec>\n\nPreview a component or template (files, dependencies, description) before\ninstalling. <spec> is a bare name, @ns/name, or owner/repo/name.`,\n theme: `Usage: cascivo theme add <name>\n cascivo theme create <name> --from <hash> [--out <path>]\n\nadd Install @cascivo/themes and print the import + data-theme wiring.\ncreate Turn a theme-builder config into an owned <name>.theme.css. Get <hash>\n from https://cascivo.com/create (\"Copy CLI command\"). --dry-run prints\n the CSS without writing.\n\nThemes: ${THEME_LIST}`,\n eject: `Usage: cascivo eject <component> [options]\n\nEject specific tokens into a scoped local override file so you can restyle a\ncomponent without forking it.\n\nOptions:\n --tokens <a,b> Comma-separated token names to eject (default: all)\n --scope <sel> CSS selector the overrides are scoped to\n --out <file> Output file path\n --dry-run Print the override file without writing`,\n generate: `Usage: cascivo generate <config.json> [options]\n\nGenerate TSX from a ViewConfig JSON file (see the MCP scaffold_view tool).\n\nOptions:\n --out <file> Output file (default: stdout)\n --components-dir <dir> Components import base (default: ./src/components/ui)`,\n doctor: `Usage: cascivo doctor [options]\n\nCheck components in this repo for cascivo rule violations (banned React hooks,\nhardcoded strings, missing @cascivo/react exports).\n\nOptions:\n --ci Exit non-zero when violations are found\n --drift Compare installed components against the registry (copy-paste drift)`,\n audit: `Usage: cascivo audit --ai <paths...> [options]\n\nAudit AI-generated code against the cascivo contract: hard-coded values that\nshould be tokens, invented props, missing required props, raw strings where\ni18n is expected.\n\nOptions:\n --fix Rewrite unambiguous CSS literals to their token equivalents\n --json Machine-readable output\n --level <name> Minimum finding level to report (error | warn; default error)`,\n registry: `Usage: cascivo registry build [dir]\n\nBuild a static registry (registry.json + file payloads) from a\ncascivo-registry.json manifest, ready to host on any static file server.`,\n template: `Usage: cascivo template init <name> [options]\n\nScaffold a new template: source, manifest, and registry entry.\n\nOptions:\n --category <name> Template category (e.g. dashboard)\n --framework <name> Target framework (default react-vite)\n --components <a,b> Registry components the template composes\n --repo <owner/repo> Repository the template will be hosted in`,\n tokens: `Usage: cascivo tokens import <file>\n\nImport external design tokens (W3C design-tokens JSON) as cascivo token\noverrides.`,\n}\n\nexport async function run(args: string[]): Promise<void> {\n const [command, ...rest] = args\n\n // Per-command help must short-circuit BEFORE any prompt, fetch, or install:\n // \"cascivo add --help\" must never try to install a component named --help.\n if (command !== undefined && (rest.includes('--help') || rest.includes('-h'))) {\n const commandHelp = COMMAND_HELP[command]\n if (commandHelp !== undefined) {\n console.log(commandHelp)\n return\n }\n }\n\n switch (command) {\n case 'create':\n await create(rest)\n break\n case 'init':\n await init(rest)\n break\n case 'add':\n await add(rest, await loadConfig(), {\n dryRun: rest.includes('--dry-run'),\n yes: rest.includes('--yes'),\n })\n break\n case 'list':\n await list(await loadConfig(), { installed: rest.includes('--installed') })\n break\n case 'update':\n await update(rest.filter((r) => !r.startsWith('--'))[0], await loadConfig(), {\n check: rest.includes('--check'),\n yes: rest.includes('--yes'),\n })\n break\n case 'search':\n await search(rest, await loadConfig())\n break\n case 'view':\n await view(rest, await loadConfig())\n break\n case 'theme':\n await theme(rest)\n break\n case 'eject': {\n const { eject } = await import('./commands/eject.js')\n const flag = (key: string): string | undefined => {\n const eq = rest.find((r) => r.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = rest.indexOf(`--${key}`)\n const next = idx !== -1 ? rest[idx + 1] : undefined\n // Ignore a following token that is itself a flag (e.g. `--tokens --dry-run`).\n return next && !next.startsWith('--') ? next : undefined\n }\n const tokensArg = flag('tokens')\n await eject(rest, await loadConfig(), {\n ...(tokensArg\n ? {\n tokens: tokensArg\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n }\n : {}),\n ...(flag('scope') ? { scope: flag('scope')! } : {}),\n ...(flag('out') ? { out: flag('out')! } : {}),\n dryRun: rest.includes('--dry-run'),\n })\n break\n }\n case 'generate':\n await generate(rest, await loadConfig())\n break\n case 'registry':\n if (rest[0] === 'build') {\n await registryBuild(rest.slice(1))\n } else {\n console.error(`Unknown registry subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case 'template':\n if (rest[0] === 'init') {\n const { templateInit } = await import('./commands/template-init.js')\n await templateInit(rest.slice(1))\n } else {\n console.error(`Unknown template subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case 'doctor': {\n const ci = rest.includes('--ci')\n const drift = rest.includes('--drift')\n if (drift) {\n const { runDoctorDrift } = await import('./commands/drift.js')\n await runDoctorDrift(await loadConfig())\n } else {\n const result = await runDoctor(process.cwd())\n if (result.passed) {\n console.log('No violations found.')\n } else {\n for (const v of result.violations) {\n console.error(`[${v.rule}] ${v.detail}\\n ${v.file}`)\n }\n if (ci) process.exitCode = 1\n }\n }\n break\n }\n case 'audit': {\n const { audit } = await import('./commands/audit.js')\n await audit(rest, await loadConfig())\n break\n }\n case 'tokens':\n if (rest[0] === 'import') {\n const { tokensImport } = await import('./commands/tokens.js')\n await tokensImport(rest.slice(1))\n } else {\n console.error(`Unknown tokens subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case undefined:\n case '--help':\n case '-h':\n case 'help':\n console.log(HELP)\n break\n case '--version':\n case '-v':\n console.log(VERSION)\n break\n default:\n console.error(`Unknown command: ${command}\\n`)\n console.log(HELP)\n process.exitCode = 1\n }\n}\n\nconst isMain = argv[1] !== undefined && import.meta.url === pathToFileURL(argv[1]).href\n\nif (isMain) {\n run(argv.slice(2)).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["resolvePath","flagValue","DEFAULT_CONFIG","item"],"sources":["../src/utils/exec.ts","../src/utils/resolve.ts","../src/utils/directory.ts","../src/commands/add.ts","../src/commands/create.ts","../src/commands/doctor.ts","../src/commands/generate.ts","../src/commands/init.ts","../src/commands/list.ts","../src/commands/registry.ts","../src/commands/search.ts","../../theme-kit/src/config.ts","../../theme-kit/src/hash.ts","../../theme-kit/src/css.ts","../src/commands/theme.ts","../src/utils/diff.ts","../src/utils/merge.ts","../src/commands/update.ts","../src/commands/view.ts","../src/index.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process'\nimport { detectPackageManager, installCommand } from './config.js'\n\n/**\n * Install npm packages using the detected package manager, inheriting stdio so\n * the user sees install progress. Returns false if the install failed.\n */\nexport function installPackages(packages: string[], cwd: string = process.cwd()): boolean {\n if (packages.length === 0) return true\n const [cmd, args] = installCommand(detectPackageManager(cwd), packages)\n console.log(`Installing ${packages.join(', ')} with ${cmd}…`)\n const result = spawnSync(cmd, args, {\n cwd,\n stdio: 'inherit',\n shell: process.platform === 'win32',\n })\n if (result.status !== 0) {\n console.error(`Failed to install: ${packages.join(', ')}`)\n return false\n }\n return true\n}\n","import { CASCIVO_HOST, type CascadeConfig, type RegistryNamespaceConfig } from './config.js'\nimport { fetchJson } from './http.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\nexport type AddressKind = 'bare' | 'namespace' | 'url' | 'github'\n\nexport interface ParsedAddress {\n kind: AddressKind\n namespace?: string\n name: string\n ref?: string\n raw: string\n}\n\nconst GITHUB_RE = /^([^/]+)\\/([^/]+)\\/([^#]+)(?:#(.+))?$/\n\nfunction expandEnv(str: string, env: NodeJS.ProcessEnv = process.env): string {\n return str.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => {\n const val = env[key]\n if (val === undefined) throw new Error(`Environment variable ${key} is not set`)\n return val\n })\n}\n\nexport function parseAddress(spec: string, _env: NodeJS.ProcessEnv = process.env): ParsedAddress {\n if (\n spec.startsWith('http://') ||\n spec.startsWith('https://') ||\n spec.startsWith('./') ||\n spec.startsWith('/')\n ) {\n return { kind: 'url', name: spec, raw: spec }\n }\n\n if (spec.startsWith('@')) {\n const slash = spec.indexOf('/', 1)\n if (slash === -1) throw new Error(`Invalid namespace address: ${spec} (expected @ns/name)`)\n const namespace = spec.slice(0, slash)\n const name = spec.slice(slash + 1)\n return { kind: 'namespace', namespace, name, raw: spec }\n }\n\n // GitHub: owner/repo/item[#ref] — at least 3 path segments, no leading protocol/dot\n const specWithoutRef = spec.includes('#') ? spec.slice(0, spec.indexOf('#')) : spec\n const githubMatch = GITHUB_RE.exec(spec)\n if (githubMatch && !specWithoutRef.includes('.') && specWithoutRef.split('/').length >= 3) {\n const [, owner, repo, item, ref] = githubMatch\n return {\n kind: 'github',\n name: `${owner}/${repo}/${item}`,\n ref: ref ?? 'main',\n raw: spec,\n }\n }\n\n return { kind: 'bare', name: spec, raw: spec }\n}\n\nfunction resolveNamespaceUrl(\n ns: string,\n name: string,\n nsCfg: RegistryNamespaceConfig,\n env: NodeJS.ProcessEnv,\n): string {\n const template = typeof nsCfg === 'string' ? nsCfg : nsCfg.url\n if (!template.includes('{name}')) {\n throw new Error(`Registry namespace \"${ns}\" URL template must contain {name}: ${template}`)\n }\n return expandEnv(template.replace('{name}', name), env)\n}\n\nexport async function resolveItemUrl(\n addr: ParsedAddress,\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n resolveNamespaceHook?: (ns: string) => Promise<RegistryNamespaceConfig | null>,\n): Promise<{ url: string; headers?: Record<string, string>; params?: Record<string, string> }> {\n switch (addr.kind) {\n case 'url':\n return { url: addr.name }\n\n case 'bare': {\n const base = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\n return { url: `${base}/r/${addr.name}.json` }\n }\n\n case 'github': {\n const parts = addr.name.split('/')\n const owner = parts[0]!\n const repo = parts[1]!\n const item = parts.slice(2).join('/')\n const ref = addr.ref ?? 'main'\n return {\n url: `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/r/${item}.json`,\n }\n }\n\n case 'namespace': {\n const ns = addr.namespace!\n const name = addr.name\n\n // Config-defined namespaces always win\n if (config.registries?.[ns]) {\n const nsCfg = config.registries[ns]!\n const url = resolveNamespaceUrl(ns, name, nsCfg, env)\n const headers = typeof nsCfg !== 'string' ? nsCfg.headers : undefined\n const params = typeof nsCfg !== 'string' ? nsCfg.params : undefined\n const expandedHeaders = headers\n ? Object.fromEntries(Object.entries(headers).map(([k, v]) => [k, expandEnv(v, env)]))\n : undefined\n const expandedParams = params\n ? Object.fromEntries(Object.entries(params).map(([k, v]) => [k, expandEnv(v, env)]))\n : undefined\n const result: {\n url: string\n headers?: Record<string, string>\n params?: Record<string, string>\n } = { url }\n if (expandedHeaders) result.headers = expandedHeaders\n if (expandedParams) result.params = expandedParams\n return result\n }\n\n // Directory fallback hook (injected from T3)\n if (resolveNamespaceHook) {\n const hookResult = await resolveNamespaceHook(ns)\n if (hookResult) {\n const url = resolveNamespaceUrl(ns, name, hookResult, env)\n return { url }\n }\n }\n\n // Built-in first-party namespace fallback (@cascade is the legacy alias)\n if (ns === '@cascivo' || ns === '@cascade') {\n return { url: `${CASCIVO_HOST}/r/${name}.json` }\n }\n\n throw new Error(\n `Unknown namespace \"${ns}\". Add it to registries in cascivo.config.ts or check the directory at cascivo.com`,\n )\n }\n }\n}\n\nexport interface InstallPlan {\n items: {\n spec: string\n addr: ParsedAddress\n itemUrl: string\n headers?: Record<string, string>\n params?: Record<string, string>\n item: RegistryItem\n registryBase: string\n }[]\n}\n\nexport async function resolveClosure(\n specs: string[],\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n resolveNamespaceHook?: (ns: string) => Promise<RegistryNamespaceConfig | null>,\n): Promise<InstallPlan> {\n const seen = new Set<string>()\n const queue: string[] = [...specs]\n const plan: InstallPlan['items'] = []\n\n while (queue.length > 0) {\n const spec = queue.shift()!\n const addr = parseAddress(spec, env)\n const identity = addr.raw\n\n if (seen.has(identity)) continue\n seen.add(identity)\n\n const { url, headers, params } = await resolveItemUrl(addr, config, env, resolveNamespaceHook)\n const fetchOpts: Parameters<typeof fetchJson>[1] = {}\n if (headers) fetchOpts.headers = headers\n if (params) fetchOpts.params = params\n const raw = await fetchJson(url, fetchOpts)\n const item = raw as RegistryItem\n\n const base = url.replace(/\\/[^/]+\\.json$/, '')\n\n const entry: InstallPlan['items'][number] = {\n spec,\n addr,\n itemUrl: url,\n item,\n registryBase: base,\n }\n if (headers) entry.headers = headers\n if (params) entry.params = params\n plan.push(entry)\n\n for (const dep of item.registryDependencies ?? []) {\n queue.push(dep)\n }\n }\n\n return { items: plan }\n}\n","import type { RegistryNamespaceConfig } from './config.js'\nimport { fetchJson } from './http.js'\nimport type { FetchFn } from './http.js'\n\nimport { CASCIVO_HOST } from './config.js'\n\nexport const DIRECTORY_URL = `${CASCIVO_HOST}/r/registries.json`\n\ninterface DirectoryEntry {\n namespace: string\n registryUrl: string\n}\n\ninterface DirectoryResponse {\n registries?: DirectoryEntry[]\n}\n\nexport async function resolveFromDirectory(\n ns: string,\n fetchFn?: FetchFn,\n): Promise<RegistryNamespaceConfig | null> {\n try {\n // fetchJson uses the module-level _fetchFn; if a custom fetchFn is provided, we use it directly\n let data: DirectoryResponse\n if (fetchFn) {\n const res = await fetchFn(DIRECTORY_URL, { headers: { Accept: 'application/json' } })\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n data = (await res.json()) as DirectoryResponse\n } else {\n data = (await fetchJson(DIRECTORY_URL)) as DirectoryResponse\n }\n const entry = data.registries?.find((r) => r.namespace === ns)\n if (!entry) return null\n return entry.registryUrl\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n console.warn(`Could not reach cascivo.com directory: ${msg}`)\n return null\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { join, resolve as resolvePath } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchTextRetry } from '../utils/http.js'\nimport {\n fetchRegistry,\n fileName,\n findComponent,\n type Registry,\n type RegistryComponent,\n} from '../utils/registry.js'\nimport { createLock, readLock, sha256, updateLockEntry, writeLock } from '../utils/lock.js'\nimport { checkPeerVersions } from '../utils/peer-versions.js'\nimport { resolveClosure } from '../utils/resolve.js'\nimport { resolveFromDirectory } from '../utils/directory.js'\nimport { isTemplateItem, type RegistryItem } from '@cascivo/registry'\n\n/** Dependencies always present in a cascade project — never auto-installed. */\nconst ASSUMED_DEPS = new Set(['react', 'react-dom'])\n\n/**\n * Copied components read `--cascivo-*` custom properties; without\n * @cascivo/tokens or @cascivo/themes imported somewhere, they render unstyled.\n * Print the wiring once after a successful install if neither is a dependency.\n */\nfunction hintThemesIfMissing(cwd: string): void {\n let deps: Record<string, unknown> = {}\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n // No package.json — still worth printing the hint.\n }\n if (deps['@cascivo/themes'] !== undefined || deps['@cascivo/tokens'] !== undefined) return\n console.log(\n '\\nStyling: cascivo components read --cascivo-* tokens, which this project does not import yet.',\n )\n console.log(' npm install @cascivo/themes')\n console.log(\" import '@cascivo/themes/all' // once, in your entry file\")\n console.log(' <html data-theme=\"light\"> // or any container')\n}\n\n/** Resolve where a template's own file is written — relative to the project root. */\nexport function resolveTemplateTarget(cwd: string, target: string): string {\n return resolvePath(cwd, target)\n}\n\nexport interface ResolvedBareEntry {\n entry: RegistryComponent\n /** True if reached via an original `cascivo add` argument; false if pulled as a transitive dependency. */\n requested: boolean\n}\n\n/**\n * Names from other libraries → the cascivo layout primitive that fills the same\n * role, so `cascivo add flex` installs `layout/stack`. Bare names that already\n * resolve (e.g. `stack` → `layout/stack` via suffix match) need no alias.\n */\nexport const LAYOUT_ALIASES: Record<string, string> = {\n flex: 'stack',\n box: 'stack',\n hstack: 'stack',\n vstack: 'stack',\n gap: 'spacer',\n}\n\n/**\n * Resolve the transitive closure of bare-name registry entries, following each\n * entry's `registryDependencies`. De-duped by resolved registry name and\n * cycle-safe (an entry is processed at most once). Returns resolved entries in\n * install order plus the names that could not be found. Pure — no I/O.\n */\nexport function resolveBareClosure(\n registry: Registry,\n bareSpecs: string[],\n): { resolved: ResolvedBareEntry[]; missing: string[] } {\n const queue: { name: string; requested: boolean }[] = bareSpecs.map((name) => ({\n name,\n requested: true,\n }))\n const installed = new Set<string>()\n const resolved: ResolvedBareEntry[] = []\n const missing: string[] = []\n\n while (queue.length > 0) {\n const { name, requested } = queue.shift()!\n const resolvedName = LAYOUT_ALIASES[name.toLowerCase()] ?? name\n const entry = findComponent(registry, resolvedName)\n if (!entry) {\n missing.push(name)\n continue\n }\n if (installed.has(entry.name)) continue\n installed.add(entry.name)\n resolved.push({ entry, requested })\n for (const dep of entry.registryDependencies ?? []) {\n queue.push({ name: dep, requested: false })\n }\n }\n\n return { resolved, missing }\n}\n\n/**\n * First-party items are hosted on cascivo.com or the cascivo/cascivo GitHub\n * repo (raw file URLs). Anything else gets a review-before-use notice.\n */\nconst FIRST_PARTY_URL = /^https:\\/\\/(cascivo\\.com|raw\\.githubusercontent\\.com\\/cascivo\\/cascivo)\\//\n\nexport function isThirdParty(itemUrl: string): boolean {\n return !FIRST_PARTY_URL.test(itemUrl)\n}\n\nfunction isMultiRegistrySpec(name: string): boolean {\n return (\n name.startsWith('@') ||\n name.startsWith('http://') ||\n name.startsWith('https://') ||\n name.startsWith('./') ||\n name.startsWith('/') ||\n name.split('/').length >= 3\n )\n}\n\nexport async function add(\n names: string[],\n config: CascadeConfig,\n opts: { dryRun?: boolean; yes?: boolean; cwd?: string } = {},\n): Promise<void> {\n if (names.length === 0) {\n console.error('Usage: cascivo add <component...>')\n return\n }\n\n const cwd = opts.cwd ?? process.cwd()\n const multiSpecs = names.filter(isMultiRegistrySpec)\n let bareSpecs = names.filter((n) => !isMultiRegistrySpec(n))\n\n // Bare names that match a first-party template install through the per-item\n // path (they carry file targets the bare component path cannot express).\n let registry: Registry | null = null\n if (bareSpecs.length > 0) {\n registry = await fetchRegistry(config.registry)\n const templateNames = new Set(registry.templates.map((t) => t.toLowerCase()))\n const templateSpecs = bareSpecs.filter((n) => templateNames.has(n.toLowerCase()))\n if (templateSpecs.length > 0) {\n bareSpecs = bareSpecs.filter((n) => !templateNames.has(n.toLowerCase()))\n multiSpecs.push(...templateSpecs.map((n) => `@cascivo/${n.toLowerCase()}`))\n }\n }\n\n let lock = (await readLock(cwd)) ?? createLock()\n\n // Handle multi-registry specs (namespaces, URLs, GitHub)\n if (multiSpecs.length > 0) {\n const plan = await resolveClosure(multiSpecs, config, process.env, resolveFromDirectory)\n\n if (opts.dryRun) {\n console.log('Dry run — would install:')\n for (const item of plan.items) {\n const kind = isTemplateItem(item.item) ? ' [template]' : ''\n console.log(\n ` ${item.spec} (${item.item.name}@${item.item.version})${kind} from ${item.itemUrl}`,\n )\n for (const f of item.item.files) {\n const arrow = isTemplateItem(item.item) && f.target ? ` → ${f.target}` : ''\n console.log(` ${f.url}${arrow}`)\n }\n if (item.item.registryDependencies?.length) {\n console.log(` components: ${item.item.registryDependencies.join(', ')}`)\n }\n }\n return\n }\n\n for (const { item, itemUrl, registryBase } of plan.items) {\n if (isThirdParty(itemUrl)) {\n console.log(\n `\\nReview before use — files from non-directory registry: ${registryBase}\\n` +\n (item.files ?? []).map((f) => ` ${f.url}`).join('\\n'),\n )\n }\n\n let fileHashes: Record<string, string>\n try {\n fileHashes = await installItem(item, config, cwd)\n } catch (e) {\n // Nothing was written for this item (fetch-all-then-write), so the\n // lockfile must not record it either.\n console.error(`Failed to install ${item.name}: ${e instanceof Error ? e.message : e}`)\n process.exitCode = 1\n continue\n }\n lock = updateLockEntry(lock, item.name, {\n registry: registryBase,\n version: item.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: fileHashes,\n })\n }\n await writeLock(lock, cwd)\n if (bareSpecs.length === 0) {\n hintThemesIfMissing(cwd)\n return\n }\n }\n\n if (bareSpecs.length === 0) return\n // Legacy bare-name path (uses the registry fetched above for template\n // detection). Resolves the transitive closure of registry (component)\n // dependencies so a component that imports a shared hook/sibling\n // (e.g. `../popover/use-popover`) installs that dependency too.\n registry ??= await fetchRegistry(config.registry)\n const missingDeps = new Set<string>()\n const registryBase = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\n\n for (const spec of bareSpecs) {\n const alias = LAYOUT_ALIASES[spec.toLowerCase()]\n if (!alias) continue\n const target = findComponent(registry, alias)\n if (target) {\n console.log(\n `\"${spec}\" is not a cascivo component — installing ${target.name} (its ${spec} primitive).`,\n )\n }\n }\n\n const { resolved, missing } = resolveBareClosure(registry, bareSpecs)\n for (const name of missing) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n }\n\n // Aggregate each resolved entry's peer-version floors (e.g. \"install data-table\n // needs @cascivo/i18n >= 0.2.1\") so we can verify what actually got installed.\n const peerFloors: Record<string, string> = {}\n for (const { entry } of resolved) {\n for (const [pkg, floor] of Object.entries(entry.peerVersions ?? {})) {\n peerFloors[pkg] = floor\n }\n }\n\n for (const { entry, requested } of resolved) {\n if (entry.install) {\n const pkg = entry.install\n console.log(`\"${entry.name}\" is distributed as the npm package ${pkg}.`)\n console.log(`Install it with: npm install ${pkg}`)\n console.log(`Then import: import { ${entry.meta.name} } from '${pkg}'`)\n if (entry.styles) {\n console.log(`And import its stylesheet once: import '${entry.styles}'`)\n }\n continue\n }\n\n const outputName = entry.name.includes('/') ? entry.name.split('/').pop()! : entry.name\n const fileHashes: Record<string, string> = {}\n\n // Two-phase: fetch every file before writing any, so a mid-install network\n // failure can never leave a half-copied component (or a lockfile entry\n // pointing at one).\n let fetched: { url: string; content: string }[]\n try {\n fetched = await Promise.all(\n entry.files.map(async (url) => ({ url, content: await fetchTextRetry(url) })),\n )\n } catch (e) {\n console.error(`Failed to install ${entry.name}: ${e instanceof Error ? e.message : e}`)\n process.exitCode = 1\n continue\n }\n for (const { url, content } of fetched) {\n const dest = resolveOutputPath(config.outputDir, outputName, fileName(url), cwd)\n await writeFileSafe(dest, content)\n fileHashes[dest] = sha256(content)\n }\n\n for (const dep of entry.dependencies) {\n if (!ASSUMED_DEPS.has(dep)) missingDeps.add(dep)\n }\n\n lock = updateLockEntry(lock, entry.name, {\n registry: registryBase,\n version: entry.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: fileHashes,\n })\n\n const suffix = requested ? '' : ' (dependency)'\n console.log(`Added ${entry.name} to ${config.outputDir}/${outputName}/${suffix}`)\n }\n\n if (missingDeps.size > 0) {\n installPackages([...missingDeps])\n }\n\n if (Object.keys(peerFloors).length > 0) {\n const violations = await checkPeerVersions(cwd, peerFloors)\n for (const v of violations) {\n console.error(\n `\\nWarning: ${v.pkg} ${v.installed ? `${v.installed} is` : 'is not'} installed, but ` +\n `the copied component source needs ${v.pkg} ${v.required}. ` +\n `Run: npm install ${v.pkg}@latest`,\n )\n process.exitCode = 1\n }\n }\n\n await writeLock(lock, cwd)\n hintThemesIfMissing(cwd)\n}\n\n/**\n * Install a single resolved item, returning a map of written path → content\n * hash for the lockfile. A template writes its own files to their `target`\n * paths (relative to the project root); every other item writes its files under\n * the components output directory. A template's components are installed\n * separately as their own plan entries (via `registryDependencies`).\n */\nasync function installItem(\n item: RegistryItem,\n config: CascadeConfig,\n cwd: string,\n): Promise<Record<string, string>> {\n const fileHashes: Record<string, string> = {}\n const missingDeps = new Set<string>()\n const template = isTemplateItem(item)\n const outputName = item.name.includes('/') ? item.name.split('/').pop()! : item.name\n\n // Two-phase: fetch every file before writing any. A failed fetch aborts the\n // whole item (throws to the caller) instead of silently installing a subset.\n const fetched = await Promise.all(\n (item.files ?? []).map(async (file) => ({\n file,\n content: await fetchTextRetry(file.url),\n })),\n )\n for (const { file, content } of fetched) {\n const dest =\n template && file.target\n ? resolveTemplateTarget(cwd, file.target)\n : resolveOutputPath(config.outputDir, outputName, fileName(file.url), cwd)\n await writeFileSafe(dest, content)\n fileHashes[dest] = sha256(content)\n }\n\n for (const dep of item.dependencies ?? []) {\n if (!ASSUMED_DEPS.has(dep)) missingDeps.add(dep)\n }\n\n if (missingDeps.size > 0) {\n installPackages([...missingDeps])\n }\n\n if (template) {\n const pages = item.files?.filter((f) => f.target).map((f) => f.target) ?? []\n console.log(`Installed template ${item.name} (${pages.length} files)`)\n } else {\n console.log(`Added ${item.name} to ${config.outputDir}/${outputName}/`)\n }\n\n return fileHashes\n}\n","import { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { stdin, stdout } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\nimport { CASCIVO_HOST, THEMES, type ThemeName } from '../utils/config.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\n/** Version specifier used for every `@cascivo/*` dependency in generated apps. */\nconst CASCIVO_DEP = 'latest'\n\nexport interface ScaffoldOptions {\n /** Project directory + package name. */\n name: string\n /** Theme imported in the entry CSS and set on `<html data-theme>`. */\n theme: ThemeName\n /** Display labels for the side-nav sections (one section component each). */\n sections: string[]\n}\n\nexport interface ScaffoldFile {\n /** Path relative to the project root. */\n path: string\n contents: string\n}\n\ninterface Section {\n /** Discriminant used in the section signal + conditional render. */\n key: string\n /** Human-readable label shown in the nav and section heading. */\n label: string\n /** PascalCase component + file name. */\n component: string\n}\n\n/** Slug suitable for a union-member string literal: lower-kebab, alnum only. */\nfunction slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'section'\n )\n}\n\n/** PascalCase identifier derived from a free-text label. */\nfunction pascalCase(label: string): string {\n const parts = label\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n const joined = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')\n const safe = joined || 'Section'\n return /^[0-9]/.test(safe) ? `Section${safe}` : safe\n}\n\n/** Normalize the project name into a valid npm package name. */\nfunction packageName(name: string): string {\n return (\n name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'cascivo-app'\n )\n}\n\n/** Turn raw section labels into unique keyed/component-named sections. */\nfunction resolveSections(labels: string[]): Section[] {\n const seenKeys = new Set<string>()\n const seenComponents = new Set<string>()\n const sections: Section[] = []\n for (const label of labels) {\n const trimmed = label.trim()\n if (!trimmed) continue\n let key = slug(trimmed)\n let component = pascalCase(trimmed)\n let n = 2\n while (seenKeys.has(key) || seenComponents.has(component)) {\n key = `${slug(trimmed)}-${n}`\n component = `${pascalCase(trimmed)}${n}`\n n++\n }\n seenKeys.add(key)\n seenComponents.add(component)\n sections.push({ key, label: trimmed, component })\n }\n return sections.length > 0 ? sections : [{ key: 'home', label: 'Home', component: 'Home' }]\n}\n\nfunction packageJson(opts: ScaffoldOptions): string {\n const pkg = {\n name: packageName(opts.name),\n private: true,\n version: '0.0.0',\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n },\n dependencies: {\n '@cascivo/core': CASCIVO_DEP,\n '@cascivo/react': CASCIVO_DEP,\n '@cascivo/themes': CASCIVO_DEP,\n '@cascivo/tokens': CASCIVO_DEP,\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n },\n devDependencies: {\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n '@vitejs/plugin-react': '^5.0.0',\n typescript: '^5.7.0',\n vite: '^7.0.0',\n },\n }\n return JSON.stringify(pkg, null, 2) + '\\n'\n}\n\nfunction tsconfig(): string {\n const cfg = {\n compilerOptions: {\n target: 'ES2022',\n useDefineForClassFields: true,\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n moduleDetection: 'force',\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n }\n return JSON.stringify(cfg, null, 2) + '\\n'\n}\n\nfunction viteConfig(): string {\n return `import react from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [react()],\n})\n`\n}\n\nfunction indexHtml(opts: ScaffoldOptions): string {\n return `<!doctype html>\n<html lang=\"en\" data-theme=\"${opts.theme}\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${opts.name}</title>\n <style>\n @layer cascivo.reset, cascivo.base, cascivo.tokens, cascivo.component, cascivo.theme, cascivo.override;\n @layer cascivo.reset {\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n }\n html,\n body,\n #root {\n height: 100%;\n }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}\n\nfunction mainTsx(): string {\n return `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\n\nconst root = document.getElementById('root')\nif (root) {\n ReactDOM.createRoot(root).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n )\n}\n`\n}\n\nfunction viteEnv(): string {\n return `/// <reference types=\"vite/client\" />\\n`\n}\n\nfunction appTsx(opts: ScaffoldOptions, sections: Section[]): string {\n const sectionImports = sections\n .map((s) => `import { ${s.component} } from './sections/${s.component}'`)\n .join('\\n')\n\n const unionType = sections.map((s) => `'${s.key}'`).join(' | ')\n\n const navItems = sections\n .map(\n (s) => ` {\n label: '${s.label.replace(/'/g, \"\\\\'\")}',\n active: section.value === '${s.key}',\n onClick: (e) => {\n e.preventDefault()\n section.value = '${s.key}'\n },\n },`,\n )\n .join('\\n')\n\n const renderedSections = sections\n .map((s) => ` {section.value === '${s.key}' && <${s.component} />}`)\n .join('\\n')\n\n return `'use client'\nimport { signal, useSignals } from '@cascivo/core'\nimport { AppShell, ShellHeader, SideNav, type SideNavItem } from '@cascivo/react'\n${sectionImports}\n\nimport '@cascivo/tokens'\nimport '@cascivo/themes/${opts.theme}.css'\nimport '@cascivo/react/styles.css'\n\ntype Section = ${unionType}\n\nconst section = signal<Section>('${sections[0]!.key}')\n\nexport default function App() {\n useSignals()\n\n const navItems: SideNavItem[] = [\n${navItems}\n ]\n\n return (\n <AppShell\n header={<ShellHeader brand={{ name: '${opts.name.replace(/'/g, \"\\\\'\")}' }} />}\n nav={<SideNav items={navItems} />}\n >\n${renderedSections}\n </AppShell>\n )\n}\n`\n}\n\nfunction sectionTsx(section: Section): string {\n return `import { Card, CardContent, CardHeader, CardTitle, Heading, Text } from '@cascivo/react'\n\nexport function ${section.component}() {\n return (\n <div\n style={{\n display: 'grid',\n gap: 'var(--cascivo-space-6)',\n padding: 'var(--cascivo-space-6)',\n maxWidth: '64rem',\n }}\n >\n <div style={{ display: 'grid', gap: 'var(--cascivo-space-2)' }}>\n <Heading level={1}>${section.label}</Heading>\n <Text muted>\n Edit <code>src/sections/${section.component}.tsx</code> to build out this page.\n </Text>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Get started</CardTitle>\n </CardHeader>\n <CardContent>\n <Text>\n This page is wired into the app shell. Add components with{' '}\n <code>npx cascivo add <component></code>.\n </Text>\n </CardContent>\n </Card>\n </div>\n )\n}\n`\n}\n\nfunction cascivoConfig(opts: ScaffoldOptions): string {\n return `import type { CascadeConfig } from 'cascivo'\n\nconst config: CascadeConfig = {\n registry: '${CASCIVO_HOST}/registry.json',\n outputDir: 'src/components/ui',\n theme: '${opts.theme}',\n}\n\nexport default config\n`\n}\n\nfunction gitignore(): string {\n return `node_modules\ndist\n*.local\n.DS_Store\n`\n}\n\nfunction readme(opts: ScaffoldOptions): string {\n return `# ${opts.name}\n\nA [cascivo](https://cascivo.com) app — Vite + React + TypeScript, pre-wired with\nthe cascivo app shell, side navigation, and the \\`${opts.theme}\\` theme.\n\n## Develop\n\n\\`\\`\\`sh\nnpm install\nnpm run dev\n\\`\\`\\`\n\n## Structure\n\n- \\`src/App.tsx\\` — app shell, navigation, and section routing\n- \\`src/sections/\\` — one component per nav item\n\nAdd more components with \\`npx cascivo add <component>\\`.\n`\n}\n\n/** Build the full set of files for a new cascivo app. Pure — no filesystem I/O. */\nexport function buildScaffold(opts: ScaffoldOptions): ScaffoldFile[] {\n const sections = resolveSections(opts.sections)\n return [\n { path: 'package.json', contents: packageJson(opts) },\n { path: 'tsconfig.json', contents: tsconfig() },\n { path: 'vite.config.ts', contents: viteConfig() },\n { path: 'index.html', contents: indexHtml(opts) },\n { path: 'cascivo.config.ts', contents: cascivoConfig(opts) },\n { path: '.gitignore', contents: gitignore() },\n { path: 'README.md', contents: readme(opts) },\n { path: 'src/main.tsx', contents: mainTsx() },\n { path: 'src/vite-env.d.ts', contents: viteEnv() },\n { path: 'src/App.tsx', contents: appTsx(opts, sections) },\n ...sections.map((s) => ({\n path: `src/sections/${s.component}.tsx`,\n contents: sectionTsx(s),\n })),\n ]\n}\n\nfunction flagValue(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\nconst DEFAULT_SECTIONS = ['Dashboard', 'Reports', 'Settings']\n\nexport async function create(args: string[], cwd: string = process.cwd()): Promise<void> {\n const yes = args.includes('--yes') || args.includes('-y')\n const nameArg = args.find((a) => !a.startsWith('-'))\n const themeArg = flagValue(args, 'theme')\n const sectionsArg = flagValue(args, 'sections')\n\n const interactive = !yes && stdin.isTTY\n const rl = interactive ? createInterface({ input: stdin, output: stdout }) : null\n\n try {\n let name = nameArg\n if (!name && rl) {\n name = (await rl.question('Project name? [my-cascivo-app]: ')).trim()\n }\n name = name || 'my-cascivo-app'\n\n let theme = (themeArg ?? '').toLowerCase()\n if (!(THEMES as readonly string[]).includes(theme) && rl) {\n theme = (await rl.question(`Theme? (${THEMES.join('/')}) [light]: `)).trim().toLowerCase()\n }\n const resolvedTheme: ThemeName = (THEMES as readonly string[]).includes(theme)\n ? (theme as ThemeName)\n : 'light'\n\n let sectionsInput = sectionsArg\n if (!sectionsInput && rl) {\n sectionsInput = (\n await rl.question(`Nav sections? (comma-separated) [${DEFAULT_SECTIONS.join(', ')}]: `)\n ).trim()\n }\n const sections = (sectionsInput ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n\n const opts: ScaffoldOptions = {\n name,\n theme: resolvedTheme,\n sections: sections.length > 0 ? sections : DEFAULT_SECTIONS,\n }\n\n const targetDir = join(cwd, name)\n if (existsSync(targetDir) && readdirSync(targetDir).length > 0) {\n console.error(`Target directory \"${name}\" already exists and is not empty.`)\n process.exitCode = 1\n return\n }\n\n const files = buildScaffold(opts)\n for (const file of files) {\n await writeFileSafe(join(targetDir, file.path), file.contents)\n }\n\n console.log(`\\nCreated ${name} with the ${resolvedTheme} theme (${files.length} files).`)\n\n const templateSpec = flagValue(args, 'template')\n if (templateSpec) {\n const { add } = await import('./add.js')\n const { loadConfig } = await import('../utils/config.js')\n console.log(`\\nInstalling template \"${templateSpec}\"…`)\n await add([templateSpec], await loadConfig(), { cwd: targetDir })\n }\n\n console.log('\\nNext steps:')\n console.log(` cd ${name}`)\n console.log(' npm install')\n console.log(' npm run dev')\n } finally {\n rl?.close()\n }\n}\n","import { readFileSync, readdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport interface DoctorViolation {\n file: string\n rule: string\n detail: string\n}\n\nexport interface DoctorResult {\n violations: DoctorViolation[]\n passed: boolean\n}\n\nconst BANNED_HOOKS = ['useState', 'useEffect', 'useLayoutEffect', 'useContext', 'useReducer']\n\n/**\n * Blank out comments and string/template-literal contents so identifier scans\n * only match real code. A mention of `useEffect` in a comment must not trip\n * the no-react-hooks rule. Single pass — a `//` inside a string (URLs) is not\n * treated as a comment.\n */\nexport function stripCommentsAndStrings(source: string): string {\n let out = ''\n let i = 0\n const n = source.length\n while (i < n) {\n const c = source[i]!\n const next = source[i + 1]\n if (c === '/' && next === '/') {\n while (i < n && source[i] !== '\\n') i++\n } else if (c === '/' && next === '*') {\n i += 2\n while (i < n && !(source[i] === '*' && source[i + 1] === '/')) i++\n i += 2\n } else if (c === \"'\" || c === '\"') {\n i++\n while (i < n && source[i] !== c) {\n if (source[i] === '\\\\') i++\n i++\n }\n i++\n out += c + c\n } else if (c === '`') {\n i++\n while (i < n && source[i] !== '`') {\n if (source[i] === '\\\\') i++\n i++\n }\n i++\n out += '``'\n } else {\n out += c\n i++\n }\n }\n return out\n}\n\nexport async function runDoctor(root: string): Promise<DoctorResult> {\n const violations: DoctorViolation[] = []\n const componentsDir = join(root, 'packages', 'components', 'src')\n if (!existsSync(componentsDir)) return { violations: [], passed: true }\n\n const components = readdirSync(componentsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n\n const reactIndex = join(root, 'packages', 'react', 'src', 'index.ts')\n const indexContent = existsSync(reactIndex) ? readFileSync(reactIndex, 'utf8') : ''\n\n for (const name of components) {\n const tsxPath = join(componentsDir, name, `${name}.tsx`)\n if (!existsSync(tsxPath)) continue\n const content = readFileSync(tsxPath, 'utf8')\n // Hook scan runs on code only; the aria-label scan below needs the\n // original source because it matches inside JSX string attributes.\n const code = stripCommentsAndStrings(content)\n\n for (const hook of BANNED_HOOKS) {\n if (new RegExp(`\\\\b${hook}\\\\b`).test(code)) {\n violations.push({\n file: tsxPath,\n rule: 'no-react-hooks',\n detail: `Banned hook '${hook}' in ${name}.tsx`,\n })\n }\n }\n\n if (/aria-label=\"[A-Z]/.test(content)) {\n violations.push({\n file: tsxPath,\n rule: 'no-hardcoded-strings',\n detail: `Hardcoded aria-label in ${name}.tsx — use t(builtin.*)`,\n })\n }\n\n if (!new RegExp(`from.*components/src/${name}`).test(indexContent)) {\n violations.push({\n file: tsxPath,\n rule: 'missing-react-export',\n detail: `${name} not exported from @cascivo/react`,\n })\n }\n }\n\n return { violations, passed: violations.length === 0 }\n}\n","import { writeFileSync } from 'node:fs'\nimport { basename, dirname, join } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry } from '../utils/registry.js'\n\n// Inline validation types to avoid runtime dep on @cascivo/render\ninterface PropMeta {\n name: string\n type: string\n required?: boolean\n default?: string\n}\n\ninterface ComponentNode {\n component: string\n props?: Record<string, unknown>\n bind?: Record<string, string>\n events?: Record<string, string>\n children?: ComponentNode[] | string | { $t: string; params?: Record<string, string | number> }\n}\n\ninterface ViewConfig {\n view: {\n layout?: string\n regions: Record<string, ComponentNode[]>\n }\n}\n\nfunction isTranslationRef(v: unknown): v is { $t: string } {\n return typeof v === 'object' && v !== null && '$t' in v\n}\n\nfunction serializeProp(value: unknown): string {\n if (typeof value === 'string') return `\"${value.replace(/\"/g, '\\\\\"')}\"`\n if (typeof value === 'number' || typeof value === 'boolean') return `{${value}}`\n if (value === null) return `{null}`\n if (isTranslationRef(value))\n return `{\"${(value as { $t: string }).$t}\"} {/* i18n: ${(value as { $t: string }).$t} */}`\n return `{${JSON.stringify(value)}}`\n}\n\nfunction renderChildren(\n children: ComponentNode['children'],\n indent: string,\n componentPropNames: string[],\n knownComponents: Set<string>,\n): string {\n if (children === undefined) return ''\n if (typeof children === 'string') return children\n if (isTranslationRef(children)) {\n const key = (children as { $t: string }).$t\n return `{/* i18n: ${key} */}`\n }\n if (Array.isArray(children)) {\n return children\n .map((child) =>\n renderNode(child as ComponentNode, indent + ' ', componentPropNames, knownComponents),\n )\n .join('\\n')\n }\n return ''\n}\n\nfunction renderNode(\n node: ComponentNode,\n indent: string,\n _parentPropNames: string[],\n knownComponents: Set<string>,\n): string {\n const compName = node.component\n knownComponents.add(compName)\n const propParts: string[] = []\n\n if (node.props) {\n for (const [k, v] of Object.entries(node.props)) {\n propParts.push(`${k}=${serializeProp(v)}`)\n }\n }\n\n if (node.bind) {\n for (const [k, ref] of Object.entries(node.bind)) {\n const path = ref.replace(/^\\$data\\./, '').replace(/\\./g, '.')\n propParts.push(`${k}={data.${path}}`)\n }\n }\n\n if (node.events) {\n for (const [k, ref] of Object.entries(node.events)) {\n const actionName = ref.replace(/^\\$actions\\./, '')\n propParts.push(`${k}={actions.${actionName}}`)\n }\n }\n\n const propsStr = propParts.length > 0 ? ' ' + propParts.join(' ') : ''\n const childrenStr =\n node.children !== undefined\n ? renderChildren(node.children, indent, [], knownComponents)\n : undefined\n\n if (childrenStr !== undefined && childrenStr !== '') {\n return `${indent}<${compName}${propsStr}>\\n${indent} ${childrenStr}\\n${indent}</${compName}>`\n }\n return `${indent}<${compName}${propsStr} />`\n}\n\nfunction collectBindAndEvents(nodes: ComponentNode[]): {\n boundProps: string[]\n actionProps: string[]\n} {\n const boundProps: string[] = []\n const actionProps: string[] = []\n function walk(node: ComponentNode) {\n if (node.bind) {\n for (const ref of Object.values(node.bind)) {\n const path = ref.replace(/^\\$data\\./, '')\n if (!boundProps.includes(path)) boundProps.push(path)\n }\n }\n if (node.events) {\n for (const ref of Object.values(node.events)) {\n const name = ref.replace(/^\\$actions\\./, '')\n if (!actionProps.includes(name)) actionProps.push(name)\n }\n }\n if (Array.isArray(node.children)) {\n node.children.forEach(walk)\n }\n }\n nodes.forEach(walk)\n return { boundProps, actionProps }\n}\n\nfunction generateTsx(\n config: ViewConfig,\n _propMetas: Map<string, PropMeta[]>,\n componentsPath: string,\n): string {\n const knownComponents = new Set<string>()\n const allNodes = Object.values(config.view.regions).flat()\n const { boundProps, actionProps } = collectBindAndEvents(allNodes)\n\n const regionBlocks = Object.entries(config.view.regions)\n .map(([regionName, nodes]) => {\n const rendered = nodes.map((n) => renderNode(n, ' ', [], knownComponents)).join('\\n')\n return ` <div className=\"region-${regionName}\">\\n${rendered}\\n </div>`\n })\n .join('\\n')\n\n const importLines = [...knownComponents]\n .sort()\n .map((c) => `import { ${c} } from '${componentsPath}/${c.toLowerCase()}/${c.toLowerCase()}'`)\n .join('\\n')\n\n const hasData = boundProps.length > 0\n const hasActions = actionProps.length > 0\n\n const dataParam = hasData\n ? `data: {\\n${boundProps.map((p) => ` ${p.replace(/\\./g, '_')}: unknown // TODO: type your data`).join('\\n')}\\n }`\n : ''\n\n const actionsParam = hasActions\n ? `actions: {\\n${actionProps.map((a) => ` ${a}: (...args: unknown[]) => unknown`).join('\\n')}\\n }`\n : ''\n\n const params = [dataParam, actionsParam].filter(Boolean).join(',\\n ')\n const propsType = params ? `{\\n ${params}\\n}` : '{}'\n\n return `import React from 'react'\n${importLines}\n\ninterface PageProps ${propsType}\n\nexport function GeneratedPage({ ${hasData ? 'data, ' : ''}${hasActions ? 'actions' : ''} }: PageProps) {\n return (\n <div className=\"cascade-view\">\n${regionBlocks}\n </div>\n )\n}\n`\n}\n\nexport async function generate(args: string[], config: CascadeConfig): Promise<void> {\n const outArg = args.find((_, i) => args[i - 1] === '--out')\n const inputArg = args.find((a) => !a.startsWith('--'))\n const componentsDirArg = args.find((_, i) => args[i - 1] === '--components-dir')\n\n if (!inputArg) {\n console.error(\n 'Usage: cascivo generate <config.json> [--out output.tsx] [--components-dir ./src/components/ui]',\n )\n process.exitCode = 1\n return\n }\n\n const { readFileSync } = await import('node:fs')\n const configJson = readFileSync(inputArg, 'utf-8')\n const viewConfig = JSON.parse(configJson) as ViewConfig\n\n // prop metas not available from CLI registry type — pass empty map\n const _registry = await fetchRegistry(config.registry)\n const propMetas = new Map<string, PropMeta[]>()\n\n const componentsDir = componentsDirArg ?? config.outputDir ?? './src/components/ui'\n const tsx = generateTsx(viewConfig, propMetas, componentsDir)\n\n const outPath = outArg ?? join(dirname(inputArg), `${basename(inputArg, '.json')}.tsx`)\n\n writeFileSync(outPath, tsx, 'utf-8')\n console.log(`Generated ${outPath}`)\n\n // Try to format with vp fmt or prettier\n try {\n const { spawnSync } = await import('node:child_process')\n const fmtResult = spawnSync('pnpm', ['exec', 'vp', 'fmt', outPath], {\n encoding: 'utf8',\n stdio: 'inherit',\n })\n if (fmtResult.status !== 0) {\n const prettyResult = spawnSync('npx', ['--yes', 'prettier', '--write', outPath], {\n encoding: 'utf8',\n stdio: 'inherit',\n })\n if (prettyResult.status !== 0) {\n console.log('(Note: formatter not found — output may need manual formatting)')\n }\n }\n } catch {\n // formatting is best-effort\n }\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport { join } from 'node:path'\nimport { DEFAULT_CONFIG, THEMES, type ThemeName } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nfunction flagValue(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\nasync function promptTheme(): Promise<ThemeName> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question(`Theme? (${THEMES.join('/')}) [light]: `))\n .trim()\n .toLowerCase()\n return (THEMES as readonly string[]).includes(answer) ? (answer as ThemeName) : 'light'\n } finally {\n rl.close()\n }\n}\n\nfunction configFileContents(theme: ThemeName): string {\n return `import type { CascadeConfig } from 'cascivo'\n\nconst config: CascadeConfig = {\n registry: '${DEFAULT_CONFIG.registry}',\n outputDir: '${DEFAULT_CONFIG.outputDir}',\n theme: '${theme}',\n}\n\nexport default config\n`\n}\n\nexport async function init(args: string[] = [], cwd: string = process.cwd()): Promise<void> {\n const yes = args.includes('--yes') || args.includes('-y')\n const themeArg = flagValue(args, 'theme')?.toLowerCase()\n\n if (themeArg !== undefined && !(THEMES as readonly string[]).includes(themeArg)) {\n console.error(`Unknown theme \"${themeArg}\". Available: ${THEMES.join(', ')}`)\n process.exitCode = 1\n return\n }\n\n installPackages(['@cascivo/core', '@cascivo/tokens'], cwd)\n\n // Prompt only when interactive: --yes, a valid --theme, or a non-TTY stdin\n // (CI, agents, pipes) all take the default without blocking.\n const interactive = themeArg === undefined && !yes && stdin.isTTY\n const theme: ThemeName = (themeArg as ThemeName) ?? (interactive ? await promptTheme() : 'light')\n\n const configPath = join(cwd, 'cascivo.config.ts')\n await writeFileSafe(configPath, configFileContents(theme))\n\n console.log(`\\nCreated cascivo.config.ts (theme: ${theme})`)\n console.log('Import the theme in your root CSS or entry file:')\n console.log(` import '@cascivo/themes/${theme}.css'`)\n console.log(`Then set the theme on your root element:`)\n console.log(` <html data-theme=\"${theme}\">`)\n console.log('\\nAdd components with: cascivo add <name>')\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry, type RegistryComponent } from '../utils/registry.js'\n\nexport interface ListOptions {\n installed?: boolean\n}\n\nconst TYPE_LABELS: Record<string, string> = {\n component: 'Components',\n layout: 'Layouts (copy-paste)',\n block: 'Blocks (copy-paste)',\n section: 'Sections (copy-paste)',\n chart: 'Charts (npm: @cascivo/charts)',\n flow: 'Flow (npm: @cascivo/flow)',\n editor: 'Editor (npm: @cascivo/editor)',\n}\n\n/** Render a group of entries as an aligned text table (no section header). */\nfunction formatGroup(entries: RegistryComponent[]): string {\n const rows = entries.map((c) => [c.name, c.category, c.description] as const)\n const headers = ['Name', 'Category', 'Description'] as const\n const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)))\n\n const line = (cells: readonly string[]) =>\n cells\n .map((cell, i) => cell.padEnd(widths[i] ?? cell.length))\n .join(' ')\n .trimEnd()\n\n const sep = widths.map((w) => '-'.repeat(w)).join(' ')\n return [line(headers), sep, ...rows.map(line)].join('\\n')\n}\n\n/** Render the component list as an aligned text table, grouped by type. */\nexport function formatList(components: RegistryComponent[]): string {\n if (components.length === 0) return 'No components found.'\n\n // Determine whether any entry has an explicit type — if not, render flat.\n const hasTypes = components.some((c) => c.type !== undefined)\n if (!hasTypes) return formatGroup(components)\n\n // Group by type, preserving insertion order of first occurrence.\n const groups = new Map<string, RegistryComponent[]>()\n for (const c of components) {\n const key = c.type ?? 'component'\n if (!groups.has(key)) groups.set(key, [])\n groups.get(key)!.push(c)\n }\n\n const sections: string[] = []\n for (const [key, entries] of groups) {\n const label = TYPE_LABELS[key] ?? key\n sections.push(`${label}\\n${formatGroup(entries)}`)\n }\n return sections.join('\\n\\n')\n}\n\nexport async function list(config: CascadeConfig, options: ListOptions = {}): Promise<void> {\n const registry = await fetchRegistry(config.registry)\n let components = registry.components\n\n if (options.installed) {\n components = components.filter((c) => {\n const outputName = c.name.includes('/') ? c.name.split('/').pop()! : c.name\n return existsSync(join(process.cwd(), config.outputDir, outputName))\n })\n }\n\n console.log(formatList(components))\n console.log(\n '\\nTip: install any entry by its bare name — `cascivo add stack` resolves to ' +\n '`layout/stack`. Layout primitives (Stack, Grid, AutoGrid, Columns, Spacer, ' +\n 'Center) replace inline-style layout; see docs/cookbooks/layout-and-spacing.md.',\n )\n}\n","import { existsSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { resolve, dirname } from 'node:path'\nimport {\n buildRegistry,\n validateIndex,\n parseLegacyRegistry,\n isTemplateItem,\n validateTemplate,\n type RegistryIndex,\n} from '@cascivo/registry'\n\n/**\n * Validate every template item in an index: each must pass `validateTemplate`,\n * and any bare `registryDependencies` not present in the same index produce a\n * warning (they are expected to resolve from another registry at install time).\n * Returns `{ errors, warnings }`.\n */\nexport function validateTemplates(index: RegistryIndex): { errors: string[]; warnings: string[] } {\n const errors: string[] = []\n const warnings: string[] = []\n const localNames = new Set(index.items.map((i) => i.name))\n\n for (const item of index.items) {\n if (!isTemplateItem(item)) continue\n for (const e of validateTemplate(item)) errors.push(`template \"${item.name}\": ${e}`)\n for (const dep of item.registryDependencies ?? []) {\n const isCrossRegistry = dep.includes('/') || dep.startsWith('@') || dep.startsWith('http')\n if (!isCrossRegistry && !localNames.has(dep)) {\n warnings.push(\n `template \"${item.name}\": component \"${dep}\" is not in this index — it must resolve from another registry at install time`,\n )\n }\n }\n }\n\n return { errors, warnings }\n}\n\nexport async function registryBuild(args: string[]): Promise<void> {\n let inFile = 'cascade-registry.json'\n let outDir = 'public/r'\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--in' && args[i + 1]) {\n inFile = args[i + 1]!\n i++\n } else if (args[i] === '--out' && args[i + 1]) {\n outDir = args[i + 1]!\n i++\n }\n }\n\n const inPath = resolve(inFile)\n if (!existsSync(inPath)) {\n console.error(`cascade registry build: file not found: ${inPath}`)\n process.exitCode = 1\n return\n }\n\n const raw = JSON.parse(await readFile(inPath, 'utf8')) as unknown\n const indexBase = dirname(inPath)\n void indexBase\n\n let index = (() => {\n if (\n typeof raw === 'object' &&\n raw !== null &&\n (raw as Record<string, unknown>)['schemaVersion'] === 2\n ) {\n return raw\n }\n return parseLegacyRegistry(raw)\n })()\n\n const result = validateIndex(index)\n if (result.warnings.length > 0) {\n for (const w of result.warnings) console.warn(`warn: ${w}`)\n }\n if (!result.ok) {\n for (const e of result.errors) console.error(`error: ${e}`)\n process.exitCode = 1\n return\n }\n\n const templateResult = validateTemplates(index as RegistryIndex)\n for (const w of templateResult.warnings) console.warn(`warn: ${w}`)\n if (templateResult.errors.length > 0) {\n for (const e of templateResult.errors) console.error(`error: ${e}`)\n process.exitCode = 1\n return\n }\n\n const outPath = resolve(outDir)\n await buildRegistry(index as Parameters<typeof buildRegistry>[0], outPath)\n console.log(`cascade registry build: wrote static output to ${outPath}`)\n}\n","import type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry } from '../utils/registry.js'\nimport { fetchJson } from '../utils/http.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\ninterface SearchResult {\n name: string\n version: string\n description: string\n registry?: string\n}\n\nfunction matchesQuery(item: RegistryItem, query: string): boolean {\n const q = query.toLowerCase()\n return (\n item.name.toLowerCase().includes(q) ||\n item.description.toLowerCase().includes(q) ||\n item.tags.some((t) => t.toLowerCase().includes(q))\n )\n}\n\nexport async function search(args: string[], config: CascadeConfig): Promise<void> {\n const nsFlag = args.indexOf('--registry')\n const registryFilter = nsFlag !== -1 ? args[nsFlag + 1] : undefined\n const queryParts = args.filter((a, i) => a !== '--registry' && args[i - 1] !== '--registry')\n const query = queryParts.join(' ').trim()\n\n if (!query) {\n console.error('Usage: cascivo search <query> [--registry @ns]')\n return\n }\n\n const results: SearchResult[] = []\n\n if (!registryFilter) {\n // Search default registry\n const registry = await fetchRegistry(config.registry)\n for (const c of registry.components) {\n const item = c as unknown as RegistryItem\n if (matchesQuery(item, query)) {\n results.push({ name: c.name, version: c.version, description: c.description })\n }\n }\n }\n\n // Search configured namespace registries\n const registries = config.registries ?? {}\n for (const [ns, nsCfg] of Object.entries(registries)) {\n if (registryFilter && ns !== registryFilter) continue\n try {\n const template = typeof nsCfg === 'string' ? nsCfg : nsCfg.url\n const indexUrl = template.replace(/{name}[^$]*$/, '').replace(/\\/$/, '') + '/registry.json'\n const raw = (await fetchJson(indexUrl)) as { items?: RegistryItem[] }\n for (const item of raw.items ?? []) {\n if (matchesQuery(item, query)) {\n results.push({\n name: `${ns}/${item.name}`,\n version: item.version,\n description: item.description,\n registry: ns,\n })\n }\n }\n } catch {\n console.warn(` [warn] Could not search ${ns} registry`)\n }\n }\n\n if (results.length === 0) {\n console.log('No results found.')\n return\n }\n\n for (const r of results) {\n const reg = r.registry ? ` (${r.registry})` : ''\n console.log(`${r.name}@${r.version}${reg} — ${r.description}`)\n }\n}\n","export type FontFamily = 'system' | 'geometric' | 'humanist' | 'transitional' | 'mono'\n\nexport const RADIUS_STOPS = [0, 0.25, 0.375, 0.5, 0.75, 1.5] as const\nexport type RadiusStop = (typeof RADIUS_STOPS)[number]\n\nexport const RADIUS_LABELS: Record<RadiusStop, string> = {\n 0: 'none',\n 0.25: 'sm',\n 0.375: 'md',\n 0.5: 'lg',\n 0.75: 'xl',\n 1.5: 'pill',\n}\n\nexport type ThemeConfig = {\n baseMode: 'light' | 'dark'\n accentHue: number\n accentChroma: number\n radiusBase: RadiusStop\n fontFamily: FontFamily\n presetId: string | null\n}\n\nexport const DEFAULT_CONFIG: ThemeConfig = {\n baseMode: 'light',\n accentHue: 250,\n accentChroma: 0.2,\n radiusBase: 0.375,\n fontFamily: 'system',\n presetId: 'light',\n}\n","import { DEFAULT_CONFIG, type ThemeConfig } from './config.js'\n\n/** Encode a theme config as a URL-safe base64 string (shared by the /create URL\n * hash and the CLI `--from` handoff, so the two never drift). */\nexport function configToHash(config: ThemeConfig): string {\n const json = JSON.stringify(config)\n return btoa(json).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Decode a hash produced by {@link configToHash}. Returns null on malformed\n * input; unknown/missing fields fall back to {@link DEFAULT_CONFIG}. */\nexport function hashToConfig(hash: string): ThemeConfig | null {\n if (!hash) return null\n try {\n const base64 = hash.replace(/-/g, '+').replace(/_/g, '/')\n const json = atob(base64)\n const parsed = JSON.parse(json) as Partial<ThemeConfig>\n return {\n baseMode: parsed.baseMode === 'dark' ? 'dark' : 'light',\n accentHue: typeof parsed.accentHue === 'number' ? parsed.accentHue : DEFAULT_CONFIG.accentHue,\n accentChroma:\n typeof parsed.accentChroma === 'number' ? parsed.accentChroma : DEFAULT_CONFIG.accentChroma,\n radiusBase: (typeof parsed.radiusBase === 'number'\n ? parsed.radiusBase\n : DEFAULT_CONFIG.radiusBase) as ThemeConfig['radiusBase'],\n fontFamily: parsed.fontFamily ?? DEFAULT_CONFIG.fontFamily,\n presetId: parsed.presetId ?? null,\n }\n } catch {\n return null\n }\n}\n","import type { ThemeConfig } from './config.js'\n\nconst FONT_STACKS: Record<string, string> = {\n geometric: \"'Futura', 'Century Gothic', 'Trebuchet MS', ui-sans-serif, sans-serif\",\n humanist: \"'Gill Sans', 'Trebuchet MS', 'Calibri', ui-sans-serif, sans-serif\",\n transitional: \"'Optima', 'Candara', 'Palatino Linotype', ui-sans-serif, sans-serif\",\n mono: \"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace\",\n}\n\n// Resolved concrete values from packages/themes/src/light.css + primitives\nconst BASE_LIGHT = `\n color-scheme: light;\n --cascivo-color-background: oklch(1 0 0);\n --cascivo-color-surface: oklch(0.985 0.002 264);\n --cascivo-color-surface-2: oklch(0.967 0.003 264);\n --cascivo-color-bg: var(--cascivo-color-background);\n --cascivo-color-bg-subtle: var(--cascivo-color-surface);\n --cascivo-color-surface-raised: var(--cascivo-color-surface);\n --cascivo-color-surface-overlay: var(--cascivo-color-background);\n --cascivo-color-border: oklch(0.928 0.006 264);\n --cascivo-color-border-strong: oklch(0.872 0.008 264);\n --cascivo-border-subtle: oklch(0.928 0.006 264);\n --cascivo-border-default: oklch(0.872 0.008 264);\n --cascivo-border-strong: oklch(0.707 0.015 264);\n --cascivo-color-foreground: oklch(0.145 0.005 264);\n --cascivo-color-foreground-muted: oklch(0.554 0.018 264);\n --cascivo-color-text: var(--cascivo-color-foreground);\n --cascivo-color-text-subtle: oklch(0.446 0.018 264);\n --cascivo-color-text-muted: oklch(0.707 0.015 264);\n --cascivo-color-text-on-accent: oklch(1 0 0);\n --cascivo-color-text-on-destructive: oklch(1 0 0);\n --cascivo-color-primary: oklch(0.205 0 0);\n --cascivo-color-primary-fg: oklch(0.985 0 0);\n --cascivo-color-primary-hover: oklch(0.27 0 0);\n --cascivo-color-primary-active: oklch(0.32 0 0);\n --cascivo-color-active-bg: oklch(0.145 0.005 264 / 6%);\n --cascivo-color-destructive: oklch(0.54 0.188 22);\n --cascivo-color-destructive-hover: oklch(0.448 0.17 22);\n --cascivo-color-destructive-subtle: oklch(0.971 0.013 22);\n --cascivo-color-error: oklch(0.628 0.188 22);\n --cascivo-color-warning: oklch(0.768 0.145 75);\n --cascivo-color-success: oklch(0.648 0.15 145);\n --cascivo-color-success-subtle: oklch(0.982 0.018 145);\n --cascivo-color-warning-subtle: oklch(0.98 0.02 75);\n --cascivo-color-info: oklch(0.546 0.224 250);\n --cascivo-color-info-subtle: oklch(0.97 0.025 250);\n --cascivo-color-success-foreground: oklch(0.45 0.14 145);\n --cascivo-color-warning-foreground: oklch(0.5 0.14 75);\n --cascivo-shadow-xs: 0 1px 2px oklch(0 0 0 / 0.05);\n --cascivo-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.07), 0 1px 2px oklch(0 0 0 / 0.04);\n --cascivo-shadow-md: 0 2px 8px oklch(0 0 0 / 0.07), 0 1px 2px oklch(0 0 0 / 0.04);\n --cascivo-shadow-overlay: 0 4px 32px oklch(0 0 0 / 0.16), 0 0 0 1px oklch(0 0 0 / 0.04);\n --cascivo-shadow-lg: var(--cascivo-shadow-overlay);\n --cascivo-ring-width: 2px;\n --cascivo-ring-offset: 0px;\n --cascivo-ring-color: color-mix(in oklch, var(--cascivo-color-accent) 55%, transparent);\n --cascivo-focus-ring: 0 0 0 var(--cascivo-ring-width) var(--cascivo-ring-color);`\n\n// Resolved concrete values from packages/themes/src/dark.css + primitives\nconst BASE_DARK = `\n color-scheme: dark;\n --cascivo-color-background: oklch(0.145 0.005 250);\n --cascivo-color-surface: oklch(0.185 0.007 250);\n --cascivo-color-surface-2: oklch(0.22 0.008 250);\n --cascivo-color-bg: var(--cascivo-color-background);\n --cascivo-color-bg-subtle: var(--cascivo-color-surface);\n --cascivo-color-surface-raised: var(--cascivo-color-surface-2);\n --cascivo-color-surface-overlay: var(--cascivo-color-surface);\n --cascivo-color-border: oklch(1 0 0 / 10%);\n --cascivo-color-border-strong: oklch(1 0 0 / 16%);\n --cascivo-border-subtle: oklch(1 0 0 / 0.06);\n --cascivo-border-default: oklch(1 0 0 / 0.1);\n --cascivo-border-strong: oklch(1 0 0 / 0.2);\n --cascivo-color-foreground: oklch(0.985 0.002 264);\n --cascivo-color-foreground-muted: oklch(0.707 0.015 264);\n --cascivo-color-text: var(--cascivo-color-foreground);\n --cascivo-color-text-subtle: oklch(0.707 0.015 264);\n --cascivo-color-text-muted: oklch(0.554 0.018 264);\n --cascivo-color-text-on-accent: oklch(0.145 0.005 250);\n --cascivo-color-text-on-destructive: oklch(1 0 0);\n --cascivo-color-primary: oklch(0.922 0 0);\n --cascivo-color-primary-fg: oklch(0.205 0 0);\n --cascivo-color-primary-hover: oklch(0.86 0 0);\n --cascivo-color-primary-active: oklch(0.8 0 0);\n --cascivo-color-active-bg: oklch(1 0 0 / 8%);\n --cascivo-color-destructive: oklch(0.72 0.16 22);\n --cascivo-color-destructive-hover: oklch(0.628 0.188 22);\n --cascivo-color-destructive-subtle: oklch(0.628 0.188 22 / 0.1);\n --cascivo-color-error: oklch(0.72 0.16 22);\n --cascivo-color-warning: oklch(0.82 0.13 75);\n --cascivo-color-success: oklch(0.72 0.13 145);\n --cascivo-color-success-subtle: oklch(0.72 0.13 145 / 0.1);\n --cascivo-color-warning-subtle: oklch(0.82 0.13 75 / 0.1);\n --cascivo-color-info: oklch(0.65 0.2 250);\n --cascivo-color-info-subtle: oklch(0.65 0.2 250 / 0.1);\n --cascivo-color-success-foreground: oklch(0.72 0.13 145);\n --cascivo-color-warning-foreground: oklch(0.82 0.13 75);\n --cascivo-shadow-xs: none;\n --cascivo-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.4);\n --cascivo-shadow-md: 0 2px 8px oklch(0 0 0 / 0.45);\n --cascivo-shadow-overlay: 0 4px 32px oklch(0 0 0 / 0.6), 0 0 0 1px oklch(1 0 0 / 0.06);\n --cascivo-shadow-lg: var(--cascivo-shadow-overlay);\n --cascivo-ring-width: 2px;\n --cascivo-ring-offset: 0px;\n --cascivo-ring-color: color-mix(in oklch, var(--cascivo-color-accent) 65%, transparent);\n --cascivo-focus-ring: 0 0 0 var(--cascivo-ring-width) var(--cascivo-ring-color);`\n\nexport interface ConfigToCSSOptions {\n /** When true, inline the full base theme token set so the block is\n * self-contained (used by the live preview). The exported theme omits these —\n * users import the base theme themselves. */\n previewMode?: boolean\n /** The `data-theme` selector value the generated tokens attach to. */\n themeName?: string\n}\n\nexport function configToCSS(config: ThemeConfig, options: ConfigToCSSOptions = {}): string {\n const { previewMode = false, themeName = 'create-custom' } = options\n const light = config.baseMode === 'light'\n const h = config.accentHue\n const c = config.accentChroma\n\n const acc = (l: number, chroma = c) => `oklch(${l} ${chroma.toFixed(3)} ${h})`\n\n const lines: string[] = [\n `/* Add to your project CSS after importing the base theme: */`,\n `/* @import '@cascivo/themes/${config.baseMode}.css'; */`,\n `/* @import './theme.css'; */`,\n ``,\n `@layer cascivo.theme {`,\n ` [data-theme=\"${themeName}\"] {`,\n ]\n\n if (previewMode) {\n lines.push(light ? BASE_LIGHT : BASE_DARK)\n lines.push(``)\n }\n\n lines.push(\n ` /* ── Accent ─────────────────────────────────── */`,\n ` --cascivo-color-accent: ${acc(light ? 0.52 : 0.65)};`,\n ` --cascivo-color-accent-foreground: ${light ? 'oklch(1 0 0)' : `oklch(0.145 0.005 ${h})`};`,\n ` --cascivo-color-accent-hover: ${acc(light ? 0.45 : 0.707)};`,\n ` --cascivo-color-accent-active: ${acc(light ? 0.373 : 0.808, Math.min(c, 0.155))};`,\n ` --cascivo-color-accent-subtle: ${acc(light ? 0.97 : 0.623, 0.025)};`,\n ` --cascivo-color-accent-muted: ${acc(light ? 0.932 : 0.623, light ? 0.055 : c * 0.2)};`,\n ``,\n ` /* ── Radius ─────────────────────────────────── */`,\n ` --cascivo-radius-base: ${config.radiusBase}rem;`,\n ` --cascivo-radius-control: var(--cascivo-radius-base);`,\n ` --cascivo-radius-surface: calc(var(--cascivo-radius-base) * 1.66);`,\n ` --cascivo-radius-indicator: calc(var(--cascivo-radius-base) / 2);`,\n ` --cascivo-radius-full: 9999px;`,\n ` --cascivo-radius-component: var(--cascivo-radius-base);`,\n ` --cascivo-radius-button: var(--cascivo-radius-base);`,\n ` --cascivo-radius-input: var(--cascivo-radius-base);`,\n ` --cascivo-radius-card: calc(var(--cascivo-radius-base) * 1.66);`,\n ` --cascivo-radius-badge: var(--cascivo-radius-full);`,\n ` --cascivo-radius-modal: calc(var(--cascivo-radius-base) * 2);`,\n )\n\n if (config.fontFamily !== 'system') {\n lines.push(``)\n lines.push(` /* ── Font ───────────────────────────────────── */`)\n lines.push(\n ` --cascivo-font-sans: ${FONT_STACKS[config.fontFamily] ?? FONT_STACKS['humanist']};`,\n )\n }\n\n lines.push(` }`)\n lines.push(`}`)\n\n return lines.join('\\n')\n}\n","import { resolve } from 'node:path'\nimport { configToCSS, hashToConfig } from '@cascivo/theme-kit'\nimport { THEMES } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nconst THEME_NAME_RE = /^[a-z][a-z0-9-]*$/\n\n/** Read a `--key value` or `--key=value` flag from an argv slice. */\nfunction flag(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\n/**\n * `cascivo theme create <name> --from <hash>` — turn a /create theme-builder\n * config (the `#hash` in the builder URL, or its \"Copy CLI command\" output) into\n * an owned `<name>.theme.css` in the project. Uses the same generator the builder\n * previews with, so the file matches the preview exactly.\n */\nasync function themeCreate(args: string[], cwd: string): Promise<void> {\n const name = args.find((a) => !a.startsWith('--'))\n const hash = flag(args, 'from')\n const dryRun = args.includes('--dry-run')\n\n if (!name || !hash) {\n console.error('Usage: cascivo theme create <name> --from <hash> [--out <path>]')\n console.error(\n 'Get <hash> from the theme builder at https://cascivo.com/create (Copy CLI command).',\n )\n return\n }\n if (!THEME_NAME_RE.test(name)) {\n console.error(`Invalid theme name \"${name}\". Use lowercase letters, digits, and dashes.`)\n return\n }\n\n const config = hashToConfig(hash)\n if (!config) {\n console.error('Could not decode --from. Copy the command again from the theme builder.')\n return\n }\n\n const css = configToCSS(config, { themeName: name })\n if (dryRun) {\n console.log(css)\n return\n }\n\n const outPath = resolve(cwd, flag(args, 'out') ?? `${name}.theme.css`)\n await writeFileSafe(outPath, css)\n\n console.log(`\\n✓ Wrote ${name}.theme.css`)\n console.log(`\\nImport the base theme and your overlay in your entry CSS:`)\n console.log(` @import '@cascivo/themes/${config.baseMode}.css';`)\n console.log(` @import './${name}.theme.css';`)\n console.log(`Then set it on a container:`)\n console.log(` <div data-theme=\"${name}\">…</div>`)\n}\n\nexport async function theme(args: string[]): Promise<void> {\n const [sub, name] = args\n\n if (sub === 'create') {\n await themeCreate(args.slice(1), process.cwd())\n return\n }\n\n if (sub !== 'add' || !name) {\n console.error(`Usage: cascivo theme add <${THEMES.join('|')}>`)\n console.error(` cascivo theme create <name> --from <hash>`)\n return\n }\n if (!(THEMES as readonly string[]).includes(name)) {\n console.error(`Unknown theme \"${name}\". Available: ${THEMES.join(', ')}`)\n return\n }\n\n installPackages(['@cascivo/themes'])\n\n console.log(`\\nImport the theme in your root CSS or entry file:`)\n console.log(` import '@cascivo/themes/${name}.css'`)\n console.log(`Then set it on a container:`)\n console.log(` <div data-theme=\"${name}\">…</div>`)\n}\n","/**\n * Minimal line-based diff (LCS) rendered in a unified-ish format. Zero deps —\n * good enough to preview what `cascade update` will change.\n */\nexport function diffLines(oldStr: string, newStr: string): string[] {\n const a = oldStr.split('\\n')\n const b = newStr.split('\\n')\n const n = a.length\n const m = b.length\n\n // LCS length table.\n const lcs: number[][] = Array.from({ length: n + 1 }, () =>\n Array.from({ length: m + 1 }, () => 0),\n )\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i]![j] =\n a[i] === b[j] ? lcs[i + 1]![j + 1]! + 1 : Math.max(lcs[i + 1]![j]!, lcs[i]![j + 1]!)\n }\n }\n\n const out: string[] = []\n let i = 0\n let j = 0\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n out.push(` ${a[i]}`)\n i++\n j++\n } else if (lcs[i + 1]![j]! >= lcs[i]![j + 1]!) {\n out.push(`- ${a[i]}`)\n i++\n } else {\n out.push(`+ ${b[j]}`)\n j++\n }\n }\n while (i < n) out.push(`- ${a[i++]}`)\n while (j < m) out.push(`+ ${b[j++]}`)\n return out\n}\n\n/** True when the two strings differ. */\nexport function hasChanges(oldStr: string, newStr: string): boolean {\n return oldStr !== newStr\n}\n","export interface MergeResult {\n text: string\n conflicts: number\n}\n\nfunction lcs(a: string[], b: string[]): number[][] {\n const m = a.length\n const n = b.length\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array.from({ length: n + 1 }, () => 0))\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i]![j] =\n a[i - 1] === b[j - 1] ? dp[i - 1]![j - 1]! + 1 : Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!)\n }\n }\n return dp\n}\n\ninterface Chunk {\n type: 'common' | 'left' | 'right'\n lines: string[]\n}\n\nfunction diff(base: string[], changed: string[]): Chunk[] {\n const dp = lcs(base, changed)\n const chunks: Chunk[] = []\n let i = base.length\n let j = changed.length\n const leftOnly: string[] = []\n const rightOnly: string[] = []\n const common: string[] = []\n\n function flush() {\n if (leftOnly.length > 0 || rightOnly.length > 0) {\n if (common.length > 0) {\n chunks.unshift({ type: 'common', lines: [...common] })\n common.length = 0\n }\n chunks.unshift({\n type: leftOnly.length > 0 ? 'left' : 'right',\n lines: leftOnly.length > 0 ? [...leftOnly] : [...rightOnly],\n })\n leftOnly.length = 0\n rightOnly.length = 0\n } else if (common.length > 0) {\n chunks.unshift({ type: 'common', lines: [...common] })\n common.length = 0\n }\n }\n\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && base[i - 1] === changed[j - 1]) {\n if (leftOnly.length > 0 || rightOnly.length > 0) flush()\n common.unshift(base[i - 1]!)\n i--\n j--\n } else if (j > 0 && (i === 0 || dp[i]![j - 1]! >= dp[i - 1]![j]!)) {\n flush()\n rightOnly.unshift(changed[j - 1]!)\n j--\n } else {\n flush()\n leftOnly.unshift(base[i - 1]!)\n i--\n }\n }\n flush()\n return chunks\n}\n\nexport function merge(base: string, local: string, upstream: string): MergeResult {\n const baseLines = base.split('\\n')\n const localLines = local.split('\\n')\n const upstreamLines = upstream.split('\\n')\n\n const localChunks = diff(baseLines, localLines)\n\n const localMap = new Map<string, string[]>()\n const upstreamMap = new Map<string, string[]>()\n\n let li = 0\n\n for (const c of localChunks) {\n if (c.type === 'left') {\n localMap.set(`del:${li}`, c.lines)\n } else if (c.type === 'right') {\n localMap.set(`ins:${li}`, c.lines)\n li += c.lines.length\n } else {\n li += c.lines.length\n }\n }\n void localMap\n void upstreamMap\n\n // Simple line-by-line three-way merge\n const result: string[] = []\n let conflicts = 0\n let bi = 0\n let lli = 0\n let uui = 0\n\n // Build index maps: base line → local and upstream lines\n // Use a simpler approach: if local == base, take upstream; if upstream == base, take local;\n // if both differ, conflict.\n const bLen = baseLines.length\n const lLen = localLines.length\n const uLen = upstreamLines.length\n\n // If local unchanged vs base, fast-forward to upstream\n if (local === base) {\n return { text: upstream, conflicts: 0 }\n }\n // If upstream unchanged vs base, keep local\n if (upstream === base) {\n return { text: local, conflicts: 0 }\n }\n // Both changed — try line-by-line\n void bi\n void lli\n void uui\n void bLen\n void lLen\n void uLen\n\n const localDiffs = diff(baseLines, localLines)\n const upstreamDiffs = diff(baseLines, upstreamLines)\n\n // Reconstruct base position aligned chunks\n let basePos = 0\n let lPos = 0\n let uPos = 0\n const localOut: { baseStart: number; baseEnd: number; lines: string[] }[] = []\n const upstreamOut: { baseStart: number; baseEnd: number; lines: string[] }[] = []\n\n for (const c of localDiffs) {\n if (c.type === 'common') {\n lPos += c.lines.length\n basePos += c.lines.length\n } else if (c.type === 'right') {\n localOut.push({ baseStart: basePos, baseEnd: basePos, lines: c.lines })\n lPos += c.lines.length\n } else {\n localOut.push({ baseStart: basePos, baseEnd: basePos + c.lines.length, lines: [] })\n basePos += c.lines.length\n }\n }\n basePos = 0\n for (const c of upstreamDiffs) {\n if (c.type === 'common') {\n uPos += c.lines.length\n basePos += c.lines.length\n } else if (c.type === 'right') {\n upstreamOut.push({ baseStart: basePos, baseEnd: basePos, lines: c.lines })\n uPos += c.lines.length\n } else {\n upstreamOut.push({ baseStart: basePos, baseEnd: basePos + c.lines.length, lines: [] })\n basePos += c.lines.length\n }\n }\n void lPos\n void uPos\n\n // Simple merge: walk base lines; apply local and upstream edits\n // When both touch the same region, emit conflict markers\n const localByBase = new Map<number, { end: number; lines: string[] }>()\n for (const e of localOut) {\n localByBase.set(e.baseStart, { end: e.baseEnd, lines: e.lines })\n }\n const upstreamByBase = new Map<number, { end: number; lines: string[] }>()\n for (const e of upstreamOut) {\n upstreamByBase.set(e.baseStart, { end: e.baseEnd, lines: e.lines })\n }\n\n let b = 0\n while (b <= baseLines.length) {\n const lEdit = localByBase.get(b)\n const uEdit = upstreamByBase.get(b)\n\n if (lEdit && uEdit) {\n const lEnd = Math.max(lEdit.end, b)\n const uEnd = Math.max(uEdit.end, b)\n const lLines = lEdit.lines\n const uLines = uEdit.lines\n if (JSON.stringify(lLines) === JSON.stringify(uLines)) {\n result.push(...lLines)\n } else {\n result.push('<<<<<<< local')\n result.push(...lLines)\n result.push('=======')\n result.push(...uLines)\n result.push('>>>>>>> upstream')\n conflicts++\n }\n b = Math.max(lEnd, uEnd, b + 1)\n } else if (lEdit) {\n result.push(...lEdit.lines)\n b = Math.max(lEdit.end, b + 1)\n } else if (uEdit) {\n result.push(...uEdit.lines)\n b = Math.max(uEdit.end, b + 1)\n } else {\n if (b < baseLines.length) result.push(baseLines[b]!)\n b++\n }\n }\n\n return { text: result.join('\\n'), conflicts }\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport { readFile } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { diffLines, hasChanges } from '../utils/diff.js'\nimport { readFileSafe, resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchRegistry, fileName, findComponent } from '../utils/registry.js'\nimport { readLock, writeLock, updateLockEntry } from '../utils/lock.js'\nimport { fetchJson, fetchTextRetry } from '../utils/http.js'\nimport { merge } from '../utils/merge.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question(`${question} (y/N): `)).trim().toLowerCase()\n return answer === 'y' || answer === 'yes'\n } finally {\n rl.close()\n }\n}\n\nexport async function update(\n name: string | undefined,\n config: CascadeConfig,\n opts: { check?: boolean; yes?: boolean } = {},\n): Promise<void> {\n if (opts.check) {\n return updateCheck(config)\n }\n\n if (!name) {\n console.error('Usage: cascivo update <component>')\n return\n }\n\n const lock = await readLock()\n const lockEntry = lock?.items[name]\n\n const registry = await fetchRegistry(config.registry)\n const entry = findComponent(registry, name)\n if (!entry) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n return\n }\n\n if (lockEntry) {\n // Three-way merge path\n const lockedVersion = lockEntry.version\n const registryBase = lockEntry.registry\n const baseItemUrl = `${registryBase}/r/${name}@${lockedVersion}.json`\n\n let baseItem: RegistryItem | null = null\n try {\n baseItem = (await fetchJson(baseItemUrl)) as RegistryItem\n } catch {\n console.warn(\n `Warning: could not fetch base version ${lockedVersion} from ${baseItemUrl}. Falling back to two-way diff.`,\n )\n }\n\n if (baseItem) {\n await threeWayUpdate(name, entry, baseItem, config, opts)\n } else {\n await twoWayUpdate(name, entry, config, opts)\n }\n } else {\n console.warn(\n `Warning: \"${name}\" has no lock entry. Falling back to two-way diff update (pre-v11 install).`,\n )\n await twoWayUpdate(name, entry, config, opts)\n }\n}\n\nasync function threeWayUpdate(\n name: string,\n upstreamEntry: ReturnType<typeof findComponent>,\n baseItem: RegistryItem,\n config: CascadeConfig,\n opts: { yes?: boolean },\n): Promise<void> {\n if (!upstreamEntry) return\n const outputName = name.includes('/') ? name.split('/').pop()! : name\n const summaries: { file: string; result: 'clean' | 'conflict' | 'unchanged' }[] = []\n const pending: { dest: string; content: string; conflicts: number }[] = []\n\n for (const url of upstreamEntry.files) {\n const fname = fileName(url)\n const baseFile = baseItem.files.find((f) => fileName(f.url) === fname)\n const dest = resolveOutputPath(config.outputDir, outputName, fname)\n\n const upstream = await fetchTextRetry(url)\n const local = existsSync(dest) ? await readFile(dest, 'utf8') : ''\n const base = baseFile ? await fetchTextRetry(baseFile.url) : ''\n\n if (base === '' && local === '') {\n summaries.push({ file: fname, result: 'clean' })\n pending.push({ dest, content: upstream, conflicts: 0 })\n continue\n }\n\n const { text, conflicts } = merge(base, local, upstream)\n\n if (conflicts > 0) {\n summaries.push({ file: fname, result: 'conflict' })\n } else if (text === local) {\n summaries.push({ file: fname, result: 'unchanged' })\n continue\n } else {\n summaries.push({ file: fname, result: 'clean' })\n }\n pending.push({ dest, content: text, conflicts })\n }\n\n if (pending.length === 0) {\n console.log(`${name} is already up to date.`)\n return\n }\n\n for (const s of summaries) {\n const icon = s.result === 'conflict' ? '⚠' : s.result === 'clean' ? '✓' : '·'\n console.log(` ${icon} ${s.file} (${s.result})`)\n }\n\n const conflicted = pending.filter((p) => p.conflicts > 0)\n const shouldApply = opts.yes\n ? conflicted.length === 0 // --yes skips items with conflicts\n : await confirm(`\\nApply ${pending.length} change(s) to ${name}?`)\n\n if (shouldApply || opts.yes) {\n const lock = await readLock()\n let updatedLock = lock\n\n for (const { dest, content, conflicts } of pending) {\n if (opts.yes && conflicts > 0) {\n console.log(` skipped (conflicts): ${dest}`)\n continue\n }\n await writeFileSafe(dest, content)\n }\n\n if (lock && updatedLock) {\n const hasConflicts = conflicted.length > 0\n updatedLock = updateLockEntry(updatedLock, name, {\n ...lock.items[name]!,\n version: upstreamEntry.version,\n ...(hasConflicts ? { conflicted: true as const } : {}),\n })\n await writeLock(updatedLock)\n }\n\n console.log(`Updated ${name}.`)\n if (conflicted.length > 0) {\n console.log(`${conflicted.length} file(s) have conflict markers — resolve them manually.`)\n }\n } else {\n console.log('Aborted. No files changed.')\n }\n}\n\nasync function twoWayUpdate(\n name: string,\n entry: ReturnType<typeof findComponent>,\n config: CascadeConfig,\n opts: { yes?: boolean },\n): Promise<void> {\n if (!entry) return\n const pending: { path: string; content: string }[] = []\n\n for (const url of entry.files) {\n let latest: string\n try {\n latest = await fetchTextRetry(url)\n } catch (e) {\n console.error(e instanceof Error ? e.message : String(e))\n return\n }\n const dest = resolveOutputPath(config.outputDir, entry.name, fileName(url))\n const current = await readFileSafe(dest)\n\n if (current === null) {\n console.log(`New file: ${dest}`)\n pending.push({ path: dest, content: latest })\n } else if (hasChanges(current, latest)) {\n console.log(`\\n--- ${dest}`)\n console.log(diffLines(current, latest).join('\\n'))\n pending.push({ path: dest, content: latest })\n }\n }\n\n if (pending.length === 0) {\n console.log(`${name} is already up to date.`)\n return\n }\n\n const shouldApply = opts.yes || (await confirm(`\\nApply ${pending.length} change(s) to ${name}?`))\n\n if (shouldApply) {\n for (const { path, content } of pending) {\n await writeFileSafe(path, content)\n }\n console.log(`Updated ${name}.`)\n } else {\n console.log('Aborted. No files changed.')\n }\n}\n\nasync function updateCheck(config: CascadeConfig): Promise<void> {\n const lock = await readLock()\n if (!lock || Object.keys(lock.items).length === 0) {\n console.log('No installed components found in cascivo.lock.')\n return\n }\n\n const registry = await fetchRegistry(config.registry)\n let outdated = 0\n\n for (const [name, entry] of Object.entries(lock.items)) {\n const current = findComponent(registry, name)\n if (!current) continue\n // Content hashes are the accurate signal (they change with every source\n // edit); the version compare is the fallback for older registries.\n if (current.fileHashes && Object.keys(current.fileHashes).length > 0) {\n const lockByBase = new Map(\n Object.entries(entry.files).map(([dest, hash]) => [dest.split('/').pop()!, hash]),\n )\n const changed = Object.entries(current.fileHashes).filter(\n ([file, hash]) => lockByBase.get(file) !== hash,\n )\n if (changed.length > 0) {\n console.log(\n `${name}: ${changed.length} file(s) changed upstream (${entry.version} → ${current.version})`,\n )\n outdated++\n }\n } else if (current.version !== entry.version) {\n console.log(`${name}: ${entry.version} → ${current.version}`)\n outdated++\n }\n }\n\n if (outdated > 0) {\n console.log(`${outdated} component(s) outdated.`)\n process.exitCode = 1\n } else {\n console.log('All components up to date.')\n }\n}\n","import type { CascadeConfig } from '../utils/config.js'\nimport { parseAddress, resolveItemUrl } from '../utils/resolve.js'\nimport { fetchJson } from '../utils/http.js'\nimport { asTemplateMeta, isTemplateItem, type RegistryItem } from '@cascivo/registry'\n\n/** Render an item's details as text. Pure, so it can be unit-tested. */\nexport function formatItem(item: RegistryItem): string {\n const lines: string[] = []\n lines.push(`\\n${item.name} v${item.version}`)\n lines.push(`Type: ${item.type}${item.category ? ` / ${item.category}` : ''}`)\n lines.push(item.description)\n if (item.author) lines.push(`Author: ${item.author}`)\n if (item.license) lines.push(`License: ${item.license}`)\n if (item.homepage) lines.push(`Homepage: ${item.homepage}`)\n\n if (item.install) {\n lines.push(`Distribution: npm package — pnpm add ${item.install}`)\n if (item.styles) lines.push(`Stylesheet: import '${item.styles}' (required)`)\n } else if (!isTemplateItem(item)) {\n lines.push(`Distribution: copy-paste — npx cascivo add ${item.name}`)\n }\n\n if (isTemplateItem(item)) {\n try {\n const meta = asTemplateMeta(item.meta)\n lines.push(`\\nTemplate: ${meta.intent}`)\n lines.push(`Framework: ${meta.framework}`)\n if (meta.demoUrl) lines.push(`Demo: ${meta.demoUrl}`)\n if (meta.pages?.length) {\n lines.push('Pages:')\n for (const p of meta.pages) lines.push(` ${p.name} → ${p.target}`)\n }\n } catch {\n // meta is malformed — base fields above are still useful.\n }\n }\n\n if (item.changelog?.length) {\n lines.push('\\nChangelog:')\n for (const c of item.changelog.slice(0, 5)) lines.push(` ${c.version}: ${c.note}`)\n }\n\n if (item.files?.length) {\n lines.push('\\nFiles:')\n for (const f of item.files) lines.push(` ${f.url}${f.target ? ` → ${f.target}` : ''}`)\n }\n\n if (item.dependencies?.length) lines.push(`\\nDependencies: ${item.dependencies.join(', ')}`)\n\n if (item.registryDependencies?.length) {\n const label = isTemplateItem(item) ? 'Components' : 'Registry dependencies'\n lines.push(`${label}: ${item.registryDependencies.join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n\nexport async function view(args: string[], config: CascadeConfig): Promise<void> {\n const spec = args[0]\n if (!spec) {\n console.error('Usage: cascivo view <component-spec>')\n return\n }\n\n const addr = parseAddress(spec)\n const { url, headers, params } = await resolveItemUrl(addr, config)\n const fetchOpts: Parameters<typeof fetchJson>[1] = {}\n if (headers) fetchOpts.headers = headers\n if (params) fetchOpts.params = params\n const item = (await fetchJson(url, fetchOpts)) as RegistryItem\n\n console.log(formatItem(item))\n}\n","import { createRequire } from 'node:module'\nimport { argv } from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { add } from './commands/add.js'\nimport { create } from './commands/create.js'\nimport { runDoctor } from './commands/doctor.js'\nimport { generate } from './commands/generate.js'\nimport { init } from './commands/init.js'\nimport { list } from './commands/list.js'\nimport { registryBuild } from './commands/registry.js'\nimport { search } from './commands/search.js'\nimport { theme } from './commands/theme.js'\nimport { update } from './commands/update.js'\nimport { view } from './commands/view.js'\nimport { loadConfig, THEMES } from './utils/config.js'\n\n// Read at runtime: this file lives one level below the package root both in\n// src/ (dev, tests) and in dist/ (published bundle), so ../package.json is\n// always the cascivo package manifest.\nexport const VERSION: string = (\n createRequire(import.meta.url)('../package.json') as { version: string }\n).version\n\nexport type { CascadeConfig, ThemeName } from './utils/config.js'\n\nconst HELP = `cascivo ${VERSION} — the CSS-native, signal-driven, AI-first design system\n\nUsage: cascivo <command> [options]\n\nCommands:\n create [name] Scaffold a new ready-to-run app (shell + nav + theme)\n (--template <spec>: start from a marketplace template)\n init Set up cascivo in the current project\n add <component...> Add components or a template to your project\n list [--installed] List available components\n update [component] Update installed components (--check: list outdated)\n search <query> Search components across registries\n view <spec> View a component before installing\n theme <add|create> Install a first-party theme, or build a custom one from /create\n eject <component> Eject specific tokens into a scoped local override file\n generate <config.json> Generate TSX from a ViewConfig JSON file\n doctor [--ci] Check components for rule violations\n audit --ai <paths...> Audit AI-generated code against the cascivo contract\n registry build Build a static registry from a cascivo-registry.json file\n template init <name> Scaffold a new template (source + manifest + registry entry)\n tokens import <file> Import external design tokens as cascivo overrides\n\nRun \"cascivo <command> --help\" for details.`\n\nconst THEME_LIST = THEMES.join(' | ')\n\nconst COMMAND_HELP: Record<string, string> = {\n create: `Usage: cascivo create [name] [options]\n\nScaffold a new ready-to-run app — Vite + React + TypeScript, pre-wired with the\ncascivo app shell, side navigation, header, and a theme.\n\nOptions:\n --template <spec> Start from a marketplace template (@ns/name or owner/repo/name)\n --theme <name> Theme to install (${THEME_LIST})\n --sections \"<a, b>\" Comma-separated nav section labels (one component each)\n --yes, -y Accept defaults, never prompt`,\n init: `Usage: cascivo init [options]\n\nSet up cascivo in the current project: installs @cascivo/core + @cascivo/tokens\nand writes cascivo.config.ts.\n\nOptions:\n --theme <name> Theme to configure (${THEME_LIST})\n --yes, -y Accept defaults, never prompt (implied when stdin is not a TTY)`,\n add: `Usage: cascivo add <component...> [options]\n\nCopy component source (TSX + CSS module) from the registry into your project,\nresolving component dependencies. Also installs templates (@ns/name) and\nthird-party components (owner/repo/name).\n\nOptions:\n --dry-run Show what would be written without writing\n --yes, -y Skip confirmation prompts`,\n list: `Usage: cascivo list [options]\n\nList components available in the configured registry.\n\nOptions:\n --installed Only list components already installed in this project`,\n update: `Usage: cascivo update [component] [options]\n\nUpdate installed components to the current registry version. Without a\ncomponent argument, updates everything in the lockfile.\n\nOptions:\n --check List outdated components without writing\n --yes, -y Skip confirmation prompts`,\n search: `Usage: cascivo search <query> [options]\n\nSearch components across the configured registries.\n\nOptions:\n --registry <@ns> Restrict the search to one registry namespace`,\n view: `Usage: cascivo view <spec>\n\nPreview a component or template (files, dependencies, description) before\ninstalling. <spec> is a bare name, @ns/name, or owner/repo/name.`,\n theme: `Usage: cascivo theme add <name>\n cascivo theme create <name> --from <hash> [--out <path>]\n\nadd Install @cascivo/themes and print the import + data-theme wiring.\ncreate Turn a theme-builder config into an owned <name>.theme.css. Get <hash>\n from https://cascivo.com/create (\"Copy CLI command\"). --dry-run prints\n the CSS without writing.\n\nThemes: ${THEME_LIST}`,\n eject: `Usage: cascivo eject <component> [options]\n\nEject specific tokens into a scoped local override file so you can restyle a\ncomponent without forking it.\n\nOptions:\n --tokens <a,b> Comma-separated token names to eject (default: all)\n --scope <sel> CSS selector the overrides are scoped to\n --out <file> Output file path\n --dry-run Print the override file without writing`,\n generate: `Usage: cascivo generate <config.json> [options]\n\nGenerate TSX from a ViewConfig JSON file (see the MCP scaffold_view tool).\n\nOptions:\n --out <file> Output file (default: stdout)\n --components-dir <dir> Components import base (default: ./src/components/ui)`,\n doctor: `Usage: cascivo doctor [options]\n\nCheck components in this repo for cascivo rule violations (banned React hooks,\nhardcoded strings, missing @cascivo/react exports).\n\nOptions:\n --ci Exit non-zero when violations are found\n --drift Compare installed components against the registry (copy-paste drift)`,\n audit: `Usage: cascivo audit --ai <paths...> [options]\n\nAudit AI-generated code against the cascivo contract: hard-coded values that\nshould be tokens, invented props, missing required props, raw strings where\ni18n is expected.\n\nOptions:\n --fix Rewrite unambiguous CSS literals to their token equivalents\n --json Machine-readable output\n --level <name> Minimum finding level to report (error | warn; default error)`,\n registry: `Usage: cascivo registry build [dir]\n\nBuild a static registry (registry.json + file payloads) from a\ncascivo-registry.json manifest, ready to host on any static file server.`,\n template: `Usage: cascivo template init <name> [options]\n\nScaffold a new template: source, manifest, and registry entry.\n\nOptions:\n --category <name> Template category (e.g. dashboard)\n --framework <name> Target framework (default react-vite)\n --components <a,b> Registry components the template composes\n --repo <owner/repo> Repository the template will be hosted in`,\n tokens: `Usage: cascivo tokens import <file>\n\nImport external design tokens (W3C design-tokens JSON) as cascivo token\noverrides.`,\n}\n\nexport async function run(args: string[]): Promise<void> {\n const [command, ...rest] = args\n\n // Per-command help must short-circuit BEFORE any prompt, fetch, or install:\n // \"cascivo add --help\" must never try to install a component named --help.\n if (command !== undefined && (rest.includes('--help') || rest.includes('-h'))) {\n const commandHelp = COMMAND_HELP[command]\n if (commandHelp !== undefined) {\n console.log(commandHelp)\n return\n }\n }\n\n switch (command) {\n case 'create':\n await create(rest)\n break\n case 'init':\n await init(rest)\n break\n case 'add':\n await add(rest, await loadConfig(), {\n dryRun: rest.includes('--dry-run'),\n yes: rest.includes('--yes'),\n })\n break\n case 'list':\n await list(await loadConfig(), { installed: rest.includes('--installed') })\n break\n case 'update':\n await update(rest.filter((r) => !r.startsWith('--'))[0], await loadConfig(), {\n check: rest.includes('--check'),\n yes: rest.includes('--yes'),\n })\n break\n case 'search':\n await search(rest, await loadConfig())\n break\n case 'view':\n await view(rest, await loadConfig())\n break\n case 'theme':\n await theme(rest)\n break\n case 'eject': {\n const { eject } = await import('./commands/eject.js')\n const flag = (key: string): string | undefined => {\n const eq = rest.find((r) => r.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = rest.indexOf(`--${key}`)\n const next = idx !== -1 ? rest[idx + 1] : undefined\n // Ignore a following token that is itself a flag (e.g. `--tokens --dry-run`).\n return next && !next.startsWith('--') ? next : undefined\n }\n const tokensArg = flag('tokens')\n await eject(rest, await loadConfig(), {\n ...(tokensArg\n ? {\n tokens: tokensArg\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n }\n : {}),\n ...(flag('scope') ? { scope: flag('scope')! } : {}),\n ...(flag('out') ? { out: flag('out')! } : {}),\n dryRun: rest.includes('--dry-run'),\n })\n break\n }\n case 'generate':\n await generate(rest, await loadConfig())\n break\n case 'registry':\n if (rest[0] === 'build') {\n await registryBuild(rest.slice(1))\n } else {\n console.error(`Unknown registry subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case 'template':\n if (rest[0] === 'init') {\n const { templateInit } = await import('./commands/template-init.js')\n await templateInit(rest.slice(1))\n } else {\n console.error(`Unknown template subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case 'doctor': {\n const ci = rest.includes('--ci')\n const drift = rest.includes('--drift')\n if (drift) {\n const { runDoctorDrift } = await import('./commands/drift.js')\n await runDoctorDrift(await loadConfig())\n } else {\n const result = await runDoctor(process.cwd())\n if (result.passed) {\n console.log('No violations found.')\n } else {\n for (const v of result.violations) {\n console.error(`[${v.rule}] ${v.detail}\\n ${v.file}`)\n }\n if (ci) process.exitCode = 1\n }\n }\n break\n }\n case 'audit': {\n const { audit } = await import('./commands/audit.js')\n await audit(rest, await loadConfig())\n break\n }\n case 'tokens':\n if (rest[0] === 'import') {\n const { tokensImport } = await import('./commands/tokens.js')\n await tokensImport(rest.slice(1))\n } else {\n console.error(`Unknown tokens subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case undefined:\n case '--help':\n case '-h':\n case 'help':\n console.log(HELP)\n break\n case '--version':\n case '-v':\n console.log(VERSION)\n break\n default:\n console.error(`Unknown command: ${command}\\n`)\n console.log(HELP)\n process.exitCode = 1\n }\n}\n\nconst isMain = argv[1] !== undefined && import.meta.url === pathToFileURL(argv[1]).href\n\nif (isMain) {\n run(argv.slice(2)).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n })\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cascivo",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "CLI — npx cascivo init / add / list / update",
|
|
6
6
|
"keywords": [
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"provenance": true
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@cascivo/registry": "^0.1.
|
|
45
|
+
"@cascivo/registry": "^0.1.10"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^25",
|