cascivo 0.1.4 → 0.2.0
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/README.md +14 -8
- package/dist/{audit-AHr4MDMK.mjs → audit-BRn4MeXD.mjs} +8 -8
- package/dist/{audit-AHr4MDMK.mjs.map → audit-BRn4MeXD.mjs.map} +1 -1
- package/dist/config-CsnCR5eh.mjs +82 -0
- package/dist/config-CsnCR5eh.mjs.map +1 -0
- package/dist/{eject-D_mC1lsq.mjs → eject-B92gZhLX.mjs} +3 -3
- package/dist/{eject-D_mC1lsq.mjs.map → eject-B92gZhLX.mjs.map} +1 -1
- package/dist/fs-m7ZvuBBm.mjs +24 -0
- package/dist/fs-m7ZvuBBm.mjs.map +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +590 -120
- package/dist/index.mjs.map +1 -1
- package/dist/template-init-DGEgatij.mjs +179 -0
- package/dist/template-init-DGEgatij.mjs.map +1 -0
- package/package.json +2 -2
- package/readme.body.md +14 -8
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["fetchText","THEMES","item"],"sources":["../src/utils/config.ts","../src/utils/exec.ts","../src/utils/fs.ts","../src/utils/registry.ts","../src/utils/lock.ts","../src/utils/resolve.ts","../src/utils/directory.ts","../src/commands/add.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","../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 { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nexport type ThemeName = 'light' | 'dark' | 'warm'\n\nexport type RegistryNamespaceConfig =\n | string\n | { url: string; headers?: Record<string, string>; params?: Record<string, string> }\n\nexport interface CascadeConfig {\n /** URL of the registry.json index. */\n registry: string\n /** Directory (relative to project root) where components are written. */\n outputDir: string\n /** Default theme imported by `cascade init`. */\n theme: ThemeName\n /** Namespace → registry URL template (with {name} placeholder) or auth config. */\n registries?: Record<string, RegistryNamespaceConfig>\n /** Whether to copy test files (*.contract.test.tsx) when adding components. */\n tests?: boolean\n}\n\nexport const DEFAULT_CONFIG: CascadeConfig = {\n // Canonical hosted registry index (served from the landing site, documented in\n // llms.txt). Prefer this over a branch's GitHub raw URL, which 404s for\n // unauthenticated/private-repo requests and breaks `cascivo list`/`add`.\n registry: 'https://cascivo.com/registry.json',\n outputDir: 'src/components/ui',\n theme: 'light',\n}\n\nconst CONFIG_FILES = ['cascivo.config.ts', 'cascivo.config.js', 'cascivo.config.mjs']\n\n/** Apply defaults over a (possibly partial) user config object. */\nexport function resolveConfig(partial: Partial<CascadeConfig> | null | undefined): CascadeConfig {\n return { ...DEFAULT_CONFIG, ...partial }\n}\n\n/** Let env vars override config — used by the MCP server to pass `outputDir`. */\nexport function applyEnvOverrides(\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n): CascadeConfig {\n return {\n ...config,\n ...(env.CASCIVO_REGISTRY ? { registry: env.CASCIVO_REGISTRY } : {}),\n ...(env.CASCIVO_OUTPUT_DIR ? { outputDir: env.CASCIVO_OUTPUT_DIR } : {}),\n }\n}\n\n/**\n * Locate and load `cascivo.config.{ts,js,mjs}` from `cwd`. Falls back to the\n * default config when no file is found or the file cannot be loaded. Env vars\n * (`CASCIVO_REGISTRY`, `CASCIVO_OUTPUT_DIR`) take precedence.\n */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<CascadeConfig> {\n for (const file of CONFIG_FILES) {\n const path = join(cwd, file)\n if (!existsSync(path)) continue\n try {\n const mod = (await import(pathToFileURL(path).href)) as {\n default?: Partial<CascadeConfig>\n }\n return applyEnvOverrides(resolveConfig(mod.default ?? (mod as Partial<CascadeConfig>)))\n } catch {\n // Unloadable config (e.g. unsupported TS syntax) — fall back to defaults.\n return applyEnvOverrides(resolveConfig(null))\n }\n }\n return applyEnvOverrides(resolveConfig(null))\n}\n\nexport type PackageManager = 'pnpm' | 'yarn' | 'npm' | 'bun'\n\n/** Detect the package manager in use from lock files, defaulting to npm. */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManager {\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn'\n if (existsSync(join(cwd, 'bun.lockb'))) return 'bun'\n return 'npm'\n}\n\n/** The install subcommand each package manager uses to add dependencies. */\nexport function installCommand(pm: PackageManager, packages: string[]): [string, string[]] {\n const verb = pm === 'npm' ? 'install' : 'add'\n return [pm, [verb, ...packages]]\n}\n","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 { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\n\n/** Resolve where a component file should be written. */\nexport function resolveOutputPath(\n outputDir: string,\n component: string,\n file: string,\n cwd: string = process.cwd(),\n): string {\n return join(resolve(cwd, outputDir), component, file)\n}\n\n/** Write a file, creating parent directories as needed. */\nexport async function writeFileSafe(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, content, 'utf8')\n}\n\n/** Read a file, returning null if it does not exist. */\nexport async function readFileSafe(path: string): Promise<string | null> {\n try {\n return await readFile(path, 'utf8')\n } catch {\n return null\n }\n}\n","export interface RegistryComponent {\n name: string\n type?: 'component' | 'layout' | 'block' | 'chart' | 'section'\n description: string\n category: string\n version: string\n files: string[]\n /** npm package to install (used when type === 'chart'). */\n install?: string\n dependencies: string[]\n tags: string[]\n meta: { name: string }\n}\n\nexport interface BlockRegistryEntry {\n name: string\n type: 'block'\n displayName: string\n description: string\n category: string\n version: string\n files: string[]\n dependencies: string[]\n tags: string[]\n screenshot: { light: string; dark: string }\n}\n\nexport interface Registry {\n version: string\n generatedAt: string\n components: RegistryComponent[]\n blocks?: BlockRegistryEntry[]\n}\n\nfunction asStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((v): v is string => typeof v === 'string') : []\n}\n\n/** Validate and normalize raw JSON into a typed Registry. Throws on bad shape. */\nexport function parseRegistry(raw: unknown): Registry {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Invalid registry: expected an object')\n }\n const obj = raw as Record<string, unknown>\n if (!Array.isArray(obj.components)) {\n throw new Error('Invalid registry: \"components\" must be an array')\n }\n\n const components: RegistryComponent[] = obj.components.map((entry, i) => {\n if (typeof entry !== 'object' || entry === null) {\n throw new Error(`Invalid registry: component at index ${i} is not an object`)\n }\n const c = entry as Record<string, unknown>\n if (typeof c.name !== 'string') {\n throw new Error(`Invalid registry: component at index ${i} is missing \"name\"`)\n }\n const rawType = c.type\n const type =\n rawType === 'component' || rawType === 'layout' || rawType === 'block' || rawType === 'chart'\n ? rawType\n : undefined\n const rawMeta = c.meta\n const metaName =\n typeof rawMeta === 'object' &&\n rawMeta !== null &&\n typeof (rawMeta as Record<string, unknown>).name === 'string'\n ? ((rawMeta as Record<string, unknown>).name as string)\n : c.name\n const result: RegistryComponent = {\n name: c.name,\n description: typeof c.description === 'string' ? c.description : '',\n category: typeof c.category === 'string' ? c.category : '',\n version: typeof c.version === 'string' ? c.version : '0.0.0',\n files: asStringArray(c.files),\n dependencies: asStringArray(c.dependencies),\n tags: asStringArray(c.tags),\n meta: { name: metaName },\n }\n if (type !== undefined) result.type = type\n if (typeof c.install === 'string') result.install = c.install\n return result\n })\n\n const blocks: BlockRegistryEntry[] = Array.isArray(obj.blocks)\n ? obj.blocks.flatMap((entry) => {\n if (typeof entry !== 'object' || entry === null) return []\n const b = entry as Record<string, unknown>\n if (typeof b.name !== 'string') return []\n const rawScreenshot =\n typeof b.screenshot === 'object' && b.screenshot !== null\n ? (b.screenshot as Record<string, unknown>)\n : {}\n return [\n {\n name: b.name,\n type: 'block' as const,\n displayName: typeof b.displayName === 'string' ? b.displayName : b.name,\n description: typeof b.description === 'string' ? b.description : '',\n category: typeof b.category === 'string' ? b.category : '',\n version: typeof b.version === 'string' ? b.version : '0.0.0',\n files: asStringArray(b.files),\n dependencies: asStringArray(b.dependencies),\n tags: asStringArray(b.tags),\n screenshot: {\n light: typeof rawScreenshot.light === 'string' ? rawScreenshot.light : '',\n dark: typeof rawScreenshot.dark === 'string' ? rawScreenshot.dark : '',\n },\n },\n ]\n })\n : []\n\n return {\n version: typeof obj.version === 'string' ? obj.version : '0.0.0',\n generatedAt: typeof obj.generatedAt === 'string' ? obj.generatedAt : '',\n components,\n blocks,\n }\n}\n\n/** Fetch and parse the registry from a URL. */\nexport async function fetchRegistry(url: string): Promise<Registry> {\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`Failed to fetch registry from ${url}: ${res.status} ${res.statusText}`)\n }\n return parseRegistry(await res.json())\n}\n\n/**\n * Find a component by name (case-insensitive, full name or unambiguous suffix).\n *\n * Examples:\n * \"layout/app-shell\" → exact match on full name\n * \"app-shell\" → suffix match if exactly one entry ends with \"/app-shell\"\n * \"button\" → exact match (no slash, no suffix ambiguity)\n */\nexport function findComponent(registry: Registry, name: string): RegistryComponent | undefined {\n const target = name.toLowerCase()\n\n // Handle block/ prefix: look up in the blocks array.\n if (target.startsWith('block/')) {\n const blockName = target.slice('block/'.length)\n const block = (registry.blocks ?? []).find((b) => b.name.toLowerCase() === blockName)\n if (!block) throw new Error(`Block \"${blockName}\" not found in registry.`)\n return block as unknown as RegistryComponent\n }\n\n // 1. Exact full-name match (case-insensitive).\n const exact = registry.components.find((c) => c.name.toLowerCase() === target)\n if (exact) return exact\n\n // 2. Suffix match: resolve \"app-shell\" to \"layout/app-shell\" when unambiguous.\n const suffix = `/${target}`\n const matches = registry.components.filter((c) => c.name.toLowerCase().endsWith(suffix))\n if (matches.length === 1) return matches[0]\n\n return undefined\n}\n\n/** Fuzzy-ish search over name, tags and description. */\nexport function searchComponents(registry: Registry, query: string): RegistryComponent[] {\n const q = query.toLowerCase()\n return registry.components.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.tags.some((t) => t.toLowerCase().includes(q)),\n )\n}\n\n/** Extract the file name from a registry file URL. */\nexport function fileName(url: string): string {\n const stripped = url.split(/[?#]/)[0] ?? url\n return stripped.split('/').pop() || stripped\n}\n","import { createHash } from 'node:crypto'\nimport { existsSync } from 'node:fs'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nexport interface LockEntry {\n registry: string\n version: string\n installedAt: string\n files: Record<string, string>\n conflicted?: true\n}\n\nexport interface LockFile {\n lockVersion: 1\n items: Record<string, LockEntry>\n}\n\nexport function sha256(content: string): string {\n return `sha256-${createHash('sha256').update(content).digest('hex')}`\n}\n\nconst LOCK_FILENAME = 'cascade.lock'\n\nexport async function readLock(cwd: string = process.cwd()): Promise<LockFile | null> {\n const path = join(cwd, LOCK_FILENAME)\n if (!existsSync(path)) return null\n try {\n const raw = JSON.parse(await readFile(path, 'utf8')) as unknown\n if (typeof raw !== 'object' || raw === null) return null\n return raw as LockFile\n } catch {\n return null\n }\n}\n\nexport async function writeLock(lock: LockFile, cwd: string = process.cwd()): Promise<void> {\n const path = join(cwd, LOCK_FILENAME)\n await writeFile(path, `${JSON.stringify(lock, null, 2)}\\n`, 'utf8')\n}\n\nexport function createLock(): LockFile {\n return { lockVersion: 1, items: {} }\n}\n\nexport function updateLockEntry(lock: LockFile, name: string, entry: LockEntry): LockFile {\n return {\n ...lock,\n items: { ...lock.items, [name]: entry },\n }\n}\n","import type { CascadeConfig, 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 @cascade namespace fallback\n if (ns === '@cascade') {\n return { url: `https://cascivo.com/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\nexport const DIRECTORY_URL = 'https://cascivo.com/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 type { CascadeConfig } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchRegistry, fileName, findComponent } from '../utils/registry.js'\nimport { createLock, readLock, sha256, updateLockEntry, writeLock } from '../utils/lock.js'\nimport { resolveClosure } from '../utils/resolve.js'\nimport { resolveFromDirectory } from '../utils/directory.js'\nimport 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\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`Failed to fetch ${url}: ${res.status} ${res.statusText}`)\n }\n return res.text()\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 } = {},\n): Promise<void> {\n if (names.length === 0) {\n console.error('Usage: cascivo add <component...>')\n return\n }\n\n const multiSpecs = names.filter(isMultiRegistrySpec)\n const bareSpecs = names.filter((n) => !isMultiRegistrySpec(n))\n\n let lock = (await readLock()) ?? 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 console.log(` ${item.spec} (${item.item.name}@${item.item.version}) from ${item.itemUrl}`)\n for (const f of item.item.files) {\n console.log(` ${f.url}`)\n }\n }\n return\n }\n\n const isThirdParty = (itemUrl: string) => !itemUrl.includes('cascivo.com')\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 await installItem(item, config, lock, registryBase)\n lock = updateLockEntry(lock, item.name, {\n registry: registryBase,\n version: item.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: {},\n })\n }\n await writeLock(lock)\n return\n }\n\n // Legacy bare-name path (uses existing registry fetch)\n const registry = await fetchRegistry(config.registry)\n const missingDeps = new Set<string>()\n\n for (const name of bareSpecs) {\n const entry = findComponent(registry, name)\n if (!entry) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n continue\n }\n\n if (entry.type === 'chart') {\n const pkg = entry.install ?? '@cascivo/charts'\n console.log(`Chart \"${entry.name}\" is distributed as an npm package.`)\n console.log(`Install it with: npm install ${pkg}`)\n console.log(`Then import: import { ${entry.meta.name} } from '${pkg}'`)\n continue\n }\n\n const outputName = entry.name.includes('/') ? entry.name.split('/').pop()! : entry.name\n const fileHashes: Record<string, string> = {}\n\n for (const url of entry.files) {\n const content = await fetchText(url)\n const dest = resolveOutputPath(config.outputDir, outputName, fileName(url))\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 const registryBase = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\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 console.log(`Added ${entry.name} to ${config.outputDir}/${outputName}/`)\n }\n\n if (missingDeps.size > 0) {\n installPackages([...missingDeps])\n }\n\n await writeLock(lock)\n}\n\nasync function installItem(\n item: RegistryItem,\n config: CascadeConfig,\n _lock: ReturnType<typeof createLock>,\n _registryBase: string,\n): Promise<void> {\n const outputName = item.name.includes('/') ? item.name.split('/').pop()! : item.name\n const missingDeps = new Set<string>()\n\n for (const file of item.files ?? []) {\n try {\n const content = await fetchText(file.url)\n const dest = resolveOutputPath(config.outputDir, outputName, fileName(file.url))\n await writeFileSafe(dest, content)\n } catch {\n console.warn(` Could not fetch ${file.url}`)\n }\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 console.log(`Added ${item.name} to ${config.outputDir}/${outputName}/`)\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\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\n for (const hook of BANNED_HOOKS) {\n if (new RegExp(`\\\\b${hook}\\\\b`).test(content)) {\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, type ThemeName } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nconst THEMES: ThemeName[] = ['light', 'dark', 'warm']\n\nasync function promptTheme(): Promise<ThemeName> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question('Theme? (light/dark/warm) [light]: ')).trim().toLowerCase()\n return (THEMES as 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(cwd: string = process.cwd()): Promise<void> {\n installPackages(['@cascivo/core', '@cascivo/tokens'], cwd)\n\n const theme = await promptTheme()\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',\n block: 'Blocks',\n section: 'Sections',\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}\n","import { existsSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { resolve, dirname } from 'node:path'\nimport { buildRegistry, validateIndex, parseLegacyRegistry } from '@cascivo/registry'\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 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: cascade 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","import { installPackages } from '../utils/exec.js'\n\nconst THEMES = [\n 'light',\n 'dark',\n 'warm',\n 'flat',\n 'minimal',\n 'midnight',\n 'pastel',\n 'brutalist',\n 'corporate',\n 'terminal',\n 'cyberpunk',\n 'arcade',\n]\n\nexport async function theme(args: string[]): Promise<void> {\n const [sub, name] = args\n if (sub !== 'add' || !name) {\n console.error(`Usage: cascade theme add <${THEMES.join('|')}>`)\n return\n }\n if (!THEMES.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 } 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\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url)\n if (!res.ok) throw new Error(`HTTP ${res.status} fetching ${url}`)\n return res.text()\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 fetchText(url)\n const local = existsSync(dest) ? await readFile(dest, 'utf8') : ''\n const base = baseFile ? await fetchText(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 const res = await fetch(url)\n if (!res.ok) {\n console.error(`Failed to fetch ${url}: ${res.status} ${res.statusText}`)\n return\n }\n const latest = await res.text()\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 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 type { RegistryItem } from '@cascivo/registry'\n\nexport async function view(args: string[], config: CascadeConfig): Promise<void> {\n const spec = args[0]\n if (!spec) {\n console.error('Usage: cascade 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(`\\n${item.name} v${item.version}`)\n console.log(`Type: ${item.type}${item.category ? ` / ${item.category}` : ''}`)\n console.log(`${item.description}`)\n if (item.author) console.log(`Author: ${item.author}`)\n if (item.license) console.log(`License: ${item.license}`)\n if (item.homepage) console.log(`Homepage: ${item.homepage}`)\n\n if (item.changelog?.length) {\n console.log('\\nChangelog:')\n for (const c of item.changelog.slice(0, 5)) {\n console.log(` ${c.version}: ${c.note}`)\n }\n }\n\n if (item.files?.length) {\n console.log('\\nFiles:')\n for (const f of item.files) {\n const target = f.target ? ` → ${f.target}` : ''\n console.log(` ${f.url}${target}`)\n }\n }\n\n if (item.dependencies?.length) {\n console.log(`\\nDependencies: ${item.dependencies.join(', ')}`)\n }\n\n if (item.registryDependencies?.length) {\n console.log(`Registry dependencies: ${item.registryDependencies.join(', ')}`)\n }\n}\n","import { argv } from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { add } from './commands/add.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 } from './utils/config.js'\n\nexport const VERSION = '0.0.0'\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 init Set up cascivo in the current project\n add <component...> Add one or more components 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 <name> Install a theme (light | dark | warm)\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\nRun \"cascivo <command> --help\" for details.`\n\nexport async function run(args: string[]): Promise<void> {\n const [command, ...rest] = args\n\n switch (command) {\n case 'init':\n await init()\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 '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(rest)\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":["fetchText","resolvePath","THEMES","THEMES","item"],"sources":["../src/utils/exec.ts","../src/utils/registry.ts","../src/utils/lock.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","../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","export interface RegistryComponent {\n name: string\n type?: 'component' | 'layout' | 'block' | 'chart' | 'section'\n description: string\n category: string\n version: string\n files: string[]\n /** npm package to install (used when type === 'chart'). */\n install?: string\n dependencies: string[]\n /** Other registry components to install transitively (shared hooks/siblings). */\n registryDependencies?: string[]\n tags: string[]\n meta: { name: string }\n}\n\nexport interface BlockRegistryEntry {\n name: string\n type: 'block'\n displayName: string\n description: string\n category: string\n version: string\n files: string[]\n dependencies: string[]\n tags: string[]\n screenshot: { light: string; dark: string }\n}\n\nexport interface Registry {\n version: string\n generatedAt: string\n components: RegistryComponent[]\n blocks?: BlockRegistryEntry[]\n}\n\nfunction asStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((v): v is string => typeof v === 'string') : []\n}\n\n/** Validate and normalize raw JSON into a typed Registry. Throws on bad shape. */\nexport function parseRegistry(raw: unknown): Registry {\n if (typeof raw !== 'object' || raw === null) {\n throw new Error('Invalid registry: expected an object')\n }\n const obj = raw as Record<string, unknown>\n if (!Array.isArray(obj.components)) {\n throw new Error('Invalid registry: \"components\" must be an array')\n }\n\n const components: RegistryComponent[] = obj.components.map((entry, i) => {\n if (typeof entry !== 'object' || entry === null) {\n throw new Error(`Invalid registry: component at index ${i} is not an object`)\n }\n const c = entry as Record<string, unknown>\n if (typeof c.name !== 'string') {\n throw new Error(`Invalid registry: component at index ${i} is missing \"name\"`)\n }\n const rawType = c.type\n const type =\n rawType === 'component' || rawType === 'layout' || rawType === 'block' || rawType === 'chart'\n ? rawType\n : undefined\n const rawMeta = c.meta\n const metaName =\n typeof rawMeta === 'object' &&\n rawMeta !== null &&\n typeof (rawMeta as Record<string, unknown>).name === 'string'\n ? ((rawMeta as Record<string, unknown>).name as string)\n : c.name\n const result: RegistryComponent = {\n name: c.name,\n description: typeof c.description === 'string' ? c.description : '',\n category: typeof c.category === 'string' ? c.category : '',\n version: typeof c.version === 'string' ? c.version : '0.0.0',\n files: asStringArray(c.files),\n dependencies: asStringArray(c.dependencies),\n tags: asStringArray(c.tags),\n meta: { name: metaName },\n }\n if (type !== undefined) result.type = type\n if (typeof c.install === 'string') result.install = c.install\n if (Array.isArray(c.registryDependencies)) {\n const deps = asStringArray(c.registryDependencies)\n if (deps.length > 0) result.registryDependencies = deps\n }\n return result\n })\n\n const blocks: BlockRegistryEntry[] = Array.isArray(obj.blocks)\n ? obj.blocks.flatMap((entry) => {\n if (typeof entry !== 'object' || entry === null) return []\n const b = entry as Record<string, unknown>\n if (typeof b.name !== 'string') return []\n const rawScreenshot =\n typeof b.screenshot === 'object' && b.screenshot !== null\n ? (b.screenshot as Record<string, unknown>)\n : {}\n return [\n {\n name: b.name,\n type: 'block' as const,\n displayName: typeof b.displayName === 'string' ? b.displayName : b.name,\n description: typeof b.description === 'string' ? b.description : '',\n category: typeof b.category === 'string' ? b.category : '',\n version: typeof b.version === 'string' ? b.version : '0.0.0',\n files: asStringArray(b.files),\n dependencies: asStringArray(b.dependencies),\n tags: asStringArray(b.tags),\n screenshot: {\n light: typeof rawScreenshot.light === 'string' ? rawScreenshot.light : '',\n dark: typeof rawScreenshot.dark === 'string' ? rawScreenshot.dark : '',\n },\n },\n ]\n })\n : []\n\n return {\n version: typeof obj.version === 'string' ? obj.version : '0.0.0',\n generatedAt: typeof obj.generatedAt === 'string' ? obj.generatedAt : '',\n components,\n blocks,\n }\n}\n\n/** Fetch and parse the registry from a URL. */\nexport async function fetchRegistry(url: string): Promise<Registry> {\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`Failed to fetch registry from ${url}: ${res.status} ${res.statusText}`)\n }\n return parseRegistry(await res.json())\n}\n\n/**\n * Find a component by name (case-insensitive, full name or unambiguous suffix).\n *\n * Examples:\n * \"layout/app-shell\" → exact match on full name\n * \"app-shell\" → suffix match if exactly one entry ends with \"/app-shell\"\n * \"button\" → exact match (no slash, no suffix ambiguity)\n */\nexport function findComponent(registry: Registry, name: string): RegistryComponent | undefined {\n const target = name.toLowerCase()\n\n // Handle block/ prefix: look up in the blocks array.\n if (target.startsWith('block/')) {\n const blockName = target.slice('block/'.length)\n const block = (registry.blocks ?? []).find((b) => b.name.toLowerCase() === blockName)\n if (!block) throw new Error(`Block \"${blockName}\" not found in registry.`)\n return block as unknown as RegistryComponent\n }\n\n // 1. Exact full-name match (case-insensitive).\n const exact = registry.components.find((c) => c.name.toLowerCase() === target)\n if (exact) return exact\n\n // 2. Suffix match: resolve \"app-shell\" to \"layout/app-shell\" when unambiguous.\n const suffix = `/${target}`\n const matches = registry.components.filter((c) => c.name.toLowerCase().endsWith(suffix))\n if (matches.length === 1) return matches[0]\n\n return undefined\n}\n\n/** Fuzzy-ish search over name, tags and description. */\nexport function searchComponents(registry: Registry, query: string): RegistryComponent[] {\n const q = query.toLowerCase()\n return registry.components.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.tags.some((t) => t.toLowerCase().includes(q)),\n )\n}\n\n/** Extract the file name from a registry file URL. */\nexport function fileName(url: string): string {\n const stripped = url.split(/[?#]/)[0] ?? url\n return stripped.split('/').pop() || stripped\n}\n","import { createHash } from 'node:crypto'\nimport { existsSync } from 'node:fs'\nimport { readFile, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nexport interface LockEntry {\n registry: string\n version: string\n installedAt: string\n files: Record<string, string>\n conflicted?: true\n}\n\nexport interface LockFile {\n lockVersion: 1\n items: Record<string, LockEntry>\n}\n\nexport function sha256(content: string): string {\n return `sha256-${createHash('sha256').update(content).digest('hex')}`\n}\n\nconst LOCK_FILENAME = 'cascade.lock'\n\nexport async function readLock(cwd: string = process.cwd()): Promise<LockFile | null> {\n const path = join(cwd, LOCK_FILENAME)\n if (!existsSync(path)) return null\n try {\n const raw = JSON.parse(await readFile(path, 'utf8')) as unknown\n if (typeof raw !== 'object' || raw === null) return null\n return raw as LockFile\n } catch {\n return null\n }\n}\n\nexport async function writeLock(lock: LockFile, cwd: string = process.cwd()): Promise<void> {\n const path = join(cwd, LOCK_FILENAME)\n await writeFile(path, `${JSON.stringify(lock, null, 2)}\\n`, 'utf8')\n}\n\nexport function createLock(): LockFile {\n return { lockVersion: 1, items: {} }\n}\n\nexport function updateLockEntry(lock: LockFile, name: string, entry: LockEntry): LockFile {\n return {\n ...lock,\n items: { ...lock.items, [name]: entry },\n }\n}\n","import type { CascadeConfig, 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 @cascade namespace fallback\n if (ns === '@cascade') {\n return { url: `https://cascivo.com/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\nexport const DIRECTORY_URL = 'https://cascivo.com/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 { 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 {\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 { 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\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url)\n if (!res.ok) {\n throw new Error(`Failed to fetch ${url}: ${res.status} ${res.statusText}`)\n }\n return res.text()\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\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 const bareSpecs = names.filter((n) => !isMultiRegistrySpec(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 const isThirdParty = (itemUrl: string) => !itemUrl.includes('cascivo.com')\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 const fileHashes = await installItem(item, config, cwd)\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 return\n }\n\n // Legacy bare-name path (uses existing registry fetch).\n // Resolves the transitive closure of registry (component) dependencies so a\n // component that imports a shared hook/sibling (e.g. `../popover/use-popover`)\n // installs that dependency too. De-duped by resolved name; cycle-safe.\n const 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 for (const { entry, requested } of resolved) {\n if (entry.type === 'chart') {\n const pkg = entry.install ?? '@cascivo/charts'\n console.log(`Chart \"${entry.name}\" is distributed as an npm package.`)\n console.log(`Install it with: npm install ${pkg}`)\n console.log(`Then import: import { ${entry.meta.name} } from '${pkg}'`)\n continue\n }\n\n const outputName = entry.name.includes('/') ? entry.name.split('/').pop()! : entry.name\n const fileHashes: Record<string, string> = {}\n\n for (const url of entry.files) {\n const content = await fetchText(url)\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 await writeLock(lock, 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 for (const file of item.files ?? []) {\n try {\n const content = await fetchText(file.url)\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 } catch {\n console.warn(` Could not fetch ${file.url}`)\n }\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 type { ThemeName } from '../utils/config.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nconst THEMES: ThemeName[] = ['light', 'dark', 'warm']\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: 'https://cascivo.com/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.includes(theme as ThemeName) && rl) {\n theme = (await rl.question('Theme? (light/dark/warm) [light]: ')).trim().toLowerCase()\n }\n const resolvedTheme: ThemeName = THEMES.includes(theme as ThemeName)\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\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\n for (const hook of BANNED_HOOKS) {\n if (new RegExp(`\\\\b${hook}\\\\b`).test(content)) {\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, type ThemeName } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nconst THEMES: ThemeName[] = ['light', 'dark', 'warm']\n\nasync function promptTheme(): Promise<ThemeName> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question('Theme? (light/dark/warm) [light]: ')).trim().toLowerCase()\n return (THEMES as 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(cwd: string = process.cwd()): Promise<void> {\n installPackages(['@cascivo/core', '@cascivo/tokens'], cwd)\n\n const theme = await promptTheme()\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',\n block: 'Blocks',\n section: 'Sections',\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: cascade 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","import { installPackages } from '../utils/exec.js'\n\nconst THEMES = [\n 'light',\n 'dark',\n 'warm',\n 'flat',\n 'minimal',\n 'midnight',\n 'pastel',\n 'brutalist',\n 'corporate',\n 'terminal',\n 'cyberpunk',\n 'arcade',\n]\n\nexport async function theme(args: string[]): Promise<void> {\n const [sub, name] = args\n if (sub !== 'add' || !name) {\n console.error(`Usage: cascade theme add <${THEMES.join('|')}>`)\n return\n }\n if (!THEMES.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 } 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\nasync function fetchText(url: string): Promise<string> {\n const res = await fetch(url)\n if (!res.ok) throw new Error(`HTTP ${res.status} fetching ${url}`)\n return res.text()\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 fetchText(url)\n const local = existsSync(dest) ? await readFile(dest, 'utf8') : ''\n const base = baseFile ? await fetchText(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 const res = await fetch(url)\n if (!res.ok) {\n console.error(`Failed to fetch ${url}: ${res.status} ${res.statusText}`)\n return\n }\n const latest = await res.text()\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 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 (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: cascade 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 { 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 } from './utils/config.js'\n\nexport const VERSION = '0.0.0'\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 <name> Install a theme (light | dark | warm)\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\nRun \"cascivo <command> --help\" for details.`\n\nexport async function run(args: string[]): Promise<void> {\n const [command, ...rest] = args\n\n switch (command) {\n case 'create':\n await create(rest)\n break\n case 'init':\n await init()\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(rest)\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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"}
|