cascivo 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.17.1",
2
+ "version": "0.18.0",
3
3
  "tokens": [
4
4
  { "name": "--cascivo-gray-0", "resolvedDefault": "oklch(1 0 0)" },
5
5
  { "name": "--cascivo-gray-50", "resolvedDefault": "oklch(0.985 0.002 264)" },
package/dist/index.mjs CHANGED
@@ -514,11 +514,11 @@ function resolvePackageManagerFlag(args) {
514
514
  * and GETTING-STARTED.md tells adopters to pin exactly. Regenerate with `pnpm regen`.
515
515
  */
516
516
  const CASCIVO_VERSIONS = {
517
- "@cascivo/react": "0.17.1",
518
- "@cascivo/themes": "0.4.12",
519
- "@cascivo/charts": "0.17.1",
520
- "@cascivo/icons": "0.3.9",
521
- "@cascivo/eslint-config": "0.2.3"
517
+ "@cascivo/react": "0.18.0",
518
+ "@cascivo/themes": "0.4.13",
519
+ "@cascivo/charts": "0.18.0",
520
+ "@cascivo/icons": "0.3.10",
521
+ "@cascivo/eslint-config": "0.2.4"
522
522
  };
523
523
  /** `@cascivo/core`'s declared `@preact/signals-react` peer range. */
524
524
  const SIGNALS_PEER = ">=3.0.0";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["resolvePath","DEFAULT_CONFIG","item"],"sources":["../src/utils/exec.ts","../src/utils/resolve.ts","../src/utils/directory.ts","../src/commands/add.ts","../src/utils/args.ts","../src/generated/versions.ts","../src/commands/create.ts","../src/commands/doctor.ts","../src/commands/generate.ts","../src/commands/init.ts","../src/commands/list.ts","../src/commands/registry.ts","../src/commands/search.ts","../../theme-kit/src/config.ts","../../theme-kit/src/hash.ts","../../theme-kit/src/css.ts","../src/commands/theme.ts","../src/utils/diff.ts","../src/utils/merge.ts","../src/commands/update.ts","../src/commands/view.ts","../src/index.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process'\nimport { detectPackageManager, installCommand, installHint, type PackageManager } from './config.js'\n\n/**\n * Install npm packages using the detected (or explicitly chosen) package\n * manager, inheriting stdio so the user sees install progress. On failure it\n * prints the exact command to run by hand — the adopter can always recover even\n * when the spawn fails (e.g. npm crashing inside a pnpm workspace). Returns\n * false if the install failed.\n */\nexport function installPackages(\n packages: string[],\n cwd: string = process.cwd(),\n opts: {\n pm?: PackageManager\n dev?: boolean\n /** Registry peer floors, so a known minimum is honoured rather than silently ignored. */\n floors?: Record<string, string>\n /** `--pin <version>` escape hatch: install every `@cascivo/*` at exactly this version. */\n pin?: string\n } = {},\n): boolean {\n if (packages.length === 0) return true\n const pm = opts.pm ?? detectPackageManager(cwd)\n const [cmd, args] = installCommand(pm, packages, {\n dev: opts.dev ?? false,\n ...(opts.floors ? { floors: opts.floors } : {}),\n ...(opts.pin ? { pin: opts.pin } : {}),\n })\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 console.error(\n `Install them yourself with: ${installHint(pm, packages, { dev: opts.dev ?? false })}`,\n )\n return false\n }\n return true\n}\n","import { CASCIVO_HOST, type CascadeConfig, type RegistryNamespaceConfig } from './config.js'\nimport { fetchJson } from './http.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\nexport type AddressKind = 'bare' | 'namespace' | 'url' | 'github'\n\nexport interface ParsedAddress {\n kind: AddressKind\n namespace?: string\n name: string\n ref?: string\n raw: string\n}\n\nconst GITHUB_RE = /^([^/]+)\\/([^/]+)\\/([^#]+)(?:#(.+))?$/\n\nfunction expandEnv(str: string, env: NodeJS.ProcessEnv = process.env): string {\n return str.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => {\n const val = env[key]\n if (val === undefined) throw new Error(`Environment variable ${key} is not set`)\n return val\n })\n}\n\nexport function parseAddress(spec: string, _env: NodeJS.ProcessEnv = process.env): ParsedAddress {\n if (\n spec.startsWith('http://') ||\n spec.startsWith('https://') ||\n spec.startsWith('./') ||\n spec.startsWith('/')\n ) {\n return { kind: 'url', name: spec, raw: spec }\n }\n\n if (spec.startsWith('@')) {\n const slash = spec.indexOf('/', 1)\n if (slash === -1) throw new Error(`Invalid namespace address: ${spec} (expected @ns/name)`)\n const namespace = spec.slice(0, slash)\n const name = spec.slice(slash + 1)\n return { kind: 'namespace', namespace, name, raw: spec }\n }\n\n // GitHub: owner/repo/item[#ref] — at least 3 path segments, no leading protocol/dot\n const specWithoutRef = spec.includes('#') ? spec.slice(0, spec.indexOf('#')) : spec\n const githubMatch = GITHUB_RE.exec(spec)\n if (githubMatch && !specWithoutRef.includes('.') && specWithoutRef.split('/').length >= 3) {\n const [, owner, repo, item, ref] = githubMatch\n return {\n kind: 'github',\n name: `${owner}/${repo}/${item}`,\n ref: ref ?? 'main',\n raw: spec,\n }\n }\n\n return { kind: 'bare', name: spec, raw: spec }\n}\n\nfunction resolveNamespaceUrl(\n ns: string,\n name: string,\n nsCfg: RegistryNamespaceConfig,\n env: NodeJS.ProcessEnv,\n): string {\n const template = typeof nsCfg === 'string' ? nsCfg : nsCfg.url\n if (!template.includes('{name}')) {\n throw new Error(`Registry namespace \"${ns}\" URL template must contain {name}: ${template}`)\n }\n return expandEnv(template.replace('{name}', name), env)\n}\n\nexport async function resolveItemUrl(\n addr: ParsedAddress,\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n resolveNamespaceHook?: (ns: string) => Promise<RegistryNamespaceConfig | null>,\n): Promise<{ url: string; headers?: Record<string, string>; params?: Record<string, string> }> {\n switch (addr.kind) {\n case 'url':\n return { url: addr.name }\n\n case 'bare': {\n const base = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\n return { url: `${base}/r/${addr.name}.json` }\n }\n\n case 'github': {\n const parts = addr.name.split('/')\n const owner = parts[0]!\n const repo = parts[1]!\n const item = parts.slice(2).join('/')\n const ref = addr.ref ?? 'main'\n return {\n url: `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/r/${item}.json`,\n }\n }\n\n case 'namespace': {\n const ns = addr.namespace!\n const name = addr.name\n\n // Config-defined namespaces always win\n if (config.registries?.[ns]) {\n const nsCfg = config.registries[ns]!\n const url = resolveNamespaceUrl(ns, name, nsCfg, env)\n const headers = typeof nsCfg !== 'string' ? nsCfg.headers : undefined\n const params = typeof nsCfg !== 'string' ? nsCfg.params : undefined\n const expandedHeaders = headers\n ? Object.fromEntries(Object.entries(headers).map(([k, v]) => [k, expandEnv(v, env)]))\n : undefined\n const expandedParams = params\n ? Object.fromEntries(Object.entries(params).map(([k, v]) => [k, expandEnv(v, env)]))\n : undefined\n const result: {\n url: string\n headers?: Record<string, string>\n params?: Record<string, string>\n } = { url }\n if (expandedHeaders) result.headers = expandedHeaders\n if (expandedParams) result.params = expandedParams\n return result\n }\n\n // Directory fallback hook (injected from T3)\n if (resolveNamespaceHook) {\n const hookResult = await resolveNamespaceHook(ns)\n if (hookResult) {\n const url = resolveNamespaceUrl(ns, name, hookResult, env)\n return { url }\n }\n }\n\n // Built-in first-party namespace fallback (@cascade is the legacy alias)\n if (ns === '@cascivo' || ns === '@cascade') {\n return { url: `${CASCIVO_HOST}/r/${name}.json` }\n }\n\n throw new Error(\n `Unknown namespace \"${ns}\". Add it to registries in cascivo.config.ts or check the directory at cascivo.com`,\n )\n }\n }\n}\n\nexport interface InstallPlan {\n items: {\n spec: string\n addr: ParsedAddress\n itemUrl: string\n headers?: Record<string, string>\n params?: Record<string, string>\n item: RegistryItem\n registryBase: string\n }[]\n}\n\nexport async function resolveClosure(\n specs: string[],\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n resolveNamespaceHook?: (ns: string) => Promise<RegistryNamespaceConfig | null>,\n): Promise<InstallPlan> {\n const seen = new Set<string>()\n const queue: string[] = [...specs]\n const plan: InstallPlan['items'] = []\n\n while (queue.length > 0) {\n const spec = queue.shift()!\n const addr = parseAddress(spec, env)\n const identity = addr.raw\n\n if (seen.has(identity)) continue\n seen.add(identity)\n\n const { url, headers, params } = await resolveItemUrl(addr, config, env, resolveNamespaceHook)\n const fetchOpts: Parameters<typeof fetchJson>[1] = {}\n if (headers) fetchOpts.headers = headers\n if (params) fetchOpts.params = params\n const raw = await fetchJson(url, fetchOpts)\n const item = raw as RegistryItem\n\n const base = url.replace(/\\/[^/]+\\.json$/, '')\n\n const entry: InstallPlan['items'][number] = {\n spec,\n addr,\n itemUrl: url,\n item,\n registryBase: base,\n }\n if (headers) entry.headers = headers\n if (params) entry.params = params\n plan.push(entry)\n\n for (const dep of item.registryDependencies ?? []) {\n queue.push(dep)\n }\n }\n\n return { items: plan }\n}\n","import type { RegistryNamespaceConfig } from './config.js'\nimport { fetchJson } from './http.js'\nimport type { FetchFn } from './http.js'\n\nimport { CASCIVO_HOST } from './config.js'\n\nexport const DIRECTORY_URL = `${CASCIVO_HOST}/r/registries.json`\n\ninterface DirectoryEntry {\n namespace: string\n registryUrl: string\n}\n\ninterface DirectoryResponse {\n registries?: DirectoryEntry[]\n}\n\nexport async function resolveFromDirectory(\n ns: string,\n fetchFn?: FetchFn,\n): Promise<RegistryNamespaceConfig | null> {\n try {\n // fetchJson uses the module-level _fetchFn; if a custom fetchFn is provided, we use it directly\n let data: DirectoryResponse\n if (fetchFn) {\n const res = await fetchFn(DIRECTORY_URL, { headers: { Accept: 'application/json' } })\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n data = (await res.json()) as DirectoryResponse\n } else {\n data = (await fetchJson(DIRECTORY_URL)) as DirectoryResponse\n }\n const entry = data.registries?.find((r) => r.namespace === ns)\n if (!entry) return null\n return entry.registryUrl\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n console.warn(`Could not reach cascivo.com directory: ${msg}`)\n return null\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { join, resolve as resolvePath } from 'node:path'\nimport {\n detectPackageManager,\n installHint,\n type CascadeConfig,\n type PackageManager,\n} from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchTextRetry } from '../utils/http.js'\nimport {\n fetchRegistry,\n fileName,\n findComponent,\n type Registry,\n type RegistryComponent,\n} from '../utils/registry.js'\nimport { createLock, readLock, sha256, updateLockEntry, writeLock } from '../utils/lock.js'\nimport { checkPeerVersions } from '../utils/peer-versions.js'\nimport { resolveClosure } from '../utils/resolve.js'\nimport { resolveFromDirectory } from '../utils/directory.js'\nimport { isTemplateItem, type RegistryItem } from '@cascivo/registry'\n\n/** Dependencies always present in a cascade project — never auto-installed. */\nconst ASSUMED_DEPS = new Set(['react', 'react-dom'])\n\n/** Merged dependencies + devDependencies from the project's package.json (empty if none). */\nfunction readProjectDeps(cwd: string): Record<string, unknown> {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n return { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n // No package.json — treat as no deps installed.\n return {}\n }\n}\n\n/**\n * Copied components read `--cascivo-*` custom properties; without\n * @cascivo/tokens or @cascivo/themes imported somewhere, they render unstyled.\n * Print the wiring once after a successful install if neither is a dependency.\n */\nfunction hintThemesIfMissing(cwd: string, pm: PackageManager): void {\n const deps = readProjectDeps(cwd)\n if (deps['@cascivo/themes'] !== undefined || deps['@cascivo/tokens'] !== undefined) return\n console.log(\n '\\nStyling: cascivo components read --cascivo-* tokens, which this project does not import yet.',\n )\n console.log(` ${installHint(pm, ['@cascivo/themes'])}`)\n console.log(\" import '@cascivo/themes/all' // once, in your entry file\")\n console.log(' <html data-theme=\"light\"> // or any container')\n}\n\n/** Resolve where a template's own file is written — relative to the project root. */\nexport function resolveTemplateTarget(cwd: string, target: string): string {\n return resolvePath(cwd, target)\n}\n\nexport interface ResolvedBareEntry {\n entry: RegistryComponent\n /** True if reached via an original `cascivo add` argument; false if pulled as a transitive dependency. */\n requested: boolean\n}\n\n/**\n * Names from other libraries → the cascivo layout primitive that fills the same\n * role, so `cascivo add box` installs `layout/flex`. Bare names that already\n * resolve (e.g. `flex` → `layout/flex` via suffix match) still list an alias here\n * for discoverability.\n */\nexport const LAYOUT_ALIASES: Record<string, string> = {\n box: 'layout/flex',\n hstack: 'layout/flex',\n vstack: 'layout/flex',\n gap: 'spacer',\n}\n\n/**\n * Disambiguation printed when a requested bare name is a real cascivo component\n * whose meaning differs from the same name elsewhere, so an adopter who grabbed\n * it by name alone learns the right primitive. Keyed by lowercased bare name.\n */\nexport const NAME_NOTES: Record<string, string> = {\n stack:\n \"Note: cascivo's Stack overlaps children into a card-pile (z-axis), not a \" +\n 'vertical spacing layout. For vertical spacing use Flex direction=\"vertical\" ' +\n '(cascivo add flex; aliases: vstack, hstack).',\n}\n\n/**\n * Resolve the transitive closure of bare-name registry entries, following each\n * entry's `registryDependencies`. De-duped by resolved registry name and\n * cycle-safe (an entry is processed at most once). Returns resolved entries in\n * install order plus the names that could not be found. Pure — no I/O.\n */\nexport function resolveBareClosure(\n registry: Registry,\n bareSpecs: string[],\n): { resolved: ResolvedBareEntry[]; missing: string[] } {\n const queue: { name: string; requested: boolean }[] = bareSpecs.map((name) => ({\n name,\n requested: true,\n }))\n const installed = new Set<string>()\n const resolved: ResolvedBareEntry[] = []\n const missing: string[] = []\n\n while (queue.length > 0) {\n const { name, requested } = queue.shift()!\n const resolvedName = LAYOUT_ALIASES[name.toLowerCase()] ?? name\n const entry = findComponent(registry, resolvedName)\n if (!entry) {\n missing.push(name)\n continue\n }\n if (installed.has(entry.name)) continue\n installed.add(entry.name)\n resolved.push({ entry, requested })\n for (const dep of entry.registryDependencies ?? []) {\n queue.push({ name: dep, requested: false })\n }\n }\n\n return { resolved, missing }\n}\n\n/**\n * First-party items are hosted on cascivo.com or the cascivo/cascivo GitHub\n * repo (raw file URLs). Anything else gets a review-before-use notice.\n */\nconst FIRST_PARTY_URL = /^https:\\/\\/(cascivo\\.com|raw\\.githubusercontent\\.com\\/cascivo\\/cascivo)\\//\n\nexport function isThirdParty(itemUrl: string): boolean {\n return !FIRST_PARTY_URL.test(itemUrl)\n}\n\nfunction isMultiRegistrySpec(name: string): boolean {\n return (\n name.startsWith('@') ||\n name.startsWith('http://') ||\n name.startsWith('https://') ||\n name.startsWith('./') ||\n name.startsWith('/') ||\n name.split('/').length >= 3\n )\n}\n\nexport async function add(\n names: string[],\n config: CascadeConfig,\n opts: {\n dryRun?: boolean\n yes?: boolean\n cwd?: string\n pm?: PackageManager\n noInstall?: boolean\n } = {},\n): Promise<void> {\n if (names.length === 0) {\n console.error('Usage: cascivo add <component...>')\n return\n }\n\n const cwd = opts.cwd ?? process.cwd()\n const pm = opts.pm ?? detectPackageManager(cwd)\n const multiSpecs = names.filter(isMultiRegistrySpec)\n let bareSpecs = names.filter((n) => !isMultiRegistrySpec(n))\n\n // Bare names that match a first-party template install through the per-item\n // path (they carry file targets the bare component path cannot express).\n let registry: Registry | null = null\n if (bareSpecs.length > 0) {\n registry = await fetchRegistry(config.registry)\n const templateNames = new Set(registry.templates.map((t) => t.toLowerCase()))\n const templateSpecs = bareSpecs.filter((n) => templateNames.has(n.toLowerCase()))\n if (templateSpecs.length > 0) {\n bareSpecs = bareSpecs.filter((n) => !templateNames.has(n.toLowerCase()))\n multiSpecs.push(...templateSpecs.map((n) => `@cascivo/${n.toLowerCase()}`))\n }\n }\n\n let lock = (await readLock(cwd)) ?? createLock()\n\n // Handle multi-registry specs (namespaces, URLs, GitHub)\n if (multiSpecs.length > 0) {\n const plan = await resolveClosure(multiSpecs, config, process.env, resolveFromDirectory)\n\n if (opts.dryRun) {\n console.log('Dry run — would install:')\n for (const item of plan.items) {\n const kind = isTemplateItem(item.item) ? ' [template]' : ''\n console.log(\n ` ${item.spec} (${item.item.name}@${item.item.version})${kind} from ${item.itemUrl}`,\n )\n for (const f of item.item.files) {\n const arrow = isTemplateItem(item.item) && f.target ? ` → ${f.target}` : ''\n console.log(` ${f.url}${arrow}`)\n }\n if (item.item.registryDependencies?.length) {\n console.log(` components: ${item.item.registryDependencies.join(', ')}`)\n }\n }\n return\n }\n\n for (const { item, itemUrl, registryBase } of plan.items) {\n if (isThirdParty(itemUrl)) {\n console.log(\n `\\nReview before use — files from non-directory registry: ${registryBase}\\n` +\n (item.files ?? []).map((f) => ` ${f.url}`).join('\\n'),\n )\n }\n\n let fileHashes: Record<string, string>\n try {\n fileHashes = await installItem(item, config, cwd, {\n pm,\n ...(opts.noInstall ? { noInstall: true } : {}),\n })\n } catch (e) {\n // Nothing was written for this item (fetch-all-then-write), so the\n // lockfile must not record it either.\n console.error(`Failed to install ${item.name}: ${e instanceof Error ? e.message : e}`)\n process.exitCode = 1\n continue\n }\n lock = updateLockEntry(lock, item.name, {\n registry: registryBase,\n version: item.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: fileHashes,\n })\n }\n await writeLock(lock, cwd)\n if (bareSpecs.length === 0) {\n hintThemesIfMissing(cwd, pm)\n return\n }\n }\n\n if (bareSpecs.length === 0) return\n // Legacy bare-name path (uses the registry fetched above for template\n // detection). Resolves the transitive closure of registry (component)\n // dependencies so a component that imports a shared hook/sibling\n // (e.g. `../popover/use-popover`) installs that dependency too.\n registry ??= await fetchRegistry(config.registry)\n const missingDeps = new Set<string>()\n const registryBase = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\n\n for (const spec of bareSpecs) {\n const note = NAME_NOTES[spec.toLowerCase()]\n if (note) console.log(note)\n\n const alias = LAYOUT_ALIASES[spec.toLowerCase()]\n if (!alias) continue\n const target = findComponent(registry, alias)\n if (target) {\n console.log(\n `\"${spec}\" is not a cascivo component — installing ${target.name} (its ${spec} primitive).`,\n )\n }\n }\n\n const { resolved, missing } = resolveBareClosure(registry, bareSpecs)\n for (const name of missing) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n }\n\n // Announce the CHANNEL before anything else runs. `cascivo add area-chart` reads like\n // every other add — same syntax, same \"you own the code\" framing — but copies no source:\n // it installs an npm package. That was only stated inside the install log, which scrolls\n // past. Say it first, once per package, for what the caller actually asked for.\n const announced = new Set<string>()\n for (const { entry, requested } of resolved) {\n if (!requested || !entry.install || announced.has(entry.install)) continue\n announced.add(entry.install)\n console.log(\n `\\n\"${entry.name}\" ships in the ${entry.install} npm package — no source is copied ` +\n 'into your project. Updates come from your package manager, not `cascivo update`.',\n )\n }\n\n // Warn BEFORE copying, and only for what the caller actually asked for — a deprecated\n // entry pulled in transitively is not their decision to make. The source's `@deprecated`\n // JSDoc arrives too late: by the time it is read, the file is already vendored.\n for (const { entry, requested } of resolved) {\n if (!requested || !entry.deprecated) continue\n const { replacement, since, note } = entry.deprecated\n console.warn(\n `\\n⚠ \"${entry.name}\" is deprecated since ${since}. Use \"${replacement}\" instead:\\n` +\n ` cascivo add ${replacement}\\n` +\n (note ? ` ${note}\\n` : '') +\n ` Adding \"${entry.name}\" anyway — it still works.\\n`,\n )\n }\n\n // Aggregate each resolved entry's peer-version floors (e.g. \"install data-table\n // needs @cascivo/i18n >= 0.2.1\") so we can verify what actually got installed.\n const peerFloors: Record<string, string> = {}\n for (const { entry } of resolved) {\n for (const [pkg, floor] of Object.entries(entry.peerVersions ?? {})) {\n peerFloors[pkg] = floor\n }\n }\n\n // npm-distributed entries (charts/flow/editor) are a runtime package, not\n // copied source. Collect their package + import lines here so N chart entries\n // produce ONE `@cascivo/charts` install rather than N, then install once below.\n const npmPackages = new Set<string>()\n const importLines: string[] = []\n\n for (const { entry, requested } of resolved) {\n if (entry.install) {\n const pkg = entry.install\n npmPackages.add(pkg)\n console.log(\n `\"${entry.name}\" is distributed as the npm package ${pkg} — a runtime dependency, ` +\n `not copied source (updates come via your package manager).`,\n )\n importLines.push(` import { ${entry.meta.name} } from '${pkg}'`)\n if (entry.styles) {\n importLines.push(` import '${entry.styles}' // once, in your entry file`)\n }\n continue\n }\n\n const outputName = entry.name.includes('/') ? entry.name.split('/').pop()! : entry.name\n const fileHashes: Record<string, string> = {}\n\n // Two-phase: fetch every file before writing any, so a mid-install network\n // failure can never leave a half-copied component (or a lockfile entry\n // pointing at one).\n let fetched: { url: string; content: string }[]\n try {\n fetched = await Promise.all(\n entry.files.map(async (url) => ({ url, content: await fetchTextRetry(url) })),\n )\n } catch (e) {\n console.error(`Failed to install ${entry.name}: ${e instanceof Error ? e.message : e}`)\n process.exitCode = 1\n continue\n }\n for (const { url, content } of fetched) {\n const dest = resolveOutputPath(config.outputDir, outputName, fileName(url), cwd)\n await writeFileSafe(dest, content)\n fileHashes[dest] = sha256(content)\n }\n\n for (const dep of entry.dependencies) {\n if (!ASSUMED_DEPS.has(dep)) missingDeps.add(dep)\n }\n\n lock = updateLockEntry(lock, entry.name, {\n registry: registryBase,\n version: entry.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: fileHashes,\n })\n\n const suffix = requested ? '' : ' (dependency)'\n console.log(`Added ${entry.name} to ${config.outputDir}/${outputName}/${suffix}`)\n }\n\n // Install npm-distributed packages (charts/flow/editor) once, deduped, skipping\n // any already in the project. `--no-install`/`--dry-run` fall back to printing.\n if (npmPackages.size > 0) {\n const deps = readProjectDeps(cwd)\n const needed = [...npmPackages].filter((p) => deps[p] === undefined)\n if (opts.dryRun) {\n console.log(`Dry run — would install npm package(s): ${[...npmPackages].join(', ')}`)\n } else if (needed.length > 0) {\n if (opts.noInstall) {\n console.log(`\\nSkipped install (--no-install). Install with:\\n ${installHint(pm, needed)}`)\n } else if (!installPackages(needed, cwd, { pm })) {\n process.exitCode = 1\n }\n }\n if (importLines.length > 0) {\n console.log(`\\nImport it:\\n${importLines.join('\\n')}`)\n }\n }\n\n if (missingDeps.size > 0 && !opts.dryRun) {\n if (opts.noInstall) {\n console.log(\n `\\nSkipped install (--no-install). Install with:\\n ${installHint(pm, [...missingDeps])}`,\n )\n } else {\n installPackages([...missingDeps], cwd, { pm })\n }\n }\n\n if (Object.keys(peerFloors).length > 0) {\n const violations = await checkPeerVersions(cwd, peerFloors)\n for (const v of violations) {\n console.error(\n `\\nWarning: ${v.pkg} ${v.installed ? `${v.installed} is` : 'is not'} installed, but ` +\n `the copied component source needs ${v.pkg} ${v.required}. ` +\n `Run: ${installHint(pm, [`${v.pkg}@latest`])}`,\n )\n process.exitCode = 1\n }\n }\n\n await writeLock(lock, cwd)\n hintThemesIfMissing(cwd, pm)\n}\n\n/**\n * Install a single resolved item, returning a map of written path → content\n * hash for the lockfile. A template writes its own files to their `target`\n * paths (relative to the project root); every other item writes its files under\n * the components output directory. A template's components are installed\n * separately as their own plan entries (via `registryDependencies`).\n */\nasync function installItem(\n item: RegistryItem,\n config: CascadeConfig,\n cwd: string,\n opts: { pm?: PackageManager; noInstall?: boolean } = {},\n): Promise<Record<string, string>> {\n const fileHashes: Record<string, string> = {}\n const missingDeps = new Set<string>()\n const template = isTemplateItem(item)\n const outputName = item.name.includes('/') ? item.name.split('/').pop()! : item.name\n\n // Two-phase: fetch every file before writing any. A failed fetch aborts the\n // whole item (throws to the caller) instead of silently installing a subset.\n const fetched = await Promise.all(\n (item.files ?? []).map(async (file) => ({\n file,\n content: await fetchTextRetry(file.url),\n })),\n )\n for (const { file, content } of fetched) {\n const dest =\n template && file.target\n ? resolveTemplateTarget(cwd, file.target)\n : resolveOutputPath(config.outputDir, outputName, fileName(file.url), cwd)\n await writeFileSafe(dest, content)\n fileHashes[dest] = sha256(content)\n }\n\n for (const dep of item.dependencies ?? []) {\n if (!ASSUMED_DEPS.has(dep)) missingDeps.add(dep)\n }\n\n if (missingDeps.size > 0) {\n if (opts.noInstall) {\n console.log(\n `\\nSkipped install (--no-install). Install with:\\n ${installHint(opts.pm ?? detectPackageManager(cwd), [...missingDeps])}`,\n )\n } else {\n installPackages([...missingDeps], cwd, opts.pm ? { pm: opts.pm } : {})\n }\n }\n\n if (template) {\n const pages = item.files?.filter((f) => f.target).map((f) => f.target) ?? []\n console.log(`Installed template ${item.name} (${pages.length} files)`)\n } else {\n console.log(`Added ${item.name} to ${config.outputDir}/${outputName}/`)\n }\n\n return fileHashes\n}\n","import { isPackageManager, type PackageManager } from './config.js'\n\n/**\n * Read `--key value` or `--key=value` from an argv slice. Ignores a following\n * token that is itself a flag (so `--tokens --dry-run` yields undefined, not\n * `--dry-run`).\n */\nexport function flagValue(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\n/**\n * Extract positional (non-flag) arguments from an argv slice. Any token starting\n * with `-` is dropped, as is the value token immediately following a flag named\n * in `valueFlags` (e.g. `pnpm` in `--pm pnpm`), so component names never pick up\n * a flag or its value.\n */\nexport function positionalArgs(args: string[], valueFlags: string[] = []): string[] {\n const out: string[] = []\n for (let i = 0; i < args.length; i++) {\n const token = args[i]!\n if (token.startsWith('-')) {\n const key = token.replace(/^--?/, '').split('=')[0]!\n const next = args[i + 1]\n if (\n valueFlags.includes(key) &&\n !token.includes('=') &&\n next !== undefined &&\n !next.startsWith('-')\n ) {\n i++ // skip the flag's value token\n }\n continue\n }\n out.push(token)\n }\n return out\n}\n\n/**\n * Resolve the `--package-manager` / `--pm` flag to a validated PackageManager.\n * Absent flag → `{ pm: undefined }` (fall back to auto-detection). Unknown value\n * → `{ error }` so the caller can print it and exit non-zero.\n */\nexport function resolvePackageManagerFlag(\n args: string[],\n): { pm: PackageManager | undefined } | { error: string } {\n const raw = flagValue(args, 'package-manager') ?? flagValue(args, 'pm')\n if (raw === undefined) return { pm: undefined }\n if (isPackageManager(raw)) return { pm: raw }\n return { error: `Unknown package manager \"${raw}\". Use one of: pnpm, yarn, npm, bun.` }\n}\n","// GENERATED by scripts/registry/cli-versions.ts — do not edit by hand.\n/**\n * Exact published versions, baked in at build time.\n *\n * Scaffolded apps pin these rather than `\"latest\"`: the cascivo packages version\n * independently on 0.x, so a floating specifier can resolve a mutually incompatible set,\n * and GETTING-STARTED.md tells adopters to pin exactly. Regenerate with `pnpm regen`.\n */\nexport const CASCIVO_VERSIONS: Record<string, string> = {\n '@cascivo/react': '0.17.1',\n '@cascivo/themes': '0.4.12',\n '@cascivo/charts': '0.17.1',\n '@cascivo/icons': '0.3.9',\n '@cascivo/eslint-config': '0.2.3',\n}\n\n/** `@cascivo/core`'s declared `@preact/signals-react` peer range. */\nexport const SIGNALS_PEER = '>=3.0.0'\n","import { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { stdin, stdout } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\nimport {\n detectPackageManager,\n THEMES,\n type PackageManager,\n type ThemeName,\n} from '../utils/config.js'\nimport { flagValue, positionalArgs, resolvePackageManagerFlag } from '../utils/args.js'\nimport { writeFileSafe } from '../utils/fs.js'\nimport { CASCIVO_VERSIONS, SIGNALS_PEER } from '../generated/versions.js'\n\n/**\n * Exact published versions, baked in at build time by `scripts/registry/cli-versions.ts`.\n *\n * This used to be the literal `'latest'` for every cascivo dependency — the loosest\n * possible specifier on a set of independently-versioned 0.x packages, and the direct\n * opposite of GETTING-STARTED.md's \"pin **exact** versions (no `^`)\". A scaffold that\n * contradicts the docs on the very first file an adopter opens undermines every other rule\n * those docs state, so the pins are generated rather than hand-written.\n */\nconst V = CASCIVO_VERSIONS\n\n/** Install-everything command for a package manager (`pnpm install`, `yarn`, …). */\nfunction installAllCommand(pm: PackageManager): string {\n return pm === 'yarn' ? 'yarn' : `${pm} install`\n}\n\n/** Run-a-script command for a package manager (`npm run dev` vs `pnpm dev`). */\nfunction runScriptCommand(pm: PackageManager, script: string): string {\n return pm === 'npm' ? `npm run ${script}` : `${pm} ${script}`\n}\n\nexport interface ScaffoldOptions {\n /** Project directory + package name. */\n name: string\n /** Theme imported in the entry CSS and set on `<html data-theme>`. */\n theme: ThemeName\n /** Display labels for the side-nav sections (one section component each). */\n sections: string[]\n /** Package manager for the generated README's commands (default npm). */\n pm?: PackageManager\n}\n\nexport interface ScaffoldFile {\n /** Path relative to the project root. */\n path: string\n contents: string\n}\n\ninterface Section {\n /** Discriminant used in the section signal + conditional render. */\n key: string\n /** Human-readable label shown in the nav and section heading. */\n label: string\n /** PascalCase component + file name. */\n component: string\n}\n\n/** Slug suitable for a union-member string literal: lower-kebab, alnum only. */\nfunction slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'section'\n )\n}\n\n/** PascalCase identifier derived from a free-text label. */\nfunction pascalCase(label: string): string {\n const parts = label\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n const joined = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')\n const safe = joined || 'Section'\n return /^[0-9]/.test(safe) ? `Section${safe}` : safe\n}\n\n/**\n * Short, human-readable brand for the shell header.\n *\n * The directory name is the wrong thing to render verbatim: a dated demo directory\n * (`vercel-dashboard-2026-07-30-take2`) produced a 45-character brand in the top-left of\n * every page. Take the leading words, title-case them, and stop — a brand is a label, not a\n * slug. Bare numbers and `v2`-style segments are dropped rather than counted.\n */\nexport function brandName(name: string): string {\n const words = name\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter((w) => w !== '' && !/^\\d+$/.test(w) && !/^v\\d+$/i.test(w))\n const kept: string[] = []\n for (const word of words) {\n if (kept.length >= 3) break\n if (kept.length > 0 && kept.join(' ').length + 1 + word.length > 24) break\n kept.push(word.charAt(0).toUpperCase() + word.slice(1))\n }\n return kept.join(' ') || 'App'\n}\n\n/** Normalize the project name into a valid npm package name. */\nfunction packageName(name: string): string {\n return (\n name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'cascivo-app'\n )\n}\n\n/** Turn raw section labels into unique keyed/component-named sections. */\nfunction resolveSections(labels: string[]): Section[] {\n const seenKeys = new Set<string>()\n const seenComponents = new Set<string>()\n const sections: Section[] = []\n for (const label of labels) {\n const trimmed = label.trim()\n if (!trimmed) continue\n let key = slug(trimmed)\n let component = pascalCase(trimmed)\n let n = 2\n while (seenKeys.has(key) || seenComponents.has(component)) {\n key = `${slug(trimmed)}-${n}`\n component = `${pascalCase(trimmed)}${n}`\n n++\n }\n seenKeys.add(key)\n seenComponents.add(component)\n sections.push({ key, label: trimmed, component })\n }\n return sections.length > 0 ? sections : [{ key: 'home', label: 'Home', component: 'Home' }]\n}\n\nfunction packageJson(opts: ScaffoldOptions): string {\n const pkg = {\n name: packageName(opts.name),\n private: true,\n version: '0.0.0',\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n typecheck: 'tsc --noEmit',\n lint: 'eslint .',\n format: 'prettier --write .',\n 'format:check': 'prettier --check .',\n },\n // Prebuilt path (Path B): `@cascivo/react` and `@cascivo/themes` only.\n //\n // `@cascivo/core` and `@cascivo/tokens` are deliberately absent. AI-RULES.md: \"**Never**\n // add `@cascivo/core` to a prebuilt-path app's package.json — it is only a transitive\n // dependency there, and everything is re-exported from `@cascivo/react`.\"\n // GETTING-STARTED.md says the same of `@cascivo/tokens`, which arrives with\n // `@cascivo/themes` as a direct dependency. The scaffold used to declare both and then\n // import from them, so it violated two documented rules and taught the pattern by example.\n //\n // `@preact/signals-react` IS declared: it is a required peer that the generated\n // `App.tsx` calls into via `useSignals()`. It used to be omitted entirely and survived\n // only by hoisting — a phantom dependency that breaks under pnpm's strict layout.\n dependencies: {\n '@cascivo/react': V['@cascivo/react']!,\n '@cascivo/themes': V['@cascivo/themes']!,\n '@preact/signals-react': SIGNALS_PEER,\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n },\n devDependencies: {\n '@cascivo/eslint-config': V['@cascivo/eslint-config']!,\n '@eslint/js': '^9.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n '@vitejs/plugin-react': '^5.0.0',\n eslint: '^9.0.0',\n 'eslint-plugin-react-hooks': '^7.0.0',\n prettier: '^3.0.0',\n typescript: '^5.7.0',\n // Registers the TypeScript parser AND the `files` patterns that make ESLint look at\n // .ts/.tsx at all. Without it ESLint 9's default `files` is **/*.{js,cjs,mjs}, so\n // `lint` on a TypeScript-only app exits 0 having inspected zero files — a green check\n // that proves nothing (2026-08-08 report B).\n 'typescript-eslint': '^8.0.0',\n vite: '^7.0.0',\n },\n }\n return JSON.stringify(pkg, null, 2) + '\\n'\n}\n\nfunction tsconfig(): string {\n const cfg = {\n compilerOptions: {\n target: 'ES2022',\n useDefineForClassFields: true,\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n moduleDetection: 'force',\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n }\n return JSON.stringify(cfg, null, 2) + '\\n'\n}\n\nfunction viteConfig(): string {\n return `import react from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [react()],\n})\n`\n}\n\nfunction indexHtml(opts: ScaffoldOptions): string {\n return `<!doctype html>\n<html lang=\"en\" data-theme=\"${opts.theme}\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${brandName(opts.name)}</title>\n <style>\n @layer vendor, cascivo.reset, cascivo.base, cascivo.tokens, cascivo.component,\n cascivo.platform, cascivo.theme, cascivo.blocks, cascivo.example, cascivo.override;\n /* cascivo.example is this app's own slot — above the component/blocks layers so your\n styles win, below cascivo.override which stays free for one-off hotfixes. The\n generated AGENTS.md tells the agent to write there, and this statement is what makes\n that legal: a layer used but never declared falls to the end of the cascade and\n beats everything, which is the opposite of what the ordering is for. */\n /* Third-party CSS goes in the low-priority vendor layer so it can't beat cascivo:\n @import url('some-lib/styles.css') layer(vendor); — see docs/THIRD-PARTY-CSS.md */\n @layer cascivo.reset {\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n }\n @layer cascivo.base {\n html,\n body,\n #root {\n height: 100%;\n }\n }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}\n\nfunction mainTsx(): string {\n return `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\n\nconst root = document.getElementById('root')\nif (root) {\n ReactDOM.createRoot(root).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n )\n}\n`\n}\n\nfunction viteEnv(): string {\n return `/// <reference types=\"vite/client\" />\\n`\n}\n\n// No `opts`: the theme import and the brand moved to `Shell.tsx`, which owns the app chrome.\nfunction appTsx(sections: Section[]): string {\n const sectionImports = sections\n .map((s) => `import { ${s.component} } from './sections/${s.component}'`)\n .join('\\n')\n\n const unionType = sections.map((s) => `'${s.key}'`).join(' | ')\n\n const navItems = sections\n .map(\n (s) => ` {\n label: '${s.label.replace(/'/g, \"\\\\'\")}',\n active: section.value === '${s.key}',\n onClick: (e) => {\n e.preventDefault()\n section.value = '${s.key}'\n },\n },`,\n )\n .join('\\n')\n\n const renderedSections = sections\n .map((s) => ` {section.value === '${s.key}' && <${s.component} />}`)\n .join('\\n')\n\n // Everything comes from `@cascivo/react` on the prebuilt path — it re-exports the\n // `@cascivo/core` primitives, so importing from `@cascivo/core` directly would make it a\n // phantom dependency (and AI-RULES.md forbids declaring it here). There is likewise no\n // `import '@cascivo/tokens'`: the tokens arrive with the theme stylesheet.\n return `'use client'\nimport { signal, useSignals, type SideNavItem } from '@cascivo/react'\nimport { Shell } from './Shell'\n${sectionImports}\n\ntype Section = ${unionType}\n\nconst section = signal<Section>('${sections[0]!.key}')\n\nexport default function App() {\n useSignals()\n\n const navItems: SideNavItem[] = [\n${navItems}\n ]\n\n return (\n <Shell navItems={navItems}>\n${renderedSections}\n </Shell>\n )\n}\n`\n}\n\n/**\n * The app shell, as its own component with a `children` slot.\n *\n * Split out of `App.tsx` because the shell composition — AppShell + ShellHeader + SideNav —\n * is the valuable part of the scaffold, and it used to be welded to the signal-driven\n * section switcher. A 2026-08-14 adopter prompted for \"a dashboard with Vite and React\n * Router\", then deleted `App.tsx` and all of `src/sections/` — the majority of what `create`\n * generated — and re-derived this wiring by hand.\n *\n * Now adding a router means deleting `App.tsx` + `src/sections/` and rendering `<Shell>` from\n * the root route's layout, with `navItems` carrying `href` instead of `onClick`. Nothing in\n * here needs to change.\n */\nfunction shellTsx(opts: ScaffoldOptions): string {\n return `'use client'\nimport { AppShell, ShellHeader, SideNav, type SideNavItem } from '@cascivo/react'\nimport type { ReactNode } from 'react'\n\nimport '@cascivo/themes/${opts.theme}.css'\n// No '@cascivo/react/styles.css' here. On a bundler build each component imports its\n// own CSS, so you ship exactly what you use — this app emits well under 100 kB of entry\n// CSS instead of the ~273 kB aggregate sheet. Import the aggregate ONLY if you drop the\n// bundler (CDN / single-file setup). See https://cascivo.com/docs/getting-started.md\n// The theme import above is always required — themes are never automatic.\n\nexport interface ShellProps {\n /** Side-nav entries. Use \\`href\\` for a routed app, \\`onClick\\` for local state. */\n navItems: SideNavItem[]\n children: ReactNode\n}\n\n/**\n * App shell: header + side nav + a content slot.\n *\n * Adding a router? Keep this file. Delete \\`App.tsx\\` and \\`src/sections/\\`, render\n * \\`<Shell navItems={…}>\\` from your root route's layout with your \\`<Outlet />\\` as children,\n * and give each nav item an \\`href\\` instead of an \\`onClick\\`.\n *\n * For those hrefs to become real router links, call \\`setLinkComponent\\` ONCE at startup in\n * \\`main.tsx\\` — see the \"Adding a router\" section of README.md for the exact snippet, or\n * https://cascivo.com/docs/using-with-a-router.md for the full recipe.\n */\nexport function Shell({ navItems, children }: ShellProps) {\n return (\n <AppShell\n header={<ShellHeader brand={{ name: '${brandName(opts.name).replace(/'/g, \"\\\\'\")}' }} />}\n nav={<SideNav items={navItems} />}\n >\n {children}\n </AppShell>\n )\n}\n`\n}\n\nfunction sectionTsx(section: Section): string {\n // No inline styles: the generated AGENTS.md tells the agent not to write them, and a\n // scaffold that models the opposite teaches the opposite. The page inset comes from\n // AppShell's own \\`padding\\` prop, and the stacking from \\`Flex\\` — note \\`gap\\` takes a\n // NUMBER (a space-scale step), not a string.\n return `import { Card, CardContent, CardHeader, CardTitle, Flex, Heading, Text } from '@cascivo/react'\n\nexport function ${section.component}() {\n return (\n <Flex gap={6}>\n <Flex gap={2}>\n <Heading level={1}>${section.label}</Heading>\n <Text muted>\n Edit <code>src/sections/${section.component}.tsx</code> to build out this page.\n </Text>\n </Flex>\n\n <Card>\n <CardHeader>\n <CardTitle>Get started</CardTitle>\n </CardHeader>\n <CardContent>\n <Text>\n This page is wired into the app shell. Add components with{' '}\n <code>npx cascivo add &lt;component&gt;</code>.\n </Text>\n </CardContent>\n </Card>\n </Flex>\n )\n}\n`\n}\n\n/**\n * ESLint flat config for the scaffold.\n *\n * `@cascivo/eslint-config` is wired in from the start because\n * `eslint-plugin-react-hooks@7`'s `recommended-latest` reports every `signal.value = next`\n * — the idiom AI-RULES.md mandates and the generated `App.tsx` below uses — as\n * `Error: This value cannot be modified`. Without this, `pnpm lint` on a freshly scaffolded\n * app errors on every piece of state it ships with.\n */\nfunction eslintConfig(): string {\n return `import js from '@eslint/js'\nimport tseslint from 'typescript-eslint'\nimport reactHooks from 'eslint-plugin-react-hooks'\nimport cascivo from '@cascivo/eslint-config'\n\nexport default [\n { ignores: ['dist/**'] },\n js.configs.recommended,\n // Registers the TypeScript parser and the .ts/.tsx \\`files\\` patterns. WITHOUT THIS ESLINT\n // LINTS NOTHING: its default \\`files\\` is **/*.{js,cjs,mjs}, so every file in this app is\n // skipped with \"File ignored because no matching configuration was supplied\" and the\n // \\`lint\\` script exits 0 having checked zero files.\n ...tseslint.configs.recommended,\n // NOTE the \\`.flat\\` — the plugin exports both \\`configs['recommended-latest']\\` (the legacy\n // eslintrc shape, which applies NOTHING here and reports no error) and this one.\n reactHooks.configs.flat['recommended-latest'],\n // Spread LAST — flat config is last-wins. This turns off \\`react-hooks/immutability\\`,\n // which reports cascivo's signal writes (\\`signal.value = next\\`) as errors. That rule\n // fires on the very first \\`signal.value = x\\` you write, so this is not optional wiring:\n // see https://cascivo.com/docs/using-with-strict-eslint.md\n ...cascivo,\n]\n`\n}\n\n/** Prettier config matching the style the scaffold's own generated source is written in. */\nfunction prettierrc(): string {\n return JSON.stringify({ semi: false, singleQuote: true, printWidth: 100 }, null, 2) + '\\n'\n}\n\nfunction prettierIgnore(): string {\n return `dist\nnode_modules\n# Vendored cascivo source is formatted upstream — reformatting it makes every\n# \\`cascivo add\\` update a merge conflict.\nsrc/components/ui/\n`\n}\n\nfunction gitignore(): string {\n return `node_modules\ndist\n*.local\n.DS_Store\n`\n}\n\nfunction readme(opts: ScaffoldOptions): string {\n const pm = opts.pm ?? 'npm'\n return `# ${opts.name}\n\nA [cascivo](https://cascivo.com) app — Vite + React + TypeScript, pre-wired with\nthe cascivo app shell, side navigation, and the \\`${opts.theme}\\` theme.\n\n## Develop\n\n\\`\\`\\`sh\n${installAllCommand(pm)}\n${runScriptCommand(pm, 'dev')}\n\\`\\`\\`\n\n## Structure\n\n- \\`src/Shell.tsx\\` — the app shell (header + side nav + content slot). Router-agnostic.\n- \\`src/App.tsx\\` — nav items and which section is showing\n- \\`src/sections/\\` — one component per nav item\n\nAdd more components with \\`npx cascivo add <component>\\`.\n\n## Adding a router\n\nThis app switches sections with a signal, not a router. To add one (React Router,\nTanStack Router, …):\n\n1. **Keep \\`src/Shell.tsx\\`.** Delete \\`src/App.tsx\\` and \\`src/sections/\\`.\n2. Render \\`<Shell navItems={…}>\\` from your root route's layout, with your \\`<Outlet />\\`\n as its children.\n3. Give each nav item an \\`href\\` instead of \\`onClick\\`.\n4. Register your router's Link **once** at startup, in \\`src/main.tsx\\`:\n\n\\`\\`\\`tsx\nimport { setLinkComponent } from '@cascivo/react'\nimport type { LinkComponentProps } from '@cascivo/react'\nimport { Link } from 'react-router'\n\nsetLinkComponent(({ href, ...rest }: LinkComponentProps) => <Link to={href ?? '#'} {...rest} />)\n\\`\\`\\`\n\nThat one call makes \\`SideNav\\`, \\`ShellHeader\\` and \\`Breadcrumb\\` render real router links.\nLinks you write in page content use \\`<Link asChild>\\` instead — two kinds of link, two\nmechanisms. Full recipe: https://cascivo.com/docs/using-with-a-router.md\n`\n}\n\nfunction agentsMd(opts: ScaffoldOptions): string {\n return `# Agent instructions — ${opts.name}\n\nThis is a [cascivo](https://cascivo.com) app. When generating or editing CSS, follow\nthe **layer contract** — cascivo styles live in cascade layers, and layer order beats\nselector specificity.\n\n## CSS layer contract\n\n1. Every declaration goes inside an \\`@layer\\` block. Unlayered CSS beats all layers\n regardless of specificity — never emit it.\n2. Never invent layer names. Write only: your app slot \\`cascivo.example\\` (declared in\n the order statement in \\`index.html\\`) for page styles, and\n \\`@layer cascivo.override { … }\\` for hotfixes / one-off overrides — it beats\n everything cascivo ships.\n3. Never nest layers deeper than the shipped \\`cascivo.blocks.<name>\\` pattern. For\n sub-elements, use native CSS nesting inside one layer block, not new sublayers.\n4. Third-party CSS: \\`@import url('lib/styles.css') layer(vendor);\\` with \\`vendor\\`\n declared before the cascivo layers. Don't import vendor CSS from JavaScript — route it\n through a CSS file, or use \\`@cascivo/vite-plugin\\` (\\`cascivoLayers\\`) to layer it.\n5. Style with \\`--cascivo-*\\` tokens, not raw values.\n\nThis app's declared layer order (in \\`index.html\\`):\n\n\\`\\`\\`css\n@layer vendor, cascivo.reset, cascivo.base, cascivo.tokens, cascivo.component,\n cascivo.platform, cascivo.theme, cascivo.blocks, cascivo.example, cascivo.override;\n\\`\\`\\`\n\n### Worked example — nesting, not new layers\n\n\\`\\`\\`css\n@layer cascivo.override {\n .projectCard {\n /* Sub-elements nest inside the one block — no cascivo.card.status sublayer. */\n .statusBadge {\n color: var(--cascivo-color-text-subtle);\n .pulseDot {\n background: var(--cascivo-color-success);\n }\n }\n }\n}\n\\`\\`\\`\n\n## Routing\n\nIf you add a router, keep \\`src/Shell.tsx\\` and delete \\`src/App.tsx\\` + \\`src/sections/\\`.\n\ncascivo links come in **two kinds**, wired two different ways. Do not intercept\n\\`onClick\\`, and do not hand-wrap nav items:\n\n1. **Config-driven navs** (\\`SideNav\\`, \\`ShellHeader\\`, \\`Breadcrumb\\`, \\`Switcher\\`) render\n through a module singleton. Register your router's Link once, in \\`src/main.tsx\\`:\n \\`setLinkComponent(({ href, ...rest }: LinkComponentProps) => <Link to={href ?? '#'} {...rest} />)\\`\n2. **Links in page content** use \\`asChild\\`:\n \\`<Link asChild><RouterLink to=\"/x\">x</RouterLink></Link>\\`\n\nFull recipe: https://cascivo.com/docs/using-with-a-router.md\n\n## Types\n\nThe vocabulary types are on a subpath: \\`import type { Tone } from '@cascivo/react/types'\\`\n(also \\`Progress\\`, \\`SpaceStep\\`). \\`Status.status\\` and \\`Badge.variant\\` use them, so a\n\\`Record<MyState, Tone>\\` is the supported way to map domain states onto tones. **Never**\nadd \\`@cascivo/core\\` to this app's dependencies — it is transitive here.\n\nMore: cascivo's machine-readable guide is at https://cascivo.com/llms.txt.\n`\n}\n\n/** Build the full set of files for a new cascivo app. Pure — no filesystem I/O. */\nexport function buildScaffold(opts: ScaffoldOptions): ScaffoldFile[] {\n const sections = resolveSections(opts.sections)\n return [\n { path: 'package.json', contents: packageJson(opts) },\n { path: 'tsconfig.json', contents: tsconfig() },\n { path: 'vite.config.ts', contents: viteConfig() },\n { path: 'index.html', contents: indexHtml(opts) },\n // No `cascivo.config.ts`. It configures where `cascivo add` copies source, which a\n // prebuilt-path app never does — and its presence was how `doctor` decided a project\n // was copy-paste, so the scaffolder's own output failed `doctor --ci` and was told to\n // install the two packages the docs forbid. `cascivo add` writes the config itself the\n // first time it is used.\n { path: 'eslint.config.js', contents: eslintConfig() },\n { path: '.prettierrc', contents: prettierrc() },\n { path: '.prettierignore', contents: prettierIgnore() },\n { path: '.gitignore', contents: gitignore() },\n { path: 'README.md', contents: readme(opts) },\n { path: 'AGENTS.md', contents: agentsMd(opts) },\n { path: 'src/main.tsx', contents: mainTsx() },\n { path: 'src/vite-env.d.ts', contents: viteEnv() },\n { path: 'src/App.tsx', contents: appTsx(sections) },\n { path: 'src/Shell.tsx', contents: shellTsx(opts) },\n ...sections.map((s) => ({\n path: `src/sections/${s.component}.tsx`,\n contents: sectionTsx(s),\n })),\n ]\n}\n\nconst DEFAULT_SECTIONS = ['Dashboard', 'Reports', 'Settings']\n\nexport async function create(args: string[], cwd: string = process.cwd()): Promise<void> {\n const yes = args.includes('--yes') || args.includes('-y')\n // Skip flag values (e.g. `bun` in `--pm bun`) so the project name is the first\n // real positional, not a flag's argument.\n const nameArg = positionalArgs(args, [\n 'pm',\n 'package-manager',\n 'theme',\n 'sections',\n 'template',\n ])[0]\n const themeArg = flagValue(args, 'theme')\n const sectionsArg = flagValue(args, 'sections')\n\n const pmFlag = resolvePackageManagerFlag(args)\n if ('error' in pmFlag) {\n console.error(pmFlag.error)\n process.exitCode = 1\n return\n }\n // The new project has no lock file of its own, but the directory it lands IN usually does\n // — scaffolding into an existing workspace is the common case. `preferLockfileOverUserAgent`\n // makes that walk-up outrank `npm_config_user_agent`, which `npx` always reports as npm no\n // matter what the surrounding repo uses (2026-08-14 §11). With no lock file anywhere up the\n // tree, detection still falls back to the launcher.\n const pm = detectPackageManager(cwd, {\n preferLockfileOverUserAgent: true,\n ...(pmFlag.pm ? { override: pmFlag.pm } : {}),\n })\n\n const interactive = !yes && stdin.isTTY\n const rl = interactive ? createInterface({ input: stdin, output: stdout }) : null\n\n try {\n let name = nameArg\n if (!name && rl) {\n name = (await rl.question('Project name? [my-cascivo-app]: ')).trim()\n }\n name = name || 'my-cascivo-app'\n\n let theme = (themeArg ?? '').toLowerCase()\n if (!(THEMES as readonly string[]).includes(theme) && rl) {\n theme = (await rl.question(`Theme? (${THEMES.join('/')}) [light]: `)).trim().toLowerCase()\n }\n const resolvedTheme: ThemeName = (THEMES as readonly string[]).includes(theme)\n ? (theme as ThemeName)\n : 'light'\n\n let sectionsInput = sectionsArg\n if (!sectionsInput && rl) {\n sectionsInput = (\n await rl.question(`Nav sections? (comma-separated) [${DEFAULT_SECTIONS.join(', ')}]: `)\n ).trim()\n }\n const sections = (sectionsInput ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n\n const opts: ScaffoldOptions = {\n name,\n theme: resolvedTheme,\n sections: sections.length > 0 ? sections : DEFAULT_SECTIONS,\n pm,\n }\n\n const targetDir = join(cwd, name)\n if (existsSync(targetDir) && readdirSync(targetDir).length > 0) {\n console.error(`Target directory \"${name}\" already exists and is not empty.`)\n process.exitCode = 1\n return\n }\n\n const files = buildScaffold(opts)\n for (const file of files) {\n await writeFileSafe(join(targetDir, file.path), file.contents)\n }\n\n console.log(`\\nCreated ${name} with the ${resolvedTheme} theme (${files.length} files).`)\n\n const templateSpec = flagValue(args, 'template')\n if (templateSpec) {\n const { add } = await import('./add.js')\n const { loadConfig } = await import('../utils/config.js')\n console.log(`\\nInstalling template \"${templateSpec}\"…`)\n await add([templateSpec], await loadConfig(), { cwd: targetDir, pm })\n }\n\n console.log('\\nNext steps:')\n console.log(` cd ${name}`)\n console.log(` ${installAllCommand(pm)}`)\n console.log(` ${runScriptCommand(pm, 'dev')}`)\n // Two things the output used to leave the adopter to discover (2026-08-14 §11, §1).\n console.log('\\nGood to know:')\n console.log(' No cascivo.config.ts is written — this app uses the prebuilt @cascivo/react')\n console.log(' packages and never copies source. `cascivo add <component>` writes the')\n console.log(' config itself the first time you vendor a component.')\n console.log('\\n Adding a router? Keep src/Shell.tsx, delete src/App.tsx + src/sections/,')\n console.log(' and register your Link once with setLinkComponent — see')\n console.log(' https://cascivo.com/docs/using-with-a-router.md')\n } finally {\n rl?.close()\n }\n}\n","import { readFileSync, readdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { detectPackageManager, installHint } from '../utils/config.js'\nimport { readInstalledPackageVersion } from '../utils/peer-versions.js'\nimport { compareVersions } from '../utils/semver.js'\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\n/** Runtime packages **copied** cascivo source needs; the last is @cascivo/core's peer. */\nconst REQUIRED_RUNTIME_DEPS = [\n '@cascivo/core',\n '@cascivo/tokens',\n '@cascivo/themes',\n '@preact/signals-react',\n]\n\n/** Runtime packages a **prebuilt** (Path B) app needs. */\nconst REQUIRED_PREBUILT_DEPS = ['@cascivo/react', '@cascivo/themes', '@preact/signals-react']\n\n/**\n * Packages a prebuilt app must NOT declare directly, with the rule each one breaks. They\n * are transitive there, and everything they export is re-exported from `@cascivo/react`.\n */\nconst FORBIDDEN_PREBUILT_DEPS: Record<string, string> = {\n '@cascivo/core':\n 'AI-RULES.md: never add @cascivo/core to a prebuilt-path app — it is transitive, and everything is re-exported from @cascivo/react',\n '@cascivo/tokens':\n 'GETTING-STARTED.md: @cascivo/tokens comes with @cascivo/themes as a direct dependency — never install it by hand',\n}\n\n/** Installed on demand by `cascivo add` when a component/chart declares them. */\nconst ON_DEMAND_DEPS = ['@cascivo/i18n', '@cascivo/charts']\n\nexport interface DependencyFinding {\n package: string\n /** true = a runtime dep whose absence breaks the build; false = advisory. */\n required: boolean\n hint: string\n /**\n * What is wrong. `'missing'` (the default) means install it; `'forbidden'` means the\n * project declares a package its install path must not. They need opposite advice, and\n * reporting both under the \"not in package.json — install it\" template produced a\n * self-contradicting message.\n */\n kind?: 'missing' | 'forbidden'\n}\n\nconst CONFIG_FILES = ['cascivo.config.ts', 'cascivo.config.js', 'cascivo.config.mjs']\n\n/**\n * How this project consumes cascivo.\n *\n * - `prebuilt` — Path B: depends on `@cascivo/react`, no copied source.\n * - `copied` — Path A: has vendored component source (or no `@cascivo/react`).\n * - `hybrid` — both: consumes the package AND copied something.\n * - `unknown` — no evidence either way; emit no dependency advice at all.\n */\nexport type InstallPath = 'prebuilt' | 'copied' | 'hybrid' | 'unknown'\n\n/**\n * Infer the install path from evidence.\n *\n * This used to be `isAdopterProject()` — \"does a `cascivo.config.*` exist?\" — and\n * `cascivo create` wrote that config into every scaffold, including prebuilt-path ones. So\n * every scaffolded app was judged copy-paste and told to install `@cascivo/core` and\n * `@cascivo/tokens`, which the docs explicitly forbid on that path. `doctor --ci` exited 1\n * on a correctly-installed app, which made the CI gate the docs recommend\n * (`cascivo doctor --ci && cascivo audit --ai src`) red on day one.\n *\n * A config file now only contributes evidence when it points at a directory that actually\n * contains copied source, which is what it was ever meant to signal.\n */\nexport function detectInstallPath(cwd: string): InstallPath {\n let deps: Record<string, unknown> = {}\n let hasPackageJson = true\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n hasPackageJson = false\n }\n\n if (!hasPackageJson) return 'unknown'\n\n const usesPackage = deps['@cascivo/react'] !== undefined\n const copied = hasCopiedSource(cwd)\n\n if (usesPackage && copied) return 'hybrid'\n if (usesPackage) return 'prebuilt'\n if (copied) return 'copied'\n // No package dependency and no copied source yet. A config file alone is NOT evidence of\n // a copy-paste app — it is what `cascivo add` writes before anything has been copied, and\n // treating it as proof is precisely what broke prebuilt-path projects. Advise on nothing.\n return 'unknown'\n}\n\n/** Whether the configured output directory holds vendored component source. */\nfunction hasCopiedSource(cwd: string): boolean {\n for (const dir of outputDirCandidates(cwd)) {\n const full = join(cwd, dir)\n if (!existsSync(full)) continue\n try {\n if (readdirSync(full).some((f) => f.endsWith('.tsx'))) return true\n } catch {\n // unreadable directory — no evidence, keep looking\n }\n }\n return false\n}\n\n/** `outputDir` from the config if it declares one, plus the documented default. */\nfunction outputDirCandidates(cwd: string): string[] {\n const dirs = new Set<string>(['src/components/ui'])\n for (const file of CONFIG_FILES) {\n const full = join(cwd, file)\n if (!existsSync(full)) continue\n try {\n const declared = /outputDir\\s*:\\s*['\"]([^'\"]+)['\"]/.exec(readFileSync(full, 'utf8'))?.[1]\n if (declared !== undefined) dirs.add(declared)\n } catch {\n // unreadable config — fall back to the default candidate\n }\n }\n return [...dirs]\n}\n\n/** Whether cwd looks like a cascivo adopter project (has a generated config). */\nexport function isAdopterProject(cwd: string): boolean {\n return CONFIG_FILES.some((f) => existsSync(join(cwd, f)))\n}\n\n/**\n * Check that the runtime dependencies this project's install path needs are declared in its\n * package.json — and, on the prebuilt path, that it declares none it must not.\n *\n * Turns the opaque \"cannot find module '@preact/signals-react'\" build failure into a\n * diagnosed condition with a fix. What it demands depends on `detectInstallPath`: requiring\n * `@cascivo/core` of a prebuilt app is not merely unhelpful, it is the opposite of what the\n * docs say, and following the advice makes a correct project wrong.\n *\n * `@cascivo/i18n`/`@cascivo/charts` stay advisory since not every project uses them, and an\n * `unknown` path emits nothing at all rather than guessing.\n */\nexport function checkProjectDependencies(cwd: string): DependencyFinding[] {\n let deps: Record<string, unknown> = {}\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n return [] // No readable package.json — nothing reliable to advise on.\n }\n const path = detectInstallPath(cwd)\n if (path === 'unknown') return []\n\n const pm = detectPackageManager(cwd)\n const findings: DependencyFinding[] = []\n\n const required = path === 'prebuilt' ? REQUIRED_PREBUILT_DEPS : REQUIRED_RUNTIME_DEPS\n for (const pkg of required) {\n if (deps[pkg] === undefined) {\n findings.push({\n package: pkg,\n required: true,\n hint: `detected ${path} install path — ${installHint(pm, [pkg])}`,\n })\n }\n }\n\n // Only meaningful on a pure prebuilt app. A hybrid legitimately needs `@cascivo/core`\n // for its copied source, so flagging it there would recreate the bug in mirror image.\n if (path === 'prebuilt') {\n for (const [pkg, reason] of Object.entries(FORBIDDEN_PREBUILT_DEPS)) {\n if (deps[pkg] !== undefined) {\n findings.push({ package: pkg, required: true, kind: 'forbidden', hint: reason })\n }\n }\n }\n\n for (const pkg of ON_DEMAND_DEPS) {\n if (deps[pkg] === undefined) {\n findings.push({ package: pkg, required: false, hint: installHint(pm, [pkg]) })\n }\n }\n return findings\n}\n\n/**\n * Two copies of `@cascivo/core` in one install.\n *\n * `@cascivo/react` and `@cascivo/charts` each depend on `@cascivo/core`, and the family\n * versions independently on 0.x. If their ranges do not overlap, the package manager\n * resolves a nested second copy — and because cascivo's reactivity is a module-level signal\n * registry, two copies means two registries: a signal written through one is invisible to\n * components subscribed through the other. Nothing errors. Handlers fire and the UI does\n * not move, which is the single hardest cascivo symptom to diagnose.\n *\n * Turning that into a named finding is the cheap half of the version-sprawl problem\n * (lockstep versioning is the expensive half, and is a policy decision).\n */\nexport interface DuplicateCoreFinding {\n /** Version at the install root, if any. */\n root: string | null\n /** Nested copies, as `<owner> → <version>`. */\n nested: string[]\n hint: string\n}\n\n/** Packages that carry their own `@cascivo/core` dependency. */\nconst CORE_DEPENDENTS = ['@cascivo/react', '@cascivo/charts', '@cascivo/flow', '@cascivo/editor']\n\nexport async function checkDuplicateCore(cwd: string): Promise<DuplicateCoreFinding | null> {\n const root = await readInstalledPackageVersion(cwd, '@cascivo/core')\n const nested: string[] = []\n for (const owner of CORE_DEPENDENTS) {\n const ownerRoot = join(cwd, 'node_modules', owner)\n if (!existsSync(ownerRoot)) continue\n const version = await readInstalledPackageVersion(ownerRoot, '@cascivo/core')\n // A nested copy only matters when it differs from the hoisted one.\n if (version !== null && version !== root) nested.push(`${owner} → ${version}`)\n }\n if (nested.length === 0) return null\n return {\n root,\n nested,\n hint:\n 'Align the @cascivo/* versions (they are released together — see breaking-changes.json) ' +\n 'and reinstall. Two copies of @cascivo/core means two signal registries: writes through ' +\n 'one are invisible to components subscribed through the other, with no error.',\n }\n}\n\nexport interface SignalsCompatFinding {\n /** 'error' = a runtime break (React 19 + signals <3); 'warning' = works but upgrade advised. */\n severity: 'error' | 'warning'\n detail: string\n hint: string\n}\n\n/**\n * Checks the installed `@preact/signals-react` against the installed React.\n * React 19 removed the `__SECRET_INTERNALS…` export that signals-react 2.x\n * imports, so a 2.x runtime on React 19 dies with a `SyntaxError` at module\n * evaluation (the 2026-07-20 report's blocker #2). cascivo peer-depends on\n * `>=3.0.0`, but a lockfile carried over from an earlier install can still pin\n * 2.x — this turns that into a diagnosed condition with a fix. Returns null when\n * either package is absent/unreadable (nothing reliable to advise on) or the\n * pairing is fine.\n */\nexport async function checkSignalsCompat(cwd: string): Promise<SignalsCompatFinding | null> {\n const [signals, react] = await Promise.all([\n readInstalledPackageVersion(cwd, '@preact/signals-react'),\n readInstalledPackageVersion(cwd, 'react'),\n ])\n if (signals === null) return null\n let signalsBelow3: boolean\n try {\n signalsBelow3 = compareVersions(signals, '3.0.0') < 0\n } catch {\n return null // unparsable installed signals version — don't advise on it\n }\n if (!signalsBelow3) return null\n const pm = detectPackageManager(cwd)\n const hint = installHint(pm, ['@preact/signals-react@^3'])\n let reactMajor: number | null = null\n if (react !== null) {\n const m = /^(\\d+)\\./.exec(react.trim())\n reactMajor = m ? Number(m[1]) : null\n }\n if (reactMajor !== null && reactMajor >= 19) {\n return {\n severity: 'error',\n detail: `@preact/signals-react ${signals} cannot run on React ${react} — React 19 removed an internal signals 2.x imports, so it fails at module load. Upgrade to signals-react 3.x.`,\n hint,\n }\n }\n return {\n severity: 'warning',\n detail: `@preact/signals-react ${signals} is below the required 3.x floor. It works on React 18 today but breaks the moment you move to React 19; upgrade now.`,\n hint,\n }\n}\n\n/** Vite SSR frameworks whose default setup needs `ssr.noExternal` for cascivo. */\nconst VITE_SSR_MARKERS = ['@tanstack/react-start', 'vite-ssr', '@remix-run/dev']\nconst VITE_CONFIG_FILES = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs', 'vite.config.mts']\n\n/**\n * Advisory: on a Vite SSR framework, cascivo's per-component `.css` side-effect\n * imports crash a bare server-side ESM loader unless the packages are marked\n * `ssr.noExternal` (or the `cascivoSsr()` plugin is used). This warns when a known\n * Vite SSR framework is present but no vite config mentions either — the exact\n * cliff the 2026-07-20 report hit (blocker #1). A text match, not a gate. Returns\n * null when there's no Vite SSR framework or the config already handles it.\n */\n/**\n * Warn when the vendored components dir is not excluded from the project's formatter.\n *\n * Owning the code means your formatter rewrites it, and `cascivo update` then reports drift\n * on files you never edited. `cascivo init` writes the exclusion for you, but a project that\n * adopted cascivo before that existed — or that added Prettier afterwards — never got it.\n */\nexport function checkFormatterIgnore(cwd: string, outputDir: string): string | null {\n const pairs = [\n {\n configs: ['.prettierrc', '.prettierrc.json', '.prettierrc.js', 'prettier.config.js'],\n ignore: '.prettierignore',\n },\n { configs: ['.oxfmtrc', '.oxfmtrc.json'], ignore: '.oxfmtignore' },\n ]\n const dir = outputDir.replace(/\\/+$/, '')\n for (const { configs, ignore } of pairs) {\n if (!configs.some((f) => existsSync(join(cwd, f)))) continue\n let content = ''\n try {\n content = readFileSync(join(cwd, ignore), 'utf8')\n } catch {\n /* no ignore file at all */\n }\n if (content.split('\\n').some((l) => l.trim().replace(/\\/+$/, '') === dir)) continue\n return (\n `\"${dir}/\" is not excluded from your formatter. Running it will rewrite code you own, ` +\n `and \\`cascivo update\\` will then report drift on files you never edited. ` +\n `Add \"${dir}/\" to ${ignore}.`\n )\n }\n return null\n}\n\nexport function checkSsrConfig(cwd: string): string | null {\n let deps: Record<string, unknown> = {}\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n return null\n }\n const framework = VITE_SSR_MARKERS.find((m) => deps[m] !== undefined)\n if (framework === undefined) return null\n\n for (const file of VITE_CONFIG_FILES) {\n const path = join(cwd, file)\n if (!existsSync(path)) continue\n const config = readFileSync(path, 'utf8')\n // Either the manual noExternal entry or the cascivoSsr() plugin counts.\n if (/noExternal/.test(config) && /@cascivo/.test(config)) return null\n if (/cascivoSsr/.test(config)) return null\n }\n return (\n `${framework} is a Vite SSR framework, but no vite config marks the cascivo ` +\n `packages ssr.noExternal — an unconfigured SSR build crashes with ` +\n `\\`Unknown file extension \".css\"\\`. Add \\`ssr: { noExternal: [/^@cascivo\\\\//] }\\` ` +\n `(or the cascivoSsr() plugin from @cascivo/vite-plugin). ` +\n `Recipe: https://cascivo.com/docs/using-with-vite-ssr.md`\n )\n}\n\nconst BANNED_HOOKS = ['useState', 'useEffect', 'useLayoutEffect', 'useContext', 'useReducer']\n\n/**\n * Blank out comments and string/template-literal contents so identifier scans\n * only match real code. A mention of `useEffect` in a comment must not trip\n * the no-react-hooks rule. Single pass — a `//` inside a string (URLs) is not\n * treated as a comment.\n */\nexport function stripCommentsAndStrings(source: string): string {\n let out = ''\n let i = 0\n const n = source.length\n while (i < n) {\n const c = source[i]!\n const next = source[i + 1]\n if (c === '/' && next === '/') {\n while (i < n && source[i] !== '\\n') i++\n } else if (c === '/' && next === '*') {\n i += 2\n while (i < n && !(source[i] === '*' && source[i + 1] === '/')) i++\n i += 2\n } else if (c === \"'\" || c === '\"') {\n i++\n while (i < n && source[i] !== c) {\n if (source[i] === '\\\\') i++\n i++\n }\n i++\n out += c + c\n } else if (c === '`') {\n i++\n while (i < n && source[i] !== '`') {\n if (source[i] === '\\\\') i++\n i++\n }\n i++\n out += '``'\n } else {\n out += c\n i++\n }\n }\n return out\n}\n\nexport async function runDoctor(root: string): Promise<DoctorResult> {\n const violations: DoctorViolation[] = []\n const componentsDir = join(root, 'packages', 'components', 'src')\n if (!existsSync(componentsDir)) return { violations: [], passed: true }\n\n const components = readdirSync(componentsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n\n const reactIndex = join(root, 'packages', 'react', 'src', 'index.ts')\n const indexContent = existsSync(reactIndex) ? readFileSync(reactIndex, 'utf8') : ''\n\n for (const name of components) {\n const tsxPath = join(componentsDir, name, `${name}.tsx`)\n if (!existsSync(tsxPath)) continue\n const content = readFileSync(tsxPath, 'utf8')\n // Hook scan runs on code only; the aria-label scan below needs the\n // original source because it matches inside JSX string attributes.\n const code = stripCommentsAndStrings(content)\n\n for (const hook of BANNED_HOOKS) {\n if (new RegExp(`\\\\b${hook}\\\\b`).test(code)) {\n violations.push({\n file: tsxPath,\n rule: 'no-react-hooks',\n detail: `Banned hook '${hook}' in ${name}.tsx`,\n })\n }\n }\n\n if (/aria-label=\"[A-Z]/.test(content)) {\n violations.push({\n file: tsxPath,\n rule: 'no-hardcoded-strings',\n detail: `Hardcoded aria-label in ${name}.tsx — use t(builtin.*)`,\n })\n }\n\n if (!new RegExp(`from.*components/src/${name}`).test(indexContent)) {\n violations.push({\n file: tsxPath,\n rule: 'missing-react-export',\n detail: `${name} not exported from @cascivo/react`,\n })\n }\n }\n\n return { violations, passed: violations.length === 0 }\n}\n","import { writeFileSync } from 'node:fs'\nimport { basename, dirname, join } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\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 state?: Record<string, string | number | boolean | null>\n view: {\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\n/** A JS literal for a state initial value. */\nfunction serializeInitial(value: string | number | boolean | null): string {\n return typeof value === 'string' ? `'${value.replace(/'/g, \"\\\\'\")}'` : String(value)\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 if (ref.startsWith('$state.')) {\n propParts.push(`${k}={${ref.slice('$state.'.length)}.value}`)\n } else {\n propParts.push(`${k}={data.${ref.replace(/^\\$data\\./, '')}}`)\n }\n }\n }\n\n if (node.events) {\n for (const [k, ref] of Object.entries(node.events)) {\n if (ref.startsWith('$state.set.')) {\n const key = ref.slice('$state.set.'.length)\n propParts.push(`${k}={(e) => (${key}.value = coerceValue(e))}`)\n } else if (ref.startsWith('$state.toggle.')) {\n const key = ref.slice('$state.toggle.'.length)\n propParts.push(`${k}={() => (${key}.value = !${key}.value)}`)\n } else {\n propParts.push(`${k}={actions.${ref.replace(/^\\$actions\\./, '')}}`)\n }\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 if (ref.startsWith('$state.')) continue // view-local state, not a host-data prop\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 if (ref.startsWith('$state.')) continue // state writer, not a host action\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\n/** True if any node writes state via \"$state.set.*\" (needs the coerceValue helper). */\nfunction usesStateSetter(nodes: ComponentNode[]): boolean {\n const walk = (node: ComponentNode): boolean => {\n if (node.events && Object.values(node.events).some((r) => r.startsWith('$state.set.'))) {\n return true\n }\n return Array.isArray(node.children) ? node.children.some(walk) : false\n }\n return nodes.some(walk)\n}\n\nexport function 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 const stateEntries = Object.entries(config.state ?? {})\n const hasState = stateEntries.length > 0\n const needsCoerce = usesStateSetter(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 const coreImport = hasState ? \"\\nimport { useSignal, useSignals } from '@cascivo/core'\" : ''\n const coerceHelper = needsCoerce\n ? `\n/** Unwrap a DOM event into the value a state setter should store. */\nfunction coerceValue(e: unknown) {\n const t = (e as { target?: { type?: string; checked?: boolean; value?: unknown } })?.target\n if (t) return t.type === 'checkbox' || t.type === 'radio' ? t.checked : t.value\n return e\n}\n`\n : ''\n const stateDecls = hasState\n ? ' useSignals()\\n' +\n stateEntries.map(([k, v]) => ` const ${k} = useSignal(${serializeInitial(v)})`).join('\\n') +\n '\\n'\n : ''\n\n return `import React from 'react'${coreImport}\n${importLines}\n${coerceHelper}\ninterface PageProps ${propsType}\n\nexport function GeneratedPage({ ${hasData ? 'data, ' : ''}${hasActions ? 'actions' : ''} }: PageProps) {\n${stateDecls} 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 are not available from the CLI registry type, so this passes an empty map.\n // (There used to be a `fetchRegistry` call here whose result was discarded — a network\n // round-trip on every `cascivo generate` that fed nothing. `noUnusedLocals` surfaced it.)\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 { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport {\n DEFAULT_CONFIG,\n detectPackageManager,\n installHint,\n THEMES,\n type ThemeName,\n} from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\nimport { flagValue, resolvePackageManagerFlag } from '../utils/args.js'\n\n/**\n * Everything an app needs to build with copied cascivo source: the runtime\n * packages plus the `@preact/signals-react` peer of `@cascivo/core` (installed\n * explicitly rather than relying on peer auto-linking, which yarn never does and\n * npm skips when its install crashes). `@cascivo/i18n`/`@cascivo/charts` are\n * added on demand by `cascivo add` when a component or chart declares them.\n */\nconst RUNTIME_DEPS = [\n '@cascivo/core',\n '@cascivo/tokens',\n '@cascivo/themes',\n '@preact/signals-react',\n]\n\n/** Dev-only: `cascivo` provides the `CascadeConfig` type the generated config imports. */\nconst DEV_DEPS = ['cascivo']\n\nasync function promptTheme(): Promise<ThemeName> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question(`Theme? (${THEMES.join('/')}) [light]: `))\n .trim()\n .toLowerCase()\n return (THEMES as readonly string[]).includes(answer) ? (answer as ThemeName) : 'light'\n } finally {\n rl.close()\n }\n}\n\nfunction configFileContents(theme: ThemeName): string {\n return `import type { CascadeConfig } from 'cascivo'\n\nconst config: CascadeConfig = {\n registry: '${DEFAULT_CONFIG.registry}',\n outputDir: '${DEFAULT_CONFIG.outputDir}',\n theme: '${theme}',\n}\n\nexport default config\n`\n}\n\nconst ESLINT_CONFIGS = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n '.eslintrc',\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n]\n\n/**\n * Copied cascivo source can trip a strict host ESLint config on stylistic rules.\n * If the project has an ESLint config, point at the scoping recipe rather than\n * editing the adopter's config for them.\n */\nfunction hintEslintIfPresent(cwd: string): void {\n if (!ESLINT_CONFIGS.some((f) => existsSync(join(cwd, f)))) return\n console.log('\\nESLint: copied cascivo source may trip a strict host config on stylistic rules.')\n console.log(' Scope them off your components dir — see docs/USING-WITH-STRICT-ESLINT.md')\n}\n\n/**\n * Write dependency entries into `package.json` so a failed install still leaves a\n * DECLARATIVE-complete project, one `install` away from working.\n *\n * The reported failure: one unrelated bad version range elsewhere in the adopter's\n * `package.json` made `pnpm add` exit non-zero. cascivo had already written\n * `cascivo.config.ts`, so the project claimed to be cascivo-configured with none of the\n * runtime present, and the printed advice (\"install them yourself\") was the same command\n * that had just failed. Recording the dependencies is the difference between \"recoverable\n * with one command\" and \"figure out what was supposed to be here\".\n *\n * Never overwrites an entry that already exists — the app's own pin wins.\n */\nfunction recordDependencies(cwd: string, packages: string[], opts: { dev: boolean }): string[] {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return []\n let pkg: Record<string, unknown>\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n } catch {\n return []\n }\n const field = opts.dev ? 'devDependencies' : 'dependencies'\n const deps = (pkg[field] ??= {}) as Record<string, string>\n const added: string[] = []\n for (const name of packages) {\n if (deps[name] !== undefined) continue\n deps[name] = 'latest'\n added.push(name)\n }\n if (added.length === 0) return []\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\n return added\n}\n\n/** Formatter ignore files, in the order a project is likely to use them. */\nconst FORMATTER_IGNORES = [\n {\n config: ['.prettierrc', '.prettierrc.json', '.prettierrc.js', 'prettier.config.js'],\n ignore: '.prettierignore',\n },\n { config: ['.oxfmtrc', '.oxfmtrc.json'], ignore: '.oxfmtignore' },\n] as const\n\n/**\n * Exclude the vendored components dir from the project's formatter.\n *\n * Owning the code means your formatter reformats it, and then `cascivo update` reports drift\n * on files you never touched. This ACTS rather than hints: the ESLint equivalent below only\n * prints a pointer, and an adopter ran `prettier --write .` before ever reading it.\n *\n * Idempotent, and never rewrites an existing line.\n */\nfunction ensureFormatterIgnore(cwd: string, outputDir: string): void {\n const line = `${outputDir.replace(/\\/+$/, '')}/`\n for (const { config, ignore } of FORMATTER_IGNORES) {\n const hasFormatter =\n config.some((f) => existsSync(join(cwd, f))) || hasPrettierKeyInPackageJson(cwd, ignore)\n if (!hasFormatter) continue\n\n const path = join(cwd, ignore)\n const current = existsSync(path) ? readFileSync(path, 'utf8') : ''\n if (current.split('\\n').some((l) => l.trim() === line)) continue\n\n const banner = '# cascivo: vendored component source — you own it, so do not reformat it\\n'\n const next =\n current === '' ? banner + line + '\\n' : `${current.replace(/\\n*$/, '\\n')}\\n${banner}${line}\\n`\n writeFileSync(path, next, 'utf8')\n console.log(\n `\\nAdded \"${line}\" to ${ignore} (so your formatter does not rewrite copied source).`,\n )\n }\n}\n\n/** `prettier` key in package.json counts as a Prettier config — only relevant to .prettierignore. */\nfunction hasPrettierKeyInPackageJson(cwd: string, ignore: string): boolean {\n if (ignore !== '.prettierignore') return false\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return false\n try {\n return 'prettier' in (JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>)\n } catch {\n return false\n }\n}\n\n/** The \"here's everything you need\" summary, printed once at the end of init. */\nfunction printDependencySummary(): void {\n console.log('\\nDependencies')\n console.log(` runtime: ${RUNTIME_DEPS.join(' ')}`)\n console.log(` dev: ${DEV_DEPS.join(' ')} (types for cascivo.config.ts)`)\n console.log(\n ' on demand: @cascivo/i18n, @cascivo/charts — added by `cascivo add` when a component or chart needs them',\n )\n}\n\nexport async function init(args: string[] = [], cwd: string = process.cwd()): Promise<void> {\n const yes = args.includes('--yes') || args.includes('-y')\n const noInstall = args.includes('--no-install')\n const themeArg = flagValue(args, 'theme')?.toLowerCase()\n\n if (themeArg !== undefined && !(THEMES as readonly string[]).includes(themeArg)) {\n console.error(`Unknown theme \"${themeArg}\". Available: ${THEMES.join(', ')}`)\n process.exitCode = 1\n return\n }\n\n const pmFlag = resolvePackageManagerFlag(args)\n if ('error' in pmFlag) {\n console.error(pmFlag.error)\n process.exitCode = 1\n return\n }\n const pm = detectPackageManager(cwd, pmFlag.pm ? { override: pmFlag.pm } : {})\n\n // Prompt only when interactive: --yes, a valid --theme, or a non-TTY stdin\n // (CI, agents, pipes) all take the default without blocking.\n const interactive = themeArg === undefined && !yes && stdin.isTTY\n const theme: ThemeName = (themeArg as ThemeName) ?? (interactive ? await promptTheme() : 'light')\n\n // Write the config before installing so a failed install can never leave a\n // half-initialized project (the report's npm-in-pnpm crash left exactly this).\n const configPath = join(cwd, 'cascivo.config.ts')\n await writeFileSafe(configPath, configFileContents(theme))\n console.log(`\\nCreated cascivo.config.ts (theme: ${theme})`)\n\n if (noInstall) {\n console.log('\\nSkipped install (--no-install). Install the dependencies yourself:')\n console.log(` ${installHint(pm, RUNTIME_DEPS)}`)\n console.log(` ${installHint(pm, DEV_DEPS, { dev: true })}`)\n } else {\n const runtimeOk = installPackages(RUNTIME_DEPS, cwd, { pm })\n const devOk = installPackages(DEV_DEPS, cwd, { pm, dev: true })\n if (!runtimeOk || !devOk) {\n // Never leave a project \"configured but not installed\". Record what it needs, say\n // plainly what state it is in, and give a command that is not the one that just failed.\n const recorded = [\n ...(runtimeOk ? [] : recordDependencies(cwd, RUNTIME_DEPS, { dev: false })),\n ...(devOk ? [] : recordDependencies(cwd, DEV_DEPS, { dev: true })),\n ]\n console.error(\n '\\nInstall failed — cascivo.config.ts was written but the packages are not installed.',\n )\n if (recorded.length > 0) {\n console.error(\n `Wrote ${recorded.length} dependency entries to package.json: ${recorded.join(', ')}`,\n )\n console.error(`Recover with:\\n ${pm} install`)\n } else {\n console.error(\n `Recover with:\\n ${installHint(pm, RUNTIME_DEPS)}\\n ${installHint(pm, DEV_DEPS, { dev: true })}`,\n )\n }\n process.exitCode = 1\n }\n }\n\n // The COMPLETE stylesheet wiring, in import order. Printing only the theme line left an\n // adopter to discover the tokens sheet by debugging a grayscale app, and the charts sheet\n // by shipping a chart whose screen-reader data table rendered visibly.\n console.log('\\nStylesheets — import these once, in this order, in your entry file:')\n console.log(\n ` import '@cascivo/tokens' // primitive tokens — every --cascivo-* value`,\n )\n console.log(\n ` import '@cascivo/themes/${theme}.css'${' '.repeat(Math.max(1, 16 - theme.length))}// the ${theme} theme's semantic values`,\n )\n console.log(\n ` // …then your component CSS (\\`cascivo add\\` writes .module.css beside each component)`,\n )\n console.log('\\nThen set the theme on your root element:')\n console.log(` <html data-theme=\"${theme}\">`)\n console.log('\\nSwitching themes at runtime? Use a bundle instead of the single theme:')\n console.log(\" import '@cascivo/themes/light-dark.css' // light + dark — the common case\")\n console.log(\" import '@cascivo/themes/all.css' // all twelve themes\")\n console.log(\" import { ThemeProvider } from '@cascivo/core'\")\n // The single most likely first-day bug, and it has no error message: a component that\n // reads `signal.value` in render never re-renders without this, so handlers fire and the\n // UI just sits there. Consumer apps run no signals transform, so it is never automatic.\n console.log('\\nIn YOUR components, when you read a signal during render:')\n console.log(\" import { useSignals } from '@cascivo/core'\")\n console.log(' function MyComponent() {')\n console.log(' useSignals() // ← first statement, or the component never re-renders')\n console.log(' return <span>{count.value}</span>')\n console.log(' }')\n console.log('\\nAdding a chart later? Charts ship as an npm package with their own stylesheet:')\n console.log(\" import '@cascivo/charts/styles.css' // `cascivo add <chart>` reminds you\")\n\n printDependencySummary()\n ensureFormatterIgnore(cwd, DEFAULT_CONFIG.outputDir)\n hintEslintIfPresent(cwd)\n\n console.log('\\nAdd components with: cascivo add <name>')\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry, type RegistryComponent } from '../utils/registry.js'\n\nexport interface ListOptions {\n installed?: boolean\n}\n\nconst TYPE_LABELS: Record<string, string> = {\n component: 'Components',\n layout: 'Layouts (copy-paste)',\n block: 'Blocks (copy-paste)',\n section: 'Sections (copy-paste)',\n chart: 'Charts (npm: @cascivo/charts)',\n flow: 'Flow (npm: @cascivo/flow)',\n editor: 'Editor (npm: @cascivo/editor)',\n}\n\n/**\n * Deprecation marker for the listing.\n *\n * Shown at DISCOVERY time on purpose. `overflow-menu` carried a `@deprecated` JSDoc in its\n * source for months, which an adopter only meets after they have already vendored the file —\n * and it pointed at an import path that cannot resolve on either install path.\n */\nexport function deprecationSuffix(c: RegistryComponent): string {\n return c.deprecated ? ` ⚠ deprecated → ${c.deprecated.replacement}` : ''\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(\n (c) => [c.name, c.category, c.description + deprecationSuffix(c)] as const,\n )\n const headers = ['Name', 'Category', 'Description'] as const\n const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)))\n\n const line = (cells: readonly string[]) =>\n cells\n .map((cell, i) => cell.padEnd(widths[i] ?? cell.length))\n .join(' ')\n .trimEnd()\n\n const sep = widths.map((w) => '-'.repeat(w)).join(' ')\n return [line(headers), sep, ...rows.map(line)].join('\\n')\n}\n\n/** Render the component list as an aligned text table, grouped by type. */\nexport function formatList(components: RegistryComponent[]): string {\n if (components.length === 0) return 'No components found.'\n\n // Determine whether any entry has an explicit type — if not, render flat.\n const hasTypes = components.some((c) => c.type !== undefined)\n if (!hasTypes) return formatGroup(components)\n\n // Group by type, preserving insertion order of first occurrence.\n const groups = new Map<string, RegistryComponent[]>()\n for (const c of components) {\n const key = c.type ?? 'component'\n if (!groups.has(key)) groups.set(key, [])\n groups.get(key)!.push(c)\n }\n\n const sections: string[] = []\n for (const [key, entries] of groups) {\n const label = TYPE_LABELS[key] ?? key\n sections.push(`${label}\\n${formatGroup(entries)}`)\n }\n return sections.join('\\n\\n')\n}\n\nexport async function list(config: CascadeConfig, options: ListOptions = {}): Promise<void> {\n const registry = await fetchRegistry(config.registry)\n let components = registry.components\n\n if (options.installed) {\n components = components.filter((c) => {\n const outputName = c.name.includes('/') ? c.name.split('/').pop()! : c.name\n return existsSync(join(process.cwd(), config.outputDir, outputName))\n })\n }\n\n console.log(formatList(components))\n console.log(\n '\\nTip: install any entry by its bare name — `cascivo add flex` resolves to ' +\n '`layout/flex`. Layout primitives (Flex, Grid, AutoGrid, Columns, Spacer, ' +\n 'Center) replace inline-style layout; see docs/cookbooks/layout-and-spacing.md.',\n )\n}\n","import { existsSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { resolve, dirname } from 'node:path'\nimport {\n buildRegistry,\n validateIndex,\n parseLegacyRegistry,\n isTemplateItem,\n validateTemplate,\n type RegistryIndex,\n} from '@cascivo/registry'\n\n/**\n * Validate every template item in an index: each must pass `validateTemplate`,\n * and any bare `registryDependencies` not present in the same index produce a\n * warning (they are expected to resolve from another registry at install time).\n * Returns `{ errors, warnings }`.\n */\nexport function validateTemplates(index: RegistryIndex): { errors: string[]; warnings: string[] } {\n const errors: string[] = []\n const warnings: string[] = []\n const localNames = new Set(index.items.map((i) => i.name))\n\n for (const item of index.items) {\n if (!isTemplateItem(item)) continue\n for (const e of validateTemplate(item)) errors.push(`template \"${item.name}\": ${e}`)\n for (const dep of item.registryDependencies ?? []) {\n const isCrossRegistry = dep.includes('/') || dep.startsWith('@') || dep.startsWith('http')\n if (!isCrossRegistry && !localNames.has(dep)) {\n warnings.push(\n `template \"${item.name}\": component \"${dep}\" is not in this index — it must resolve from another registry at install time`,\n )\n }\n }\n }\n\n return { errors, warnings }\n}\n\nexport async function registryBuild(args: string[]): Promise<void> {\n let inFile = 'cascade-registry.json'\n let outDir = 'public/r'\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--in' && args[i + 1]) {\n inFile = args[i + 1]!\n i++\n } else if (args[i] === '--out' && args[i + 1]) {\n outDir = args[i + 1]!\n i++\n }\n }\n\n const inPath = resolve(inFile)\n if (!existsSync(inPath)) {\n console.error(`cascade registry build: file not found: ${inPath}`)\n process.exitCode = 1\n return\n }\n\n const raw = JSON.parse(await readFile(inPath, 'utf8')) as unknown\n const indexBase = dirname(inPath)\n void indexBase\n\n let index = (() => {\n if (\n typeof raw === 'object' &&\n raw !== null &&\n (raw as Record<string, unknown>)['schemaVersion'] === 2\n ) {\n return raw\n }\n return parseLegacyRegistry(raw)\n })()\n\n const result = validateIndex(index)\n if (result.warnings.length > 0) {\n for (const w of result.warnings) console.warn(`warn: ${w}`)\n }\n if (!result.ok) {\n for (const e of result.errors) console.error(`error: ${e}`)\n process.exitCode = 1\n return\n }\n\n const templateResult = validateTemplates(index as RegistryIndex)\n for (const w of templateResult.warnings) console.warn(`warn: ${w}`)\n if (templateResult.errors.length > 0) {\n for (const e of templateResult.errors) console.error(`error: ${e}`)\n process.exitCode = 1\n return\n }\n\n const outPath = resolve(outDir)\n await buildRegistry(index as Parameters<typeof buildRegistry>[0], outPath)\n console.log(`cascade registry build: wrote static output to ${outPath}`)\n}\n","import type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry } from '../utils/registry.js'\nimport { fetchJson } from '../utils/http.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\ninterface SearchResult {\n name: string\n version: string\n description: string\n registry?: string\n}\n\nfunction matchesQuery(item: RegistryItem, query: string): boolean {\n const q = query.toLowerCase()\n return (\n item.name.toLowerCase().includes(q) ||\n item.description.toLowerCase().includes(q) ||\n item.tags.some((t) => t.toLowerCase().includes(q))\n )\n}\n\nexport async function search(args: string[], config: CascadeConfig): Promise<void> {\n const nsFlag = args.indexOf('--registry')\n const registryFilter = nsFlag !== -1 ? args[nsFlag + 1] : undefined\n const queryParts = args.filter((a, i) => a !== '--registry' && args[i - 1] !== '--registry')\n const query = queryParts.join(' ').trim()\n\n if (!query) {\n console.error('Usage: cascivo search <query> [--registry @ns]')\n return\n }\n\n const results: SearchResult[] = []\n\n if (!registryFilter) {\n // Search default registry\n const registry = await fetchRegistry(config.registry)\n for (const c of registry.components) {\n const item = c as unknown as RegistryItem\n if (matchesQuery(item, query)) {\n results.push({ name: c.name, version: c.version, description: c.description })\n }\n }\n }\n\n // Search configured namespace registries\n const registries = config.registries ?? {}\n for (const [ns, nsCfg] of Object.entries(registries)) {\n if (registryFilter && ns !== registryFilter) continue\n try {\n const template = typeof nsCfg === 'string' ? nsCfg : nsCfg.url\n const indexUrl = template.replace(/{name}[^$]*$/, '').replace(/\\/$/, '') + '/registry.json'\n const raw = (await fetchJson(indexUrl)) as { items?: RegistryItem[] }\n for (const item of raw.items ?? []) {\n if (matchesQuery(item, query)) {\n results.push({\n name: `${ns}/${item.name}`,\n version: item.version,\n description: item.description,\n registry: ns,\n })\n }\n }\n } catch {\n console.warn(` [warn] Could not search ${ns} registry`)\n }\n }\n\n if (results.length === 0) {\n console.log('No results found.')\n return\n }\n\n for (const r of results) {\n const reg = r.registry ? ` (${r.registry})` : ''\n console.log(`${r.name}@${r.version}${reg} — ${r.description}`)\n }\n}\n","export type FontFamily = 'system' | 'geometric' | 'humanist' | 'transitional' | 'mono'\n\nexport const RADIUS_STOPS = [0, 0.25, 0.375, 0.5, 0.75, 1.5] as const\nexport type RadiusStop = (typeof RADIUS_STOPS)[number]\n\nexport const RADIUS_LABELS: Record<RadiusStop, string> = {\n 0: 'none',\n 0.25: 'sm',\n 0.375: 'md',\n 0.5: 'lg',\n 0.75: 'xl',\n 1.5: 'pill',\n}\n\nexport type ThemeConfig = {\n baseMode: 'light' | 'dark'\n accentHue: number\n accentChroma: number\n radiusBase: RadiusStop\n fontFamily: FontFamily\n presetId: string | null\n}\n\nexport const DEFAULT_CONFIG: ThemeConfig = {\n baseMode: 'light',\n accentHue: 250,\n accentChroma: 0.2,\n radiusBase: 0.375,\n fontFamily: 'system',\n presetId: 'light',\n}\n","import { DEFAULT_CONFIG, type ThemeConfig } from './config.js'\n\n/** Encode a theme config as a URL-safe base64 string (shared by the /create URL\n * hash and the CLI `--from` handoff, so the two never drift). */\nexport function configToHash(config: ThemeConfig): string {\n const json = JSON.stringify(config)\n return btoa(json).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Decode a hash produced by {@link configToHash}. Returns null on malformed\n * input; unknown/missing fields fall back to {@link DEFAULT_CONFIG}. */\nexport function hashToConfig(hash: string): ThemeConfig | null {\n if (!hash) return null\n try {\n const base64 = hash.replace(/-/g, '+').replace(/_/g, '/')\n const json = atob(base64)\n const parsed = JSON.parse(json) as Partial<ThemeConfig>\n return {\n baseMode: parsed.baseMode === 'dark' ? 'dark' : 'light',\n accentHue: typeof parsed.accentHue === 'number' ? parsed.accentHue : DEFAULT_CONFIG.accentHue,\n accentChroma:\n typeof parsed.accentChroma === 'number' ? parsed.accentChroma : DEFAULT_CONFIG.accentChroma,\n radiusBase: (typeof parsed.radiusBase === 'number'\n ? parsed.radiusBase\n : DEFAULT_CONFIG.radiusBase) as ThemeConfig['radiusBase'],\n fontFamily: parsed.fontFamily ?? DEFAULT_CONFIG.fontFamily,\n presetId: parsed.presetId ?? null,\n }\n } catch {\n return null\n }\n}\n","import type { ThemeConfig } from './config.js'\n\nconst FONT_STACKS: Record<string, string> = {\n geometric: \"'Futura', 'Century Gothic', 'Trebuchet MS', ui-sans-serif, sans-serif\",\n humanist: \"'Gill Sans', 'Trebuchet MS', 'Calibri', ui-sans-serif, sans-serif\",\n transitional: \"'Optima', 'Candara', 'Palatino Linotype', ui-sans-serif, sans-serif\",\n mono: \"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace\",\n}\n\n// Resolved concrete values from packages/themes/src/light.css + primitives\nconst BASE_LIGHT = `\n color-scheme: light;\n --cascivo-color-background: oklch(1 0 0);\n --cascivo-color-surface: oklch(0.985 0.002 264);\n --cascivo-color-surface-2: oklch(0.967 0.003 264);\n --cascivo-color-bg: var(--cascivo-color-background);\n --cascivo-color-bg-subtle: var(--cascivo-color-surface);\n --cascivo-color-surface-raised: var(--cascivo-color-surface);\n --cascivo-color-surface-overlay: var(--cascivo-color-background);\n --cascivo-color-border: oklch(0.928 0.006 264);\n --cascivo-color-border-strong: oklch(0.872 0.008 264);\n --cascivo-border-subtle: oklch(0.928 0.006 264);\n --cascivo-border-default: oklch(0.872 0.008 264);\n --cascivo-border-strong: oklch(0.707 0.015 264);\n --cascivo-color-foreground: oklch(0.145 0.005 264);\n --cascivo-color-foreground-muted: oklch(0.554 0.018 264);\n --cascivo-color-text: var(--cascivo-color-foreground);\n --cascivo-color-text-subtle: oklch(0.446 0.018 264);\n --cascivo-color-text-muted: oklch(0.707 0.015 264);\n --cascivo-color-text-on-accent: oklch(1 0 0);\n --cascivo-color-text-on-destructive: oklch(1 0 0);\n --cascivo-color-primary: oklch(0.205 0 0);\n --cascivo-color-primary-fg: oklch(0.985 0 0);\n --cascivo-color-primary-hover: oklch(0.27 0 0);\n --cascivo-color-primary-active: oklch(0.32 0 0);\n --cascivo-color-active-bg: oklch(0.145 0.005 264 / 6%);\n --cascivo-color-destructive: oklch(0.54 0.188 22);\n --cascivo-color-destructive-hover: oklch(0.448 0.17 22);\n --cascivo-color-destructive-subtle: oklch(0.971 0.013 22);\n --cascivo-color-error: oklch(0.628 0.188 22);\n --cascivo-color-warning: oklch(0.768 0.145 75);\n --cascivo-color-success: oklch(0.648 0.15 145);\n --cascivo-color-success-subtle: oklch(0.982 0.018 145);\n --cascivo-color-warning-subtle: oklch(0.98 0.02 75);\n --cascivo-color-info: oklch(0.546 0.224 250);\n --cascivo-color-info-subtle: oklch(0.97 0.025 250);\n --cascivo-color-success-foreground: oklch(0.45 0.14 145);\n --cascivo-color-warning-foreground: oklch(0.5 0.14 75);\n --cascivo-shadow-xs: 0 1px 2px oklch(0 0 0 / 0.05);\n --cascivo-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.07), 0 1px 2px oklch(0 0 0 / 0.04);\n --cascivo-shadow-md: 0 2px 8px oklch(0 0 0 / 0.07), 0 1px 2px oklch(0 0 0 / 0.04);\n --cascivo-shadow-overlay: 0 4px 32px oklch(0 0 0 / 0.16), 0 0 0 1px oklch(0 0 0 / 0.04);\n --cascivo-shadow-lg: var(--cascivo-shadow-overlay);\n --cascivo-ring-width: 2px;\n --cascivo-ring-offset: 0px;\n --cascivo-ring-color: color-mix(in oklch, var(--cascivo-color-accent) 55%, transparent);\n --cascivo-focus-ring: 0 0 0 var(--cascivo-ring-width) var(--cascivo-ring-color);`\n\n// Resolved concrete values from packages/themes/src/dark.css + primitives\nconst BASE_DARK = `\n color-scheme: dark;\n --cascivo-color-background: oklch(0.145 0.005 250);\n --cascivo-color-surface: oklch(0.185 0.007 250);\n --cascivo-color-surface-2: oklch(0.22 0.008 250);\n --cascivo-color-bg: var(--cascivo-color-background);\n --cascivo-color-bg-subtle: var(--cascivo-color-surface);\n --cascivo-color-surface-raised: var(--cascivo-color-surface-2);\n --cascivo-color-surface-overlay: var(--cascivo-color-surface);\n --cascivo-color-border: oklch(1 0 0 / 10%);\n --cascivo-color-border-strong: oklch(1 0 0 / 16%);\n --cascivo-border-subtle: oklch(1 0 0 / 0.06);\n --cascivo-border-default: oklch(1 0 0 / 0.1);\n --cascivo-border-strong: oklch(1 0 0 / 0.2);\n --cascivo-color-foreground: oklch(0.985 0.002 264);\n --cascivo-color-foreground-muted: oklch(0.707 0.015 264);\n --cascivo-color-text: var(--cascivo-color-foreground);\n --cascivo-color-text-subtle: oklch(0.707 0.015 264);\n --cascivo-color-text-muted: oklch(0.554 0.018 264);\n --cascivo-color-text-on-accent: oklch(0.145 0.005 250);\n --cascivo-color-text-on-destructive: oklch(1 0 0);\n --cascivo-color-primary: oklch(0.922 0 0);\n --cascivo-color-primary-fg: oklch(0.205 0 0);\n --cascivo-color-primary-hover: oklch(0.86 0 0);\n --cascivo-color-primary-active: oklch(0.8 0 0);\n --cascivo-color-active-bg: oklch(1 0 0 / 8%);\n --cascivo-color-destructive: oklch(0.72 0.16 22);\n --cascivo-color-destructive-hover: oklch(0.628 0.188 22);\n --cascivo-color-destructive-subtle: oklch(0.628 0.188 22 / 0.1);\n --cascivo-color-error: oklch(0.72 0.16 22);\n --cascivo-color-warning: oklch(0.82 0.13 75);\n --cascivo-color-success: oklch(0.72 0.13 145);\n --cascivo-color-success-subtle: oklch(0.72 0.13 145 / 0.1);\n --cascivo-color-warning-subtle: oklch(0.82 0.13 75 / 0.1);\n --cascivo-color-info: oklch(0.65 0.2 250);\n --cascivo-color-info-subtle: oklch(0.65 0.2 250 / 0.1);\n --cascivo-color-success-foreground: oklch(0.72 0.13 145);\n --cascivo-color-warning-foreground: oklch(0.82 0.13 75);\n --cascivo-shadow-xs: none;\n --cascivo-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.4);\n --cascivo-shadow-md: 0 2px 8px oklch(0 0 0 / 0.45);\n --cascivo-shadow-overlay: 0 4px 32px oklch(0 0 0 / 0.6), 0 0 0 1px oklch(1 0 0 / 0.06);\n --cascivo-shadow-lg: var(--cascivo-shadow-overlay);\n --cascivo-ring-width: 2px;\n --cascivo-ring-offset: 0px;\n --cascivo-ring-color: color-mix(in oklch, var(--cascivo-color-accent) 65%, transparent);\n --cascivo-focus-ring: 0 0 0 var(--cascivo-ring-width) var(--cascivo-ring-color);`\n\nexport interface ConfigToCSSOptions {\n /** When true, inline the full base theme token set so the block is\n * self-contained (used by the live preview). The exported theme omits these —\n * users import the base theme themselves. */\n previewMode?: boolean\n /** The `data-theme` selector value the generated tokens attach to. */\n themeName?: string\n}\n\nexport function configToCSS(config: ThemeConfig, options: ConfigToCSSOptions = {}): string {\n const { previewMode = false, themeName = 'create-custom' } = options\n const light = config.baseMode === 'light'\n const h = config.accentHue\n const c = config.accentChroma\n\n const acc = (l: number, chroma = c) => `oklch(${l} ${chroma.toFixed(3)} ${h})`\n\n const lines: string[] = [\n `/* Add to your project CSS after importing the base theme: */`,\n `/* @import '@cascivo/themes/${config.baseMode}.css'; */`,\n `/* @import './theme.css'; */`,\n ``,\n `@layer cascivo.theme {`,\n ` [data-theme=\"${themeName}\"] {`,\n ]\n\n if (previewMode) {\n lines.push(light ? BASE_LIGHT : BASE_DARK)\n lines.push(``)\n }\n\n lines.push(\n ` /* ── Accent ─────────────────────────────────── */`,\n ` --cascivo-color-accent: ${acc(light ? 0.52 : 0.65)};`,\n ` --cascivo-color-accent-foreground: ${light ? 'oklch(1 0 0)' : `oklch(0.145 0.005 ${h})`};`,\n ` --cascivo-color-accent-hover: ${acc(light ? 0.45 : 0.707)};`,\n ` --cascivo-color-accent-active: ${acc(light ? 0.373 : 0.808, Math.min(c, 0.155))};`,\n ` --cascivo-color-accent-subtle: ${acc(light ? 0.97 : 0.623, 0.025)};`,\n ` --cascivo-color-accent-muted: ${acc(light ? 0.932 : 0.623, light ? 0.055 : c * 0.2)};`,\n ``,\n ` /* ── Radius ─────────────────────────────────── */`,\n ` --cascivo-radius-base: ${config.radiusBase}rem;`,\n ` --cascivo-radius-control: var(--cascivo-radius-base);`,\n ` --cascivo-radius-surface: calc(var(--cascivo-radius-base) * 1.66);`,\n ` --cascivo-radius-indicator: calc(var(--cascivo-radius-base) / 2);`,\n ` --cascivo-radius-full: 9999px;`,\n ` --cascivo-radius-component: var(--cascivo-radius-base);`,\n ` --cascivo-radius-button: var(--cascivo-radius-base);`,\n ` --cascivo-radius-input: var(--cascivo-radius-base);`,\n ` --cascivo-radius-card: calc(var(--cascivo-radius-base) * 1.66);`,\n ` --cascivo-radius-badge: var(--cascivo-radius-full);`,\n ` --cascivo-radius-modal: calc(var(--cascivo-radius-base) * 2);`,\n )\n\n if (config.fontFamily !== 'system') {\n lines.push(``)\n lines.push(` /* ── Font ───────────────────────────────────── */`)\n lines.push(\n ` --cascivo-font-sans: ${FONT_STACKS[config.fontFamily] ?? FONT_STACKS['humanist']};`,\n )\n }\n\n lines.push(` }`)\n lines.push(`}`)\n\n return lines.join('\\n')\n}\n","import { resolve } from 'node:path'\nimport { configToCSS, hashToConfig } from '@cascivo/theme-kit'\nimport { THEMES } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nconst THEME_NAME_RE = /^[a-z][a-z0-9-]*$/\n\n/** Read a `--key value` or `--key=value` flag from an argv slice. */\nfunction flag(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\n/**\n * `cascivo theme create <name> --from <hash>` — turn a /create theme-builder\n * config (the `#hash` in the builder URL, or its \"Copy CLI command\" output) into\n * an owned `<name>.theme.css` in the project. Uses the same generator the builder\n * previews with, so the file matches the preview exactly.\n */\nasync function themeCreate(args: string[], cwd: string): Promise<void> {\n const name = args.find((a) => !a.startsWith('--'))\n const hash = flag(args, 'from')\n const dryRun = args.includes('--dry-run')\n\n if (!name || !hash) {\n console.error('Usage: cascivo theme create <name> --from <hash> [--out <path>]')\n console.error(\n 'Get <hash> from the theme builder at https://cascivo.com/create (Copy CLI command).',\n )\n return\n }\n if (!THEME_NAME_RE.test(name)) {\n console.error(`Invalid theme name \"${name}\". Use lowercase letters, digits, and dashes.`)\n return\n }\n\n const config = hashToConfig(hash)\n if (!config) {\n console.error('Could not decode --from. Copy the command again from the theme builder.')\n return\n }\n\n const css = configToCSS(config, { themeName: name })\n if (dryRun) {\n console.log(css)\n return\n }\n\n const outPath = resolve(cwd, flag(args, 'out') ?? `${name}.theme.css`)\n await writeFileSafe(outPath, css)\n\n console.log(`\\n✓ Wrote ${name}.theme.css`)\n console.log(`\\nImport the base theme and your overlay in your entry CSS:`)\n console.log(` @import '@cascivo/themes/${config.baseMode}.css';`)\n console.log(` @import './${name}.theme.css';`)\n console.log(`Then set it on a container:`)\n console.log(` <div data-theme=\"${name}\">…</div>`)\n}\n\nexport async function theme(args: string[]): Promise<void> {\n const [sub, name] = args\n\n if (sub === 'create') {\n await themeCreate(args.slice(1), process.cwd())\n return\n }\n\n if (sub !== 'add' || !name) {\n console.error(`Usage: cascivo theme add <${THEMES.join('|')}>`)\n console.error(` cascivo theme create <name> --from <hash>`)\n return\n }\n if (!(THEMES as readonly string[]).includes(name)) {\n console.error(`Unknown theme \"${name}\". Available: ${THEMES.join(', ')}`)\n return\n }\n\n installPackages(['@cascivo/themes'])\n\n console.log(`\\nImport the theme in your root CSS or entry file:`)\n console.log(` import '@cascivo/themes/${name}.css'`)\n console.log(`Then set it on a container:`)\n console.log(` <div data-theme=\"${name}\">…</div>`)\n}\n","/**\n * Minimal line-based diff (LCS) rendered in a unified-ish format. Zero deps —\n * good enough to preview what `cascade update` will change.\n */\nexport function diffLines(oldStr: string, newStr: string): string[] {\n const a = oldStr.split('\\n')\n const b = newStr.split('\\n')\n const n = a.length\n const m = b.length\n\n // LCS length table.\n const lcs: number[][] = Array.from({ length: n + 1 }, () =>\n Array.from({ length: m + 1 }, () => 0),\n )\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i]![j] =\n a[i] === b[j] ? lcs[i + 1]![j + 1]! + 1 : Math.max(lcs[i + 1]![j]!, lcs[i]![j + 1]!)\n }\n }\n\n const out: string[] = []\n let i = 0\n let j = 0\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n out.push(` ${a[i]}`)\n i++\n j++\n } else if (lcs[i + 1]![j]! >= lcs[i]![j + 1]!) {\n out.push(`- ${a[i]}`)\n i++\n } else {\n out.push(`+ ${b[j]}`)\n j++\n }\n }\n while (i < n) out.push(`- ${a[i++]}`)\n while (j < m) out.push(`+ ${b[j++]}`)\n return out\n}\n\n/** True when the two strings differ. */\nexport function hasChanges(oldStr: string, newStr: string): boolean {\n return oldStr !== newStr\n}\n","export interface MergeResult {\n text: string\n conflicts: number\n}\n\nfunction lcs(a: string[], b: string[]): number[][] {\n const m = a.length\n const n = b.length\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array.from({ length: n + 1 }, () => 0))\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i]![j] =\n a[i - 1] === b[j - 1] ? dp[i - 1]![j - 1]! + 1 : Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!)\n }\n }\n return dp\n}\n\ninterface Chunk {\n type: 'common' | 'left' | 'right'\n lines: string[]\n}\n\nfunction diff(base: string[], changed: string[]): Chunk[] {\n const dp = lcs(base, changed)\n const chunks: Chunk[] = []\n let i = base.length\n let j = changed.length\n const leftOnly: string[] = []\n const rightOnly: string[] = []\n const common: string[] = []\n\n function flush() {\n if (leftOnly.length > 0 || rightOnly.length > 0) {\n if (common.length > 0) {\n chunks.unshift({ type: 'common', lines: [...common] })\n common.length = 0\n }\n chunks.unshift({\n type: leftOnly.length > 0 ? 'left' : 'right',\n lines: leftOnly.length > 0 ? [...leftOnly] : [...rightOnly],\n })\n leftOnly.length = 0\n rightOnly.length = 0\n } else if (common.length > 0) {\n chunks.unshift({ type: 'common', lines: [...common] })\n common.length = 0\n }\n }\n\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && base[i - 1] === changed[j - 1]) {\n if (leftOnly.length > 0 || rightOnly.length > 0) flush()\n common.unshift(base[i - 1]!)\n i--\n j--\n } else if (j > 0 && (i === 0 || dp[i]![j - 1]! >= dp[i - 1]![j]!)) {\n flush()\n rightOnly.unshift(changed[j - 1]!)\n j--\n } else {\n flush()\n leftOnly.unshift(base[i - 1]!)\n i--\n }\n }\n flush()\n return chunks\n}\n\nexport function merge(base: string, local: string, upstream: string): MergeResult {\n const baseLines = base.split('\\n')\n const localLines = local.split('\\n')\n const upstreamLines = upstream.split('\\n')\n\n const localChunks = diff(baseLines, localLines)\n\n const localMap = new Map<string, string[]>()\n const upstreamMap = new Map<string, string[]>()\n\n let li = 0\n\n for (const c of localChunks) {\n if (c.type === 'left') {\n localMap.set(`del:${li}`, c.lines)\n } else if (c.type === 'right') {\n localMap.set(`ins:${li}`, c.lines)\n li += c.lines.length\n } else {\n li += c.lines.length\n }\n }\n void localMap\n void upstreamMap\n\n // Simple line-by-line three-way merge\n const result: string[] = []\n let conflicts = 0\n let bi = 0\n let lli = 0\n let uui = 0\n\n // Build index maps: base line → local and upstream lines\n // Use a simpler approach: if local == base, take upstream; if upstream == base, take local;\n // if both differ, conflict.\n const bLen = baseLines.length\n const lLen = localLines.length\n const uLen = upstreamLines.length\n\n // If local unchanged vs base, fast-forward to upstream\n if (local === base) {\n return { text: upstream, conflicts: 0 }\n }\n // If upstream unchanged vs base, keep local\n if (upstream === base) {\n return { text: local, conflicts: 0 }\n }\n // Both changed — try line-by-line\n void bi\n void lli\n void uui\n void bLen\n void lLen\n void uLen\n\n const localDiffs = diff(baseLines, localLines)\n const upstreamDiffs = diff(baseLines, upstreamLines)\n\n // Reconstruct base position aligned chunks\n let basePos = 0\n let lPos = 0\n let uPos = 0\n const localOut: { baseStart: number; baseEnd: number; lines: string[] }[] = []\n const upstreamOut: { baseStart: number; baseEnd: number; lines: string[] }[] = []\n\n for (const c of localDiffs) {\n if (c.type === 'common') {\n lPos += c.lines.length\n basePos += c.lines.length\n } else if (c.type === 'right') {\n localOut.push({ baseStart: basePos, baseEnd: basePos, lines: c.lines })\n lPos += c.lines.length\n } else {\n localOut.push({ baseStart: basePos, baseEnd: basePos + c.lines.length, lines: [] })\n basePos += c.lines.length\n }\n }\n basePos = 0\n for (const c of upstreamDiffs) {\n if (c.type === 'common') {\n uPos += c.lines.length\n basePos += c.lines.length\n } else if (c.type === 'right') {\n upstreamOut.push({ baseStart: basePos, baseEnd: basePos, lines: c.lines })\n uPos += c.lines.length\n } else {\n upstreamOut.push({ baseStart: basePos, baseEnd: basePos + c.lines.length, lines: [] })\n basePos += c.lines.length\n }\n }\n void lPos\n void uPos\n\n // Simple merge: walk base lines; apply local and upstream edits\n // When both touch the same region, emit conflict markers\n const localByBase = new Map<number, { end: number; lines: string[] }>()\n for (const e of localOut) {\n localByBase.set(e.baseStart, { end: e.baseEnd, lines: e.lines })\n }\n const upstreamByBase = new Map<number, { end: number; lines: string[] }>()\n for (const e of upstreamOut) {\n upstreamByBase.set(e.baseStart, { end: e.baseEnd, lines: e.lines })\n }\n\n let b = 0\n while (b <= baseLines.length) {\n const lEdit = localByBase.get(b)\n const uEdit = upstreamByBase.get(b)\n\n if (lEdit && uEdit) {\n const lEnd = Math.max(lEdit.end, b)\n const uEnd = Math.max(uEdit.end, b)\n const lLines = lEdit.lines\n const uLines = uEdit.lines\n if (JSON.stringify(lLines) === JSON.stringify(uLines)) {\n result.push(...lLines)\n } else {\n result.push('<<<<<<< local')\n result.push(...lLines)\n result.push('=======')\n result.push(...uLines)\n result.push('>>>>>>> upstream')\n conflicts++\n }\n b = Math.max(lEnd, uEnd, b + 1)\n } else if (lEdit) {\n result.push(...lEdit.lines)\n b = Math.max(lEdit.end, b + 1)\n } else if (uEdit) {\n result.push(...uEdit.lines)\n b = Math.max(uEdit.end, b + 1)\n } else {\n if (b < baseLines.length) result.push(baseLines[b]!)\n b++\n }\n }\n\n return { text: result.join('\\n'), conflicts }\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport { readFile } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { diffLines, hasChanges } from '../utils/diff.js'\nimport { readFileSafe, resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchRegistry, fileName, findComponent } from '../utils/registry.js'\nimport { readLock, writeLock, updateLockEntry } from '../utils/lock.js'\nimport { fetchJson, fetchTextRetry } from '../utils/http.js'\nimport { merge } from '../utils/merge.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question(`${question} (y/N): `)).trim().toLowerCase()\n return answer === 'y' || answer === 'yes'\n } finally {\n rl.close()\n }\n}\n\nexport async function update(\n name: string | undefined,\n config: CascadeConfig,\n opts: { check?: boolean; yes?: boolean } = {},\n): Promise<void> {\n if (opts.check) {\n return updateCheck(config)\n }\n\n if (!name) {\n console.error('Usage: cascivo update <component>')\n return\n }\n\n const lock = await readLock()\n const lockEntry = lock?.items[name]\n\n const registry = await fetchRegistry(config.registry)\n const entry = findComponent(registry, name)\n if (!entry) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n return\n }\n\n if (lockEntry) {\n // Three-way merge path\n const lockedVersion = lockEntry.version\n const registryBase = lockEntry.registry\n const baseItemUrl = `${registryBase}/r/${name}@${lockedVersion}.json`\n\n let baseItem: RegistryItem | null = null\n try {\n baseItem = (await fetchJson(baseItemUrl)) as RegistryItem\n } catch {\n console.warn(\n `Warning: could not fetch base version ${lockedVersion} from ${baseItemUrl}. Falling back to two-way diff.`,\n )\n }\n\n if (baseItem) {\n await threeWayUpdate(name, entry, baseItem, config, opts)\n } else {\n await twoWayUpdate(name, entry, config, opts)\n }\n } else {\n console.warn(\n `Warning: \"${name}\" has no lock entry. Falling back to two-way diff update (pre-v11 install).`,\n )\n await twoWayUpdate(name, entry, config, opts)\n }\n}\n\nasync function threeWayUpdate(\n name: string,\n upstreamEntry: ReturnType<typeof findComponent>,\n baseItem: RegistryItem,\n config: CascadeConfig,\n opts: { yes?: boolean },\n): Promise<void> {\n if (!upstreamEntry) return\n const outputName = name.includes('/') ? name.split('/').pop()! : name\n const summaries: { file: string; result: 'clean' | 'conflict' | 'unchanged' }[] = []\n const pending: { dest: string; content: string; conflicts: number }[] = []\n\n for (const url of upstreamEntry.files) {\n const fname = fileName(url)\n const baseFile = baseItem.files.find((f) => fileName(f.url) === fname)\n const dest = resolveOutputPath(config.outputDir, outputName, fname)\n\n const upstream = await fetchTextRetry(url)\n const local = existsSync(dest) ? await readFile(dest, 'utf8') : ''\n const base = baseFile ? await fetchTextRetry(baseFile.url) : ''\n\n if (base === '' && local === '') {\n summaries.push({ file: fname, result: 'clean' })\n pending.push({ dest, content: upstream, conflicts: 0 })\n continue\n }\n\n const { text, conflicts } = merge(base, local, upstream)\n\n if (conflicts > 0) {\n summaries.push({ file: fname, result: 'conflict' })\n } else if (text === local) {\n summaries.push({ file: fname, result: 'unchanged' })\n continue\n } else {\n summaries.push({ file: fname, result: 'clean' })\n }\n pending.push({ dest, content: text, conflicts })\n }\n\n if (pending.length === 0) {\n console.log(`${name} is already up to date.`)\n return\n }\n\n for (const s of summaries) {\n const icon = s.result === 'conflict' ? '⚠' : s.result === 'clean' ? '✓' : '·'\n console.log(` ${icon} ${s.file} (${s.result})`)\n }\n\n const conflicted = pending.filter((p) => p.conflicts > 0)\n const shouldApply = opts.yes\n ? conflicted.length === 0 // --yes skips items with conflicts\n : await confirm(`\\nApply ${pending.length} change(s) to ${name}?`)\n\n if (shouldApply || opts.yes) {\n const lock = await readLock()\n let updatedLock = lock\n\n for (const { dest, content, conflicts } of pending) {\n if (opts.yes && conflicts > 0) {\n console.log(` skipped (conflicts): ${dest}`)\n continue\n }\n await writeFileSafe(dest, content)\n }\n\n if (lock && updatedLock) {\n const hasConflicts = conflicted.length > 0\n updatedLock = updateLockEntry(updatedLock, name, {\n ...lock.items[name]!,\n version: upstreamEntry.version,\n ...(hasConflicts ? { conflicted: true as const } : {}),\n })\n await writeLock(updatedLock)\n }\n\n console.log(`Updated ${name}.`)\n if (conflicted.length > 0) {\n console.log(`${conflicted.length} file(s) have conflict markers — resolve them manually.`)\n }\n } else {\n console.log('Aborted. No files changed.')\n }\n}\n\nasync function twoWayUpdate(\n name: string,\n entry: ReturnType<typeof findComponent>,\n config: CascadeConfig,\n opts: { yes?: boolean },\n): Promise<void> {\n if (!entry) return\n const pending: { path: string; content: string }[] = []\n\n for (const url of entry.files) {\n let latest: string\n try {\n latest = await fetchTextRetry(url)\n } catch (e) {\n console.error(e instanceof Error ? e.message : String(e))\n return\n }\n const dest = resolveOutputPath(config.outputDir, entry.name, fileName(url))\n const current = await readFileSafe(dest)\n\n if (current === null) {\n console.log(`New file: ${dest}`)\n pending.push({ path: dest, content: latest })\n } else if (hasChanges(current, latest)) {\n console.log(`\\n--- ${dest}`)\n console.log(diffLines(current, latest).join('\\n'))\n pending.push({ path: dest, content: latest })\n }\n }\n\n if (pending.length === 0) {\n console.log(`${name} is already up to date.`)\n return\n }\n\n const shouldApply = opts.yes || (await confirm(`\\nApply ${pending.length} change(s) to ${name}?`))\n\n if (shouldApply) {\n for (const { path, content } of pending) {\n await writeFileSafe(path, content)\n }\n console.log(`Updated ${name}.`)\n } else {\n console.log('Aborted. No files changed.')\n }\n}\n\nasync function updateCheck(config: CascadeConfig): Promise<void> {\n const lock = await readLock()\n if (!lock || Object.keys(lock.items).length === 0) {\n console.log('No installed components found in cascivo.lock.')\n return\n }\n\n const registry = await fetchRegistry(config.registry)\n let outdated = 0\n\n for (const [name, entry] of Object.entries(lock.items)) {\n const current = findComponent(registry, name)\n if (!current) continue\n // Content hashes are the accurate signal (they change with every source\n // edit); the version compare is the fallback for older registries.\n if (current.fileHashes && Object.keys(current.fileHashes).length > 0) {\n const lockByBase = new Map(\n Object.entries(entry.files).map(([dest, hash]) => [dest.split('/').pop()!, hash]),\n )\n const changed = Object.entries(current.fileHashes).filter(\n ([file, hash]) => lockByBase.get(file) !== hash,\n )\n if (changed.length > 0) {\n console.log(\n `${name}: ${changed.length} file(s) changed upstream (${entry.version} → ${current.version})`,\n )\n outdated++\n }\n } else if (current.version !== entry.version) {\n console.log(`${name}: ${entry.version} → ${current.version}`)\n outdated++\n }\n }\n\n if (outdated > 0) {\n console.log(`${outdated} component(s) outdated.`)\n process.exitCode = 1\n } else {\n console.log('All components up to date.')\n }\n}\n","import type { CascadeConfig } from '../utils/config.js'\nimport { parseAddress, resolveItemUrl } from '../utils/resolve.js'\nimport { fetchJson } from '../utils/http.js'\nimport { asTemplateMeta, isTemplateItem, type RegistryItem } from '@cascivo/registry'\n\n/** Render an item's details as text. Pure, so it can be unit-tested. */\nexport function formatItem(item: RegistryItem): string {\n const lines: string[] = []\n lines.push(`\\n${item.name} v${item.version}`)\n lines.push(`Type: ${item.type}${item.category ? ` / ${item.category}` : ''}`)\n lines.push(item.description)\n if (item.author) lines.push(`Author: ${item.author}`)\n if (item.license) lines.push(`License: ${item.license}`)\n if (item.homepage) lines.push(`Homepage: ${item.homepage}`)\n\n if (item.install) {\n lines.push(`Distribution: npm package — pnpm add ${item.install}`)\n if (item.styles) lines.push(`Stylesheet: import '${item.styles}' (required)`)\n } else if (!isTemplateItem(item)) {\n lines.push(`Distribution: copy-paste — npx cascivo add ${item.name}`)\n }\n\n if (isTemplateItem(item)) {\n try {\n const meta = asTemplateMeta(item.meta)\n lines.push(`\\nTemplate: ${meta.intent}`)\n lines.push(`Framework: ${meta.framework}`)\n if (meta.demoUrl) lines.push(`Demo: ${meta.demoUrl}`)\n if (meta.pages?.length) {\n lines.push('Pages:')\n for (const p of meta.pages) lines.push(` ${p.name} → ${p.target}`)\n }\n } catch {\n // meta is malformed — base fields above are still useful.\n }\n }\n\n if (item.changelog?.length) {\n lines.push('\\nChangelog:')\n for (const c of item.changelog.slice(0, 5)) lines.push(` ${c.version}: ${c.note}`)\n }\n\n if (item.files?.length) {\n lines.push('\\nFiles:')\n for (const f of item.files) lines.push(` ${f.url}${f.target ? ` → ${f.target}` : ''}`)\n }\n\n if (item.dependencies?.length) lines.push(`\\nDependencies: ${item.dependencies.join(', ')}`)\n\n if (item.registryDependencies?.length) {\n const label = isTemplateItem(item) ? 'Components' : 'Registry dependencies'\n lines.push(`${label}: ${item.registryDependencies.join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n\nexport async function view(args: string[], config: CascadeConfig): Promise<void> {\n const spec = args[0]\n if (!spec) {\n console.error('Usage: cascivo view <component-spec>')\n return\n }\n\n const addr = parseAddress(spec)\n const { url, headers, params } = await resolveItemUrl(addr, config)\n const fetchOpts: Parameters<typeof fetchJson>[1] = {}\n if (headers) fetchOpts.headers = headers\n if (params) fetchOpts.params = params\n const item = (await fetchJson(url, fetchOpts)) as RegistryItem\n\n console.log(formatItem(item))\n}\n","import { createRequire } from 'node:module'\nimport { argv } from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { add } from './commands/add.js'\nimport { create } from './commands/create.js'\nimport { runDoctor } from './commands/doctor.js'\nimport { generate } from './commands/generate.js'\nimport { init } from './commands/init.js'\nimport { list } from './commands/list.js'\nimport { registryBuild } from './commands/registry.js'\nimport { search } from './commands/search.js'\nimport { theme } from './commands/theme.js'\nimport { update } from './commands/update.js'\nimport { view } from './commands/view.js'\nimport { loadConfig, THEMES } from './utils/config.js'\nimport { positionalArgs, resolvePackageManagerFlag } from './utils/args.js'\n\n// Read at runtime: this file lives one level below the package root both in\n// src/ (dev, tests) and in dist/ (published bundle), so ../package.json is\n// always the cascivo package manifest.\nexport const VERSION: string = (\n createRequire(import.meta.url)('../package.json') as { version: string }\n).version\n\nexport type { CascadeConfig, ThemeName } from './utils/config.js'\n\nconst HELP = `cascivo ${VERSION} — the CSS-native, signal-driven, AI-first design system\n\nUsage: cascivo <command> [options]\n\nCommands:\n create [name] Scaffold a new ready-to-run app (shell + nav + theme)\n (--template <spec>: start from a marketplace template)\n init Set up cascivo in the current project\n add <component...> Add components or a template to your project\n list [--installed] List available components\n update [component] Update installed components (--check: list outdated)\n search <query> Search components across registries\n view <spec> View a component before installing\n theme <add|create> Install a first-party theme, or build a custom one from /create\n eject <component> Eject specific tokens into a scoped local override file\n generate <config.json> Generate TSX from a ViewConfig JSON file\n doctor [--ci] Check components for rule violations\n audit --ai <paths...> Audit AI-generated code against the cascivo contract\n registry build Build a static registry from a cascivo-registry.json file\n template init <name> Scaffold a new template (source + manifest + registry entry)\n tokens import <file> Import external design tokens as cascivo overrides\n\nRun \"cascivo <command> --help\" for details.`\n\nconst THEME_LIST = THEMES.join(' | ')\n\nconst COMMAND_HELP: Record<string, string> = {\n create: `Usage: cascivo create [name] [options]\n\nScaffold a new ready-to-run app — Vite + React + TypeScript, pre-wired with the\ncascivo app shell, side navigation, header, and a theme.\n\nOptions:\n --template <spec> Start from a marketplace template (@ns/name or owner/repo/name)\n --theme <name> Theme to install (${THEME_LIST})\n --sections \"<a, b>\" Comma-separated nav section labels (one component each)\n --package-manager <pm> Package manager for README/next-steps (alias --pm; default: auto-detect)\n --yes, -y Accept defaults, never prompt`,\n init: `Usage: cascivo init [options]\n\nSet up cascivo in the current project: writes cascivo.config.ts and installs the\nruntime dependencies (@cascivo/core, @cascivo/tokens, @cascivo/themes, the\n@preact/signals-react peer) plus cascivo as a dev dependency for the config's types.\n\nOptions:\n --theme <name> Theme to configure (${THEME_LIST})\n --package-manager <pm> Force pnpm | yarn | npm | bun (alias --pm; default: auto-detect)\n --no-install Write files only; print the install commands to run yourself\n --yes, -y Accept defaults, never prompt (implied when stdin is not a TTY)`,\n add: `Usage: cascivo add <component...> [options]\n\nCopy component source (TSX + CSS module) from the registry into your project,\nresolving component dependencies. Also installs templates (@ns/name) and\nthird-party components (owner/repo/name).\n\nOptions:\n --dry-run Show what would be written without writing\n --package-manager <pm> Force pnpm | yarn | npm | bun (alias --pm; default: auto-detect)\n --no-install Don't install npm-distributed entries or deps; print the commands instead\n --yes, -y Skip confirmation prompts`,\n list: `Usage: cascivo list [options]\n\nList components available in the configured registry.\n\nOptions:\n --installed Only list components already installed in this project`,\n update: `Usage: cascivo update [component] [options]\n\nUpdate installed components to the current registry version. Without a\ncomponent argument, updates everything in the lockfile.\n\nOptions:\n --check List outdated components without writing\n --yes, -y Skip confirmation prompts`,\n search: `Usage: cascivo search <query> [options]\n\nSearch components across the configured registries.\n\nOptions:\n --registry <@ns> Restrict the search to one registry namespace`,\n view: `Usage: cascivo view <spec>\n\nPreview a component or template (files, dependencies, description) before\ninstalling. <spec> is a bare name, @ns/name, or owner/repo/name.`,\n theme: `Usage: cascivo theme add <name>\n cascivo theme create <name> --from <hash> [--out <path>]\n\nadd Install @cascivo/themes and print the import + data-theme wiring.\ncreate Turn a theme-builder config into an owned <name>.theme.css. Get <hash>\n from https://cascivo.com/create (\"Copy CLI command\"). --dry-run prints\n the CSS without writing.\n\nThemes: ${THEME_LIST}`,\n eject: `Usage: cascivo eject <component> [options]\n\nEject specific tokens into a scoped local override file so you can restyle a\ncomponent without forking it.\n\nOptions:\n --tokens <a,b> Comma-separated token names to eject (default: all)\n --scope <sel> CSS selector the overrides are scoped to\n --out <file> Output file path\n --dry-run Print the override file without writing`,\n generate: `Usage: cascivo generate <config.json> [options]\n\nGenerate TSX from a ViewConfig JSON file (see the MCP scaffold_view tool).\n\nOptions:\n --out <file> Output file (default: stdout)\n --components-dir <dir> Components import base (default: ./src/components/ui)`,\n doctor: `Usage: cascivo doctor [options]\n\nCheck components in this repo for cascivo rule violations (banned React hooks,\nhardcoded strings, missing @cascivo/react exports). In an adopter project (one\nwith a cascivo.config), also verifies the runtime dependencies copied source\nneeds — @cascivo/core, @cascivo/tokens, @cascivo/themes, and the\n@preact/signals-react peer — are declared in package.json.\n\nOptions:\n --ci Exit non-zero when violations or missing runtime deps are found\n --drift Compare installed components against the registry (copy-paste drift)`,\n audit: `Usage: cascivo audit --ai <paths...> [options]\n\nAudit AI-generated code against the cascivo contract: hard-coded values that\nshould be tokens, invented props, missing required props, raw strings where\ni18n is expected.\n\nOptions:\n --fix Rewrite unambiguous CSS literals to their token equivalents\n --json Machine-readable output\n --level <name> Minimum finding level to report (error | warn; default error)`,\n registry: `Usage: cascivo registry build [dir]\n\nBuild a static registry (registry.json + file payloads) from a\ncascivo-registry.json manifest, ready to host on any static file server.`,\n template: `Usage: cascivo template init <name> [options]\n\nScaffold a new template: source, manifest, and registry entry.\n\nOptions:\n --category <name> Template category (e.g. dashboard)\n --framework <name> Target framework (default react-vite)\n --components <a,b> Registry components the template composes\n --repo <owner/repo> Repository the template will be hosted in`,\n tokens: `Usage: cascivo tokens import <file>\n\nImport external design tokens (W3C design-tokens JSON) as cascivo token\noverrides.`,\n}\n\nexport async function run(args: string[]): Promise<void> {\n const [command, ...rest] = args\n\n // Per-command help must short-circuit BEFORE any prompt, fetch, or install:\n // \"cascivo add --help\" must never try to install a component named --help.\n if (command !== undefined && (rest.includes('--help') || rest.includes('-h'))) {\n const commandHelp = COMMAND_HELP[command]\n if (commandHelp !== undefined) {\n console.log(commandHelp)\n return\n }\n }\n\n switch (command) {\n case 'create':\n await create(rest)\n break\n case 'init':\n await init(rest)\n break\n case 'add': {\n const pmFlag = resolvePackageManagerFlag(rest)\n if ('error' in pmFlag) {\n console.error(pmFlag.error)\n process.exitCode = 1\n break\n }\n await add(positionalArgs(rest, ['pm', 'package-manager']), await loadConfig(), {\n dryRun: rest.includes('--dry-run'),\n yes: rest.includes('--yes'),\n noInstall: rest.includes('--no-install'),\n ...(pmFlag.pm ? { pm: pmFlag.pm } : {}),\n })\n break\n }\n case 'list':\n await list(await loadConfig(), { installed: rest.includes('--installed') })\n break\n case 'update':\n await update(rest.filter((r) => !r.startsWith('--'))[0], await loadConfig(), {\n check: rest.includes('--check'),\n yes: rest.includes('--yes'),\n })\n break\n case 'search':\n await search(rest, await loadConfig())\n break\n case 'view':\n await view(rest, await loadConfig())\n break\n case 'theme':\n await theme(rest)\n break\n case 'eject': {\n const { eject } = await import('./commands/eject.js')\n const flag = (key: string): string | undefined => {\n const eq = rest.find((r) => r.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = rest.indexOf(`--${key}`)\n const next = idx !== -1 ? rest[idx + 1] : undefined\n // Ignore a following token that is itself a flag (e.g. `--tokens --dry-run`).\n return next && !next.startsWith('--') ? next : undefined\n }\n const tokensArg = flag('tokens')\n await eject(rest, await loadConfig(), {\n ...(tokensArg\n ? {\n tokens: tokensArg\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n }\n : {}),\n ...(flag('scope') ? { scope: flag('scope')! } : {}),\n ...(flag('out') ? { out: flag('out')! } : {}),\n dryRun: rest.includes('--dry-run'),\n })\n break\n }\n case 'generate':\n await generate(rest, await loadConfig())\n break\n case 'registry':\n if (rest[0] === 'build') {\n await registryBuild(rest.slice(1))\n } else {\n console.error(`Unknown registry subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case 'template':\n if (rest[0] === 'init') {\n const { templateInit } = await import('./commands/template-init.js')\n await templateInit(rest.slice(1))\n } else {\n console.error(`Unknown template subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case 'doctor': {\n const ci = rest.includes('--ci')\n const drift = rest.includes('--drift')\n if (drift) {\n // `--drift` keeps its meaning: drift ONLY.\n const { runDoctorDrift } = await import('./commands/drift.js')\n await runDoctorDrift(await loadConfig())\n } else {\n const cwd = process.cwd()\n const result = await runDoctor(cwd)\n const {\n checkDuplicateCore,\n checkFormatterIgnore,\n checkProjectDependencies,\n checkSignalsCompat,\n checkSsrConfig,\n detectInstallPath,\n } = await import('./commands/doctor.js')\n // Gate on evidence of *any* cascivo install, not on a `cascivo.config.*` file. The\n // config gate mislabelled every prebuilt-path app as copy-paste (the scaffolder wrote\n // one unconditionally), and would now skip them entirely since it no longer does.\n const adopter = detectInstallPath(cwd) !== 'unknown'\n const deps = adopter ? checkProjectDependencies(cwd) : []\n const missingRequired = deps.filter((d) => d.required)\n const signalsCompat = adopter ? await checkSignalsCompat(cwd) : null\n const signalsError = signalsCompat?.severity === 'error'\n const ssrHint = adopter ? checkSsrConfig(cwd) : null\n const duplicateCore = adopter ? await checkDuplicateCore(cwd) : null\n const formatterHint = adopter\n ? checkFormatterIgnore(cwd, (await loadConfig()).outputDir)\n : null\n\n // Run the drift check as part of the DEFAULT invocation. These used to be disjoint\n // branches, so `cascivo doctor` printed \"No violations found.\" on a project where\n // `cascivo doctor --drift` reported five real issues. A clean report from a run that\n // never looked is worse than no report.\n const { runDoctorDrift } = await import('./commands/drift.js')\n const driftOutcome = adopter\n ? await runDoctorDrift(await loadConfig(), cwd)\n : { ran: false, reason: 'no cascivo install detected', issues: 0 }\n\n if (\n result.passed &&\n deps.length === 0 &&\n signalsCompat === null &&\n ssrHint === null &&\n duplicateCore === null &&\n formatterHint === null &&\n driftOutcome.issues === 0\n ) {\n // Never an unqualified \"clean\" when part of the check could not run.\n console.log(\n driftOutcome.ran\n ? 'No violations found.'\n : `No violations found (drift: not checked — ${driftOutcome.reason}).`,\n )\n } else {\n for (const v of result.violations) {\n console.error(`[${v.rule}] ${v.detail}\\n ${v.file}`)\n }\n for (const d of missingRequired) {\n // A forbidden dependency needs the opposite advice from a missing one. Sharing\n // the \"install it\" template told prebuilt-path adopters to install the very\n // packages the message was asking them to remove.\n console.error(\n d.kind === 'forbidden'\n ? `[forbidden-dependency] ${d.package} must not be a direct dependency here. Remove it — ${d.hint}`\n : `[missing-dependency] ${d.package} is not in package.json. Install: ${d.hint}`,\n )\n }\n if (signalsCompat) {\n const tag = signalsError ? 'signals-incompatible' : 'signals-outdated'\n const log = signalsError ? console.error : console.log\n log(`[${tag}] ${signalsCompat.detail} Upgrade: ${signalsCompat.hint}`)\n }\n if (ssrHint) {\n console.log(`[ssr-config] ${ssrHint}`)\n }\n if (formatterHint) {\n console.log(`[formatter-drift] ${formatterHint}`)\n }\n if (duplicateCore) {\n console.error(\n `[duplicate-core] More than one @cascivo/core is installed ` +\n `(root: ${duplicateCore.root ?? 'none'}; ${duplicateCore.nested.join('; ')}). ` +\n duplicateCore.hint,\n )\n }\n for (const d of deps.filter((x) => !x.required)) {\n console.log(\n `[optional] ${d.package} is not installed; add it when a component or chart needs it: ${d.hint}`,\n )\n }\n if (\n ci &&\n (result.violations.length > 0 ||\n missingRequired.length > 0 ||\n signalsError ||\n duplicateCore !== null ||\n driftOutcome.issues > 0)\n ) {\n process.exitCode = 1\n }\n }\n }\n break\n }\n case 'audit': {\n const { audit } = await import('./commands/audit.js')\n await audit(rest, await loadConfig())\n break\n }\n case 'tokens':\n if (rest[0] === 'import') {\n const { tokensImport } = await import('./commands/tokens.js')\n await tokensImport(rest.slice(1))\n } else {\n console.error(`Unknown tokens subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case undefined:\n case '--help':\n case '-h':\n case 'help':\n console.log(HELP)\n break\n case '--version':\n case '-v':\n console.log(VERSION)\n break\n default:\n console.error(`Unknown command: ${command}\\n`)\n console.log(HELP)\n process.exitCode = 1\n }\n}\n\nconst isMain = argv[1] !== undefined && import.meta.url === pathToFileURL(argv[1]).href\n\nif (isMain) {\n run(argv.slice(2)).catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["resolvePath","DEFAULT_CONFIG","item"],"sources":["../src/utils/exec.ts","../src/utils/resolve.ts","../src/utils/directory.ts","../src/commands/add.ts","../src/utils/args.ts","../src/generated/versions.ts","../src/commands/create.ts","../src/commands/doctor.ts","../src/commands/generate.ts","../src/commands/init.ts","../src/commands/list.ts","../src/commands/registry.ts","../src/commands/search.ts","../../theme-kit/src/config.ts","../../theme-kit/src/hash.ts","../../theme-kit/src/css.ts","../src/commands/theme.ts","../src/utils/diff.ts","../src/utils/merge.ts","../src/commands/update.ts","../src/commands/view.ts","../src/index.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process'\nimport { detectPackageManager, installCommand, installHint, type PackageManager } from './config.js'\n\n/**\n * Install npm packages using the detected (or explicitly chosen) package\n * manager, inheriting stdio so the user sees install progress. On failure it\n * prints the exact command to run by hand — the adopter can always recover even\n * when the spawn fails (e.g. npm crashing inside a pnpm workspace). Returns\n * false if the install failed.\n */\nexport function installPackages(\n packages: string[],\n cwd: string = process.cwd(),\n opts: {\n pm?: PackageManager\n dev?: boolean\n /** Registry peer floors, so a known minimum is honoured rather than silently ignored. */\n floors?: Record<string, string>\n /** `--pin <version>` escape hatch: install every `@cascivo/*` at exactly this version. */\n pin?: string\n } = {},\n): boolean {\n if (packages.length === 0) return true\n const pm = opts.pm ?? detectPackageManager(cwd)\n const [cmd, args] = installCommand(pm, packages, {\n dev: opts.dev ?? false,\n ...(opts.floors ? { floors: opts.floors } : {}),\n ...(opts.pin ? { pin: opts.pin } : {}),\n })\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 console.error(\n `Install them yourself with: ${installHint(pm, packages, { dev: opts.dev ?? false })}`,\n )\n return false\n }\n return true\n}\n","import { CASCIVO_HOST, type CascadeConfig, type RegistryNamespaceConfig } from './config.js'\nimport { fetchJson } from './http.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\nexport type AddressKind = 'bare' | 'namespace' | 'url' | 'github'\n\nexport interface ParsedAddress {\n kind: AddressKind\n namespace?: string\n name: string\n ref?: string\n raw: string\n}\n\nconst GITHUB_RE = /^([^/]+)\\/([^/]+)\\/([^#]+)(?:#(.+))?$/\n\nfunction expandEnv(str: string, env: NodeJS.ProcessEnv = process.env): string {\n return str.replace(/\\$\\{([^}]+)\\}/g, (_, key: string) => {\n const val = env[key]\n if (val === undefined) throw new Error(`Environment variable ${key} is not set`)\n return val\n })\n}\n\nexport function parseAddress(spec: string, _env: NodeJS.ProcessEnv = process.env): ParsedAddress {\n if (\n spec.startsWith('http://') ||\n spec.startsWith('https://') ||\n spec.startsWith('./') ||\n spec.startsWith('/')\n ) {\n return { kind: 'url', name: spec, raw: spec }\n }\n\n if (spec.startsWith('@')) {\n const slash = spec.indexOf('/', 1)\n if (slash === -1) throw new Error(`Invalid namespace address: ${spec} (expected @ns/name)`)\n const namespace = spec.slice(0, slash)\n const name = spec.slice(slash + 1)\n return { kind: 'namespace', namespace, name, raw: spec }\n }\n\n // GitHub: owner/repo/item[#ref] — at least 3 path segments, no leading protocol/dot\n const specWithoutRef = spec.includes('#') ? spec.slice(0, spec.indexOf('#')) : spec\n const githubMatch = GITHUB_RE.exec(spec)\n if (githubMatch && !specWithoutRef.includes('.') && specWithoutRef.split('/').length >= 3) {\n const [, owner, repo, item, ref] = githubMatch\n return {\n kind: 'github',\n name: `${owner}/${repo}/${item}`,\n ref: ref ?? 'main',\n raw: spec,\n }\n }\n\n return { kind: 'bare', name: spec, raw: spec }\n}\n\nfunction resolveNamespaceUrl(\n ns: string,\n name: string,\n nsCfg: RegistryNamespaceConfig,\n env: NodeJS.ProcessEnv,\n): string {\n const template = typeof nsCfg === 'string' ? nsCfg : nsCfg.url\n if (!template.includes('{name}')) {\n throw new Error(`Registry namespace \"${ns}\" URL template must contain {name}: ${template}`)\n }\n return expandEnv(template.replace('{name}', name), env)\n}\n\nexport async function resolveItemUrl(\n addr: ParsedAddress,\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n resolveNamespaceHook?: (ns: string) => Promise<RegistryNamespaceConfig | null>,\n): Promise<{ url: string; headers?: Record<string, string>; params?: Record<string, string> }> {\n switch (addr.kind) {\n case 'url':\n return { url: addr.name }\n\n case 'bare': {\n const base = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\n return { url: `${base}/r/${addr.name}.json` }\n }\n\n case 'github': {\n const parts = addr.name.split('/')\n const owner = parts[0]!\n const repo = parts[1]!\n const item = parts.slice(2).join('/')\n const ref = addr.ref ?? 'main'\n return {\n url: `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/r/${item}.json`,\n }\n }\n\n case 'namespace': {\n const ns = addr.namespace!\n const name = addr.name\n\n // Config-defined namespaces always win\n if (config.registries?.[ns]) {\n const nsCfg = config.registries[ns]!\n const url = resolveNamespaceUrl(ns, name, nsCfg, env)\n const headers = typeof nsCfg !== 'string' ? nsCfg.headers : undefined\n const params = typeof nsCfg !== 'string' ? nsCfg.params : undefined\n const expandedHeaders = headers\n ? Object.fromEntries(Object.entries(headers).map(([k, v]) => [k, expandEnv(v, env)]))\n : undefined\n const expandedParams = params\n ? Object.fromEntries(Object.entries(params).map(([k, v]) => [k, expandEnv(v, env)]))\n : undefined\n const result: {\n url: string\n headers?: Record<string, string>\n params?: Record<string, string>\n } = { url }\n if (expandedHeaders) result.headers = expandedHeaders\n if (expandedParams) result.params = expandedParams\n return result\n }\n\n // Directory fallback hook (injected from T3)\n if (resolveNamespaceHook) {\n const hookResult = await resolveNamespaceHook(ns)\n if (hookResult) {\n const url = resolveNamespaceUrl(ns, name, hookResult, env)\n return { url }\n }\n }\n\n // Built-in first-party namespace fallback (@cascade is the legacy alias)\n if (ns === '@cascivo' || ns === '@cascade') {\n return { url: `${CASCIVO_HOST}/r/${name}.json` }\n }\n\n throw new Error(\n `Unknown namespace \"${ns}\". Add it to registries in cascivo.config.ts or check the directory at cascivo.com`,\n )\n }\n }\n}\n\nexport interface InstallPlan {\n items: {\n spec: string\n addr: ParsedAddress\n itemUrl: string\n headers?: Record<string, string>\n params?: Record<string, string>\n item: RegistryItem\n registryBase: string\n }[]\n}\n\nexport async function resolveClosure(\n specs: string[],\n config: CascadeConfig,\n env: NodeJS.ProcessEnv = process.env,\n resolveNamespaceHook?: (ns: string) => Promise<RegistryNamespaceConfig | null>,\n): Promise<InstallPlan> {\n const seen = new Set<string>()\n const queue: string[] = [...specs]\n const plan: InstallPlan['items'] = []\n\n while (queue.length > 0) {\n const spec = queue.shift()!\n const addr = parseAddress(spec, env)\n const identity = addr.raw\n\n if (seen.has(identity)) continue\n seen.add(identity)\n\n const { url, headers, params } = await resolveItemUrl(addr, config, env, resolveNamespaceHook)\n const fetchOpts: Parameters<typeof fetchJson>[1] = {}\n if (headers) fetchOpts.headers = headers\n if (params) fetchOpts.params = params\n const raw = await fetchJson(url, fetchOpts)\n const item = raw as RegistryItem\n\n const base = url.replace(/\\/[^/]+\\.json$/, '')\n\n const entry: InstallPlan['items'][number] = {\n spec,\n addr,\n itemUrl: url,\n item,\n registryBase: base,\n }\n if (headers) entry.headers = headers\n if (params) entry.params = params\n plan.push(entry)\n\n for (const dep of item.registryDependencies ?? []) {\n queue.push(dep)\n }\n }\n\n return { items: plan }\n}\n","import type { RegistryNamespaceConfig } from './config.js'\nimport { fetchJson } from './http.js'\nimport type { FetchFn } from './http.js'\n\nimport { CASCIVO_HOST } from './config.js'\n\nexport const DIRECTORY_URL = `${CASCIVO_HOST}/r/registries.json`\n\ninterface DirectoryEntry {\n namespace: string\n registryUrl: string\n}\n\ninterface DirectoryResponse {\n registries?: DirectoryEntry[]\n}\n\nexport async function resolveFromDirectory(\n ns: string,\n fetchFn?: FetchFn,\n): Promise<RegistryNamespaceConfig | null> {\n try {\n // fetchJson uses the module-level _fetchFn; if a custom fetchFn is provided, we use it directly\n let data: DirectoryResponse\n if (fetchFn) {\n const res = await fetchFn(DIRECTORY_URL, { headers: { Accept: 'application/json' } })\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n data = (await res.json()) as DirectoryResponse\n } else {\n data = (await fetchJson(DIRECTORY_URL)) as DirectoryResponse\n }\n const entry = data.registries?.find((r) => r.namespace === ns)\n if (!entry) return null\n return entry.registryUrl\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n console.warn(`Could not reach cascivo.com directory: ${msg}`)\n return null\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { join, resolve as resolvePath } from 'node:path'\nimport {\n detectPackageManager,\n installHint,\n type CascadeConfig,\n type PackageManager,\n} from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchTextRetry } from '../utils/http.js'\nimport {\n fetchRegistry,\n fileName,\n findComponent,\n type Registry,\n type RegistryComponent,\n} from '../utils/registry.js'\nimport { createLock, readLock, sha256, updateLockEntry, writeLock } from '../utils/lock.js'\nimport { checkPeerVersions } from '../utils/peer-versions.js'\nimport { resolveClosure } from '../utils/resolve.js'\nimport { resolveFromDirectory } from '../utils/directory.js'\nimport { isTemplateItem, type RegistryItem } from '@cascivo/registry'\n\n/** Dependencies always present in a cascade project — never auto-installed. */\nconst ASSUMED_DEPS = new Set(['react', 'react-dom'])\n\n/** Merged dependencies + devDependencies from the project's package.json (empty if none). */\nfunction readProjectDeps(cwd: string): Record<string, unknown> {\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n return { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n // No package.json — treat as no deps installed.\n return {}\n }\n}\n\n/**\n * Copied components read `--cascivo-*` custom properties; without\n * @cascivo/tokens or @cascivo/themes imported somewhere, they render unstyled.\n * Print the wiring once after a successful install if neither is a dependency.\n */\nfunction hintThemesIfMissing(cwd: string, pm: PackageManager): void {\n const deps = readProjectDeps(cwd)\n if (deps['@cascivo/themes'] !== undefined || deps['@cascivo/tokens'] !== undefined) return\n console.log(\n '\\nStyling: cascivo components read --cascivo-* tokens, which this project does not import yet.',\n )\n console.log(` ${installHint(pm, ['@cascivo/themes'])}`)\n console.log(\" import '@cascivo/themes/all' // once, in your entry file\")\n console.log(' <html data-theme=\"light\"> // or any container')\n}\n\n/** Resolve where a template's own file is written — relative to the project root. */\nexport function resolveTemplateTarget(cwd: string, target: string): string {\n return resolvePath(cwd, target)\n}\n\nexport interface ResolvedBareEntry {\n entry: RegistryComponent\n /** True if reached via an original `cascivo add` argument; false if pulled as a transitive dependency. */\n requested: boolean\n}\n\n/**\n * Names from other libraries → the cascivo layout primitive that fills the same\n * role, so `cascivo add box` installs `layout/flex`. Bare names that already\n * resolve (e.g. `flex` → `layout/flex` via suffix match) still list an alias here\n * for discoverability.\n */\nexport const LAYOUT_ALIASES: Record<string, string> = {\n box: 'layout/flex',\n hstack: 'layout/flex',\n vstack: 'layout/flex',\n gap: 'spacer',\n}\n\n/**\n * Disambiguation printed when a requested bare name is a real cascivo component\n * whose meaning differs from the same name elsewhere, so an adopter who grabbed\n * it by name alone learns the right primitive. Keyed by lowercased bare name.\n */\nexport const NAME_NOTES: Record<string, string> = {\n stack:\n \"Note: cascivo's Stack overlaps children into a card-pile (z-axis), not a \" +\n 'vertical spacing layout. For vertical spacing use Flex direction=\"vertical\" ' +\n '(cascivo add flex; aliases: vstack, hstack).',\n}\n\n/**\n * Resolve the transitive closure of bare-name registry entries, following each\n * entry's `registryDependencies`. De-duped by resolved registry name and\n * cycle-safe (an entry is processed at most once). Returns resolved entries in\n * install order plus the names that could not be found. Pure — no I/O.\n */\nexport function resolveBareClosure(\n registry: Registry,\n bareSpecs: string[],\n): { resolved: ResolvedBareEntry[]; missing: string[] } {\n const queue: { name: string; requested: boolean }[] = bareSpecs.map((name) => ({\n name,\n requested: true,\n }))\n const installed = new Set<string>()\n const resolved: ResolvedBareEntry[] = []\n const missing: string[] = []\n\n while (queue.length > 0) {\n const { name, requested } = queue.shift()!\n const resolvedName = LAYOUT_ALIASES[name.toLowerCase()] ?? name\n const entry = findComponent(registry, resolvedName)\n if (!entry) {\n missing.push(name)\n continue\n }\n if (installed.has(entry.name)) continue\n installed.add(entry.name)\n resolved.push({ entry, requested })\n for (const dep of entry.registryDependencies ?? []) {\n queue.push({ name: dep, requested: false })\n }\n }\n\n return { resolved, missing }\n}\n\n/**\n * First-party items are hosted on cascivo.com or the cascivo/cascivo GitHub\n * repo (raw file URLs). Anything else gets a review-before-use notice.\n */\nconst FIRST_PARTY_URL = /^https:\\/\\/(cascivo\\.com|raw\\.githubusercontent\\.com\\/cascivo\\/cascivo)\\//\n\nexport function isThirdParty(itemUrl: string): boolean {\n return !FIRST_PARTY_URL.test(itemUrl)\n}\n\nfunction isMultiRegistrySpec(name: string): boolean {\n return (\n name.startsWith('@') ||\n name.startsWith('http://') ||\n name.startsWith('https://') ||\n name.startsWith('./') ||\n name.startsWith('/') ||\n name.split('/').length >= 3\n )\n}\n\nexport async function add(\n names: string[],\n config: CascadeConfig,\n opts: {\n dryRun?: boolean\n yes?: boolean\n cwd?: string\n pm?: PackageManager\n noInstall?: boolean\n } = {},\n): Promise<void> {\n if (names.length === 0) {\n console.error('Usage: cascivo add <component...>')\n return\n }\n\n const cwd = opts.cwd ?? process.cwd()\n const pm = opts.pm ?? detectPackageManager(cwd)\n const multiSpecs = names.filter(isMultiRegistrySpec)\n let bareSpecs = names.filter((n) => !isMultiRegistrySpec(n))\n\n // Bare names that match a first-party template install through the per-item\n // path (they carry file targets the bare component path cannot express).\n let registry: Registry | null = null\n if (bareSpecs.length > 0) {\n registry = await fetchRegistry(config.registry)\n const templateNames = new Set(registry.templates.map((t) => t.toLowerCase()))\n const templateSpecs = bareSpecs.filter((n) => templateNames.has(n.toLowerCase()))\n if (templateSpecs.length > 0) {\n bareSpecs = bareSpecs.filter((n) => !templateNames.has(n.toLowerCase()))\n multiSpecs.push(...templateSpecs.map((n) => `@cascivo/${n.toLowerCase()}`))\n }\n }\n\n let lock = (await readLock(cwd)) ?? createLock()\n\n // Handle multi-registry specs (namespaces, URLs, GitHub)\n if (multiSpecs.length > 0) {\n const plan = await resolveClosure(multiSpecs, config, process.env, resolveFromDirectory)\n\n if (opts.dryRun) {\n console.log('Dry run — would install:')\n for (const item of plan.items) {\n const kind = isTemplateItem(item.item) ? ' [template]' : ''\n console.log(\n ` ${item.spec} (${item.item.name}@${item.item.version})${kind} from ${item.itemUrl}`,\n )\n for (const f of item.item.files) {\n const arrow = isTemplateItem(item.item) && f.target ? ` → ${f.target}` : ''\n console.log(` ${f.url}${arrow}`)\n }\n if (item.item.registryDependencies?.length) {\n console.log(` components: ${item.item.registryDependencies.join(', ')}`)\n }\n }\n return\n }\n\n for (const { item, itemUrl, registryBase } of plan.items) {\n if (isThirdParty(itemUrl)) {\n console.log(\n `\\nReview before use — files from non-directory registry: ${registryBase}\\n` +\n (item.files ?? []).map((f) => ` ${f.url}`).join('\\n'),\n )\n }\n\n let fileHashes: Record<string, string>\n try {\n fileHashes = await installItem(item, config, cwd, {\n pm,\n ...(opts.noInstall ? { noInstall: true } : {}),\n })\n } catch (e) {\n // Nothing was written for this item (fetch-all-then-write), so the\n // lockfile must not record it either.\n console.error(`Failed to install ${item.name}: ${e instanceof Error ? e.message : e}`)\n process.exitCode = 1\n continue\n }\n lock = updateLockEntry(lock, item.name, {\n registry: registryBase,\n version: item.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: fileHashes,\n })\n }\n await writeLock(lock, cwd)\n if (bareSpecs.length === 0) {\n hintThemesIfMissing(cwd, pm)\n return\n }\n }\n\n if (bareSpecs.length === 0) return\n // Legacy bare-name path (uses the registry fetched above for template\n // detection). Resolves the transitive closure of registry (component)\n // dependencies so a component that imports a shared hook/sibling\n // (e.g. `../popover/use-popover`) installs that dependency too.\n registry ??= await fetchRegistry(config.registry)\n const missingDeps = new Set<string>()\n const registryBase = config.registry.replace(/\\/registry\\.json$/, '').replace(/\\/r$/, '')\n\n for (const spec of bareSpecs) {\n const note = NAME_NOTES[spec.toLowerCase()]\n if (note) console.log(note)\n\n const alias = LAYOUT_ALIASES[spec.toLowerCase()]\n if (!alias) continue\n const target = findComponent(registry, alias)\n if (target) {\n console.log(\n `\"${spec}\" is not a cascivo component — installing ${target.name} (its ${spec} primitive).`,\n )\n }\n }\n\n const { resolved, missing } = resolveBareClosure(registry, bareSpecs)\n for (const name of missing) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n }\n\n // Announce the CHANNEL before anything else runs. `cascivo add area-chart` reads like\n // every other add — same syntax, same \"you own the code\" framing — but copies no source:\n // it installs an npm package. That was only stated inside the install log, which scrolls\n // past. Say it first, once per package, for what the caller actually asked for.\n const announced = new Set<string>()\n for (const { entry, requested } of resolved) {\n if (!requested || !entry.install || announced.has(entry.install)) continue\n announced.add(entry.install)\n console.log(\n `\\n\"${entry.name}\" ships in the ${entry.install} npm package — no source is copied ` +\n 'into your project. Updates come from your package manager, not `cascivo update`.',\n )\n }\n\n // Warn BEFORE copying, and only for what the caller actually asked for — a deprecated\n // entry pulled in transitively is not their decision to make. The source's `@deprecated`\n // JSDoc arrives too late: by the time it is read, the file is already vendored.\n for (const { entry, requested } of resolved) {\n if (!requested || !entry.deprecated) continue\n const { replacement, since, note } = entry.deprecated\n console.warn(\n `\\n⚠ \"${entry.name}\" is deprecated since ${since}. Use \"${replacement}\" instead:\\n` +\n ` cascivo add ${replacement}\\n` +\n (note ? ` ${note}\\n` : '') +\n ` Adding \"${entry.name}\" anyway — it still works.\\n`,\n )\n }\n\n // Aggregate each resolved entry's peer-version floors (e.g. \"install data-table\n // needs @cascivo/i18n >= 0.2.1\") so we can verify what actually got installed.\n const peerFloors: Record<string, string> = {}\n for (const { entry } of resolved) {\n for (const [pkg, floor] of Object.entries(entry.peerVersions ?? {})) {\n peerFloors[pkg] = floor\n }\n }\n\n // npm-distributed entries (charts/flow/editor) are a runtime package, not\n // copied source. Collect their package + import lines here so N chart entries\n // produce ONE `@cascivo/charts` install rather than N, then install once below.\n const npmPackages = new Set<string>()\n const importLines: string[] = []\n\n for (const { entry, requested } of resolved) {\n if (entry.install) {\n const pkg = entry.install\n npmPackages.add(pkg)\n console.log(\n `\"${entry.name}\" is distributed as the npm package ${pkg} — a runtime dependency, ` +\n `not copied source (updates come via your package manager).`,\n )\n importLines.push(` import { ${entry.meta.name} } from '${pkg}'`)\n if (entry.styles) {\n importLines.push(` import '${entry.styles}' // once, in your entry file`)\n }\n continue\n }\n\n const outputName = entry.name.includes('/') ? entry.name.split('/').pop()! : entry.name\n const fileHashes: Record<string, string> = {}\n\n // Two-phase: fetch every file before writing any, so a mid-install network\n // failure can never leave a half-copied component (or a lockfile entry\n // pointing at one).\n let fetched: { url: string; content: string }[]\n try {\n fetched = await Promise.all(\n entry.files.map(async (url) => ({ url, content: await fetchTextRetry(url) })),\n )\n } catch (e) {\n console.error(`Failed to install ${entry.name}: ${e instanceof Error ? e.message : e}`)\n process.exitCode = 1\n continue\n }\n for (const { url, content } of fetched) {\n const dest = resolveOutputPath(config.outputDir, outputName, fileName(url), cwd)\n await writeFileSafe(dest, content)\n fileHashes[dest] = sha256(content)\n }\n\n for (const dep of entry.dependencies) {\n if (!ASSUMED_DEPS.has(dep)) missingDeps.add(dep)\n }\n\n lock = updateLockEntry(lock, entry.name, {\n registry: registryBase,\n version: entry.version,\n installedAt: new Date().toISOString().slice(0, 10),\n files: fileHashes,\n })\n\n const suffix = requested ? '' : ' (dependency)'\n console.log(`Added ${entry.name} to ${config.outputDir}/${outputName}/${suffix}`)\n }\n\n // Install npm-distributed packages (charts/flow/editor) once, deduped, skipping\n // any already in the project. `--no-install`/`--dry-run` fall back to printing.\n if (npmPackages.size > 0) {\n const deps = readProjectDeps(cwd)\n const needed = [...npmPackages].filter((p) => deps[p] === undefined)\n if (opts.dryRun) {\n console.log(`Dry run — would install npm package(s): ${[...npmPackages].join(', ')}`)\n } else if (needed.length > 0) {\n if (opts.noInstall) {\n console.log(`\\nSkipped install (--no-install). Install with:\\n ${installHint(pm, needed)}`)\n } else if (!installPackages(needed, cwd, { pm })) {\n process.exitCode = 1\n }\n }\n if (importLines.length > 0) {\n console.log(`\\nImport it:\\n${importLines.join('\\n')}`)\n }\n }\n\n if (missingDeps.size > 0 && !opts.dryRun) {\n if (opts.noInstall) {\n console.log(\n `\\nSkipped install (--no-install). Install with:\\n ${installHint(pm, [...missingDeps])}`,\n )\n } else {\n installPackages([...missingDeps], cwd, { pm })\n }\n }\n\n if (Object.keys(peerFloors).length > 0) {\n const violations = await checkPeerVersions(cwd, peerFloors)\n for (const v of violations) {\n console.error(\n `\\nWarning: ${v.pkg} ${v.installed ? `${v.installed} is` : 'is not'} installed, but ` +\n `the copied component source needs ${v.pkg} ${v.required}. ` +\n `Run: ${installHint(pm, [`${v.pkg}@latest`])}`,\n )\n process.exitCode = 1\n }\n }\n\n await writeLock(lock, cwd)\n hintThemesIfMissing(cwd, pm)\n}\n\n/**\n * Install a single resolved item, returning a map of written path → content\n * hash for the lockfile. A template writes its own files to their `target`\n * paths (relative to the project root); every other item writes its files under\n * the components output directory. A template's components are installed\n * separately as their own plan entries (via `registryDependencies`).\n */\nasync function installItem(\n item: RegistryItem,\n config: CascadeConfig,\n cwd: string,\n opts: { pm?: PackageManager; noInstall?: boolean } = {},\n): Promise<Record<string, string>> {\n const fileHashes: Record<string, string> = {}\n const missingDeps = new Set<string>()\n const template = isTemplateItem(item)\n const outputName = item.name.includes('/') ? item.name.split('/').pop()! : item.name\n\n // Two-phase: fetch every file before writing any. A failed fetch aborts the\n // whole item (throws to the caller) instead of silently installing a subset.\n const fetched = await Promise.all(\n (item.files ?? []).map(async (file) => ({\n file,\n content: await fetchTextRetry(file.url),\n })),\n )\n for (const { file, content } of fetched) {\n const dest =\n template && file.target\n ? resolveTemplateTarget(cwd, file.target)\n : resolveOutputPath(config.outputDir, outputName, fileName(file.url), cwd)\n await writeFileSafe(dest, content)\n fileHashes[dest] = sha256(content)\n }\n\n for (const dep of item.dependencies ?? []) {\n if (!ASSUMED_DEPS.has(dep)) missingDeps.add(dep)\n }\n\n if (missingDeps.size > 0) {\n if (opts.noInstall) {\n console.log(\n `\\nSkipped install (--no-install). Install with:\\n ${installHint(opts.pm ?? detectPackageManager(cwd), [...missingDeps])}`,\n )\n } else {\n installPackages([...missingDeps], cwd, opts.pm ? { pm: opts.pm } : {})\n }\n }\n\n if (template) {\n const pages = item.files?.filter((f) => f.target).map((f) => f.target) ?? []\n console.log(`Installed template ${item.name} (${pages.length} files)`)\n } else {\n console.log(`Added ${item.name} to ${config.outputDir}/${outputName}/`)\n }\n\n return fileHashes\n}\n","import { isPackageManager, type PackageManager } from './config.js'\n\n/**\n * Read `--key value` or `--key=value` from an argv slice. Ignores a following\n * token that is itself a flag (so `--tokens --dry-run` yields undefined, not\n * `--dry-run`).\n */\nexport function flagValue(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\n/**\n * Extract positional (non-flag) arguments from an argv slice. Any token starting\n * with `-` is dropped, as is the value token immediately following a flag named\n * in `valueFlags` (e.g. `pnpm` in `--pm pnpm`), so component names never pick up\n * a flag or its value.\n */\nexport function positionalArgs(args: string[], valueFlags: string[] = []): string[] {\n const out: string[] = []\n for (let i = 0; i < args.length; i++) {\n const token = args[i]!\n if (token.startsWith('-')) {\n const key = token.replace(/^--?/, '').split('=')[0]!\n const next = args[i + 1]\n if (\n valueFlags.includes(key) &&\n !token.includes('=') &&\n next !== undefined &&\n !next.startsWith('-')\n ) {\n i++ // skip the flag's value token\n }\n continue\n }\n out.push(token)\n }\n return out\n}\n\n/**\n * Resolve the `--package-manager` / `--pm` flag to a validated PackageManager.\n * Absent flag → `{ pm: undefined }` (fall back to auto-detection). Unknown value\n * → `{ error }` so the caller can print it and exit non-zero.\n */\nexport function resolvePackageManagerFlag(\n args: string[],\n): { pm: PackageManager | undefined } | { error: string } {\n const raw = flagValue(args, 'package-manager') ?? flagValue(args, 'pm')\n if (raw === undefined) return { pm: undefined }\n if (isPackageManager(raw)) return { pm: raw }\n return { error: `Unknown package manager \"${raw}\". Use one of: pnpm, yarn, npm, bun.` }\n}\n","// GENERATED by scripts/registry/cli-versions.ts — do not edit by hand.\n/**\n * Exact published versions, baked in at build time.\n *\n * Scaffolded apps pin these rather than `\"latest\"`: the cascivo packages version\n * independently on 0.x, so a floating specifier can resolve a mutually incompatible set,\n * and GETTING-STARTED.md tells adopters to pin exactly. Regenerate with `pnpm regen`.\n */\nexport const CASCIVO_VERSIONS: Record<string, string> = {\n '@cascivo/react': '0.18.0',\n '@cascivo/themes': '0.4.13',\n '@cascivo/charts': '0.18.0',\n '@cascivo/icons': '0.3.10',\n '@cascivo/eslint-config': '0.2.4',\n}\n\n/** `@cascivo/core`'s declared `@preact/signals-react` peer range. */\nexport const SIGNALS_PEER = '>=3.0.0'\n","import { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { stdin, stdout } from 'node:process'\nimport { createInterface } from 'node:readline/promises'\nimport {\n detectPackageManager,\n THEMES,\n type PackageManager,\n type ThemeName,\n} from '../utils/config.js'\nimport { flagValue, positionalArgs, resolvePackageManagerFlag } from '../utils/args.js'\nimport { writeFileSafe } from '../utils/fs.js'\nimport { CASCIVO_VERSIONS, SIGNALS_PEER } from '../generated/versions.js'\n\n/**\n * Exact published versions, baked in at build time by `scripts/registry/cli-versions.ts`.\n *\n * This used to be the literal `'latest'` for every cascivo dependency — the loosest\n * possible specifier on a set of independently-versioned 0.x packages, and the direct\n * opposite of GETTING-STARTED.md's \"pin **exact** versions (no `^`)\". A scaffold that\n * contradicts the docs on the very first file an adopter opens undermines every other rule\n * those docs state, so the pins are generated rather than hand-written.\n */\nconst V = CASCIVO_VERSIONS\n\n/** Install-everything command for a package manager (`pnpm install`, `yarn`, …). */\nfunction installAllCommand(pm: PackageManager): string {\n return pm === 'yarn' ? 'yarn' : `${pm} install`\n}\n\n/** Run-a-script command for a package manager (`npm run dev` vs `pnpm dev`). */\nfunction runScriptCommand(pm: PackageManager, script: string): string {\n return pm === 'npm' ? `npm run ${script}` : `${pm} ${script}`\n}\n\nexport interface ScaffoldOptions {\n /** Project directory + package name. */\n name: string\n /** Theme imported in the entry CSS and set on `<html data-theme>`. */\n theme: ThemeName\n /** Display labels for the side-nav sections (one section component each). */\n sections: string[]\n /** Package manager for the generated README's commands (default npm). */\n pm?: PackageManager\n}\n\nexport interface ScaffoldFile {\n /** Path relative to the project root. */\n path: string\n contents: string\n}\n\ninterface Section {\n /** Discriminant used in the section signal + conditional render. */\n key: string\n /** Human-readable label shown in the nav and section heading. */\n label: string\n /** PascalCase component + file name. */\n component: string\n}\n\n/** Slug suitable for a union-member string literal: lower-kebab, alnum only. */\nfunction slug(label: string): string {\n return (\n label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'section'\n )\n}\n\n/** PascalCase identifier derived from a free-text label. */\nfunction pascalCase(label: string): string {\n const parts = label\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n const joined = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')\n const safe = joined || 'Section'\n return /^[0-9]/.test(safe) ? `Section${safe}` : safe\n}\n\n/**\n * Short, human-readable brand for the shell header.\n *\n * The directory name is the wrong thing to render verbatim: a dated demo directory\n * (`vercel-dashboard-2026-07-30-take2`) produced a 45-character brand in the top-left of\n * every page. Take the leading words, title-case them, and stop — a brand is a label, not a\n * slug. Bare numbers and `v2`-style segments are dropped rather than counted.\n */\nexport function brandName(name: string): string {\n const words = name\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter((w) => w !== '' && !/^\\d+$/.test(w) && !/^v\\d+$/i.test(w))\n const kept: string[] = []\n for (const word of words) {\n if (kept.length >= 3) break\n if (kept.length > 0 && kept.join(' ').length + 1 + word.length > 24) break\n kept.push(word.charAt(0).toUpperCase() + word.slice(1))\n }\n return kept.join(' ') || 'App'\n}\n\n/** Normalize the project name into a valid npm package name. */\nfunction packageName(name: string): string {\n return (\n name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'cascivo-app'\n )\n}\n\n/** Turn raw section labels into unique keyed/component-named sections. */\nfunction resolveSections(labels: string[]): Section[] {\n const seenKeys = new Set<string>()\n const seenComponents = new Set<string>()\n const sections: Section[] = []\n for (const label of labels) {\n const trimmed = label.trim()\n if (!trimmed) continue\n let key = slug(trimmed)\n let component = pascalCase(trimmed)\n let n = 2\n while (seenKeys.has(key) || seenComponents.has(component)) {\n key = `${slug(trimmed)}-${n}`\n component = `${pascalCase(trimmed)}${n}`\n n++\n }\n seenKeys.add(key)\n seenComponents.add(component)\n sections.push({ key, label: trimmed, component })\n }\n return sections.length > 0 ? sections : [{ key: 'home', label: 'Home', component: 'Home' }]\n}\n\nfunction packageJson(opts: ScaffoldOptions): string {\n const pkg = {\n name: packageName(opts.name),\n private: true,\n version: '0.0.0',\n type: 'module',\n scripts: {\n dev: 'vite',\n build: 'tsc && vite build',\n preview: 'vite preview',\n typecheck: 'tsc --noEmit',\n lint: 'eslint .',\n format: 'prettier --write .',\n 'format:check': 'prettier --check .',\n },\n // Prebuilt path (Path B): `@cascivo/react` and `@cascivo/themes` only.\n //\n // `@cascivo/core` and `@cascivo/tokens` are deliberately absent. AI-RULES.md: \"**Never**\n // add `@cascivo/core` to a prebuilt-path app's package.json — it is only a transitive\n // dependency there, and everything is re-exported from `@cascivo/react`.\"\n // GETTING-STARTED.md says the same of `@cascivo/tokens`, which arrives with\n // `@cascivo/themes` as a direct dependency. The scaffold used to declare both and then\n // import from them, so it violated two documented rules and taught the pattern by example.\n //\n // `@preact/signals-react` IS declared: it is a required peer that the generated\n // `App.tsx` calls into via `useSignals()`. It used to be omitted entirely and survived\n // only by hoisting — a phantom dependency that breaks under pnpm's strict layout.\n dependencies: {\n '@cascivo/react': V['@cascivo/react']!,\n '@cascivo/themes': V['@cascivo/themes']!,\n '@preact/signals-react': SIGNALS_PEER,\n react: '^19.0.0',\n 'react-dom': '^19.0.0',\n },\n devDependencies: {\n '@cascivo/eslint-config': V['@cascivo/eslint-config']!,\n '@eslint/js': '^9.0.0',\n '@types/react': '^19.0.0',\n '@types/react-dom': '^19.0.0',\n '@vitejs/plugin-react': '^5.0.0',\n eslint: '^9.0.0',\n 'eslint-plugin-react-hooks': '^7.0.0',\n prettier: '^3.0.0',\n typescript: '^5.7.0',\n // Registers the TypeScript parser AND the `files` patterns that make ESLint look at\n // .ts/.tsx at all. Without it ESLint 9's default `files` is **/*.{js,cjs,mjs}, so\n // `lint` on a TypeScript-only app exits 0 having inspected zero files — a green check\n // that proves nothing (2026-08-08 report B).\n 'typescript-eslint': '^8.0.0',\n vite: '^7.0.0',\n },\n }\n return JSON.stringify(pkg, null, 2) + '\\n'\n}\n\nfunction tsconfig(): string {\n const cfg = {\n compilerOptions: {\n target: 'ES2022',\n useDefineForClassFields: true,\n lib: ['ES2022', 'DOM', 'DOM.Iterable'],\n module: 'ESNext',\n skipLibCheck: true,\n moduleResolution: 'bundler',\n allowImportingTsExtensions: true,\n resolveJsonModule: true,\n isolatedModules: true,\n moduleDetection: 'force',\n noEmit: true,\n jsx: 'react-jsx',\n strict: true,\n noUnusedLocals: true,\n noUnusedParameters: true,\n noFallthroughCasesInSwitch: true,\n },\n include: ['src'],\n }\n return JSON.stringify(cfg, null, 2) + '\\n'\n}\n\nfunction viteConfig(): string {\n return `import react from '@vitejs/plugin-react'\nimport { defineConfig } from 'vite'\n\nexport default defineConfig({\n plugins: [react()],\n})\n`\n}\n\nfunction indexHtml(opts: ScaffoldOptions): string {\n return `<!doctype html>\n<html lang=\"en\" data-theme=\"${opts.theme}\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${brandName(opts.name)}</title>\n <style>\n @layer vendor, cascivo.reset, cascivo.base, cascivo.tokens, cascivo.component,\n cascivo.platform, cascivo.theme, cascivo.blocks, cascivo.example, cascivo.override;\n /* cascivo.example is this app's own slot — above the component/blocks layers so your\n styles win, below cascivo.override which stays free for one-off hotfixes. The\n generated AGENTS.md tells the agent to write there, and this statement is what makes\n that legal: a layer used but never declared falls to the end of the cascade and\n beats everything, which is the opposite of what the ordering is for. */\n /* Third-party CSS goes in the low-priority vendor layer so it can't beat cascivo:\n @import url('some-lib/styles.css') layer(vendor); — see docs/THIRD-PARTY-CSS.md */\n @layer cascivo.reset {\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n }\n }\n @layer cascivo.base {\n html,\n body,\n #root {\n height: 100%;\n }\n }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}\n\nfunction mainTsx(): string {\n return `import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\n\nconst root = document.getElementById('root')\nif (root) {\n ReactDOM.createRoot(root).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n )\n}\n`\n}\n\nfunction viteEnv(): string {\n return `/// <reference types=\"vite/client\" />\\n`\n}\n\n// No `opts`: the theme import and the brand moved to `Shell.tsx`, which owns the app chrome.\nfunction appTsx(sections: Section[]): string {\n const sectionImports = sections\n .map((s) => `import { ${s.component} } from './sections/${s.component}'`)\n .join('\\n')\n\n const unionType = sections.map((s) => `'${s.key}'`).join(' | ')\n\n const navItems = sections\n .map(\n (s) => ` {\n label: '${s.label.replace(/'/g, \"\\\\'\")}',\n active: section.value === '${s.key}',\n onClick: (e) => {\n e.preventDefault()\n section.value = '${s.key}'\n },\n },`,\n )\n .join('\\n')\n\n const renderedSections = sections\n .map((s) => ` {section.value === '${s.key}' && <${s.component} />}`)\n .join('\\n')\n\n // Everything comes from `@cascivo/react` on the prebuilt path — it re-exports the\n // `@cascivo/core` primitives, so importing from `@cascivo/core` directly would make it a\n // phantom dependency (and AI-RULES.md forbids declaring it here). There is likewise no\n // `import '@cascivo/tokens'`: the tokens arrive with the theme stylesheet.\n return `'use client'\nimport { signal, useSignals, type SideNavItem } from '@cascivo/react'\nimport { Shell } from './Shell'\n${sectionImports}\n\ntype Section = ${unionType}\n\nconst section = signal<Section>('${sections[0]!.key}')\n\nexport default function App() {\n useSignals()\n\n const navItems: SideNavItem[] = [\n${navItems}\n ]\n\n return (\n <Shell navItems={navItems}>\n${renderedSections}\n </Shell>\n )\n}\n`\n}\n\n/**\n * The app shell, as its own component with a `children` slot.\n *\n * Split out of `App.tsx` because the shell composition — AppShell + ShellHeader + SideNav —\n * is the valuable part of the scaffold, and it used to be welded to the signal-driven\n * section switcher. A 2026-08-14 adopter prompted for \"a dashboard with Vite and React\n * Router\", then deleted `App.tsx` and all of `src/sections/` — the majority of what `create`\n * generated — and re-derived this wiring by hand.\n *\n * Now adding a router means deleting `App.tsx` + `src/sections/` and rendering `<Shell>` from\n * the root route's layout, with `navItems` carrying `href` instead of `onClick`. Nothing in\n * here needs to change.\n */\nfunction shellTsx(opts: ScaffoldOptions): string {\n return `'use client'\nimport { AppShell, ShellHeader, SideNav, type SideNavItem } from '@cascivo/react'\nimport type { ReactNode } from 'react'\n\nimport '@cascivo/themes/${opts.theme}.css'\n// No '@cascivo/react/styles.css' here. On a bundler build each component imports its\n// own CSS, so you ship exactly what you use — this app emits well under 100 kB of entry\n// CSS instead of the ~273 kB aggregate sheet. Import the aggregate ONLY if you drop the\n// bundler (CDN / single-file setup). See https://cascivo.com/docs/getting-started.md\n// The theme import above is always required — themes are never automatic.\n\nexport interface ShellProps {\n /** Side-nav entries. Use \\`href\\` for a routed app, \\`onClick\\` for local state. */\n navItems: SideNavItem[]\n children: ReactNode\n}\n\n/**\n * App shell: header + side nav + a content slot.\n *\n * Adding a router? Keep this file. Delete \\`App.tsx\\` and \\`src/sections/\\`, render\n * \\`<Shell navItems={…}>\\` from your root route's layout with your \\`<Outlet />\\` as children,\n * and give each nav item an \\`href\\` instead of an \\`onClick\\`.\n *\n * For those hrefs to become real router links, call \\`setLinkComponent\\` ONCE at startup in\n * \\`main.tsx\\` — see the \"Adding a router\" section of README.md for the exact snippet, or\n * https://cascivo.com/docs/using-with-a-router.md for the full recipe.\n */\nexport function Shell({ navItems, children }: ShellProps) {\n return (\n <AppShell\n header={<ShellHeader brand={{ name: '${brandName(opts.name).replace(/'/g, \"\\\\'\")}' }} />}\n nav={<SideNav items={navItems} />}\n >\n {children}\n </AppShell>\n )\n}\n`\n}\n\nfunction sectionTsx(section: Section): string {\n // No inline styles: the generated AGENTS.md tells the agent not to write them, and a\n // scaffold that models the opposite teaches the opposite. The page inset comes from\n // AppShell's own \\`padding\\` prop, and the stacking from \\`Flex\\` — note \\`gap\\` takes a\n // NUMBER (a space-scale step), not a string.\n return `import { Card, CardContent, CardHeader, CardTitle, Flex, Heading, Text } from '@cascivo/react'\n\nexport function ${section.component}() {\n return (\n <Flex gap={6}>\n <Flex gap={2}>\n <Heading level={1}>${section.label}</Heading>\n <Text muted>\n Edit <code>src/sections/${section.component}.tsx</code> to build out this page.\n </Text>\n </Flex>\n\n <Card>\n <CardHeader>\n <CardTitle>Get started</CardTitle>\n </CardHeader>\n <CardContent>\n <Text>\n This page is wired into the app shell. Add components with{' '}\n <code>npx cascivo add &lt;component&gt;</code>.\n </Text>\n </CardContent>\n </Card>\n </Flex>\n )\n}\n`\n}\n\n/**\n * ESLint flat config for the scaffold.\n *\n * `@cascivo/eslint-config` is wired in from the start because\n * `eslint-plugin-react-hooks@7`'s `recommended-latest` reports every `signal.value = next`\n * — the idiom AI-RULES.md mandates and the generated `App.tsx` below uses — as\n * `Error: This value cannot be modified`. Without this, `pnpm lint` on a freshly scaffolded\n * app errors on every piece of state it ships with.\n */\nfunction eslintConfig(): string {\n return `import js from '@eslint/js'\nimport tseslint from 'typescript-eslint'\nimport reactHooks from 'eslint-plugin-react-hooks'\nimport cascivo from '@cascivo/eslint-config'\n\nexport default [\n { ignores: ['dist/**'] },\n js.configs.recommended,\n // Registers the TypeScript parser and the .ts/.tsx \\`files\\` patterns. WITHOUT THIS ESLINT\n // LINTS NOTHING: its default \\`files\\` is **/*.{js,cjs,mjs}, so every file in this app is\n // skipped with \"File ignored because no matching configuration was supplied\" and the\n // \\`lint\\` script exits 0 having checked zero files.\n ...tseslint.configs.recommended,\n // NOTE the \\`.flat\\` — the plugin exports both \\`configs['recommended-latest']\\` (the legacy\n // eslintrc shape, which applies NOTHING here and reports no error) and this one.\n reactHooks.configs.flat['recommended-latest'],\n // Spread LAST — flat config is last-wins. This turns off \\`react-hooks/immutability\\`,\n // which reports cascivo's signal writes (\\`signal.value = next\\`) as errors. That rule\n // fires on the very first \\`signal.value = x\\` you write, so this is not optional wiring:\n // see https://cascivo.com/docs/using-with-strict-eslint.md\n ...cascivo,\n]\n`\n}\n\n/** Prettier config matching the style the scaffold's own generated source is written in. */\nfunction prettierrc(): string {\n return JSON.stringify({ semi: false, singleQuote: true, printWidth: 100 }, null, 2) + '\\n'\n}\n\nfunction prettierIgnore(): string {\n return `dist\nnode_modules\n# Vendored cascivo source is formatted upstream — reformatting it makes every\n# \\`cascivo add\\` update a merge conflict.\nsrc/components/ui/\n`\n}\n\nfunction gitignore(): string {\n return `node_modules\ndist\n*.local\n.DS_Store\n`\n}\n\nfunction readme(opts: ScaffoldOptions): string {\n const pm = opts.pm ?? 'npm'\n return `# ${opts.name}\n\nA [cascivo](https://cascivo.com) app — Vite + React + TypeScript, pre-wired with\nthe cascivo app shell, side navigation, and the \\`${opts.theme}\\` theme.\n\n## Develop\n\n\\`\\`\\`sh\n${installAllCommand(pm)}\n${runScriptCommand(pm, 'dev')}\n\\`\\`\\`\n\n## Structure\n\n- \\`src/Shell.tsx\\` — the app shell (header + side nav + content slot). Router-agnostic.\n- \\`src/App.tsx\\` — nav items and which section is showing\n- \\`src/sections/\\` — one component per nav item\n\nAdd more components with \\`npx cascivo add <component>\\`.\n\n## Adding a router\n\nThis app switches sections with a signal, not a router. To add one (React Router,\nTanStack Router, …):\n\n1. **Keep \\`src/Shell.tsx\\`.** Delete \\`src/App.tsx\\` and \\`src/sections/\\`.\n2. Render \\`<Shell navItems={…}>\\` from your root route's layout, with your \\`<Outlet />\\`\n as its children.\n3. Give each nav item an \\`href\\` instead of \\`onClick\\`.\n4. Register your router's Link **once** at startup, in \\`src/main.tsx\\`:\n\n\\`\\`\\`tsx\nimport { setLinkComponent } from '@cascivo/react'\nimport type { LinkComponentProps } from '@cascivo/react'\nimport { Link } from 'react-router'\n\nsetLinkComponent(({ href, ...rest }: LinkComponentProps) => <Link to={href ?? '#'} {...rest} />)\n\\`\\`\\`\n\nThat one call makes \\`SideNav\\`, \\`ShellHeader\\` and \\`Breadcrumb\\` render real router links.\nLinks you write in page content use \\`<Link asChild>\\` instead — two kinds of link, two\nmechanisms. Full recipe: https://cascivo.com/docs/using-with-a-router.md\n`\n}\n\nfunction agentsMd(opts: ScaffoldOptions): string {\n return `# Agent instructions — ${opts.name}\n\nThis is a [cascivo](https://cascivo.com) app. When generating or editing CSS, follow\nthe **layer contract** — cascivo styles live in cascade layers, and layer order beats\nselector specificity.\n\n## CSS layer contract\n\n1. Every declaration goes inside an \\`@layer\\` block. Unlayered CSS beats all layers\n regardless of specificity — never emit it.\n2. Never invent layer names. Write only: your app slot \\`cascivo.example\\` (declared in\n the order statement in \\`index.html\\`) for page styles, and\n \\`@layer cascivo.override { … }\\` for hotfixes / one-off overrides — it beats\n everything cascivo ships.\n3. Never nest layers deeper than the shipped \\`cascivo.blocks.<name>\\` pattern. For\n sub-elements, use native CSS nesting inside one layer block, not new sublayers.\n4. Third-party CSS: \\`@import url('lib/styles.css') layer(vendor);\\` with \\`vendor\\`\n declared before the cascivo layers. Don't import vendor CSS from JavaScript — route it\n through a CSS file, or use \\`@cascivo/vite-plugin\\` (\\`cascivoLayers\\`) to layer it.\n5. Style with \\`--cascivo-*\\` tokens, not raw values.\n\nThis app's declared layer order (in \\`index.html\\`):\n\n\\`\\`\\`css\n@layer vendor, cascivo.reset, cascivo.base, cascivo.tokens, cascivo.component,\n cascivo.platform, cascivo.theme, cascivo.blocks, cascivo.example, cascivo.override;\n\\`\\`\\`\n\n### Worked example — nesting, not new layers\n\n\\`\\`\\`css\n@layer cascivo.override {\n .projectCard {\n /* Sub-elements nest inside the one block — no cascivo.card.status sublayer. */\n .statusBadge {\n color: var(--cascivo-color-text-subtle);\n .pulseDot {\n background: var(--cascivo-color-success);\n }\n }\n }\n}\n\\`\\`\\`\n\n## Routing\n\nIf you add a router, keep \\`src/Shell.tsx\\` and delete \\`src/App.tsx\\` + \\`src/sections/\\`.\n\ncascivo links come in **two kinds**, wired two different ways. Do not intercept\n\\`onClick\\`, and do not hand-wrap nav items:\n\n1. **Config-driven navs** (\\`SideNav\\`, \\`ShellHeader\\`, \\`Breadcrumb\\`, \\`Switcher\\`) render\n through a module singleton. Register your router's Link once, in \\`src/main.tsx\\`:\n \\`setLinkComponent(({ href, ...rest }: LinkComponentProps) => <Link to={href ?? '#'} {...rest} />)\\`\n2. **Links in page content** use \\`asChild\\`:\n \\`<Link asChild><RouterLink to=\"/x\">x</RouterLink></Link>\\`\n\nFull recipe: https://cascivo.com/docs/using-with-a-router.md\n\n## Types\n\nThe vocabulary types are on a subpath: \\`import type { Tone } from '@cascivo/react/types'\\`\n(also \\`Progress\\`, \\`SpaceStep\\`). \\`Status.status\\` and \\`Badge.variant\\` use them, so a\n\\`Record<MyState, Tone>\\` is the supported way to map domain states onto tones. **Never**\nadd \\`@cascivo/core\\` to this app's dependencies — it is transitive here.\n\nMore: cascivo's machine-readable guide is at https://cascivo.com/llms.txt.\n`\n}\n\n/** Build the full set of files for a new cascivo app. Pure — no filesystem I/O. */\nexport function buildScaffold(opts: ScaffoldOptions): ScaffoldFile[] {\n const sections = resolveSections(opts.sections)\n return [\n { path: 'package.json', contents: packageJson(opts) },\n { path: 'tsconfig.json', contents: tsconfig() },\n { path: 'vite.config.ts', contents: viteConfig() },\n { path: 'index.html', contents: indexHtml(opts) },\n // No `cascivo.config.ts`. It configures where `cascivo add` copies source, which a\n // prebuilt-path app never does — and its presence was how `doctor` decided a project\n // was copy-paste, so the scaffolder's own output failed `doctor --ci` and was told to\n // install the two packages the docs forbid. `cascivo add` writes the config itself the\n // first time it is used.\n { path: 'eslint.config.js', contents: eslintConfig() },\n { path: '.prettierrc', contents: prettierrc() },\n { path: '.prettierignore', contents: prettierIgnore() },\n { path: '.gitignore', contents: gitignore() },\n { path: 'README.md', contents: readme(opts) },\n { path: 'AGENTS.md', contents: agentsMd(opts) },\n { path: 'src/main.tsx', contents: mainTsx() },\n { path: 'src/vite-env.d.ts', contents: viteEnv() },\n { path: 'src/App.tsx', contents: appTsx(sections) },\n { path: 'src/Shell.tsx', contents: shellTsx(opts) },\n ...sections.map((s) => ({\n path: `src/sections/${s.component}.tsx`,\n contents: sectionTsx(s),\n })),\n ]\n}\n\nconst DEFAULT_SECTIONS = ['Dashboard', 'Reports', 'Settings']\n\nexport async function create(args: string[], cwd: string = process.cwd()): Promise<void> {\n const yes = args.includes('--yes') || args.includes('-y')\n // Skip flag values (e.g. `bun` in `--pm bun`) so the project name is the first\n // real positional, not a flag's argument.\n const nameArg = positionalArgs(args, [\n 'pm',\n 'package-manager',\n 'theme',\n 'sections',\n 'template',\n ])[0]\n const themeArg = flagValue(args, 'theme')\n const sectionsArg = flagValue(args, 'sections')\n\n const pmFlag = resolvePackageManagerFlag(args)\n if ('error' in pmFlag) {\n console.error(pmFlag.error)\n process.exitCode = 1\n return\n }\n // The new project has no lock file of its own, but the directory it lands IN usually does\n // — scaffolding into an existing workspace is the common case. `preferLockfileOverUserAgent`\n // makes that walk-up outrank `npm_config_user_agent`, which `npx` always reports as npm no\n // matter what the surrounding repo uses (2026-08-14 §11). With no lock file anywhere up the\n // tree, detection still falls back to the launcher.\n const pm = detectPackageManager(cwd, {\n preferLockfileOverUserAgent: true,\n ...(pmFlag.pm ? { override: pmFlag.pm } : {}),\n })\n\n const interactive = !yes && stdin.isTTY\n const rl = interactive ? createInterface({ input: stdin, output: stdout }) : null\n\n try {\n let name = nameArg\n if (!name && rl) {\n name = (await rl.question('Project name? [my-cascivo-app]: ')).trim()\n }\n name = name || 'my-cascivo-app'\n\n let theme = (themeArg ?? '').toLowerCase()\n if (!(THEMES as readonly string[]).includes(theme) && rl) {\n theme = (await rl.question(`Theme? (${THEMES.join('/')}) [light]: `)).trim().toLowerCase()\n }\n const resolvedTheme: ThemeName = (THEMES as readonly string[]).includes(theme)\n ? (theme as ThemeName)\n : 'light'\n\n let sectionsInput = sectionsArg\n if (!sectionsInput && rl) {\n sectionsInput = (\n await rl.question(`Nav sections? (comma-separated) [${DEFAULT_SECTIONS.join(', ')}]: `)\n ).trim()\n }\n const sections = (sectionsInput ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n\n const opts: ScaffoldOptions = {\n name,\n theme: resolvedTheme,\n sections: sections.length > 0 ? sections : DEFAULT_SECTIONS,\n pm,\n }\n\n const targetDir = join(cwd, name)\n if (existsSync(targetDir) && readdirSync(targetDir).length > 0) {\n console.error(`Target directory \"${name}\" already exists and is not empty.`)\n process.exitCode = 1\n return\n }\n\n const files = buildScaffold(opts)\n for (const file of files) {\n await writeFileSafe(join(targetDir, file.path), file.contents)\n }\n\n console.log(`\\nCreated ${name} with the ${resolvedTheme} theme (${files.length} files).`)\n\n const templateSpec = flagValue(args, 'template')\n if (templateSpec) {\n const { add } = await import('./add.js')\n const { loadConfig } = await import('../utils/config.js')\n console.log(`\\nInstalling template \"${templateSpec}\"…`)\n await add([templateSpec], await loadConfig(), { cwd: targetDir, pm })\n }\n\n console.log('\\nNext steps:')\n console.log(` cd ${name}`)\n console.log(` ${installAllCommand(pm)}`)\n console.log(` ${runScriptCommand(pm, 'dev')}`)\n // Two things the output used to leave the adopter to discover (2026-08-14 §11, §1).\n console.log('\\nGood to know:')\n console.log(' No cascivo.config.ts is written — this app uses the prebuilt @cascivo/react')\n console.log(' packages and never copies source. `cascivo add <component>` writes the')\n console.log(' config itself the first time you vendor a component.')\n console.log('\\n Adding a router? Keep src/Shell.tsx, delete src/App.tsx + src/sections/,')\n console.log(' and register your Link once with setLinkComponent — see')\n console.log(' https://cascivo.com/docs/using-with-a-router.md')\n } finally {\n rl?.close()\n }\n}\n","import { readFileSync, readdirSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { detectPackageManager, installHint } from '../utils/config.js'\nimport { readInstalledPackageVersion } from '../utils/peer-versions.js'\nimport { compareVersions } from '../utils/semver.js'\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\n/** Runtime packages **copied** cascivo source needs; the last is @cascivo/core's peer. */\nconst REQUIRED_RUNTIME_DEPS = [\n '@cascivo/core',\n '@cascivo/tokens',\n '@cascivo/themes',\n '@preact/signals-react',\n]\n\n/** Runtime packages a **prebuilt** (Path B) app needs. */\nconst REQUIRED_PREBUILT_DEPS = ['@cascivo/react', '@cascivo/themes', '@preact/signals-react']\n\n/**\n * Packages a prebuilt app must NOT declare directly, with the rule each one breaks. They\n * are transitive there, and everything they export is re-exported from `@cascivo/react`.\n */\nconst FORBIDDEN_PREBUILT_DEPS: Record<string, string> = {\n '@cascivo/core':\n 'AI-RULES.md: never add @cascivo/core to a prebuilt-path app — it is transitive, and everything is re-exported from @cascivo/react',\n '@cascivo/tokens':\n 'GETTING-STARTED.md: @cascivo/tokens comes with @cascivo/themes as a direct dependency — never install it by hand',\n}\n\n/** Installed on demand by `cascivo add` when a component/chart declares them. */\nconst ON_DEMAND_DEPS = ['@cascivo/i18n', '@cascivo/charts']\n\nexport interface DependencyFinding {\n package: string\n /** true = a runtime dep whose absence breaks the build; false = advisory. */\n required: boolean\n hint: string\n /**\n * What is wrong. `'missing'` (the default) means install it; `'forbidden'` means the\n * project declares a package its install path must not. They need opposite advice, and\n * reporting both under the \"not in package.json — install it\" template produced a\n * self-contradicting message.\n */\n kind?: 'missing' | 'forbidden'\n}\n\nconst CONFIG_FILES = ['cascivo.config.ts', 'cascivo.config.js', 'cascivo.config.mjs']\n\n/**\n * How this project consumes cascivo.\n *\n * - `prebuilt` — Path B: depends on `@cascivo/react`, no copied source.\n * - `copied` — Path A: has vendored component source (or no `@cascivo/react`).\n * - `hybrid` — both: consumes the package AND copied something.\n * - `unknown` — no evidence either way; emit no dependency advice at all.\n */\nexport type InstallPath = 'prebuilt' | 'copied' | 'hybrid' | 'unknown'\n\n/**\n * Infer the install path from evidence.\n *\n * This used to be `isAdopterProject()` — \"does a `cascivo.config.*` exist?\" — and\n * `cascivo create` wrote that config into every scaffold, including prebuilt-path ones. So\n * every scaffolded app was judged copy-paste and told to install `@cascivo/core` and\n * `@cascivo/tokens`, which the docs explicitly forbid on that path. `doctor --ci` exited 1\n * on a correctly-installed app, which made the CI gate the docs recommend\n * (`cascivo doctor --ci && cascivo audit --ai src`) red on day one.\n *\n * A config file now only contributes evidence when it points at a directory that actually\n * contains copied source, which is what it was ever meant to signal.\n */\nexport function detectInstallPath(cwd: string): InstallPath {\n let deps: Record<string, unknown> = {}\n let hasPackageJson = true\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n hasPackageJson = false\n }\n\n if (!hasPackageJson) return 'unknown'\n\n const usesPackage = deps['@cascivo/react'] !== undefined\n const copied = hasCopiedSource(cwd)\n\n if (usesPackage && copied) return 'hybrid'\n if (usesPackage) return 'prebuilt'\n if (copied) return 'copied'\n // No package dependency and no copied source yet. A config file alone is NOT evidence of\n // a copy-paste app — it is what `cascivo add` writes before anything has been copied, and\n // treating it as proof is precisely what broke prebuilt-path projects. Advise on nothing.\n return 'unknown'\n}\n\n/** Whether the configured output directory holds vendored component source. */\nfunction hasCopiedSource(cwd: string): boolean {\n for (const dir of outputDirCandidates(cwd)) {\n const full = join(cwd, dir)\n if (!existsSync(full)) continue\n try {\n if (readdirSync(full).some((f) => f.endsWith('.tsx'))) return true\n } catch {\n // unreadable directory — no evidence, keep looking\n }\n }\n return false\n}\n\n/** `outputDir` from the config if it declares one, plus the documented default. */\nfunction outputDirCandidates(cwd: string): string[] {\n const dirs = new Set<string>(['src/components/ui'])\n for (const file of CONFIG_FILES) {\n const full = join(cwd, file)\n if (!existsSync(full)) continue\n try {\n const declared = /outputDir\\s*:\\s*['\"]([^'\"]+)['\"]/.exec(readFileSync(full, 'utf8'))?.[1]\n if (declared !== undefined) dirs.add(declared)\n } catch {\n // unreadable config — fall back to the default candidate\n }\n }\n return [...dirs]\n}\n\n/** Whether cwd looks like a cascivo adopter project (has a generated config). */\nexport function isAdopterProject(cwd: string): boolean {\n return CONFIG_FILES.some((f) => existsSync(join(cwd, f)))\n}\n\n/**\n * Check that the runtime dependencies this project's install path needs are declared in its\n * package.json — and, on the prebuilt path, that it declares none it must not.\n *\n * Turns the opaque \"cannot find module '@preact/signals-react'\" build failure into a\n * diagnosed condition with a fix. What it demands depends on `detectInstallPath`: requiring\n * `@cascivo/core` of a prebuilt app is not merely unhelpful, it is the opposite of what the\n * docs say, and following the advice makes a correct project wrong.\n *\n * `@cascivo/i18n`/`@cascivo/charts` stay advisory since not every project uses them, and an\n * `unknown` path emits nothing at all rather than guessing.\n */\nexport function checkProjectDependencies(cwd: string): DependencyFinding[] {\n let deps: Record<string, unknown> = {}\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n return [] // No readable package.json — nothing reliable to advise on.\n }\n const path = detectInstallPath(cwd)\n if (path === 'unknown') return []\n\n const pm = detectPackageManager(cwd)\n const findings: DependencyFinding[] = []\n\n const required = path === 'prebuilt' ? REQUIRED_PREBUILT_DEPS : REQUIRED_RUNTIME_DEPS\n for (const pkg of required) {\n if (deps[pkg] === undefined) {\n findings.push({\n package: pkg,\n required: true,\n hint: `detected ${path} install path — ${installHint(pm, [pkg])}`,\n })\n }\n }\n\n // Only meaningful on a pure prebuilt app. A hybrid legitimately needs `@cascivo/core`\n // for its copied source, so flagging it there would recreate the bug in mirror image.\n if (path === 'prebuilt') {\n for (const [pkg, reason] of Object.entries(FORBIDDEN_PREBUILT_DEPS)) {\n if (deps[pkg] !== undefined) {\n findings.push({ package: pkg, required: true, kind: 'forbidden', hint: reason })\n }\n }\n }\n\n for (const pkg of ON_DEMAND_DEPS) {\n if (deps[pkg] === undefined) {\n findings.push({ package: pkg, required: false, hint: installHint(pm, [pkg]) })\n }\n }\n return findings\n}\n\n/**\n * Two copies of `@cascivo/core` in one install.\n *\n * `@cascivo/react` and `@cascivo/charts` each depend on `@cascivo/core`, and the family\n * versions independently on 0.x. If their ranges do not overlap, the package manager\n * resolves a nested second copy — and because cascivo's reactivity is a module-level signal\n * registry, two copies means two registries: a signal written through one is invisible to\n * components subscribed through the other. Nothing errors. Handlers fire and the UI does\n * not move, which is the single hardest cascivo symptom to diagnose.\n *\n * Turning that into a named finding is the cheap half of the version-sprawl problem\n * (lockstep versioning is the expensive half, and is a policy decision).\n */\nexport interface DuplicateCoreFinding {\n /** Version at the install root, if any. */\n root: string | null\n /** Nested copies, as `<owner> → <version>`. */\n nested: string[]\n hint: string\n}\n\n/** Packages that carry their own `@cascivo/core` dependency. */\nconst CORE_DEPENDENTS = ['@cascivo/react', '@cascivo/charts', '@cascivo/flow', '@cascivo/editor']\n\nexport async function checkDuplicateCore(cwd: string): Promise<DuplicateCoreFinding | null> {\n const root = await readInstalledPackageVersion(cwd, '@cascivo/core')\n const nested: string[] = []\n for (const owner of CORE_DEPENDENTS) {\n const ownerRoot = join(cwd, 'node_modules', owner)\n if (!existsSync(ownerRoot)) continue\n const version = await readInstalledPackageVersion(ownerRoot, '@cascivo/core')\n // A nested copy only matters when it differs from the hoisted one.\n if (version !== null && version !== root) nested.push(`${owner} → ${version}`)\n }\n if (nested.length === 0) return null\n return {\n root,\n nested,\n hint:\n 'Align the @cascivo/* versions (they are released together — see breaking-changes.json) ' +\n 'and reinstall. Two copies of @cascivo/core means two signal registries: writes through ' +\n 'one are invisible to components subscribed through the other, with no error.',\n }\n}\n\nexport interface SignalsCompatFinding {\n /** 'error' = a runtime break (React 19 + signals <3); 'warning' = works but upgrade advised. */\n severity: 'error' | 'warning'\n detail: string\n hint: string\n}\n\n/**\n * Checks the installed `@preact/signals-react` against the installed React.\n * React 19 removed the `__SECRET_INTERNALS…` export that signals-react 2.x\n * imports, so a 2.x runtime on React 19 dies with a `SyntaxError` at module\n * evaluation (the 2026-07-20 report's blocker #2). cascivo peer-depends on\n * `>=3.0.0`, but a lockfile carried over from an earlier install can still pin\n * 2.x — this turns that into a diagnosed condition with a fix. Returns null when\n * either package is absent/unreadable (nothing reliable to advise on) or the\n * pairing is fine.\n */\nexport async function checkSignalsCompat(cwd: string): Promise<SignalsCompatFinding | null> {\n const [signals, react] = await Promise.all([\n readInstalledPackageVersion(cwd, '@preact/signals-react'),\n readInstalledPackageVersion(cwd, 'react'),\n ])\n if (signals === null) return null\n let signalsBelow3: boolean\n try {\n signalsBelow3 = compareVersions(signals, '3.0.0') < 0\n } catch {\n return null // unparsable installed signals version — don't advise on it\n }\n if (!signalsBelow3) return null\n const pm = detectPackageManager(cwd)\n const hint = installHint(pm, ['@preact/signals-react@^3'])\n let reactMajor: number | null = null\n if (react !== null) {\n const m = /^(\\d+)\\./.exec(react.trim())\n reactMajor = m ? Number(m[1]) : null\n }\n if (reactMajor !== null && reactMajor >= 19) {\n return {\n severity: 'error',\n detail: `@preact/signals-react ${signals} cannot run on React ${react} — React 19 removed an internal signals 2.x imports, so it fails at module load. Upgrade to signals-react 3.x.`,\n hint,\n }\n }\n return {\n severity: 'warning',\n detail: `@preact/signals-react ${signals} is below the required 3.x floor. It works on React 18 today but breaks the moment you move to React 19; upgrade now.`,\n hint,\n }\n}\n\n/** Vite SSR frameworks whose default setup needs `ssr.noExternal` for cascivo. */\nconst VITE_SSR_MARKERS = ['@tanstack/react-start', 'vite-ssr', '@remix-run/dev']\nconst VITE_CONFIG_FILES = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs', 'vite.config.mts']\n\n/**\n * Advisory: on a Vite SSR framework, cascivo's per-component `.css` side-effect\n * imports crash a bare server-side ESM loader unless the packages are marked\n * `ssr.noExternal` (or the `cascivoSsr()` plugin is used). This warns when a known\n * Vite SSR framework is present but no vite config mentions either — the exact\n * cliff the 2026-07-20 report hit (blocker #1). A text match, not a gate. Returns\n * null when there's no Vite SSR framework or the config already handles it.\n */\n/**\n * Warn when the vendored components dir is not excluded from the project's formatter.\n *\n * Owning the code means your formatter rewrites it, and `cascivo update` then reports drift\n * on files you never edited. `cascivo init` writes the exclusion for you, but a project that\n * adopted cascivo before that existed — or that added Prettier afterwards — never got it.\n */\nexport function checkFormatterIgnore(cwd: string, outputDir: string): string | null {\n const pairs = [\n {\n configs: ['.prettierrc', '.prettierrc.json', '.prettierrc.js', 'prettier.config.js'],\n ignore: '.prettierignore',\n },\n { configs: ['.oxfmtrc', '.oxfmtrc.json'], ignore: '.oxfmtignore' },\n ]\n const dir = outputDir.replace(/\\/+$/, '')\n for (const { configs, ignore } of pairs) {\n if (!configs.some((f) => existsSync(join(cwd, f)))) continue\n let content = ''\n try {\n content = readFileSync(join(cwd, ignore), 'utf8')\n } catch {\n /* no ignore file at all */\n }\n if (content.split('\\n').some((l) => l.trim().replace(/\\/+$/, '') === dir)) continue\n return (\n `\"${dir}/\" is not excluded from your formatter. Running it will rewrite code you own, ` +\n `and \\`cascivo update\\` will then report drift on files you never edited. ` +\n `Add \"${dir}/\" to ${ignore}.`\n )\n }\n return null\n}\n\nexport function checkSsrConfig(cwd: string): string | null {\n let deps: Record<string, unknown> = {}\n try {\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n deps = { ...pkg.dependencies, ...pkg.devDependencies }\n } catch {\n return null\n }\n const framework = VITE_SSR_MARKERS.find((m) => deps[m] !== undefined)\n if (framework === undefined) return null\n\n for (const file of VITE_CONFIG_FILES) {\n const path = join(cwd, file)\n if (!existsSync(path)) continue\n const config = readFileSync(path, 'utf8')\n // Either the manual noExternal entry or the cascivoSsr() plugin counts.\n if (/noExternal/.test(config) && /@cascivo/.test(config)) return null\n if (/cascivoSsr/.test(config)) return null\n }\n return (\n `${framework} is a Vite SSR framework, but no vite config marks the cascivo ` +\n `packages ssr.noExternal — an unconfigured SSR build crashes with ` +\n `\\`Unknown file extension \".css\"\\`. Add \\`ssr: { noExternal: [/^@cascivo\\\\//] }\\` ` +\n `(or the cascivoSsr() plugin from @cascivo/vite-plugin). ` +\n `Recipe: https://cascivo.com/docs/using-with-vite-ssr.md`\n )\n}\n\nconst BANNED_HOOKS = ['useState', 'useEffect', 'useLayoutEffect', 'useContext', 'useReducer']\n\n/**\n * Blank out comments and string/template-literal contents so identifier scans\n * only match real code. A mention of `useEffect` in a comment must not trip\n * the no-react-hooks rule. Single pass — a `//` inside a string (URLs) is not\n * treated as a comment.\n */\nexport function stripCommentsAndStrings(source: string): string {\n let out = ''\n let i = 0\n const n = source.length\n while (i < n) {\n const c = source[i]!\n const next = source[i + 1]\n if (c === '/' && next === '/') {\n while (i < n && source[i] !== '\\n') i++\n } else if (c === '/' && next === '*') {\n i += 2\n while (i < n && !(source[i] === '*' && source[i + 1] === '/')) i++\n i += 2\n } else if (c === \"'\" || c === '\"') {\n i++\n while (i < n && source[i] !== c) {\n if (source[i] === '\\\\') i++\n i++\n }\n i++\n out += c + c\n } else if (c === '`') {\n i++\n while (i < n && source[i] !== '`') {\n if (source[i] === '\\\\') i++\n i++\n }\n i++\n out += '``'\n } else {\n out += c\n i++\n }\n }\n return out\n}\n\nexport async function runDoctor(root: string): Promise<DoctorResult> {\n const violations: DoctorViolation[] = []\n const componentsDir = join(root, 'packages', 'components', 'src')\n if (!existsSync(componentsDir)) return { violations: [], passed: true }\n\n const components = readdirSync(componentsDir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n\n const reactIndex = join(root, 'packages', 'react', 'src', 'index.ts')\n const indexContent = existsSync(reactIndex) ? readFileSync(reactIndex, 'utf8') : ''\n\n for (const name of components) {\n const tsxPath = join(componentsDir, name, `${name}.tsx`)\n if (!existsSync(tsxPath)) continue\n const content = readFileSync(tsxPath, 'utf8')\n // Hook scan runs on code only; the aria-label scan below needs the\n // original source because it matches inside JSX string attributes.\n const code = stripCommentsAndStrings(content)\n\n for (const hook of BANNED_HOOKS) {\n if (new RegExp(`\\\\b${hook}\\\\b`).test(code)) {\n violations.push({\n file: tsxPath,\n rule: 'no-react-hooks',\n detail: `Banned hook '${hook}' in ${name}.tsx`,\n })\n }\n }\n\n if (/aria-label=\"[A-Z]/.test(content)) {\n violations.push({\n file: tsxPath,\n rule: 'no-hardcoded-strings',\n detail: `Hardcoded aria-label in ${name}.tsx — use t(builtin.*)`,\n })\n }\n\n if (!new RegExp(`from.*components/src/${name}`).test(indexContent)) {\n violations.push({\n file: tsxPath,\n rule: 'missing-react-export',\n detail: `${name} not exported from @cascivo/react`,\n })\n }\n }\n\n return { violations, passed: violations.length === 0 }\n}\n","import { writeFileSync } from 'node:fs'\nimport { basename, dirname, join } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\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 state?: Record<string, string | number | boolean | null>\n view: {\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\n/** A JS literal for a state initial value. */\nfunction serializeInitial(value: string | number | boolean | null): string {\n return typeof value === 'string' ? `'${value.replace(/'/g, \"\\\\'\")}'` : String(value)\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 if (ref.startsWith('$state.')) {\n propParts.push(`${k}={${ref.slice('$state.'.length)}.value}`)\n } else {\n propParts.push(`${k}={data.${ref.replace(/^\\$data\\./, '')}}`)\n }\n }\n }\n\n if (node.events) {\n for (const [k, ref] of Object.entries(node.events)) {\n if (ref.startsWith('$state.set.')) {\n const key = ref.slice('$state.set.'.length)\n propParts.push(`${k}={(e) => (${key}.value = coerceValue(e))}`)\n } else if (ref.startsWith('$state.toggle.')) {\n const key = ref.slice('$state.toggle.'.length)\n propParts.push(`${k}={() => (${key}.value = !${key}.value)}`)\n } else {\n propParts.push(`${k}={actions.${ref.replace(/^\\$actions\\./, '')}}`)\n }\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 if (ref.startsWith('$state.')) continue // view-local state, not a host-data prop\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 if (ref.startsWith('$state.')) continue // state writer, not a host action\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\n/** True if any node writes state via \"$state.set.*\" (needs the coerceValue helper). */\nfunction usesStateSetter(nodes: ComponentNode[]): boolean {\n const walk = (node: ComponentNode): boolean => {\n if (node.events && Object.values(node.events).some((r) => r.startsWith('$state.set.'))) {\n return true\n }\n return Array.isArray(node.children) ? node.children.some(walk) : false\n }\n return nodes.some(walk)\n}\n\nexport function 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 const stateEntries = Object.entries(config.state ?? {})\n const hasState = stateEntries.length > 0\n const needsCoerce = usesStateSetter(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 const coreImport = hasState ? \"\\nimport { useSignal, useSignals } from '@cascivo/core'\" : ''\n const coerceHelper = needsCoerce\n ? `\n/** Unwrap a DOM event into the value a state setter should store. */\nfunction coerceValue(e: unknown) {\n const t = (e as { target?: { type?: string; checked?: boolean; value?: unknown } })?.target\n if (t) return t.type === 'checkbox' || t.type === 'radio' ? t.checked : t.value\n return e\n}\n`\n : ''\n const stateDecls = hasState\n ? ' useSignals()\\n' +\n stateEntries.map(([k, v]) => ` const ${k} = useSignal(${serializeInitial(v)})`).join('\\n') +\n '\\n'\n : ''\n\n return `import React from 'react'${coreImport}\n${importLines}\n${coerceHelper}\ninterface PageProps ${propsType}\n\nexport function GeneratedPage({ ${hasData ? 'data, ' : ''}${hasActions ? 'actions' : ''} }: PageProps) {\n${stateDecls} 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 are not available from the CLI registry type, so this passes an empty map.\n // (There used to be a `fetchRegistry` call here whose result was discarded — a network\n // round-trip on every `cascivo generate` that fed nothing. `noUnusedLocals` surfaced it.)\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 { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport {\n DEFAULT_CONFIG,\n detectPackageManager,\n installHint,\n THEMES,\n type ThemeName,\n} from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\nimport { flagValue, resolvePackageManagerFlag } from '../utils/args.js'\n\n/**\n * Everything an app needs to build with copied cascivo source: the runtime\n * packages plus the `@preact/signals-react` peer of `@cascivo/core` (installed\n * explicitly rather than relying on peer auto-linking, which yarn never does and\n * npm skips when its install crashes). `@cascivo/i18n`/`@cascivo/charts` are\n * added on demand by `cascivo add` when a component or chart declares them.\n */\nconst RUNTIME_DEPS = [\n '@cascivo/core',\n '@cascivo/tokens',\n '@cascivo/themes',\n '@preact/signals-react',\n]\n\n/** Dev-only: `cascivo` provides the `CascadeConfig` type the generated config imports. */\nconst DEV_DEPS = ['cascivo']\n\nasync function promptTheme(): Promise<ThemeName> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question(`Theme? (${THEMES.join('/')}) [light]: `))\n .trim()\n .toLowerCase()\n return (THEMES as readonly string[]).includes(answer) ? (answer as ThemeName) : 'light'\n } finally {\n rl.close()\n }\n}\n\nfunction configFileContents(theme: ThemeName): string {\n return `import type { CascadeConfig } from 'cascivo'\n\nconst config: CascadeConfig = {\n registry: '${DEFAULT_CONFIG.registry}',\n outputDir: '${DEFAULT_CONFIG.outputDir}',\n theme: '${theme}',\n}\n\nexport default config\n`\n}\n\nconst ESLINT_CONFIGS = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n '.eslintrc',\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n]\n\n/**\n * Copied cascivo source can trip a strict host ESLint config on stylistic rules.\n * If the project has an ESLint config, point at the scoping recipe rather than\n * editing the adopter's config for them.\n */\nfunction hintEslintIfPresent(cwd: string): void {\n if (!ESLINT_CONFIGS.some((f) => existsSync(join(cwd, f)))) return\n console.log('\\nESLint: copied cascivo source may trip a strict host config on stylistic rules.')\n console.log(' Scope them off your components dir — see docs/USING-WITH-STRICT-ESLINT.md')\n}\n\n/**\n * Write dependency entries into `package.json` so a failed install still leaves a\n * DECLARATIVE-complete project, one `install` away from working.\n *\n * The reported failure: one unrelated bad version range elsewhere in the adopter's\n * `package.json` made `pnpm add` exit non-zero. cascivo had already written\n * `cascivo.config.ts`, so the project claimed to be cascivo-configured with none of the\n * runtime present, and the printed advice (\"install them yourself\") was the same command\n * that had just failed. Recording the dependencies is the difference between \"recoverable\n * with one command\" and \"figure out what was supposed to be here\".\n *\n * Never overwrites an entry that already exists — the app's own pin wins.\n */\nfunction recordDependencies(cwd: string, packages: string[], opts: { dev: boolean }): string[] {\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return []\n let pkg: Record<string, unknown>\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n } catch {\n return []\n }\n const field = opts.dev ? 'devDependencies' : 'dependencies'\n const deps = (pkg[field] ??= {}) as Record<string, string>\n const added: string[] = []\n for (const name of packages) {\n if (deps[name] !== undefined) continue\n deps[name] = 'latest'\n added.push(name)\n }\n if (added.length === 0) return []\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\n return added\n}\n\n/** Formatter ignore files, in the order a project is likely to use them. */\nconst FORMATTER_IGNORES = [\n {\n config: ['.prettierrc', '.prettierrc.json', '.prettierrc.js', 'prettier.config.js'],\n ignore: '.prettierignore',\n },\n { config: ['.oxfmtrc', '.oxfmtrc.json'], ignore: '.oxfmtignore' },\n] as const\n\n/**\n * Exclude the vendored components dir from the project's formatter.\n *\n * Owning the code means your formatter reformats it, and then `cascivo update` reports drift\n * on files you never touched. This ACTS rather than hints: the ESLint equivalent below only\n * prints a pointer, and an adopter ran `prettier --write .` before ever reading it.\n *\n * Idempotent, and never rewrites an existing line.\n */\nfunction ensureFormatterIgnore(cwd: string, outputDir: string): void {\n const line = `${outputDir.replace(/\\/+$/, '')}/`\n for (const { config, ignore } of FORMATTER_IGNORES) {\n const hasFormatter =\n config.some((f) => existsSync(join(cwd, f))) || hasPrettierKeyInPackageJson(cwd, ignore)\n if (!hasFormatter) continue\n\n const path = join(cwd, ignore)\n const current = existsSync(path) ? readFileSync(path, 'utf8') : ''\n if (current.split('\\n').some((l) => l.trim() === line)) continue\n\n const banner = '# cascivo: vendored component source — you own it, so do not reformat it\\n'\n const next =\n current === '' ? banner + line + '\\n' : `${current.replace(/\\n*$/, '\\n')}\\n${banner}${line}\\n`\n writeFileSync(path, next, 'utf8')\n console.log(\n `\\nAdded \"${line}\" to ${ignore} (so your formatter does not rewrite copied source).`,\n )\n }\n}\n\n/** `prettier` key in package.json counts as a Prettier config — only relevant to .prettierignore. */\nfunction hasPrettierKeyInPackageJson(cwd: string, ignore: string): boolean {\n if (ignore !== '.prettierignore') return false\n const pkgPath = join(cwd, 'package.json')\n if (!existsSync(pkgPath)) return false\n try {\n return 'prettier' in (JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>)\n } catch {\n return false\n }\n}\n\n/** The \"here's everything you need\" summary, printed once at the end of init. */\nfunction printDependencySummary(): void {\n console.log('\\nDependencies')\n console.log(` runtime: ${RUNTIME_DEPS.join(' ')}`)\n console.log(` dev: ${DEV_DEPS.join(' ')} (types for cascivo.config.ts)`)\n console.log(\n ' on demand: @cascivo/i18n, @cascivo/charts — added by `cascivo add` when a component or chart needs them',\n )\n}\n\nexport async function init(args: string[] = [], cwd: string = process.cwd()): Promise<void> {\n const yes = args.includes('--yes') || args.includes('-y')\n const noInstall = args.includes('--no-install')\n const themeArg = flagValue(args, 'theme')?.toLowerCase()\n\n if (themeArg !== undefined && !(THEMES as readonly string[]).includes(themeArg)) {\n console.error(`Unknown theme \"${themeArg}\". Available: ${THEMES.join(', ')}`)\n process.exitCode = 1\n return\n }\n\n const pmFlag = resolvePackageManagerFlag(args)\n if ('error' in pmFlag) {\n console.error(pmFlag.error)\n process.exitCode = 1\n return\n }\n const pm = detectPackageManager(cwd, pmFlag.pm ? { override: pmFlag.pm } : {})\n\n // Prompt only when interactive: --yes, a valid --theme, or a non-TTY stdin\n // (CI, agents, pipes) all take the default without blocking.\n const interactive = themeArg === undefined && !yes && stdin.isTTY\n const theme: ThemeName = (themeArg as ThemeName) ?? (interactive ? await promptTheme() : 'light')\n\n // Write the config before installing so a failed install can never leave a\n // half-initialized project (the report's npm-in-pnpm crash left exactly this).\n const configPath = join(cwd, 'cascivo.config.ts')\n await writeFileSafe(configPath, configFileContents(theme))\n console.log(`\\nCreated cascivo.config.ts (theme: ${theme})`)\n\n if (noInstall) {\n console.log('\\nSkipped install (--no-install). Install the dependencies yourself:')\n console.log(` ${installHint(pm, RUNTIME_DEPS)}`)\n console.log(` ${installHint(pm, DEV_DEPS, { dev: true })}`)\n } else {\n const runtimeOk = installPackages(RUNTIME_DEPS, cwd, { pm })\n const devOk = installPackages(DEV_DEPS, cwd, { pm, dev: true })\n if (!runtimeOk || !devOk) {\n // Never leave a project \"configured but not installed\". Record what it needs, say\n // plainly what state it is in, and give a command that is not the one that just failed.\n const recorded = [\n ...(runtimeOk ? [] : recordDependencies(cwd, RUNTIME_DEPS, { dev: false })),\n ...(devOk ? [] : recordDependencies(cwd, DEV_DEPS, { dev: true })),\n ]\n console.error(\n '\\nInstall failed — cascivo.config.ts was written but the packages are not installed.',\n )\n if (recorded.length > 0) {\n console.error(\n `Wrote ${recorded.length} dependency entries to package.json: ${recorded.join(', ')}`,\n )\n console.error(`Recover with:\\n ${pm} install`)\n } else {\n console.error(\n `Recover with:\\n ${installHint(pm, RUNTIME_DEPS)}\\n ${installHint(pm, DEV_DEPS, { dev: true })}`,\n )\n }\n process.exitCode = 1\n }\n }\n\n // The COMPLETE stylesheet wiring, in import order. Printing only the theme line left an\n // adopter to discover the tokens sheet by debugging a grayscale app, and the charts sheet\n // by shipping a chart whose screen-reader data table rendered visibly.\n console.log('\\nStylesheets — import these once, in this order, in your entry file:')\n console.log(\n ` import '@cascivo/tokens' // primitive tokens — every --cascivo-* value`,\n )\n console.log(\n ` import '@cascivo/themes/${theme}.css'${' '.repeat(Math.max(1, 16 - theme.length))}// the ${theme} theme's semantic values`,\n )\n console.log(\n ` // …then your component CSS (\\`cascivo add\\` writes .module.css beside each component)`,\n )\n console.log('\\nThen set the theme on your root element:')\n console.log(` <html data-theme=\"${theme}\">`)\n console.log('\\nSwitching themes at runtime? Use a bundle instead of the single theme:')\n console.log(\" import '@cascivo/themes/light-dark.css' // light + dark — the common case\")\n console.log(\" import '@cascivo/themes/all.css' // all twelve themes\")\n console.log(\" import { ThemeProvider } from '@cascivo/core'\")\n // The single most likely first-day bug, and it has no error message: a component that\n // reads `signal.value` in render never re-renders without this, so handlers fire and the\n // UI just sits there. Consumer apps run no signals transform, so it is never automatic.\n console.log('\\nIn YOUR components, when you read a signal during render:')\n console.log(\" import { useSignals } from '@cascivo/core'\")\n console.log(' function MyComponent() {')\n console.log(' useSignals() // ← first statement, or the component never re-renders')\n console.log(' return <span>{count.value}</span>')\n console.log(' }')\n console.log('\\nAdding a chart later? Charts ship as an npm package with their own stylesheet:')\n console.log(\" import '@cascivo/charts/styles.css' // `cascivo add <chart>` reminds you\")\n\n printDependencySummary()\n ensureFormatterIgnore(cwd, DEFAULT_CONFIG.outputDir)\n hintEslintIfPresent(cwd)\n\n console.log('\\nAdd components with: cascivo add <name>')\n}\n","import { existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry, type RegistryComponent } from '../utils/registry.js'\n\nexport interface ListOptions {\n installed?: boolean\n}\n\nconst TYPE_LABELS: Record<string, string> = {\n component: 'Components',\n layout: 'Layouts (copy-paste)',\n block: 'Blocks (copy-paste)',\n section: 'Sections (copy-paste)',\n chart: 'Charts (npm: @cascivo/charts)',\n flow: 'Flow (npm: @cascivo/flow)',\n editor: 'Editor (npm: @cascivo/editor)',\n}\n\n/**\n * Deprecation marker for the listing.\n *\n * Shown at DISCOVERY time on purpose. `overflow-menu` carried a `@deprecated` JSDoc in its\n * source for months, which an adopter only meets after they have already vendored the file —\n * and it pointed at an import path that cannot resolve on either install path.\n */\nexport function deprecationSuffix(c: RegistryComponent): string {\n return c.deprecated ? ` ⚠ deprecated → ${c.deprecated.replacement}` : ''\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(\n (c) => [c.name, c.category, c.description + deprecationSuffix(c)] as const,\n )\n const headers = ['Name', 'Category', 'Description'] as const\n const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? '').length)))\n\n const line = (cells: readonly string[]) =>\n cells\n .map((cell, i) => cell.padEnd(widths[i] ?? cell.length))\n .join(' ')\n .trimEnd()\n\n const sep = widths.map((w) => '-'.repeat(w)).join(' ')\n return [line(headers), sep, ...rows.map(line)].join('\\n')\n}\n\n/** Render the component list as an aligned text table, grouped by type. */\nexport function formatList(components: RegistryComponent[]): string {\n if (components.length === 0) return 'No components found.'\n\n // Determine whether any entry has an explicit type — if not, render flat.\n const hasTypes = components.some((c) => c.type !== undefined)\n if (!hasTypes) return formatGroup(components)\n\n // Group by type, preserving insertion order of first occurrence.\n const groups = new Map<string, RegistryComponent[]>()\n for (const c of components) {\n const key = c.type ?? 'component'\n if (!groups.has(key)) groups.set(key, [])\n groups.get(key)!.push(c)\n }\n\n const sections: string[] = []\n for (const [key, entries] of groups) {\n const label = TYPE_LABELS[key] ?? key\n sections.push(`${label}\\n${formatGroup(entries)}`)\n }\n return sections.join('\\n\\n')\n}\n\nexport async function list(config: CascadeConfig, options: ListOptions = {}): Promise<void> {\n const registry = await fetchRegistry(config.registry)\n let components = registry.components\n\n if (options.installed) {\n components = components.filter((c) => {\n const outputName = c.name.includes('/') ? c.name.split('/').pop()! : c.name\n return existsSync(join(process.cwd(), config.outputDir, outputName))\n })\n }\n\n console.log(formatList(components))\n console.log(\n '\\nTip: install any entry by its bare name — `cascivo add flex` resolves to ' +\n '`layout/flex`. Layout primitives (Flex, Grid, AutoGrid, Columns, Spacer, ' +\n 'Center) replace inline-style layout; see docs/cookbooks/layout-and-spacing.md.',\n )\n}\n","import { existsSync } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { resolve, dirname } from 'node:path'\nimport {\n buildRegistry,\n validateIndex,\n parseLegacyRegistry,\n isTemplateItem,\n validateTemplate,\n type RegistryIndex,\n} from '@cascivo/registry'\n\n/**\n * Validate every template item in an index: each must pass `validateTemplate`,\n * and any bare `registryDependencies` not present in the same index produce a\n * warning (they are expected to resolve from another registry at install time).\n * Returns `{ errors, warnings }`.\n */\nexport function validateTemplates(index: RegistryIndex): { errors: string[]; warnings: string[] } {\n const errors: string[] = []\n const warnings: string[] = []\n const localNames = new Set(index.items.map((i) => i.name))\n\n for (const item of index.items) {\n if (!isTemplateItem(item)) continue\n for (const e of validateTemplate(item)) errors.push(`template \"${item.name}\": ${e}`)\n for (const dep of item.registryDependencies ?? []) {\n const isCrossRegistry = dep.includes('/') || dep.startsWith('@') || dep.startsWith('http')\n if (!isCrossRegistry && !localNames.has(dep)) {\n warnings.push(\n `template \"${item.name}\": component \"${dep}\" is not in this index — it must resolve from another registry at install time`,\n )\n }\n }\n }\n\n return { errors, warnings }\n}\n\nexport async function registryBuild(args: string[]): Promise<void> {\n let inFile = 'cascade-registry.json'\n let outDir = 'public/r'\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--in' && args[i + 1]) {\n inFile = args[i + 1]!\n i++\n } else if (args[i] === '--out' && args[i + 1]) {\n outDir = args[i + 1]!\n i++\n }\n }\n\n const inPath = resolve(inFile)\n if (!existsSync(inPath)) {\n console.error(`cascade registry build: file not found: ${inPath}`)\n process.exitCode = 1\n return\n }\n\n const raw = JSON.parse(await readFile(inPath, 'utf8')) as unknown\n const indexBase = dirname(inPath)\n void indexBase\n\n let index = (() => {\n if (\n typeof raw === 'object' &&\n raw !== null &&\n (raw as Record<string, unknown>)['schemaVersion'] === 2\n ) {\n return raw\n }\n return parseLegacyRegistry(raw)\n })()\n\n const result = validateIndex(index)\n if (result.warnings.length > 0) {\n for (const w of result.warnings) console.warn(`warn: ${w}`)\n }\n if (!result.ok) {\n for (const e of result.errors) console.error(`error: ${e}`)\n process.exitCode = 1\n return\n }\n\n const templateResult = validateTemplates(index as RegistryIndex)\n for (const w of templateResult.warnings) console.warn(`warn: ${w}`)\n if (templateResult.errors.length > 0) {\n for (const e of templateResult.errors) console.error(`error: ${e}`)\n process.exitCode = 1\n return\n }\n\n const outPath = resolve(outDir)\n await buildRegistry(index as Parameters<typeof buildRegistry>[0], outPath)\n console.log(`cascade registry build: wrote static output to ${outPath}`)\n}\n","import type { CascadeConfig } from '../utils/config.js'\nimport { fetchRegistry } from '../utils/registry.js'\nimport { fetchJson } from '../utils/http.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\ninterface SearchResult {\n name: string\n version: string\n description: string\n registry?: string\n}\n\nfunction matchesQuery(item: RegistryItem, query: string): boolean {\n const q = query.toLowerCase()\n return (\n item.name.toLowerCase().includes(q) ||\n item.description.toLowerCase().includes(q) ||\n item.tags.some((t) => t.toLowerCase().includes(q))\n )\n}\n\nexport async function search(args: string[], config: CascadeConfig): Promise<void> {\n const nsFlag = args.indexOf('--registry')\n const registryFilter = nsFlag !== -1 ? args[nsFlag + 1] : undefined\n const queryParts = args.filter((a, i) => a !== '--registry' && args[i - 1] !== '--registry')\n const query = queryParts.join(' ').trim()\n\n if (!query) {\n console.error('Usage: cascivo search <query> [--registry @ns]')\n return\n }\n\n const results: SearchResult[] = []\n\n if (!registryFilter) {\n // Search default registry\n const registry = await fetchRegistry(config.registry)\n for (const c of registry.components) {\n const item = c as unknown as RegistryItem\n if (matchesQuery(item, query)) {\n results.push({ name: c.name, version: c.version, description: c.description })\n }\n }\n }\n\n // Search configured namespace registries\n const registries = config.registries ?? {}\n for (const [ns, nsCfg] of Object.entries(registries)) {\n if (registryFilter && ns !== registryFilter) continue\n try {\n const template = typeof nsCfg === 'string' ? nsCfg : nsCfg.url\n const indexUrl = template.replace(/{name}[^$]*$/, '').replace(/\\/$/, '') + '/registry.json'\n const raw = (await fetchJson(indexUrl)) as { items?: RegistryItem[] }\n for (const item of raw.items ?? []) {\n if (matchesQuery(item, query)) {\n results.push({\n name: `${ns}/${item.name}`,\n version: item.version,\n description: item.description,\n registry: ns,\n })\n }\n }\n } catch {\n console.warn(` [warn] Could not search ${ns} registry`)\n }\n }\n\n if (results.length === 0) {\n console.log('No results found.')\n return\n }\n\n for (const r of results) {\n const reg = r.registry ? ` (${r.registry})` : ''\n console.log(`${r.name}@${r.version}${reg} — ${r.description}`)\n }\n}\n","export type FontFamily = 'system' | 'geometric' | 'humanist' | 'transitional' | 'mono'\n\nexport const RADIUS_STOPS = [0, 0.25, 0.375, 0.5, 0.75, 1.5] as const\nexport type RadiusStop = (typeof RADIUS_STOPS)[number]\n\nexport const RADIUS_LABELS: Record<RadiusStop, string> = {\n 0: 'none',\n 0.25: 'sm',\n 0.375: 'md',\n 0.5: 'lg',\n 0.75: 'xl',\n 1.5: 'pill',\n}\n\nexport type ThemeConfig = {\n baseMode: 'light' | 'dark'\n accentHue: number\n accentChroma: number\n radiusBase: RadiusStop\n fontFamily: FontFamily\n presetId: string | null\n}\n\nexport const DEFAULT_CONFIG: ThemeConfig = {\n baseMode: 'light',\n accentHue: 250,\n accentChroma: 0.2,\n radiusBase: 0.375,\n fontFamily: 'system',\n presetId: 'light',\n}\n","import { DEFAULT_CONFIG, type ThemeConfig } from './config.js'\n\n/** Encode a theme config as a URL-safe base64 string (shared by the /create URL\n * hash and the CLI `--from` handoff, so the two never drift). */\nexport function configToHash(config: ThemeConfig): string {\n const json = JSON.stringify(config)\n return btoa(json).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/** Decode a hash produced by {@link configToHash}. Returns null on malformed\n * input; unknown/missing fields fall back to {@link DEFAULT_CONFIG}. */\nexport function hashToConfig(hash: string): ThemeConfig | null {\n if (!hash) return null\n try {\n const base64 = hash.replace(/-/g, '+').replace(/_/g, '/')\n const json = atob(base64)\n const parsed = JSON.parse(json) as Partial<ThemeConfig>\n return {\n baseMode: parsed.baseMode === 'dark' ? 'dark' : 'light',\n accentHue: typeof parsed.accentHue === 'number' ? parsed.accentHue : DEFAULT_CONFIG.accentHue,\n accentChroma:\n typeof parsed.accentChroma === 'number' ? parsed.accentChroma : DEFAULT_CONFIG.accentChroma,\n radiusBase: (typeof parsed.radiusBase === 'number'\n ? parsed.radiusBase\n : DEFAULT_CONFIG.radiusBase) as ThemeConfig['radiusBase'],\n fontFamily: parsed.fontFamily ?? DEFAULT_CONFIG.fontFamily,\n presetId: parsed.presetId ?? null,\n }\n } catch {\n return null\n }\n}\n","import type { ThemeConfig } from './config.js'\n\nconst FONT_STACKS: Record<string, string> = {\n geometric: \"'Futura', 'Century Gothic', 'Trebuchet MS', ui-sans-serif, sans-serif\",\n humanist: \"'Gill Sans', 'Trebuchet MS', 'Calibri', ui-sans-serif, sans-serif\",\n transitional: \"'Optima', 'Candara', 'Palatino Linotype', ui-sans-serif, sans-serif\",\n mono: \"ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace\",\n}\n\n// Resolved concrete values from packages/themes/src/light.css + primitives\nconst BASE_LIGHT = `\n color-scheme: light;\n --cascivo-color-background: oklch(1 0 0);\n --cascivo-color-surface: oklch(0.985 0.002 264);\n --cascivo-color-surface-2: oklch(0.967 0.003 264);\n --cascivo-color-bg: var(--cascivo-color-background);\n --cascivo-color-bg-subtle: var(--cascivo-color-surface);\n --cascivo-color-surface-raised: var(--cascivo-color-surface);\n --cascivo-color-surface-overlay: var(--cascivo-color-background);\n --cascivo-color-border: oklch(0.928 0.006 264);\n --cascivo-color-border-strong: oklch(0.872 0.008 264);\n --cascivo-border-subtle: oklch(0.928 0.006 264);\n --cascivo-border-default: oklch(0.872 0.008 264);\n --cascivo-border-strong: oklch(0.707 0.015 264);\n --cascivo-color-foreground: oklch(0.145 0.005 264);\n --cascivo-color-foreground-muted: oklch(0.554 0.018 264);\n --cascivo-color-text: var(--cascivo-color-foreground);\n --cascivo-color-text-subtle: oklch(0.446 0.018 264);\n --cascivo-color-text-muted: oklch(0.707 0.015 264);\n --cascivo-color-text-on-accent: oklch(1 0 0);\n --cascivo-color-text-on-destructive: oklch(1 0 0);\n --cascivo-color-primary: oklch(0.205 0 0);\n --cascivo-color-primary-fg: oklch(0.985 0 0);\n --cascivo-color-primary-hover: oklch(0.27 0 0);\n --cascivo-color-primary-active: oklch(0.32 0 0);\n --cascivo-color-active-bg: oklch(0.145 0.005 264 / 6%);\n --cascivo-color-destructive: oklch(0.54 0.188 22);\n --cascivo-color-destructive-hover: oklch(0.448 0.17 22);\n --cascivo-color-destructive-subtle: oklch(0.971 0.013 22);\n --cascivo-color-error: oklch(0.628 0.188 22);\n --cascivo-color-warning: oklch(0.768 0.145 75);\n --cascivo-color-success: oklch(0.648 0.15 145);\n --cascivo-color-success-subtle: oklch(0.982 0.018 145);\n --cascivo-color-warning-subtle: oklch(0.98 0.02 75);\n --cascivo-color-info: oklch(0.546 0.224 250);\n --cascivo-color-info-subtle: oklch(0.97 0.025 250);\n --cascivo-color-success-foreground: oklch(0.45 0.14 145);\n --cascivo-color-warning-foreground: oklch(0.5 0.14 75);\n --cascivo-shadow-xs: 0 1px 2px oklch(0 0 0 / 0.05);\n --cascivo-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.07), 0 1px 2px oklch(0 0 0 / 0.04);\n --cascivo-shadow-md: 0 2px 8px oklch(0 0 0 / 0.07), 0 1px 2px oklch(0 0 0 / 0.04);\n --cascivo-shadow-overlay: 0 4px 32px oklch(0 0 0 / 0.16), 0 0 0 1px oklch(0 0 0 / 0.04);\n --cascivo-shadow-lg: var(--cascivo-shadow-overlay);\n --cascivo-ring-width: 2px;\n --cascivo-ring-offset: 0px;\n --cascivo-ring-color: color-mix(in oklch, var(--cascivo-color-accent) 55%, transparent);\n --cascivo-focus-ring: 0 0 0 var(--cascivo-ring-width) var(--cascivo-ring-color);`\n\n// Resolved concrete values from packages/themes/src/dark.css + primitives\nconst BASE_DARK = `\n color-scheme: dark;\n --cascivo-color-background: oklch(0.145 0.005 250);\n --cascivo-color-surface: oklch(0.185 0.007 250);\n --cascivo-color-surface-2: oklch(0.22 0.008 250);\n --cascivo-color-bg: var(--cascivo-color-background);\n --cascivo-color-bg-subtle: var(--cascivo-color-surface);\n --cascivo-color-surface-raised: var(--cascivo-color-surface-2);\n --cascivo-color-surface-overlay: var(--cascivo-color-surface);\n --cascivo-color-border: oklch(1 0 0 / 10%);\n --cascivo-color-border-strong: oklch(1 0 0 / 16%);\n --cascivo-border-subtle: oklch(1 0 0 / 0.06);\n --cascivo-border-default: oklch(1 0 0 / 0.1);\n --cascivo-border-strong: oklch(1 0 0 / 0.2);\n --cascivo-color-foreground: oklch(0.985 0.002 264);\n --cascivo-color-foreground-muted: oklch(0.707 0.015 264);\n --cascivo-color-text: var(--cascivo-color-foreground);\n --cascivo-color-text-subtle: oklch(0.707 0.015 264);\n --cascivo-color-text-muted: oklch(0.554 0.018 264);\n --cascivo-color-text-on-accent: oklch(0.145 0.005 250);\n --cascivo-color-text-on-destructive: oklch(1 0 0);\n --cascivo-color-primary: oklch(0.922 0 0);\n --cascivo-color-primary-fg: oklch(0.205 0 0);\n --cascivo-color-primary-hover: oklch(0.86 0 0);\n --cascivo-color-primary-active: oklch(0.8 0 0);\n --cascivo-color-active-bg: oklch(1 0 0 / 8%);\n --cascivo-color-destructive: oklch(0.72 0.16 22);\n --cascivo-color-destructive-hover: oklch(0.628 0.188 22);\n --cascivo-color-destructive-subtle: oklch(0.628 0.188 22 / 0.1);\n --cascivo-color-error: oklch(0.72 0.16 22);\n --cascivo-color-warning: oklch(0.82 0.13 75);\n --cascivo-color-success: oklch(0.72 0.13 145);\n --cascivo-color-success-subtle: oklch(0.72 0.13 145 / 0.1);\n --cascivo-color-warning-subtle: oklch(0.82 0.13 75 / 0.1);\n --cascivo-color-info: oklch(0.65 0.2 250);\n --cascivo-color-info-subtle: oklch(0.65 0.2 250 / 0.1);\n --cascivo-color-success-foreground: oklch(0.72 0.13 145);\n --cascivo-color-warning-foreground: oklch(0.82 0.13 75);\n --cascivo-shadow-xs: none;\n --cascivo-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.4);\n --cascivo-shadow-md: 0 2px 8px oklch(0 0 0 / 0.45);\n --cascivo-shadow-overlay: 0 4px 32px oklch(0 0 0 / 0.6), 0 0 0 1px oklch(1 0 0 / 0.06);\n --cascivo-shadow-lg: var(--cascivo-shadow-overlay);\n --cascivo-ring-width: 2px;\n --cascivo-ring-offset: 0px;\n --cascivo-ring-color: color-mix(in oklch, var(--cascivo-color-accent) 65%, transparent);\n --cascivo-focus-ring: 0 0 0 var(--cascivo-ring-width) var(--cascivo-ring-color);`\n\nexport interface ConfigToCSSOptions {\n /** When true, inline the full base theme token set so the block is\n * self-contained (used by the live preview). The exported theme omits these —\n * users import the base theme themselves. */\n previewMode?: boolean\n /** The `data-theme` selector value the generated tokens attach to. */\n themeName?: string\n}\n\nexport function configToCSS(config: ThemeConfig, options: ConfigToCSSOptions = {}): string {\n const { previewMode = false, themeName = 'create-custom' } = options\n const light = config.baseMode === 'light'\n const h = config.accentHue\n const c = config.accentChroma\n\n const acc = (l: number, chroma = c) => `oklch(${l} ${chroma.toFixed(3)} ${h})`\n\n const lines: string[] = [\n `/* Add to your project CSS after importing the base theme: */`,\n `/* @import '@cascivo/themes/${config.baseMode}.css'; */`,\n `/* @import './theme.css'; */`,\n ``,\n `@layer cascivo.theme {`,\n ` [data-theme=\"${themeName}\"] {`,\n ]\n\n if (previewMode) {\n lines.push(light ? BASE_LIGHT : BASE_DARK)\n lines.push(``)\n }\n\n lines.push(\n ` /* ── Accent ─────────────────────────────────── */`,\n ` --cascivo-color-accent: ${acc(light ? 0.52 : 0.65)};`,\n ` --cascivo-color-accent-foreground: ${light ? 'oklch(1 0 0)' : `oklch(0.145 0.005 ${h})`};`,\n ` --cascivo-color-accent-hover: ${acc(light ? 0.45 : 0.707)};`,\n ` --cascivo-color-accent-active: ${acc(light ? 0.373 : 0.808, Math.min(c, 0.155))};`,\n ` --cascivo-color-accent-subtle: ${acc(light ? 0.97 : 0.623, 0.025)};`,\n ` --cascivo-color-accent-muted: ${acc(light ? 0.932 : 0.623, light ? 0.055 : c * 0.2)};`,\n ``,\n ` /* ── Radius ─────────────────────────────────── */`,\n ` --cascivo-radius-base: ${config.radiusBase}rem;`,\n ` --cascivo-radius-control: var(--cascivo-radius-base);`,\n ` --cascivo-radius-surface: calc(var(--cascivo-radius-base) * 1.66);`,\n ` --cascivo-radius-indicator: calc(var(--cascivo-radius-base) / 2);`,\n ` --cascivo-radius-full: 9999px;`,\n ` --cascivo-radius-component: var(--cascivo-radius-base);`,\n ` --cascivo-radius-button: var(--cascivo-radius-base);`,\n ` --cascivo-radius-input: var(--cascivo-radius-base);`,\n ` --cascivo-radius-card: calc(var(--cascivo-radius-base) * 1.66);`,\n ` --cascivo-radius-badge: var(--cascivo-radius-full);`,\n ` --cascivo-radius-modal: calc(var(--cascivo-radius-base) * 2);`,\n )\n\n if (config.fontFamily !== 'system') {\n lines.push(``)\n lines.push(` /* ── Font ───────────────────────────────────── */`)\n lines.push(\n ` --cascivo-font-sans: ${FONT_STACKS[config.fontFamily] ?? FONT_STACKS['humanist']};`,\n )\n }\n\n lines.push(` }`)\n lines.push(`}`)\n\n return lines.join('\\n')\n}\n","import { resolve } from 'node:path'\nimport { configToCSS, hashToConfig } from '@cascivo/theme-kit'\nimport { THEMES } from '../utils/config.js'\nimport { installPackages } from '../utils/exec.js'\nimport { writeFileSafe } from '../utils/fs.js'\n\nconst THEME_NAME_RE = /^[a-z][a-z0-9-]*$/\n\n/** Read a `--key value` or `--key=value` flag from an argv slice. */\nfunction flag(args: string[], key: string): string | undefined {\n const eq = args.find((a) => a.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = args.indexOf(`--${key}`)\n const next = idx !== -1 ? args[idx + 1] : undefined\n return next && !next.startsWith('--') ? next : undefined\n}\n\n/**\n * `cascivo theme create <name> --from <hash>` — turn a /create theme-builder\n * config (the `#hash` in the builder URL, or its \"Copy CLI command\" output) into\n * an owned `<name>.theme.css` in the project. Uses the same generator the builder\n * previews with, so the file matches the preview exactly.\n */\nasync function themeCreate(args: string[], cwd: string): Promise<void> {\n const name = args.find((a) => !a.startsWith('--'))\n const hash = flag(args, 'from')\n const dryRun = args.includes('--dry-run')\n\n if (!name || !hash) {\n console.error('Usage: cascivo theme create <name> --from <hash> [--out <path>]')\n console.error(\n 'Get <hash> from the theme builder at https://cascivo.com/create (Copy CLI command).',\n )\n return\n }\n if (!THEME_NAME_RE.test(name)) {\n console.error(`Invalid theme name \"${name}\". Use lowercase letters, digits, and dashes.`)\n return\n }\n\n const config = hashToConfig(hash)\n if (!config) {\n console.error('Could not decode --from. Copy the command again from the theme builder.')\n return\n }\n\n const css = configToCSS(config, { themeName: name })\n if (dryRun) {\n console.log(css)\n return\n }\n\n const outPath = resolve(cwd, flag(args, 'out') ?? `${name}.theme.css`)\n await writeFileSafe(outPath, css)\n\n console.log(`\\n✓ Wrote ${name}.theme.css`)\n console.log(`\\nImport the base theme and your overlay in your entry CSS:`)\n console.log(` @import '@cascivo/themes/${config.baseMode}.css';`)\n console.log(` @import './${name}.theme.css';`)\n console.log(`Then set it on a container:`)\n console.log(` <div data-theme=\"${name}\">…</div>`)\n}\n\nexport async function theme(args: string[]): Promise<void> {\n const [sub, name] = args\n\n if (sub === 'create') {\n await themeCreate(args.slice(1), process.cwd())\n return\n }\n\n if (sub !== 'add' || !name) {\n console.error(`Usage: cascivo theme add <${THEMES.join('|')}>`)\n console.error(` cascivo theme create <name> --from <hash>`)\n return\n }\n if (!(THEMES as readonly string[]).includes(name)) {\n console.error(`Unknown theme \"${name}\". Available: ${THEMES.join(', ')}`)\n return\n }\n\n installPackages(['@cascivo/themes'])\n\n console.log(`\\nImport the theme in your root CSS or entry file:`)\n console.log(` import '@cascivo/themes/${name}.css'`)\n console.log(`Then set it on a container:`)\n console.log(` <div data-theme=\"${name}\">…</div>`)\n}\n","/**\n * Minimal line-based diff (LCS) rendered in a unified-ish format. Zero deps —\n * good enough to preview what `cascade update` will change.\n */\nexport function diffLines(oldStr: string, newStr: string): string[] {\n const a = oldStr.split('\\n')\n const b = newStr.split('\\n')\n const n = a.length\n const m = b.length\n\n // LCS length table.\n const lcs: number[][] = Array.from({ length: n + 1 }, () =>\n Array.from({ length: m + 1 }, () => 0),\n )\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n lcs[i]![j] =\n a[i] === b[j] ? lcs[i + 1]![j + 1]! + 1 : Math.max(lcs[i + 1]![j]!, lcs[i]![j + 1]!)\n }\n }\n\n const out: string[] = []\n let i = 0\n let j = 0\n while (i < n && j < m) {\n if (a[i] === b[j]) {\n out.push(` ${a[i]}`)\n i++\n j++\n } else if (lcs[i + 1]![j]! >= lcs[i]![j + 1]!) {\n out.push(`- ${a[i]}`)\n i++\n } else {\n out.push(`+ ${b[j]}`)\n j++\n }\n }\n while (i < n) out.push(`- ${a[i++]}`)\n while (j < m) out.push(`+ ${b[j++]}`)\n return out\n}\n\n/** True when the two strings differ. */\nexport function hasChanges(oldStr: string, newStr: string): boolean {\n return oldStr !== newStr\n}\n","export interface MergeResult {\n text: string\n conflicts: number\n}\n\nfunction lcs(a: string[], b: string[]): number[][] {\n const m = a.length\n const n = b.length\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array.from({ length: n + 1 }, () => 0))\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i]![j] =\n a[i - 1] === b[j - 1] ? dp[i - 1]![j - 1]! + 1 : Math.max(dp[i - 1]![j]!, dp[i]![j - 1]!)\n }\n }\n return dp\n}\n\ninterface Chunk {\n type: 'common' | 'left' | 'right'\n lines: string[]\n}\n\nfunction diff(base: string[], changed: string[]): Chunk[] {\n const dp = lcs(base, changed)\n const chunks: Chunk[] = []\n let i = base.length\n let j = changed.length\n const leftOnly: string[] = []\n const rightOnly: string[] = []\n const common: string[] = []\n\n function flush() {\n if (leftOnly.length > 0 || rightOnly.length > 0) {\n if (common.length > 0) {\n chunks.unshift({ type: 'common', lines: [...common] })\n common.length = 0\n }\n chunks.unshift({\n type: leftOnly.length > 0 ? 'left' : 'right',\n lines: leftOnly.length > 0 ? [...leftOnly] : [...rightOnly],\n })\n leftOnly.length = 0\n rightOnly.length = 0\n } else if (common.length > 0) {\n chunks.unshift({ type: 'common', lines: [...common] })\n common.length = 0\n }\n }\n\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && base[i - 1] === changed[j - 1]) {\n if (leftOnly.length > 0 || rightOnly.length > 0) flush()\n common.unshift(base[i - 1]!)\n i--\n j--\n } else if (j > 0 && (i === 0 || dp[i]![j - 1]! >= dp[i - 1]![j]!)) {\n flush()\n rightOnly.unshift(changed[j - 1]!)\n j--\n } else {\n flush()\n leftOnly.unshift(base[i - 1]!)\n i--\n }\n }\n flush()\n return chunks\n}\n\nexport function merge(base: string, local: string, upstream: string): MergeResult {\n const baseLines = base.split('\\n')\n const localLines = local.split('\\n')\n const upstreamLines = upstream.split('\\n')\n\n const localChunks = diff(baseLines, localLines)\n\n const localMap = new Map<string, string[]>()\n const upstreamMap = new Map<string, string[]>()\n\n let li = 0\n\n for (const c of localChunks) {\n if (c.type === 'left') {\n localMap.set(`del:${li}`, c.lines)\n } else if (c.type === 'right') {\n localMap.set(`ins:${li}`, c.lines)\n li += c.lines.length\n } else {\n li += c.lines.length\n }\n }\n void localMap\n void upstreamMap\n\n // Simple line-by-line three-way merge\n const result: string[] = []\n let conflicts = 0\n let bi = 0\n let lli = 0\n let uui = 0\n\n // Build index maps: base line → local and upstream lines\n // Use a simpler approach: if local == base, take upstream; if upstream == base, take local;\n // if both differ, conflict.\n const bLen = baseLines.length\n const lLen = localLines.length\n const uLen = upstreamLines.length\n\n // If local unchanged vs base, fast-forward to upstream\n if (local === base) {\n return { text: upstream, conflicts: 0 }\n }\n // If upstream unchanged vs base, keep local\n if (upstream === base) {\n return { text: local, conflicts: 0 }\n }\n // Both changed — try line-by-line\n void bi\n void lli\n void uui\n void bLen\n void lLen\n void uLen\n\n const localDiffs = diff(baseLines, localLines)\n const upstreamDiffs = diff(baseLines, upstreamLines)\n\n // Reconstruct base position aligned chunks\n let basePos = 0\n let lPos = 0\n let uPos = 0\n const localOut: { baseStart: number; baseEnd: number; lines: string[] }[] = []\n const upstreamOut: { baseStart: number; baseEnd: number; lines: string[] }[] = []\n\n for (const c of localDiffs) {\n if (c.type === 'common') {\n lPos += c.lines.length\n basePos += c.lines.length\n } else if (c.type === 'right') {\n localOut.push({ baseStart: basePos, baseEnd: basePos, lines: c.lines })\n lPos += c.lines.length\n } else {\n localOut.push({ baseStart: basePos, baseEnd: basePos + c.lines.length, lines: [] })\n basePos += c.lines.length\n }\n }\n basePos = 0\n for (const c of upstreamDiffs) {\n if (c.type === 'common') {\n uPos += c.lines.length\n basePos += c.lines.length\n } else if (c.type === 'right') {\n upstreamOut.push({ baseStart: basePos, baseEnd: basePos, lines: c.lines })\n uPos += c.lines.length\n } else {\n upstreamOut.push({ baseStart: basePos, baseEnd: basePos + c.lines.length, lines: [] })\n basePos += c.lines.length\n }\n }\n void lPos\n void uPos\n\n // Simple merge: walk base lines; apply local and upstream edits\n // When both touch the same region, emit conflict markers\n const localByBase = new Map<number, { end: number; lines: string[] }>()\n for (const e of localOut) {\n localByBase.set(e.baseStart, { end: e.baseEnd, lines: e.lines })\n }\n const upstreamByBase = new Map<number, { end: number; lines: string[] }>()\n for (const e of upstreamOut) {\n upstreamByBase.set(e.baseStart, { end: e.baseEnd, lines: e.lines })\n }\n\n let b = 0\n while (b <= baseLines.length) {\n const lEdit = localByBase.get(b)\n const uEdit = upstreamByBase.get(b)\n\n if (lEdit && uEdit) {\n const lEnd = Math.max(lEdit.end, b)\n const uEnd = Math.max(uEdit.end, b)\n const lLines = lEdit.lines\n const uLines = uEdit.lines\n if (JSON.stringify(lLines) === JSON.stringify(uLines)) {\n result.push(...lLines)\n } else {\n result.push('<<<<<<< local')\n result.push(...lLines)\n result.push('=======')\n result.push(...uLines)\n result.push('>>>>>>> upstream')\n conflicts++\n }\n b = Math.max(lEnd, uEnd, b + 1)\n } else if (lEdit) {\n result.push(...lEdit.lines)\n b = Math.max(lEdit.end, b + 1)\n } else if (uEdit) {\n result.push(...uEdit.lines)\n b = Math.max(uEdit.end, b + 1)\n } else {\n if (b < baseLines.length) result.push(baseLines[b]!)\n b++\n }\n }\n\n return { text: result.join('\\n'), conflicts }\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport { readFile } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { CascadeConfig } from '../utils/config.js'\nimport { diffLines, hasChanges } from '../utils/diff.js'\nimport { readFileSafe, resolveOutputPath, writeFileSafe } from '../utils/fs.js'\nimport { fetchRegistry, fileName, findComponent } from '../utils/registry.js'\nimport { readLock, writeLock, updateLockEntry } from '../utils/lock.js'\nimport { fetchJson, fetchTextRetry } from '../utils/http.js'\nimport { merge } from '../utils/merge.js'\nimport type { RegistryItem } from '@cascivo/registry'\n\nasync function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: stdin, output: stdout })\n try {\n const answer = (await rl.question(`${question} (y/N): `)).trim().toLowerCase()\n return answer === 'y' || answer === 'yes'\n } finally {\n rl.close()\n }\n}\n\nexport async function update(\n name: string | undefined,\n config: CascadeConfig,\n opts: { check?: boolean; yes?: boolean } = {},\n): Promise<void> {\n if (opts.check) {\n return updateCheck(config)\n }\n\n if (!name) {\n console.error('Usage: cascivo update <component>')\n return\n }\n\n const lock = await readLock()\n const lockEntry = lock?.items[name]\n\n const registry = await fetchRegistry(config.registry)\n const entry = findComponent(registry, name)\n if (!entry) {\n console.error(`Component \"${name}\" not found in registry. Run \"cascivo list\".`)\n return\n }\n\n if (lockEntry) {\n // Three-way merge path\n const lockedVersion = lockEntry.version\n const registryBase = lockEntry.registry\n const baseItemUrl = `${registryBase}/r/${name}@${lockedVersion}.json`\n\n let baseItem: RegistryItem | null = null\n try {\n baseItem = (await fetchJson(baseItemUrl)) as RegistryItem\n } catch {\n console.warn(\n `Warning: could not fetch base version ${lockedVersion} from ${baseItemUrl}. Falling back to two-way diff.`,\n )\n }\n\n if (baseItem) {\n await threeWayUpdate(name, entry, baseItem, config, opts)\n } else {\n await twoWayUpdate(name, entry, config, opts)\n }\n } else {\n console.warn(\n `Warning: \"${name}\" has no lock entry. Falling back to two-way diff update (pre-v11 install).`,\n )\n await twoWayUpdate(name, entry, config, opts)\n }\n}\n\nasync function threeWayUpdate(\n name: string,\n upstreamEntry: ReturnType<typeof findComponent>,\n baseItem: RegistryItem,\n config: CascadeConfig,\n opts: { yes?: boolean },\n): Promise<void> {\n if (!upstreamEntry) return\n const outputName = name.includes('/') ? name.split('/').pop()! : name\n const summaries: { file: string; result: 'clean' | 'conflict' | 'unchanged' }[] = []\n const pending: { dest: string; content: string; conflicts: number }[] = []\n\n for (const url of upstreamEntry.files) {\n const fname = fileName(url)\n const baseFile = baseItem.files.find((f) => fileName(f.url) === fname)\n const dest = resolveOutputPath(config.outputDir, outputName, fname)\n\n const upstream = await fetchTextRetry(url)\n const local = existsSync(dest) ? await readFile(dest, 'utf8') : ''\n const base = baseFile ? await fetchTextRetry(baseFile.url) : ''\n\n if (base === '' && local === '') {\n summaries.push({ file: fname, result: 'clean' })\n pending.push({ dest, content: upstream, conflicts: 0 })\n continue\n }\n\n const { text, conflicts } = merge(base, local, upstream)\n\n if (conflicts > 0) {\n summaries.push({ file: fname, result: 'conflict' })\n } else if (text === local) {\n summaries.push({ file: fname, result: 'unchanged' })\n continue\n } else {\n summaries.push({ file: fname, result: 'clean' })\n }\n pending.push({ dest, content: text, conflicts })\n }\n\n if (pending.length === 0) {\n console.log(`${name} is already up to date.`)\n return\n }\n\n for (const s of summaries) {\n const icon = s.result === 'conflict' ? '⚠' : s.result === 'clean' ? '✓' : '·'\n console.log(` ${icon} ${s.file} (${s.result})`)\n }\n\n const conflicted = pending.filter((p) => p.conflicts > 0)\n const shouldApply = opts.yes\n ? conflicted.length === 0 // --yes skips items with conflicts\n : await confirm(`\\nApply ${pending.length} change(s) to ${name}?`)\n\n if (shouldApply || opts.yes) {\n const lock = await readLock()\n let updatedLock = lock\n\n for (const { dest, content, conflicts } of pending) {\n if (opts.yes && conflicts > 0) {\n console.log(` skipped (conflicts): ${dest}`)\n continue\n }\n await writeFileSafe(dest, content)\n }\n\n if (lock && updatedLock) {\n const hasConflicts = conflicted.length > 0\n updatedLock = updateLockEntry(updatedLock, name, {\n ...lock.items[name]!,\n version: upstreamEntry.version,\n ...(hasConflicts ? { conflicted: true as const } : {}),\n })\n await writeLock(updatedLock)\n }\n\n console.log(`Updated ${name}.`)\n if (conflicted.length > 0) {\n console.log(`${conflicted.length} file(s) have conflict markers — resolve them manually.`)\n }\n } else {\n console.log('Aborted. No files changed.')\n }\n}\n\nasync function twoWayUpdate(\n name: string,\n entry: ReturnType<typeof findComponent>,\n config: CascadeConfig,\n opts: { yes?: boolean },\n): Promise<void> {\n if (!entry) return\n const pending: { path: string; content: string }[] = []\n\n for (const url of entry.files) {\n let latest: string\n try {\n latest = await fetchTextRetry(url)\n } catch (e) {\n console.error(e instanceof Error ? e.message : String(e))\n return\n }\n const dest = resolveOutputPath(config.outputDir, entry.name, fileName(url))\n const current = await readFileSafe(dest)\n\n if (current === null) {\n console.log(`New file: ${dest}`)\n pending.push({ path: dest, content: latest })\n } else if (hasChanges(current, latest)) {\n console.log(`\\n--- ${dest}`)\n console.log(diffLines(current, latest).join('\\n'))\n pending.push({ path: dest, content: latest })\n }\n }\n\n if (pending.length === 0) {\n console.log(`${name} is already up to date.`)\n return\n }\n\n const shouldApply = opts.yes || (await confirm(`\\nApply ${pending.length} change(s) to ${name}?`))\n\n if (shouldApply) {\n for (const { path, content } of pending) {\n await writeFileSafe(path, content)\n }\n console.log(`Updated ${name}.`)\n } else {\n console.log('Aborted. No files changed.')\n }\n}\n\nasync function updateCheck(config: CascadeConfig): Promise<void> {\n const lock = await readLock()\n if (!lock || Object.keys(lock.items).length === 0) {\n console.log('No installed components found in cascivo.lock.')\n return\n }\n\n const registry = await fetchRegistry(config.registry)\n let outdated = 0\n\n for (const [name, entry] of Object.entries(lock.items)) {\n const current = findComponent(registry, name)\n if (!current) continue\n // Content hashes are the accurate signal (they change with every source\n // edit); the version compare is the fallback for older registries.\n if (current.fileHashes && Object.keys(current.fileHashes).length > 0) {\n const lockByBase = new Map(\n Object.entries(entry.files).map(([dest, hash]) => [dest.split('/').pop()!, hash]),\n )\n const changed = Object.entries(current.fileHashes).filter(\n ([file, hash]) => lockByBase.get(file) !== hash,\n )\n if (changed.length > 0) {\n console.log(\n `${name}: ${changed.length} file(s) changed upstream (${entry.version} → ${current.version})`,\n )\n outdated++\n }\n } else if (current.version !== entry.version) {\n console.log(`${name}: ${entry.version} → ${current.version}`)\n outdated++\n }\n }\n\n if (outdated > 0) {\n console.log(`${outdated} component(s) outdated.`)\n process.exitCode = 1\n } else {\n console.log('All components up to date.')\n }\n}\n","import type { CascadeConfig } from '../utils/config.js'\nimport { parseAddress, resolveItemUrl } from '../utils/resolve.js'\nimport { fetchJson } from '../utils/http.js'\nimport { asTemplateMeta, isTemplateItem, type RegistryItem } from '@cascivo/registry'\n\n/** Render an item's details as text. Pure, so it can be unit-tested. */\nexport function formatItem(item: RegistryItem): string {\n const lines: string[] = []\n lines.push(`\\n${item.name} v${item.version}`)\n lines.push(`Type: ${item.type}${item.category ? ` / ${item.category}` : ''}`)\n lines.push(item.description)\n if (item.author) lines.push(`Author: ${item.author}`)\n if (item.license) lines.push(`License: ${item.license}`)\n if (item.homepage) lines.push(`Homepage: ${item.homepage}`)\n\n if (item.install) {\n lines.push(`Distribution: npm package — pnpm add ${item.install}`)\n if (item.styles) lines.push(`Stylesheet: import '${item.styles}' (required)`)\n } else if (!isTemplateItem(item)) {\n lines.push(`Distribution: copy-paste — npx cascivo add ${item.name}`)\n }\n\n if (isTemplateItem(item)) {\n try {\n const meta = asTemplateMeta(item.meta)\n lines.push(`\\nTemplate: ${meta.intent}`)\n lines.push(`Framework: ${meta.framework}`)\n if (meta.demoUrl) lines.push(`Demo: ${meta.demoUrl}`)\n if (meta.pages?.length) {\n lines.push('Pages:')\n for (const p of meta.pages) lines.push(` ${p.name} → ${p.target}`)\n }\n } catch {\n // meta is malformed — base fields above are still useful.\n }\n }\n\n if (item.changelog?.length) {\n lines.push('\\nChangelog:')\n for (const c of item.changelog.slice(0, 5)) lines.push(` ${c.version}: ${c.note}`)\n }\n\n if (item.files?.length) {\n lines.push('\\nFiles:')\n for (const f of item.files) lines.push(` ${f.url}${f.target ? ` → ${f.target}` : ''}`)\n }\n\n if (item.dependencies?.length) lines.push(`\\nDependencies: ${item.dependencies.join(', ')}`)\n\n if (item.registryDependencies?.length) {\n const label = isTemplateItem(item) ? 'Components' : 'Registry dependencies'\n lines.push(`${label}: ${item.registryDependencies.join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n\nexport async function view(args: string[], config: CascadeConfig): Promise<void> {\n const spec = args[0]\n if (!spec) {\n console.error('Usage: cascivo view <component-spec>')\n return\n }\n\n const addr = parseAddress(spec)\n const { url, headers, params } = await resolveItemUrl(addr, config)\n const fetchOpts: Parameters<typeof fetchJson>[1] = {}\n if (headers) fetchOpts.headers = headers\n if (params) fetchOpts.params = params\n const item = (await fetchJson(url, fetchOpts)) as RegistryItem\n\n console.log(formatItem(item))\n}\n","import { createRequire } from 'node:module'\nimport { argv } from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { add } from './commands/add.js'\nimport { create } from './commands/create.js'\nimport { runDoctor } from './commands/doctor.js'\nimport { generate } from './commands/generate.js'\nimport { init } from './commands/init.js'\nimport { list } from './commands/list.js'\nimport { registryBuild } from './commands/registry.js'\nimport { search } from './commands/search.js'\nimport { theme } from './commands/theme.js'\nimport { update } from './commands/update.js'\nimport { view } from './commands/view.js'\nimport { loadConfig, THEMES } from './utils/config.js'\nimport { positionalArgs, resolvePackageManagerFlag } from './utils/args.js'\n\n// Read at runtime: this file lives one level below the package root both in\n// src/ (dev, tests) and in dist/ (published bundle), so ../package.json is\n// always the cascivo package manifest.\nexport const VERSION: string = (\n createRequire(import.meta.url)('../package.json') as { version: string }\n).version\n\nexport type { CascadeConfig, ThemeName } from './utils/config.js'\n\nconst HELP = `cascivo ${VERSION} — the CSS-native, signal-driven, AI-first design system\n\nUsage: cascivo <command> [options]\n\nCommands:\n create [name] Scaffold a new ready-to-run app (shell + nav + theme)\n (--template <spec>: start from a marketplace template)\n init Set up cascivo in the current project\n add <component...> Add components or a template to your project\n list [--installed] List available components\n update [component] Update installed components (--check: list outdated)\n search <query> Search components across registries\n view <spec> View a component before installing\n theme <add|create> Install a first-party theme, or build a custom one from /create\n eject <component> Eject specific tokens into a scoped local override file\n generate <config.json> Generate TSX from a ViewConfig JSON file\n doctor [--ci] Check components for rule violations\n audit --ai <paths...> Audit AI-generated code against the cascivo contract\n registry build Build a static registry from a cascivo-registry.json file\n template init <name> Scaffold a new template (source + manifest + registry entry)\n tokens import <file> Import external design tokens as cascivo overrides\n\nRun \"cascivo <command> --help\" for details.`\n\nconst THEME_LIST = THEMES.join(' | ')\n\nconst COMMAND_HELP: Record<string, string> = {\n create: `Usage: cascivo create [name] [options]\n\nScaffold a new ready-to-run app — Vite + React + TypeScript, pre-wired with the\ncascivo app shell, side navigation, header, and a theme.\n\nOptions:\n --template <spec> Start from a marketplace template (@ns/name or owner/repo/name)\n --theme <name> Theme to install (${THEME_LIST})\n --sections \"<a, b>\" Comma-separated nav section labels (one component each)\n --package-manager <pm> Package manager for README/next-steps (alias --pm; default: auto-detect)\n --yes, -y Accept defaults, never prompt`,\n init: `Usage: cascivo init [options]\n\nSet up cascivo in the current project: writes cascivo.config.ts and installs the\nruntime dependencies (@cascivo/core, @cascivo/tokens, @cascivo/themes, the\n@preact/signals-react peer) plus cascivo as a dev dependency for the config's types.\n\nOptions:\n --theme <name> Theme to configure (${THEME_LIST})\n --package-manager <pm> Force pnpm | yarn | npm | bun (alias --pm; default: auto-detect)\n --no-install Write files only; print the install commands to run yourself\n --yes, -y Accept defaults, never prompt (implied when stdin is not a TTY)`,\n add: `Usage: cascivo add <component...> [options]\n\nCopy component source (TSX + CSS module) from the registry into your project,\nresolving component dependencies. Also installs templates (@ns/name) and\nthird-party components (owner/repo/name).\n\nOptions:\n --dry-run Show what would be written without writing\n --package-manager <pm> Force pnpm | yarn | npm | bun (alias --pm; default: auto-detect)\n --no-install Don't install npm-distributed entries or deps; print the commands instead\n --yes, -y Skip confirmation prompts`,\n list: `Usage: cascivo list [options]\n\nList components available in the configured registry.\n\nOptions:\n --installed Only list components already installed in this project`,\n update: `Usage: cascivo update [component] [options]\n\nUpdate installed components to the current registry version. Without a\ncomponent argument, updates everything in the lockfile.\n\nOptions:\n --check List outdated components without writing\n --yes, -y Skip confirmation prompts`,\n search: `Usage: cascivo search <query> [options]\n\nSearch components across the configured registries.\n\nOptions:\n --registry <@ns> Restrict the search to one registry namespace`,\n view: `Usage: cascivo view <spec>\n\nPreview a component or template (files, dependencies, description) before\ninstalling. <spec> is a bare name, @ns/name, or owner/repo/name.`,\n theme: `Usage: cascivo theme add <name>\n cascivo theme create <name> --from <hash> [--out <path>]\n\nadd Install @cascivo/themes and print the import + data-theme wiring.\ncreate Turn a theme-builder config into an owned <name>.theme.css. Get <hash>\n from https://cascivo.com/create (\"Copy CLI command\"). --dry-run prints\n the CSS without writing.\n\nThemes: ${THEME_LIST}`,\n eject: `Usage: cascivo eject <component> [options]\n\nEject specific tokens into a scoped local override file so you can restyle a\ncomponent without forking it.\n\nOptions:\n --tokens <a,b> Comma-separated token names to eject (default: all)\n --scope <sel> CSS selector the overrides are scoped to\n --out <file> Output file path\n --dry-run Print the override file without writing`,\n generate: `Usage: cascivo generate <config.json> [options]\n\nGenerate TSX from a ViewConfig JSON file (see the MCP scaffold_view tool).\n\nOptions:\n --out <file> Output file (default: stdout)\n --components-dir <dir> Components import base (default: ./src/components/ui)`,\n doctor: `Usage: cascivo doctor [options]\n\nCheck components in this repo for cascivo rule violations (banned React hooks,\nhardcoded strings, missing @cascivo/react exports). In an adopter project (one\nwith a cascivo.config), also verifies the runtime dependencies copied source\nneeds — @cascivo/core, @cascivo/tokens, @cascivo/themes, and the\n@preact/signals-react peer — are declared in package.json.\n\nOptions:\n --ci Exit non-zero when violations or missing runtime deps are found\n --drift Compare installed components against the registry (copy-paste drift)`,\n audit: `Usage: cascivo audit --ai <paths...> [options]\n\nAudit AI-generated code against the cascivo contract: hard-coded values that\nshould be tokens, invented props, missing required props, raw strings where\ni18n is expected.\n\nOptions:\n --fix Rewrite unambiguous CSS literals to their token equivalents\n --json Machine-readable output\n --level <name> Minimum finding level to report (error | warn; default error)`,\n registry: `Usage: cascivo registry build [dir]\n\nBuild a static registry (registry.json + file payloads) from a\ncascivo-registry.json manifest, ready to host on any static file server.`,\n template: `Usage: cascivo template init <name> [options]\n\nScaffold a new template: source, manifest, and registry entry.\n\nOptions:\n --category <name> Template category (e.g. dashboard)\n --framework <name> Target framework (default react-vite)\n --components <a,b> Registry components the template composes\n --repo <owner/repo> Repository the template will be hosted in`,\n tokens: `Usage: cascivo tokens import <file>\n\nImport external design tokens (W3C design-tokens JSON) as cascivo token\noverrides.`,\n}\n\nexport async function run(args: string[]): Promise<void> {\n const [command, ...rest] = args\n\n // Per-command help must short-circuit BEFORE any prompt, fetch, or install:\n // \"cascivo add --help\" must never try to install a component named --help.\n if (command !== undefined && (rest.includes('--help') || rest.includes('-h'))) {\n const commandHelp = COMMAND_HELP[command]\n if (commandHelp !== undefined) {\n console.log(commandHelp)\n return\n }\n }\n\n switch (command) {\n case 'create':\n await create(rest)\n break\n case 'init':\n await init(rest)\n break\n case 'add': {\n const pmFlag = resolvePackageManagerFlag(rest)\n if ('error' in pmFlag) {\n console.error(pmFlag.error)\n process.exitCode = 1\n break\n }\n await add(positionalArgs(rest, ['pm', 'package-manager']), await loadConfig(), {\n dryRun: rest.includes('--dry-run'),\n yes: rest.includes('--yes'),\n noInstall: rest.includes('--no-install'),\n ...(pmFlag.pm ? { pm: pmFlag.pm } : {}),\n })\n break\n }\n case 'list':\n await list(await loadConfig(), { installed: rest.includes('--installed') })\n break\n case 'update':\n await update(rest.filter((r) => !r.startsWith('--'))[0], await loadConfig(), {\n check: rest.includes('--check'),\n yes: rest.includes('--yes'),\n })\n break\n case 'search':\n await search(rest, await loadConfig())\n break\n case 'view':\n await view(rest, await loadConfig())\n break\n case 'theme':\n await theme(rest)\n break\n case 'eject': {\n const { eject } = await import('./commands/eject.js')\n const flag = (key: string): string | undefined => {\n const eq = rest.find((r) => r.startsWith(`--${key}=`))\n if (eq) return eq.slice(key.length + 3)\n const idx = rest.indexOf(`--${key}`)\n const next = idx !== -1 ? rest[idx + 1] : undefined\n // Ignore a following token that is itself a flag (e.g. `--tokens --dry-run`).\n return next && !next.startsWith('--') ? next : undefined\n }\n const tokensArg = flag('tokens')\n await eject(rest, await loadConfig(), {\n ...(tokensArg\n ? {\n tokens: tokensArg\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean),\n }\n : {}),\n ...(flag('scope') ? { scope: flag('scope')! } : {}),\n ...(flag('out') ? { out: flag('out')! } : {}),\n dryRun: rest.includes('--dry-run'),\n })\n break\n }\n case 'generate':\n await generate(rest, await loadConfig())\n break\n case 'registry':\n if (rest[0] === 'build') {\n await registryBuild(rest.slice(1))\n } else {\n console.error(`Unknown registry subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case 'template':\n if (rest[0] === 'init') {\n const { templateInit } = await import('./commands/template-init.js')\n await templateInit(rest.slice(1))\n } else {\n console.error(`Unknown template subcommand: ${rest[0]}`)\n process.exitCode = 1\n }\n break\n case 'doctor': {\n const ci = rest.includes('--ci')\n const drift = rest.includes('--drift')\n if (drift) {\n // `--drift` keeps its meaning: drift ONLY.\n const { runDoctorDrift } = await import('./commands/drift.js')\n await runDoctorDrift(await loadConfig())\n } else {\n const cwd = process.cwd()\n const result = await runDoctor(cwd)\n const {\n checkDuplicateCore,\n checkFormatterIgnore,\n checkProjectDependencies,\n checkSignalsCompat,\n checkSsrConfig,\n detectInstallPath,\n } = await import('./commands/doctor.js')\n // Gate on evidence of *any* cascivo install, not on a `cascivo.config.*` file. The\n // config gate mislabelled every prebuilt-path app as copy-paste (the scaffolder wrote\n // one unconditionally), and would now skip them entirely since it no longer does.\n const adopter = detectInstallPath(cwd) !== 'unknown'\n const deps = adopter ? checkProjectDependencies(cwd) : []\n const missingRequired = deps.filter((d) => d.required)\n const signalsCompat = adopter ? await checkSignalsCompat(cwd) : null\n const signalsError = signalsCompat?.severity === 'error'\n const ssrHint = adopter ? checkSsrConfig(cwd) : null\n const duplicateCore = adopter ? await checkDuplicateCore(cwd) : null\n const formatterHint = adopter\n ? checkFormatterIgnore(cwd, (await loadConfig()).outputDir)\n : null\n\n // Run the drift check as part of the DEFAULT invocation. These used to be disjoint\n // branches, so `cascivo doctor` printed \"No violations found.\" on a project where\n // `cascivo doctor --drift` reported five real issues. A clean report from a run that\n // never looked is worse than no report.\n const { runDoctorDrift } = await import('./commands/drift.js')\n const driftOutcome = adopter\n ? await runDoctorDrift(await loadConfig(), cwd)\n : { ran: false, reason: 'no cascivo install detected', issues: 0 }\n\n if (\n result.passed &&\n deps.length === 0 &&\n signalsCompat === null &&\n ssrHint === null &&\n duplicateCore === null &&\n formatterHint === null &&\n driftOutcome.issues === 0\n ) {\n // Never an unqualified \"clean\" when part of the check could not run.\n console.log(\n driftOutcome.ran\n ? 'No violations found.'\n : `No violations found (drift: not checked — ${driftOutcome.reason}).`,\n )\n } else {\n for (const v of result.violations) {\n console.error(`[${v.rule}] ${v.detail}\\n ${v.file}`)\n }\n for (const d of missingRequired) {\n // A forbidden dependency needs the opposite advice from a missing one. Sharing\n // the \"install it\" template told prebuilt-path adopters to install the very\n // packages the message was asking them to remove.\n console.error(\n d.kind === 'forbidden'\n ? `[forbidden-dependency] ${d.package} must not be a direct dependency here. Remove it — ${d.hint}`\n : `[missing-dependency] ${d.package} is not in package.json. Install: ${d.hint}`,\n )\n }\n if (signalsCompat) {\n const tag = signalsError ? 'signals-incompatible' : 'signals-outdated'\n const log = signalsError ? console.error : console.log\n log(`[${tag}] ${signalsCompat.detail} Upgrade: ${signalsCompat.hint}`)\n }\n if (ssrHint) {\n console.log(`[ssr-config] ${ssrHint}`)\n }\n if (formatterHint) {\n console.log(`[formatter-drift] ${formatterHint}`)\n }\n if (duplicateCore) {\n console.error(\n `[duplicate-core] More than one @cascivo/core is installed ` +\n `(root: ${duplicateCore.root ?? 'none'}; ${duplicateCore.nested.join('; ')}). ` +\n duplicateCore.hint,\n )\n }\n for (const d of deps.filter((x) => !x.required)) {\n console.log(\n `[optional] ${d.package} is not installed; add it when a component or chart needs it: ${d.hint}`,\n )\n }\n if (\n ci &&\n (result.violations.length > 0 ||\n missingRequired.length > 0 ||\n signalsError ||\n duplicateCore !== null ||\n driftOutcome.issues > 0)\n ) {\n process.exitCode = 1\n }\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.8.1",
3
+ "version": "0.9.0",
4
4
  "private": false,
5
5
  "description": "CLI — npx cascivo init / add / list / update",
6
6
  "keywords": [
@@ -43,7 +43,7 @@
43
43
  "provenance": true
44
44
  },
45
45
  "dependencies": {
46
- "@cascivo/registry": "^0.2.7"
46
+ "@cascivo/registry": "^0.2.8"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@types/node": "^25",