@hauktui/cli 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,2 +1 @@
1
-
2
- export { }
1
+ #!/usr/bin/env node
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ #!/usr/bin/env node
2
3
 
3
4
  // src/cli.ts
4
5
  import { Command as Command7 } from "commander";
@@ -625,7 +626,7 @@ async function performUpdates(candidates, config, lockFile, cwd) {
625
626
 
626
627
  // src/cli.ts
627
628
  var program = new Command7();
628
- program.name("hauktui").description("A shadcn-like workflow for Terminal UIs").version("0.0.1");
629
+ program.name("hauktui").description("A shadcn-like workflow for Terminal UIs").version("0.0.3");
629
630
  program.addCommand(initCommand);
630
631
  program.addCommand(addCommand);
631
632
  program.addCommand(listCommand);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/utils/config.ts","../src/utils/logger.ts","../src/commands/add.ts","../src/utils/registry.ts","../src/commands/list.ts","../src/commands/view.ts","../src/commands/diff.ts","../src/commands/update.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport { addCommand } from \"./commands/add.js\";\r\nimport { listCommand } from \"./commands/list.js\";\r\nimport { viewCommand } from \"./commands/view.js\";\r\nimport { diffCommand } from \"./commands/diff.js\";\r\nimport { updateCommand } from \"./commands/update.js\";\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name(\"hauktui\")\r\n .description(\"A shadcn-like workflow for Terminal UIs\")\r\n .version(\"0.0.1\");\r\n\r\nprogram.addCommand(initCommand);\r\nprogram.addCommand(addCommand);\r\nprogram.addCommand(listCommand);\r\nprogram.addCommand(viewCommand);\r\nprogram.addCommand(diffCommand);\r\nprogram.addCommand(updateCommand);\r\n\r\nexport function run(): void {\r\n program.parse();\r\n}\r\n","import { Command } from \"commander\";\r\nimport * as p from \"@clack/prompts\";\r\nimport path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport { exec } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nimport { getDefaultConfig, writeConfig, isInitialized } from \"../utils/config.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nconst execAsync = promisify(exec);\r\n\r\nexport const initCommand = new Command()\r\n .name(\"init\")\r\n .description(\"Initialize haukTUI in your project\")\r\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\r\n .option(\"-c, --cwd <path>\", \"Working directory\", process.cwd())\r\n .action(async (options) => {\r\n const cwd = options.cwd as string;\r\n\r\n p.intro(\"🖥️ haukTUI Setup\");\r\n\r\n // Check if already initialized\r\n if (await isInitialized(cwd)) {\r\n const shouldContinue = await p.confirm({\r\n message: \"haukTUI is already initialized. Reinitialize?\",\r\n initialValue: false,\r\n });\r\n\r\n if (p.isCancel(shouldContinue) || !shouldContinue) {\r\n p.cancel(\"Initialization cancelled.\");\r\n process.exit(0);\r\n }\r\n }\r\n\r\n let config = getDefaultConfig();\r\n\r\n if (!options.yes) {\r\n const componentDir = await p.text({\r\n message: \"Where would you like to store components?\",\r\n initialValue: config.componentDir,\r\n placeholder: \"src/tui/components\",\r\n });\r\n\r\n if (p.isCancel(componentDir)) {\r\n p.cancel(\"Initialization cancelled.\");\r\n process.exit(0);\r\n }\r\n\r\n config.componentDir = componentDir as string;\r\n }\r\n\r\n const s = p.spinner();\r\n\r\n // Create directory structure\r\n s.start(\"Creating directory structure...\");\r\n const componentDir = path.join(cwd, config.componentDir);\r\n await fs.ensureDir(componentDir);\r\n s.stop(\"Directory structure created\");\r\n\r\n // Write config file\r\n s.start(\"Writing configuration...\");\r\n await writeConfig(config, cwd);\r\n s.stop(\"Configuration saved\");\r\n\r\n // Create tokens file\r\n s.start(\"Creating tokens file...\");\r\n const tokensDir = path.dirname(path.join(cwd, config.tokensPath ?? \"src/tui/tokens.ts\"));\r\n await fs.ensureDir(tokensDir);\r\n \r\n const tokensContent = `// haukTUI tokens configuration\r\n// Customize your terminal UI theme here\r\n\r\nimport { createTokens, type TokenOverrides } from \"@hauktui/tokens\";\r\n\r\nconst customTokens: TokenOverrides = {\r\n // Override default colors here\r\n // colors: {\r\n // accent: \"#8b5cf6\", // violet\r\n // },\r\n};\r\n\r\nexport const tokens = createTokens(customTokens);\r\n`;\r\n \r\n await fs.writeFile(\r\n path.join(cwd, config.tokensPath ?? \"src/tui/tokens.ts\"),\r\n tokensContent\r\n );\r\n s.stop(\"Tokens file created\");\r\n\r\n // Detect package manager and install dependencies\r\n s.start(\"Installing dependencies...\");\r\n \r\n let packageManager = \"npm\";\r\n if (await fs.pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) {\r\n packageManager = \"pnpm\";\r\n } else if (await fs.pathExists(path.join(cwd, \"yarn.lock\"))) {\r\n packageManager = \"yarn\";\r\n } else if (await fs.pathExists(path.join(cwd, \"bun.lockb\"))) {\r\n packageManager = \"bun\";\r\n }\r\n\r\n const deps = [\"@hauktui/tokens\", \"@hauktui/core\", \"@hauktui/primitives-ink\", \"ink\", \"react\"];\r\n const installCmd = packageManager === \"npm\" \r\n ? `npm install ${deps.join(\" \")}`\r\n : packageManager === \"yarn\"\r\n ? `yarn add ${deps.join(\" \")}`\r\n : packageManager === \"bun\"\r\n ? `bun add ${deps.join(\" \")}`\r\n : `pnpm add ${deps.join(\" \")}`;\r\n\r\n try {\r\n await execAsync(installCmd, { cwd });\r\n s.stop(\"Dependencies installed\");\r\n } catch (error) {\r\n s.stop(\"Failed to install dependencies\");\r\n logger.warn(`Run manually: ${installCmd}`);\r\n }\r\n\r\n p.outro(\"✨ haukTUI initialized! Run `hauktui add button` to add your first component.\");\r\n });\r\n","import path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport type { HaukConfig, LockFile } from \"@hauktui/registry\";\r\n\r\nconst CONFIG_FILE = \"hauk.config.json\";\r\nconst LOCK_FILE = \"hauk.lock.json\";\r\n\r\n/**\r\n * Get the default config\r\n */\r\nexport function getDefaultConfig(): HaukConfig {\r\n return {\r\n $schema: \"https://hauktui.dev/schema/config.json\",\r\n componentDir: \"src/tui/components\",\r\n tokensPath: \"src/tui/tokens.ts\",\r\n registryUrl: \"https://raw.githubusercontent.com/hauktui/hauktui/main/packages/registry\",\r\n aliases: {\r\n \"@/tui\": \"./src/tui\",\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Get the default lock file\r\n */\r\nexport function getDefaultLockFile(): LockFile {\r\n return {\r\n version: \"1.0.0\",\r\n components: {},\r\n };\r\n}\r\n\r\n/**\r\n * Check if project has been initialized\r\n */\r\nexport async function isInitialized(cwd: string = process.cwd()): Promise<boolean> {\r\n const configPath = path.join(cwd, CONFIG_FILE);\r\n return fs.pathExists(configPath);\r\n}\r\n\r\n/**\r\n * Read the config file\r\n */\r\nexport async function readConfig(cwd: string = process.cwd()): Promise<HaukConfig | null> {\r\n const configPath = path.join(cwd, CONFIG_FILE);\r\n if (!(await fs.pathExists(configPath))) {\r\n return null;\r\n }\r\n return fs.readJson(configPath) as Promise<HaukConfig>;\r\n}\r\n\r\n/**\r\n * Write the config file\r\n */\r\nexport async function writeConfig(config: HaukConfig, cwd: string = process.cwd()): Promise<void> {\r\n const configPath = path.join(cwd, CONFIG_FILE);\r\n await fs.writeJson(configPath, config, { spaces: 2 });\r\n}\r\n\r\n/**\r\n * Read the lock file\r\n */\r\nexport async function readLockFile(cwd: string = process.cwd()): Promise<LockFile> {\r\n const lockPath = path.join(cwd, LOCK_FILE);\r\n if (!(await fs.pathExists(lockPath))) {\r\n return getDefaultLockFile();\r\n }\r\n return fs.readJson(lockPath) as Promise<LockFile>;\r\n}\r\n\r\n/**\r\n * Write the lock file\r\n */\r\nexport async function writeLockFile(lockFile: LockFile, cwd: string = process.cwd()): Promise<void> {\r\n const lockPath = path.join(cwd, LOCK_FILE);\r\n await fs.writeJson(lockPath, lockFile, { spaces: 2 });\r\n}\r\n\r\n/**\r\n * Get the component directory path\r\n */\r\nexport function getComponentDir(config: HaukConfig, cwd: string = process.cwd()): string {\r\n return path.join(cwd, config.componentDir);\r\n}\r\n\r\n/**\r\n * Get the path for a specific component\r\n */\r\nexport function getComponentPath(\r\n config: HaukConfig,\r\n componentName: string,\r\n cwd: string = process.cwd()\r\n): string {\r\n return path.join(getComponentDir(config, cwd), componentName);\r\n}\r\n","import pc from \"picocolors\";\r\n\r\nexport const logger = {\r\n info: (message: string) => console.log(pc.blue(\"ℹ\"), message),\r\n success: (message: string) => console.log(pc.green(\"✔\"), message),\r\n warn: (message: string) => console.log(pc.yellow(\"⚠\"), message),\r\n error: (message: string) => console.log(pc.red(\"✖\"), message),\r\n log: (message: string) => console.log(message),\r\n break: () => console.log(),\r\n};\r\n\r\nexport function highlight(text: string): string {\r\n return pc.cyan(text);\r\n}\r\n\r\nexport function dim(text: string): string {\r\n return pc.dim(text);\r\n}\r\n\r\nexport function bold(text: string): string {\r\n return pc.bold(text);\r\n}\r\n","import { Command } from \"commander\";\r\nimport * as p from \"@clack/prompts\";\r\nimport path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport { getComponent } from \"@hauktui/registry\";\r\nimport {\r\n readConfig,\r\n readLockFile,\r\n writeLockFile,\r\n getComponentPath,\r\n isInitialized,\r\n} from \"../utils/config.js\";\r\nimport {\r\n fetchComponentFiles,\r\n hashFile,\r\n validateComponents,\r\n getAvailableComponents,\r\n} from \"../utils/registry.js\";\r\nimport { logger, highlight } from \"../utils/logger.js\";\r\n\r\nexport const addCommand = new Command()\r\n .name(\"add\")\r\n .description(\"Add components to your project\")\r\n .argument(\"[components...]\", \"Components to add\")\r\n .option(\"-a, --all\", \"Install all available components\")\r\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\r\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\r\n .option(\"-c, --cwd <path>\", \"Working directory\", process.cwd())\r\n .action(async (components: string[], options) => {\r\n const cwd = options.cwd as string;\r\n\r\n // Check if initialized\r\n if (!(await isInitialized(cwd))) {\r\n logger.error(\"Project not initialized. Run `hauktui init` first.\");\r\n process.exit(1);\r\n }\r\n\r\n const config = await readConfig(cwd);\r\n if (!config) {\r\n logger.error(\"Could not read hauk.config.json\");\r\n process.exit(1);\r\n }\r\n\r\n // If --all flag is provided, get all available components\r\n let selectedComponents = components;\r\n if (options.all) {\r\n selectedComponents = getAvailableComponents();\r\n logger.info(`Installing all ${selectedComponents.length} components...`);\r\n } else if (selectedComponents.length === 0) {\r\n // If no components specified, prompt for selection\r\n const available = getAvailableComponents();\r\n const selected = await p.multiselect({\r\n message: \"Select components to add:\",\r\n options: available.map((name) => {\r\n const meta = getComponent(name);\r\n const option: { value: string; label: string; hint?: string } = {\r\n value: name,\r\n label: name,\r\n };\r\n if (meta?.description) {\r\n option.hint = meta.description;\r\n }\r\n return option;\r\n }),\r\n });\r\n\r\n if (p.isCancel(selected)) {\r\n p.cancel(\"Operation cancelled.\");\r\n process.exit(0);\r\n }\r\n\r\n selectedComponents = selected as string[];\r\n }\r\n\r\n if (selectedComponents.length === 0) {\r\n logger.warn(\"No components selected.\");\r\n process.exit(0);\r\n }\r\n\r\n // Validate component names\r\n const { valid, invalid } = validateComponents(selectedComponents);\r\n\r\n if (invalid.length > 0) {\r\n logger.error(`Unknown components: ${invalid.join(\", \")}`);\r\n logger.info(`Available: ${getAvailableComponents().join(\", \")}`);\r\n process.exit(1);\r\n }\r\n\r\n const s = p.spinner();\r\n const lockFile = await readLockFile(cwd);\r\n let addedCount = 0;\r\n\r\n for (const meta of valid) {\r\n s.start(`Adding ${highlight(meta.name)}...`);\r\n\r\n const targetDir = getComponentPath(config, meta.name, cwd);\r\n\r\n // Check if component already exists\r\n if (await fs.pathExists(targetDir)) {\r\n if (!options.overwrite) {\r\n const existingEntry = lockFile.components[meta.name];\r\n if (existingEntry) {\r\n s.stop(\r\n `${meta.name} already installed (v${existingEntry.version})`\r\n );\r\n continue;\r\n }\r\n\r\n if (!options.yes) {\r\n s.stop();\r\n const overwrite = await p.confirm({\r\n message: `${meta.name} already exists. Overwrite?`,\r\n initialValue: false,\r\n });\r\n\r\n if (p.isCancel(overwrite) || !overwrite) {\r\n continue;\r\n }\r\n s.start(`Adding ${highlight(meta.name)}...`);\r\n }\r\n }\r\n }\r\n\r\n // Fetch component files\r\n const files = await fetchComponentFiles(meta.name);\r\n if (!files) {\r\n s.stop(`Failed to fetch ${meta.name}`);\r\n continue;\r\n }\r\n\r\n // Create component directory\r\n await fs.ensureDir(targetDir);\r\n\r\n // Write files and calculate hashes\r\n const fileHashes: Record<string, string> = {};\r\n for (const [filename, content] of files) {\r\n const filePath = path.join(targetDir, filename);\r\n await fs.writeFile(filePath, content);\r\n fileHashes[filename] = hashFile(content);\r\n }\r\n\r\n // Update lock file\r\n lockFile.components[meta.name] = {\r\n name: meta.name,\r\n version: meta.version,\r\n files: fileHashes,\r\n installedAt: new Date().toISOString(),\r\n };\r\n\r\n addedCount++;\r\n s.stop(`Added ${highlight(meta.name)}`);\r\n\r\n // Show notes if any\r\n if (meta.notes) {\r\n logger.info(` └─ ${meta.notes}`);\r\n }\r\n }\r\n\r\n // Save lock file\r\n await writeLockFile(lockFile, cwd);\r\n\r\n logger.break();\r\n if (addedCount > 0) {\r\n logger.success(\r\n `Added ${addedCount} component(s) to ${config.componentDir}`\r\n );\r\n } else {\r\n logger.info(\"No components were added.\");\r\n }\r\n });\r\n","import crypto from \"node:crypto\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport fs from \"fs-extra\";\r\nimport pc from \"picocolors\";\r\nimport { getComponent, getComponents } from \"@hauktui/registry\";\r\nimport type { ComponentMeta } from \"@hauktui/registry\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = path.dirname(__filename);\r\n\r\n/**\r\n * Calculate file hash for change detection\r\n */\r\nexport function hashFile(content: string): string {\r\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\r\n}\r\n\r\n/**\r\n * Get component source from registry package\r\n */\r\nexport function getComponentSource(componentName: string): string {\r\n // In bundled mode, we need to find the registry package components\r\n // __dirname is packages/cli/dist (or packages/cli/src when running with ts)\r\n // Go up: dist -> cli -> packages -> then into packages/registry/components\r\n const packagesDir = path.resolve(__dirname, \"..\", \"..\", \"..\");\r\n const registryComponents = path.resolve(packagesDir, \"packages\", \"registry\", \"components\");\r\n return path.join(registryComponents, componentName);\r\n}\r\n\r\n/**\r\n * Fetch component files (local bundled mode)\r\n */\r\nexport async function fetchComponentFiles(\r\n componentName: string\r\n): Promise<Map<string, string> | null> {\r\n const meta = getComponent(componentName);\r\n if (!meta) {\r\n return null;\r\n }\r\n\r\n const sourcePath = getComponentSource(componentName);\r\n const files = new Map<string, string>();\r\n\r\n for (const file of meta.files) {\r\n const filePath = path.join(sourcePath, file);\r\n if (await fs.pathExists(filePath)) {\r\n const content = await fs.readFile(filePath, \"utf-8\");\r\n files.set(file, content);\r\n }\r\n }\r\n\r\n return files;\r\n}\r\n\r\n/**\r\n * Try to fetch from remote, fall back to bundled\r\n */\r\nexport async function fetchComponentFilesWithFallback(\r\n componentName: string,\r\n registryUrl?: string\r\n): Promise<{ files: Map<string, string>; source: \"remote\" | \"bundled\" } | null> {\r\n // For now, always use bundled (remote fetching can be added later)\r\n const files = await fetchComponentFiles(componentName);\r\n if (!files) {\r\n return null;\r\n }\r\n return { files, source: \"bundled\" };\r\n}\r\n\r\n/**\r\n * Get all available component names\r\n */\r\nexport function getAvailableComponents(): string[] {\r\n return getComponents().map((c) => c.name);\r\n}\r\n\r\n/**\r\n * Validate component names\r\n */\r\nexport function validateComponents(names: string[]): {\r\n valid: ComponentMeta[];\r\n invalid: string[];\r\n} {\r\n const valid: ComponentMeta[] = [];\r\n const invalid: string[] = [];\r\n\r\n for (const name of names) {\r\n const meta = getComponent(name);\r\n if (meta) {\r\n valid.push(meta);\r\n } else {\r\n invalid.push(name);\r\n }\r\n }\r\n\r\n return { valid, invalid };\r\n}\r\n\r\n/**\r\n * Format component info for display\r\n */\r\nexport function formatComponentInfo(meta: ComponentMeta): string {\r\n return `${pc.bold(meta.name)} ${pc.dim(`v${meta.version}`)}\r\n ${meta.description}\r\n ${pc.dim(\"Category:\")} ${meta.category}\r\n ${pc.dim(\"Tags:\")} ${meta.tags.join(\", \")}\r\n ${pc.dim(\"Files:\")} ${meta.files.join(\", \")}\r\n ${meta.notes ? `${pc.dim(\"Note:\")} ${meta.notes}` : \"\"}`;\r\n}\r\n","import { Command } from \"commander\";\r\nimport { getComponents, searchComponents } from \"@hauktui/registry\";\r\nimport { logger, highlight, dim } from \"../utils/logger.js\";\r\n\r\nexport const listCommand = new Command()\r\n .name(\"list\")\r\n .alias(\"ls\")\r\n .description(\"List available components\")\r\n .option(\"-s, --search <query>\", \"Search components\")\r\n .option(\"-c, --category <category>\", \"Filter by category\")\r\n .action(async (options) => {\r\n let components = getComponents();\r\n\r\n // Apply search filter\r\n if (options.search) {\r\n components = searchComponents(options.search);\r\n }\r\n\r\n // Apply category filter\r\n if (options.category) {\r\n components = components.filter((c) => c.category === options.category);\r\n }\r\n\r\n if (components.length === 0) {\r\n logger.warn(\"No components found.\");\r\n return;\r\n }\r\n\r\n logger.log(\"\\nAvailable components:\\n\");\r\n\r\n // Group by category\r\n const byCategory = new Map<string, typeof components>();\r\n for (const comp of components) {\r\n const existing = byCategory.get(comp.category) ?? [];\r\n existing.push(comp);\r\n byCategory.set(comp.category, existing);\r\n }\r\n\r\n for (const [category, comps] of byCategory) {\r\n logger.log(`${highlight(category.toUpperCase())}`);\r\n for (const comp of comps) {\r\n logger.log(` ${comp.name.padEnd(15)} ${dim(comp.description)}`);\r\n }\r\n logger.break();\r\n }\r\n\r\n logger.log(dim(`Run \\`hauktui add <component>\\` to add a component`));\r\n });\r\n","import { Command } from \"commander\";\r\nimport { getComponent } from \"@hauktui/registry\";\r\nimport { formatComponentInfo } from \"../utils/registry.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nexport const viewCommand = new Command()\r\n .name(\"view\")\r\n .description(\"View component details\")\r\n .argument(\"<component>\", \"Component name\")\r\n .action(async (componentName: string) => {\r\n const meta = getComponent(componentName);\r\n\r\n if (!meta) {\r\n logger.error(`Component \"${componentName}\" not found.`);\r\n process.exit(1);\r\n }\r\n\r\n logger.break();\r\n logger.log(formatComponentInfo(meta));\r\n logger.break();\r\n });\r\n","import { Command } from \"commander\";\r\nimport path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport pc from \"picocolors\";\r\nimport { getComponent } from \"@hauktui/registry\";\r\nimport {\r\n readConfig,\r\n readLockFile,\r\n getComponentPath,\r\n isInitialized,\r\n} from \"../utils/config.js\";\r\nimport { fetchComponentFiles, hashFile } from \"../utils/registry.js\";\r\nimport { logger, highlight } from \"../utils/logger.js\";\r\n\r\nexport const diffCommand = new Command()\r\n .name(\"diff\")\r\n .description(\"Show differences between local and upstream components\")\r\n .argument(\"<component>\", \"Component to diff\")\r\n .option(\"-c, --cwd <path>\", \"Working directory\", process.cwd())\r\n .action(async (componentName: string, options) => {\r\n const cwd = options.cwd as string;\r\n\r\n // Check if initialized\r\n if (!(await isInitialized(cwd))) {\r\n logger.error(\"Project not initialized. Run `hauktui init` first.\");\r\n process.exit(1);\r\n }\r\n\r\n const config = await readConfig(cwd);\r\n if (!config) {\r\n logger.error(\"Could not read hauk.config.json\");\r\n process.exit(1);\r\n }\r\n\r\n const meta = getComponent(componentName);\r\n if (!meta) {\r\n logger.error(`Component \"${componentName}\" not found in registry.`);\r\n process.exit(1);\r\n }\r\n\r\n const lockFile = await readLockFile(cwd);\r\n const installed = lockFile.components[componentName];\r\n\r\n if (!installed) {\r\n logger.error(`Component \"${componentName}\" is not installed.`);\r\n process.exit(1);\r\n }\r\n\r\n const componentDir = getComponentPath(config, componentName, cwd);\r\n \r\n if (!(await fs.pathExists(componentDir))) {\r\n logger.error(`Component directory not found: ${componentDir}`);\r\n process.exit(1);\r\n }\r\n\r\n // Fetch upstream files\r\n const upstreamFiles = await fetchComponentFiles(componentName);\r\n if (!upstreamFiles) {\r\n logger.error(\"Failed to fetch upstream component.\");\r\n process.exit(1);\r\n }\r\n\r\n logger.break();\r\n logger.log(`Comparing ${highlight(componentName)} (local v${installed.version} ↔ upstream v${meta.version})`);\r\n logger.break();\r\n\r\n let hasChanges = false;\r\n\r\n for (const [filename, upstreamContent] of upstreamFiles) {\r\n const localPath = path.join(componentDir, filename);\r\n const localExists = await fs.pathExists(localPath);\r\n\r\n if (!localExists) {\r\n logger.log(`${pc.red(\"- \" + filename)} ${pc.dim(\"(missing locally)\")}`);\r\n hasChanges = true;\r\n continue;\r\n }\r\n\r\n const localContent = await fs.readFile(localPath, \"utf-8\");\r\n const localHash = hashFile(localContent);\r\n const upstreamHash = hashFile(upstreamContent);\r\n const installedHash = installed.files[filename];\r\n\r\n if (localHash === upstreamHash) {\r\n logger.log(`${pc.green(\"✓ \" + filename)} ${pc.dim(\"(unchanged)\")}`);\r\n } else if (localHash === installedHash) {\r\n logger.log(`${pc.yellow(\"↑ \" + filename)} ${pc.dim(\"(upstream updated)\")}`);\r\n hasChanges = true;\r\n } else if (upstreamHash === installedHash) {\r\n logger.log(`${pc.blue(\"● \" + filename)} ${pc.dim(\"(local modifications)\")}`);\r\n hasChanges = true;\r\n } else {\r\n logger.log(`${pc.magenta(\"⚡ \" + filename)} ${pc.dim(\"(both modified)\")}`);\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n // Check for extra local files\r\n const localFiles = await fs.readdir(componentDir);\r\n for (const file of localFiles) {\r\n if (!upstreamFiles.has(file)) {\r\n logger.log(`${pc.cyan(\"+ \" + file)} ${pc.dim(\"(local only)\")}`);\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n logger.break();\r\n if (!hasChanges) {\r\n logger.success(\"No differences found.\");\r\n } else {\r\n logger.info(\"Run `hauktui add --overwrite \" + componentName + \"` to update.\");\r\n }\r\n });\r\n","import { Command } from \"commander\";\r\nimport * as p from \"@clack/prompts\";\r\nimport path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport { getComponent } from \"@hauktui/registry\";\r\nimport {\r\n readConfig,\r\n readLockFile,\r\n writeLockFile,\r\n getComponentPath,\r\n isInitialized,\r\n} from \"../utils/config.js\";\r\nimport { fetchComponentFiles, hashFile } from \"../utils/registry.js\";\r\nimport { logger, highlight } from \"../utils/logger.js\";\r\n\r\ninterface UpdateCandidate {\r\n name: string;\r\n installedVersion: string;\r\n latestVersion: string;\r\n hasLocalChanges: boolean;\r\n}\r\n\r\nexport const updateCommand = new Command()\r\n .name(\"update\")\r\n .description(\"Update installed components to latest versions\")\r\n .argument(\"[components...]\", \"Components to update (default: all)\")\r\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\r\n .option(\"-f, --force\", \"Force update even with local modifications\")\r\n .option(\"--check\", \"Only check for updates without applying\")\r\n .option(\"-c, --cwd <path>\", \"Working directory\", process.cwd())\r\n .action(async (components: string[], options) => {\r\n const cwd = options.cwd as string;\r\n\r\n // Check if initialized\r\n if (!(await isInitialized(cwd))) {\r\n logger.error(\"Project not initialized. Run `hauktui init` first.\");\r\n process.exit(1);\r\n }\r\n\r\n const config = await readConfig(cwd);\r\n if (!config) {\r\n logger.error(\"Could not read hauk.config.json\");\r\n process.exit(1);\r\n }\r\n\r\n const lockFile = await readLockFile(cwd);\r\n const installedComponents = Object.keys(lockFile.components);\r\n\r\n if (installedComponents.length === 0) {\r\n logger.info(\"No components installed.\");\r\n process.exit(0);\r\n }\r\n\r\n // Determine which components to check\r\n let componentsToCheck = components.length > 0 ? components : installedComponents;\r\n\r\n // Validate that specified components are installed\r\n const notInstalled = componentsToCheck.filter((c) => !lockFile.components[c]);\r\n if (notInstalled.length > 0) {\r\n logger.error(`Not installed: ${notInstalled.join(\", \")}`);\r\n process.exit(1);\r\n }\r\n\r\n const s = p.spinner();\r\n s.start(\"Checking for updates...\");\r\n\r\n const candidates: UpdateCandidate[] = [];\r\n\r\n for (const componentName of componentsToCheck) {\r\n const installed = lockFile.components[componentName];\r\n if (!installed) continue;\r\n\r\n const meta = getComponent(componentName);\r\n if (!meta) {\r\n logger.warn(`Component \"${componentName}\" not found in registry.`);\r\n continue;\r\n }\r\n\r\n const componentDir = getComponentPath(config, componentName, cwd);\r\n\r\n // Check if there are local modifications\r\n let hasLocalChanges = false;\r\n if (await fs.pathExists(componentDir)) {\r\n for (const [filename, installedHash] of Object.entries(installed.files)) {\r\n const filePath = path.join(componentDir, filename);\r\n if (await fs.pathExists(filePath)) {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const localHash = hashFile(localContent);\r\n if (localHash !== installedHash) {\r\n hasLocalChanges = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Check if there's a new version available\r\n if (meta.version !== installed.version) {\r\n candidates.push({\r\n name: componentName,\r\n installedVersion: installed.version,\r\n latestVersion: meta.version,\r\n hasLocalChanges,\r\n });\r\n }\r\n }\r\n\r\n s.stop();\r\n\r\n if (candidates.length === 0) {\r\n logger.success(\"All components are up to date!\");\r\n process.exit(0);\r\n }\r\n\r\n // Display update candidates\r\n logger.break();\r\n logger.log(\"Updates available:\");\r\n logger.break();\r\n\r\n for (const candidate of candidates) {\r\n const versionInfo = `${candidate.installedVersion} → ${candidate.latestVersion}`;\r\n const localChangeWarning = candidate.hasLocalChanges\r\n ? \" (has local modifications)\"\r\n : \"\";\r\n\r\n logger.log(\r\n ` ${highlight(candidate.name)} ${versionInfo}${localChangeWarning}`\r\n );\r\n }\r\n\r\n logger.break();\r\n\r\n // Check-only mode\r\n if (options.check) {\r\n logger.info(`${candidates.length} update(s) available.`);\r\n logger.info(\"Run `hauktui update` to apply updates.\");\r\n process.exit(0);\r\n }\r\n\r\n // Components with local changes\r\n const withLocalChanges = candidates.filter((c) => c.hasLocalChanges);\r\n if (withLocalChanges.length > 0 && !options.force) {\r\n logger.warn(\r\n `${withLocalChanges.length} component(s) have local modifications.`\r\n );\r\n logger.info(\"Use --force to overwrite, or update individually.\");\r\n \r\n // Filter out components with local changes\r\n const safeToUpdate = candidates.filter((c) => !c.hasLocalChanges);\r\n if (safeToUpdate.length === 0) {\r\n process.exit(0);\r\n }\r\n\r\n if (!options.yes) {\r\n const proceed = await p.confirm({\r\n message: `Update ${safeToUpdate.length} component(s) without local changes?`,\r\n initialValue: true,\r\n });\r\n\r\n if (p.isCancel(proceed) || !proceed) {\r\n p.cancel(\"Update cancelled.\");\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Update only safe components\r\n await performUpdates(safeToUpdate, config, lockFile, cwd);\r\n } else {\r\n // Confirm update\r\n if (!options.yes) {\r\n const proceed = await p.confirm({\r\n message: `Update ${candidates.length} component(s)?`,\r\n initialValue: true,\r\n });\r\n\r\n if (p.isCancel(proceed) || !proceed) {\r\n p.cancel(\"Update cancelled.\");\r\n process.exit(0);\r\n }\r\n }\r\n\r\n await performUpdates(candidates, config, lockFile, cwd);\r\n }\r\n\r\n // Save lock file\r\n await writeLockFile(lockFile, cwd);\r\n\r\n logger.break();\r\n logger.success(\"Update complete!\");\r\n });\r\n\r\nasync function performUpdates(\r\n candidates: UpdateCandidate[],\r\n config: { componentDir: string },\r\n lockFile: { components: Record<string, unknown> },\r\n cwd: string\r\n): Promise<void> {\r\n const s = p.spinner();\r\n\r\n for (const candidate of candidates) {\r\n s.start(`Updating ${highlight(candidate.name)}...`);\r\n\r\n const meta = getComponent(candidate.name);\r\n if (!meta) {\r\n s.stop(`Skipped ${candidate.name} (not in registry)`);\r\n continue;\r\n }\r\n\r\n const targetDir = getComponentPath(config, candidate.name, cwd);\r\n\r\n // Fetch latest files\r\n const files = await fetchComponentFiles(candidate.name);\r\n if (!files) {\r\n s.stop(`Failed to fetch ${candidate.name}`);\r\n continue;\r\n }\r\n\r\n // Create component directory if needed\r\n await fs.ensureDir(targetDir);\r\n\r\n // Write files and calculate hashes\r\n const fileHashes: Record<string, string> = {};\r\n for (const [filename, content] of files) {\r\n const filePath = path.join(targetDir, filename);\r\n await fs.writeFile(filePath, content);\r\n fileHashes[filename] = hashFile(content);\r\n }\r\n\r\n // Update lock file entry\r\n (lockFile.components as Record<string, unknown>)[candidate.name] = {\r\n name: candidate.name,\r\n version: meta.version,\r\n files: fileHashes,\r\n installedAt: new Date().toISOString(),\r\n };\r\n\r\n s.stop(\r\n `Updated ${highlight(candidate.name)} (${candidate.installedVersion} → ${candidate.latestVersion})`\r\n );\r\n }\r\n}\r\n","// @hauktui/cli\r\n// CLI for haukTUI - add components to your project\r\n\r\nimport { run } from \"./cli\";\r\n\r\nrun();\r\n"],"mappings":"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","names":["Command","path","fs","text","componentDir","path","fs","Command","p","path","fs","getComponent","path","fs","pc","pc","Command","getComponent","fs","path","Command","getComponents","Command","getComponents","Command","getComponent","Command","getComponent","Command","path","fs","pc","getComponent","Command","getComponent","fs","path","pc","Command","p","path","fs","getComponent","Command","getComponent","fs","path","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/utils/config.ts","../src/utils/logger.ts","../src/commands/add.ts","../src/utils/registry.ts","../src/commands/list.ts","../src/commands/view.ts","../src/commands/diff.ts","../src/commands/update.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\r\nimport { initCommand } from \"./commands/init.js\";\r\nimport { addCommand } from \"./commands/add.js\";\r\nimport { listCommand } from \"./commands/list.js\";\r\nimport { viewCommand } from \"./commands/view.js\";\r\nimport { diffCommand } from \"./commands/diff.js\";\r\nimport { updateCommand } from \"./commands/update.js\";\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name(\"hauktui\")\r\n .description(\"A shadcn-like workflow for Terminal UIs\")\r\n .version(\"0.0.3\");\r\n\r\nprogram.addCommand(initCommand);\r\nprogram.addCommand(addCommand);\r\nprogram.addCommand(listCommand);\r\nprogram.addCommand(viewCommand);\r\nprogram.addCommand(diffCommand);\r\nprogram.addCommand(updateCommand);\r\n\r\nexport function run(): void {\r\n program.parse();\r\n}\r\n","import { Command } from \"commander\";\r\nimport * as p from \"@clack/prompts\";\r\nimport path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport { exec } from \"node:child_process\";\r\nimport { promisify } from \"node:util\";\r\nimport { getDefaultConfig, writeConfig, isInitialized } from \"../utils/config.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nconst execAsync = promisify(exec);\r\n\r\nexport const initCommand = new Command()\r\n .name(\"init\")\r\n .description(\"Initialize haukTUI in your project\")\r\n .option(\"-y, --yes\", \"Skip prompts and use defaults\")\r\n .option(\"-c, --cwd <path>\", \"Working directory\", process.cwd())\r\n .action(async (options) => {\r\n const cwd = options.cwd as string;\r\n\r\n p.intro(\"🖥️ haukTUI Setup\");\r\n\r\n // Check if already initialized\r\n if (await isInitialized(cwd)) {\r\n const shouldContinue = await p.confirm({\r\n message: \"haukTUI is already initialized. Reinitialize?\",\r\n initialValue: false,\r\n });\r\n\r\n if (p.isCancel(shouldContinue) || !shouldContinue) {\r\n p.cancel(\"Initialization cancelled.\");\r\n process.exit(0);\r\n }\r\n }\r\n\r\n let config = getDefaultConfig();\r\n\r\n if (!options.yes) {\r\n const componentDir = await p.text({\r\n message: \"Where would you like to store components?\",\r\n initialValue: config.componentDir,\r\n placeholder: \"src/tui/components\",\r\n });\r\n\r\n if (p.isCancel(componentDir)) {\r\n p.cancel(\"Initialization cancelled.\");\r\n process.exit(0);\r\n }\r\n\r\n config.componentDir = componentDir as string;\r\n }\r\n\r\n const s = p.spinner();\r\n\r\n // Create directory structure\r\n s.start(\"Creating directory structure...\");\r\n const componentDir = path.join(cwd, config.componentDir);\r\n await fs.ensureDir(componentDir);\r\n s.stop(\"Directory structure created\");\r\n\r\n // Write config file\r\n s.start(\"Writing configuration...\");\r\n await writeConfig(config, cwd);\r\n s.stop(\"Configuration saved\");\r\n\r\n // Create tokens file\r\n s.start(\"Creating tokens file...\");\r\n const tokensDir = path.dirname(path.join(cwd, config.tokensPath ?? \"src/tui/tokens.ts\"));\r\n await fs.ensureDir(tokensDir);\r\n \r\n const tokensContent = `// haukTUI tokens configuration\r\n// Customize your terminal UI theme here\r\n\r\nimport { createTokens, type TokenOverrides } from \"@hauktui/tokens\";\r\n\r\nconst customTokens: TokenOverrides = {\r\n // Override default colors here\r\n // colors: {\r\n // accent: \"#8b5cf6\", // violet\r\n // },\r\n};\r\n\r\nexport const tokens = createTokens(customTokens);\r\n`;\r\n \r\n await fs.writeFile(\r\n path.join(cwd, config.tokensPath ?? \"src/tui/tokens.ts\"),\r\n tokensContent\r\n );\r\n s.stop(\"Tokens file created\");\r\n\r\n // Detect package manager and install dependencies\r\n s.start(\"Installing dependencies...\");\r\n \r\n let packageManager = \"npm\";\r\n if (await fs.pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) {\r\n packageManager = \"pnpm\";\r\n } else if (await fs.pathExists(path.join(cwd, \"yarn.lock\"))) {\r\n packageManager = \"yarn\";\r\n } else if (await fs.pathExists(path.join(cwd, \"bun.lockb\"))) {\r\n packageManager = \"bun\";\r\n }\r\n\r\n const deps = [\"@hauktui/tokens\", \"@hauktui/core\", \"@hauktui/primitives-ink\", \"ink\", \"react\"];\r\n const installCmd = packageManager === \"npm\" \r\n ? `npm install ${deps.join(\" \")}`\r\n : packageManager === \"yarn\"\r\n ? `yarn add ${deps.join(\" \")}`\r\n : packageManager === \"bun\"\r\n ? `bun add ${deps.join(\" \")}`\r\n : `pnpm add ${deps.join(\" \")}`;\r\n\r\n try {\r\n await execAsync(installCmd, { cwd });\r\n s.stop(\"Dependencies installed\");\r\n } catch (error) {\r\n s.stop(\"Failed to install dependencies\");\r\n logger.warn(`Run manually: ${installCmd}`);\r\n }\r\n\r\n p.outro(\"✨ haukTUI initialized! Run `hauktui add button` to add your first component.\");\r\n });\r\n","import path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport type { HaukConfig, LockFile } from \"@hauktui/registry\";\r\n\r\nconst CONFIG_FILE = \"hauk.config.json\";\r\nconst LOCK_FILE = \"hauk.lock.json\";\r\n\r\n/**\r\n * Get the default config\r\n */\r\nexport function getDefaultConfig(): HaukConfig {\r\n return {\r\n $schema: \"https://hauktui.dev/schema/config.json\",\r\n componentDir: \"src/tui/components\",\r\n tokensPath: \"src/tui/tokens.ts\",\r\n registryUrl: \"https://raw.githubusercontent.com/hauktui/hauktui/main/packages/registry\",\r\n aliases: {\r\n \"@/tui\": \"./src/tui\",\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Get the default lock file\r\n */\r\nexport function getDefaultLockFile(): LockFile {\r\n return {\r\n version: \"1.0.0\",\r\n components: {},\r\n };\r\n}\r\n\r\n/**\r\n * Check if project has been initialized\r\n */\r\nexport async function isInitialized(cwd: string = process.cwd()): Promise<boolean> {\r\n const configPath = path.join(cwd, CONFIG_FILE);\r\n return fs.pathExists(configPath);\r\n}\r\n\r\n/**\r\n * Read the config file\r\n */\r\nexport async function readConfig(cwd: string = process.cwd()): Promise<HaukConfig | null> {\r\n const configPath = path.join(cwd, CONFIG_FILE);\r\n if (!(await fs.pathExists(configPath))) {\r\n return null;\r\n }\r\n return fs.readJson(configPath) as Promise<HaukConfig>;\r\n}\r\n\r\n/**\r\n * Write the config file\r\n */\r\nexport async function writeConfig(config: HaukConfig, cwd: string = process.cwd()): Promise<void> {\r\n const configPath = path.join(cwd, CONFIG_FILE);\r\n await fs.writeJson(configPath, config, { spaces: 2 });\r\n}\r\n\r\n/**\r\n * Read the lock file\r\n */\r\nexport async function readLockFile(cwd: string = process.cwd()): Promise<LockFile> {\r\n const lockPath = path.join(cwd, LOCK_FILE);\r\n if (!(await fs.pathExists(lockPath))) {\r\n return getDefaultLockFile();\r\n }\r\n return fs.readJson(lockPath) as Promise<LockFile>;\r\n}\r\n\r\n/**\r\n * Write the lock file\r\n */\r\nexport async function writeLockFile(lockFile: LockFile, cwd: string = process.cwd()): Promise<void> {\r\n const lockPath = path.join(cwd, LOCK_FILE);\r\n await fs.writeJson(lockPath, lockFile, { spaces: 2 });\r\n}\r\n\r\n/**\r\n * Get the component directory path\r\n */\r\nexport function getComponentDir(config: HaukConfig, cwd: string = process.cwd()): string {\r\n return path.join(cwd, config.componentDir);\r\n}\r\n\r\n/**\r\n * Get the path for a specific component\r\n */\r\nexport function getComponentPath(\r\n config: HaukConfig,\r\n componentName: string,\r\n cwd: string = process.cwd()\r\n): string {\r\n return path.join(getComponentDir(config, cwd), componentName);\r\n}\r\n","import pc from \"picocolors\";\r\n\r\nexport const logger = {\r\n info: (message: string) => console.log(pc.blue(\"ℹ\"), message),\r\n success: (message: string) => console.log(pc.green(\"✔\"), message),\r\n warn: (message: string) => console.log(pc.yellow(\"⚠\"), message),\r\n error: (message: string) => console.log(pc.red(\"✖\"), message),\r\n log: (message: string) => console.log(message),\r\n break: () => console.log(),\r\n};\r\n\r\nexport function highlight(text: string): string {\r\n return pc.cyan(text);\r\n}\r\n\r\nexport function dim(text: string): string {\r\n return pc.dim(text);\r\n}\r\n\r\nexport function bold(text: string): string {\r\n return pc.bold(text);\r\n}\r\n","import { Command } from \"commander\";\r\nimport * as p from \"@clack/prompts\";\r\nimport path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport { getComponent } from \"@hauktui/registry\";\r\nimport {\r\n readConfig,\r\n readLockFile,\r\n writeLockFile,\r\n getComponentPath,\r\n isInitialized,\r\n} from \"../utils/config.js\";\r\nimport {\r\n fetchComponentFiles,\r\n hashFile,\r\n validateComponents,\r\n getAvailableComponents,\r\n} from \"../utils/registry.js\";\r\nimport { logger, highlight } from \"../utils/logger.js\";\r\n\r\nexport const addCommand = new Command()\r\n .name(\"add\")\r\n .description(\"Add components to your project\")\r\n .argument(\"[components...]\", \"Components to add\")\r\n .option(\"-a, --all\", \"Install all available components\")\r\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\r\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\r\n .option(\"-c, --cwd <path>\", \"Working directory\", process.cwd())\r\n .action(async (components: string[], options) => {\r\n const cwd = options.cwd as string;\r\n\r\n // Check if initialized\r\n if (!(await isInitialized(cwd))) {\r\n logger.error(\"Project not initialized. Run `hauktui init` first.\");\r\n process.exit(1);\r\n }\r\n\r\n const config = await readConfig(cwd);\r\n if (!config) {\r\n logger.error(\"Could not read hauk.config.json\");\r\n process.exit(1);\r\n }\r\n\r\n // If --all flag is provided, get all available components\r\n let selectedComponents = components;\r\n if (options.all) {\r\n selectedComponents = getAvailableComponents();\r\n logger.info(`Installing all ${selectedComponents.length} components...`);\r\n } else if (selectedComponents.length === 0) {\r\n // If no components specified, prompt for selection\r\n const available = getAvailableComponents();\r\n const selected = await p.multiselect({\r\n message: \"Select components to add:\",\r\n options: available.map((name) => {\r\n const meta = getComponent(name);\r\n const option: { value: string; label: string; hint?: string } = {\r\n value: name,\r\n label: name,\r\n };\r\n if (meta?.description) {\r\n option.hint = meta.description;\r\n }\r\n return option;\r\n }),\r\n });\r\n\r\n if (p.isCancel(selected)) {\r\n p.cancel(\"Operation cancelled.\");\r\n process.exit(0);\r\n }\r\n\r\n selectedComponents = selected as string[];\r\n }\r\n\r\n if (selectedComponents.length === 0) {\r\n logger.warn(\"No components selected.\");\r\n process.exit(0);\r\n }\r\n\r\n // Validate component names\r\n const { valid, invalid } = validateComponents(selectedComponents);\r\n\r\n if (invalid.length > 0) {\r\n logger.error(`Unknown components: ${invalid.join(\", \")}`);\r\n logger.info(`Available: ${getAvailableComponents().join(\", \")}`);\r\n process.exit(1);\r\n }\r\n\r\n const s = p.spinner();\r\n const lockFile = await readLockFile(cwd);\r\n let addedCount = 0;\r\n\r\n for (const meta of valid) {\r\n s.start(`Adding ${highlight(meta.name)}...`);\r\n\r\n const targetDir = getComponentPath(config, meta.name, cwd);\r\n\r\n // Check if component already exists\r\n if (await fs.pathExists(targetDir)) {\r\n if (!options.overwrite) {\r\n const existingEntry = lockFile.components[meta.name];\r\n if (existingEntry) {\r\n s.stop(\r\n `${meta.name} already installed (v${existingEntry.version})`\r\n );\r\n continue;\r\n }\r\n\r\n if (!options.yes) {\r\n s.stop();\r\n const overwrite = await p.confirm({\r\n message: `${meta.name} already exists. Overwrite?`,\r\n initialValue: false,\r\n });\r\n\r\n if (p.isCancel(overwrite) || !overwrite) {\r\n continue;\r\n }\r\n s.start(`Adding ${highlight(meta.name)}...`);\r\n }\r\n }\r\n }\r\n\r\n // Fetch component files\r\n const files = await fetchComponentFiles(meta.name);\r\n if (!files) {\r\n s.stop(`Failed to fetch ${meta.name}`);\r\n continue;\r\n }\r\n\r\n // Create component directory\r\n await fs.ensureDir(targetDir);\r\n\r\n // Write files and calculate hashes\r\n const fileHashes: Record<string, string> = {};\r\n for (const [filename, content] of files) {\r\n const filePath = path.join(targetDir, filename);\r\n await fs.writeFile(filePath, content);\r\n fileHashes[filename] = hashFile(content);\r\n }\r\n\r\n // Update lock file\r\n lockFile.components[meta.name] = {\r\n name: meta.name,\r\n version: meta.version,\r\n files: fileHashes,\r\n installedAt: new Date().toISOString(),\r\n };\r\n\r\n addedCount++;\r\n s.stop(`Added ${highlight(meta.name)}`);\r\n\r\n // Show notes if any\r\n if (meta.notes) {\r\n logger.info(` └─ ${meta.notes}`);\r\n }\r\n }\r\n\r\n // Save lock file\r\n await writeLockFile(lockFile, cwd);\r\n\r\n logger.break();\r\n if (addedCount > 0) {\r\n logger.success(\r\n `Added ${addedCount} component(s) to ${config.componentDir}`\r\n );\r\n } else {\r\n logger.info(\"No components were added.\");\r\n }\r\n });\r\n","import crypto from \"node:crypto\";\r\nimport path from \"node:path\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport fs from \"fs-extra\";\r\nimport pc from \"picocolors\";\r\nimport { getComponent, getComponents } from \"@hauktui/registry\";\r\nimport type { ComponentMeta } from \"@hauktui/registry\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\nconst __dirname = path.dirname(__filename);\r\n\r\n/**\r\n * Calculate file hash for change detection\r\n */\r\nexport function hashFile(content: string): string {\r\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\r\n}\r\n\r\n/**\r\n * Get component source from registry package\r\n */\r\nexport function getComponentSource(componentName: string): string {\r\n // In bundled mode, we need to find the registry package components\r\n // __dirname is packages/cli/dist (or packages/cli/src when running with ts)\r\n // Go up: dist -> cli -> packages -> then into packages/registry/components\r\n const packagesDir = path.resolve(__dirname, \"..\", \"..\", \"..\");\r\n const registryComponents = path.resolve(packagesDir, \"packages\", \"registry\", \"components\");\r\n return path.join(registryComponents, componentName);\r\n}\r\n\r\n/**\r\n * Fetch component files (local bundled mode)\r\n */\r\nexport async function fetchComponentFiles(\r\n componentName: string\r\n): Promise<Map<string, string> | null> {\r\n const meta = getComponent(componentName);\r\n if (!meta) {\r\n return null;\r\n }\r\n\r\n const sourcePath = getComponentSource(componentName);\r\n const files = new Map<string, string>();\r\n\r\n for (const file of meta.files) {\r\n const filePath = path.join(sourcePath, file);\r\n if (await fs.pathExists(filePath)) {\r\n const content = await fs.readFile(filePath, \"utf-8\");\r\n files.set(file, content);\r\n }\r\n }\r\n\r\n return files;\r\n}\r\n\r\n/**\r\n * Try to fetch from remote, fall back to bundled\r\n */\r\nexport async function fetchComponentFilesWithFallback(\r\n componentName: string,\r\n registryUrl?: string\r\n): Promise<{ files: Map<string, string>; source: \"remote\" | \"bundled\" } | null> {\r\n // For now, always use bundled (remote fetching can be added later)\r\n const files = await fetchComponentFiles(componentName);\r\n if (!files) {\r\n return null;\r\n }\r\n return { files, source: \"bundled\" };\r\n}\r\n\r\n/**\r\n * Get all available component names\r\n */\r\nexport function getAvailableComponents(): string[] {\r\n return getComponents().map((c) => c.name);\r\n}\r\n\r\n/**\r\n * Validate component names\r\n */\r\nexport function validateComponents(names: string[]): {\r\n valid: ComponentMeta[];\r\n invalid: string[];\r\n} {\r\n const valid: ComponentMeta[] = [];\r\n const invalid: string[] = [];\r\n\r\n for (const name of names) {\r\n const meta = getComponent(name);\r\n if (meta) {\r\n valid.push(meta);\r\n } else {\r\n invalid.push(name);\r\n }\r\n }\r\n\r\n return { valid, invalid };\r\n}\r\n\r\n/**\r\n * Format component info for display\r\n */\r\nexport function formatComponentInfo(meta: ComponentMeta): string {\r\n return `${pc.bold(meta.name)} ${pc.dim(`v${meta.version}`)}\r\n ${meta.description}\r\n ${pc.dim(\"Category:\")} ${meta.category}\r\n ${pc.dim(\"Tags:\")} ${meta.tags.join(\", \")}\r\n ${pc.dim(\"Files:\")} ${meta.files.join(\", \")}\r\n ${meta.notes ? `${pc.dim(\"Note:\")} ${meta.notes}` : \"\"}`;\r\n}\r\n","import { Command } from \"commander\";\r\nimport { getComponents, searchComponents } from \"@hauktui/registry\";\r\nimport { logger, highlight, dim } from \"../utils/logger.js\";\r\n\r\nexport const listCommand = new Command()\r\n .name(\"list\")\r\n .alias(\"ls\")\r\n .description(\"List available components\")\r\n .option(\"-s, --search <query>\", \"Search components\")\r\n .option(\"-c, --category <category>\", \"Filter by category\")\r\n .action(async (options) => {\r\n let components = getComponents();\r\n\r\n // Apply search filter\r\n if (options.search) {\r\n components = searchComponents(options.search);\r\n }\r\n\r\n // Apply category filter\r\n if (options.category) {\r\n components = components.filter((c) => c.category === options.category);\r\n }\r\n\r\n if (components.length === 0) {\r\n logger.warn(\"No components found.\");\r\n return;\r\n }\r\n\r\n logger.log(\"\\nAvailable components:\\n\");\r\n\r\n // Group by category\r\n const byCategory = new Map<string, typeof components>();\r\n for (const comp of components) {\r\n const existing = byCategory.get(comp.category) ?? [];\r\n existing.push(comp);\r\n byCategory.set(comp.category, existing);\r\n }\r\n\r\n for (const [category, comps] of byCategory) {\r\n logger.log(`${highlight(category.toUpperCase())}`);\r\n for (const comp of comps) {\r\n logger.log(` ${comp.name.padEnd(15)} ${dim(comp.description)}`);\r\n }\r\n logger.break();\r\n }\r\n\r\n logger.log(dim(`Run \\`hauktui add <component>\\` to add a component`));\r\n });\r\n","import { Command } from \"commander\";\r\nimport { getComponent } from \"@hauktui/registry\";\r\nimport { formatComponentInfo } from \"../utils/registry.js\";\r\nimport { logger } from \"../utils/logger.js\";\r\n\r\nexport const viewCommand = new Command()\r\n .name(\"view\")\r\n .description(\"View component details\")\r\n .argument(\"<component>\", \"Component name\")\r\n .action(async (componentName: string) => {\r\n const meta = getComponent(componentName);\r\n\r\n if (!meta) {\r\n logger.error(`Component \"${componentName}\" not found.`);\r\n process.exit(1);\r\n }\r\n\r\n logger.break();\r\n logger.log(formatComponentInfo(meta));\r\n logger.break();\r\n });\r\n","import { Command } from \"commander\";\r\nimport path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport pc from \"picocolors\";\r\nimport { getComponent } from \"@hauktui/registry\";\r\nimport {\r\n readConfig,\r\n readLockFile,\r\n getComponentPath,\r\n isInitialized,\r\n} from \"../utils/config.js\";\r\nimport { fetchComponentFiles, hashFile } from \"../utils/registry.js\";\r\nimport { logger, highlight } from \"../utils/logger.js\";\r\n\r\nexport const diffCommand = new Command()\r\n .name(\"diff\")\r\n .description(\"Show differences between local and upstream components\")\r\n .argument(\"<component>\", \"Component to diff\")\r\n .option(\"-c, --cwd <path>\", \"Working directory\", process.cwd())\r\n .action(async (componentName: string, options) => {\r\n const cwd = options.cwd as string;\r\n\r\n // Check if initialized\r\n if (!(await isInitialized(cwd))) {\r\n logger.error(\"Project not initialized. Run `hauktui init` first.\");\r\n process.exit(1);\r\n }\r\n\r\n const config = await readConfig(cwd);\r\n if (!config) {\r\n logger.error(\"Could not read hauk.config.json\");\r\n process.exit(1);\r\n }\r\n\r\n const meta = getComponent(componentName);\r\n if (!meta) {\r\n logger.error(`Component \"${componentName}\" not found in registry.`);\r\n process.exit(1);\r\n }\r\n\r\n const lockFile = await readLockFile(cwd);\r\n const installed = lockFile.components[componentName];\r\n\r\n if (!installed) {\r\n logger.error(`Component \"${componentName}\" is not installed.`);\r\n process.exit(1);\r\n }\r\n\r\n const componentDir = getComponentPath(config, componentName, cwd);\r\n \r\n if (!(await fs.pathExists(componentDir))) {\r\n logger.error(`Component directory not found: ${componentDir}`);\r\n process.exit(1);\r\n }\r\n\r\n // Fetch upstream files\r\n const upstreamFiles = await fetchComponentFiles(componentName);\r\n if (!upstreamFiles) {\r\n logger.error(\"Failed to fetch upstream component.\");\r\n process.exit(1);\r\n }\r\n\r\n logger.break();\r\n logger.log(`Comparing ${highlight(componentName)} (local v${installed.version} ↔ upstream v${meta.version})`);\r\n logger.break();\r\n\r\n let hasChanges = false;\r\n\r\n for (const [filename, upstreamContent] of upstreamFiles) {\r\n const localPath = path.join(componentDir, filename);\r\n const localExists = await fs.pathExists(localPath);\r\n\r\n if (!localExists) {\r\n logger.log(`${pc.red(\"- \" + filename)} ${pc.dim(\"(missing locally)\")}`);\r\n hasChanges = true;\r\n continue;\r\n }\r\n\r\n const localContent = await fs.readFile(localPath, \"utf-8\");\r\n const localHash = hashFile(localContent);\r\n const upstreamHash = hashFile(upstreamContent);\r\n const installedHash = installed.files[filename];\r\n\r\n if (localHash === upstreamHash) {\r\n logger.log(`${pc.green(\"✓ \" + filename)} ${pc.dim(\"(unchanged)\")}`);\r\n } else if (localHash === installedHash) {\r\n logger.log(`${pc.yellow(\"↑ \" + filename)} ${pc.dim(\"(upstream updated)\")}`);\r\n hasChanges = true;\r\n } else if (upstreamHash === installedHash) {\r\n logger.log(`${pc.blue(\"● \" + filename)} ${pc.dim(\"(local modifications)\")}`);\r\n hasChanges = true;\r\n } else {\r\n logger.log(`${pc.magenta(\"⚡ \" + filename)} ${pc.dim(\"(both modified)\")}`);\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n // Check for extra local files\r\n const localFiles = await fs.readdir(componentDir);\r\n for (const file of localFiles) {\r\n if (!upstreamFiles.has(file)) {\r\n logger.log(`${pc.cyan(\"+ \" + file)} ${pc.dim(\"(local only)\")}`);\r\n hasChanges = true;\r\n }\r\n }\r\n\r\n logger.break();\r\n if (!hasChanges) {\r\n logger.success(\"No differences found.\");\r\n } else {\r\n logger.info(\"Run `hauktui add --overwrite \" + componentName + \"` to update.\");\r\n }\r\n });\r\n","import { Command } from \"commander\";\r\nimport * as p from \"@clack/prompts\";\r\nimport path from \"node:path\";\r\nimport fs from \"fs-extra\";\r\nimport { getComponent } from \"@hauktui/registry\";\r\nimport {\r\n readConfig,\r\n readLockFile,\r\n writeLockFile,\r\n getComponentPath,\r\n isInitialized,\r\n} from \"../utils/config.js\";\r\nimport { fetchComponentFiles, hashFile } from \"../utils/registry.js\";\r\nimport { logger, highlight } from \"../utils/logger.js\";\r\n\r\ninterface UpdateCandidate {\r\n name: string;\r\n installedVersion: string;\r\n latestVersion: string;\r\n hasLocalChanges: boolean;\r\n}\r\n\r\nexport const updateCommand = new Command()\r\n .name(\"update\")\r\n .description(\"Update installed components to latest versions\")\r\n .argument(\"[components...]\", \"Components to update (default: all)\")\r\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\r\n .option(\"-f, --force\", \"Force update even with local modifications\")\r\n .option(\"--check\", \"Only check for updates without applying\")\r\n .option(\"-c, --cwd <path>\", \"Working directory\", process.cwd())\r\n .action(async (components: string[], options) => {\r\n const cwd = options.cwd as string;\r\n\r\n // Check if initialized\r\n if (!(await isInitialized(cwd))) {\r\n logger.error(\"Project not initialized. Run `hauktui init` first.\");\r\n process.exit(1);\r\n }\r\n\r\n const config = await readConfig(cwd);\r\n if (!config) {\r\n logger.error(\"Could not read hauk.config.json\");\r\n process.exit(1);\r\n }\r\n\r\n const lockFile = await readLockFile(cwd);\r\n const installedComponents = Object.keys(lockFile.components);\r\n\r\n if (installedComponents.length === 0) {\r\n logger.info(\"No components installed.\");\r\n process.exit(0);\r\n }\r\n\r\n // Determine which components to check\r\n let componentsToCheck = components.length > 0 ? components : installedComponents;\r\n\r\n // Validate that specified components are installed\r\n const notInstalled = componentsToCheck.filter((c) => !lockFile.components[c]);\r\n if (notInstalled.length > 0) {\r\n logger.error(`Not installed: ${notInstalled.join(\", \")}`);\r\n process.exit(1);\r\n }\r\n\r\n const s = p.spinner();\r\n s.start(\"Checking for updates...\");\r\n\r\n const candidates: UpdateCandidate[] = [];\r\n\r\n for (const componentName of componentsToCheck) {\r\n const installed = lockFile.components[componentName];\r\n if (!installed) continue;\r\n\r\n const meta = getComponent(componentName);\r\n if (!meta) {\r\n logger.warn(`Component \"${componentName}\" not found in registry.`);\r\n continue;\r\n }\r\n\r\n const componentDir = getComponentPath(config, componentName, cwd);\r\n\r\n // Check if there are local modifications\r\n let hasLocalChanges = false;\r\n if (await fs.pathExists(componentDir)) {\r\n for (const [filename, installedHash] of Object.entries(installed.files)) {\r\n const filePath = path.join(componentDir, filename);\r\n if (await fs.pathExists(filePath)) {\r\n const localContent = await fs.readFile(filePath, \"utf-8\");\r\n const localHash = hashFile(localContent);\r\n if (localHash !== installedHash) {\r\n hasLocalChanges = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Check if there's a new version available\r\n if (meta.version !== installed.version) {\r\n candidates.push({\r\n name: componentName,\r\n installedVersion: installed.version,\r\n latestVersion: meta.version,\r\n hasLocalChanges,\r\n });\r\n }\r\n }\r\n\r\n s.stop();\r\n\r\n if (candidates.length === 0) {\r\n logger.success(\"All components are up to date!\");\r\n process.exit(0);\r\n }\r\n\r\n // Display update candidates\r\n logger.break();\r\n logger.log(\"Updates available:\");\r\n logger.break();\r\n\r\n for (const candidate of candidates) {\r\n const versionInfo = `${candidate.installedVersion} → ${candidate.latestVersion}`;\r\n const localChangeWarning = candidate.hasLocalChanges\r\n ? \" (has local modifications)\"\r\n : \"\";\r\n\r\n logger.log(\r\n ` ${highlight(candidate.name)} ${versionInfo}${localChangeWarning}`\r\n );\r\n }\r\n\r\n logger.break();\r\n\r\n // Check-only mode\r\n if (options.check) {\r\n logger.info(`${candidates.length} update(s) available.`);\r\n logger.info(\"Run `hauktui update` to apply updates.\");\r\n process.exit(0);\r\n }\r\n\r\n // Components with local changes\r\n const withLocalChanges = candidates.filter((c) => c.hasLocalChanges);\r\n if (withLocalChanges.length > 0 && !options.force) {\r\n logger.warn(\r\n `${withLocalChanges.length} component(s) have local modifications.`\r\n );\r\n logger.info(\"Use --force to overwrite, or update individually.\");\r\n \r\n // Filter out components with local changes\r\n const safeToUpdate = candidates.filter((c) => !c.hasLocalChanges);\r\n if (safeToUpdate.length === 0) {\r\n process.exit(0);\r\n }\r\n\r\n if (!options.yes) {\r\n const proceed = await p.confirm({\r\n message: `Update ${safeToUpdate.length} component(s) without local changes?`,\r\n initialValue: true,\r\n });\r\n\r\n if (p.isCancel(proceed) || !proceed) {\r\n p.cancel(\"Update cancelled.\");\r\n process.exit(0);\r\n }\r\n }\r\n\r\n // Update only safe components\r\n await performUpdates(safeToUpdate, config, lockFile, cwd);\r\n } else {\r\n // Confirm update\r\n if (!options.yes) {\r\n const proceed = await p.confirm({\r\n message: `Update ${candidates.length} component(s)?`,\r\n initialValue: true,\r\n });\r\n\r\n if (p.isCancel(proceed) || !proceed) {\r\n p.cancel(\"Update cancelled.\");\r\n process.exit(0);\r\n }\r\n }\r\n\r\n await performUpdates(candidates, config, lockFile, cwd);\r\n }\r\n\r\n // Save lock file\r\n await writeLockFile(lockFile, cwd);\r\n\r\n logger.break();\r\n logger.success(\"Update complete!\");\r\n });\r\n\r\nasync function performUpdates(\r\n candidates: UpdateCandidate[],\r\n config: { componentDir: string },\r\n lockFile: { components: Record<string, unknown> },\r\n cwd: string\r\n): Promise<void> {\r\n const s = p.spinner();\r\n\r\n for (const candidate of candidates) {\r\n s.start(`Updating ${highlight(candidate.name)}...`);\r\n\r\n const meta = getComponent(candidate.name);\r\n if (!meta) {\r\n s.stop(`Skipped ${candidate.name} (not in registry)`);\r\n continue;\r\n }\r\n\r\n const targetDir = getComponentPath(config, candidate.name, cwd);\r\n\r\n // Fetch latest files\r\n const files = await fetchComponentFiles(candidate.name);\r\n if (!files) {\r\n s.stop(`Failed to fetch ${candidate.name}`);\r\n continue;\r\n }\r\n\r\n // Create component directory if needed\r\n await fs.ensureDir(targetDir);\r\n\r\n // Write files and calculate hashes\r\n const fileHashes: Record<string, string> = {};\r\n for (const [filename, content] of files) {\r\n const filePath = path.join(targetDir, filename);\r\n await fs.writeFile(filePath, content);\r\n fileHashes[filename] = hashFile(content);\r\n }\r\n\r\n // Update lock file entry\r\n (lockFile.components as Record<string, unknown>)[candidate.name] = {\r\n name: candidate.name,\r\n version: meta.version,\r\n files: fileHashes,\r\n installedAt: new Date().toISOString(),\r\n };\r\n\r\n s.stop(\r\n `Updated ${highlight(candidate.name)} (${candidate.installedVersion} → ${candidate.latestVersion})`\r\n );\r\n }\r\n}\r\n","#!/usr/bin/env node\n\n// @hauktui/cli\n// CLI for haukTUI - add components to your project\n\nimport { run } from \"./cli.js\";\n\nrun();\n"],"mappings":";;;;AAAA,SAAS,WAAAA,gBAAe;;;ACAxB,SAAS,eAAe;AACxB,YAAY,OAAO;AACnB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,YAAY;AACrB,SAAS,iBAAiB;;;ACL1B,OAAO,UAAU;AACjB,OAAO,QAAQ;AAGf,IAAM,cAAc;AACpB,IAAM,YAAY;AAKX,SAAS,mBAA+B;AAC7C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAS;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAKO,SAAS,qBAA+B;AAC7C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY,CAAC;AAAA,EACf;AACF;AAKA,eAAsB,cAAc,MAAc,QAAQ,IAAI,GAAqB;AACjF,QAAM,aAAa,KAAK,KAAK,KAAK,WAAW;AAC7C,SAAO,GAAG,WAAW,UAAU;AACjC;AAKA,eAAsB,WAAW,MAAc,QAAQ,IAAI,GAA+B;AACxF,QAAM,aAAa,KAAK,KAAK,KAAK,WAAW;AAC7C,MAAI,CAAE,MAAM,GAAG,WAAW,UAAU,GAAI;AACtC,WAAO;AAAA,EACT;AACA,SAAO,GAAG,SAAS,UAAU;AAC/B;AAKA,eAAsB,YAAY,QAAoB,MAAc,QAAQ,IAAI,GAAkB;AAChG,QAAM,aAAa,KAAK,KAAK,KAAK,WAAW;AAC7C,QAAM,GAAG,UAAU,YAAY,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACtD;AAKA,eAAsB,aAAa,MAAc,QAAQ,IAAI,GAAsB;AACjF,QAAM,WAAW,KAAK,KAAK,KAAK,SAAS;AACzC,MAAI,CAAE,MAAM,GAAG,WAAW,QAAQ,GAAI;AACpC,WAAO,mBAAmB;AAAA,EAC5B;AACA,SAAO,GAAG,SAAS,QAAQ;AAC7B;AAKA,eAAsB,cAAc,UAAoB,MAAc,QAAQ,IAAI,GAAkB;AAClG,QAAM,WAAW,KAAK,KAAK,KAAK,SAAS;AACzC,QAAM,GAAG,UAAU,UAAU,UAAU,EAAE,QAAQ,EAAE,CAAC;AACtD;AAKO,SAAS,gBAAgB,QAAoB,MAAc,QAAQ,IAAI,GAAW;AACvF,SAAO,KAAK,KAAK,KAAK,OAAO,YAAY;AAC3C;AAKO,SAAS,iBACd,QACA,eACA,MAAc,QAAQ,IAAI,GAClB;AACR,SAAO,KAAK,KAAK,gBAAgB,QAAQ,GAAG,GAAG,aAAa;AAC9D;;;AC9FA,OAAO,QAAQ;AAER,IAAM,SAAS;AAAA,EACpB,MAAM,CAAC,YAAoB,QAAQ,IAAI,GAAG,KAAK,QAAG,GAAG,OAAO;AAAA,EAC5D,SAAS,CAAC,YAAoB,QAAQ,IAAI,GAAG,MAAM,QAAG,GAAG,OAAO;AAAA,EAChE,MAAM,CAAC,YAAoB,QAAQ,IAAI,GAAG,OAAO,QAAG,GAAG,OAAO;AAAA,EAC9D,OAAO,CAAC,YAAoB,QAAQ,IAAI,GAAG,IAAI,QAAG,GAAG,OAAO;AAAA,EAC5D,KAAK,CAAC,YAAoB,QAAQ,IAAI,OAAO;AAAA,EAC7C,OAAO,MAAM,QAAQ,IAAI;AAC3B;AAEO,SAAS,UAAUC,OAAsB;AAC9C,SAAO,GAAG,KAAKA,KAAI;AACrB;AAEO,SAAS,IAAIA,OAAsB;AACxC,SAAO,GAAG,IAAIA,KAAI;AACpB;;;AFRA,IAAM,YAAY,UAAU,IAAI;AAEzB,IAAM,cAAc,IAAI,QAAQ,EACpC,KAAK,MAAM,EACX,YAAY,oCAAoC,EAChD,OAAO,aAAa,+BAA+B,EACnD,OAAO,oBAAoB,qBAAqB,QAAQ,IAAI,CAAC,EAC7D,OAAO,OAAO,YAAY;AACzB,QAAM,MAAM,QAAQ;AAEpB,EAAE,QAAM,gCAAoB;AAG5B,MAAI,MAAM,cAAc,GAAG,GAAG;AAC5B,UAAM,iBAAiB,MAAQ,UAAQ;AAAA,MACrC,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAED,QAAM,WAAS,cAAc,KAAK,CAAC,gBAAgB;AACjD,MAAE,SAAO,2BAA2B;AACpC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,SAAS,iBAAiB;AAE9B,MAAI,CAAC,QAAQ,KAAK;AAChB,UAAMC,gBAAe,MAAQ,OAAK;AAAA,MAChC,SAAS;AAAA,MACT,cAAc,OAAO;AAAA,MACrB,aAAa;AAAA,IACf,CAAC;AAED,QAAM,WAASA,aAAY,GAAG;AAC5B,MAAE,SAAO,2BAA2B;AACpC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,WAAO,eAAeA;AAAA,EACxB;AAEA,QAAM,IAAM,UAAQ;AAGpB,IAAE,MAAM,iCAAiC;AACzC,QAAM,eAAeC,MAAK,KAAK,KAAK,OAAO,YAAY;AACvD,QAAMC,IAAG,UAAU,YAAY;AAC/B,IAAE,KAAK,6BAA6B;AAGpC,IAAE,MAAM,0BAA0B;AAClC,QAAM,YAAY,QAAQ,GAAG;AAC7B,IAAE,KAAK,qBAAqB;AAG5B,IAAE,MAAM,yBAAyB;AACjC,QAAM,YAAYD,MAAK,QAAQA,MAAK,KAAK,KAAK,OAAO,cAAc,mBAAmB,CAAC;AACvF,QAAMC,IAAG,UAAU,SAAS;AAE5B,QAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAetB,QAAMA,IAAG;AAAA,IACPD,MAAK,KAAK,KAAK,OAAO,cAAc,mBAAmB;AAAA,IACvD;AAAA,EACF;AACA,IAAE,KAAK,qBAAqB;AAG5B,IAAE,MAAM,4BAA4B;AAEpC,MAAI,iBAAiB;AACrB,MAAI,MAAMC,IAAG,WAAWD,MAAK,KAAK,KAAK,gBAAgB,CAAC,GAAG;AACzD,qBAAiB;AAAA,EACnB,WAAW,MAAMC,IAAG,WAAWD,MAAK,KAAK,KAAK,WAAW,CAAC,GAAG;AAC3D,qBAAiB;AAAA,EACnB,WAAW,MAAMC,IAAG,WAAWD,MAAK,KAAK,KAAK,WAAW,CAAC,GAAG;AAC3D,qBAAiB;AAAA,EACnB;AAEA,QAAM,OAAO,CAAC,mBAAmB,iBAAiB,2BAA2B,OAAO,OAAO;AAC3F,QAAM,aAAa,mBAAmB,QAClC,eAAe,KAAK,KAAK,GAAG,CAAC,KAC7B,mBAAmB,SACnB,YAAY,KAAK,KAAK,GAAG,CAAC,KAC1B,mBAAmB,QACnB,WAAW,KAAK,KAAK,GAAG,CAAC,KACzB,YAAY,KAAK,KAAK,GAAG,CAAC;AAE9B,MAAI;AACF,UAAM,UAAU,YAAY,EAAE,IAAI,CAAC;AACnC,MAAE,KAAK,wBAAwB;AAAA,EACjC,SAAS,OAAO;AACd,MAAE,KAAK,gCAAgC;AACvC,WAAO,KAAK,iBAAiB,UAAU,EAAE;AAAA,EAC3C;AAEA,EAAE,QAAM,mFAA8E;AACxF,CAAC;;;AGxHH,SAAS,WAAAE,gBAAe;AACxB,YAAYC,QAAO;AACnB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,gBAAAC,qBAAoB;;;ACJ7B,OAAO,YAAY;AACnB,OAAOC,WAAU;AACjB,SAAS,qBAAqB;AAC9B,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,SAAS,cAAc,qBAAqB;AAG5C,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYF,MAAK,QAAQ,UAAU;AAKlC,SAAS,SAAS,SAAyB;AAChD,SAAO,OAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC9E;AAKO,SAAS,mBAAmB,eAA+B;AAIhE,QAAM,cAAcA,MAAK,QAAQ,WAAW,MAAM,MAAM,IAAI;AAC5D,QAAM,qBAAqBA,MAAK,QAAQ,aAAa,YAAY,YAAY,YAAY;AACzF,SAAOA,MAAK,KAAK,oBAAoB,aAAa;AACpD;AAKA,eAAsB,oBACpB,eACqC;AACrC,QAAM,OAAO,aAAa,aAAa;AACvC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,mBAAmB,aAAa;AACnD,QAAM,QAAQ,oBAAI,IAAoB;AAEtC,aAAW,QAAQ,KAAK,OAAO;AAC7B,UAAM,WAAWA,MAAK,KAAK,YAAY,IAAI;AAC3C,QAAI,MAAMC,IAAG,WAAW,QAAQ,GAAG;AACjC,YAAM,UAAU,MAAMA,IAAG,SAAS,UAAU,OAAO;AACnD,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAoBO,SAAS,yBAAmC;AACjD,SAAO,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAC1C;AAKO,SAAS,mBAAmB,OAGjC;AACA,QAAM,QAAyB,CAAC;AAChC,QAAM,UAAoB,CAAC;AAE3B,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,aAAa,IAAI;AAC9B,QAAI,MAAM;AACR,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAKO,SAAS,oBAAoB,MAA6B;AAC/D,SAAO,GAAGE,IAAG,KAAK,KAAK,IAAI,CAAC,IAAIA,IAAG,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;AAAA,IACxD,KAAK,WAAW;AAAA,IAChBA,IAAG,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ;AAAA,IACpCA,IAAG,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,IACvCA,IAAG,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,IACzC,KAAK,QAAQ,GAAGA,IAAG,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,KAAK,EAAE;AACxD;;;ADzFO,IAAM,aAAa,IAAIC,SAAQ,EACnC,KAAK,KAAK,EACV,YAAY,gCAAgC,EAC5C,SAAS,mBAAmB,mBAAmB,EAC/C,OAAO,aAAa,kCAAkC,EACtD,OAAO,aAAa,2BAA2B,EAC/C,OAAO,mBAAmB,0BAA0B,EACpD,OAAO,oBAAoB,qBAAqB,QAAQ,IAAI,CAAC,EAC7D,OAAO,OAAO,YAAsB,YAAY;AAC/C,QAAM,MAAM,QAAQ;AAGpB,MAAI,CAAE,MAAM,cAAc,GAAG,GAAI;AAC/B,WAAO,MAAM,oDAAoD;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,WAAO,MAAM,iCAAiC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,qBAAqB;AACzB,MAAI,QAAQ,KAAK;AACf,yBAAqB,uBAAuB;AAC5C,WAAO,KAAK,kBAAkB,mBAAmB,MAAM,gBAAgB;AAAA,EACzE,WAAW,mBAAmB,WAAW,GAAG;AAE1C,UAAM,YAAY,uBAAuB;AACzC,UAAM,WAAW,MAAQ,eAAY;AAAA,MACnC,SAAS;AAAA,MACT,SAAS,UAAU,IAAI,CAAC,SAAS;AAC/B,cAAM,OAAOC,cAAa,IAAI;AAC9B,cAAM,SAA0D;AAAA,UAC9D,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AACA,YAAI,MAAM,aAAa;AACrB,iBAAO,OAAO,KAAK;AAAA,QACrB;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAED,QAAM,YAAS,QAAQ,GAAG;AACxB,MAAE,UAAO,sBAAsB;AAC/B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,yBAAqB;AAAA,EACvB;AAEA,MAAI,mBAAmB,WAAW,GAAG;AACnC,WAAO,KAAK,yBAAyB;AACrC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,EAAE,OAAO,QAAQ,IAAI,mBAAmB,kBAAkB;AAEhE,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,MAAM,uBAAuB,QAAQ,KAAK,IAAI,CAAC,EAAE;AACxD,WAAO,KAAK,cAAc,uBAAuB,EAAE,KAAK,IAAI,CAAC,EAAE;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,IAAM,WAAQ;AACpB,QAAM,WAAW,MAAM,aAAa,GAAG;AACvC,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,MAAE,MAAM,UAAU,UAAU,KAAK,IAAI,CAAC,KAAK;AAE3C,UAAM,YAAY,iBAAiB,QAAQ,KAAK,MAAM,GAAG;AAGzD,QAAI,MAAMC,IAAG,WAAW,SAAS,GAAG;AAClC,UAAI,CAAC,QAAQ,WAAW;AACtB,cAAM,gBAAgB,SAAS,WAAW,KAAK,IAAI;AACnD,YAAI,eAAe;AACjB,YAAE;AAAA,YACA,GAAG,KAAK,IAAI,wBAAwB,cAAc,OAAO;AAAA,UAC3D;AACA;AAAA,QACF;AAEA,YAAI,CAAC,QAAQ,KAAK;AAChB,YAAE,KAAK;AACP,gBAAM,YAAY,MAAQ,WAAQ;AAAA,YAChC,SAAS,GAAG,KAAK,IAAI;AAAA,YACrB,cAAc;AAAA,UAChB,CAAC;AAED,cAAM,YAAS,SAAS,KAAK,CAAC,WAAW;AACvC;AAAA,UACF;AACA,YAAE,MAAM,UAAU,UAAU,KAAK,IAAI,CAAC,KAAK;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAGA,UAAM,QAAQ,MAAM,oBAAoB,KAAK,IAAI;AACjD,QAAI,CAAC,OAAO;AACV,QAAE,KAAK,mBAAmB,KAAK,IAAI,EAAE;AACrC;AAAA,IACF;AAGA,UAAMA,IAAG,UAAU,SAAS;AAG5B,UAAM,aAAqC,CAAC;AAC5C,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO;AACvC,YAAM,WAAWC,MAAK,KAAK,WAAW,QAAQ;AAC9C,YAAMD,IAAG,UAAU,UAAU,OAAO;AACpC,iBAAW,QAAQ,IAAI,SAAS,OAAO;AAAA,IACzC;AAGA,aAAS,WAAW,KAAK,IAAI,IAAI;AAAA,MAC/B,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,OAAO;AAAA,MACP,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AAEA;AACA,MAAE,KAAK,SAAS,UAAU,KAAK,IAAI,CAAC,EAAE;AAGtC,QAAI,KAAK,OAAO;AACd,aAAO,KAAK,kBAAQ,KAAK,KAAK,EAAE;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,cAAc,UAAU,GAAG;AAEjC,SAAO,MAAM;AACb,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,MACL,SAAS,UAAU,oBAAoB,OAAO,YAAY;AAAA,IAC5D;AAAA,EACF,OAAO;AACL,WAAO,KAAK,2BAA2B;AAAA,EACzC;AACF,CAAC;;;AEzKH,SAAS,WAAAE,gBAAe;AACxB,SAAS,iBAAAC,gBAAe,wBAAwB;AAGzC,IAAM,cAAc,IAAIC,SAAQ,EACpC,KAAK,MAAM,EACX,MAAM,IAAI,EACV,YAAY,2BAA2B,EACvC,OAAO,wBAAwB,mBAAmB,EAClD,OAAO,6BAA6B,oBAAoB,EACxD,OAAO,OAAO,YAAY;AACzB,MAAI,aAAaC,eAAc;AAG/B,MAAI,QAAQ,QAAQ;AAClB,iBAAa,iBAAiB,QAAQ,MAAM;AAAA,EAC9C;AAGA,MAAI,QAAQ,UAAU;AACpB,iBAAa,WAAW,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,QAAQ;AAAA,EACvE;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,KAAK,sBAAsB;AAClC;AAAA,EACF;AAEA,SAAO,IAAI,2BAA2B;AAGtC,QAAM,aAAa,oBAAI,IAA+B;AACtD,aAAW,QAAQ,YAAY;AAC7B,UAAM,WAAW,WAAW,IAAI,KAAK,QAAQ,KAAK,CAAC;AACnD,aAAS,KAAK,IAAI;AAClB,eAAW,IAAI,KAAK,UAAU,QAAQ;AAAA,EACxC;AAEA,aAAW,CAAC,UAAU,KAAK,KAAK,YAAY;AAC1C,WAAO,IAAI,GAAG,UAAU,SAAS,YAAY,CAAC,CAAC,EAAE;AACjD,eAAW,QAAQ,OAAO;AACxB,aAAO,IAAI,KAAK,KAAK,KAAK,OAAO,EAAE,CAAC,IAAI,IAAI,KAAK,WAAW,CAAC,EAAE;AAAA,IACjE;AACA,WAAO,MAAM;AAAA,EACf;AAEA,SAAO,IAAI,IAAI,oDAAoD,CAAC;AACtE,CAAC;;;AC/CH,SAAS,WAAAC,gBAAe;AACxB,SAAS,gBAAAC,qBAAoB;AAItB,IAAM,cAAc,IAAIC,SAAQ,EACpC,KAAK,MAAM,EACX,YAAY,wBAAwB,EACpC,SAAS,eAAe,gBAAgB,EACxC,OAAO,OAAO,kBAA0B;AACvC,QAAM,OAAOC,cAAa,aAAa;AAEvC,MAAI,CAAC,MAAM;AACT,WAAO,MAAM,cAAc,aAAa,cAAc;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,SAAO,MAAM;AACb,SAAO,IAAI,oBAAoB,IAAI,CAAC;AACpC,SAAO,MAAM;AACf,CAAC;;;ACpBH,SAAS,WAAAC,gBAAe;AACxB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,OAAOC,SAAQ;AACf,SAAS,gBAAAC,qBAAoB;AAUtB,IAAM,cAAc,IAAIC,SAAQ,EACpC,KAAK,MAAM,EACX,YAAY,wDAAwD,EACpE,SAAS,eAAe,mBAAmB,EAC3C,OAAO,oBAAoB,qBAAqB,QAAQ,IAAI,CAAC,EAC7D,OAAO,OAAO,eAAuB,YAAY;AAChD,QAAM,MAAM,QAAQ;AAGpB,MAAI,CAAE,MAAM,cAAc,GAAG,GAAI;AAC/B,WAAO,MAAM,oDAAoD;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,WAAO,MAAM,iCAAiC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAOC,cAAa,aAAa;AACvC,MAAI,CAAC,MAAM;AACT,WAAO,MAAM,cAAc,aAAa,0BAA0B;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,MAAM,aAAa,GAAG;AACvC,QAAM,YAAY,SAAS,WAAW,aAAa;AAEnD,MAAI,CAAC,WAAW;AACd,WAAO,MAAM,cAAc,aAAa,qBAAqB;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAe,iBAAiB,QAAQ,eAAe,GAAG;AAEhE,MAAI,CAAE,MAAMC,IAAG,WAAW,YAAY,GAAI;AACxC,WAAO,MAAM,kCAAkC,YAAY,EAAE;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,gBAAgB,MAAM,oBAAoB,aAAa;AAC7D,MAAI,CAAC,eAAe;AAClB,WAAO,MAAM,qCAAqC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,SAAO,MAAM;AACb,SAAO,IAAI,aAAa,UAAU,aAAa,CAAC,YAAY,UAAU,OAAO,qBAAgB,KAAK,OAAO,GAAG;AAC5G,SAAO,MAAM;AAEb,MAAI,aAAa;AAEjB,aAAW,CAAC,UAAU,eAAe,KAAK,eAAe;AACvD,UAAM,YAAYC,MAAK,KAAK,cAAc,QAAQ;AAClD,UAAM,cAAc,MAAMD,IAAG,WAAW,SAAS;AAEjD,QAAI,CAAC,aAAa;AAChB,aAAO,IAAI,GAAGE,IAAG,IAAI,OAAO,QAAQ,CAAC,IAAIA,IAAG,IAAI,mBAAmB,CAAC,EAAE;AACtE,mBAAa;AACb;AAAA,IACF;AAEA,UAAM,eAAe,MAAMF,IAAG,SAAS,WAAW,OAAO;AACzD,UAAM,YAAY,SAAS,YAAY;AACvC,UAAM,eAAe,SAAS,eAAe;AAC7C,UAAM,gBAAgB,UAAU,MAAM,QAAQ;AAE9C,QAAI,cAAc,cAAc;AAC9B,aAAO,IAAI,GAAGE,IAAG,MAAM,YAAO,QAAQ,CAAC,IAAIA,IAAG,IAAI,aAAa,CAAC,EAAE;AAAA,IACpE,WAAW,cAAc,eAAe;AACtC,aAAO,IAAI,GAAGA,IAAG,OAAO,YAAO,QAAQ,CAAC,IAAIA,IAAG,IAAI,oBAAoB,CAAC,EAAE;AAC1E,mBAAa;AAAA,IACf,WAAW,iBAAiB,eAAe;AACzC,aAAO,IAAI,GAAGA,IAAG,KAAK,YAAO,QAAQ,CAAC,IAAIA,IAAG,IAAI,uBAAuB,CAAC,EAAE;AAC3E,mBAAa;AAAA,IACf,OAAO;AACL,aAAO,IAAI,GAAGA,IAAG,QAAQ,YAAO,QAAQ,CAAC,IAAIA,IAAG,IAAI,iBAAiB,CAAC,EAAE;AACxE,mBAAa;AAAA,IACf;AAAA,EACF;AAGA,QAAM,aAAa,MAAMF,IAAG,QAAQ,YAAY;AAChD,aAAW,QAAQ,YAAY;AAC7B,QAAI,CAAC,cAAc,IAAI,IAAI,GAAG;AAC5B,aAAO,IAAI,GAAGE,IAAG,KAAK,OAAO,IAAI,CAAC,IAAIA,IAAG,IAAI,cAAc,CAAC,EAAE;AAC9D,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO,MAAM;AACb,MAAI,CAAC,YAAY;AACf,WAAO,QAAQ,uBAAuB;AAAA,EACxC,OAAO;AACL,WAAO,KAAK,kCAAkC,gBAAgB,cAAc;AAAA,EAC9E;AACF,CAAC;;;AChHH,SAAS,WAAAC,gBAAe;AACxB,YAAYC,QAAO;AACnB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,gBAAAC,qBAAoB;AAkBtB,IAAM,gBAAgB,IAAIC,SAAQ,EACtC,KAAK,QAAQ,EACb,YAAY,gDAAgD,EAC5D,SAAS,mBAAmB,qCAAqC,EACjE,OAAO,aAAa,2BAA2B,EAC/C,OAAO,eAAe,4CAA4C,EAClE,OAAO,WAAW,yCAAyC,EAC3D,OAAO,oBAAoB,qBAAqB,QAAQ,IAAI,CAAC,EAC7D,OAAO,OAAO,YAAsB,YAAY;AAC/C,QAAM,MAAM,QAAQ;AAGpB,MAAI,CAAE,MAAM,cAAc,GAAG,GAAI;AAC/B,WAAO,MAAM,oDAAoD;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,WAAO,MAAM,iCAAiC;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAW,MAAM,aAAa,GAAG;AACvC,QAAM,sBAAsB,OAAO,KAAK,SAAS,UAAU;AAE3D,MAAI,oBAAoB,WAAW,GAAG;AACpC,WAAO,KAAK,0BAA0B;AACtC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,oBAAoB,WAAW,SAAS,IAAI,aAAa;AAG7D,QAAM,eAAe,kBAAkB,OAAO,CAAC,MAAM,CAAC,SAAS,WAAW,CAAC,CAAC;AAC5E,MAAI,aAAa,SAAS,GAAG;AAC3B,WAAO,MAAM,kBAAkB,aAAa,KAAK,IAAI,CAAC,EAAE;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,yBAAyB;AAEjC,QAAM,aAAgC,CAAC;AAEvC,aAAW,iBAAiB,mBAAmB;AAC7C,UAAM,YAAY,SAAS,WAAW,aAAa;AACnD,QAAI,CAAC,UAAW;AAEhB,UAAM,OAAOC,cAAa,aAAa;AACvC,QAAI,CAAC,MAAM;AACT,aAAO,KAAK,cAAc,aAAa,0BAA0B;AACjE;AAAA,IACF;AAEA,UAAM,eAAe,iBAAiB,QAAQ,eAAe,GAAG;AAGhE,QAAI,kBAAkB;AACtB,QAAI,MAAMC,IAAG,WAAW,YAAY,GAAG;AACrC,iBAAW,CAAC,UAAU,aAAa,KAAK,OAAO,QAAQ,UAAU,KAAK,GAAG;AACvE,cAAM,WAAWC,MAAK,KAAK,cAAc,QAAQ;AACjD,YAAI,MAAMD,IAAG,WAAW,QAAQ,GAAG;AACjC,gBAAM,eAAe,MAAMA,IAAG,SAAS,UAAU,OAAO;AACxD,gBAAM,YAAY,SAAS,YAAY;AACvC,cAAI,cAAc,eAAe;AAC/B,8BAAkB;AAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,YAAY,UAAU,SAAS;AACtC,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,kBAAkB,UAAU;AAAA,QAC5B,eAAe,KAAK;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,IAAE,KAAK;AAEP,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,QAAQ,gCAAgC;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,SAAO,MAAM;AACb,SAAO,IAAI,oBAAoB;AAC/B,SAAO,MAAM;AAEb,aAAW,aAAa,YAAY;AAClC,UAAM,cAAc,GAAG,UAAU,gBAAgB,WAAM,UAAU,aAAa;AAC9E,UAAM,qBAAqB,UAAU,kBACjC,+BACA;AAEJ,WAAO;AAAA,MACL,KAAK,UAAU,UAAU,IAAI,CAAC,IAAI,WAAW,GAAG,kBAAkB;AAAA,IACpE;AAAA,EACF;AAEA,SAAO,MAAM;AAGb,MAAI,QAAQ,OAAO;AACjB,WAAO,KAAK,GAAG,WAAW,MAAM,uBAAuB;AACvD,WAAO,KAAK,wCAAwC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,mBAAmB,WAAW,OAAO,CAAC,MAAM,EAAE,eAAe;AACnE,MAAI,iBAAiB,SAAS,KAAK,CAAC,QAAQ,OAAO;AACjD,WAAO;AAAA,MACL,GAAG,iBAAiB,MAAM;AAAA,IAC5B;AACA,WAAO,KAAK,mDAAmD;AAG/D,UAAM,eAAe,WAAW,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe;AAChE,QAAI,aAAa,WAAW,GAAG;AAC7B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,CAAC,QAAQ,KAAK;AAChB,YAAM,UAAU,MAAQ,WAAQ;AAAA,QAC9B,SAAS,UAAU,aAAa,MAAM;AAAA,QACtC,cAAc;AAAA,MAChB,CAAC;AAED,UAAM,YAAS,OAAO,KAAK,CAAC,SAAS;AACnC,QAAE,UAAO,mBAAmB;AAC5B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,eAAe,cAAc,QAAQ,UAAU,GAAG;AAAA,EAC1D,OAAO;AAEL,QAAI,CAAC,QAAQ,KAAK;AAChB,YAAM,UAAU,MAAQ,WAAQ;AAAA,QAC9B,SAAS,UAAU,WAAW,MAAM;AAAA,QACpC,cAAc;AAAA,MAChB,CAAC;AAED,UAAM,YAAS,OAAO,KAAK,CAAC,SAAS;AACnC,QAAE,UAAO,mBAAmB;AAC5B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,eAAe,YAAY,QAAQ,UAAU,GAAG;AAAA,EACxD;AAGA,QAAM,cAAc,UAAU,GAAG;AAEjC,SAAO,MAAM;AACb,SAAO,QAAQ,kBAAkB;AACnC,CAAC;AAEH,eAAe,eACb,YACA,QACA,UACA,KACe;AACf,QAAM,IAAM,WAAQ;AAEpB,aAAW,aAAa,YAAY;AAClC,MAAE,MAAM,YAAY,UAAU,UAAU,IAAI,CAAC,KAAK;AAElD,UAAM,OAAOD,cAAa,UAAU,IAAI;AACxC,QAAI,CAAC,MAAM;AACT,QAAE,KAAK,WAAW,UAAU,IAAI,oBAAoB;AACpD;AAAA,IACF;AAEA,UAAM,YAAY,iBAAiB,QAAQ,UAAU,MAAM,GAAG;AAG9D,UAAM,QAAQ,MAAM,oBAAoB,UAAU,IAAI;AACtD,QAAI,CAAC,OAAO;AACV,QAAE,KAAK,mBAAmB,UAAU,IAAI,EAAE;AAC1C;AAAA,IACF;AAGA,UAAMC,IAAG,UAAU,SAAS;AAG5B,UAAM,aAAqC,CAAC;AAC5C,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO;AACvC,YAAM,WAAWC,MAAK,KAAK,WAAW,QAAQ;AAC9C,YAAMD,IAAG,UAAU,UAAU,OAAO;AACpC,iBAAW,QAAQ,IAAI,SAAS,OAAO;AAAA,IACzC;AAGA,IAAC,SAAS,WAAuC,UAAU,IAAI,IAAI;AAAA,MACjE,MAAM,UAAU;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,OAAO;AAAA,MACP,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AAEA,MAAE;AAAA,MACA,WAAW,UAAU,UAAU,IAAI,CAAC,KAAK,UAAU,gBAAgB,WAAM,UAAU,aAAa;AAAA,IAClG;AAAA,EACF;AACF;;;ATxOA,IAAM,UAAU,IAAIE,SAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,yCAAyC,EACrD,QAAQ,OAAO;AAElB,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,UAAU;AAC7B,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,aAAa;AAEzB,SAAS,MAAY;AAC1B,UAAQ,MAAM;AAChB;;;AUjBA,IAAI;","names":["Command","path","fs","text","componentDir","path","fs","Command","p","path","fs","getComponent","path","fs","pc","pc","Command","getComponent","fs","path","Command","getComponents","Command","getComponents","Command","getComponent","Command","getComponent","Command","path","fs","pc","getComponent","Command","getComponent","fs","path","pc","Command","p","path","fs","getComponent","Command","getComponent","fs","path","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hauktui/cli",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "CLI for haukTUI - add components to your project",
5
5
  "type": "module",
6
6
  "bin": {