cascivo 0.1.1 → 0.1.2

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 CHANGED
@@ -1,12 +1,40 @@
1
1
  <!-- generated by scripts/readme/generate.ts — edit readme.body.md, not this file -->
2
2
 
3
- # cascivo
3
+ <div align="center">
4
+ <a href="https://cascivo.com"><img src="https://cascivo.com/favicon.svg" width="72" height="72" alt="cascivo logo"></a>
5
+ <h1>cascivo</h1>
6
+ <p><strong>CLI — npx cascivo init / add / list / update</strong></p>
4
7
 
5
- > CLI — npx cascivo init / add / list / update
8
+ [![npm](https://img.shields.io/npm/v/cascivo?style=flat-square&color=0079bf)](https://www.npmjs.com/package/cascivo)
9
+ [![downloads](https://img.shields.io/npm/dm/cascivo?style=flat-square&color=0079bf)](https://www.npmjs.com/package/cascivo)
10
+ [![license](https://img.shields.io/npm/l/cascivo?style=flat-square&color=0079bf)](https://github.com/cascivo/cascivo/blob/main/LICENSE)
11
+ ![types](https://img.shields.io/badge/types-included-0079bf?style=flat-square&logo=typescript&logoColor=white)
6
12
 
7
- [cascivo.com](https://cascivo.com) · [Docs](https://docs.cascivo.com) · [Storybook](https://storybook.cascivo.com) · [GitHub](https://github.com/urbanisierung/cascivo)
13
+ [npm](https://www.npmjs.com/package/cascivo) · [cascivo.com](https://cascivo.com) · [Docs](https://docs.cascivo.com) · [Storybook](https://storybook.cascivo.com) · [GitHub](https://github.com/cascivo/cascivo)
8
14
 
9
- CLI for scaffold and copy-paste workflows — `npx cascivo init`, `cascivo add <component>`, `cascivo audit --ai`. Detects your package manager, writes `cascivo.config.ts`, and fetches component source from `registry.json`.
15
+ </div>
16
+
17
+ ---
18
+
19
+ The `cascivo` CLI drives the copy-paste workflow — it scaffolds config, copies component source from the registry into your project, and audits generated code. You own every file it writes.
20
+
21
+ ## Commands
22
+
23
+ ```sh
24
+ npx cascivo init # scaffold cascivo.config.ts + tokens; detects your package manager
25
+ cascivo add button card # copy component source from the registry into your project
26
+ cascivo add owner/repo/button # install from any third-party registry
27
+ cascivo list # list available components
28
+ cascivo update # pull newer versions of copied components
29
+ cascivo audit --ai # flag hard-coded values, invented props, missing wiring
30
+ cascivo build # build a registry from your own components
31
+ ```
32
+
33
+ ## How it works
34
+
35
+ `init` detects npm / pnpm / yarn / bun, writes `cascivo.config.ts`, and wires up the token and theme imports. `add` resolves each component from [`registry.json`](https://github.com/cascivo/cascivo/blob/main/registry.json), fetches its source (TSX + CSS module + manifest) from GitHub raw URLs, and drops it into the path from your config — pulling in any dependencies it needs.
36
+
37
+ Because the registry model is open, `add owner/repo/component` installs from any compatible registry, not just the first-party one. See the [registry starter](https://github.com/cascivo/cascivo/tree/main/apps/examples/registry-starter) to publish your own.
10
38
 
11
39
  ## Install
12
40
 
@@ -16,4 +44,6 @@ pnpm add cascivo
16
44
 
17
45
  ---
18
46
 
19
- [cascivo.com](https://cascivo.com) · [Docs](https://docs.cascivo.com) · [Storybook](https://storybook.cascivo.com) · [GitHub](https://github.com/urbanisierung/cascivo) · AI agents: use [`@cascivo/mcp`](https://github.com/urbanisierung/cascivo/tree/main/packages/mcp) and [`registry.json`](https://github.com/urbanisierung/cascivo/blob/main/registry.json) · MIT
47
+ [cascivo.com](https://cascivo.com) · [Docs](https://docs.cascivo.com) · [Storybook](https://storybook.cascivo.com) · [GitHub](https://github.com/cascivo/cascivo) · AI agents: use [`@cascivo/mcp`](https://github.com/cascivo/cascivo/tree/main/packages/mcp) and [`registry.json`](https://github.com/cascivo/cascivo/blob/main/registry.json) · MIT
48
+
49
+ <div align="center"><a href="https://cascivo.com"><img src="https://cascivo.com/favicon.svg" width="28" height="28" alt="cascivo"></a></div>
package/dist/index.mjs CHANGED
@@ -11,7 +11,7 @@ import { createInterface } from "node:readline/promises";
11
11
  import { buildRegistry, parseLegacyRegistry, validateIndex } from "@cascivo/registry";
12
12
  //#region src/utils/config.ts
13
13
  const DEFAULT_CONFIG = {
14
- registry: "https://raw.githubusercontent.com/urbanisierung/cascivo/main/registry.json",
14
+ registry: "https://cascivo.com/registry.json",
15
15
  outputDir: "src/components/ui",
16
16
  theme: "light"
17
17
  };
@@ -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/http.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 registry: 'https://raw.githubusercontent.com/urbanisierung/cascivo/main/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 { createHash } from 'node:crypto'\nimport { existsSync } from 'node:fs'\nimport { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nconst CACHE_DIR = join(homedir(), '.cascade', 'cache')\nconst MAX_SIZE = 10 * 1024 * 1024 // 10 MB\nconst TIMEOUT_MS = 15_000\nconst MAX_RETRIES = 4\n\nexport type FetchFn = (url: string, opts?: RequestInit) => Promise<Response>\n\nlet _fetchFn: FetchFn = globalThis.fetch as FetchFn\n\nexport function setFetch(fn: FetchFn): void {\n _fetchFn = fn\n}\n\nexport function resetFetch(): void {\n _fetchFn = globalThis.fetch as FetchFn\n}\n\nfunction cacheKey(url: string): string {\n return createHash('sha256').update(url).digest('hex')\n}\n\nasync function getCached(url: string): Promise<unknown | null> {\n try {\n const file = join(CACHE_DIR, cacheKey(url))\n const data = await readFile(file, 'utf8')\n return JSON.parse(data) as unknown\n } catch {\n return null\n }\n}\n\nasync function setCached(url: string, data: unknown): Promise<void> {\n try {\n await mkdir(CACHE_DIR, { recursive: true })\n await writeFile(join(CACHE_DIR, cacheKey(url)), JSON.stringify(data))\n } catch {\n // cache write failure is non-fatal\n }\n}\n\nexport async function fetchJson(\n url: string,\n opts: { headers?: Record<string, string>; params?: Record<string, string>; cache?: boolean } = {},\n): Promise<unknown> {\n const fullUrl = opts.params ? `${url}?${new URLSearchParams(opts.params).toString()}` : url\n\n if (opts.cache !== false) {\n const cached = await getCached(fullUrl)\n if (cached !== null) return cached\n }\n\n let lastError: unknown\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, 1000 * 2 ** (attempt - 1)))\n }\n try {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS)\n let res: Response\n try {\n res = await _fetchFn(fullUrl, {\n headers: { Accept: 'application/json', ...opts.headers },\n signal: controller.signal,\n })\n } finally {\n clearTimeout(timer)\n }\n\n if (res.status === 401 || res.status === 403 || res.status === 429) {\n let msg = `HTTP ${res.status}`\n try {\n const body = (await res.json()) as Record<string, unknown>\n if (typeof body['message'] === 'string') msg += `: ${body['message']}`\n } catch {\n // ignore parse failure\n }\n throw new Error(msg)\n }\n\n if (!res.ok) throw new Error(`HTTP ${res.status} fetching ${fullUrl}`)\n\n const len = Number(res.headers.get('content-length') ?? 0)\n if (len > MAX_SIZE) throw new Error(`Response too large (${len} bytes) from ${fullUrl}`)\n\n const text = await res.text()\n if (text.length > MAX_SIZE) throw new Error(`Response too large from ${fullUrl}`)\n\n const json = JSON.parse(text) as unknown\n\n if (opts.cache !== false) await setCached(fullUrl, json)\n return json\n } catch (e) {\n lastError = e\n // Don't retry auth/logic errors\n if (e instanceof Error && /HTTP 4\\d\\d/.test(e.message)) break\n }\n }\n\n const msg = lastError instanceof Error ? lastError.message : String(lastError)\n throw new Error(\n `Network error fetching ${fullUrl}: ${msg}\\n(Check your internet connection or registry URL)`,\n )\n}\n\nexport { existsSync }\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 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 '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","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/http.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 { createHash } from 'node:crypto'\nimport { existsSync } from 'node:fs'\nimport { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nconst CACHE_DIR = join(homedir(), '.cascade', 'cache')\nconst MAX_SIZE = 10 * 1024 * 1024 // 10 MB\nconst TIMEOUT_MS = 15_000\nconst MAX_RETRIES = 4\n\nexport type FetchFn = (url: string, opts?: RequestInit) => Promise<Response>\n\nlet _fetchFn: FetchFn = globalThis.fetch as FetchFn\n\nexport function setFetch(fn: FetchFn): void {\n _fetchFn = fn\n}\n\nexport function resetFetch(): void {\n _fetchFn = globalThis.fetch as FetchFn\n}\n\nfunction cacheKey(url: string): string {\n return createHash('sha256').update(url).digest('hex')\n}\n\nasync function getCached(url: string): Promise<unknown | null> {\n try {\n const file = join(CACHE_DIR, cacheKey(url))\n const data = await readFile(file, 'utf8')\n return JSON.parse(data) as unknown\n } catch {\n return null\n }\n}\n\nasync function setCached(url: string, data: unknown): Promise<void> {\n try {\n await mkdir(CACHE_DIR, { recursive: true })\n await writeFile(join(CACHE_DIR, cacheKey(url)), JSON.stringify(data))\n } catch {\n // cache write failure is non-fatal\n }\n}\n\nexport async function fetchJson(\n url: string,\n opts: { headers?: Record<string, string>; params?: Record<string, string>; cache?: boolean } = {},\n): Promise<unknown> {\n const fullUrl = opts.params ? `${url}?${new URLSearchParams(opts.params).toString()}` : url\n\n if (opts.cache !== false) {\n const cached = await getCached(fullUrl)\n if (cached !== null) return cached\n }\n\n let lastError: unknown\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, 1000 * 2 ** (attempt - 1)))\n }\n try {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), TIMEOUT_MS)\n let res: Response\n try {\n res = await _fetchFn(fullUrl, {\n headers: { Accept: 'application/json', ...opts.headers },\n signal: controller.signal,\n })\n } finally {\n clearTimeout(timer)\n }\n\n if (res.status === 401 || res.status === 403 || res.status === 429) {\n let msg = `HTTP ${res.status}`\n try {\n const body = (await res.json()) as Record<string, unknown>\n if (typeof body['message'] === 'string') msg += `: ${body['message']}`\n } catch {\n // ignore parse failure\n }\n throw new Error(msg)\n }\n\n if (!res.ok) throw new Error(`HTTP ${res.status} fetching ${fullUrl}`)\n\n const len = Number(res.headers.get('content-length') ?? 0)\n if (len > MAX_SIZE) throw new Error(`Response too large (${len} bytes) from ${fullUrl}`)\n\n const text = await res.text()\n if (text.length > MAX_SIZE) throw new Error(`Response too large from ${fullUrl}`)\n\n const json = JSON.parse(text) as unknown\n\n if (opts.cache !== false) await setCached(fullUrl, json)\n return json\n } catch (e) {\n lastError = e\n // Don't retry auth/logic errors\n if (e instanceof Error && /HTTP 4\\d\\d/.test(e.message)) break\n }\n }\n\n const msg = lastError instanceof Error ? lastError.message : String(lastError)\n throw new Error(\n `Network error fetching ${fullUrl}: ${msg}\\n(Check your internet connection or registry URL)`,\n )\n}\n\nexport { existsSync }\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 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 '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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cascivo",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "description": "CLI — npx cascivo init / add / list / update",
6
6
  "keywords": [
@@ -12,13 +12,13 @@
12
12
  "react",
13
13
  "signals"
14
14
  ],
15
- "homepage": "https://github.com/urbanisierung/cascivo/tree/main/packages/cli#readme",
16
- "bugs": "https://github.com/urbanisierung/cascivo/issues",
15
+ "homepage": "https://github.com/cascivo/cascivo/tree/main/packages/cli#readme",
16
+ "bugs": "https://github.com/cascivo/cascivo/issues",
17
17
  "license": "MIT",
18
18
  "author": "urbanisierung",
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "git+https://github.com/urbanisierung/cascivo.git",
21
+ "url": "git+https://github.com/cascivo/cascivo.git",
22
22
  "directory": "packages/cli"
23
23
  },
24
24
  "bin": {
@@ -41,18 +41,18 @@
41
41
  "access": "public",
42
42
  "provenance": true
43
43
  },
44
- "dependencies": {
45
- "@cascivo/registry": "^0.1.0"
46
- },
47
- "devDependencies": {
48
- "@types/node": "^25",
49
- "typescript": "^5",
50
- "vite-plus": "^0.2.1"
51
- },
52
44
  "scripts": {
53
45
  "build": "vp pack && node -e \"const fs=require('fs');const f='dist/index.mjs';const c=fs.readFileSync(f,'utf8');if(!c.startsWith('#!/'))fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c)\" && chmod +x dist/index.mjs",
54
46
  "check": "tsc --noEmit",
55
47
  "test": "vp test",
56
48
  "dev": "vp pack --watch"
49
+ },
50
+ "dependencies": {
51
+ "@cascivo/registry": "workspace:^"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "catalog:",
55
+ "typescript": "catalog:",
56
+ "vite-plus": "catalog:"
57
57
  }
58
- }
58
+ }
package/readme.body.md CHANGED
@@ -1 +1,19 @@
1
- CLI for scaffold and copy-paste workflows`npx cascivo init`, `cascivo add <component>`, `cascivo audit --ai`. Detects your package manager, writes `cascivo.config.ts`, and fetches component source from `registry.json`.
1
+ The `cascivo` CLI drives the copy-paste workflowit scaffolds config, copies component source from the registry into your project, and audits generated code. You own every file it writes.
2
+
3
+ ## Commands
4
+
5
+ ```sh
6
+ npx cascivo init # scaffold cascivo.config.ts + tokens; detects your package manager
7
+ cascivo add button card # copy component source from the registry into your project
8
+ cascivo add owner/repo/button # install from any third-party registry
9
+ cascivo list # list available components
10
+ cascivo update # pull newer versions of copied components
11
+ cascivo audit --ai # flag hard-coded values, invented props, missing wiring
12
+ cascivo build # build a registry from your own components
13
+ ```
14
+
15
+ ## How it works
16
+
17
+ `init` detects npm / pnpm / yarn / bun, writes `cascivo.config.ts`, and wires up the token and theme imports. `add` resolves each component from [`registry.json`](https://github.com/cascivo/cascivo/blob/main/registry.json), fetches its source (TSX + CSS module + manifest) from GitHub raw URLs, and drops it into the path from your config — pulling in any dependencies it needs.
18
+
19
+ Because the registry model is open, `add owner/repo/component` installs from any compatible registry, not just the first-party one. See the [registry starter](https://github.com/cascivo/cascivo/tree/main/apps/examples/registry-starter) to publish your own.
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 urbanisierung
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.