@kitnai/cli 0.1.35 → 0.1.36
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.js +359 -139
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/detect.ts","../src/utils/update-check.ts","../src/utils/config.ts","../src/installers/tsconfig-patcher.ts","../src/installers/barrel-manager.ts","../src/registry/fetcher.ts","../src/registry/resolver.ts","../src/installers/file-writer.ts","../src/installers/dep-installer.ts","../src/installers/env-writer.ts","../src/installers/import-rewriter.ts","../src/utils/hash.ts","../src/utils/parse-ref.ts","../src/utils/type-aliases.ts","../src/registry/schema.ts","../src/commands/add.ts","../src/installers/rules-generator.ts","../src/commands/init.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/utils/naming.ts","../src/commands/create.ts","../src/utils/component-resolver.ts","../src/installers/agent-linker.ts","../src/commands/link.ts","../src/commands/unlink.ts","../src/commands/info.ts","../src/commands/check.ts","../src/commands/rules.ts","../src/commands/config.ts","../src/commands/registry.ts","../src/commands/chat.ts","../src/index.ts"],"sourcesContent":["import { access } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport type PackageManager = \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\nconst LOCKFILE_MAP: [string, PackageManager][] = [\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"],\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n];\n\nexport async function detectPackageManager(dir: string): Promise<PackageManager | null> {\n for (const [lockfile, pm] of LOCKFILE_MAP) {\n try {\n await access(join(dir, lockfile));\n return pm;\n } catch {\n // lockfile doesn't exist, try next\n }\n }\n return null;\n}\n\nexport function getInstallCommand(pm: PackageManager, packages: string[]): string {\n const pkgs = packages.join(\" \");\n switch (pm) {\n case \"bun\":\n return `bun add ${pkgs}`;\n case \"pnpm\":\n return `pnpm add ${pkgs}`;\n case \"yarn\":\n return `yarn add ${pkgs}`;\n case \"npm\":\n return `npm install ${pkgs}`;\n }\n}\n\nexport function getRunCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return \"bunx\";\n case \"pnpm\":\n return \"pnpm dlx\";\n case \"yarn\":\n return \"yarn dlx\";\n case \"npm\":\n return \"npx\";\n }\n}\n\n/**\n * Detects which package manager was used to invoke the CLI globally.\n * Checks npm_config_user_agent first, falls back to process.env._, defaults to npm.\n */\nexport function detectCliInstaller(): PackageManager {\n const userAgent = process.env.npm_config_user_agent ?? \"\";\n if (userAgent.startsWith(\"bun/\")) return \"bun\";\n if (userAgent.startsWith(\"pnpm/\")) return \"pnpm\";\n if (userAgent.startsWith(\"yarn/\")) return \"yarn\";\n if (userAgent.startsWith(\"npm/\")) return \"npm\";\n\n const invoker = process.env._ ?? \"\";\n if (invoker.includes(\"bun\")) return \"bun\";\n if (invoker.includes(\"pnpm\")) return \"pnpm\";\n if (invoker.includes(\"yarn\")) return \"yarn\";\n\n return \"npm\";\n}\n\nexport function getGlobalInstallCommand(pm: PackageManager, pkg: string): string {\n switch (pm) {\n case \"bun\":\n return `bun install -g ${pkg}`;\n case \"pnpm\":\n return `pnpm add -g ${pkg}`;\n case \"yarn\":\n return `yarn global add ${pkg}`;\n case \"npm\":\n return `npm install -g ${pkg}`;\n }\n}\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport pc from \"picocolors\";\nimport { detectCliInstaller, getRunCommand, getGlobalInstallCommand } from \"./detect.js\";\n\nconst CACHE_DIR = join(homedir(), \".kitn\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst CHECK_INTERVAL = 60 * 60 * 1000; // 1 hour\n\ninterface CacheEntry {\n latest: string;\n checkedAt: number;\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n const raw = await readFile(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nasync function writeCache(entry: CacheEntry): Promise<void> {\n try {\n await mkdir(CACHE_DIR, { recursive: true });\n await writeFile(CACHE_FILE, JSON.stringify(entry));\n } catch {\n // Silently ignore cache write failures\n }\n}\n\nexport async function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(\"https://registry.npmjs.org/@kitnai/cli/latest\", {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nexport function isNewer(latest: string, current: string): boolean {\n const [lMaj, lMin, lPat] = latest.split(\".\").map(Number);\n const [cMaj, cMin, cPat] = current.split(\".\").map(Number);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPat > cPat;\n}\n\n/**\n * Starts a non-blocking update check. Returns a function that,\n * when called, prints the update notice if a newer version was found.\n */\nexport function startUpdateCheck(currentVersion: string): () => void {\n let message = \"\";\n\n // Fire-and-forget: don't block CLI startup\n const check = (async () => {\n const cache = await readCache();\n let latest: string | null = null;\n\n if (cache && Date.now() - cache.checkedAt < CHECK_INTERVAL) {\n latest = cache.latest;\n } else {\n latest = await fetchLatestVersion();\n if (latest) {\n await writeCache({ latest, checkedAt: Date.now() });\n }\n }\n\n if (latest && isNewer(latest, currentVersion)) {\n const pm = detectCliInstaller();\n const runCmd = `${getRunCommand(pm)} @kitnai/cli@latest`;\n const installCmd = getGlobalInstallCommand(pm, \"@kitnai/cli\");\n message = [\n \"\",\n pc.yellow(` Update available: ${pc.dim(currentVersion)} → ${pc.green(latest)}`),\n pc.dim(` Run ${pc.cyan(runCmd)} or ${pc.cyan(installCmd)}`),\n \"\",\n ].join(\"\\n\");\n }\n })();\n\n // Suppress unhandled rejection from the fire-and-forget promise\n check.catch(() => {});\n\n return () => {\n if (message) process.stderr.write(message);\n };\n}\n","import { readFile, writeFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\n\nconst componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\", \"kitn:cron\"]);\ntype ComponentType = z.infer<typeof componentType>;\n\nconst installedComponentSchema = z.object({\n registry: z.string().optional(),\n type: componentType.optional(),\n slot: z.string().optional(),\n version: z.string(),\n installedAt: z.string(),\n files: z.array(z.string()),\n hash: z.string(),\n registryDependencies: z.array(z.string()).optional(),\n});\n\nconst registryEntrySchema = z.object({\n url: z.string(),\n homepage: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport type RegistryEntry = z.infer<typeof registryEntrySchema>;\n\n// Registries can be a plain URL string (backward compat) or a rich entry object\nconst registryValueSchema = z.union([z.string(), registryEntrySchema]);\n\nexport const DEFAULT_REGISTRY_URL = \"https://kitn-ai.github.io/kitn/r/{type}/{name}.json\";\n\nexport const DEFAULT_REGISTRIES: Record<string, z.infer<typeof registryValueSchema>> = {\n \"@kitn\": {\n url: DEFAULT_REGISTRY_URL,\n homepage: \"https://kitn.ai\",\n description: \"Official kitn AI agent components\",\n },\n};\n\nexport const DEFAULT_ALIASES = {\n base: \"src/ai\",\n agents: \"src/ai/agents\",\n tools: \"src/ai/tools\",\n skills: \"src/ai/skills\",\n storage: \"src/ai/storage\",\n crons: \"src/ai/crons\",\n} as const;\n\nexport const configSchema = z.object({\n $schema: z.string().optional(),\n runtime: z.enum([\"bun\", \"node\", \"deno\"]),\n framework: z.enum([\"hono\", \"hono-openapi\", \"cloudflare\", \"elysia\", \"fastify\", \"express\"]).optional(),\n aliases: z.object({\n base: z.string().optional(),\n agents: z.string(),\n tools: z.string(),\n skills: z.string(),\n storage: z.string(),\n crons: z.string().optional(),\n }),\n registries: z.record(z.string(), registryValueSchema),\n chatService: z.object({\n url: z.string().optional(),\n }).optional(),\n});\n\nexport type KitnConfig = z.infer<typeof configSchema>;\n\n/** Extract the URL from a registry entry (string or object). */\nexport function getRegistryUrl(entry: string | RegistryEntry): string {\n return typeof entry === \"string\" ? entry : entry.url;\n}\n\nconst FRAMEWORK_TO_ADAPTER: Record<string, string> = {\n hono: \"hono\",\n \"hono-openapi\": \"hono-openapi\",\n elysia: \"elysia\",\n};\n\nexport function resolveRoutesAlias(config: KitnConfig): string {\n const fw = config.framework ?? \"hono\";\n return FRAMEWORK_TO_ADAPTER[fw] ?? fw;\n}\n\nconst CONFIG_FILE = \"kitn.json\";\nconst LOCK_FILE = \"kitn.lock\";\n\nexport async function readConfig(projectDir: string): Promise<KitnConfig | null> {\n try {\n const raw = await readFile(join(projectDir, CONFIG_FILE), \"utf-8\");\n return configSchema.parse(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n\nexport async function writeConfig(projectDir: string, config: KitnConfig): Promise<void> {\n const data = { $schema: \"https://kitn.dev/schema/config.json\", ...config };\n await writeFile(join(projectDir, CONFIG_FILE), JSON.stringify(data, null, 2) + \"\\n\");\n}\n\n// --- Lock file (installed component tracking) ---\n\nexport const lockSchema = z.record(z.string(), installedComponentSchema);\nexport type LockFile = z.infer<typeof lockSchema>;\n\nexport async function readLock(projectDir: string): Promise<LockFile> {\n try {\n const raw = await readFile(join(projectDir, LOCK_FILE), \"utf-8\");\n return lockSchema.parse(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nexport async function writeLock(projectDir: string, lock: LockFile): Promise<void> {\n if (Object.keys(lock).length === 0) {\n try {\n await unlink(join(projectDir, LOCK_FILE));\n } catch {\n // File doesn't exist — nothing to delete\n }\n return;\n }\n await writeFile(join(projectDir, LOCK_FILE), JSON.stringify(lock, null, 2) + \"\\n\");\n}\n\ntype RequiredAliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"crons\";\n\nconst typeToAliasKey: Record<Exclude<ComponentType, \"kitn:package\">, RequiredAliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n \"kitn:cron\": \"crons\",\n};\n\ntype SingleFileComponentType = Exclude<ComponentType, \"kitn:package\">;\n\nexport function getInstallPath(\n config: KitnConfig,\n type: SingleFileComponentType,\n fileName: string,\n namespace?: string,\n): string {\n const aliasKey = typeToAliasKey[type];\n const baseAlias = config.aliases.base ?? \"src/ai\";\n const base = config.aliases[aliasKey] ?? join(baseAlias, aliasKey);\n if (namespace && namespace !== \"@kitn\") {\n const nsDir = namespace.replace(\"@\", \"\");\n return join(base, nsDir, fileName);\n }\n return join(base, fileName);\n}\n","import { readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\n\n/**\n * Strip single-line (//) and multi-line comments from JSONC,\n * and remove trailing commas before } or ], so JSON.parse succeeds.\n */\nfunction stripJsonc(text: string): string {\n return text\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/,\\s*([}\\]])/g, \"$1\");\n}\n\n/**\n * Patches a tsconfig JSON string with additional paths entries.\n * If removePrefixes is provided, any existing path keys starting with\n * those prefixes are deleted first (useful for cleaning up old aliases).\n * Returns the updated JSON string.\n */\nexport function patchTsconfig(\n tsconfigContent: string,\n paths: Record<string, string[]>,\n removePrefixes?: string[],\n): string {\n const config = JSON.parse(stripJsonc(tsconfigContent));\n\n if (!config.compilerOptions) {\n config.compilerOptions = {};\n }\n if (!config.compilerOptions.paths) {\n config.compilerOptions.paths = {};\n }\n\n if (removePrefixes) {\n for (const key of Object.keys(config.compilerOptions.paths)) {\n if (removePrefixes.some((prefix) => key.startsWith(prefix))) {\n delete config.compilerOptions.paths[key];\n }\n }\n }\n\n for (const [key, value] of Object.entries(paths)) {\n config.compilerOptions.paths[key] = value;\n }\n\n // Ensure minimum compiler options for kitn compatibility.\n // target ES2022+: our code uses Set/Map iteration\n // moduleResolution \"bundler\": resolves node_modules packages and path aliases\n // skipLibCheck: avoids noise from third-party .d.ts files\n const ES_TARGETS = [\"es3\", \"es5\", \"es6\", \"es2015\", \"es2016\", \"es2017\", \"es2018\", \"es2019\", \"es2020\", \"es2021\"];\n const currentTarget = (config.compilerOptions.target ?? \"\").toLowerCase();\n if (!currentTarget || ES_TARGETS.includes(currentTarget)) {\n config.compilerOptions.target = \"ES2022\";\n }\n if (!config.compilerOptions.moduleResolution) {\n config.compilerOptions.moduleResolution = \"bundler\";\n }\n if (!config.compilerOptions.module) {\n config.compilerOptions.module = \"ESNext\";\n }\n if (config.compilerOptions.skipLibCheck === undefined) {\n config.compilerOptions.skipLibCheck = true;\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\n/**\n * Reads tsconfig.json from projectDir, patches paths, and writes it back.\n * If no tsconfig.json exists, creates one with just the paths.\n */\nexport async function patchProjectTsconfig(\n projectDir: string,\n paths: Record<string, string[]>,\n removePrefixes?: string[],\n): Promise<void> {\n const tsconfigPath = join(projectDir, \"tsconfig.json\");\n let content: string;\n try {\n content = await readFile(tsconfigPath, \"utf-8\");\n } catch {\n content = \"{}\";\n }\n\n const patched = patchTsconfig(content, paths, removePrefixes);\n await writeFile(tsconfigPath, patched);\n}\n","const EXPORT_LINE = 'export { registerWithPlugin } from \"@kitn/core\";';\nconst BARREL_COMMENT = \"// Managed by kitn CLI — components auto-imported below\";\n\nexport function createBarrelFile(): string {\n return `${BARREL_COMMENT}\\n${EXPORT_LINE}\\n`;\n}\n\nexport function addImportToBarrel(content: string, importPath: string): string {\n const importLine = `import \"${importPath}\";`;\n\n // Idempotent — skip if already present\n if (content.includes(importLine)) return content;\n\n // Insert before the export line\n const exportIndex = content.indexOf(EXPORT_LINE);\n if (exportIndex === -1) {\n // No export line found — append both\n return `${content.trimEnd()}\\n${importLine}\\n${EXPORT_LINE}\\n`;\n }\n\n const before = content.slice(0, exportIndex);\n const after = content.slice(exportIndex);\n return `${before}${importLine}\\n${after}`;\n}\n\nexport function removeImportFromBarrel(\n content: string,\n importPath: string,\n): string {\n const importLine = `import \"${importPath}\";`;\n return content\n .split(\"\\n\")\n .filter((line) => line.trim() !== importLine)\n .join(\"\\n\");\n}\n\nexport function parseBarrelFile(content: string): string[] {\n const imports: string[] = [];\n for (const line of content.split(\"\\n\")) {\n const match = line.match(/^import\\s+[\"'](.+)[\"'];?\\s*$/);\n if (match) imports.push(match[1]);\n }\n return imports;\n}\n","import type { RegistryItem, RegistryIndex } from \"./schema.js\";\nimport type { RegistryEntry } from \"../utils/config.js\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"package\" | \"crons\";\ntype FetchFn = (url: string) => Promise<RegistryItem>;\ntype RegistryValue = string | RegistryEntry;\n\nfunction urlOf(entry: RegistryValue): string {\n return typeof entry === \"string\" ? entry : entry.url;\n}\n\nexport class RegistryFetcher {\n private registries: Record<string, RegistryValue>;\n private cache = new Map<string, Promise<RegistryItem>>();\n private fetchFn: FetchFn;\n\n constructor(registries: Record<string, RegistryValue>, fetchFn?: FetchFn) {\n this.registries = registries;\n this.fetchFn = fetchFn ?? this.defaultFetch;\n }\n\n resolveUrl(name: string, typeDir: TypeDir, namespace = \"@kitn\", version?: string): string {\n const entry = this.registries[namespace];\n if (!entry) throw new Error(`No registry configured for ${namespace}`);\n const template = urlOf(entry);\n const fileName = version ? `${name}@${version}` : name;\n return template.replace(\"{name}\", fileName).replace(\"{type}\", typeDir);\n }\n\n async fetchItem(name: string, typeDir: TypeDir, namespace = \"@kitn\", version?: string): Promise<RegistryItem> {\n const url = this.resolveUrl(name, typeDir, namespace, version);\n if (!this.cache.has(url)) {\n this.cache.set(url, this.fetchFn(url));\n }\n return this.cache.get(url)!;\n }\n\n async fetchIndex(namespace = \"@kitn\"): Promise<RegistryIndex> {\n const entry = this.registries[namespace];\n if (!entry) throw new Error(`No registry configured for ${namespace}`);\n const template = urlOf(entry);\n const baseUrl = template.replace(\"{type}/{name}.json\", \"registry.json\");\n const res = await fetch(baseUrl);\n if (!res.ok) throw new Error(`Failed to fetch registry index: ${res.statusText}`);\n return res.json();\n }\n\n private async defaultFetch(url: string): Promise<RegistryItem> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch ${url}: ${res.statusText}`);\n return res.json();\n }\n}\n","import type { RegistryItem } from \"./schema.js\";\n\ntype FetchItemFn = (name: string) => Promise<RegistryItem>;\n\nexport async function resolveDependencies(\n names: string[],\n fetchItem: FetchItemFn\n): Promise<RegistryItem[]> {\n const visited = new Set<string>();\n const items = new Map<string, RegistryItem>();\n const edges: [string, string][] = [];\n\n async function resolve(name: string): Promise<void> {\n if (visited.has(name)) return;\n visited.add(name);\n\n const item = await fetchItem(name);\n items.set(name, item);\n\n const deps = item.registryDependencies ?? [];\n for (const dep of deps) {\n edges.push([dep, name]);\n await resolve(dep);\n }\n }\n\n for (const name of names) {\n await resolve(name);\n }\n\n return topologicalSort(items, edges);\n}\n\nfunction topologicalSort(\n items: Map<string, RegistryItem>,\n edges: [string, string][]\n): RegistryItem[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const name of items.keys()) {\n inDegree.set(name, 0);\n adjacency.set(name, []);\n }\n\n for (const [from, to] of edges) {\n adjacency.get(from)?.push(to);\n inDegree.set(to, (inDegree.get(to) ?? 0) + 1);\n }\n\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) queue.push(name);\n }\n\n const sorted: RegistryItem[] = [];\n while (queue.length > 0) {\n const name = queue.shift()!;\n sorted.push(items.get(name)!);\n\n for (const neighbor of adjacency.get(name) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n if (sorted.length !== items.size) {\n const missing = [...items.keys()].filter((n) => !sorted.some((s) => s.name === n));\n throw new Error(`Circular dependency detected involving: ${missing.join(\", \")}`);\n }\n\n return sorted;\n}\n","import { readFile, writeFile, mkdir, access } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { createPatch } from \"diff\";\n\nexport enum FileStatus {\n New = \"new\",\n Identical = \"identical\",\n Different = \"different\",\n}\n\nexport async function checkFileStatus(filePath: string, newContent: string): Promise<FileStatus> {\n try {\n await access(filePath);\n } catch {\n return FileStatus.New;\n }\n const existing = await readFile(filePath, \"utf-8\");\n return existing === newContent ? FileStatus.Identical : FileStatus.Different;\n}\n\nexport function generateDiff(filePath: string, oldContent: string, newContent: string): string {\n return createPatch(filePath, oldContent, newContent, \"local\", \"registry\");\n}\n\nexport async function readExistingFile(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nexport async function writeComponentFile(filePath: string, content: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n}\n","import { execSync } from \"child_process\";\nimport type { PackageManager } from \"../utils/detect.js\";\n\nexport function installDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add ${pkgs}`;\n case \"pnpm\": return `pnpm add ${pkgs}`;\n case \"yarn\": return `yarn add ${pkgs}`;\n case \"npm\": return `npm install ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n\nexport function installDevDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add -d ${pkgs}`;\n case \"pnpm\": return `pnpm add -D ${pkgs}`;\n case \"yarn\": return `yarn add -D ${pkgs}`;\n case \"npm\": return `npm install -D ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile, access } from \"fs/promises\";\nimport { join } from \"path\";\nimport type { EnvVarConfig } from \"../registry/schema.js\";\n\n/**\n * Parse a .env file into a Set of defined variable names.\n * Only cares about keys, not values.\n */\nfunction parseEnvKeys(content: string): Set<string> {\n const keys = new Set<string>();\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex > 0) {\n keys.add(trimmed.slice(0, eqIndex).trim());\n }\n }\n return keys;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readEnvFile(path: string): Promise<string> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Collect all envVars from resolved items, deduplicating by key name.\n * Later items override earlier ones if same key.\n */\nexport function collectEnvVars(\n items: Array<{ envVars?: Record<string, EnvVarConfig> }>\n): Record<string, EnvVarConfig> {\n const merged: Record<string, EnvVarConfig> = {};\n for (const item of items) {\n if (item.envVars) {\n Object.assign(merged, item.envVars);\n }\n }\n return merged;\n}\n\n/**\n * Handle env var setup after component installation:\n * 1. Write missing vars to .env.example (always)\n * 2. Prompt user for missing vars and write to .env (interactive)\n */\nexport async function handleEnvVars(\n cwd: string,\n envVars: Record<string, EnvVarConfig>\n): Promise<void> {\n const keys = Object.keys(envVars);\n if (keys.length === 0) return;\n\n // Read existing .env and .env.example\n const envPath = join(cwd, \".env\");\n const examplePath = join(cwd, \".env.example\");\n\n const envContent = await readEnvFile(envPath);\n const exampleContent = await readEnvFile(examplePath);\n\n const envKeys = parseEnvKeys(envContent);\n const exampleKeys = parseEnvKeys(exampleContent);\n\n // Find vars missing from each file\n const missingFromExample = keys.filter((k) => !exampleKeys.has(k));\n const missingFromEnv = keys.filter((k) => !envKeys.has(k) && !process.env[k]);\n\n // 1. Always append missing vars to .env.example\n if (missingFromExample.length > 0) {\n const lines: string[] = [];\n if (exampleContent && !exampleContent.endsWith(\"\\n\")) lines.push(\"\");\n for (const key of missingFromExample) {\n const config = envVars[key];\n lines.push(`# ${config.description}${config.url ? ` (${config.url})` : \"\"}`);\n lines.push(`${key}=`);\n }\n await writeFile(examplePath, exampleContent + lines.join(\"\\n\") + \"\\n\");\n p.log.info(`Updated ${pc.cyan(\".env.example\")} with ${missingFromExample.length} variable(s)`);\n }\n\n // 2. Prompt for missing env vars\n if (missingFromEnv.length === 0) return;\n\n p.log.message(\"\");\n p.log.warn(\n `${missingFromEnv.length} environment variable(s) needed:`\n );\n for (const key of missingFromEnv) {\n const config = envVars[key];\n const req = config.required !== false ? pc.red(\"*\") : \"\";\n p.log.message(` ${pc.yellow(key)}${req}: ${config.description}${config.url ? pc.dim(` -> ${config.url}`) : \"\"}`);\n }\n\n const shouldPrompt = await p.confirm({\n message: \"Would you like to enter values now?\",\n initialValue: true,\n });\n\n if (p.isCancel(shouldPrompt) || !shouldPrompt) {\n p.log.info(`Add them to ${pc.cyan(\".env\")} when ready.`);\n return;\n }\n\n const newEntries: string[] = [];\n for (const key of missingFromEnv) {\n const config = envVars[key];\n const isSecret = config.secret !== false; // default true\n\n let value: string | symbol;\n if (isSecret) {\n value = await p.password({\n message: `${key}:`,\n });\n } else {\n value = await p.text({\n message: `${key}:`,\n placeholder: config.description,\n });\n }\n\n if (p.isCancel(value)) {\n p.log.info(`Skipped remaining variables. Add them to ${pc.cyan(\".env\")} when ready.`);\n break;\n }\n\n if (value) {\n newEntries.push(`${key}=${value}`);\n }\n }\n\n if (newEntries.length > 0) {\n const existingEnv = await readEnvFile(envPath);\n const lines: string[] = [];\n if (existingEnv && !existingEnv.endsWith(\"\\n\")) lines.push(\"\");\n lines.push(...newEntries);\n await writeFile(envPath, existingEnv + lines.join(\"\\n\") + \"\\n\");\n p.log.success(`Wrote ${newEntries.length} variable(s) to ${pc.cyan(\".env\")}`);\n }\n}\n","import { relative, dirname, join, posix } from \"path\";\n\ntype AliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"crons\";\n\nconst KNOWN_TYPES: readonly AliasKey[] = [\"agents\", \"tools\", \"skills\", \"storage\", \"crons\"];\n\nconst TYPE_TO_ALIAS_KEY: Record<string, AliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n \"kitn:cron\": \"crons\",\n};\n\n/**\n * Rewrites `@kitn/<type>/<path>` imports to relative paths based on install layout.\n *\n * Only rewrites known types (agents, tools, skills, storage).\n * Other `@kitn/` imports (e.g. `@kitn/server`) pass through untouched.\n */\nexport function rewriteKitnImports(\n content: string,\n fileType: string,\n fileName: string,\n aliases: Record<string, string | undefined>,\n): string {\n const sourceAliasKey = TYPE_TO_ALIAS_KEY[fileType];\n if (!sourceAliasKey) return content;\n\n const sourceDir = aliases[sourceAliasKey];\n if (!sourceDir) return content;\n\n // Match import/export ... from \"@kitn/<type>/<path>\"\n return content.replace(\n /((?:import|export)\\s+.*?\\s+from\\s+[\"'])@kitn\\/([\\w-]+)\\/([^\"']+)([\"'])/g,\n (_match, prefix: string, type: string, targetPath: string, quote: string) => {\n if (!KNOWN_TYPES.includes(type as AliasKey)) {\n return `${prefix}@kitn/${type}/${targetPath}${quote}`;\n }\n\n const targetDir = aliases[type as AliasKey];\n if (!targetDir) {\n return `${prefix}@kitn/${type}/${targetPath}${quote}`;\n }\n const targetFile = join(targetDir, targetPath);\n let rel = relative(sourceDir, targetFile);\n\n // Normalize to posix separators\n rel = rel.split(\"\\\\\").join(\"/\");\n\n // Ensure relative path starts with ./ or ../\n if (!rel.startsWith(\".\")) {\n rel = `./${rel}`;\n }\n\n return `${prefix}${rel}${quote}`;\n },\n );\n}\n","import { createHash } from \"crypto\";\n\nexport function contentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 8);\n}\n","export interface ComponentRef {\n namespace: string;\n name: string;\n version: string | undefined;\n}\n\nexport function parseComponentRef(input: string): ComponentRef {\n let namespace = \"@kitn\";\n let rest = input;\n\n // Parse @namespace/name\n if (rest.startsWith(\"@\")) {\n const slashIdx = rest.indexOf(\"/\");\n if (slashIdx === -1) {\n throw new Error(`Invalid component reference: ${input}. Expected @namespace/name`);\n }\n namespace = rest.slice(0, slashIdx);\n rest = rest.slice(slashIdx + 1);\n }\n\n // Parse name@version\n const atIdx = rest.indexOf(\"@\");\n if (atIdx === -1) {\n return { namespace, name: rest, version: undefined };\n }\n\n return {\n namespace,\n name: rest.slice(0, atIdx),\n version: rest.slice(atIdx + 1),\n };\n}\n","import type { ComponentType } from \"../registry/schema.js\";\n\nexport const TYPE_ALIASES: Record<string, string> = {\n agent: \"agent\",\n agents: \"agent\",\n tool: \"tool\",\n tools: \"tool\",\n skill: \"skill\",\n skills: \"skill\",\n storage: \"storage\",\n storages: \"storage\",\n package: \"package\",\n packages: \"package\",\n cron: \"cron\",\n crons: \"cron\",\n};\n\nconst SHORT_TO_COMPONENT: Record<string, ComponentType> = {\n agent: \"kitn:agent\",\n tool: \"kitn:tool\",\n skill: \"kitn:skill\",\n storage: \"kitn:storage\",\n package: \"kitn:package\",\n cron: \"kitn:cron\",\n};\n\n/** Resolve a user-provided type string (e.g. \"agents\") to its canonical short form (e.g. \"agent\"). */\nexport function resolveTypeAlias(input: string): string | undefined {\n return TYPE_ALIASES[input.toLowerCase()];\n}\n\n/** Convert a canonical short type (e.g. \"agent\") to a ComponentType (e.g. \"kitn:agent\"). */\nexport function toComponentType(shortType: string): ComponentType {\n const ct = SHORT_TO_COMPONENT[shortType];\n if (!ct) throw new Error(`Unknown component type: ${shortType}`);\n return ct;\n}\n","import { z } from \"zod\";\n\nexport const componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\", \"kitn:cron\"]);\nexport type ComponentType = z.infer<typeof componentType>;\n\nexport const registryFileSchema = z.object({\n path: z.string(),\n content: z.string(),\n type: componentType,\n});\n\nexport const changelogEntrySchema = z.object({\n version: z.string(),\n date: z.string(),\n type: z.enum([\"feature\", \"fix\", \"breaking\", \"initial\"]),\n note: z.string(),\n});\nexport type ChangelogEntry = z.infer<typeof changelogEntrySchema>;\n\nexport const envVarConfigSchema = z.object({\n description: z.string(),\n required: z.boolean().optional(),\n secret: z.boolean().optional(),\n url: z.string().optional(),\n});\nexport type EnvVarConfig = z.infer<typeof envVarConfigSchema>;\n\n/** Schema for the author-facing registry.json file */\nexport const componentConfigSchema = z.object({\n $schema: z.string().optional(),\n type: componentType,\n name: z.string().optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n files: z.array(z.string()).optional(),\n sourceDir: z.string().optional(),\n exclude: z.array(z.string()).optional(),\n installDir: z.string().optional(),\n tsconfig: z.record(z.string(), z.array(z.string())).optional(),\n envVars: z.record(z.string(), envVarConfigSchema).optional(),\n categories: z.array(z.string()).optional(),\n slot: z.string().optional(),\n docs: z.string().optional(),\n changelog: z.array(changelogEntrySchema).optional(),\n});\nexport type ComponentConfig = z.infer<typeof componentConfigSchema>;\n\nexport const registryItemSchema = z.object({\n $schema: z.string().optional(),\n name: z.string(),\n type: componentType,\n description: z.string(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n envVars: z.record(z.string(), envVarConfigSchema).optional(),\n files: z.array(registryFileSchema),\n installDir: z.string().optional(),\n tsconfig: z.record(z.string(), z.array(z.string())).optional(),\n docs: z.string().optional(),\n categories: z.array(z.string()).optional(),\n slot: z.string().optional(),\n version: z.string().optional(),\n updatedAt: z.string().optional(),\n changelog: z.array(changelogEntrySchema).optional(),\n});\nexport type RegistryItem = z.infer<typeof registryItemSchema>;\n\nexport const registryIndexItemSchema = z.object({\n name: z.string(),\n type: componentType,\n description: z.string(),\n registryDependencies: z.array(z.string()).optional(),\n categories: z.array(z.string()).optional(),\n slot: z.string().optional(),\n version: z.string().optional(),\n versions: z.array(z.string()).optional(),\n updatedAt: z.string().optional(),\n});\n\nexport const registryIndexSchema = z.object({\n $schema: z.string().optional(),\n version: z.string(),\n items: z.array(registryIndexItemSchema),\n});\nexport type RegistryIndex = z.infer<typeof registryIndexSchema>;\n\nexport const typeToDir: Record<ComponentType, string> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n \"kitn:package\": \"package\",\n \"kitn:cron\": \"crons\",\n};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join, dirname } from \"path\";\nimport { readConfig, writeConfig, getInstallPath, resolveRoutesAlias, readLock, writeLock } from \"../utils/config.js\";\nimport { detectPackageManager } from \"../utils/detect.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { resolveDependencies } from \"../registry/resolver.js\";\nimport {\n checkFileStatus,\n writeComponentFile,\n readExistingFile,\n generateDiff,\n FileStatus,\n} from \"../installers/file-writer.js\";\nimport { installDependencies, installDevDependencies } from \"../installers/dep-installer.js\";\nimport { collectEnvVars, handleEnvVars } from \"../installers/env-writer.js\";\nimport { rewriteKitnImports } from \"../installers/import-rewriter.js\";\nimport { createBarrelFile, addImportToBarrel, removeImportFromBarrel } from \"../installers/barrel-manager.js\";\nimport { contentHash } from \"../utils/hash.js\";\nimport { parseComponentRef, type ComponentRef } from \"../utils/parse-ref.js\";\nimport { resolveTypeAlias, toComponentType } from \"../utils/type-aliases.js\";\nimport { typeToDir, type RegistryItem, type ComponentType } from \"../registry/schema.js\";\nimport { existsSync } from \"fs\";\nimport { readFile, writeFile, mkdir, unlink } from \"fs/promises\";\nimport { relative } from \"path\";\n\ninterface AddOptions {\n overwrite?: boolean;\n type?: string;\n yes?: boolean;\n}\n\nexport async function addCommand(components: string[], opts: AddOptions) {\n p.intro(pc.bgCyan(pc.black(\" kitn add \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const lock = await readLock(cwd);\n\n if (components.length === 0) {\n // Interactive browse mode — fetch index, group by type, multi-select\n const fetcher = new RegistryFetcher(config.registries);\n const s = p.spinner();\n s.start(\"Fetching registry...\");\n\n const allItems: Array<{ name: string; type: string; description: string; namespace: string }> = [];\n for (const namespace of Object.keys(config.registries)) {\n try {\n const index = await fetcher.fetchIndex(namespace);\n for (const item of index.items) {\n allItems.push({ name: item.name, type: item.type, description: item.description, namespace });\n }\n } catch {\n // Skip failing registries\n }\n }\n\n s.stop(`Found ${allItems.length} component(s)`);\n\n if (allItems.length === 0) {\n p.log.warn(\"No components found in configured registries.\");\n process.exit(0);\n }\n\n const installed = new Set(Object.keys(lock));\n\n // Group by type, preserving order\n const typeLabels: Record<string, string> = {\n \"kitn:agent\": \"Agents\",\n \"kitn:tool\": \"Tools\",\n \"kitn:skill\": \"Skills\",\n \"kitn:storage\": \"Storage\",\n \"kitn:package\": \"Packages\",\n };\n\n const groups = new Map<string, typeof allItems>();\n for (const item of allItems) {\n if (!groups.has(item.type)) groups.set(item.type, []);\n groups.get(item.type)!.push(item);\n }\n\n const options: Array<{ value: string; label: string; hint?: string }> = [];\n for (const [type, items] of groups) {\n const label = typeLabels[type] ?? type;\n options.push({ value: `__separator_${type}`, label: pc.bold(`── ${label} ${\"─\".repeat(Math.max(0, 40 - label.length))}`), hint: \"\" });\n for (const item of items) {\n const isInstalled = installed.has(item.name);\n options.push({\n value: item.name,\n label: isInstalled ? pc.dim(`${item.name} (installed)`) : item.name,\n hint: item.description,\n });\n }\n }\n\n const selected = await p.multiselect({\n message: \"Select components to install:\",\n options,\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n components = (selected as string[]).filter((s) => !s.startsWith(\"__separator_\"));\n\n if (components.length === 0) {\n p.log.warn(\"No components selected.\");\n process.exit(0);\n }\n }\n\n // --- Positional type argument parsing ---\n // e.g. `kitn add agent weather` → typeFilter=\"agent\", components=[\"weather\"]\n let typeFilter: string | undefined;\n const firstAlias = resolveTypeAlias(components[0]);\n if (firstAlias) {\n if (components.length === 1) {\n p.log.error(\n `${pc.bold(components[0])} looks like a type, not a component name. Usage: ${pc.cyan(`kitn add ${components[0]} <name>`)}`\n );\n process.exit(1);\n }\n typeFilter = firstAlias;\n components = components.slice(1);\n }\n\n // Merge with --type flag (flag wins on conflict)\n if (opts.type) {\n const flagAlias = resolveTypeAlias(opts.type);\n if (!flagAlias) {\n p.log.error(`Unknown type ${pc.bold(opts.type)}. Valid types: agent, tool, skill, storage, package`);\n process.exit(1);\n }\n if (typeFilter && typeFilter !== flagAlias) {\n p.log.warn(`Positional type ${pc.bold(typeFilter)} overridden by --type ${pc.bold(flagAlias)}`);\n }\n typeFilter = flagAlias;\n }\n\n // Resolve \"routes\" to framework-specific adapter name, then parse refs\n const resolvedComponents = components.map((c) => {\n if (c === \"routes\") {\n return resolveRoutesAlias(config);\n }\n return c;\n });\n\n const refs = resolvedComponents.map(parseComponentRef);\n const fetcher = new RegistryFetcher(config.registries);\n\n // --- Disambiguation: resolve ambiguous names before dependency resolution ---\n const s = p.spinner();\n s.start(\"Resolving dependencies...\");\n\n // Build a map of pre-resolved types for explicitly requested components\n const preResolvedTypes = new Map<string, ComponentType>();\n let expandedNames = [...resolvedComponents];\n\n try {\n // Fetch all registry indices\n const namespacesToFetch = Object.keys(config.registries);\n const allIndexItems: Array<{ name: string; type: ComponentType; namespace: string }> = [];\n\n for (const namespace of namespacesToFetch) {\n try {\n const index = await fetcher.fetchIndex(namespace);\n for (const item of index.items) {\n allIndexItems.push({ name: item.name, type: item.type, namespace });\n }\n } catch {\n // Skip failing registries during disambiguation\n }\n }\n\n // Check each explicit component for ambiguity\n const newExpandedNames: string[] = [];\n for (const name of resolvedComponents) {\n const ref = refs.find((r) => r.name === name) ?? { namespace: \"@kitn\", name, version: undefined };\n let matches = allIndexItems.filter((i) => i.name === name && (ref.namespace === \"@kitn\" || i.namespace === ref.namespace));\n\n if (typeFilter) {\n const filteredType = toComponentType(typeFilter);\n matches = matches.filter((m) => m.type === filteredType);\n }\n\n if (matches.length === 0) {\n // No exact match — try substring search\n let fuzzyMatches = allIndexItems.filter(\n (i) => i.name.includes(name) && (ref.namespace === \"@kitn\" || i.namespace === ref.namespace)\n );\n\n if (typeFilter) {\n const filteredType = toComponentType(typeFilter);\n fuzzyMatches = fuzzyMatches.filter((m) => m.type === filteredType);\n }\n\n if (fuzzyMatches.length === 0) {\n // Truly not found — let the resolution phase produce the error\n newExpandedNames.push(name);\n } else if (fuzzyMatches.length === 1) {\n // Single substring match — use it directly\n preResolvedTypes.set(fuzzyMatches[0].name, fuzzyMatches[0].type);\n newExpandedNames.push(fuzzyMatches[0].name);\n } else {\n // Multiple substring matches — prompt user to select\n s.stop(\"Multiple matches found\");\n\n if (!process.stdin.isTTY) {\n const suggestions = fuzzyMatches.map((m) => `${m.name} (${m.type.replace(\"kitn:\", \"\")})`).join(\", \");\n p.log.error(\n `Component ${pc.bold(name)} not found. Did you mean one of: ${suggestions}`\n );\n process.exit(1);\n }\n\n const selected = await p.multiselect({\n message: `No exact match for ${pc.bold(name)}. Select component(s) to install:`,\n options: fuzzyMatches.map((m) => ({\n value: `${m.name}::${m.type}`,\n label: `${m.name} ${pc.dim(`(${m.type.replace(\"kitn:\", \"\")})`)}`,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n for (const sel of selected as string[]) {\n const [selName, selType] = sel.split(\"::\");\n preResolvedTypes.set(selName, selType as ComponentType);\n newExpandedNames.push(selName);\n }\n\n s.start(\"Resolving dependencies...\");\n }\n } else if (matches.length === 1) {\n preResolvedTypes.set(name, matches[0].type);\n newExpandedNames.push(name);\n } else {\n // Multiple types for the same name\n const uniqueTypes = [...new Set(matches.map((m) => m.type))];\n if (uniqueTypes.length === 1) {\n preResolvedTypes.set(name, uniqueTypes[0]);\n newExpandedNames.push(name);\n } else {\n // Need disambiguation\n s.stop(\"Disambiguation needed\");\n\n if (!process.stdin.isTTY) {\n const typeNames = uniqueTypes.map((t) => t.replace(\"kitn:\", \"\")).join(\", \");\n p.log.error(\n `Multiple components named ${pc.bold(name)} found (${typeNames}). Specify the type: ${pc.cyan(`kitn add ${uniqueTypes[0].replace(\"kitn:\", \"\")} ${name}`)}`\n );\n process.exit(1);\n }\n\n const selected = await p.multiselect({\n message: `Multiple types found for ${pc.bold(name)}. Which do you want to install?`,\n options: uniqueTypes.map((t) => ({\n value: t,\n label: `${name} ${pc.dim(`(${t.replace(\"kitn:\", \"\")})`)}`,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n for (const type of selected as ComponentType[]) {\n preResolvedTypes.set(name, type);\n newExpandedNames.push(name);\n }\n\n s.start(\"Resolving dependencies...\");\n }\n }\n }\n expandedNames = newExpandedNames;\n } catch (err: any) {\n s.stop(pc.red(\"Failed to resolve dependencies\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n // --- Dependency resolution with type-aware fetching ---\n let resolved: RegistryItem[];\n try {\n resolved = await resolveDependencies(expandedNames, async (name) => {\n const ref = refs.find((r) => r.name === name) ?? { namespace: \"@kitn\", name, version: undefined };\n const index = await fetcher.fetchIndex(ref.namespace);\n\n // Use pre-resolved type for explicit names, first-match for transitive deps\n const preResolved = preResolvedTypes.get(name);\n const indexItem = preResolved\n ? index.items.find((i) => i.name === name && i.type === preResolved)\n : index.items.find((i) => i.name === name);\n\n if (!indexItem) throw new Error(`Component '${name}' not found in ${ref.namespace} registry`);\n const dir = typeToDir[indexItem.type];\n return fetcher.fetchItem(name, dir as any, ref.namespace, ref.version);\n });\n } catch (err: any) {\n s.stop(pc.red(\"Failed to resolve dependencies\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n s.stop(`Resolved ${resolved.length} component(s)`);\n\n // --- Slot conflict detection ---\n const slotReplacements = new Map<string, string>(); // oldName → newName\n for (const item of resolved) {\n if (!item.slot) continue;\n const existing = Object.entries(lock).find(\n ([key, entry]) => key !== item.name && entry.slot === item.slot\n );\n if (!existing) continue;\n\n const [existingKey] = existing;\n const action = await p.select({\n message: `${pc.bold(existingKey)} already fills the ${pc.cyan(item.slot)} slot. What would you like to do?`,\n options: [\n { value: \"replace\", label: `Replace ${existingKey} with ${item.name}` },\n { value: \"add\", label: `Add alongside ${existingKey}` },\n ],\n });\n\n if (p.isCancel(action)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n if (action === \"replace\") {\n slotReplacements.set(existingKey, item.name);\n }\n }\n\n // Process slot replacements — remove old components\n if (slotReplacements.size > 0) {\n const baseDir = config.aliases.base ?? \"src/ai\";\n for (const [oldKey] of slotReplacements) {\n const oldEntry = lock[oldKey];\n if (!oldEntry) continue;\n\n for (const filePath of oldEntry.files) {\n try {\n await unlink(join(cwd, filePath));\n } catch {\n // File may have been moved or deleted\n }\n }\n\n // Remove barrel imports for deleted files\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n const barrelEligibleDirs = new Set([\n config.aliases.agents,\n config.aliases.tools,\n config.aliases.skills,\n ]);\n\n if (existsSync(barrelPath)) {\n let barrelContent = await readFile(barrelPath, \"utf-8\");\n let barrelChanged = false;\n\n for (const filePath of oldEntry.files) {\n const fileDir = dirname(filePath);\n if (!barrelEligibleDirs.has(fileDir)) continue;\n const barrelDir = join(cwd, baseDir);\n const importPath = \"./\" + relative(barrelDir, join(cwd, filePath)).replace(/\\\\/g, \"/\");\n const updated = removeImportFromBarrel(barrelContent, importPath);\n if (updated !== barrelContent) {\n barrelContent = updated;\n barrelChanged = true;\n }\n }\n\n if (barrelChanged) {\n await writeFile(barrelPath, barrelContent);\n }\n }\n\n delete lock[oldKey];\n p.log.info(`Replaced ${pc.dim(oldKey)} → ${pc.cyan(slotReplacements.get(oldKey)!)}`);\n }\n }\n\n p.log.info(\"Components to install:\\n\" + resolved.map((item) => {\n const isExplicit = expandedNames.includes(item.name) || components.includes(item.name);\n const label = isExplicit ? item.name : `${item.name} ${pc.dim(\"(dependency)\")}`;\n return ` ${pc.cyan(label)}`;\n }).join(\"\\n\"));\n\n // Collect all npm dependencies across resolved components\n const allDeps: string[] = [];\n const allDevDeps: string[] = [];\n for (const item of resolved) {\n if (item.dependencies) allDeps.push(...item.dependencies);\n if (item.devDependencies) allDevDeps.push(...item.devDependencies);\n }\n const uniqueDeps = [...new Set(allDeps)];\n const uniqueDevDeps = [...new Set(allDevDeps)].filter((d) => !uniqueDeps.includes(d));\n const totalDeps = uniqueDeps.length + uniqueDevDeps.length;\n\n if (totalDeps > 0) {\n const depLines = uniqueDeps.map((d) => ` ${pc.cyan(d)}`);\n const devDepLines = uniqueDevDeps.map((d) => ` ${pc.dim(d)}`);\n p.log.info(\"Dependencies:\\n\" + [...depLines, ...devDepLines].join(\"\\n\"));\n }\n\n if (!opts.yes && process.stdin.isTTY) {\n const totalComponents = resolved.length;\n const summary = totalDeps > 0\n ? `Install ${totalComponents} component(s) and ${totalDeps} npm package(s)?`\n : `Install ${totalComponents} component(s)?`;\n const confirm = await p.confirm({ message: summary });\n if (p.isCancel(confirm) || !confirm) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n }\n\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n for (const item of resolved) {\n // Skip file processing for packages already installed with identical content\n const existingInstall = lock[item.name];\n if (existingInstall && item.type === \"kitn:package\") {\n const allContent = item.files.map((f) => f.content).join(\"\\n\");\n if (contentHash(allContent) === existingInstall.hash) {\n continue;\n }\n }\n\n if (item.type === \"kitn:package\") {\n // Package install — multi-file, preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n\n for (const file of item.files) {\n const targetPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n\n const status = await checkFileStatus(targetPath, file.content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, file.content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", file.content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Track in lock\n const allContent = item.files.map((f) => f.content).join(\"\\n\");\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n const installedKey = ref.namespace === \"@kitn\" ? item.name : `${ref.namespace}/${item.name}`;\n lock[installedKey] = {\n registry: ref.namespace,\n type: item.type,\n ...(item.slot && { slot: item.slot }),\n version: item.version ?? \"1.0.0\",\n installedAt: new Date().toISOString(),\n files: item.files.map((f) => join(baseDir, f.path)),\n hash: contentHash(allContent),\n registryDependencies: item.registryDependencies,\n };\n\n } else {\n // Regular component install — single file, import rewriting\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n const ns = ref.namespace;\n\n for (const file of item.files) {\n const aliasKey = (() => {\n switch (item.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n case \"kitn:cron\": return \"crons\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"crons\";\n\n const fileName = file.path.split(\"/\").pop()!;\n const installPath = getInstallPath(config, item.type as Exclude<ComponentType, \"kitn:package\">, fileName, ns);\n const targetPath = join(cwd, installPath);\n const relativePath = installPath;\n const content = rewriteKitnImports(file.content, item.type, fileName, config.aliases);\n\n const status = await checkFileStatus(targetPath, content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Track in lock\n const allContent = item.files.map((f) => {\n const fn = f.path.split(\"/\").pop()!;\n return rewriteKitnImports(f.content, item.type, fn, config.aliases);\n }).join(\"\\n\");\n const installedKey = ns === \"@kitn\" ? item.name : `${ns}/${item.name}`;\n lock[installedKey] = {\n registry: ns,\n type: item.type,\n ...(item.slot && { slot: item.slot }),\n version: item.version ?? \"1.0.0\",\n installedAt: new Date().toISOString(),\n files: item.files.map((f) => {\n const fileName = f.path.split(\"/\").pop()!;\n return getInstallPath(config, item.type as Exclude<ComponentType, \"kitn:package\">, fileName, ns);\n }),\n hash: contentHash(allContent),\n registryDependencies: item.registryDependencies,\n };\n }\n }\n\n // Barrel management — auto-wire imports for barrel-eligible components\n const BARREL_ELIGIBLE: Set<string> = new Set([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:cron\"]);\n const baseDir = config.aliases.base ?? \"src/ai\";\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n const barrelDir = join(cwd, baseDir);\n\n const barrelImports: string[] = [];\n for (const item of resolved) {\n if (!BARREL_ELIGIBLE.has(item.type)) continue;\n\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n\n for (const file of item.files) {\n const fileName = file.path.split(\"/\").pop()!;\n const installPath = getInstallPath(config, item.type as Exclude<ComponentType, \"kitn:package\">, fileName, ref.namespace);\n const filePath = join(cwd, installPath);\n const importPath = \"./\" + relative(barrelDir, filePath).replace(/\\\\/g, \"/\");\n barrelImports.push(importPath);\n }\n }\n\n if (barrelImports.length > 0) {\n const barrelExisted = existsSync(barrelPath);\n let barrelContent: string;\n\n if (barrelExisted) {\n barrelContent = await readFile(barrelPath, \"utf-8\");\n } else {\n await mkdir(barrelDir, { recursive: true });\n barrelContent = createBarrelFile();\n }\n\n for (const importPath of barrelImports) {\n barrelContent = addImportToBarrel(barrelContent, importPath);\n }\n\n await writeFile(barrelPath, barrelContent);\n p.log.info(`Updated barrel file: ${join(baseDir, \"index.ts\")}`);\n\n if (!barrelExisted) {\n p.note(\n [\n `import { ai } from \"@kitn/plugin\";`,\n ``,\n `app.route(\"/api\", ai.router);`,\n ].join(\"\\n\"),\n \"Add this to your server entry point\",\n );\n }\n }\n\n await writeConfig(cwd, config);\n await writeLock(cwd, lock);\n\n if (totalDeps > 0) {\n const pm = await detectPackageManager(cwd);\n if (pm) {\n s.start(`Installing ${totalDeps} npm dependenc${totalDeps === 1 ? \"y\" : \"ies\"}...`);\n try {\n if (uniqueDeps.length > 0) installDependencies(pm, uniqueDeps, cwd);\n if (uniqueDevDeps.length > 0) installDevDependencies(pm, uniqueDevDeps, cwd);\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(pc.yellow(\"Some dependencies failed to install\"));\n }\n }\n }\n\n if (created.length > 0) {\n p.log.success(`Added ${created.length} file(s):\\n` + created.map((f) => ` ${pc.green(\"+\")} ${f}`).join(\"\\n\"));\n }\n if (updated.length > 0) {\n p.log.success(`Updated ${updated.length} file(s):\\n` + updated.map((f) => ` ${pc.yellow(\"~\")} ${f}`).join(\"\\n\"));\n }\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s):\\n` + skipped.map((f) => ` ${pc.dim(\"-\")} ${f}`).join(\"\\n\"));\n }\n\n // Handle environment variables\n const allEnvVars = collectEnvVars(resolved);\n await handleEnvVars(cwd, allEnvVars);\n\n for (const item of resolved) {\n if (item.docs) {\n p.log.info(`${pc.bold(item.name)}: ${item.docs}`);\n }\n }\n\n // Show next-step hints for well-known packages\n const resolvedNames = new Set(resolved.map((r) => r.name));\n const projectInstalled = new Set(Object.keys(lock));\n const hints: string[] = [];\n\n const adapterName = resolveRoutesAlias(config);\n\n // Only suggest adding routes if neither resolved nor already installed\n if (resolvedNames.has(\"core\") && !resolvedNames.has(adapterName) && !projectInstalled.has(adapterName)) {\n hints.push(`Run ${pc.cyan(`kitn add routes`)} to install the HTTP adapter.`);\n }\n\n if (hints.length > 0) {\n p.log.message(pc.bold(\"\\nNext steps:\") + \"\\n\" + hints.join(\"\\n\"));\n }\n\n p.outro(pc.green(\"Done!\"));\n}\n","import { writeFile, mkdir, readFile } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport type { KitnConfig } from \"../utils/config.js\";\nimport { getRegistryUrl } from \"../utils/config.js\";\n\nconst TEMPLATE_PATH = join(import.meta.dirname, \"rules-template.md\");\n\n// ---------- Types ----------\n\nexport interface RulesConfig {\n version: string;\n tools: RulesTool[];\n}\n\nexport interface RulesTool {\n id: string;\n name: string;\n filePath: string;\n format: \"plain\" | \"mdc\";\n description?: string;\n frontmatter?: Record<string, string>;\n}\n\n// ---------- Fallback content ----------\n\nconst FALLBACK_CONFIG: RulesConfig = {\n version: \"1.0.0\",\n tools: [\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n filePath: \"AGENTS.md\",\n format: \"plain\",\n description: \"Also works with any tool that reads AGENTS.md\",\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n filePath: \".cursor/rules/kitn.mdc\",\n format: \"mdc\",\n frontmatter: {\n description: \"kitn AI agent framework conventions and patterns\",\n globs: \"src/ai/**/*.ts, src/ai/**/*.md, kitn.json, kitn.lock\",\n },\n },\n {\n id: \"github-copilot\",\n name: \"GitHub Copilot\",\n filePath: \".github/copilot-instructions.md\",\n format: \"plain\",\n },\n {\n id: \"cline\",\n name: \"Cline\",\n filePath: \".clinerules\",\n format: \"plain\",\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n filePath: \".windsurfrules\",\n format: \"plain\",\n },\n ],\n};\n\nlet _fallbackTemplate: string | undefined;\n\nasync function loadFallbackTemplate(): Promise<string> {\n if (!_fallbackTemplate) {\n _fallbackTemplate = await readFile(TEMPLATE_PATH, \"utf-8\");\n }\n return _fallbackTemplate;\n}\n\n// ---------- Registry fetch helpers ----------\n\n/**\n * Derive the rules base URL from the registry URL template.\n * e.g. \"https://kitn-ai.github.io/kitn/r/{type}/{name}.json\"\n * -> \"https://kitn-ai.github.io/kitn/r/rules/\"\n */\nfunction deriveRulesBaseUrl(registries: KitnConfig[\"registries\"]): string {\n const kitnEntry = registries[\"@kitn\"];\n if (!kitnEntry) {\n throw new Error(\"No @kitn registry configured\");\n }\n const url = getRegistryUrl(kitnEntry);\n return url.replace(\"{type}/{name}.json\", \"rules/\");\n}\n\n/** Fetch the rules config from the registry. */\nexport async function fetchRulesConfig(\n registries: KitnConfig[\"registries\"],\n): Promise<RulesConfig> {\n try {\n const baseUrl = deriveRulesBaseUrl(registries);\n const res = await fetch(baseUrl + \"config.json\");\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return (await res.json()) as RulesConfig;\n } catch {\n return FALLBACK_CONFIG;\n }\n}\n\n/** Fetch the rules template from the registry. */\nexport async function fetchRulesTemplate(\n registries: KitnConfig[\"registries\"],\n): Promise<string> {\n try {\n const baseUrl = deriveRulesBaseUrl(registries);\n const res = await fetch(baseUrl + \"template.md\");\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return await res.text();\n } catch {\n return loadFallbackTemplate();\n }\n}\n\n// ---------- Template rendering ----------\n\ninterface Aliases {\n base?: string;\n agents: string;\n tools: string;\n skills: string;\n storage: string;\n crons?: string;\n}\n\n/** Substitute {base}, {agents}, {tools}, {skills}, {storage}, {crons} with actual aliases. */\nexport function renderTemplate(template: string, aliases: Aliases): string {\n const base = aliases.base ?? \"src/ai\";\n return template\n .replace(/\\{base\\}/g, base)\n .replace(/\\{agents\\}/g, aliases.agents)\n .replace(/\\{tools\\}/g, aliases.tools)\n .replace(/\\{skills\\}/g, aliases.skills)\n .replace(/\\{storage\\}/g, aliases.storage)\n .replace(/\\{crons\\}/g, aliases.crons ?? `${base}/crons`);\n}\n\n/** Wrap content for a specific format (plain passthrough, mdc adds frontmatter). */\nexport function wrapContent(content: string, tool: RulesTool): string {\n if (tool.format === \"mdc\" && tool.frontmatter) {\n const lines = Object.entries(tool.frontmatter).map(\n ([key, value]) => `${key}: ${value}`,\n );\n return `---\\n${lines.join(\"\\n\")}\\n---\\n\\n${content}`;\n }\n return content;\n}\n\n// ---------- Main entry ----------\n\n/**\n * Fetch config + template from registry, render with project aliases,\n * and write rules files for each selected tool.\n *\n * @returns List of file paths written (relative to cwd).\n */\nexport async function generateRulesFiles(\n cwd: string,\n config: KitnConfig,\n selectedToolIds?: string[],\n): Promise<string[]> {\n const rulesConfig = await fetchRulesConfig(config.registries);\n const template = await fetchRulesTemplate(config.registries);\n const rendered = renderTemplate(template, config.aliases);\n\n const toolsToWrite = selectedToolIds\n ? rulesConfig.tools.filter((t) => selectedToolIds.includes(t.id))\n : rulesConfig.tools;\n\n const written: string[] = [];\n\n for (const tool of toolsToWrite) {\n const content = wrapContent(rendered, tool);\n const filePath = join(cwd, tool.filePath);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n written.push(tool.filePath);\n }\n\n return written;\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { readConfig, writeConfig, DEFAULT_REGISTRY_URL } from \"../utils/config.js\";\nimport { patchProjectTsconfig } from \"../installers/tsconfig-patcher.js\";\nimport { createBarrelFile } from \"../installers/barrel-manager.js\";\nimport { addCommand } from \"./add.js\";\nimport {\n fetchRulesConfig,\n generateRulesFiles,\n} from \"../installers/rules-generator.js\";\n\n/** Detect the HTTP framework from the project's package.json dependencies. */\nasync function detectFramework(cwd: string): Promise<\"hono\" | \"hono-openapi\" | \"elysia\" | null> {\n try {\n const pkg = JSON.parse(await readFile(join(cwd, \"package.json\"), \"utf-8\"));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps[\"elysia\"]) return \"elysia\";\n if (deps[\"@hono/zod-openapi\"]) return \"hono-openapi\";\n if (deps[\"hono\"]) return \"hono\";\n return null;\n } catch {\n return null;\n }\n}\n\nfunction getPluginTemplate(framework: string): string {\n const adapterName = framework === \"hono-openapi\" ? \"hono-openapi\" : framework;\n return `import { createAIPlugin } from \"@kitn/adapters/${adapterName}\";\nimport { registerWithPlugin } from \"./index.js\";\n\nexport const ai = createAIPlugin({\n // To enable agent chat, add an AI provider:\n // https://sdk.vercel.ai/providers/ai-sdk-providers\n //\n // Example with OpenRouter (access to many models):\n // import { openrouter } from \"@openrouter/ai-sdk-provider\";\n // model: (id) => openrouter(id ?? \"openai/gpt-4o-mini\"),\n //\n // Example with OpenAI directly:\n // import { openai } from \"@ai-sdk/openai\";\n // model: (id) => openai(id ?? \"gpt-4o-mini\"),\n});\n\n// Flush all auto-registered components into the plugin\nregisterWithPlugin(ai);\n`;\n}\n\ninterface InitOptions {\n runtime?: string;\n framework?: string;\n base?: string;\n yes?: boolean;\n}\n\nexport async function initCommand(opts: InitOptions = {}) {\n p.intro(pc.bgCyan(pc.black(\" kitn init \")));\n\n const cwd = process.cwd();\n\n const existing = await readConfig(cwd);\n if (existing) {\n if (opts.yes) {\n p.log.warn(\"kitn.json already exists — overwriting (--yes).\");\n } else {\n p.log.warn(\"kitn.json already exists in this directory.\");\n const shouldContinue = await p.confirm({\n message: \"Overwrite existing configuration?\",\n initialValue: false,\n });\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n }\n }\n\n let runtime: string;\n if (opts.runtime) {\n if (![\"bun\", \"node\", \"deno\"].includes(opts.runtime)) {\n p.log.error(`Invalid runtime: ${opts.runtime}. Must be bun, node, or deno.`);\n process.exit(1);\n }\n runtime = opts.runtime;\n } else if (opts.yes) {\n runtime = \"bun\";\n } else {\n const selected = await p.select({\n message: \"Which runtime do you use?\",\n options: [\n { value: \"bun\", label: \"Bun\", hint: \"recommended\" },\n { value: \"node\", label: \"Node.js\" },\n { value: \"deno\", label: \"Deno\" },\n ],\n });\n if (p.isCancel(selected)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n runtime = selected as string;\n }\n\n const validFrameworks = [\"hono\", \"hono-openapi\", \"elysia\"] as const;\n type Framework = (typeof validFrameworks)[number];\n let framework: Framework;\n const detected = await detectFramework(cwd);\n if (opts.framework) {\n if (!validFrameworks.includes(opts.framework as Framework)) {\n p.log.error(`Invalid framework: ${opts.framework}. Must be one of: ${validFrameworks.join(\", \")}`);\n process.exit(1);\n }\n framework = opts.framework as Framework;\n } else if (detected) {\n framework = detected;\n p.log.info(`Detected ${pc.bold(detected)} from package.json`);\n if (!opts.yes) {\n const confirm = await p.confirm({\n message: `Use ${detected}?`,\n initialValue: true,\n });\n if (p.isCancel(confirm)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n if (!confirm) {\n const selected = await p.select({\n message: \"Which HTTP framework do you use?\",\n options: [\n { value: \"hono\", label: \"Hono\" },\n { value: \"hono-openapi\", label: \"Hono + OpenAPI\", hint: \"zod-openapi routes with /doc endpoint\" },\n { value: \"elysia\", label: \"Elysia\", hint: \"Bun-native framework\" },\n ],\n });\n if (p.isCancel(selected)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n framework = selected as Framework;\n }\n }\n } else if (opts.yes) {\n framework = \"hono\";\n } else {\n const selected = await p.select({\n message: \"Which HTTP framework do you use?\",\n options: [\n { value: \"hono\", label: \"Hono\", hint: \"recommended\" },\n { value: \"hono-openapi\", label: \"Hono + OpenAPI\", hint: \"zod-openapi routes with /doc endpoint\" },\n { value: \"elysia\", label: \"Elysia\", hint: \"Bun-native framework\" },\n ],\n });\n if (p.isCancel(selected)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n framework = selected as Framework;\n }\n\n let baseDir: string;\n if (opts.base) {\n baseDir = opts.base;\n } else if (opts.yes) {\n baseDir = \"src/ai\";\n } else {\n const base = await p.text({\n message: \"Where should kitn components be installed?\",\n initialValue: \"src/ai\",\n placeholder: \"src/ai\",\n });\n if (p.isCancel(base)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n baseDir = base as string;\n }\n const config = {\n runtime: runtime as \"bun\" | \"node\" | \"deno\",\n framework,\n aliases: {\n base: baseDir,\n agents: `${baseDir}/agents`,\n tools: `${baseDir}/tools`,\n skills: `${baseDir}/skills`,\n storage: `${baseDir}/storage`,\n },\n registries: {\n \"@kitn\": {\n url: DEFAULT_REGISTRY_URL,\n homepage: \"https://kitn.ai\",\n description: \"Official kitn AI agent components\",\n },\n },\n };\n\n const s = p.spinner();\n s.start(\"Writing kitn.json\");\n await writeConfig(cwd, config);\n s.stop(\"Created kitn.json\");\n\n // Set up wildcard tsconfig path so @kitn/core, @kitn/adapters/*, etc. all resolve.\n // Remove any old per-package entries (e.g. @kitnai/core, @kitn/core) left from earlier versions.\n await patchProjectTsconfig(\n cwd,\n { \"@kitn/*\": [`./${baseDir}/*`] },\n [\"@kitn\", \"@kitnai\"],\n );\n p.log.info(`Patched tsconfig.json with path: ${pc.bold(\"@kitn/*\")}`);\n\n // Auto-install core engine + framework adapter\n p.log.info(\"Installing core engine and adapter...\");\n await addCommand([\"core\", \"routes\"], { overwrite: true });\n\n // Generate plugin.ts and barrel index.ts\n const aiDir = join(cwd, baseDir);\n await mkdir(aiDir, { recursive: true });\n\n const barrelPath = join(aiDir, \"index.ts\");\n await writeFile(barrelPath, createBarrelFile());\n\n const pluginPath = join(aiDir, \"plugin.ts\");\n await writeFile(pluginPath, getPluginTemplate(framework));\n\n p.log.success(`Created ${pc.bold(baseDir + \"/plugin.ts\")} — configure your AI provider there`);\n\n // --- Generate AI coding tool rules files ---\n try {\n const rulesConfig = await fetchRulesConfig(config.registries);\n\n let selectedToolIds: string[];\n\n if (opts.yes) {\n // Auto mode: generate all rules files\n selectedToolIds = rulesConfig.tools.map((t) => t.id);\n } else {\n const selected = await p.multiselect({\n message: \"Which AI coding tools do you use?\",\n options: rulesConfig.tools.map((t) => ({\n value: t.id,\n label: t.name,\n hint: t.description,\n })),\n required: false,\n });\n\n if (p.isCancel(selected)) {\n selectedToolIds = [];\n } else {\n selectedToolIds = selected as string[];\n }\n }\n\n if (selectedToolIds.length > 0) {\n const written = await generateRulesFiles(cwd, config, selectedToolIds);\n for (const filePath of written) {\n p.log.success(`Created ${pc.bold(filePath)}`);\n }\n }\n } catch {\n // Don't fail init if rules generation fails\n p.log.warn(\"Could not generate AI coding tool rules (non-fatal).\");\n }\n\n const mountCode = framework === \"elysia\"\n ? `app.use(new Elysia({ prefix: \"/api\" }).use(ai.router));`\n : `app.route(\"/api\", ai.router);`;\n p.note(\n [\n `import { ai } from \"@kitn/plugin\";`,\n ``,\n mountCode,\n ].join(\"\\n\"),\n \"Add this to your server entry point:\",\n );\n\n p.log.message(\n [\n pc.bold(\"Add your first agent:\"),\n ` ${pc.cyan(\"kitn add weather-agent\")}`,\n \"\",\n pc.bold(\"Browse all components:\"),\n ` ${pc.cyan(\"kitn list\")}`,\n ].join(\"\\n\"),\n );\n\n p.outro(\"Done!\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, readLock } from \"../utils/config.js\";\nimport { resolveTypeAlias } from \"../utils/type-aliases.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport type { RegistryIndex } from \"../registry/schema.js\";\n\ninterface ListOptions {\n installed?: boolean;\n type?: string;\n registry?: string;\n verbose?: boolean;\n}\n\ntype IndexItemWithNamespace = RegistryIndex[\"items\"][number] & { namespace: string };\n\nexport async function listCommand(typeFilter: string | undefined, opts: ListOptions) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // Resolve type filter from positional arg or --type flag\n const rawType = typeFilter ?? opts.type;\n const resolvedType = rawType ? resolveTypeAlias(rawType) : undefined;\n if (rawType && !resolvedType) {\n p.log.error(`Unknown type ${pc.bold(rawType)}. Valid types: agent, tool, skill, storage, package`);\n process.exit(1);\n }\n\n const fetcher = new RegistryFetcher(config.registries);\n\n const namespacesToFetch = opts.registry\n ? [opts.registry]\n : Object.keys(config.registries);\n\n if (opts.registry && !config.registries[opts.registry]) {\n p.log.error(`Registry ${pc.bold(opts.registry)} is not configured. Run ${pc.bold(\"kitn registry list\")} to see configured registries.`);\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Fetching registry...\");\n\n const allItems: IndexItemWithNamespace[] = [];\n const errors: string[] = [];\n\n for (const namespace of namespacesToFetch) {\n try {\n const index = await fetcher.fetchIndex(namespace);\n for (const item of index.items) {\n allItems.push({ ...item, namespace });\n }\n } catch (err: any) {\n errors.push(`${namespace}: ${err.message}`);\n }\n }\n\n if (allItems.length === 0 && errors.length > 0) {\n s.stop(pc.red(\"Failed to fetch registries\"));\n for (const e of errors) p.log.error(e);\n process.exit(1);\n }\n\n s.stop(`Found ${allItems.length} components`);\n\n for (const e of errors) {\n p.log.warn(`${pc.yellow(\"⚠\")} Failed to fetch ${e}`);\n }\n\n const installed = await readLock(cwd);\n const typeGroups = new Map<string, IndexItemWithNamespace[]>();\n\n for (const item of allItems) {\n const group = item.type.replace(\"kitn:\", \"\");\n if (resolvedType && group !== resolvedType) continue;\n // Hide packages from default view — they're installed by `kitn init`\n if (!resolvedType && group === \"package\") continue;\n if (!typeGroups.has(group)) typeGroups.set(group, []);\n typeGroups.get(group)!.push(item);\n }\n\n // Calculate max name width for alignment\n let maxName = 0;\n for (const items of typeGroups.values()) {\n for (const item of items) {\n const displayName = item.namespace === \"@kitn\" ? item.name : `${item.namespace}/${item.name}`;\n if (displayName.length > maxName) maxName = displayName.length;\n }\n }\n\n const cols = process.stdout.columns ?? 80;\n // Layout: \" ✓ name__ [vX.X.X ]description\"\n const versionLen = opts.verbose ? 10 : 0;\n const prefixLen = 4 + maxName + 2 + versionLen;\n\n let installedCount = 0;\n let updateCount = 0;\n let shownCount = 0;\n\n for (const [group, items] of typeGroups) {\n // Sort: installed first, then alphabetical\n items.sort((a, b) => {\n const aInst = !!(installed[a.name] ?? installed[`${a.namespace}/${a.name}`]);\n const bInst = !!(installed[b.name] ?? installed[`${b.namespace}/${b.name}`]);\n if (aInst !== bInst) return aInst ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n const label = group.charAt(0).toUpperCase() + group.slice(1) + \"s\";\n console.log(`\\n ${pc.bold(label)} ${pc.dim(`(${items.length})`)}`);\n\n for (const item of items) {\n const displayName = item.namespace === \"@kitn\" ? item.name : `${item.namespace}/${item.name}`;\n const inst = installed[item.name] ?? installed[displayName];\n if (opts.installed && !inst) continue;\n\n const maxDescLen = Math.max(20, cols - prefixLen);\n\n let desc = item.description;\n if (desc.length > maxDescLen) {\n desc = desc.slice(0, maxDescLen - 1) + \"…\";\n }\n\n let line: string;\n const nameCol = displayName.padEnd(maxName + 2);\n const version = opts.verbose ? `${pc.dim(`v${item.version ?? \"1.0.0\"}`)} ` : \"\";\n\n if (inst) {\n installedCount++;\n const hasUpdate = item.version && inst.version !== item.version;\n if (hasUpdate) updateCount++;\n const updateTag = hasUpdate ? pc.yellow(` ↑${item.version}`) : \"\";\n line = ` ${pc.green(\"✓\")} ${nameCol}${version}${pc.dim(desc)}${updateTag}`;\n } else {\n line = ` ${pc.dim(\"○\")} ${nameCol}${version}${pc.dim(desc)}`;\n }\n\n console.log(line);\n shownCount++;\n }\n }\n\n if (shownCount === 0 && resolvedType) {\n console.log(pc.dim(`\\n No ${resolvedType} components found.`));\n }\n\n const totalShown = [...typeGroups.values()].reduce((sum, items) => sum + items.length, 0);\n const parts = [`${installedCount} installed`, `${totalShown - installedCount} available`];\n if (updateCount > 0) parts.push(pc.yellow(`${updateCount} update${updateCount === 1 ? \"\" : \"s\"}`));\n console.log(`\\n ${pc.dim(parts.join(\" · \"))}\\n`);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig, resolveRoutesAlias, readLock } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { readExistingFile, generateDiff } from \"../installers/file-writer.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { typeToDir } from \"../registry/schema.js\";\n\nexport async function diffCommand(componentName: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" alias to framework-specific adapter name\n const input = componentName === \"routes\" ? resolveRoutesAlias(config) : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in lock — @kitn uses plain name, third-party uses @namespace/name\n const lock = await readLock(cwd);\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = lock[installedKey];\n if (!installed) {\n p.log.error(`Component '${ref.name}' is not installed.`);\n process.exit(1);\n }\n\n const namespace = installed.registry ?? ref.namespace;\n const fetcher = new RegistryFetcher(config.registries);\n const index = await fetcher.fetchIndex(namespace);\n const indexItem = index.items.find((i) => i.name === ref.name);\n if (!indexItem) {\n p.log.error(`Component '${ref.name}' not found in ${namespace} registry.`);\n process.exit(1);\n }\n\n const dir = typeToDir[indexItem.type] as any;\n const registryItem = await fetcher.fetchItem(ref.name, dir, namespace, ref.version);\n\n let hasDiff = false;\n for (const file of registryItem.files) {\n if (indexItem.type === \"kitn:package\") {\n // Packages use base alias + preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n const localPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n const localContent = await readExistingFile(localPath);\n\n if (localContent === null) {\n p.log.warn(`${relativePath}: file missing locally`);\n hasDiff = true;\n } else if (localContent !== file.content) {\n const diff = generateDiff(relativePath, localContent, file.content);\n console.log(diff);\n hasDiff = true;\n }\n } else {\n // Regular components use type-based alias directories\n const fileName = file.path.split(\"/\").pop()!;\n const aliasKey = (() => {\n switch (indexItem.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\n const localPath = join(cwd, config.aliases[aliasKey], fileName);\n const localContent = await readExistingFile(localPath);\n\n if (localContent === null) {\n p.log.warn(`${fileName}: file missing locally`);\n hasDiff = true;\n } else if (localContent !== file.content) {\n const diff = generateDiff(fileName, localContent, file.content);\n console.log(diff);\n hasDiff = true;\n }\n }\n }\n\n if (!hasDiff) {\n p.log.success(`${ref.name}: up to date, no differences.`);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join, relative, dirname } from \"path\";\nimport { unlink, readFile, writeFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { readConfig, writeConfig, resolveRoutesAlias, readLock, writeLock } from \"../utils/config.js\";\nimport type { LockFile } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { removeImportFromBarrel } from \"../installers/barrel-manager.js\";\n\nasync function removeSingleComponent(installedKey: string, lock: LockFile, config: any, cwd: string) {\n const entry = lock[installedKey];\n if (!entry) return;\n\n const deleted: string[] = [];\n for (const filePath of entry.files) {\n try {\n await unlink(join(cwd, filePath));\n deleted.push(filePath);\n } catch {\n p.log.warn(`Could not delete ${filePath} (may have been moved or renamed)`);\n }\n }\n\n // Remove barrel imports for deleted files\n const baseDir = config.aliases.base ?? \"src/ai\";\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n const barrelDir = join(cwd, baseDir);\n const barrelEligibleDirs = new Set([\n config.aliases.agents,\n config.aliases.tools,\n config.aliases.skills,\n ]);\n\n if (existsSync(barrelPath) && deleted.length > 0) {\n let barrelContent = await readFile(barrelPath, \"utf-8\");\n let barrelChanged = false;\n\n for (const filePath of deleted) {\n const fileDir = dirname(filePath);\n if (!barrelEligibleDirs.has(fileDir)) continue;\n\n const importPath = \"./\" + relative(barrelDir, join(cwd, filePath)).replace(/\\\\/g, \"/\");\n const updated = removeImportFromBarrel(barrelContent, importPath);\n if (updated !== barrelContent) {\n barrelContent = updated;\n barrelChanged = true;\n }\n }\n\n if (barrelChanged) {\n await writeFile(barrelPath, barrelContent);\n p.log.info(`Updated barrel file: ${join(baseDir, \"index.ts\")}`);\n }\n }\n\n delete lock[installedKey];\n\n if (deleted.length > 0) {\n p.log.success(`Removed ${installedKey}:\\n` + deleted.map((f) => ` ${pc.red(\"-\")} ${f}`).join(\"\\n\"));\n }\n}\n\nasync function offerOrphanRemoval(removedDeps: Set<string>, lock: LockFile, config: any, cwd: string) {\n if (removedDeps.size === 0) return;\n\n // Find orphaned dependencies — deps not needed by any remaining installed component\n const remaining = Object.entries(lock);\n const neededDeps = new Set<string>();\n for (const [, entry] of remaining) {\n if (entry.registryDependencies) {\n for (const dep of entry.registryDependencies) {\n neededDeps.add(dep);\n }\n }\n }\n\n // Also exclude \"core\" — never offer to remove it\n const orphans = [...removedDeps].filter(\n (dep) => dep !== \"core\" && !neededDeps.has(dep) && lock[dep]\n );\n\n if (orphans.length === 0) return;\n\n const selected = await p.multiselect({\n message: \"The following dependencies are no longer used. Remove them?\",\n options: orphans.map((dep) => ({\n value: dep,\n label: dep,\n hint: `${lock[dep].files.length} file(s)`,\n })),\n initialValues: orphans, // all checked by default\n });\n\n if (p.isCancel(selected)) return;\n\n for (const key of selected as string[]) {\n await removeSingleComponent(key, lock, config, cwd);\n }\n}\n\nexport async function removeCommand(componentName?: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const lock = await readLock(cwd);\n\n if (!componentName) {\n const installedKeys = Object.keys(lock);\n\n if (installedKeys.length === 0) {\n p.log.warn(\"No components installed.\");\n process.exit(0);\n }\n\n const selected = await p.multiselect({\n message: \"Select components to remove:\",\n options: installedKeys.map((key) => ({\n value: key,\n label: key,\n hint: `${lock[key].files.length} file(s)`,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const selectedKeys = selected as string[];\n if (selectedKeys.length === 0) {\n p.log.warn(\"No components selected.\");\n process.exit(0);\n }\n\n // Snapshot deps before removal (entries get deleted during removeSingleComponent)\n const allRemovedDeps = new Set<string>();\n for (const key of selectedKeys) {\n const entry = lock[key];\n if (entry?.registryDependencies) {\n for (const dep of entry.registryDependencies) {\n allRemovedDeps.add(dep);\n }\n }\n }\n\n // Remove each selected component\n for (const key of selectedKeys) {\n await removeSingleComponent(key, lock, config, cwd);\n }\n\n await offerOrphanRemoval(allRemovedDeps, lock, config, cwd);\n\n await writeLock(cwd, lock);\n p.outro(pc.green(\"Done!\"));\n return;\n }\n\n // Resolve \"routes\" alias to framework-specific adapter name\n const input = componentName === \"routes\" ? resolveRoutesAlias(config) : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in lock — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const entry = lock[installedKey];\n if (!entry) {\n p.log.error(`Component '${ref.name}' is not installed.`);\n process.exit(1);\n }\n\n const shouldRemove = await p.confirm({\n message: `Remove ${ref.name}? This will delete ${entry.files.length} file(s).`,\n initialValue: false,\n });\n if (p.isCancel(shouldRemove) || !shouldRemove) {\n p.cancel(\"Remove cancelled.\");\n process.exit(0);\n }\n\n // Snapshot deps before removal\n const removedDeps = new Set(entry.registryDependencies ?? []);\n\n await removeSingleComponent(installedKey, lock, config, cwd);\n\n // Check for orphaned dependencies\n await offerOrphanRemoval(removedDeps, lock, config, cwd);\n\n await writeLock(cwd, lock);\n}\n","import { addCommand } from \"./add.js\";\nimport { readConfig, readLock } from \"../utils/config.js\";\nimport * as p from \"@clack/prompts\";\n\nexport async function updateCommand(components: string[]) {\n // If no components specified, update all installed components\n if (components.length === 0) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const lock = await readLock(cwd);\n if (Object.keys(lock).length === 0) {\n p.log.info(\"No installed components to update.\");\n return;\n }\n\n components = Object.keys(lock);\n }\n\n await addCommand(components, { overwrite: true });\n}\n","export function toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nexport function toTitleCase(str: string): string {\n return str\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join, relative } from \"path\";\nimport { existsSync } from \"fs\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { readConfig, getInstallPath } from \"../utils/config.js\";\nimport { toCamelCase, toTitleCase } from \"../utils/naming.js\";\nimport { checkFileStatus, FileStatus, writeComponentFile } from \"../installers/file-writer.js\";\nimport { createBarrelFile, addImportToBarrel } from \"../installers/barrel-manager.js\";\n\nconst VALID_TYPES = [\"agent\", \"tool\", \"skill\", \"storage\", \"cron\"] as const;\ntype ComponentType = (typeof VALID_TYPES)[number];\n\nfunction generateAgentSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { registerAgent } from \"@kitn/core\";\n\nconst SYSTEM_PROMPT = \"You are a helpful assistant.\";\n\nregisterAgent({\n name: \"${name}\",\n description: \"\",\n system: SYSTEM_PROMPT,\n tools: {},\n});\n`;\n}\n\nfunction generateToolSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { registerTool } from \"@kitn/core\";\nimport { tool } from \"ai\";\nimport { z } from \"zod\";\n\nexport const ${camel} = tool({\n description: \"\",\n inputSchema: z.object({\n input: z.string().describe(\"Input parameter\"),\n }),\n execute: async ({ input }) => {\n // TODO: implement\n return { result: input };\n },\n});\n\nregisterTool({\n name: \"${name}\",\n description: \"\",\n inputSchema: z.object({ input: z.string() }),\n tool: ${camel},\n});\n`;\n}\n\nfunction generateSkillSource(name: string): string {\n const title = toTitleCase(name);\n return `---\nname: ${name}\ndescription: \"\"\n---\n\n# ${title}\n\nDescribe what this skill does and how to use it.\n`;\n}\n\nfunction generateStorageSource(name: string): string {\n const camel = toCamelCase(\"create-\" + name);\n return `import type { StorageProvider } from \"@kitn/core\";\n\nexport function ${camel}(config?: Record<string, unknown>): StorageProvider {\n // TODO: implement storage provider\n throw new Error(\"Not implemented\");\n}\n`;\n}\n\nfunction generateCronSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { registerTool } from \"@kitn/core\";\nimport { tool } from \"ai\";\nimport { z } from \"zod\";\n\n// Cron job: ${name}\n// This file defines tools for a cron job. Register the cron via the API:\n// POST /api/crons { name: \"${name}\", schedule: \"0 6 * * *\", agentName: \"...\", input: \"...\" }\n\nexport const ${camel} = tool({\n description: \"Execute the ${name} cron task\",\n parameters: z.object({\n input: z.string().describe(\"Task input\"),\n }),\n execute: async ({ input }) => {\n // TODO: implement\n return { result: input };\n },\n});\n\nregisterTool({\n name: \"${name}\",\n description: \"\",\n inputSchema: z.object({ input: z.string() }),\n tool: ${camel},\n});\n`;\n}\n\nconst typeToKitnType: Record<ComponentType, \"kitn:agent\" | \"kitn:tool\" | \"kitn:skill\" | \"kitn:storage\" | \"kitn:cron\"> = {\n agent: \"kitn:agent\",\n tool: \"kitn:tool\",\n skill: \"kitn:skill\",\n storage: \"kitn:storage\",\n cron: \"kitn:cron\",\n};\n\n// Types that get auto-wired into the barrel file\nconst BARREL_TYPES: ComponentType[] = [\"agent\", \"tool\", \"skill\", \"cron\"];\n\nexport async function createComponentInProject(\n type: string,\n name: string,\n opts?: { cwd?: string }\n): Promise<{ filePath: string; barrelUpdated: boolean }> {\n if (!VALID_TYPES.includes(type as ComponentType)) {\n throw new Error(\n `Invalid component type: \"${type}\". Valid types: ${VALID_TYPES.join(\", \")}`\n );\n }\n\n const cwd = opts?.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n throw new Error(\n `No kitn.json found in ${cwd}. Run ${pc.bold(\"kitn init\")} first.`\n );\n }\n\n const validType = type as ComponentType;\n const kitnType = typeToKitnType[validType];\n const fileName = validType === \"skill\" ? `${name}.md` : `${name}.ts`;\n\n const filePath = join(cwd, getInstallPath(config, kitnType, fileName));\n\n // Check file doesn't already exist\n const dummyContent = \"\"; // only need to check existence\n const status = await checkFileStatus(filePath, dummyContent);\n if (status !== FileStatus.New) {\n throw new Error(`File already exists: ${filePath}`);\n }\n\n // Generate source\n let source: string;\n switch (validType) {\n case \"agent\":\n source = generateAgentSource(name);\n break;\n case \"tool\":\n source = generateToolSource(name);\n break;\n case \"skill\":\n source = generateSkillSource(name);\n break;\n case \"storage\":\n source = generateStorageSource(name);\n break;\n case \"cron\":\n source = generateCronSource(name);\n break;\n }\n\n // Write the component file\n await writeComponentFile(filePath, source);\n\n // Wire into barrel file for agents, tools, and skills\n let barrelUpdated = false;\n if (BARREL_TYPES.includes(validType)) {\n const baseDir = config.aliases.base ?? \"src/ai\";\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n\n // Read or create barrel file\n let barrelContent: string;\n if (existsSync(barrelPath)) {\n barrelContent = await readFile(barrelPath, \"utf-8\");\n } else {\n barrelContent = createBarrelFile();\n await mkdir(join(cwd, baseDir), { recursive: true });\n }\n\n // Compute relative import path from barrel to the component\n const importPath = \"./\" + relative(join(cwd, baseDir), filePath).replace(/\\.ts$/, \".js\");\n const updatedBarrel = addImportToBarrel(barrelContent, importPath);\n\n if (updatedBarrel !== barrelContent) {\n await writeFile(barrelPath, updatedBarrel);\n barrelUpdated = true;\n }\n }\n\n return { filePath, barrelUpdated };\n}\n\nexport async function createCommand(type: string, name: string) {\n p.intro(pc.bgCyan(pc.black(\" kitn create \")));\n\n try {\n const { filePath, barrelUpdated } = await createComponentInProject(type, name);\n\n p.log.success(`Created ${pc.bold(type)} component ${pc.cyan(name)}`);\n p.log.message(` ${pc.green(\"+\")} ${filePath}`);\n\n if (barrelUpdated) {\n p.log.message(` ${pc.green(\"+\")} barrel file updated`);\n }\n\n p.outro(\n `Edit ${pc.cyan(filePath)} to customize your ${type}.`\n );\n } catch (err: any) {\n p.log.error(err.message);\n process.exit(1);\n }\n}\n","import { readdir, readFile } from \"fs/promises\";\nimport { join, relative, dirname } from \"path\";\nimport type { KitnConfig } from \"./config.js\";\nimport { readLock } from \"./config.js\";\n\nexport interface ResolvedTool {\n filePath: string; // absolute path to tool file\n exportName: string; // e.g. \"weatherTool\"\n importPath: string; // relative .js path from agent dir\n}\n\nexport interface ResolvedAgent {\n filePath: string; // absolute path to agent file\n name: string; // agent name from registerAgent call or filename\n}\n\n/**\n * Strip a type-specific suffix from a component name.\n * e.g. \"weather-tool\" -> \"weather\", \"general-agent\" -> \"general\"\n */\nfunction stripSuffix(name: string, suffix: string): string {\n if (name.endsWith(`-${suffix}`)) {\n return name.slice(0, -(suffix.length + 1));\n }\n return name;\n}\n\n/** Get the absolute tools directory from config. */\nfunction toolsDir(config: KitnConfig, cwd: string): string {\n const baseAlias = config.aliases.base ?? \"src/ai\";\n const tools = config.aliases.tools ?? join(baseAlias, \"tools\");\n return join(cwd, tools);\n}\n\n/** Get the absolute agents directory from config. */\nfunction agentsDir(config: KitnConfig, cwd: string): string {\n const baseAlias = config.aliases.base ?? \"src/ai\";\n const agents = config.aliases.agents ?? join(baseAlias, \"agents\");\n return join(cwd, agents);\n}\n\n/** Try to find a .ts file in a directory matching one of the candidate names. */\nasync function findFile(dir: string, candidates: string[]): Promise<string | null> {\n for (const name of candidates) {\n const filePath = join(dir, `${name}.ts`);\n try {\n await readFile(filePath);\n return filePath;\n } catch {\n // file doesn't exist, try next\n }\n }\n return null;\n}\n\n/** Extract the first `export const <name>` identifier from a TypeScript source file. */\nfunction parseExportName(source: string): string | null {\n const match = source.match(/export\\s+const\\s+(\\w+)/);\n return match ? match[1] : null;\n}\n\n/** Extract agent name from `registerAgent({ name: \"...\" })` or `name: \"...\"` pattern. */\nfunction parseAgentName(source: string): string | null {\n const match = source.match(/registerAgent\\s*\\(\\s*\\{[^}]*name:\\s*\"([^\"]+)\"/s);\n return match ? match[1] : null;\n}\n\n/** Compute a relative import path from one directory to a file, using .js extension. */\nfunction computeImportPath(fromDir: string, toFile: string): string {\n let rel = relative(fromDir, toFile);\n // Ensure it starts with \"./\" for relative imports\n if (!rel.startsWith(\".\")) {\n rel = `./${rel}`;\n }\n // Replace .ts extension with .js\n return rel.replace(/\\.ts$/, \".js\");\n}\n\n/**\n * Resolve a tool by name. Checks the lock file first, then scans the tools directory.\n * Returns null if the tool is not found.\n */\nexport async function resolveToolByName(\n name: string,\n config: KitnConfig,\n cwd: string,\n): Promise<ResolvedTool | null> {\n const tDir = toolsDir(config, cwd);\n const aDir = agentsDir(config, cwd);\n\n // 1. Check lock file for installed file path\n const lock = await readLock(cwd);\n for (const [componentName, entry] of Object.entries(lock)) {\n if (componentName === name || componentName === `${name}-tool`) {\n // Find a tool file in the entry's files list\n const toolFile = entry.files.find((f) => {\n const toolsAlias = config.aliases.tools ?? join(config.aliases.base ?? \"src/ai\", \"tools\");\n return f.startsWith(toolsAlias);\n });\n if (toolFile) {\n const filePath = join(cwd, toolFile);\n try {\n const source = await readFile(filePath, \"utf-8\");\n const exportName = parseExportName(source);\n if (exportName) {\n return {\n filePath,\n exportName,\n importPath: computeImportPath(aDir, filePath),\n };\n }\n } catch {\n // File from lock doesn't exist on disk, fall through to directory scan\n }\n }\n }\n }\n\n // 2. Scan tools directory\n const candidates = [name, stripSuffix(name, \"tool\")];\n // Deduplicate (if name doesn't have -tool suffix, both will be the same)\n const uniqueCandidates = [...new Set(candidates)];\n\n const filePath = await findFile(tDir, uniqueCandidates);\n if (!filePath) return null;\n\n const source = await readFile(filePath, \"utf-8\");\n const exportName = parseExportName(source);\n if (!exportName) return null;\n\n return {\n filePath,\n exportName,\n importPath: computeImportPath(aDir, filePath),\n };\n}\n\n/**\n * Resolve an agent by name. Checks the lock file first, then scans the agents directory.\n * Returns null if the agent is not found.\n */\nexport async function resolveAgentByName(\n name: string,\n config: KitnConfig,\n cwd: string,\n): Promise<ResolvedAgent | null> {\n const aDir = agentsDir(config, cwd);\n\n // 1. Check lock file for installed file path\n const lock = await readLock(cwd);\n for (const [componentName, entry] of Object.entries(lock)) {\n if (componentName === name || componentName === `${name}-agent`) {\n const agentFile = entry.files.find((f) => {\n const agentsAlias = config.aliases.agents ?? join(config.aliases.base ?? \"src/ai\", \"agents\");\n return f.startsWith(agentsAlias);\n });\n if (agentFile) {\n const filePath = join(cwd, agentFile);\n try {\n const source = await readFile(filePath, \"utf-8\");\n const agentName = parseAgentName(source);\n return {\n filePath,\n name: agentName ?? componentName,\n };\n } catch {\n // File from lock doesn't exist on disk, fall through\n }\n }\n }\n }\n\n // 2. Scan agents directory\n const candidates = [name, stripSuffix(name, \"agent\")];\n const uniqueCandidates = [...new Set(candidates)];\n\n const filePath = await findFile(aDir, uniqueCandidates);\n if (!filePath) return null;\n\n const source = await readFile(filePath, \"utf-8\");\n const agentName = parseAgentName(source);\n const fallbackName = filePath.split(\"/\").pop()!.replace(/\\.ts$/, \"\");\n\n return {\n filePath,\n name: agentName ?? fallbackName,\n };\n}\n\n/** List entry for tools/agents directory scanning. */\nexport interface ComponentListEntry {\n name: string; // filename without .ts extension\n filePath: string; // absolute path\n}\n\n/**\n * List all tools in the tools directory.\n * Returns an empty array if the directory doesn't exist.\n */\nexport async function listTools(config: KitnConfig, cwd: string): Promise<ComponentListEntry[]> {\n const dir = toolsDir(config, cwd);\n return listComponentsInDir(dir);\n}\n\n/**\n * List all agents in the agents directory.\n * Returns an empty array if the directory doesn't exist.\n */\nexport async function listAgents(config: KitnConfig, cwd: string): Promise<ComponentListEntry[]> {\n const dir = agentsDir(config, cwd);\n return listComponentsInDir(dir);\n}\n\n/** Scan a directory for .ts files and return component list entries. */\nasync function listComponentsInDir(dir: string): Promise<ComponentListEntry[]> {\n try {\n const entries = await readdir(dir);\n return entries\n .filter((f) => f.endsWith(\".ts\") && !f.endsWith(\".test.ts\") && !f.endsWith(\".d.ts\"))\n .sort()\n .map((f) => ({\n name: f.replace(/\\.ts$/, \"\"),\n filePath: join(dir, f),\n }));\n } catch {\n return [];\n }\n}\n","/**\n * Regex-based agent file manipulation for linking/unlinking tools.\n *\n * Works on string content (no file I/O) — same approach as barrel-manager.ts.\n */\n\nexport interface LinkResult {\n content: string;\n changed: boolean;\n error?: string;\n}\n\nexport interface ToolRef {\n exportName: string;\n importPath: string;\n}\n\n/**\n * Link a tool into an agent file by adding an import and inserting the tool\n * into the `tools: { ... }` object.\n */\nexport function linkToolToAgent(\n content: string,\n tool: ToolRef,\n toolKey?: string,\n): LinkResult {\n const key = toolKey ?? tool.exportName;\n const { exportName, importPath } = tool;\n\n // --- Check if already linked (idempotent) ---\n const toolEntry = key === exportName ? exportName : `${key}: ${exportName}`;\n if (hasToolEntry(content, key)) {\n return { content, changed: false };\n }\n\n // --- Insert import ---\n const importLine = `import { ${exportName} } from \"${importPath}\";`;\n let result = content;\n\n if (!result.includes(importLine)) {\n const lines = result.split(\"\\n\");\n let lastImportIndex = -1;\n for (let i = 0; i < lines.length; i++) {\n if (/^import\\s+/.test(lines[i])) lastImportIndex = i;\n }\n\n if (lastImportIndex === -1) {\n // No imports found — prepend\n result = `${importLine}\\n${result}`;\n } else {\n lines.splice(lastImportIndex + 1, 0, importLine);\n result = lines.join(\"\\n\");\n }\n }\n\n // --- Insert tool entry ---\n const insertResult = insertToolEntry(result, key, exportName);\n if (insertResult.error) {\n return {\n content,\n changed: false,\n error:\n `Could not auto-modify the agent file. Add manually:\\n` +\n ` 1. Import: ${importLine}\\n` +\n ` 2. Add to tools: { ${toolEntry} }`,\n };\n }\n\n return { content: insertResult.content, changed: true };\n}\n\n/**\n * Unlink a tool from an agent file by removing it from the `tools` object\n * and removing the import if the export is no longer referenced.\n */\nexport function unlinkToolFromAgent(\n content: string,\n tool: ToolRef,\n toolKey?: string,\n): LinkResult {\n const key = toolKey ?? tool.exportName;\n const { exportName, importPath } = tool;\n\n if (!hasToolEntry(content, key)) {\n return { content, changed: false };\n }\n\n // --- Remove tool entry ---\n const removeResult = removeToolEntry(content, key, exportName);\n if (removeResult.error) {\n return {\n content,\n changed: false,\n error:\n `Could not auto-modify the agent file. Remove manually:\\n` +\n ` 1. Remove from tools: ${key === exportName ? key : `${key}: ${exportName}`}\\n` +\n ` 2. Remove import if unused: import { ${exportName} } from \"${importPath}\";`,\n };\n }\n\n let result = removeResult.content;\n\n // --- Remove import if exportName is no longer referenced in file ---\n if (!isExportNameReferenced(result, exportName)) {\n result = removeImportLine(result, exportName, importPath);\n }\n\n return { content: result, changed: true };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Check whether a key already exists in the tools object. */\nfunction hasToolEntry(content: string, key: string): boolean {\n // Match \"key:\" or \"key,\" or \"key }\" or standalone shorthand \"key\" in tools\n // We look for the key inside a tools: { ... } block\n const toolsMatch = extractToolsBlock(content);\n if (!toolsMatch) return false;\n const toolsContent = toolsMatch.inner;\n\n // Check for \"key: value\" or shorthand \"key\" (as standalone identifier)\n const keyPattern = new RegExp(\n `(?:^|[,{\\\\s])${escapeRegex(key)}(?:\\\\s*[:,}\\\\s]|$)`,\n );\n return keyPattern.test(toolsContent);\n}\n\ninterface ToolsBlock {\n /** Full match including \"tools: { ... }\" */\n full: string;\n /** Content inside the braces */\n inner: string;\n /** Start index in the original string */\n startIndex: number;\n /** Indentation of the \"tools:\" line */\n indent: string;\n}\n\n/** Extract the tools block from file content, handling both single-line and multiline. */\nfunction extractToolsBlock(content: string): ToolsBlock | null {\n // First try single-line: tools: { ... }\n const singleLine = /^([ \\t]*)tools\\s*:\\s*\\{([^}]*)\\}/m;\n const singleMatch = singleLine.exec(content);\n if (singleMatch) {\n return {\n full: singleMatch[0],\n inner: singleMatch[2],\n startIndex: singleMatch.index,\n indent: singleMatch[1],\n };\n }\n\n // Multiline: find \"tools: {\" then match to closing \"}\"\n const multiStart = /^([ \\t]*)tools\\s*:\\s*\\{/m;\n const multiMatch = multiStart.exec(content);\n if (!multiMatch) return null;\n\n const braceStart = multiMatch.index + multiMatch[0].length;\n let depth = 1;\n let i = braceStart;\n while (i < content.length && depth > 0) {\n if (content[i] === \"{\") depth++;\n else if (content[i] === \"}\") depth--;\n i++;\n }\n if (depth !== 0) return null;\n\n const full = content.slice(multiMatch.index, i);\n const inner = content.slice(braceStart, i - 1);\n return {\n full,\n inner,\n startIndex: multiMatch.index,\n indent: multiMatch[1],\n };\n}\n\n/** Insert a tool entry into the tools object. */\nfunction insertToolEntry(\n content: string,\n key: string,\n exportName: string,\n): { content: string; error?: string } {\n const block = extractToolsBlock(content);\n if (!block) return { content, error: \"no tools block found\" };\n\n const entry = key === exportName ? key : `${key}: ${exportName}`;\n const trimmedInner = block.inner.trim();\n\n let newToolsContent: string;\n\n if (trimmedInner === \"\") {\n // Empty tools: {} → tools: { entry }\n newToolsContent = `tools: { ${entry} }`;\n } else if (!block.inner.includes(\"\\n\")) {\n // Single-line with existing entries: tools: { a, b } → tools: { a, b, entry }\n // Remove trailing whitespace inside braces\n const cleaned = trimmedInner.replace(/,?\\s*$/, \"\");\n newToolsContent = `tools: { ${cleaned}, ${entry} }`;\n } else {\n // Multiline: insert before closing brace with proper indentation\n const entryIndent = block.indent + \" \";\n // Ensure the existing content ends with a comma\n const existingTrimmed = block.inner.trimEnd();\n const withComma = existingTrimmed.endsWith(\",\")\n ? existingTrimmed\n : existingTrimmed + \",\";\n newToolsContent = `tools: {\\n${withComma}\\n${entryIndent}${entry},\\n${block.indent}}`;\n }\n\n const newContent = content.replace(block.full, newToolsContent);\n return { content: newContent };\n}\n\n/** Remove a tool entry from the tools object. */\nfunction removeToolEntry(\n content: string,\n key: string,\n exportName: string,\n): { content: string; error?: string } {\n const block = extractToolsBlock(content);\n if (!block) return { content, error: \"no tools block found\" };\n\n const trimmedInner = block.inner.trim();\n\n if (!block.inner.includes(\"\\n\")) {\n // Single-line: parse entries, filter out the matching one\n const entries = trimmedInner\n .split(\",\")\n .map((e) => e.trim())\n .filter((e) => e !== \"\");\n\n const filtered = entries.filter((e) => {\n // Match \"key: value\" or shorthand \"key\"\n const colonIdx = e.indexOf(\":\");\n const entryKey = colonIdx >= 0 ? e.slice(0, colonIdx).trim() : e.trim();\n return entryKey !== key;\n });\n\n const newInner =\n filtered.length === 0 ? \"\" : ` ${filtered.join(\", \")} `;\n const newBlock = `tools: {${newInner}}`;\n return { content: content.replace(block.full, newBlock) };\n } else {\n // Multiline: remove the line matching the key\n const lines = block.inner.split(\"\\n\");\n const keyPattern = new RegExp(\n `^\\\\s*${escapeRegex(key)}\\\\s*(?::|,|$)`,\n );\n const filtered = lines.filter((line) => !keyPattern.test(line));\n\n // Check if all remaining lines are empty/whitespace\n const hasEntries = filtered.some((l) => l.trim() !== \"\");\n\n if (!hasEntries) {\n const newBlock = `tools: {}`;\n return { content: content.replace(block.full, newBlock) };\n }\n\n // Clean up: ensure last entry line ends with comma\n const cleanedLines = filtered.slice();\n // Find last non-empty line and ensure trailing comma\n for (let i = cleanedLines.length - 1; i >= 0; i--) {\n if (cleanedLines[i].trim() !== \"\") {\n if (!cleanedLines[i].trimEnd().endsWith(\",\")) {\n cleanedLines[i] = cleanedLines[i].trimEnd() + \",\";\n }\n break;\n }\n }\n\n const newBlock = `tools: {\\n${cleanedLines.join(\"\\n\")}\\n${block.indent}}`;\n return { content: content.replace(block.full, newBlock) };\n }\n}\n\n/** Check if an export name is still referenced in the content (outside of import lines). */\nfunction isExportNameReferenced(content: string, exportName: string): boolean {\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n // Skip import lines\n if (/^import\\s+/.test(line)) continue;\n // Check if the export name appears as a word\n const wordPattern = new RegExp(`\\\\b${escapeRegex(exportName)}\\\\b`);\n if (wordPattern.test(line)) return true;\n }\n return false;\n}\n\n/** Remove an import line for a specific export from a specific path. */\nfunction removeImportLine(\n content: string,\n exportName: string,\n importPath: string,\n): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Single-line import: import { foo } from \"path\";\n // Also handles: import { foo, bar } from \"path\";\n const singleImportMatch = line.match(\n /^import\\s*\\{([^}]+)\\}\\s*from\\s*[\"'](.+?)[\"']\\s*;?\\s*$/,\n );\n\n if (singleImportMatch && singleImportMatch[2] === importPath) {\n const imports = singleImportMatch[1]\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s !== \"\");\n\n if (imports.length === 1 && imports[0] === exportName) {\n // Only import — remove the entire line\n // Also remove a following blank line if present\n if (i + 1 < lines.length && lines[i + 1].trim() === \"\") {\n i++; // skip blank line\n }\n continue;\n }\n\n // Multiple imports — remove just this one\n const remaining = imports.filter((s) => s !== exportName);\n result.push(\n `import { ${remaining.join(\", \")} } from \"${importPath}\";`,\n );\n continue;\n }\n\n // Multi-line import: spans multiple lines\n // Check if this starts a multi-line import for our path\n if (\n /^import\\s*\\{/.test(line) &&\n !line.includes(\"}\") &&\n content.includes(importPath)\n ) {\n // Collect all lines until closing }\n const importLines = [line];\n let j = i + 1;\n while (j < lines.length && !lines[j].includes(\"}\")) {\n importLines.push(lines[j]);\n j++;\n }\n if (j < lines.length) {\n importLines.push(lines[j]);\n }\n\n const fullImport = importLines.join(\"\\n\");\n if (fullImport.includes(importPath)) {\n // Extract all imported names\n const namesMatch = fullImport.match(/\\{([^}]+)\\}/);\n if (namesMatch) {\n const imports = namesMatch[1]\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s !== \"\");\n\n if (imports.length === 1 && imports[0] === exportName) {\n // Skip entire multi-line import\n i = j;\n // Also skip trailing blank line\n if (i + 1 < lines.length && lines[i + 1].trim() === \"\") {\n i++;\n }\n continue;\n }\n\n // Remove just this export from the multi-line import\n const remaining = imports.filter((s) => s !== exportName);\n if (remaining.length <= 2) {\n result.push(\n `import { ${remaining.join(\", \")} } from \"${importPath}\";`,\n );\n } else {\n result.push(`import {`);\n remaining.forEach((name, idx) => {\n result.push(\n ` ${name}${idx < remaining.length - 1 ? \",\" : \"\"}`,\n );\n });\n result.push(`} from \"${importPath}\";`);\n }\n i = j;\n continue;\n }\n }\n }\n\n result.push(line);\n }\n\n return result.join(\"\\n\");\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { basename } from \"path\";\nimport { readConfig } from \"../utils/config.js\";\nimport {\n resolveToolByName,\n resolveAgentByName,\n listTools,\n listAgents,\n} from \"../utils/component-resolver.js\";\nimport { linkToolToAgent } from \"../installers/agent-linker.js\";\nimport type { ToolRef } from \"../installers/agent-linker.js\";\n\nexport async function linkCommand(\n type?: string,\n name?: string,\n opts?: { to?: string; as?: string },\n) {\n p.intro(pc.bgCyan(pc.black(\" kitn link \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // --- Resolve type ---\n if (type && type !== \"tool\") {\n p.log.error(\n `Unsupported type \"${type}\". Only ${pc.bold(\"tool\")} is supported.`,\n );\n process.exit(1);\n }\n\n // --- Resolve tool ---\n let toolName = name;\n\n if (!toolName) {\n const tools = await listTools(config, cwd);\n if (tools.length === 0) {\n p.log.error(\"No tools found in your project.\");\n process.exit(1);\n }\n\n const selected = await p.select({\n message: \"Select a tool to link:\",\n options: tools.map((t) => ({\n value: t.name,\n label: t.name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n toolName = selected as string;\n }\n\n const tool = await resolveToolByName(toolName, config, cwd);\n if (!tool) {\n p.log.error(\n `Tool \"${toolName}\" not found. Check that the file exists in your tools directory.`,\n );\n process.exit(1);\n }\n\n // --- Resolve agent ---\n let agentName = opts?.to;\n\n if (!agentName) {\n const agents = await listAgents(config, cwd);\n if (agents.length === 0) {\n p.log.error(\"No agents found in your project.\");\n process.exit(1);\n }\n\n const selected = await p.select({\n message: \"Select an agent to link the tool to:\",\n options: agents.map((a) => ({\n value: a.name,\n label: a.name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n agentName = selected as string;\n }\n\n const agent = await resolveAgentByName(agentName, config, cwd);\n if (!agent) {\n p.log.error(\n `Agent \"${agentName}\" not found. Check that the file exists in your agents directory.`,\n );\n process.exit(1);\n }\n\n // --- Perform the link ---\n const agentContent = await readFile(agent.filePath, \"utf-8\");\n const toolRef: ToolRef = {\n exportName: tool.exportName,\n importPath: tool.importPath,\n };\n\n const result = linkToolToAgent(agentContent, toolRef, opts?.as);\n\n if (result.error) {\n p.log.warn(result.error);\n p.outro(\"Could not auto-link. Follow the manual instructions above.\");\n process.exit(1);\n }\n\n if (!result.changed) {\n p.log.info(\n `${pc.cyan(tool.exportName)} is already linked to ${pc.cyan(basename(agent.filePath))}.`,\n );\n p.outro(\"Nothing to do.\");\n return;\n }\n\n await writeFile(agent.filePath, result.content);\n\n p.log.success(\n `Linked ${pc.cyan(tool.exportName)} to ${pc.cyan(basename(agent.filePath))}`,\n );\n p.log.message(\n ` ${pc.green(\"+\")} import { ${tool.exportName} } from \"${tool.importPath}\"`,\n );\n p.log.message(\n ` ${pc.green(\"+\")} tools: { ${opts?.as ? `${opts.as}: ${tool.exportName}` : tool.exportName} }`,\n );\n\n p.outro(\"Done!\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { basename } from \"path\";\nimport { readConfig } from \"../utils/config.js\";\nimport {\n resolveToolByName,\n resolveAgentByName,\n listTools,\n listAgents,\n} from \"../utils/component-resolver.js\";\nimport { unlinkToolFromAgent } from \"../installers/agent-linker.js\";\nimport type { ToolRef } from \"../installers/agent-linker.js\";\n\nexport async function unlinkCommand(\n type?: string,\n name?: string,\n opts?: { from?: string },\n) {\n p.intro(pc.bgCyan(pc.black(\" kitn unlink \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // --- Resolve type ---\n if (type && type !== \"tool\") {\n p.log.error(\n `Unsupported type \"${type}\". Only ${pc.bold(\"tool\")} is supported.`,\n );\n process.exit(1);\n }\n\n // --- Resolve tool ---\n let toolName = name;\n\n if (!toolName) {\n const tools = await listTools(config, cwd);\n if (tools.length === 0) {\n p.log.error(\"No tools found in your project.\");\n process.exit(1);\n }\n\n const selected = await p.select({\n message: \"Select a tool to unlink:\",\n options: tools.map((t) => ({\n value: t.name,\n label: t.name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n toolName = selected as string;\n }\n\n const tool = await resolveToolByName(toolName, config, cwd);\n if (!tool) {\n p.log.error(\n `Tool \"${toolName}\" not found. Check that the file exists in your tools directory.`,\n );\n process.exit(1);\n }\n\n // --- Resolve agent ---\n let agentName = opts?.from;\n\n if (!agentName) {\n const agents = await listAgents(config, cwd);\n if (agents.length === 0) {\n p.log.error(\"No agents found in your project.\");\n process.exit(1);\n }\n\n const selected = await p.select({\n message: \"Select an agent to unlink the tool from:\",\n options: agents.map((a) => ({\n value: a.name,\n label: a.name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n agentName = selected as string;\n }\n\n const agent = await resolveAgentByName(agentName, config, cwd);\n if (!agent) {\n p.log.error(\n `Agent \"${agentName}\" not found. Check that the file exists in your agents directory.`,\n );\n process.exit(1);\n }\n\n // --- Perform the unlink ---\n const agentContent = await readFile(agent.filePath, \"utf-8\");\n const toolRef: ToolRef = {\n exportName: tool.exportName,\n importPath: tool.importPath,\n };\n\n const result = unlinkToolFromAgent(agentContent, toolRef);\n\n if (result.error) {\n p.log.warn(result.error);\n p.outro(\"Could not auto-unlink. Follow the manual instructions above.\");\n process.exit(1);\n }\n\n if (!result.changed) {\n p.log.info(\n `${pc.cyan(tool.exportName)} is not linked to ${pc.cyan(basename(agent.filePath))}.`,\n );\n p.outro(\"Nothing to do.\");\n return;\n }\n\n await writeFile(agent.filePath, result.content);\n\n p.log.success(\n `Unlinked ${pc.cyan(tool.exportName)} from ${pc.cyan(basename(agent.filePath))}`,\n );\n p.log.message(\n ` ${pc.red(\"-\")} import { ${tool.exportName} } from \"${tool.importPath}\"`,\n );\n p.log.message(\n ` ${pc.red(\"-\")} tools: { ${tool.exportName} }`,\n );\n\n p.outro(\"Done!\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, readLock } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { typeToDir } from \"../registry/schema.js\";\n\nexport async function infoCommand(component: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const ref = parseComponentRef(component);\n const fetcher = new RegistryFetcher(config.registries);\n\n const s = p.spinner();\n s.start(\"Fetching component info...\");\n\n // Fetch registry index to find the component and get available versions\n let index;\n try {\n index = await fetcher.fetchIndex(ref.namespace);\n } catch (err: any) {\n s.stop(pc.red(\"Failed to fetch registry\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n const indexItem = index.items.find((i) => i.name === ref.name);\n if (!indexItem) {\n s.stop(pc.red(\"Component not found\"));\n p.log.error(`Component '${ref.name}' not found in registry.`);\n process.exit(1);\n }\n\n // Fetch the full component JSON (specific version or latest)\n const dir = typeToDir[indexItem.type] as any;\n let item;\n try {\n item = await fetcher.fetchItem(ref.name, dir, ref.namespace, ref.version);\n } catch (err: any) {\n s.stop(pc.red(\"Failed to fetch component\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n s.stop(\"Component found\");\n\n // Display formatted output\n const version = item.version ?? indexItem.version ?? \"unknown\";\n const typeName = indexItem.type.replace(\"kitn:\", \"\");\n\n // Header: name, version, namespace\n console.log();\n console.log(\n ` ${pc.bold(item.name)} ${pc.cyan(`v${version}`)}${\" \".repeat(Math.max(1, 40 - item.name.length - version.length - 2))}${pc.dim(ref.namespace)}`\n );\n console.log(` ${pc.dim(item.description)}`);\n console.log();\n\n // Details\n console.log(` ${pc.dim(\"Type:\")} ${typeName}`);\n\n if (item.dependencies?.length) {\n console.log(\n ` ${pc.dim(\"Dependencies:\")} ${item.dependencies.join(\", \")}`\n );\n }\n\n if (item.registryDependencies?.length) {\n console.log(\n ` ${pc.dim(\"Registry deps:\")} ${item.registryDependencies.join(\", \")}`\n );\n }\n\n if (item.categories?.length) {\n console.log(\n ` ${pc.dim(\"Categories:\")} ${item.categories.join(\", \")}`\n );\n }\n\n if (item.updatedAt) {\n console.log(` ${pc.dim(\"Updated:\")} ${item.updatedAt}`);\n }\n\n // Available versions from index\n const versions = indexItem.versions;\n if (versions?.length) {\n console.log(` ${pc.dim(\"Versions:\")} ${versions.join(\", \")}`);\n }\n\n // Changelog\n if (item.changelog?.length) {\n console.log();\n console.log(` ${pc.bold(\"Changelog:\")}`);\n for (const entry of item.changelog) {\n const tag =\n entry.type === \"feature\"\n ? pc.green(entry.type)\n : entry.type === \"fix\"\n ? pc.yellow(entry.type)\n : entry.type === \"breaking\"\n ? pc.red(entry.type)\n : pc.dim(entry.type);\n console.log(\n ` ${pc.cyan(entry.version)} ${pc.dim(entry.date)} ${tag} ${entry.note}`\n );\n }\n }\n\n // Files\n console.log();\n const fileCount = item.files.length;\n console.log(` ${pc.bold(`Files:`)} ${pc.dim(`(${fileCount})`)}`);\n const maxShown = 10;\n for (const file of item.files.slice(0, maxShown)) {\n console.log(` ${pc.dim(file.path)}`);\n }\n if (fileCount > maxShown) {\n console.log(` ${pc.dim(`... and ${fileCount - maxShown} more`)}`);\n }\n\n // Installed status\n const lock = await readLock(cwd);\n const installed = lock[item.name];\n if (installed) {\n console.log();\n console.log(\n ` ${pc.green(\"Installed\")} ${pc.dim(`v${installed.version}`)}`\n );\n if (version !== installed.version) {\n console.log(\n ` ${pc.yellow(\"Update available:\")} ${pc.dim(`v${installed.version}`)} → ${pc.cyan(`v${version}`)}`\n );\n }\n }\n\n console.log();\n}\n","import { execSync } from \"child_process\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { detectCliInstaller, getGlobalInstallCommand } from \"../utils/detect.js\";\nimport { fetchLatestVersion, isNewer } from \"../utils/update-check.js\";\n\nexport async function checkCommand(currentVersion: string) {\n p.intro(pc.bgCyan(pc.black(\" kitn check \")));\n\n p.log.info(`kitn v${currentVersion}`);\n\n const s = p.spinner();\n s.start(\"Checking for updates...\");\n\n const latest = await fetchLatestVersion();\n\n if (!latest) {\n s.stop(pc.yellow(\"Could not reach the npm registry\"));\n p.outro(\"Try again later.\");\n return;\n }\n\n if (isNewer(latest, currentVersion)) {\n s.stop(pc.yellow(`Update available: ${currentVersion} → ${latest}`));\n\n const pm = detectCliInstaller();\n const installCmd = getGlobalInstallCommand(pm, \"@kitnai/cli\");\n\n const shouldUpdate = await p.confirm({ message: \"Update now?\" });\n\n if (p.isCancel(shouldUpdate) || !shouldUpdate) {\n p.log.message(` Run: ${pc.cyan(installCmd)}`);\n } else {\n const us = p.spinner();\n us.start(\"Updating...\");\n try {\n execSync(installCmd, { stdio: \"pipe\" });\n us.stop(pc.green(`Updated to v${latest}`));\n } catch {\n us.stop(pc.red(\"Update failed\"));\n p.log.message(` Run manually: ${pc.cyan(installCmd)}`);\n }\n }\n } else {\n s.stop(pc.green(\"You're on the latest version\"));\n }\n\n p.outro(\"\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, DEFAULT_REGISTRIES, DEFAULT_ALIASES } from \"../utils/config.js\";\nimport {\n fetchRulesConfig,\n generateRulesFiles,\n} from \"../installers/rules-generator.js\";\nimport type { KitnConfig } from \"../utils/config.js\";\n\nexport async function rulesCommand() {\n p.intro(pc.bgCyan(pc.black(\" kitn rules \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n\n // Use project aliases if kitn.json exists, otherwise defaults\n const registries = config?.registries ?? DEFAULT_REGISTRIES;\n const aliases = config?.aliases ?? DEFAULT_ALIASES;\n\n const rulesConfig = await fetchRulesConfig(registries);\n\n const selected = await p.multiselect({\n message: \"Which AI coding tools do you use?\",\n options: rulesConfig.tools.map((t) => ({\n value: t.id,\n label: t.name,\n hint: t.description,\n })),\n required: false,\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const selectedIds = selected as string[];\n\n if (selectedIds.length === 0) {\n p.log.warn(\"No tools selected. Nothing to generate.\");\n p.outro(\"Done.\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Generating rules files\");\n\n // Build a minimal config-like object for generateRulesFiles\n const effectiveConfig = { registries, aliases } as KitnConfig;\n\n const written = await generateRulesFiles(cwd, effectiveConfig, selectedIds);\n\n s.stop(\"Rules files generated\");\n\n for (const filePath of written) {\n p.log.success(`${pc.green(\"+\")} ${filePath}`);\n }\n\n p.outro(`Generated ${written.length} rules file${written.length === 1 ? \"\" : \"s\"}.`);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { existsSync } from \"fs\";\n\nconst CONFIG_DIR = join(homedir(), \".kitn\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n// Valid config keys - this is a whitelist\nconst VALID_KEYS = [\"chat-url\", \"api-key\"] as const;\ntype ConfigKey = (typeof VALID_KEYS)[number];\n\nexport async function readUserConfig(): Promise<Record<string, string>> {\n try {\n const raw = await readFile(CONFIG_FILE, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n\nasync function writeUserConfig(config: Record<string, string>): Promise<void> {\n if (!existsSync(CONFIG_DIR)) {\n await mkdir(CONFIG_DIR, { recursive: true });\n }\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\nexport async function configSetCommand(key: string, value: string): Promise<void> {\n if (!VALID_KEYS.includes(key as ConfigKey)) {\n p.log.error(`Unknown config key: ${pc.red(key)}`);\n p.log.info(`Valid keys: ${VALID_KEYS.join(\", \")}`);\n process.exit(1);\n }\n\n const config = await readUserConfig();\n config[key] = value;\n await writeUserConfig(config);\n\n // Mask api-key values in output\n const displayValue = key.includes(\"key\") ? value.slice(0, 8) + \"...\" : value;\n p.log.success(`Set ${pc.cyan(key)} = ${pc.green(displayValue)}`);\n}\n\nexport async function configGetCommand(key: string): Promise<void> {\n const config = await readUserConfig();\n const value = config[key];\n if (value === undefined) {\n p.log.warn(`${pc.cyan(key)} is not set`);\n } else {\n const displayValue = key.includes(\"key\") ? value.slice(0, 8) + \"...\" : value;\n p.log.info(`${pc.cyan(key)} = ${pc.green(displayValue)}`);\n }\n}\n\nexport async function configListCommand(): Promise<void> {\n const config = await readUserConfig();\n const entries = Object.entries(config);\n if (entries.length === 0) {\n p.log.info(\"No user configuration set.\");\n p.log.info(`Run ${pc.cyan(\"kitn config set <key> <value>\")} to configure.`);\n return;\n }\n for (const [key, value] of entries) {\n const displayValue = key.includes(\"key\") ? value.slice(0, 8) + \"...\" : value;\n p.log.info(`${pc.cyan(key)} = ${pc.green(displayValue)}`);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig, getRegistryUrl, readLock } from \"../utils/config.js\";\nimport type { RegistryEntry } from \"../utils/config.js\";\n\ninterface RegistryAddOptions {\n cwd?: string;\n overwrite?: boolean;\n homepage?: string;\n description?: string;\n}\n\ninterface RegistryRemoveOptions {\n cwd?: string;\n force?: boolean;\n}\n\ninterface RegistryListOptions {\n cwd?: string;\n}\n\nexport async function registryAddCommand(\n namespace: string,\n url: string,\n opts: RegistryAddOptions = {},\n) {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n if (!namespace.startsWith(\"@\")) {\n throw new Error(\"Namespace must start with @ (e.g. @myteam)\");\n }\n if (!url.includes(\"{type}\")) {\n throw new Error(\"URL template must include {type} placeholder\");\n }\n if (!url.includes(\"{name}\")) {\n throw new Error(\"URL template must include {name} placeholder\");\n }\n if (config.registries[namespace] && !opts.overwrite) {\n throw new Error(`Registry '${namespace}' is already configured. Use --overwrite to replace.`);\n }\n\n // Store as rich entry if homepage or description provided, otherwise plain URL\n if (opts.homepage || opts.description) {\n const entry: RegistryEntry = { url };\n if (opts.homepage) entry.homepage = opts.homepage;\n if (opts.description) entry.description = opts.description;\n config.registries[namespace] = entry;\n } else {\n config.registries[namespace] = url;\n }\n await writeConfig(cwd, config);\n\n p.log.success(`Added registry ${pc.bold(namespace)}`);\n p.log.message(pc.dim(` ${url}`));\n if (opts.homepage) p.log.message(pc.dim(` Homepage: ${opts.homepage}`));\n if (opts.description) p.log.message(pc.dim(` ${opts.description}`));\n}\n\nexport async function registryRemoveCommand(\n namespace: string,\n opts: RegistryRemoveOptions = {},\n): Promise<{ affectedComponents: string[] }> {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n if (!config.registries[namespace]) {\n throw new Error(`Registry '${namespace}' is not configured.`);\n }\n if (namespace === \"@kitn\" && !opts.force) {\n throw new Error(\"Cannot remove the default @kitn registry. Use --force to override.\");\n }\n\n const lock = await readLock(cwd);\n const affectedComponents: string[] = [];\n for (const [name, entry] of Object.entries(lock)) {\n if (entry.registry === namespace) {\n affectedComponents.push(name);\n }\n }\n\n delete config.registries[namespace];\n await writeConfig(cwd, config);\n\n p.log.success(`Removed registry ${pc.bold(namespace)}`);\n if (affectedComponents.length > 0) {\n p.log.warn(`${affectedComponents.length} installed component(s) referenced this registry:\\n` + affectedComponents.map((name) => ` ${pc.yellow(\"!\")} ${name}`).join(\"\\n\"));\n }\n\n return { affectedComponents };\n}\n\nexport async function registryListCommand(\n opts: RegistryListOptions = {},\n): Promise<Array<{ namespace: string; url: string; homepage?: string; description?: string }>> {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n const entries = Object.entries(config.registries).map(([namespace, value]) => {\n const url = getRegistryUrl(value);\n const homepage = typeof value === \"object\" ? value.homepage : undefined;\n const description = typeof value === \"object\" ? value.description : undefined;\n return { namespace, url, homepage, description };\n });\n\n if (entries.length === 0) {\n p.log.message(pc.dim(\" No registries configured.\"));\n } else {\n const lines: string[] = [];\n for (const { namespace, url, homepage, description } of entries) {\n lines.push(` ${pc.bold(namespace.padEnd(16))} ${pc.dim(url)}`);\n if (description) lines.push(` ${\" \".repeat(16)} ${description}`);\n if (homepage) lines.push(` ${\" \".repeat(16)} ${pc.dim(homepage)}`);\n }\n p.log.message(lines.join(\"\\n\"));\n }\n\n return entries;\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, readLock } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { readUserConfig } from \"./config.js\";\nimport type { ChatPlan, PlanStep } from \"./chat-types.js\";\n\nconst DEFAULT_SERVICE_URL = \"https://chat.kitn.dev\";\nconst GLOBAL_REGISTRY_URL = \"https://kitn-ai.github.io/registry/registries.json\";\n\ninterface GlobalDirectoryEntry {\n name: string;\n url: string;\n homepage?: string;\n description?: string;\n}\n\ninterface GlobalRegistryEntry {\n namespace: string;\n url: string;\n items: Array<{ name: string; type: string; description: string; registryDependencies?: string[] }>;\n}\n\n/**\n * Fetch the global registry directory and return indices for registries\n * not already configured in the user's kitn.json.\n */\nexport async function fetchGlobalRegistries(\n configuredNamespaces: string[],\n): Promise<GlobalRegistryEntry[]> {\n let directory: GlobalDirectoryEntry[];\n try {\n const res = await fetch(GLOBAL_REGISTRY_URL);\n if (!res.ok) return [];\n directory = await res.json();\n } catch {\n return [];\n }\n\n const unconfigured = directory.filter(\n (entry) => !configuredNamespaces.includes(entry.name),\n );\n\n if (unconfigured.length === 0) return [];\n\n const results: GlobalRegistryEntry[] = [];\n for (const entry of unconfigured) {\n try {\n const indexUrl = entry.url.replace(\"{type}/{name}.json\", \"registry.json\");\n const res = await fetch(indexUrl);\n if (!res.ok) continue;\n const index = await res.json();\n const items = (index.items ?? []).map((item: any) => ({\n name: item.name,\n type: item.type,\n description: item.description,\n registryDependencies: item.registryDependencies,\n }));\n results.push({ namespace: entry.name, url: entry.url, items });\n } catch {\n // Skip failing registries\n }\n }\n\n return results;\n}\n\n/**\n * Resolve the chat service URL.\n * Priority: urlOverride (--url flag) > KITN_CHAT_URL env > user config (~/.kitn/config.json) > project config (kitn.json chatService.url) > default\n */\nexport async function resolveServiceUrl(\n urlOverride?: string,\n chatServiceConfig?: { url?: string },\n): Promise<string> {\n if (urlOverride) return urlOverride;\n if (process.env.KITN_CHAT_URL) return process.env.KITN_CHAT_URL;\n\n // User-level config (~/.kitn/config.json)\n const userConfig = await readUserConfig();\n if (userConfig[\"chat-url\"]) return userConfig[\"chat-url\"];\n\n // Project-level config (kitn.json)\n if (chatServiceConfig?.url) return chatServiceConfig.url;\n\n return DEFAULT_SERVICE_URL;\n}\n\n/**\n * Build the request payload for the chat service.\n */\nexport function buildRequestPayload(message: string, metadata: Record<string, unknown>) {\n return { message, metadata };\n}\n\n/**\n * Format a ChatPlan for display using picocolors.\n */\nexport function formatPlan(plan: ChatPlan): string {\n const lines: string[] = [plan.summary, \"\"];\n\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const num = `${i + 1}.`;\n const label = formatStepLabel(step);\n lines.push(`${num} ${label} - ${step.reason}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatStepLabel(step: PlanStep): string {\n switch (step.action) {\n case \"add\":\n return `Add ${pc.cyan(step.component!)}`;\n case \"remove\":\n return `Remove ${pc.red(step.component!)}`;\n case \"create\":\n return `Create ${pc.green(step.name!)} ${pc.dim(`(${step.type})`)}`;\n case \"link\":\n return `Link ${pc.cyan(step.toolName!)} → ${pc.cyan(step.agentName!)}`;\n case \"unlink\":\n return `Unlink ${pc.red(step.toolName!)} from ${pc.cyan(step.agentName!)}`;\n case \"registry-add\":\n return `Add registry ${pc.magenta(step.namespace!)}`;\n }\n}\n\nexport async function chatCommand(message: string | undefined, opts?: { url?: string }): Promise<void> {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n if (!message) {\n p.log.error(\"Please provide a message. Usage: kitn chat \\\"add a weather tool\\\"\");\n process.exit(1);\n }\n\n p.intro(pc.bold(\"kitn assistant\"));\n\n // --- Gather context ---\n const s = p.spinner();\n s.start(\"Gathering project context...\");\n\n let registryIndex: unknown;\n let installed: string[];\n let globalRegistryIndex: GlobalRegistryEntry[] | undefined;\n\n try {\n const configuredNamespaces = Object.keys(config.registries);\n const fetcher = new RegistryFetcher(config.registries);\n\n // Fetch configured registries and global directory in parallel\n const [indices, globalEntries, lock] = await Promise.all([\n Promise.all(\n configuredNamespaces.map(async (ns) => {\n try {\n return await fetcher.fetchIndex(ns);\n } catch {\n return null;\n }\n }),\n ),\n fetchGlobalRegistries(configuredNamespaces),\n readLock(cwd),\n ]);\n\n // Flatten registry indices into a flat list of items for the service\n registryIndex = indices\n .filter(Boolean)\n .flatMap((index: any) => (index.items ?? []).map((item: any) => ({\n name: item.name,\n type: item.type,\n description: item.description,\n registryDependencies: item.registryDependencies,\n })));\n installed = Object.keys(lock);\n globalRegistryIndex = globalEntries.length > 0 ? globalEntries : undefined;\n } catch {\n s.stop(pc.red(\"Failed to gather context\"));\n p.log.error(\"Could not read project context. Check your kitn.json and network connection.\");\n process.exit(1);\n }\n\n s.stop(\"Context gathered\");\n\n // --- Call service ---\n s.start(\"Thinking...\");\n\n const serviceUrl = await resolveServiceUrl(opts?.url, config.chatService);\n const metadata: Record<string, unknown> = { registryIndex, installed };\n if (globalRegistryIndex) metadata.globalRegistryIndex = globalRegistryIndex;\n const payload = buildRequestPayload(message, metadata);\n\n let response: Response;\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (process.env.KITN_API_KEY) {\n headers[\"Authorization\"] = `Bearer ${process.env.KITN_API_KEY}`;\n }\n\n response = await fetch(`${serviceUrl}/api/chat`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n });\n } catch (err: any) {\n s.stop(pc.red(\"Connection failed\"));\n p.log.error(`Could not reach chat service at ${serviceUrl}. ${err.message ?? \"\"}`);\n process.exit(1);\n }\n\n if (!response.ok) {\n s.stop(pc.red(\"Request failed\"));\n p.log.error(`Chat service returned ${response.status}: ${response.statusText}`);\n process.exit(1);\n }\n\n let data: { rejected?: boolean; text?: string; plan?: ChatPlan };\n try {\n data = await response.json();\n } catch {\n s.stop(pc.red(\"Invalid response\"));\n p.log.error(\"Chat service returned an invalid response.\");\n process.exit(1);\n }\n\n s.stop(\"Done\");\n\n // --- Handle response ---\n if (data.rejected) {\n p.log.warn(data.text ?? \"Request was rejected by the assistant.\");\n p.outro(\"Try rephrasing your request.\");\n return;\n }\n\n if (!data.plan) {\n p.log.info(data.text ?? \"No actionable plan returned.\");\n p.outro(\"Nothing to do.\");\n return;\n }\n\n // Render plan\n p.log.message(formatPlan(data.plan));\n\n // --- Confirm ---\n const steps = data.plan.steps;\n let selectedSteps: PlanStep[];\n\n if (steps.length === 1) {\n const confirm = await p.confirm({\n message: `Run: ${formatStepLabel(steps[0])}?`,\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel(\"Cancelled.\");\n return;\n }\n\n selectedSteps = steps;\n } else {\n const action = await p.select({\n message: \"How would you like to proceed?\",\n options: [\n { value: \"all\", label: \"Yes, run all steps\" },\n { value: \"select\", label: \"Select which steps to run\" },\n { value: \"cancel\", label: \"Cancel\" },\n ],\n });\n\n if (p.isCancel(action) || action === \"cancel\") {\n p.cancel(\"Cancelled.\");\n return;\n }\n\n if (action === \"select\") {\n const choices = await p.multiselect({\n message: \"Select steps to run:\",\n options: steps.map((step, i) => ({\n value: i,\n label: `${formatStepLabel(step)} - ${step.reason}`,\n })),\n });\n\n if (p.isCancel(choices)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n\n selectedSteps = (choices as number[]).map((i) => steps[i]);\n } else {\n selectedSteps = steps;\n }\n }\n\n // --- Execute plan ---\n for (const step of selectedSteps) {\n s.start(`Running: ${formatStepLabel(step)}...`);\n\n try {\n switch (step.action) {\n case \"registry-add\": {\n const { registryAddCommand } = await import(\"./registry.js\");\n await registryAddCommand(step.namespace!, step.url!, { overwrite: true });\n break;\n }\n case \"add\": {\n const { addCommand } = await import(\"./add.js\");\n await addCommand([step.component!], { yes: true });\n break;\n }\n case \"create\": {\n const { createCommand } = await import(\"./create.js\");\n await createCommand(step.type!, step.name!);\n break;\n }\n case \"link\": {\n const { linkCommand } = await import(\"./link.js\");\n await linkCommand(\"tool\", step.toolName, { to: step.agentName });\n break;\n }\n case \"remove\": {\n const { removeCommand } = await import(\"./remove.js\");\n await removeCommand(step.component);\n break;\n }\n case \"unlink\": {\n const { unlinkCommand } = await import(\"./unlink.js\");\n await unlinkCommand(\"tool\", step.toolName, { from: step.agentName });\n break;\n }\n }\n s.stop(pc.green(`Done: ${formatStepLabel(step)}`));\n } catch (err: any) {\n s.stop(pc.red(`Failed: ${formatStepLabel(step)}`));\n p.log.error(err.message ?? \"Unknown error\");\n }\n }\n\n p.outro(pc.green(\"All done! Run your dev server to test the new components.\"));\n}\n","import { Command } from \"commander\";\nimport { startUpdateCheck } from \"./utils/update-check.js\";\n\ndeclare const __CLI_VERSION__: string;\nconst VERSION = typeof __CLI_VERSION__ !== \"undefined\" ? __CLI_VERSION__ : \"0.0.0-dev\";\n\nconst printUpdateNotice = startUpdateCheck(VERSION);\n\nconst program = new Command()\n .name(\"kitn\")\n .description(\"Install AI agent components from the kitn registry\")\n .version(VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Initialize kitn in your project\")\n .option(\"-r, --runtime <runtime>\", \"runtime to use (bun, node, deno)\")\n .option(\"-f, --framework <framework>\", \"HTTP framework (hono, hono-openapi, elysia)\")\n .option(\"-b, --base <path>\", \"base directory for components (default: src/ai)\")\n .option(\"-y, --yes\", \"accept all defaults without prompting\")\n .action(async (opts) => {\n const { initCommand } = await import(\"./commands/init.js\");\n await initCommand(opts);\n });\n\nprogram\n .command(\"add\")\n .alias(\"install\")\n .description(\"Add components from the registry (supports type-first: kitn add agent <name>)\")\n .argument(\"[components...]\", \"component names or type followed by names\")\n .option(\"-o, --overwrite\", \"overwrite existing files without prompting\")\n .option(\"-t, --type <type>\", \"filter by component type during resolution\")\n .option(\"-y, --yes\", \"skip confirmation prompt\")\n .action(async (components: string[], opts) => {\n const { addCommand } = await import(\"./commands/add.js\");\n await addCommand(components, opts);\n });\n\nprogram\n .command(\"list\")\n .argument(\"[type]\", \"filter by type (agents, tools, skills, storages, packages)\")\n .description(\"List available and installed components\")\n .option(\"-i, --installed\", \"only show installed components\")\n .option(\"-t, --type <type>\", \"filter by type (agent, tool, skill, storage, package)\")\n .option(\"-r, --registry <namespace>\", \"only show components from this registry\")\n .option(\"-v, --verbose\", \"show version numbers\")\n .action(async (type, opts) => {\n const { listCommand } = await import(\"./commands/list.js\");\n await listCommand(type, opts);\n });\n\nprogram\n .command(\"diff\")\n .description(\"Show differences between local and registry version\")\n .argument(\"<component>\", \"component name\")\n .action(async (component: string) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand(component);\n });\n\nprogram\n .command(\"remove\")\n .alias(\"uninstall\")\n .description(\"Remove an installed component\")\n .argument(\"[component]\", \"component name to remove (interactive if omitted)\")\n .action(async (component?: string) => {\n const { removeCommand } = await import(\"./commands/remove.js\");\n await removeCommand(component);\n });\n\nprogram\n .command(\"update\")\n .description(\"Update installed components to latest registry version\")\n .argument(\"[components...]\", \"component names to update\")\n .action(async (components: string[]) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand(components);\n });\n\nprogram\n .command(\"create\")\n .description(\"Scaffold a new kitn component\")\n .argument(\"<type>\", \"component type (agent, tool, skill, storage)\")\n .argument(\"<name>\", \"component name\")\n .action(async (type: string, name: string) => {\n const { createCommand } = await import(\"./commands/create.js\");\n await createCommand(type, name);\n });\n\nprogram\n .command(\"link\")\n .description(\"Wire a tool to an agent\")\n .argument(\"[type]\", \"component type (tool)\")\n .argument(\"[name]\", \"component name\")\n .option(\"--to <agent>\", \"target agent name\")\n .option(\"--as <key>\", \"key name in the tools object\")\n .action(async (type: string | undefined, name: string | undefined, opts) => {\n const { linkCommand } = await import(\"./commands/link.js\");\n await linkCommand(type, name, opts);\n });\n\nprogram\n .command(\"unlink\")\n .description(\"Unwire a tool from an agent\")\n .argument(\"[type]\", \"component type (tool)\")\n .argument(\"[name]\", \"component name\")\n .option(\"--from <agent>\", \"target agent name\")\n .action(async (type: string | undefined, name: string | undefined, opts) => {\n const { unlinkCommand } = await import(\"./commands/unlink.js\");\n await unlinkCommand(type, name, opts);\n });\n\nprogram\n .command(\"info\")\n .description(\"Show details about a component\")\n .argument(\"<component>\", \"component name (e.g. weather-agent, @acme/tool@1.0.0)\")\n .action(async (component: string) => {\n const { infoCommand } = await import(\"./commands/info.js\");\n await infoCommand(component);\n });\n\nprogram\n .command(\"check\")\n .description(\"Check for CLI updates\")\n .action(async () => {\n const { checkCommand } = await import(\"./commands/check.js\");\n await checkCommand(VERSION);\n });\n\nprogram\n .command(\"rules\")\n .description(\"Regenerate AI coding tool rules files\")\n .action(async () => {\n const { rulesCommand } = await import(\"./commands/rules.js\");\n await rulesCommand();\n });\n\nprogram\n .command(\"chat\")\n .description(\"AI-powered scaffolding assistant — describe what you need in plain English\")\n .argument(\"<message>\", \"what you want to build (e.g. \\\"I want a weather agent\\\")\")\n .option(\"-u, --url <url>\", \"chat service URL (overrides config and default)\")\n .action(async (message: string, opts: { url?: string }) => {\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand(message, opts);\n });\n\nconst registry = program\n .command(\"registry\")\n .description(\"Manage component registries\");\n\nregistry\n .command(\"add\")\n .description(\"Add a component registry\")\n .argument(\"<namespace>\", \"registry namespace (e.g. @myteam)\")\n .argument(\"<url>\", \"URL template with {type} and {name} placeholders\")\n .option(\"-o, --overwrite\", \"overwrite if namespace already exists\")\n .option(\"--homepage <url>\", \"registry homepage URL\")\n .option(\"--description <text>\", \"short description of the registry\")\n .action(async (namespace: string, url: string, opts) => {\n const { registryAddCommand } = await import(\"./commands/registry.js\");\n await registryAddCommand(namespace, url, opts);\n });\n\nregistry\n .command(\"remove\")\n .description(\"Remove a component registry\")\n .argument(\"<namespace>\", \"registry namespace to remove (e.g. @myteam)\")\n .option(\"-f, --force\", \"allow removing the default @kitn registry\")\n .action(async (namespace: string, opts) => {\n const { registryRemoveCommand } = await import(\"./commands/registry.js\");\n await registryRemoveCommand(namespace, opts);\n });\n\nregistry\n .command(\"list\")\n .description(\"List all configured registries\")\n .action(async () => {\n const { registryListCommand } = await import(\"./commands/registry.js\");\n await registryListCommand();\n });\n\nconst config = program\n .command(\"config\")\n .description(\"Manage user-level configuration\");\n\nconfig\n .command(\"set\")\n .description(\"Set a config value\")\n .argument(\"<key>\", \"config key (chat-url, api-key)\")\n .argument(\"<value>\", \"config value\")\n .action(async (key: string, value: string) => {\n const { configSetCommand } = await import(\"./commands/config.js\");\n await configSetCommand(key, value);\n });\n\nconfig\n .command(\"get\")\n .description(\"Get a config value\")\n .argument(\"<key>\", \"config key\")\n .action(async (key: string) => {\n const { configGetCommand } = await import(\"./commands/config.js\");\n await configGetCommand(key);\n });\n\nconfig\n .command(\"list\")\n .description(\"List all config values\")\n .action(async () => {\n const { configListCommand } = await import(\"./commands/config.js\");\n await configListCommand();\n });\n\nawait program.parseAsync();\n// Skip the deferred update notice if `kitn check` already handled it\nconst ranCommand = program.args[0];\nif (ranCommand !== \"check\") {\n printUpdateNotice();\n}\n"],"mappings":"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","names":["join","readFile","writeFile","join","config","readFile","writeFile","join","text","config","readFile","writeFile","mkdir","access","pc","readFile","writeFile","access","join","config","join","z","componentType","p","pc","join","dirname","readFile","writeFile","mkdir","unlink","relative","config","fetcher","s","baseDir","barrelPath","barrelDir","updated","confirm","writeFile","mkdir","readFile","join","dirname","config","p","pc","mkdir","readFile","writeFile","join","confirm","config","p","pc","config","p","join","config","p","pc","join","relative","dirname","unlink","readFile","writeFile","existsSync","config","entry","p","config","p","pc","join","relative","existsSync","readFile","writeFile","mkdir","config","readFile","join","relative","config","filePath","source","exportName","agentName","newBlock","p","pc","readFile","writeFile","config","p","pc","readFile","writeFile","basename","config","p","pc","config","execSync","p","pc","p","pc","config","p","pc","readFile","writeFile","mkdir","join","homedir","existsSync","CONFIG_FILE","config","init_config","p","pc","config","p","pc","config","confirm","registryAddCommand","addCommand","createCommand","linkCommand","removeCommand","unlinkCommand","init_config","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand","createCommand","linkCommand","unlinkCommand","infoCommand","checkCommand","rulesCommand","chatCommand","registryAddCommand","registryRemoveCommand","registryListCommand","configSetCommand","configGetCommand","configListCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/detect.ts","../src/utils/update-check.ts","../src/utils/config.ts","../src/installers/tsconfig-patcher.ts","../src/installers/barrel-manager.ts","../src/registry/fetcher.ts","../src/registry/resolver.ts","../src/installers/file-writer.ts","../src/installers/dep-installer.ts","../src/installers/env-writer.ts","../src/installers/import-rewriter.ts","../src/utils/hash.ts","../src/utils/parse-ref.ts","../src/utils/type-aliases.ts","../src/registry/schema.ts","../src/commands/add.ts","../src/installers/rules-generator.ts","../src/commands/init.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/utils/naming.ts","../src/commands/create.ts","../src/utils/component-resolver.ts","../src/installers/agent-linker.ts","../src/commands/link.ts","../src/commands/unlink.ts","../src/commands/info.ts","../src/commands/check.ts","../src/commands/rules.ts","../src/commands/config.ts","../src/commands/registry.ts","../src/commands/chat.ts","../src/index.ts"],"sourcesContent":["import { access } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport type PackageManager = \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\nconst LOCKFILE_MAP: [string, PackageManager][] = [\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"],\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n];\n\nexport async function detectPackageManager(dir: string): Promise<PackageManager | null> {\n for (const [lockfile, pm] of LOCKFILE_MAP) {\n try {\n await access(join(dir, lockfile));\n return pm;\n } catch {\n // lockfile doesn't exist, try next\n }\n }\n return null;\n}\n\nexport function getInstallCommand(pm: PackageManager, packages: string[]): string {\n const pkgs = packages.join(\" \");\n switch (pm) {\n case \"bun\":\n return `bun add ${pkgs}`;\n case \"pnpm\":\n return `pnpm add ${pkgs}`;\n case \"yarn\":\n return `yarn add ${pkgs}`;\n case \"npm\":\n return `npm install ${pkgs}`;\n }\n}\n\nexport function getRunCommand(pm: PackageManager): string {\n switch (pm) {\n case \"bun\":\n return \"bunx\";\n case \"pnpm\":\n return \"pnpm dlx\";\n case \"yarn\":\n return \"yarn dlx\";\n case \"npm\":\n return \"npx\";\n }\n}\n\n/**\n * Detects which package manager was used to invoke the CLI globally.\n * Checks npm_config_user_agent first, falls back to process.env._, defaults to npm.\n */\nexport function detectCliInstaller(): PackageManager {\n const userAgent = process.env.npm_config_user_agent ?? \"\";\n if (userAgent.startsWith(\"bun/\")) return \"bun\";\n if (userAgent.startsWith(\"pnpm/\")) return \"pnpm\";\n if (userAgent.startsWith(\"yarn/\")) return \"yarn\";\n if (userAgent.startsWith(\"npm/\")) return \"npm\";\n\n const invoker = process.env._ ?? \"\";\n if (invoker.includes(\"bun\")) return \"bun\";\n if (invoker.includes(\"pnpm\")) return \"pnpm\";\n if (invoker.includes(\"yarn\")) return \"yarn\";\n\n return \"npm\";\n}\n\nexport function getGlobalInstallCommand(pm: PackageManager, pkg: string): string {\n switch (pm) {\n case \"bun\":\n return `bun install -g ${pkg}`;\n case \"pnpm\":\n return `pnpm add -g ${pkg}`;\n case \"yarn\":\n return `yarn global add ${pkg}`;\n case \"npm\":\n return `npm install -g ${pkg}`;\n }\n}\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport pc from \"picocolors\";\nimport { detectCliInstaller, getRunCommand, getGlobalInstallCommand } from \"./detect.js\";\n\nconst CACHE_DIR = join(homedir(), \".kitn\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst CHECK_INTERVAL = 60 * 60 * 1000; // 1 hour\n\ninterface CacheEntry {\n latest: string;\n checkedAt: number;\n}\n\nasync function readCache(): Promise<CacheEntry | null> {\n try {\n const raw = await readFile(CACHE_FILE, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nasync function writeCache(entry: CacheEntry): Promise<void> {\n try {\n await mkdir(CACHE_DIR, { recursive: true });\n await writeFile(CACHE_FILE, JSON.stringify(entry));\n } catch {\n // Silently ignore cache write failures\n }\n}\n\nexport async function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(\"https://registry.npmjs.org/@kitnai/cli/latest\", {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nexport function isNewer(latest: string, current: string): boolean {\n const [lMaj, lMin, lPat] = latest.split(\".\").map(Number);\n const [cMaj, cMin, cPat] = current.split(\".\").map(Number);\n if (lMaj !== cMaj) return lMaj > cMaj;\n if (lMin !== cMin) return lMin > cMin;\n return lPat > cPat;\n}\n\n/**\n * Starts a non-blocking update check. Returns a function that,\n * when called, prints the update notice if a newer version was found.\n */\nexport function startUpdateCheck(currentVersion: string): () => void {\n let message = \"\";\n\n // Fire-and-forget: don't block CLI startup\n const check = (async () => {\n const cache = await readCache();\n let latest: string | null = null;\n\n if (cache && Date.now() - cache.checkedAt < CHECK_INTERVAL) {\n latest = cache.latest;\n } else {\n latest = await fetchLatestVersion();\n if (latest) {\n await writeCache({ latest, checkedAt: Date.now() });\n }\n }\n\n if (latest && isNewer(latest, currentVersion)) {\n const pm = detectCliInstaller();\n const runCmd = `${getRunCommand(pm)} @kitnai/cli@latest`;\n const installCmd = getGlobalInstallCommand(pm, \"@kitnai/cli\");\n message = [\n \"\",\n pc.yellow(` Update available: ${pc.dim(currentVersion)} → ${pc.green(latest)}`),\n pc.dim(` Run ${pc.cyan(runCmd)} or ${pc.cyan(installCmd)}`),\n \"\",\n ].join(\"\\n\");\n }\n })();\n\n // Suppress unhandled rejection from the fire-and-forget promise\n check.catch(() => {});\n\n return () => {\n if (message) process.stderr.write(message);\n };\n}\n","import { readFile, writeFile, unlink } from \"fs/promises\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\n\nconst componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\", \"kitn:cron\"]);\ntype ComponentType = z.infer<typeof componentType>;\n\nconst installedComponentSchema = z.object({\n registry: z.string().optional(),\n type: componentType.optional(),\n slot: z.string().optional(),\n version: z.string(),\n installedAt: z.string(),\n files: z.array(z.string()),\n hash: z.string(),\n registryDependencies: z.array(z.string()).optional(),\n});\n\nconst registryEntrySchema = z.object({\n url: z.string(),\n homepage: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport type RegistryEntry = z.infer<typeof registryEntrySchema>;\n\n// Registries can be a plain URL string (backward compat) or a rich entry object\nconst registryValueSchema = z.union([z.string(), registryEntrySchema]);\n\nexport const DEFAULT_REGISTRY_URL = \"https://kitn-ai.github.io/kitn/r/{type}/{name}.json\";\n\nexport const DEFAULT_REGISTRIES: Record<string, z.infer<typeof registryValueSchema>> = {\n \"@kitn\": {\n url: DEFAULT_REGISTRY_URL,\n homepage: \"https://kitn.ai\",\n description: \"Official kitn AI agent components\",\n },\n};\n\nexport const DEFAULT_ALIASES = {\n base: \"src/ai\",\n agents: \"src/ai/agents\",\n tools: \"src/ai/tools\",\n skills: \"src/ai/skills\",\n storage: \"src/ai/storage\",\n crons: \"src/ai/crons\",\n} as const;\n\nexport const configSchema = z.object({\n $schema: z.string().optional(),\n runtime: z.enum([\"bun\", \"node\", \"deno\"]),\n framework: z.enum([\"hono\", \"hono-openapi\", \"cloudflare\", \"elysia\", \"fastify\", \"express\"]).optional(),\n aliases: z.object({\n base: z.string().optional(),\n agents: z.string(),\n tools: z.string(),\n skills: z.string(),\n storage: z.string(),\n crons: z.string().optional(),\n }),\n registries: z.record(z.string(), registryValueSchema),\n chatService: z.object({\n url: z.string().optional(),\n }).optional(),\n});\n\nexport type KitnConfig = z.infer<typeof configSchema>;\n\n/** Extract the URL from a registry entry (string or object). */\nexport function getRegistryUrl(entry: string | RegistryEntry): string {\n return typeof entry === \"string\" ? entry : entry.url;\n}\n\nconst FRAMEWORK_TO_ADAPTER: Record<string, string> = {\n hono: \"hono\",\n \"hono-openapi\": \"hono-openapi\",\n elysia: \"elysia\",\n};\n\nexport function resolveRoutesAlias(config: KitnConfig): string {\n const fw = config.framework ?? \"hono\";\n return FRAMEWORK_TO_ADAPTER[fw] ?? fw;\n}\n\nconst CONFIG_FILE = \"kitn.json\";\nconst LOCK_FILE = \"kitn.lock\";\n\nexport async function readConfig(projectDir: string): Promise<KitnConfig | null> {\n try {\n const raw = await readFile(join(projectDir, CONFIG_FILE), \"utf-8\");\n return configSchema.parse(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n\nexport async function writeConfig(projectDir: string, config: KitnConfig): Promise<void> {\n const data = { $schema: \"https://kitn.dev/schema/config.json\", ...config };\n await writeFile(join(projectDir, CONFIG_FILE), JSON.stringify(data, null, 2) + \"\\n\");\n}\n\n// --- Lock file (installed component tracking) ---\n\nexport const lockSchema = z.record(z.string(), installedComponentSchema);\nexport type LockFile = z.infer<typeof lockSchema>;\n\nexport async function readLock(projectDir: string): Promise<LockFile> {\n try {\n const raw = await readFile(join(projectDir, LOCK_FILE), \"utf-8\");\n return lockSchema.parse(JSON.parse(raw));\n } catch {\n return {};\n }\n}\n\nexport async function writeLock(projectDir: string, lock: LockFile): Promise<void> {\n if (Object.keys(lock).length === 0) {\n try {\n await unlink(join(projectDir, LOCK_FILE));\n } catch {\n // File doesn't exist — nothing to delete\n }\n return;\n }\n await writeFile(join(projectDir, LOCK_FILE), JSON.stringify(lock, null, 2) + \"\\n\");\n}\n\ntype RequiredAliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"crons\";\n\nconst typeToAliasKey: Record<Exclude<ComponentType, \"kitn:package\">, RequiredAliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n \"kitn:cron\": \"crons\",\n};\n\ntype SingleFileComponentType = Exclude<ComponentType, \"kitn:package\">;\n\nexport function getInstallPath(\n config: KitnConfig,\n type: SingleFileComponentType,\n fileName: string,\n namespace?: string,\n): string {\n const aliasKey = typeToAliasKey[type];\n const baseAlias = config.aliases.base ?? \"src/ai\";\n const base = config.aliases[aliasKey] ?? join(baseAlias, aliasKey);\n if (namespace && namespace !== \"@kitn\") {\n const nsDir = namespace.replace(\"@\", \"\");\n return join(base, nsDir, fileName);\n }\n return join(base, fileName);\n}\n","import { readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\n\n/**\n * Strip single-line (//) and multi-line comments from JSONC,\n * and remove trailing commas before } or ], so JSON.parse succeeds.\n */\nfunction stripJsonc(text: string): string {\n return text\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/,\\s*([}\\]])/g, \"$1\");\n}\n\n/**\n * Patches a tsconfig JSON string with additional paths entries.\n * If removePrefixes is provided, any existing path keys starting with\n * those prefixes are deleted first (useful for cleaning up old aliases).\n * Returns the updated JSON string.\n */\nexport function patchTsconfig(\n tsconfigContent: string,\n paths: Record<string, string[]>,\n removePrefixes?: string[],\n): string {\n const config = JSON.parse(stripJsonc(tsconfigContent));\n\n if (!config.compilerOptions) {\n config.compilerOptions = {};\n }\n if (!config.compilerOptions.paths) {\n config.compilerOptions.paths = {};\n }\n\n if (removePrefixes) {\n for (const key of Object.keys(config.compilerOptions.paths)) {\n if (removePrefixes.some((prefix) => key.startsWith(prefix))) {\n delete config.compilerOptions.paths[key];\n }\n }\n }\n\n for (const [key, value] of Object.entries(paths)) {\n config.compilerOptions.paths[key] = value;\n }\n\n // Ensure minimum compiler options for kitn compatibility.\n // target ES2022+: our code uses Set/Map iteration\n // moduleResolution \"bundler\": resolves node_modules packages and path aliases\n // skipLibCheck: avoids noise from third-party .d.ts files\n const ES_TARGETS = [\"es3\", \"es5\", \"es6\", \"es2015\", \"es2016\", \"es2017\", \"es2018\", \"es2019\", \"es2020\", \"es2021\"];\n const currentTarget = (config.compilerOptions.target ?? \"\").toLowerCase();\n if (!currentTarget || ES_TARGETS.includes(currentTarget)) {\n config.compilerOptions.target = \"ES2022\";\n }\n if (!config.compilerOptions.moduleResolution) {\n config.compilerOptions.moduleResolution = \"bundler\";\n }\n if (!config.compilerOptions.module) {\n config.compilerOptions.module = \"ESNext\";\n }\n if (config.compilerOptions.skipLibCheck === undefined) {\n config.compilerOptions.skipLibCheck = true;\n }\n\n return JSON.stringify(config, null, 2) + \"\\n\";\n}\n\n/**\n * Reads tsconfig.json from projectDir, patches paths, and writes it back.\n * If no tsconfig.json exists, creates one with just the paths.\n */\nexport async function patchProjectTsconfig(\n projectDir: string,\n paths: Record<string, string[]>,\n removePrefixes?: string[],\n): Promise<void> {\n const tsconfigPath = join(projectDir, \"tsconfig.json\");\n let content: string;\n try {\n content = await readFile(tsconfigPath, \"utf-8\");\n } catch {\n content = \"{}\";\n }\n\n const patched = patchTsconfig(content, paths, removePrefixes);\n await writeFile(tsconfigPath, patched);\n}\n","const EXPORT_LINE = 'export { registerWithPlugin } from \"@kitn/core\";';\nconst BARREL_COMMENT = \"// Managed by kitn CLI — components auto-imported below\";\n\nexport function createBarrelFile(): string {\n return `${BARREL_COMMENT}\\n${EXPORT_LINE}\\n`;\n}\n\nexport function addImportToBarrel(content: string, importPath: string): string {\n const importLine = `import \"${importPath}\";`;\n\n // Idempotent — skip if already present\n if (content.includes(importLine)) return content;\n\n // Insert before the export line\n const exportIndex = content.indexOf(EXPORT_LINE);\n if (exportIndex === -1) {\n // No export line found — append both\n return `${content.trimEnd()}\\n${importLine}\\n${EXPORT_LINE}\\n`;\n }\n\n const before = content.slice(0, exportIndex);\n const after = content.slice(exportIndex);\n return `${before}${importLine}\\n${after}`;\n}\n\nexport function removeImportFromBarrel(\n content: string,\n importPath: string,\n): string {\n const importLine = `import \"${importPath}\";`;\n return content\n .split(\"\\n\")\n .filter((line) => line.trim() !== importLine)\n .join(\"\\n\");\n}\n\nexport function parseBarrelFile(content: string): string[] {\n const imports: string[] = [];\n for (const line of content.split(\"\\n\")) {\n const match = line.match(/^import\\s+[\"'](.+)[\"'];?\\s*$/);\n if (match) imports.push(match[1]);\n }\n return imports;\n}\n","import type { RegistryItem, RegistryIndex } from \"./schema.js\";\nimport type { RegistryEntry } from \"../utils/config.js\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"package\" | \"crons\";\ntype FetchFn = (url: string) => Promise<RegistryItem>;\ntype RegistryValue = string | RegistryEntry;\n\nfunction urlOf(entry: RegistryValue): string {\n return typeof entry === \"string\" ? entry : entry.url;\n}\n\nexport class RegistryFetcher {\n private registries: Record<string, RegistryValue>;\n private cache = new Map<string, Promise<RegistryItem>>();\n private fetchFn: FetchFn;\n\n constructor(registries: Record<string, RegistryValue>, fetchFn?: FetchFn) {\n this.registries = registries;\n this.fetchFn = fetchFn ?? this.defaultFetch;\n }\n\n resolveUrl(name: string, typeDir: TypeDir, namespace = \"@kitn\", version?: string): string {\n const entry = this.registries[namespace];\n if (!entry) throw new Error(`No registry configured for ${namespace}`);\n const template = urlOf(entry);\n const fileName = version ? `${name}@${version}` : name;\n return template.replace(\"{name}\", fileName).replace(\"{type}\", typeDir);\n }\n\n async fetchItem(name: string, typeDir: TypeDir, namespace = \"@kitn\", version?: string): Promise<RegistryItem> {\n const url = this.resolveUrl(name, typeDir, namespace, version);\n if (!this.cache.has(url)) {\n this.cache.set(url, this.fetchFn(url));\n }\n return this.cache.get(url)!;\n }\n\n async fetchIndex(namespace = \"@kitn\"): Promise<RegistryIndex> {\n const entry = this.registries[namespace];\n if (!entry) throw new Error(`No registry configured for ${namespace}`);\n const template = urlOf(entry);\n const baseUrl = template.replace(\"{type}/{name}.json\", \"registry.json\");\n const res = await fetch(baseUrl);\n if (!res.ok) throw new Error(`Failed to fetch registry index: ${res.statusText}`);\n return res.json();\n }\n\n private async defaultFetch(url: string): Promise<RegistryItem> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch ${url}: ${res.statusText}`);\n return res.json();\n }\n}\n","import type { RegistryItem } from \"./schema.js\";\n\ntype FetchItemFn = (name: string) => Promise<RegistryItem>;\n\nexport async function resolveDependencies(\n names: string[],\n fetchItem: FetchItemFn\n): Promise<RegistryItem[]> {\n const visited = new Set<string>();\n const items = new Map<string, RegistryItem>();\n const edges: [string, string][] = [];\n\n async function resolve(name: string): Promise<void> {\n if (visited.has(name)) return;\n visited.add(name);\n\n const item = await fetchItem(name);\n items.set(name, item);\n\n const deps = item.registryDependencies ?? [];\n for (const dep of deps) {\n edges.push([dep, name]);\n await resolve(dep);\n }\n }\n\n for (const name of names) {\n await resolve(name);\n }\n\n return topologicalSort(items, edges);\n}\n\nfunction topologicalSort(\n items: Map<string, RegistryItem>,\n edges: [string, string][]\n): RegistryItem[] {\n const inDegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const name of items.keys()) {\n inDegree.set(name, 0);\n adjacency.set(name, []);\n }\n\n for (const [from, to] of edges) {\n adjacency.get(from)?.push(to);\n inDegree.set(to, (inDegree.get(to) ?? 0) + 1);\n }\n\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) queue.push(name);\n }\n\n const sorted: RegistryItem[] = [];\n while (queue.length > 0) {\n const name = queue.shift()!;\n sorted.push(items.get(name)!);\n\n for (const neighbor of adjacency.get(name) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n if (sorted.length !== items.size) {\n const missing = [...items.keys()].filter((n) => !sorted.some((s) => s.name === n));\n throw new Error(`Circular dependency detected involving: ${missing.join(\", \")}`);\n }\n\n return sorted;\n}\n","import { readFile, writeFile, mkdir, access } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { createPatch } from \"diff\";\n\nexport enum FileStatus {\n New = \"new\",\n Identical = \"identical\",\n Different = \"different\",\n}\n\nexport async function checkFileStatus(filePath: string, newContent: string): Promise<FileStatus> {\n try {\n await access(filePath);\n } catch {\n return FileStatus.New;\n }\n const existing = await readFile(filePath, \"utf-8\");\n return existing === newContent ? FileStatus.Identical : FileStatus.Different;\n}\n\nexport function generateDiff(filePath: string, oldContent: string, newContent: string): string {\n return createPatch(filePath, oldContent, newContent, \"local\", \"registry\");\n}\n\nexport async function readExistingFile(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nexport async function writeComponentFile(filePath: string, content: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n}\n","import { execSync } from \"child_process\";\nimport type { PackageManager } from \"../utils/detect.js\";\n\nexport function installDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add ${pkgs}`;\n case \"pnpm\": return `pnpm add ${pkgs}`;\n case \"yarn\": return `yarn add ${pkgs}`;\n case \"npm\": return `npm install ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n\nexport function installDevDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add -d ${pkgs}`;\n case \"pnpm\": return `pnpm add -D ${pkgs}`;\n case \"yarn\": return `yarn add -D ${pkgs}`;\n case \"npm\": return `npm install -D ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile, access } from \"fs/promises\";\nimport { join } from \"path\";\nimport type { EnvVarConfig } from \"../registry/schema.js\";\n\n/**\n * Parse a .env file into a Set of defined variable names.\n * Only cares about keys, not values.\n */\nfunction parseEnvKeys(content: string): Set<string> {\n const keys = new Set<string>();\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex > 0) {\n keys.add(trimmed.slice(0, eqIndex).trim());\n }\n }\n return keys;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readEnvFile(path: string): Promise<string> {\n try {\n return await readFile(path, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Collect all envVars from resolved items, deduplicating by key name.\n * Later items override earlier ones if same key.\n */\nexport function collectEnvVars(\n items: Array<{ envVars?: Record<string, EnvVarConfig> }>\n): Record<string, EnvVarConfig> {\n const merged: Record<string, EnvVarConfig> = {};\n for (const item of items) {\n if (item.envVars) {\n Object.assign(merged, item.envVars);\n }\n }\n return merged;\n}\n\n/**\n * Handle env var setup after component installation:\n * 1. Write missing vars to .env.example (always)\n * 2. Prompt user for missing vars and write to .env (interactive)\n */\nexport async function handleEnvVars(\n cwd: string,\n envVars: Record<string, EnvVarConfig>\n): Promise<void> {\n const keys = Object.keys(envVars);\n if (keys.length === 0) return;\n\n // Read existing .env and .env.example\n const envPath = join(cwd, \".env\");\n const examplePath = join(cwd, \".env.example\");\n\n const envContent = await readEnvFile(envPath);\n const exampleContent = await readEnvFile(examplePath);\n\n const envKeys = parseEnvKeys(envContent);\n const exampleKeys = parseEnvKeys(exampleContent);\n\n // Find vars missing from each file\n const missingFromExample = keys.filter((k) => !exampleKeys.has(k));\n const missingFromEnv = keys.filter((k) => !envKeys.has(k) && !process.env[k]);\n\n // 1. Always append missing vars to .env.example\n if (missingFromExample.length > 0) {\n const lines: string[] = [];\n if (exampleContent && !exampleContent.endsWith(\"\\n\")) lines.push(\"\");\n for (const key of missingFromExample) {\n const config = envVars[key];\n lines.push(`# ${config.description}${config.url ? ` (${config.url})` : \"\"}`);\n lines.push(`${key}=`);\n }\n await writeFile(examplePath, exampleContent + lines.join(\"\\n\") + \"\\n\");\n p.log.info(`Updated ${pc.cyan(\".env.example\")} with ${missingFromExample.length} variable(s)`);\n }\n\n // 2. Prompt for missing env vars\n if (missingFromEnv.length === 0) return;\n\n p.log.message(\"\");\n p.log.warn(\n `${missingFromEnv.length} environment variable(s) needed:`\n );\n for (const key of missingFromEnv) {\n const config = envVars[key];\n const req = config.required !== false ? pc.red(\"*\") : \"\";\n p.log.message(` ${pc.yellow(key)}${req}: ${config.description}${config.url ? pc.dim(` -> ${config.url}`) : \"\"}`);\n }\n\n const shouldPrompt = await p.confirm({\n message: \"Would you like to enter values now?\",\n initialValue: true,\n });\n\n if (p.isCancel(shouldPrompt) || !shouldPrompt) {\n p.log.info(`Add them to ${pc.cyan(\".env\")} when ready.`);\n return;\n }\n\n const newEntries: string[] = [];\n for (const key of missingFromEnv) {\n const config = envVars[key];\n const isSecret = config.secret !== false; // default true\n\n let value: string | symbol;\n if (isSecret) {\n value = await p.password({\n message: `${key}:`,\n });\n } else {\n value = await p.text({\n message: `${key}:`,\n placeholder: config.description,\n });\n }\n\n if (p.isCancel(value)) {\n p.log.info(`Skipped remaining variables. Add them to ${pc.cyan(\".env\")} when ready.`);\n break;\n }\n\n if (value) {\n newEntries.push(`${key}=${value}`);\n }\n }\n\n if (newEntries.length > 0) {\n const existingEnv = await readEnvFile(envPath);\n const lines: string[] = [];\n if (existingEnv && !existingEnv.endsWith(\"\\n\")) lines.push(\"\");\n lines.push(...newEntries);\n await writeFile(envPath, existingEnv + lines.join(\"\\n\") + \"\\n\");\n p.log.success(`Wrote ${newEntries.length} variable(s) to ${pc.cyan(\".env\")}`);\n }\n}\n","import { relative, dirname, join, posix } from \"path\";\n\ntype AliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"crons\";\n\nconst KNOWN_TYPES: readonly AliasKey[] = [\"agents\", \"tools\", \"skills\", \"storage\", \"crons\"];\n\nconst TYPE_TO_ALIAS_KEY: Record<string, AliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n \"kitn:cron\": \"crons\",\n};\n\n/**\n * Rewrites `@kitn/<type>/<path>` imports to relative paths based on install layout.\n *\n * Only rewrites known types (agents, tools, skills, storage).\n * Other `@kitn/` imports (e.g. `@kitn/server`) pass through untouched.\n */\nexport function rewriteKitnImports(\n content: string,\n fileType: string,\n fileName: string,\n aliases: Record<string, string | undefined>,\n): string {\n const sourceAliasKey = TYPE_TO_ALIAS_KEY[fileType];\n if (!sourceAliasKey) return content;\n\n const sourceDir = aliases[sourceAliasKey];\n if (!sourceDir) return content;\n\n // Match import/export ... from \"@kitn/<type>/<path>\"\n return content.replace(\n /((?:import|export)\\s+.*?\\s+from\\s+[\"'])@kitn\\/([\\w-]+)\\/([^\"']+)([\"'])/g,\n (_match, prefix: string, type: string, targetPath: string, quote: string) => {\n if (!KNOWN_TYPES.includes(type as AliasKey)) {\n return `${prefix}@kitn/${type}/${targetPath}${quote}`;\n }\n\n const targetDir = aliases[type as AliasKey];\n if (!targetDir) {\n return `${prefix}@kitn/${type}/${targetPath}${quote}`;\n }\n const targetFile = join(targetDir, targetPath);\n let rel = relative(sourceDir, targetFile);\n\n // Normalize to posix separators\n rel = rel.split(\"\\\\\").join(\"/\");\n\n // Ensure relative path starts with ./ or ../\n if (!rel.startsWith(\".\")) {\n rel = `./${rel}`;\n }\n\n return `${prefix}${rel}${quote}`;\n },\n );\n}\n","import { createHash } from \"crypto\";\n\nexport function contentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 8);\n}\n","export interface ComponentRef {\n namespace: string;\n name: string;\n version: string | undefined;\n}\n\nexport function parseComponentRef(input: string): ComponentRef {\n let namespace = \"@kitn\";\n let rest = input;\n\n // Parse @namespace/name\n if (rest.startsWith(\"@\")) {\n const slashIdx = rest.indexOf(\"/\");\n if (slashIdx === -1) {\n throw new Error(`Invalid component reference: ${input}. Expected @namespace/name`);\n }\n namespace = rest.slice(0, slashIdx);\n rest = rest.slice(slashIdx + 1);\n }\n\n // Parse name@version\n const atIdx = rest.indexOf(\"@\");\n if (atIdx === -1) {\n return { namespace, name: rest, version: undefined };\n }\n\n return {\n namespace,\n name: rest.slice(0, atIdx),\n version: rest.slice(atIdx + 1),\n };\n}\n","import type { ComponentType } from \"../registry/schema.js\";\n\nexport const TYPE_ALIASES: Record<string, string> = {\n agent: \"agent\",\n agents: \"agent\",\n tool: \"tool\",\n tools: \"tool\",\n skill: \"skill\",\n skills: \"skill\",\n storage: \"storage\",\n storages: \"storage\",\n package: \"package\",\n packages: \"package\",\n cron: \"cron\",\n crons: \"cron\",\n};\n\nconst SHORT_TO_COMPONENT: Record<string, ComponentType> = {\n agent: \"kitn:agent\",\n tool: \"kitn:tool\",\n skill: \"kitn:skill\",\n storage: \"kitn:storage\",\n package: \"kitn:package\",\n cron: \"kitn:cron\",\n};\n\n/** Resolve a user-provided type string (e.g. \"agents\") to its canonical short form (e.g. \"agent\"). */\nexport function resolveTypeAlias(input: string): string | undefined {\n return TYPE_ALIASES[input.toLowerCase()];\n}\n\n/** Convert a canonical short type (e.g. \"agent\") to a ComponentType (e.g. \"kitn:agent\"). */\nexport function toComponentType(shortType: string): ComponentType {\n const ct = SHORT_TO_COMPONENT[shortType];\n if (!ct) throw new Error(`Unknown component type: ${shortType}`);\n return ct;\n}\n","import { z } from \"zod\";\n\nexport const componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\", \"kitn:cron\"]);\nexport type ComponentType = z.infer<typeof componentType>;\n\nexport const registryFileSchema = z.object({\n path: z.string(),\n content: z.string(),\n type: componentType,\n});\n\nexport const changelogEntrySchema = z.object({\n version: z.string(),\n date: z.string(),\n type: z.enum([\"feature\", \"fix\", \"breaking\", \"initial\"]),\n note: z.string(),\n});\nexport type ChangelogEntry = z.infer<typeof changelogEntrySchema>;\n\nexport const envVarConfigSchema = z.object({\n description: z.string(),\n required: z.boolean().optional(),\n secret: z.boolean().optional(),\n url: z.string().optional(),\n});\nexport type EnvVarConfig = z.infer<typeof envVarConfigSchema>;\n\n/** Schema for the author-facing registry.json file */\nexport const componentConfigSchema = z.object({\n $schema: z.string().optional(),\n type: componentType,\n name: z.string().optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n files: z.array(z.string()).optional(),\n sourceDir: z.string().optional(),\n exclude: z.array(z.string()).optional(),\n installDir: z.string().optional(),\n tsconfig: z.record(z.string(), z.array(z.string())).optional(),\n envVars: z.record(z.string(), envVarConfigSchema).optional(),\n categories: z.array(z.string()).optional(),\n slot: z.string().optional(),\n docs: z.string().optional(),\n changelog: z.array(changelogEntrySchema).optional(),\n});\nexport type ComponentConfig = z.infer<typeof componentConfigSchema>;\n\nexport const registryItemSchema = z.object({\n $schema: z.string().optional(),\n name: z.string(),\n type: componentType,\n description: z.string(),\n dependencies: z.array(z.string()).optional(),\n devDependencies: z.array(z.string()).optional(),\n registryDependencies: z.array(z.string()).optional(),\n envVars: z.record(z.string(), envVarConfigSchema).optional(),\n files: z.array(registryFileSchema),\n installDir: z.string().optional(),\n tsconfig: z.record(z.string(), z.array(z.string())).optional(),\n docs: z.string().optional(),\n categories: z.array(z.string()).optional(),\n slot: z.string().optional(),\n version: z.string().optional(),\n updatedAt: z.string().optional(),\n changelog: z.array(changelogEntrySchema).optional(),\n});\nexport type RegistryItem = z.infer<typeof registryItemSchema>;\n\nexport const registryIndexItemSchema = z.object({\n name: z.string(),\n type: componentType,\n description: z.string(),\n registryDependencies: z.array(z.string()).optional(),\n categories: z.array(z.string()).optional(),\n slot: z.string().optional(),\n version: z.string().optional(),\n versions: z.array(z.string()).optional(),\n updatedAt: z.string().optional(),\n});\n\nexport const registryIndexSchema = z.object({\n $schema: z.string().optional(),\n version: z.string(),\n items: z.array(registryIndexItemSchema),\n});\nexport type RegistryIndex = z.infer<typeof registryIndexSchema>;\n\nexport const typeToDir: Record<ComponentType, string> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n \"kitn:package\": \"package\",\n \"kitn:cron\": \"crons\",\n};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join, dirname } from \"path\";\nimport { readConfig, writeConfig, getInstallPath, resolveRoutesAlias, readLock, writeLock } from \"../utils/config.js\";\nimport { detectPackageManager } from \"../utils/detect.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { resolveDependencies } from \"../registry/resolver.js\";\nimport {\n checkFileStatus,\n writeComponentFile,\n readExistingFile,\n generateDiff,\n FileStatus,\n} from \"../installers/file-writer.js\";\nimport { installDependencies, installDevDependencies } from \"../installers/dep-installer.js\";\nimport { collectEnvVars, handleEnvVars } from \"../installers/env-writer.js\";\nimport { rewriteKitnImports } from \"../installers/import-rewriter.js\";\nimport { createBarrelFile, addImportToBarrel, removeImportFromBarrel } from \"../installers/barrel-manager.js\";\nimport { contentHash } from \"../utils/hash.js\";\nimport { parseComponentRef, type ComponentRef } from \"../utils/parse-ref.js\";\nimport { resolveTypeAlias, toComponentType } from \"../utils/type-aliases.js\";\nimport { typeToDir, type RegistryItem, type ComponentType } from \"../registry/schema.js\";\nimport { existsSync } from \"fs\";\nimport { readFile, writeFile, mkdir, unlink } from \"fs/promises\";\nimport { relative } from \"path\";\n\ninterface AddOptions {\n overwrite?: boolean;\n type?: string;\n yes?: boolean;\n}\n\nexport async function addCommand(components: string[], opts: AddOptions) {\n p.intro(pc.bgCyan(pc.black(\" kitn add \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const lock = await readLock(cwd);\n\n if (components.length === 0) {\n // Interactive browse mode — fetch index, group by type, multi-select\n const fetcher = new RegistryFetcher(config.registries);\n const s = p.spinner();\n s.start(\"Fetching registry...\");\n\n const allItems: Array<{ name: string; type: string; description: string; namespace: string }> = [];\n for (const namespace of Object.keys(config.registries)) {\n try {\n const index = await fetcher.fetchIndex(namespace);\n for (const item of index.items) {\n allItems.push({ name: item.name, type: item.type, description: item.description, namespace });\n }\n } catch {\n // Skip failing registries\n }\n }\n\n s.stop(`Found ${allItems.length} component(s)`);\n\n if (allItems.length === 0) {\n p.log.warn(\"No components found in configured registries.\");\n process.exit(0);\n }\n\n const installed = new Set(Object.keys(lock));\n\n // Group by type, preserving order\n const typeLabels: Record<string, string> = {\n \"kitn:agent\": \"Agents\",\n \"kitn:tool\": \"Tools\",\n \"kitn:skill\": \"Skills\",\n \"kitn:storage\": \"Storage\",\n \"kitn:package\": \"Packages\",\n };\n\n const groups = new Map<string, typeof allItems>();\n for (const item of allItems) {\n if (!groups.has(item.type)) groups.set(item.type, []);\n groups.get(item.type)!.push(item);\n }\n\n const options: Array<{ value: string; label: string; hint?: string }> = [];\n for (const [type, items] of groups) {\n const label = typeLabels[type] ?? type;\n options.push({ value: `__separator_${type}`, label: pc.bold(`── ${label} ${\"─\".repeat(Math.max(0, 40 - label.length))}`), hint: \"\" });\n for (const item of items) {\n const isInstalled = installed.has(item.name);\n options.push({\n value: item.name,\n label: isInstalled ? pc.dim(`${item.name} (installed)`) : item.name,\n hint: item.description,\n });\n }\n }\n\n const selected = await p.multiselect({\n message: \"Select components to install:\",\n options,\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n components = (selected as string[]).filter((s) => !s.startsWith(\"__separator_\"));\n\n if (components.length === 0) {\n p.log.warn(\"No components selected.\");\n process.exit(0);\n }\n }\n\n // --- Positional type argument parsing ---\n // e.g. `kitn add agent weather` → typeFilter=\"agent\", components=[\"weather\"]\n let typeFilter: string | undefined;\n const firstAlias = resolveTypeAlias(components[0]);\n if (firstAlias) {\n if (components.length === 1) {\n p.log.error(\n `${pc.bold(components[0])} looks like a type, not a component name. Usage: ${pc.cyan(`kitn add ${components[0]} <name>`)}`\n );\n process.exit(1);\n }\n typeFilter = firstAlias;\n components = components.slice(1);\n }\n\n // Merge with --type flag (flag wins on conflict)\n if (opts.type) {\n const flagAlias = resolveTypeAlias(opts.type);\n if (!flagAlias) {\n p.log.error(`Unknown type ${pc.bold(opts.type)}. Valid types: agent, tool, skill, storage, package`);\n process.exit(1);\n }\n if (typeFilter && typeFilter !== flagAlias) {\n p.log.warn(`Positional type ${pc.bold(typeFilter)} overridden by --type ${pc.bold(flagAlias)}`);\n }\n typeFilter = flagAlias;\n }\n\n // Resolve \"routes\" to framework-specific adapter name, then parse refs\n const resolvedComponents = components.map((c) => {\n if (c === \"routes\") {\n return resolveRoutesAlias(config);\n }\n return c;\n });\n\n const refs = resolvedComponents.map(parseComponentRef);\n const fetcher = new RegistryFetcher(config.registries);\n\n // --- Disambiguation: resolve ambiguous names before dependency resolution ---\n const s = p.spinner();\n s.start(\"Resolving dependencies...\");\n\n // Build a map of pre-resolved types for explicitly requested components\n const preResolvedTypes = new Map<string, ComponentType>();\n let expandedNames = [...resolvedComponents];\n\n try {\n // Fetch all registry indices\n const namespacesToFetch = Object.keys(config.registries);\n const allIndexItems: Array<{ name: string; type: ComponentType; namespace: string }> = [];\n\n for (const namespace of namespacesToFetch) {\n try {\n const index = await fetcher.fetchIndex(namespace);\n for (const item of index.items) {\n allIndexItems.push({ name: item.name, type: item.type, namespace });\n }\n } catch {\n // Skip failing registries during disambiguation\n }\n }\n\n // Check each explicit component for ambiguity\n const newExpandedNames: string[] = [];\n for (const name of resolvedComponents) {\n const ref = refs.find((r) => r.name === name) ?? { namespace: \"@kitn\", name, version: undefined };\n let matches = allIndexItems.filter((i) => i.name === name && (ref.namespace === \"@kitn\" || i.namespace === ref.namespace));\n\n if (typeFilter) {\n const filteredType = toComponentType(typeFilter);\n matches = matches.filter((m) => m.type === filteredType);\n }\n\n if (matches.length === 0) {\n // No exact match — try substring search\n let fuzzyMatches = allIndexItems.filter(\n (i) => i.name.includes(name) && (ref.namespace === \"@kitn\" || i.namespace === ref.namespace)\n );\n\n if (typeFilter) {\n const filteredType = toComponentType(typeFilter);\n fuzzyMatches = fuzzyMatches.filter((m) => m.type === filteredType);\n }\n\n if (fuzzyMatches.length === 0) {\n // Truly not found — let the resolution phase produce the error\n newExpandedNames.push(name);\n } else if (fuzzyMatches.length === 1) {\n // Single substring match — use it directly\n preResolvedTypes.set(fuzzyMatches[0].name, fuzzyMatches[0].type);\n newExpandedNames.push(fuzzyMatches[0].name);\n } else {\n // Multiple substring matches — prompt user to select\n s.stop(\"Multiple matches found\");\n\n if (!process.stdin.isTTY) {\n const suggestions = fuzzyMatches.map((m) => `${m.name} (${m.type.replace(\"kitn:\", \"\")})`).join(\", \");\n p.log.error(\n `Component ${pc.bold(name)} not found. Did you mean one of: ${suggestions}`\n );\n process.exit(1);\n }\n\n const selected = await p.multiselect({\n message: `No exact match for ${pc.bold(name)}. Select component(s) to install:`,\n options: fuzzyMatches.map((m) => ({\n value: `${m.name}::${m.type}`,\n label: `${m.name} ${pc.dim(`(${m.type.replace(\"kitn:\", \"\")})`)}`,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n for (const sel of selected as string[]) {\n const [selName, selType] = sel.split(\"::\");\n preResolvedTypes.set(selName, selType as ComponentType);\n newExpandedNames.push(selName);\n }\n\n s.start(\"Resolving dependencies...\");\n }\n } else if (matches.length === 1) {\n preResolvedTypes.set(name, matches[0].type);\n newExpandedNames.push(name);\n } else {\n // Multiple types for the same name\n const uniqueTypes = [...new Set(matches.map((m) => m.type))];\n if (uniqueTypes.length === 1) {\n preResolvedTypes.set(name, uniqueTypes[0]);\n newExpandedNames.push(name);\n } else {\n // Need disambiguation\n s.stop(\"Disambiguation needed\");\n\n if (!process.stdin.isTTY) {\n const typeNames = uniqueTypes.map((t) => t.replace(\"kitn:\", \"\")).join(\", \");\n p.log.error(\n `Multiple components named ${pc.bold(name)} found (${typeNames}). Specify the type: ${pc.cyan(`kitn add ${uniqueTypes[0].replace(\"kitn:\", \"\")} ${name}`)}`\n );\n process.exit(1);\n }\n\n const selected = await p.multiselect({\n message: `Multiple types found for ${pc.bold(name)}. Which do you want to install?`,\n options: uniqueTypes.map((t) => ({\n value: t,\n label: `${name} ${pc.dim(`(${t.replace(\"kitn:\", \"\")})`)}`,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n for (const type of selected as ComponentType[]) {\n preResolvedTypes.set(name, type);\n newExpandedNames.push(name);\n }\n\n s.start(\"Resolving dependencies...\");\n }\n }\n }\n expandedNames = newExpandedNames;\n } catch (err: any) {\n s.stop(pc.red(\"Failed to resolve dependencies\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n // --- Dependency resolution with type-aware fetching ---\n let resolved: RegistryItem[];\n try {\n resolved = await resolveDependencies(expandedNames, async (name) => {\n const ref = refs.find((r) => r.name === name) ?? { namespace: \"@kitn\", name, version: undefined };\n const index = await fetcher.fetchIndex(ref.namespace);\n\n // Use pre-resolved type for explicit names, first-match for transitive deps\n const preResolved = preResolvedTypes.get(name);\n const indexItem = preResolved\n ? index.items.find((i) => i.name === name && i.type === preResolved)\n : index.items.find((i) => i.name === name);\n\n if (!indexItem) throw new Error(`Component '${name}' not found in ${ref.namespace} registry`);\n const dir = typeToDir[indexItem.type];\n return fetcher.fetchItem(name, dir as any, ref.namespace, ref.version);\n });\n } catch (err: any) {\n s.stop(pc.red(\"Failed to resolve dependencies\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n s.stop(`Resolved ${resolved.length} component(s)`);\n\n // --- Slot conflict detection ---\n const slotReplacements = new Map<string, string>(); // oldName → newName\n for (const item of resolved) {\n if (!item.slot) continue;\n const existing = Object.entries(lock).find(\n ([key, entry]) => key !== item.name && entry.slot === item.slot\n );\n if (!existing) continue;\n\n const [existingKey] = existing;\n const action = await p.select({\n message: `${pc.bold(existingKey)} already fills the ${pc.cyan(item.slot)} slot. What would you like to do?`,\n options: [\n { value: \"replace\", label: `Replace ${existingKey} with ${item.name}` },\n { value: \"add\", label: `Add alongside ${existingKey}` },\n ],\n });\n\n if (p.isCancel(action)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n if (action === \"replace\") {\n slotReplacements.set(existingKey, item.name);\n }\n }\n\n // Process slot replacements — remove old components\n if (slotReplacements.size > 0) {\n const baseDir = config.aliases.base ?? \"src/ai\";\n for (const [oldKey] of slotReplacements) {\n const oldEntry = lock[oldKey];\n if (!oldEntry) continue;\n\n for (const filePath of oldEntry.files) {\n try {\n await unlink(join(cwd, filePath));\n } catch {\n // File may have been moved or deleted\n }\n }\n\n // Remove barrel imports for deleted files\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n const barrelEligibleDirs = new Set([\n config.aliases.agents,\n config.aliases.tools,\n config.aliases.skills,\n ]);\n\n if (existsSync(barrelPath)) {\n let barrelContent = await readFile(barrelPath, \"utf-8\");\n let barrelChanged = false;\n\n for (const filePath of oldEntry.files) {\n const fileDir = dirname(filePath);\n if (!barrelEligibleDirs.has(fileDir)) continue;\n const barrelDir = join(cwd, baseDir);\n const importPath = \"./\" + relative(barrelDir, join(cwd, filePath)).replace(/\\\\/g, \"/\");\n const updated = removeImportFromBarrel(barrelContent, importPath);\n if (updated !== barrelContent) {\n barrelContent = updated;\n barrelChanged = true;\n }\n }\n\n if (barrelChanged) {\n await writeFile(barrelPath, barrelContent);\n }\n }\n\n delete lock[oldKey];\n p.log.info(`Replaced ${pc.dim(oldKey)} → ${pc.cyan(slotReplacements.get(oldKey)!)}`);\n }\n }\n\n p.log.info(\"Components to install:\\n\" + resolved.map((item) => {\n const isExplicit = expandedNames.includes(item.name) || components.includes(item.name);\n const label = isExplicit ? item.name : `${item.name} ${pc.dim(\"(dependency)\")}`;\n return ` ${pc.cyan(label)}`;\n }).join(\"\\n\"));\n\n // Collect all npm dependencies across resolved components\n const allDeps: string[] = [];\n const allDevDeps: string[] = [];\n for (const item of resolved) {\n if (item.dependencies) allDeps.push(...item.dependencies);\n if (item.devDependencies) allDevDeps.push(...item.devDependencies);\n }\n const uniqueDeps = [...new Set(allDeps)];\n const uniqueDevDeps = [...new Set(allDevDeps)].filter((d) => !uniqueDeps.includes(d));\n const totalDeps = uniqueDeps.length + uniqueDevDeps.length;\n\n if (totalDeps > 0) {\n const depLines = uniqueDeps.map((d) => ` ${pc.cyan(d)}`);\n const devDepLines = uniqueDevDeps.map((d) => ` ${pc.dim(d)}`);\n p.log.info(\"Dependencies:\\n\" + [...depLines, ...devDepLines].join(\"\\n\"));\n }\n\n if (!opts.yes && process.stdin.isTTY) {\n const totalComponents = resolved.length;\n const summary = totalDeps > 0\n ? `Install ${totalComponents} component(s) and ${totalDeps} npm package(s)?`\n : `Install ${totalComponents} component(s)?`;\n const confirm = await p.confirm({ message: summary });\n if (p.isCancel(confirm) || !confirm) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n }\n\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n for (const item of resolved) {\n // Skip file processing for packages already installed with identical content\n const existingInstall = lock[item.name];\n if (existingInstall && item.type === \"kitn:package\") {\n const allContent = item.files.map((f) => f.content).join(\"\\n\");\n if (contentHash(allContent) === existingInstall.hash) {\n continue;\n }\n }\n\n if (item.type === \"kitn:package\") {\n // Package install — multi-file, preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n\n for (const file of item.files) {\n const targetPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n\n const status = await checkFileStatus(targetPath, file.content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, file.content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", file.content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Track in lock\n const allContent = item.files.map((f) => f.content).join(\"\\n\");\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n const installedKey = ref.namespace === \"@kitn\" ? item.name : `${ref.namespace}/${item.name}`;\n lock[installedKey] = {\n registry: ref.namespace,\n type: item.type,\n ...(item.slot && { slot: item.slot }),\n version: item.version ?? \"1.0.0\",\n installedAt: new Date().toISOString(),\n files: item.files.map((f) => join(baseDir, f.path)),\n hash: contentHash(allContent),\n registryDependencies: item.registryDependencies,\n };\n\n } else {\n // Regular component install — single file, import rewriting\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n const ns = ref.namespace;\n\n for (const file of item.files) {\n const aliasKey = (() => {\n switch (item.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n case \"kitn:cron\": return \"crons\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"crons\";\n\n const fileName = file.path.split(\"/\").pop()!;\n const installPath = getInstallPath(config, item.type as Exclude<ComponentType, \"kitn:package\">, fileName, ns);\n const targetPath = join(cwd, installPath);\n const relativePath = installPath;\n const content = rewriteKitnImports(file.content, item.type, fileName, config.aliases);\n\n const status = await checkFileStatus(targetPath, content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Track in lock\n const allContent = item.files.map((f) => {\n const fn = f.path.split(\"/\").pop()!;\n return rewriteKitnImports(f.content, item.type, fn, config.aliases);\n }).join(\"\\n\");\n const installedKey = ns === \"@kitn\" ? item.name : `${ns}/${item.name}`;\n lock[installedKey] = {\n registry: ns,\n type: item.type,\n ...(item.slot && { slot: item.slot }),\n version: item.version ?? \"1.0.0\",\n installedAt: new Date().toISOString(),\n files: item.files.map((f) => {\n const fileName = f.path.split(\"/\").pop()!;\n return getInstallPath(config, item.type as Exclude<ComponentType, \"kitn:package\">, fileName, ns);\n }),\n hash: contentHash(allContent),\n registryDependencies: item.registryDependencies,\n };\n }\n }\n\n // Barrel management — auto-wire imports for barrel-eligible components\n const BARREL_ELIGIBLE: Set<string> = new Set([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:cron\"]);\n const baseDir = config.aliases.base ?? \"src/ai\";\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n const barrelDir = join(cwd, baseDir);\n\n const barrelImports: string[] = [];\n for (const item of resolved) {\n if (!BARREL_ELIGIBLE.has(item.type)) continue;\n\n const ref = refs.find((r) => r.name === item.name) ?? { namespace: \"@kitn\", name: item.name, version: undefined };\n\n for (const file of item.files) {\n const fileName = file.path.split(\"/\").pop()!;\n const installPath = getInstallPath(config, item.type as Exclude<ComponentType, \"kitn:package\">, fileName, ref.namespace);\n const filePath = join(cwd, installPath);\n const importPath = \"./\" + relative(barrelDir, filePath).replace(/\\\\/g, \"/\");\n barrelImports.push(importPath);\n }\n }\n\n if (barrelImports.length > 0) {\n const barrelExisted = existsSync(barrelPath);\n let barrelContent: string;\n\n if (barrelExisted) {\n barrelContent = await readFile(barrelPath, \"utf-8\");\n } else {\n await mkdir(barrelDir, { recursive: true });\n barrelContent = createBarrelFile();\n }\n\n for (const importPath of barrelImports) {\n barrelContent = addImportToBarrel(barrelContent, importPath);\n }\n\n await writeFile(barrelPath, barrelContent);\n p.log.info(`Updated barrel file: ${join(baseDir, \"index.ts\")}`);\n\n if (!barrelExisted) {\n p.note(\n [\n `import { ai } from \"@kitn/plugin\";`,\n ``,\n `app.route(\"/api\", ai.router);`,\n ].join(\"\\n\"),\n \"Add this to your server entry point\",\n );\n }\n }\n\n await writeConfig(cwd, config);\n await writeLock(cwd, lock);\n\n if (totalDeps > 0) {\n const pm = await detectPackageManager(cwd);\n if (pm) {\n s.start(`Installing ${totalDeps} npm dependenc${totalDeps === 1 ? \"y\" : \"ies\"}...`);\n try {\n if (uniqueDeps.length > 0) installDependencies(pm, uniqueDeps, cwd);\n if (uniqueDevDeps.length > 0) installDevDependencies(pm, uniqueDevDeps, cwd);\n s.stop(\"Dependencies installed\");\n } catch {\n s.stop(pc.yellow(\"Some dependencies failed to install\"));\n }\n }\n }\n\n if (created.length > 0) {\n p.log.success(`Added ${created.length} file(s):\\n` + created.map((f) => ` ${pc.green(\"+\")} ${f}`).join(\"\\n\"));\n }\n if (updated.length > 0) {\n p.log.success(`Updated ${updated.length} file(s):\\n` + updated.map((f) => ` ${pc.yellow(\"~\")} ${f}`).join(\"\\n\"));\n }\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s):\\n` + skipped.map((f) => ` ${pc.dim(\"-\")} ${f}`).join(\"\\n\"));\n }\n\n // Handle environment variables\n const allEnvVars = collectEnvVars(resolved);\n await handleEnvVars(cwd, allEnvVars);\n\n for (const item of resolved) {\n if (item.docs) {\n p.log.info(`${pc.bold(item.name)}: ${item.docs}`);\n }\n }\n\n // Show next-step hints for well-known packages\n const resolvedNames = new Set(resolved.map((r) => r.name));\n const projectInstalled = new Set(Object.keys(lock));\n const hints: string[] = [];\n\n const adapterName = resolveRoutesAlias(config);\n\n // Only suggest adding routes if neither resolved nor already installed\n if (resolvedNames.has(\"core\") && !resolvedNames.has(adapterName) && !projectInstalled.has(adapterName)) {\n hints.push(`Run ${pc.cyan(`kitn add routes`)} to install the HTTP adapter.`);\n }\n\n if (hints.length > 0) {\n p.log.message(pc.bold(\"\\nNext steps:\") + \"\\n\" + hints.join(\"\\n\"));\n }\n\n p.outro(pc.green(\"Done!\"));\n}\n","import { writeFile, mkdir, readFile } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport type { KitnConfig } from \"../utils/config.js\";\nimport { getRegistryUrl } from \"../utils/config.js\";\n\nconst TEMPLATE_PATH = join(import.meta.dirname, \"rules-template.md\");\n\n// ---------- Types ----------\n\nexport interface RulesConfig {\n version: string;\n tools: RulesTool[];\n}\n\nexport interface RulesTool {\n id: string;\n name: string;\n filePath: string;\n format: \"plain\" | \"mdc\";\n description?: string;\n frontmatter?: Record<string, string>;\n}\n\n// ---------- Fallback content ----------\n\nconst FALLBACK_CONFIG: RulesConfig = {\n version: \"1.0.0\",\n tools: [\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n filePath: \"AGENTS.md\",\n format: \"plain\",\n description: \"Also works with any tool that reads AGENTS.md\",\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n filePath: \".cursor/rules/kitn.mdc\",\n format: \"mdc\",\n frontmatter: {\n description: \"kitn AI agent framework conventions and patterns\",\n globs: \"src/ai/**/*.ts, src/ai/**/*.md, kitn.json, kitn.lock\",\n },\n },\n {\n id: \"github-copilot\",\n name: \"GitHub Copilot\",\n filePath: \".github/copilot-instructions.md\",\n format: \"plain\",\n },\n {\n id: \"cline\",\n name: \"Cline\",\n filePath: \".clinerules\",\n format: \"plain\",\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n filePath: \".windsurfrules\",\n format: \"plain\",\n },\n ],\n};\n\nlet _fallbackTemplate: string | undefined;\n\nasync function loadFallbackTemplate(): Promise<string> {\n if (!_fallbackTemplate) {\n _fallbackTemplate = await readFile(TEMPLATE_PATH, \"utf-8\");\n }\n return _fallbackTemplate;\n}\n\n// ---------- Registry fetch helpers ----------\n\n/**\n * Derive the rules base URL from the registry URL template.\n * e.g. \"https://kitn-ai.github.io/kitn/r/{type}/{name}.json\"\n * -> \"https://kitn-ai.github.io/kitn/r/rules/\"\n */\nfunction deriveRulesBaseUrl(registries: KitnConfig[\"registries\"]): string {\n const kitnEntry = registries[\"@kitn\"];\n if (!kitnEntry) {\n throw new Error(\"No @kitn registry configured\");\n }\n const url = getRegistryUrl(kitnEntry);\n return url.replace(\"{type}/{name}.json\", \"rules/\");\n}\n\n/** Fetch the rules config from the registry. */\nexport async function fetchRulesConfig(\n registries: KitnConfig[\"registries\"],\n): Promise<RulesConfig> {\n try {\n const baseUrl = deriveRulesBaseUrl(registries);\n const res = await fetch(baseUrl + \"config.json\");\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return (await res.json()) as RulesConfig;\n } catch {\n return FALLBACK_CONFIG;\n }\n}\n\n/** Fetch the rules template from the registry. */\nexport async function fetchRulesTemplate(\n registries: KitnConfig[\"registries\"],\n): Promise<string> {\n try {\n const baseUrl = deriveRulesBaseUrl(registries);\n const res = await fetch(baseUrl + \"template.md\");\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return await res.text();\n } catch {\n return loadFallbackTemplate();\n }\n}\n\n// ---------- Template rendering ----------\n\ninterface Aliases {\n base?: string;\n agents: string;\n tools: string;\n skills: string;\n storage: string;\n crons?: string;\n}\n\n/** Substitute {base}, {agents}, {tools}, {skills}, {storage}, {crons} with actual aliases. */\nexport function renderTemplate(template: string, aliases: Aliases): string {\n const base = aliases.base ?? \"src/ai\";\n return template\n .replace(/\\{base\\}/g, base)\n .replace(/\\{agents\\}/g, aliases.agents)\n .replace(/\\{tools\\}/g, aliases.tools)\n .replace(/\\{skills\\}/g, aliases.skills)\n .replace(/\\{storage\\}/g, aliases.storage)\n .replace(/\\{crons\\}/g, aliases.crons ?? `${base}/crons`);\n}\n\n/** Wrap content for a specific format (plain passthrough, mdc adds frontmatter). */\nexport function wrapContent(content: string, tool: RulesTool): string {\n if (tool.format === \"mdc\" && tool.frontmatter) {\n const lines = Object.entries(tool.frontmatter).map(\n ([key, value]) => `${key}: ${value}`,\n );\n return `---\\n${lines.join(\"\\n\")}\\n---\\n\\n${content}`;\n }\n return content;\n}\n\n// ---------- Main entry ----------\n\n/**\n * Fetch config + template from registry, render with project aliases,\n * and write rules files for each selected tool.\n *\n * @returns List of file paths written (relative to cwd).\n */\nexport async function generateRulesFiles(\n cwd: string,\n config: KitnConfig,\n selectedToolIds?: string[],\n): Promise<string[]> {\n const rulesConfig = await fetchRulesConfig(config.registries);\n const template = await fetchRulesTemplate(config.registries);\n const rendered = renderTemplate(template, config.aliases);\n\n const toolsToWrite = selectedToolIds\n ? rulesConfig.tools.filter((t) => selectedToolIds.includes(t.id))\n : rulesConfig.tools;\n\n const written: string[] = [];\n\n for (const tool of toolsToWrite) {\n const content = wrapContent(rendered, tool);\n const filePath = join(cwd, tool.filePath);\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n written.push(tool.filePath);\n }\n\n return written;\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { mkdir, readFile, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { readConfig, writeConfig, DEFAULT_REGISTRY_URL } from \"../utils/config.js\";\nimport { patchProjectTsconfig } from \"../installers/tsconfig-patcher.js\";\nimport { createBarrelFile } from \"../installers/barrel-manager.js\";\nimport { addCommand } from \"./add.js\";\nimport {\n fetchRulesConfig,\n generateRulesFiles,\n} from \"../installers/rules-generator.js\";\n\n/** Detect the HTTP framework from the project's package.json dependencies. */\nasync function detectFramework(cwd: string): Promise<\"hono\" | \"hono-openapi\" | \"elysia\" | null> {\n try {\n const pkg = JSON.parse(await readFile(join(cwd, \"package.json\"), \"utf-8\"));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps[\"elysia\"]) return \"elysia\";\n if (deps[\"@hono/zod-openapi\"]) return \"hono-openapi\";\n if (deps[\"hono\"]) return \"hono\";\n return null;\n } catch {\n return null;\n }\n}\n\nfunction getPluginTemplate(framework: string): string {\n const adapterName = framework === \"hono-openapi\" ? \"hono-openapi\" : framework;\n return `import { createAIPlugin } from \"@kitn/adapters/${adapterName}\";\nimport { registerWithPlugin } from \"./index.js\";\n\nexport const ai = createAIPlugin({\n // To enable agent chat, add an AI provider:\n // https://sdk.vercel.ai/providers/ai-sdk-providers\n //\n // Example with OpenRouter (access to many models):\n // import { openrouter } from \"@openrouter/ai-sdk-provider\";\n // model: (id) => openrouter(id ?? \"openai/gpt-4o-mini\"),\n //\n // Example with OpenAI directly:\n // import { openai } from \"@ai-sdk/openai\";\n // model: (id) => openai(id ?? \"gpt-4o-mini\"),\n});\n\n// Flush all auto-registered components into the plugin\nregisterWithPlugin(ai);\n`;\n}\n\ninterface InitOptions {\n runtime?: string;\n framework?: string;\n base?: string;\n yes?: boolean;\n}\n\nexport async function initCommand(opts: InitOptions = {}) {\n p.intro(pc.bgCyan(pc.black(\" kitn init \")));\n\n const cwd = process.cwd();\n\n const existing = await readConfig(cwd);\n if (existing) {\n if (opts.yes) {\n p.log.warn(\"kitn.json already exists — overwriting (--yes).\");\n } else {\n p.log.warn(\"kitn.json already exists in this directory.\");\n const shouldContinue = await p.confirm({\n message: \"Overwrite existing configuration?\",\n initialValue: false,\n });\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n }\n }\n\n let runtime: string;\n if (opts.runtime) {\n if (![\"bun\", \"node\", \"deno\"].includes(opts.runtime)) {\n p.log.error(`Invalid runtime: ${opts.runtime}. Must be bun, node, or deno.`);\n process.exit(1);\n }\n runtime = opts.runtime;\n } else if (opts.yes) {\n runtime = \"bun\";\n } else {\n const selected = await p.select({\n message: \"Which runtime do you use?\",\n options: [\n { value: \"bun\", label: \"Bun\", hint: \"recommended\" },\n { value: \"node\", label: \"Node.js\" },\n { value: \"deno\", label: \"Deno\" },\n ],\n });\n if (p.isCancel(selected)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n runtime = selected as string;\n }\n\n const validFrameworks = [\"hono\", \"hono-openapi\", \"elysia\"] as const;\n type Framework = (typeof validFrameworks)[number];\n let framework: Framework;\n const detected = await detectFramework(cwd);\n if (opts.framework) {\n if (!validFrameworks.includes(opts.framework as Framework)) {\n p.log.error(`Invalid framework: ${opts.framework}. Must be one of: ${validFrameworks.join(\", \")}`);\n process.exit(1);\n }\n framework = opts.framework as Framework;\n } else if (detected) {\n framework = detected;\n p.log.info(`Detected ${pc.bold(detected)} from package.json`);\n if (!opts.yes) {\n const confirm = await p.confirm({\n message: `Use ${detected}?`,\n initialValue: true,\n });\n if (p.isCancel(confirm)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n if (!confirm) {\n const selected = await p.select({\n message: \"Which HTTP framework do you use?\",\n options: [\n { value: \"hono\", label: \"Hono\" },\n { value: \"hono-openapi\", label: \"Hono + OpenAPI\", hint: \"zod-openapi routes with /doc endpoint\" },\n { value: \"elysia\", label: \"Elysia\", hint: \"Bun-native framework\" },\n ],\n });\n if (p.isCancel(selected)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n framework = selected as Framework;\n }\n }\n } else if (opts.yes) {\n framework = \"hono\";\n } else {\n const selected = await p.select({\n message: \"Which HTTP framework do you use?\",\n options: [\n { value: \"hono\", label: \"Hono\", hint: \"recommended\" },\n { value: \"hono-openapi\", label: \"Hono + OpenAPI\", hint: \"zod-openapi routes with /doc endpoint\" },\n { value: \"elysia\", label: \"Elysia\", hint: \"Bun-native framework\" },\n ],\n });\n if (p.isCancel(selected)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n framework = selected as Framework;\n }\n\n let baseDir: string;\n if (opts.base) {\n baseDir = opts.base;\n } else if (opts.yes) {\n baseDir = \"src/ai\";\n } else {\n const base = await p.text({\n message: \"Where should kitn components be installed?\",\n initialValue: \"src/ai\",\n placeholder: \"src/ai\",\n });\n if (p.isCancel(base)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n baseDir = base as string;\n }\n const config = {\n runtime: runtime as \"bun\" | \"node\" | \"deno\",\n framework,\n aliases: {\n base: baseDir,\n agents: `${baseDir}/agents`,\n tools: `${baseDir}/tools`,\n skills: `${baseDir}/skills`,\n storage: `${baseDir}/storage`,\n },\n registries: {\n \"@kitn\": {\n url: DEFAULT_REGISTRY_URL,\n homepage: \"https://kitn.ai\",\n description: \"Official kitn AI agent components\",\n },\n },\n };\n\n const s = p.spinner();\n s.start(\"Writing kitn.json\");\n await writeConfig(cwd, config);\n s.stop(\"Created kitn.json\");\n\n // Set up wildcard tsconfig path so @kitn/core, @kitn/adapters/*, etc. all resolve.\n // Remove any old per-package entries (e.g. @kitnai/core, @kitn/core) left from earlier versions.\n await patchProjectTsconfig(\n cwd,\n { \"@kitn/*\": [`./${baseDir}/*`] },\n [\"@kitn\", \"@kitnai\"],\n );\n p.log.info(`Patched tsconfig.json with path: ${pc.bold(\"@kitn/*\")}`);\n\n // Auto-install core engine + framework adapter\n p.log.info(\"Installing core engine and adapter...\");\n await addCommand([\"core\", \"routes\"], { overwrite: true });\n\n // Generate plugin.ts and barrel index.ts\n const aiDir = join(cwd, baseDir);\n await mkdir(aiDir, { recursive: true });\n\n const barrelPath = join(aiDir, \"index.ts\");\n await writeFile(barrelPath, createBarrelFile());\n\n const pluginPath = join(aiDir, \"plugin.ts\");\n await writeFile(pluginPath, getPluginTemplate(framework));\n\n p.log.success(`Created ${pc.bold(baseDir + \"/plugin.ts\")} — configure your AI provider there`);\n\n // --- Generate AI coding tool rules files ---\n try {\n const rulesConfig = await fetchRulesConfig(config.registries);\n\n let selectedToolIds: string[];\n\n if (opts.yes) {\n // Auto mode: generate all rules files\n selectedToolIds = rulesConfig.tools.map((t) => t.id);\n } else {\n const selected = await p.multiselect({\n message: \"Which AI coding tools do you use?\",\n options: rulesConfig.tools.map((t) => ({\n value: t.id,\n label: t.name,\n hint: t.description,\n })),\n required: false,\n });\n\n if (p.isCancel(selected)) {\n selectedToolIds = [];\n } else {\n selectedToolIds = selected as string[];\n }\n }\n\n if (selectedToolIds.length > 0) {\n const written = await generateRulesFiles(cwd, config, selectedToolIds);\n for (const filePath of written) {\n p.log.success(`Created ${pc.bold(filePath)}`);\n }\n }\n } catch {\n // Don't fail init if rules generation fails\n p.log.warn(\"Could not generate AI coding tool rules (non-fatal).\");\n }\n\n const mountCode = framework === \"elysia\"\n ? `app.use(new Elysia({ prefix: \"/api\" }).use(ai.router));`\n : `app.route(\"/api\", ai.router);`;\n p.note(\n [\n `import { ai } from \"@kitn/plugin\";`,\n ``,\n mountCode,\n ].join(\"\\n\"),\n \"Add this to your server entry point:\",\n );\n\n p.log.message(\n [\n pc.bold(\"Add your first agent:\"),\n ` ${pc.cyan(\"kitn add weather-agent\")}`,\n \"\",\n pc.bold(\"Browse all components:\"),\n ` ${pc.cyan(\"kitn list\")}`,\n ].join(\"\\n\"),\n );\n\n p.outro(\"Done!\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, readLock } from \"../utils/config.js\";\nimport { resolveTypeAlias } from \"../utils/type-aliases.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport type { RegistryIndex } from \"../registry/schema.js\";\n\ninterface ListOptions {\n installed?: boolean;\n type?: string;\n registry?: string;\n verbose?: boolean;\n}\n\ntype IndexItemWithNamespace = RegistryIndex[\"items\"][number] & { namespace: string };\n\nexport async function listCommand(typeFilter: string | undefined, opts: ListOptions) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // Resolve type filter from positional arg or --type flag\n const rawType = typeFilter ?? opts.type;\n const resolvedType = rawType ? resolveTypeAlias(rawType) : undefined;\n if (rawType && !resolvedType) {\n p.log.error(`Unknown type ${pc.bold(rawType)}. Valid types: agent, tool, skill, storage, package`);\n process.exit(1);\n }\n\n const fetcher = new RegistryFetcher(config.registries);\n\n const namespacesToFetch = opts.registry\n ? [opts.registry]\n : Object.keys(config.registries);\n\n if (opts.registry && !config.registries[opts.registry]) {\n p.log.error(`Registry ${pc.bold(opts.registry)} is not configured. Run ${pc.bold(\"kitn registry list\")} to see configured registries.`);\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Fetching registry...\");\n\n const allItems: IndexItemWithNamespace[] = [];\n const errors: string[] = [];\n\n for (const namespace of namespacesToFetch) {\n try {\n const index = await fetcher.fetchIndex(namespace);\n for (const item of index.items) {\n allItems.push({ ...item, namespace });\n }\n } catch (err: any) {\n errors.push(`${namespace}: ${err.message}`);\n }\n }\n\n if (allItems.length === 0 && errors.length > 0) {\n s.stop(pc.red(\"Failed to fetch registries\"));\n for (const e of errors) p.log.error(e);\n process.exit(1);\n }\n\n s.stop(`Found ${allItems.length} components`);\n\n for (const e of errors) {\n p.log.warn(`${pc.yellow(\"⚠\")} Failed to fetch ${e}`);\n }\n\n const installed = await readLock(cwd);\n const typeGroups = new Map<string, IndexItemWithNamespace[]>();\n\n for (const item of allItems) {\n const group = item.type.replace(\"kitn:\", \"\");\n if (resolvedType && group !== resolvedType) continue;\n // Hide packages from default view — they're installed by `kitn init`\n if (!resolvedType && group === \"package\") continue;\n if (!typeGroups.has(group)) typeGroups.set(group, []);\n typeGroups.get(group)!.push(item);\n }\n\n // Calculate max name width for alignment\n let maxName = 0;\n for (const items of typeGroups.values()) {\n for (const item of items) {\n const displayName = item.namespace === \"@kitn\" ? item.name : `${item.namespace}/${item.name}`;\n if (displayName.length > maxName) maxName = displayName.length;\n }\n }\n\n const cols = process.stdout.columns ?? 80;\n // Layout: \" ✓ name__ [vX.X.X ]description\"\n const versionLen = opts.verbose ? 10 : 0;\n const prefixLen = 4 + maxName + 2 + versionLen;\n\n let installedCount = 0;\n let updateCount = 0;\n let shownCount = 0;\n\n for (const [group, items] of typeGroups) {\n // Sort: installed first, then alphabetical\n items.sort((a, b) => {\n const aInst = !!(installed[a.name] ?? installed[`${a.namespace}/${a.name}`]);\n const bInst = !!(installed[b.name] ?? installed[`${b.namespace}/${b.name}`]);\n if (aInst !== bInst) return aInst ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n const label = group.charAt(0).toUpperCase() + group.slice(1) + \"s\";\n console.log(`\\n ${pc.bold(label)} ${pc.dim(`(${items.length})`)}`);\n\n for (const item of items) {\n const displayName = item.namespace === \"@kitn\" ? item.name : `${item.namespace}/${item.name}`;\n const inst = installed[item.name] ?? installed[displayName];\n if (opts.installed && !inst) continue;\n\n const maxDescLen = Math.max(20, cols - prefixLen);\n\n let desc = item.description;\n if (desc.length > maxDescLen) {\n desc = desc.slice(0, maxDescLen - 1) + \"…\";\n }\n\n let line: string;\n const nameCol = displayName.padEnd(maxName + 2);\n const version = opts.verbose ? `${pc.dim(`v${item.version ?? \"1.0.0\"}`)} ` : \"\";\n\n if (inst) {\n installedCount++;\n const hasUpdate = item.version && inst.version !== item.version;\n if (hasUpdate) updateCount++;\n const updateTag = hasUpdate ? pc.yellow(` ↑${item.version}`) : \"\";\n line = ` ${pc.green(\"✓\")} ${nameCol}${version}${pc.dim(desc)}${updateTag}`;\n } else {\n line = ` ${pc.dim(\"○\")} ${nameCol}${version}${pc.dim(desc)}`;\n }\n\n console.log(line);\n shownCount++;\n }\n }\n\n if (shownCount === 0 && resolvedType) {\n console.log(pc.dim(`\\n No ${resolvedType} components found.`));\n }\n\n const totalShown = [...typeGroups.values()].reduce((sum, items) => sum + items.length, 0);\n const parts = [`${installedCount} installed`, `${totalShown - installedCount} available`];\n if (updateCount > 0) parts.push(pc.yellow(`${updateCount} update${updateCount === 1 ? \"\" : \"s\"}`));\n console.log(`\\n ${pc.dim(parts.join(\" · \"))}\\n`);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig, resolveRoutesAlias, readLock } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { readExistingFile, generateDiff } from \"../installers/file-writer.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { typeToDir } from \"../registry/schema.js\";\n\nexport async function diffCommand(componentName: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" alias to framework-specific adapter name\n const input = componentName === \"routes\" ? resolveRoutesAlias(config) : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in lock — @kitn uses plain name, third-party uses @namespace/name\n const lock = await readLock(cwd);\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = lock[installedKey];\n if (!installed) {\n p.log.error(`Component '${ref.name}' is not installed.`);\n process.exit(1);\n }\n\n const namespace = installed.registry ?? ref.namespace;\n const fetcher = new RegistryFetcher(config.registries);\n const index = await fetcher.fetchIndex(namespace);\n const indexItem = index.items.find((i) => i.name === ref.name);\n if (!indexItem) {\n p.log.error(`Component '${ref.name}' not found in ${namespace} registry.`);\n process.exit(1);\n }\n\n const dir = typeToDir[indexItem.type] as any;\n const registryItem = await fetcher.fetchItem(ref.name, dir, namespace, ref.version);\n\n let hasDiff = false;\n for (const file of registryItem.files) {\n if (indexItem.type === \"kitn:package\") {\n // Packages use base alias + preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n const localPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n const localContent = await readExistingFile(localPath);\n\n if (localContent === null) {\n p.log.warn(`${relativePath}: file missing locally`);\n hasDiff = true;\n } else if (localContent !== file.content) {\n const diff = generateDiff(relativePath, localContent, file.content);\n console.log(diff);\n hasDiff = true;\n }\n } else {\n // Regular components use type-based alias directories\n const fileName = file.path.split(\"/\").pop()!;\n const aliasKey = (() => {\n switch (indexItem.type) {\n case \"kitn:agent\": return \"agents\";\n case \"kitn:tool\": return \"tools\";\n case \"kitn:skill\": return \"skills\";\n case \"kitn:storage\": return \"storage\";\n }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\n const localPath = join(cwd, config.aliases[aliasKey], fileName);\n const localContent = await readExistingFile(localPath);\n\n if (localContent === null) {\n p.log.warn(`${fileName}: file missing locally`);\n hasDiff = true;\n } else if (localContent !== file.content) {\n const diff = generateDiff(fileName, localContent, file.content);\n console.log(diff);\n hasDiff = true;\n }\n }\n }\n\n if (!hasDiff) {\n p.log.success(`${ref.name}: up to date, no differences.`);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join, relative, dirname } from \"path\";\nimport { unlink, readFile, writeFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { readConfig, writeConfig, resolveRoutesAlias, readLock, writeLock } from \"../utils/config.js\";\nimport type { LockFile } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { removeImportFromBarrel } from \"../installers/barrel-manager.js\";\n\nasync function removeSingleComponent(installedKey: string, lock: LockFile, config: any, cwd: string) {\n const entry = lock[installedKey];\n if (!entry) return;\n\n const deleted: string[] = [];\n for (const filePath of entry.files) {\n try {\n await unlink(join(cwd, filePath));\n deleted.push(filePath);\n } catch {\n p.log.warn(`Could not delete ${filePath} (may have been moved or renamed)`);\n }\n }\n\n // Remove barrel imports for deleted files\n const baseDir = config.aliases.base ?? \"src/ai\";\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n const barrelDir = join(cwd, baseDir);\n const barrelEligibleDirs = new Set([\n config.aliases.agents,\n config.aliases.tools,\n config.aliases.skills,\n ]);\n\n if (existsSync(barrelPath) && deleted.length > 0) {\n let barrelContent = await readFile(barrelPath, \"utf-8\");\n let barrelChanged = false;\n\n for (const filePath of deleted) {\n const fileDir = dirname(filePath);\n if (!barrelEligibleDirs.has(fileDir)) continue;\n\n const importPath = \"./\" + relative(barrelDir, join(cwd, filePath)).replace(/\\\\/g, \"/\");\n const updated = removeImportFromBarrel(barrelContent, importPath);\n if (updated !== barrelContent) {\n barrelContent = updated;\n barrelChanged = true;\n }\n }\n\n if (barrelChanged) {\n await writeFile(barrelPath, barrelContent);\n p.log.info(`Updated barrel file: ${join(baseDir, \"index.ts\")}`);\n }\n }\n\n delete lock[installedKey];\n\n if (deleted.length > 0) {\n p.log.success(`Removed ${installedKey}:\\n` + deleted.map((f) => ` ${pc.red(\"-\")} ${f}`).join(\"\\n\"));\n }\n}\n\nasync function offerOrphanRemoval(removedDeps: Set<string>, lock: LockFile, config: any, cwd: string) {\n if (removedDeps.size === 0) return;\n\n // Find orphaned dependencies — deps not needed by any remaining installed component\n const remaining = Object.entries(lock);\n const neededDeps = new Set<string>();\n for (const [, entry] of remaining) {\n if (entry.registryDependencies) {\n for (const dep of entry.registryDependencies) {\n neededDeps.add(dep);\n }\n }\n }\n\n // Also exclude \"core\" — never offer to remove it\n const orphans = [...removedDeps].filter(\n (dep) => dep !== \"core\" && !neededDeps.has(dep) && lock[dep]\n );\n\n if (orphans.length === 0) return;\n\n const selected = await p.multiselect({\n message: \"The following dependencies are no longer used. Remove them?\",\n options: orphans.map((dep) => ({\n value: dep,\n label: dep,\n hint: `${lock[dep].files.length} file(s)`,\n })),\n initialValues: orphans, // all checked by default\n });\n\n if (p.isCancel(selected)) return;\n\n for (const key of selected as string[]) {\n await removeSingleComponent(key, lock, config, cwd);\n }\n}\n\nexport async function removeCommand(componentName?: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const lock = await readLock(cwd);\n\n if (!componentName) {\n const installedKeys = Object.keys(lock);\n\n if (installedKeys.length === 0) {\n p.log.warn(\"No components installed.\");\n process.exit(0);\n }\n\n const selected = await p.multiselect({\n message: \"Select components to remove:\",\n options: installedKeys.map((key) => ({\n value: key,\n label: key,\n hint: `${lock[key].files.length} file(s)`,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const selectedKeys = selected as string[];\n if (selectedKeys.length === 0) {\n p.log.warn(\"No components selected.\");\n process.exit(0);\n }\n\n // Snapshot deps before removal (entries get deleted during removeSingleComponent)\n const allRemovedDeps = new Set<string>();\n for (const key of selectedKeys) {\n const entry = lock[key];\n if (entry?.registryDependencies) {\n for (const dep of entry.registryDependencies) {\n allRemovedDeps.add(dep);\n }\n }\n }\n\n // Remove each selected component\n for (const key of selectedKeys) {\n await removeSingleComponent(key, lock, config, cwd);\n }\n\n await offerOrphanRemoval(allRemovedDeps, lock, config, cwd);\n\n await writeLock(cwd, lock);\n p.outro(pc.green(\"Done!\"));\n return;\n }\n\n // Resolve \"routes\" alias to framework-specific adapter name\n const input = componentName === \"routes\" ? resolveRoutesAlias(config) : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in lock — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const entry = lock[installedKey];\n if (!entry) {\n p.log.error(`Component '${ref.name}' is not installed.`);\n process.exit(1);\n }\n\n const shouldRemove = await p.confirm({\n message: `Remove ${ref.name}? This will delete ${entry.files.length} file(s).`,\n initialValue: false,\n });\n if (p.isCancel(shouldRemove) || !shouldRemove) {\n p.cancel(\"Remove cancelled.\");\n process.exit(0);\n }\n\n // Snapshot deps before removal\n const removedDeps = new Set(entry.registryDependencies ?? []);\n\n await removeSingleComponent(installedKey, lock, config, cwd);\n\n // Check for orphaned dependencies\n await offerOrphanRemoval(removedDeps, lock, config, cwd);\n\n await writeLock(cwd, lock);\n}\n","import { addCommand } from \"./add.js\";\nimport { readConfig, readLock } from \"../utils/config.js\";\nimport * as p from \"@clack/prompts\";\n\nexport async function updateCommand(components: string[]) {\n // If no components specified, update all installed components\n if (components.length === 0) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const lock = await readLock(cwd);\n if (Object.keys(lock).length === 0) {\n p.log.info(\"No installed components to update.\");\n return;\n }\n\n components = Object.keys(lock);\n }\n\n await addCommand(components, { overwrite: true });\n}\n","export function toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nexport function toTitleCase(str: string): string {\n return str\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join, relative } from \"path\";\nimport { existsSync } from \"fs\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { readConfig, getInstallPath } from \"../utils/config.js\";\nimport { toCamelCase, toTitleCase } from \"../utils/naming.js\";\nimport { checkFileStatus, FileStatus, writeComponentFile } from \"../installers/file-writer.js\";\nimport { createBarrelFile, addImportToBarrel } from \"../installers/barrel-manager.js\";\n\nconst VALID_TYPES = [\"agent\", \"tool\", \"skill\", \"storage\", \"cron\"] as const;\ntype ComponentType = (typeof VALID_TYPES)[number];\n\nfunction generateAgentSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { registerAgent } from \"@kitn/core\";\n\nconst SYSTEM_PROMPT = \"You are a helpful assistant.\";\n\nregisterAgent({\n name: \"${name}\",\n description: \"\",\n system: SYSTEM_PROMPT,\n tools: {},\n});\n`;\n}\n\nfunction generateToolSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { registerTool } from \"@kitn/core\";\nimport { tool } from \"ai\";\nimport { z } from \"zod\";\n\nexport const ${camel} = tool({\n description: \"\",\n inputSchema: z.object({\n input: z.string().describe(\"Input parameter\"),\n }),\n execute: async ({ input }) => {\n // TODO: implement\n return { result: input };\n },\n});\n\nregisterTool({\n name: \"${name}\",\n description: \"\",\n inputSchema: z.object({ input: z.string() }),\n tool: ${camel},\n});\n`;\n}\n\nfunction generateSkillSource(name: string): string {\n const title = toTitleCase(name);\n return `---\nname: ${name}\ndescription: \"\"\n---\n\n# ${title}\n\nDescribe what this skill does and how to use it.\n`;\n}\n\nfunction generateStorageSource(name: string): string {\n const camel = toCamelCase(\"create-\" + name);\n return `import type { StorageProvider } from \"@kitn/core\";\n\nexport function ${camel}(config?: Record<string, unknown>): StorageProvider {\n // TODO: implement storage provider\n throw new Error(\"Not implemented\");\n}\n`;\n}\n\nfunction generateCronSource(name: string): string {\n const camel = toCamelCase(name);\n return `import { registerTool } from \"@kitn/core\";\nimport { tool } from \"ai\";\nimport { z } from \"zod\";\n\n// Cron job: ${name}\n// This file defines tools for a cron job. Register the cron via the API:\n// POST /api/crons { name: \"${name}\", schedule: \"0 6 * * *\", agentName: \"...\", input: \"...\" }\n\nexport const ${camel} = tool({\n description: \"Execute the ${name} cron task\",\n parameters: z.object({\n input: z.string().describe(\"Task input\"),\n }),\n execute: async ({ input }) => {\n // TODO: implement\n return { result: input };\n },\n});\n\nregisterTool({\n name: \"${name}\",\n description: \"\",\n inputSchema: z.object({ input: z.string() }),\n tool: ${camel},\n});\n`;\n}\n\nconst typeToKitnType: Record<ComponentType, \"kitn:agent\" | \"kitn:tool\" | \"kitn:skill\" | \"kitn:storage\" | \"kitn:cron\"> = {\n agent: \"kitn:agent\",\n tool: \"kitn:tool\",\n skill: \"kitn:skill\",\n storage: \"kitn:storage\",\n cron: \"kitn:cron\",\n};\n\n// Types that get auto-wired into the barrel file\nconst BARREL_TYPES: ComponentType[] = [\"agent\", \"tool\", \"skill\", \"cron\"];\n\nexport async function createComponentInProject(\n type: string,\n name: string,\n opts?: { cwd?: string }\n): Promise<{ filePath: string; barrelUpdated: boolean }> {\n if (!VALID_TYPES.includes(type as ComponentType)) {\n throw new Error(\n `Invalid component type: \"${type}\". Valid types: ${VALID_TYPES.join(\", \")}`\n );\n }\n\n const cwd = opts?.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n throw new Error(\n `No kitn.json found in ${cwd}. Run ${pc.bold(\"kitn init\")} first.`\n );\n }\n\n const validType = type as ComponentType;\n const kitnType = typeToKitnType[validType];\n const fileName = validType === \"skill\" ? `${name}.md` : `${name}.ts`;\n\n const filePath = join(cwd, getInstallPath(config, kitnType, fileName));\n\n // Check file doesn't already exist\n const dummyContent = \"\"; // only need to check existence\n const status = await checkFileStatus(filePath, dummyContent);\n if (status !== FileStatus.New) {\n throw new Error(`File already exists: ${filePath}`);\n }\n\n // Generate source\n let source: string;\n switch (validType) {\n case \"agent\":\n source = generateAgentSource(name);\n break;\n case \"tool\":\n source = generateToolSource(name);\n break;\n case \"skill\":\n source = generateSkillSource(name);\n break;\n case \"storage\":\n source = generateStorageSource(name);\n break;\n case \"cron\":\n source = generateCronSource(name);\n break;\n }\n\n // Write the component file\n await writeComponentFile(filePath, source);\n\n // Wire into barrel file for agents, tools, and skills\n let barrelUpdated = false;\n if (BARREL_TYPES.includes(validType)) {\n const baseDir = config.aliases.base ?? \"src/ai\";\n const barrelPath = join(cwd, baseDir, \"index.ts\");\n\n // Read or create barrel file\n let barrelContent: string;\n if (existsSync(barrelPath)) {\n barrelContent = await readFile(barrelPath, \"utf-8\");\n } else {\n barrelContent = createBarrelFile();\n await mkdir(join(cwd, baseDir), { recursive: true });\n }\n\n // Compute relative import path from barrel to the component\n const importPath = \"./\" + relative(join(cwd, baseDir), filePath).replace(/\\.ts$/, \".js\");\n const updatedBarrel = addImportToBarrel(barrelContent, importPath);\n\n if (updatedBarrel !== barrelContent) {\n await writeFile(barrelPath, updatedBarrel);\n barrelUpdated = true;\n }\n }\n\n return { filePath, barrelUpdated };\n}\n\nexport async function createCommand(type: string, name: string) {\n p.intro(pc.bgCyan(pc.black(\" kitn create \")));\n\n try {\n const { filePath, barrelUpdated } = await createComponentInProject(type, name);\n\n p.log.success(`Created ${pc.bold(type)} component ${pc.cyan(name)}`);\n p.log.message(` ${pc.green(\"+\")} ${filePath}`);\n\n if (barrelUpdated) {\n p.log.message(` ${pc.green(\"+\")} barrel file updated`);\n }\n\n p.outro(\n `Edit ${pc.cyan(filePath)} to customize your ${type}.`\n );\n } catch (err: any) {\n p.log.error(err.message);\n process.exit(1);\n }\n}\n","import { readdir, readFile } from \"fs/promises\";\nimport { join, relative, dirname } from \"path\";\nimport type { KitnConfig } from \"./config.js\";\nimport { readLock } from \"./config.js\";\n\nexport interface ResolvedTool {\n filePath: string; // absolute path to tool file\n exportName: string; // e.g. \"weatherTool\"\n importPath: string; // relative .js path from agent dir\n}\n\nexport interface ResolvedAgent {\n filePath: string; // absolute path to agent file\n name: string; // agent name from registerAgent call or filename\n}\n\n/**\n * Strip a type-specific suffix from a component name.\n * e.g. \"weather-tool\" -> \"weather\", \"general-agent\" -> \"general\"\n */\nfunction stripSuffix(name: string, suffix: string): string {\n if (name.endsWith(`-${suffix}`)) {\n return name.slice(0, -(suffix.length + 1));\n }\n return name;\n}\n\n/** Get the absolute tools directory from config. */\nfunction toolsDir(config: KitnConfig, cwd: string): string {\n const baseAlias = config.aliases.base ?? \"src/ai\";\n const tools = config.aliases.tools ?? join(baseAlias, \"tools\");\n return join(cwd, tools);\n}\n\n/** Get the absolute agents directory from config. */\nfunction agentsDir(config: KitnConfig, cwd: string): string {\n const baseAlias = config.aliases.base ?? \"src/ai\";\n const agents = config.aliases.agents ?? join(baseAlias, \"agents\");\n return join(cwd, agents);\n}\n\n/** Try to find a .ts file in a directory matching one of the candidate names. */\nasync function findFile(dir: string, candidates: string[]): Promise<string | null> {\n for (const name of candidates) {\n const filePath = join(dir, `${name}.ts`);\n try {\n await readFile(filePath);\n return filePath;\n } catch {\n // file doesn't exist, try next\n }\n }\n return null;\n}\n\n/** Extract the first `export const <name>` identifier from a TypeScript source file. */\nfunction parseExportName(source: string): string | null {\n const match = source.match(/export\\s+const\\s+(\\w+)/);\n return match ? match[1] : null;\n}\n\n/** Extract agent name from `registerAgent({ name: \"...\" })` or `name: \"...\"` pattern. */\nfunction parseAgentName(source: string): string | null {\n const match = source.match(/registerAgent\\s*\\(\\s*\\{[^}]*name:\\s*\"([^\"]+)\"/s);\n return match ? match[1] : null;\n}\n\n/** Compute a relative import path from one directory to a file, using .js extension. */\nfunction computeImportPath(fromDir: string, toFile: string): string {\n let rel = relative(fromDir, toFile);\n // Ensure it starts with \"./\" for relative imports\n if (!rel.startsWith(\".\")) {\n rel = `./${rel}`;\n }\n // Replace .ts extension with .js\n return rel.replace(/\\.ts$/, \".js\");\n}\n\n/**\n * Resolve a tool by name. Checks the lock file first, then scans the tools directory.\n * Returns null if the tool is not found.\n */\nexport async function resolveToolByName(\n name: string,\n config: KitnConfig,\n cwd: string,\n): Promise<ResolvedTool | null> {\n const tDir = toolsDir(config, cwd);\n const aDir = agentsDir(config, cwd);\n\n // 1. Check lock file for installed file path\n const lock = await readLock(cwd);\n for (const [componentName, entry] of Object.entries(lock)) {\n if (componentName === name || componentName === `${name}-tool`) {\n // Find a tool file in the entry's files list\n const toolFile = entry.files.find((f) => {\n const toolsAlias = config.aliases.tools ?? join(config.aliases.base ?? \"src/ai\", \"tools\");\n return f.startsWith(toolsAlias);\n });\n if (toolFile) {\n const filePath = join(cwd, toolFile);\n try {\n const source = await readFile(filePath, \"utf-8\");\n const exportName = parseExportName(source);\n if (exportName) {\n return {\n filePath,\n exportName,\n importPath: computeImportPath(aDir, filePath),\n };\n }\n } catch {\n // File from lock doesn't exist on disk, fall through to directory scan\n }\n }\n }\n }\n\n // 2. Scan tools directory\n const candidates = [name, stripSuffix(name, \"tool\")];\n // Deduplicate (if name doesn't have -tool suffix, both will be the same)\n const uniqueCandidates = [...new Set(candidates)];\n\n const filePath = await findFile(tDir, uniqueCandidates);\n if (!filePath) return null;\n\n const source = await readFile(filePath, \"utf-8\");\n const exportName = parseExportName(source);\n if (!exportName) return null;\n\n return {\n filePath,\n exportName,\n importPath: computeImportPath(aDir, filePath),\n };\n}\n\n/**\n * Resolve an agent by name. Checks the lock file first, then scans the agents directory.\n * Returns null if the agent is not found.\n */\nexport async function resolveAgentByName(\n name: string,\n config: KitnConfig,\n cwd: string,\n): Promise<ResolvedAgent | null> {\n const aDir = agentsDir(config, cwd);\n\n // 1. Check lock file for installed file path\n const lock = await readLock(cwd);\n for (const [componentName, entry] of Object.entries(lock)) {\n if (componentName === name || componentName === `${name}-agent`) {\n const agentFile = entry.files.find((f) => {\n const agentsAlias = config.aliases.agents ?? join(config.aliases.base ?? \"src/ai\", \"agents\");\n return f.startsWith(agentsAlias);\n });\n if (agentFile) {\n const filePath = join(cwd, agentFile);\n try {\n const source = await readFile(filePath, \"utf-8\");\n const agentName = parseAgentName(source);\n return {\n filePath,\n name: agentName ?? componentName,\n };\n } catch {\n // File from lock doesn't exist on disk, fall through\n }\n }\n }\n }\n\n // 2. Scan agents directory\n const candidates = [name, stripSuffix(name, \"agent\")];\n const uniqueCandidates = [...new Set(candidates)];\n\n const filePath = await findFile(aDir, uniqueCandidates);\n if (!filePath) return null;\n\n const source = await readFile(filePath, \"utf-8\");\n const agentName = parseAgentName(source);\n const fallbackName = filePath.split(\"/\").pop()!.replace(/\\.ts$/, \"\");\n\n return {\n filePath,\n name: agentName ?? fallbackName,\n };\n}\n\n/** List entry for tools/agents directory scanning. */\nexport interface ComponentListEntry {\n name: string; // filename without .ts extension\n filePath: string; // absolute path\n}\n\n/**\n * List all tools in the tools directory.\n * Returns an empty array if the directory doesn't exist.\n */\nexport async function listTools(config: KitnConfig, cwd: string): Promise<ComponentListEntry[]> {\n const dir = toolsDir(config, cwd);\n return listComponentsInDir(dir);\n}\n\n/**\n * List all agents in the agents directory.\n * Returns an empty array if the directory doesn't exist.\n */\nexport async function listAgents(config: KitnConfig, cwd: string): Promise<ComponentListEntry[]> {\n const dir = agentsDir(config, cwd);\n return listComponentsInDir(dir);\n}\n\n/** Scan a directory for .ts files and return component list entries. */\nasync function listComponentsInDir(dir: string): Promise<ComponentListEntry[]> {\n try {\n const entries = await readdir(dir);\n return entries\n .filter((f) => f.endsWith(\".ts\") && !f.endsWith(\".test.ts\") && !f.endsWith(\".d.ts\"))\n .sort()\n .map((f) => ({\n name: f.replace(/\\.ts$/, \"\"),\n filePath: join(dir, f),\n }));\n } catch {\n return [];\n }\n}\n","/**\n * Regex-based agent file manipulation for linking/unlinking tools.\n *\n * Works on string content (no file I/O) — same approach as barrel-manager.ts.\n */\n\nexport interface LinkResult {\n content: string;\n changed: boolean;\n error?: string;\n}\n\nexport interface ToolRef {\n exportName: string;\n importPath: string;\n}\n\n/**\n * Link a tool into an agent file by adding an import and inserting the tool\n * into the `tools: { ... }` object.\n */\nexport function linkToolToAgent(\n content: string,\n tool: ToolRef,\n toolKey?: string,\n): LinkResult {\n const key = toolKey ?? tool.exportName;\n const { exportName, importPath } = tool;\n\n // --- Check if already linked (idempotent) ---\n const toolEntry = key === exportName ? exportName : `${key}: ${exportName}`;\n if (hasToolEntry(content, key)) {\n return { content, changed: false };\n }\n\n // --- Insert import ---\n const importLine = `import { ${exportName} } from \"${importPath}\";`;\n let result = content;\n\n if (!result.includes(importLine)) {\n const lines = result.split(\"\\n\");\n let lastImportIndex = -1;\n for (let i = 0; i < lines.length; i++) {\n if (/^import\\s+/.test(lines[i])) lastImportIndex = i;\n }\n\n if (lastImportIndex === -1) {\n // No imports found — prepend\n result = `${importLine}\\n${result}`;\n } else {\n lines.splice(lastImportIndex + 1, 0, importLine);\n result = lines.join(\"\\n\");\n }\n }\n\n // --- Insert tool entry ---\n const insertResult = insertToolEntry(result, key, exportName);\n if (insertResult.error) {\n return {\n content,\n changed: false,\n error:\n `Could not auto-modify the agent file. Add manually:\\n` +\n ` 1. Import: ${importLine}\\n` +\n ` 2. Add to tools: { ${toolEntry} }`,\n };\n }\n\n return { content: insertResult.content, changed: true };\n}\n\n/**\n * Unlink a tool from an agent file by removing it from the `tools` object\n * and removing the import if the export is no longer referenced.\n */\nexport function unlinkToolFromAgent(\n content: string,\n tool: ToolRef,\n toolKey?: string,\n): LinkResult {\n const key = toolKey ?? tool.exportName;\n const { exportName, importPath } = tool;\n\n if (!hasToolEntry(content, key)) {\n return { content, changed: false };\n }\n\n // --- Remove tool entry ---\n const removeResult = removeToolEntry(content, key, exportName);\n if (removeResult.error) {\n return {\n content,\n changed: false,\n error:\n `Could not auto-modify the agent file. Remove manually:\\n` +\n ` 1. Remove from tools: ${key === exportName ? key : `${key}: ${exportName}`}\\n` +\n ` 2. Remove import if unused: import { ${exportName} } from \"${importPath}\";`,\n };\n }\n\n let result = removeResult.content;\n\n // --- Remove import if exportName is no longer referenced in file ---\n if (!isExportNameReferenced(result, exportName)) {\n result = removeImportLine(result, exportName, importPath);\n }\n\n return { content: result, changed: true };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Check whether a key already exists in the tools object. */\nfunction hasToolEntry(content: string, key: string): boolean {\n // Match \"key:\" or \"key,\" or \"key }\" or standalone shorthand \"key\" in tools\n // We look for the key inside a tools: { ... } block\n const toolsMatch = extractToolsBlock(content);\n if (!toolsMatch) return false;\n const toolsContent = toolsMatch.inner;\n\n // Check for \"key: value\" or shorthand \"key\" (as standalone identifier)\n const keyPattern = new RegExp(\n `(?:^|[,{\\\\s])${escapeRegex(key)}(?:\\\\s*[:,}\\\\s]|$)`,\n );\n return keyPattern.test(toolsContent);\n}\n\ninterface ToolsBlock {\n /** Full match including \"tools: { ... }\" */\n full: string;\n /** Content inside the braces */\n inner: string;\n /** Start index in the original string */\n startIndex: number;\n /** Indentation of the \"tools:\" line */\n indent: string;\n}\n\n/** Extract the tools block from file content, handling both single-line and multiline. */\nfunction extractToolsBlock(content: string): ToolsBlock | null {\n // First try single-line: tools: { ... }\n const singleLine = /^([ \\t]*)tools\\s*:\\s*\\{([^}]*)\\}/m;\n const singleMatch = singleLine.exec(content);\n if (singleMatch) {\n return {\n full: singleMatch[0],\n inner: singleMatch[2],\n startIndex: singleMatch.index,\n indent: singleMatch[1],\n };\n }\n\n // Multiline: find \"tools: {\" then match to closing \"}\"\n const multiStart = /^([ \\t]*)tools\\s*:\\s*\\{/m;\n const multiMatch = multiStart.exec(content);\n if (!multiMatch) return null;\n\n const braceStart = multiMatch.index + multiMatch[0].length;\n let depth = 1;\n let i = braceStart;\n while (i < content.length && depth > 0) {\n if (content[i] === \"{\") depth++;\n else if (content[i] === \"}\") depth--;\n i++;\n }\n if (depth !== 0) return null;\n\n const full = content.slice(multiMatch.index, i);\n const inner = content.slice(braceStart, i - 1);\n return {\n full,\n inner,\n startIndex: multiMatch.index,\n indent: multiMatch[1],\n };\n}\n\n/** Insert a tool entry into the tools object. */\nfunction insertToolEntry(\n content: string,\n key: string,\n exportName: string,\n): { content: string; error?: string } {\n const block = extractToolsBlock(content);\n if (!block) return { content, error: \"no tools block found\" };\n\n const entry = key === exportName ? key : `${key}: ${exportName}`;\n const trimmedInner = block.inner.trim();\n\n let newToolsContent: string;\n\n if (trimmedInner === \"\") {\n // Empty tools: {} → tools: { entry }\n newToolsContent = `tools: { ${entry} }`;\n } else if (!block.inner.includes(\"\\n\")) {\n // Single-line with existing entries: tools: { a, b } → tools: { a, b, entry }\n // Remove trailing whitespace inside braces\n const cleaned = trimmedInner.replace(/,?\\s*$/, \"\");\n newToolsContent = `tools: { ${cleaned}, ${entry} }`;\n } else {\n // Multiline: insert before closing brace with proper indentation\n const entryIndent = block.indent + \" \";\n // Ensure the existing content ends with a comma\n const existingTrimmed = block.inner.trimEnd();\n const withComma = existingTrimmed.endsWith(\",\")\n ? existingTrimmed\n : existingTrimmed + \",\";\n newToolsContent = `tools: {\\n${withComma}\\n${entryIndent}${entry},\\n${block.indent}}`;\n }\n\n const newContent = content.replace(block.full, newToolsContent);\n return { content: newContent };\n}\n\n/** Remove a tool entry from the tools object. */\nfunction removeToolEntry(\n content: string,\n key: string,\n exportName: string,\n): { content: string; error?: string } {\n const block = extractToolsBlock(content);\n if (!block) return { content, error: \"no tools block found\" };\n\n const trimmedInner = block.inner.trim();\n\n if (!block.inner.includes(\"\\n\")) {\n // Single-line: parse entries, filter out the matching one\n const entries = trimmedInner\n .split(\",\")\n .map((e) => e.trim())\n .filter((e) => e !== \"\");\n\n const filtered = entries.filter((e) => {\n // Match \"key: value\" or shorthand \"key\"\n const colonIdx = e.indexOf(\":\");\n const entryKey = colonIdx >= 0 ? e.slice(0, colonIdx).trim() : e.trim();\n return entryKey !== key;\n });\n\n const newInner =\n filtered.length === 0 ? \"\" : ` ${filtered.join(\", \")} `;\n const newBlock = `tools: {${newInner}}`;\n return { content: content.replace(block.full, newBlock) };\n } else {\n // Multiline: remove the line matching the key\n const lines = block.inner.split(\"\\n\");\n const keyPattern = new RegExp(\n `^\\\\s*${escapeRegex(key)}\\\\s*(?::|,|$)`,\n );\n const filtered = lines.filter((line) => !keyPattern.test(line));\n\n // Check if all remaining lines are empty/whitespace\n const hasEntries = filtered.some((l) => l.trim() !== \"\");\n\n if (!hasEntries) {\n const newBlock = `tools: {}`;\n return { content: content.replace(block.full, newBlock) };\n }\n\n // Clean up: ensure last entry line ends with comma\n const cleanedLines = filtered.slice();\n // Find last non-empty line and ensure trailing comma\n for (let i = cleanedLines.length - 1; i >= 0; i--) {\n if (cleanedLines[i].trim() !== \"\") {\n if (!cleanedLines[i].trimEnd().endsWith(\",\")) {\n cleanedLines[i] = cleanedLines[i].trimEnd() + \",\";\n }\n break;\n }\n }\n\n const newBlock = `tools: {\\n${cleanedLines.join(\"\\n\")}\\n${block.indent}}`;\n return { content: content.replace(block.full, newBlock) };\n }\n}\n\n/** Check if an export name is still referenced in the content (outside of import lines). */\nfunction isExportNameReferenced(content: string, exportName: string): boolean {\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n // Skip import lines\n if (/^import\\s+/.test(line)) continue;\n // Check if the export name appears as a word\n const wordPattern = new RegExp(`\\\\b${escapeRegex(exportName)}\\\\b`);\n if (wordPattern.test(line)) return true;\n }\n return false;\n}\n\n/** Remove an import line for a specific export from a specific path. */\nfunction removeImportLine(\n content: string,\n exportName: string,\n importPath: string,\n): string {\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Single-line import: import { foo } from \"path\";\n // Also handles: import { foo, bar } from \"path\";\n const singleImportMatch = line.match(\n /^import\\s*\\{([^}]+)\\}\\s*from\\s*[\"'](.+?)[\"']\\s*;?\\s*$/,\n );\n\n if (singleImportMatch && singleImportMatch[2] === importPath) {\n const imports = singleImportMatch[1]\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s !== \"\");\n\n if (imports.length === 1 && imports[0] === exportName) {\n // Only import — remove the entire line\n // Also remove a following blank line if present\n if (i + 1 < lines.length && lines[i + 1].trim() === \"\") {\n i++; // skip blank line\n }\n continue;\n }\n\n // Multiple imports — remove just this one\n const remaining = imports.filter((s) => s !== exportName);\n result.push(\n `import { ${remaining.join(\", \")} } from \"${importPath}\";`,\n );\n continue;\n }\n\n // Multi-line import: spans multiple lines\n // Check if this starts a multi-line import for our path\n if (\n /^import\\s*\\{/.test(line) &&\n !line.includes(\"}\") &&\n content.includes(importPath)\n ) {\n // Collect all lines until closing }\n const importLines = [line];\n let j = i + 1;\n while (j < lines.length && !lines[j].includes(\"}\")) {\n importLines.push(lines[j]);\n j++;\n }\n if (j < lines.length) {\n importLines.push(lines[j]);\n }\n\n const fullImport = importLines.join(\"\\n\");\n if (fullImport.includes(importPath)) {\n // Extract all imported names\n const namesMatch = fullImport.match(/\\{([^}]+)\\}/);\n if (namesMatch) {\n const imports = namesMatch[1]\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s !== \"\");\n\n if (imports.length === 1 && imports[0] === exportName) {\n // Skip entire multi-line import\n i = j;\n // Also skip trailing blank line\n if (i + 1 < lines.length && lines[i + 1].trim() === \"\") {\n i++;\n }\n continue;\n }\n\n // Remove just this export from the multi-line import\n const remaining = imports.filter((s) => s !== exportName);\n if (remaining.length <= 2) {\n result.push(\n `import { ${remaining.join(\", \")} } from \"${importPath}\";`,\n );\n } else {\n result.push(`import {`);\n remaining.forEach((name, idx) => {\n result.push(\n ` ${name}${idx < remaining.length - 1 ? \",\" : \"\"}`,\n );\n });\n result.push(`} from \"${importPath}\";`);\n }\n i = j;\n continue;\n }\n }\n }\n\n result.push(line);\n }\n\n return result.join(\"\\n\");\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { basename } from \"path\";\nimport { readConfig } from \"../utils/config.js\";\nimport {\n resolveToolByName,\n resolveAgentByName,\n listTools,\n listAgents,\n} from \"../utils/component-resolver.js\";\nimport { linkToolToAgent } from \"../installers/agent-linker.js\";\nimport type { ToolRef } from \"../installers/agent-linker.js\";\n\nexport async function linkCommand(\n type?: string,\n name?: string,\n opts?: { to?: string; as?: string },\n) {\n p.intro(pc.bgCyan(pc.black(\" kitn link \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // --- Resolve type ---\n if (type && type !== \"tool\") {\n p.log.error(\n `Unsupported type \"${type}\". Only ${pc.bold(\"tool\")} is supported.`,\n );\n process.exit(1);\n }\n\n // --- Resolve tool ---\n let toolName = name;\n\n if (!toolName) {\n const tools = await listTools(config, cwd);\n if (tools.length === 0) {\n p.log.error(\"No tools found in your project.\");\n process.exit(1);\n }\n\n const selected = await p.select({\n message: \"Select a tool to link:\",\n options: tools.map((t) => ({\n value: t.name,\n label: t.name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n toolName = selected as string;\n }\n\n const tool = await resolveToolByName(toolName, config, cwd);\n if (!tool) {\n p.log.error(\n `Tool \"${toolName}\" not found. Check that the file exists in your tools directory.`,\n );\n process.exit(1);\n }\n\n // --- Resolve agent ---\n let agentName = opts?.to;\n\n if (!agentName) {\n const agents = await listAgents(config, cwd);\n if (agents.length === 0) {\n p.log.error(\"No agents found in your project.\");\n process.exit(1);\n }\n\n const selected = await p.select({\n message: \"Select an agent to link the tool to:\",\n options: agents.map((a) => ({\n value: a.name,\n label: a.name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n agentName = selected as string;\n }\n\n const agent = await resolveAgentByName(agentName, config, cwd);\n if (!agent) {\n p.log.error(\n `Agent \"${agentName}\" not found. Check that the file exists in your agents directory.`,\n );\n process.exit(1);\n }\n\n // --- Perform the link ---\n const agentContent = await readFile(agent.filePath, \"utf-8\");\n const toolRef: ToolRef = {\n exportName: tool.exportName,\n importPath: tool.importPath,\n };\n\n const result = linkToolToAgent(agentContent, toolRef, opts?.as);\n\n if (result.error) {\n p.log.warn(result.error);\n p.outro(\"Could not auto-link. Follow the manual instructions above.\");\n process.exit(1);\n }\n\n if (!result.changed) {\n p.log.info(\n `${pc.cyan(tool.exportName)} is already linked to ${pc.cyan(basename(agent.filePath))}.`,\n );\n p.outro(\"Nothing to do.\");\n return;\n }\n\n await writeFile(agent.filePath, result.content);\n\n p.log.success(\n `Linked ${pc.cyan(tool.exportName)} to ${pc.cyan(basename(agent.filePath))}`,\n );\n p.log.message(\n ` ${pc.green(\"+\")} import { ${tool.exportName} } from \"${tool.importPath}\"`,\n );\n p.log.message(\n ` ${pc.green(\"+\")} tools: { ${opts?.as ? `${opts.as}: ${tool.exportName}` : tool.exportName} }`,\n );\n\n p.outro(\"Done!\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile } from \"fs/promises\";\nimport { basename } from \"path\";\nimport { readConfig } from \"../utils/config.js\";\nimport {\n resolveToolByName,\n resolveAgentByName,\n listTools,\n listAgents,\n} from \"../utils/component-resolver.js\";\nimport { unlinkToolFromAgent } from \"../installers/agent-linker.js\";\nimport type { ToolRef } from \"../installers/agent-linker.js\";\n\nexport async function unlinkCommand(\n type?: string,\n name?: string,\n opts?: { from?: string },\n) {\n p.intro(pc.bgCyan(pc.black(\" kitn unlink \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n // --- Resolve type ---\n if (type && type !== \"tool\") {\n p.log.error(\n `Unsupported type \"${type}\". Only ${pc.bold(\"tool\")} is supported.`,\n );\n process.exit(1);\n }\n\n // --- Resolve tool ---\n let toolName = name;\n\n if (!toolName) {\n const tools = await listTools(config, cwd);\n if (tools.length === 0) {\n p.log.error(\"No tools found in your project.\");\n process.exit(1);\n }\n\n const selected = await p.select({\n message: \"Select a tool to unlink:\",\n options: tools.map((t) => ({\n value: t.name,\n label: t.name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n toolName = selected as string;\n }\n\n const tool = await resolveToolByName(toolName, config, cwd);\n if (!tool) {\n p.log.error(\n `Tool \"${toolName}\" not found. Check that the file exists in your tools directory.`,\n );\n process.exit(1);\n }\n\n // --- Resolve agent ---\n let agentName = opts?.from;\n\n if (!agentName) {\n const agents = await listAgents(config, cwd);\n if (agents.length === 0) {\n p.log.error(\"No agents found in your project.\");\n process.exit(1);\n }\n\n const selected = await p.select({\n message: \"Select an agent to unlink the tool from:\",\n options: agents.map((a) => ({\n value: a.name,\n label: a.name,\n })),\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n agentName = selected as string;\n }\n\n const agent = await resolveAgentByName(agentName, config, cwd);\n if (!agent) {\n p.log.error(\n `Agent \"${agentName}\" not found. Check that the file exists in your agents directory.`,\n );\n process.exit(1);\n }\n\n // --- Perform the unlink ---\n const agentContent = await readFile(agent.filePath, \"utf-8\");\n const toolRef: ToolRef = {\n exportName: tool.exportName,\n importPath: tool.importPath,\n };\n\n const result = unlinkToolFromAgent(agentContent, toolRef);\n\n if (result.error) {\n p.log.warn(result.error);\n p.outro(\"Could not auto-unlink. Follow the manual instructions above.\");\n process.exit(1);\n }\n\n if (!result.changed) {\n p.log.info(\n `${pc.cyan(tool.exportName)} is not linked to ${pc.cyan(basename(agent.filePath))}.`,\n );\n p.outro(\"Nothing to do.\");\n return;\n }\n\n await writeFile(agent.filePath, result.content);\n\n p.log.success(\n `Unlinked ${pc.cyan(tool.exportName)} from ${pc.cyan(basename(agent.filePath))}`,\n );\n p.log.message(\n ` ${pc.red(\"-\")} import { ${tool.exportName} } from \"${tool.importPath}\"`,\n );\n p.log.message(\n ` ${pc.red(\"-\")} tools: { ${tool.exportName} }`,\n );\n\n p.outro(\"Done!\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, readLock } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { typeToDir } from \"../registry/schema.js\";\n\nexport async function infoCommand(component: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const ref = parseComponentRef(component);\n const fetcher = new RegistryFetcher(config.registries);\n\n const s = p.spinner();\n s.start(\"Fetching component info...\");\n\n // Fetch registry index to find the component and get available versions\n let index;\n try {\n index = await fetcher.fetchIndex(ref.namespace);\n } catch (err: any) {\n s.stop(pc.red(\"Failed to fetch registry\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n const indexItem = index.items.find((i) => i.name === ref.name);\n if (!indexItem) {\n s.stop(pc.red(\"Component not found\"));\n p.log.error(`Component '${ref.name}' not found in registry.`);\n process.exit(1);\n }\n\n // Fetch the full component JSON (specific version or latest)\n const dir = typeToDir[indexItem.type] as any;\n let item;\n try {\n item = await fetcher.fetchItem(ref.name, dir, ref.namespace, ref.version);\n } catch (err: any) {\n s.stop(pc.red(\"Failed to fetch component\"));\n p.log.error(err.message);\n process.exit(1);\n }\n\n s.stop(\"Component found\");\n\n // Display formatted output\n const version = item.version ?? indexItem.version ?? \"unknown\";\n const typeName = indexItem.type.replace(\"kitn:\", \"\");\n\n // Header: name, version, namespace\n console.log();\n console.log(\n ` ${pc.bold(item.name)} ${pc.cyan(`v${version}`)}${\" \".repeat(Math.max(1, 40 - item.name.length - version.length - 2))}${pc.dim(ref.namespace)}`\n );\n console.log(` ${pc.dim(item.description)}`);\n console.log();\n\n // Details\n console.log(` ${pc.dim(\"Type:\")} ${typeName}`);\n\n if (item.dependencies?.length) {\n console.log(\n ` ${pc.dim(\"Dependencies:\")} ${item.dependencies.join(\", \")}`\n );\n }\n\n if (item.registryDependencies?.length) {\n console.log(\n ` ${pc.dim(\"Registry deps:\")} ${item.registryDependencies.join(\", \")}`\n );\n }\n\n if (item.categories?.length) {\n console.log(\n ` ${pc.dim(\"Categories:\")} ${item.categories.join(\", \")}`\n );\n }\n\n if (item.updatedAt) {\n console.log(` ${pc.dim(\"Updated:\")} ${item.updatedAt}`);\n }\n\n // Available versions from index\n const versions = indexItem.versions;\n if (versions?.length) {\n console.log(` ${pc.dim(\"Versions:\")} ${versions.join(\", \")}`);\n }\n\n // Changelog\n if (item.changelog?.length) {\n console.log();\n console.log(` ${pc.bold(\"Changelog:\")}`);\n for (const entry of item.changelog) {\n const tag =\n entry.type === \"feature\"\n ? pc.green(entry.type)\n : entry.type === \"fix\"\n ? pc.yellow(entry.type)\n : entry.type === \"breaking\"\n ? pc.red(entry.type)\n : pc.dim(entry.type);\n console.log(\n ` ${pc.cyan(entry.version)} ${pc.dim(entry.date)} ${tag} ${entry.note}`\n );\n }\n }\n\n // Files\n console.log();\n const fileCount = item.files.length;\n console.log(` ${pc.bold(`Files:`)} ${pc.dim(`(${fileCount})`)}`);\n const maxShown = 10;\n for (const file of item.files.slice(0, maxShown)) {\n console.log(` ${pc.dim(file.path)}`);\n }\n if (fileCount > maxShown) {\n console.log(` ${pc.dim(`... and ${fileCount - maxShown} more`)}`);\n }\n\n // Installed status\n const lock = await readLock(cwd);\n const installed = lock[item.name];\n if (installed) {\n console.log();\n console.log(\n ` ${pc.green(\"Installed\")} ${pc.dim(`v${installed.version}`)}`\n );\n if (version !== installed.version) {\n console.log(\n ` ${pc.yellow(\"Update available:\")} ${pc.dim(`v${installed.version}`)} → ${pc.cyan(`v${version}`)}`\n );\n }\n }\n\n console.log();\n}\n","import { execSync } from \"child_process\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { detectCliInstaller, getGlobalInstallCommand } from \"../utils/detect.js\";\nimport { fetchLatestVersion, isNewer } from \"../utils/update-check.js\";\n\nexport async function checkCommand(currentVersion: string) {\n p.intro(pc.bgCyan(pc.black(\" kitn check \")));\n\n p.log.info(`kitn v${currentVersion}`);\n\n const s = p.spinner();\n s.start(\"Checking for updates...\");\n\n const latest = await fetchLatestVersion();\n\n if (!latest) {\n s.stop(pc.yellow(\"Could not reach the npm registry\"));\n p.outro(\"Try again later.\");\n return;\n }\n\n if (isNewer(latest, currentVersion)) {\n s.stop(pc.yellow(`Update available: ${currentVersion} → ${latest}`));\n\n const pm = detectCliInstaller();\n const installCmd = getGlobalInstallCommand(pm, \"@kitnai/cli\");\n\n const shouldUpdate = await p.confirm({ message: \"Update now?\" });\n\n if (p.isCancel(shouldUpdate) || !shouldUpdate) {\n p.log.message(` Run: ${pc.cyan(installCmd)}`);\n } else {\n const us = p.spinner();\n us.start(\"Updating...\");\n try {\n execSync(installCmd, { stdio: \"pipe\" });\n us.stop(pc.green(`Updated to v${latest}`));\n } catch {\n us.stop(pc.red(\"Update failed\"));\n p.log.message(` Run manually: ${pc.cyan(installCmd)}`);\n }\n }\n } else {\n s.stop(pc.green(\"You're on the latest version\"));\n }\n\n p.outro(\"\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, DEFAULT_REGISTRIES, DEFAULT_ALIASES } from \"../utils/config.js\";\nimport {\n fetchRulesConfig,\n generateRulesFiles,\n} from \"../installers/rules-generator.js\";\nimport type { KitnConfig } from \"../utils/config.js\";\n\nexport async function rulesCommand() {\n p.intro(pc.bgCyan(pc.black(\" kitn rules \")));\n\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n\n // Use project aliases if kitn.json exists, otherwise defaults\n const registries = config?.registries ?? DEFAULT_REGISTRIES;\n const aliases = config?.aliases ?? DEFAULT_ALIASES;\n\n const rulesConfig = await fetchRulesConfig(registries);\n\n const selected = await p.multiselect({\n message: \"Which AI coding tools do you use?\",\n options: rulesConfig.tools.map((t) => ({\n value: t.id,\n label: t.name,\n hint: t.description,\n })),\n required: false,\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const selectedIds = selected as string[];\n\n if (selectedIds.length === 0) {\n p.log.warn(\"No tools selected. Nothing to generate.\");\n p.outro(\"Done.\");\n return;\n }\n\n const s = p.spinner();\n s.start(\"Generating rules files\");\n\n // Build a minimal config-like object for generateRulesFiles\n const effectiveConfig = { registries, aliases } as KitnConfig;\n\n const written = await generateRulesFiles(cwd, effectiveConfig, selectedIds);\n\n s.stop(\"Rules files generated\");\n\n for (const filePath of written) {\n p.log.success(`${pc.green(\"+\")} ${filePath}`);\n }\n\n p.outro(`Generated ${written.length} rules file${written.length === 1 ? \"\" : \"s\"}.`);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport { existsSync } from \"fs\";\n\nconst CONFIG_DIR = join(homedir(), \".kitn\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n// Valid config keys - this is a whitelist\nconst VALID_KEYS = [\"chat-url\", \"api-key\"] as const;\ntype ConfigKey = (typeof VALID_KEYS)[number];\n\nexport async function readUserConfig(): Promise<Record<string, string>> {\n try {\n const raw = await readFile(CONFIG_FILE, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n\nasync function writeUserConfig(config: Record<string, string>): Promise<void> {\n if (!existsSync(CONFIG_DIR)) {\n await mkdir(CONFIG_DIR, { recursive: true });\n }\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\nexport async function configSetCommand(key: string, value: string): Promise<void> {\n if (!VALID_KEYS.includes(key as ConfigKey)) {\n p.log.error(`Unknown config key: ${pc.red(key)}`);\n p.log.info(`Valid keys: ${VALID_KEYS.join(\", \")}`);\n process.exit(1);\n }\n\n const config = await readUserConfig();\n config[key] = value;\n await writeUserConfig(config);\n\n // Mask api-key values in output\n const displayValue = key.includes(\"key\") ? value.slice(0, 8) + \"...\" : value;\n p.log.success(`Set ${pc.cyan(key)} = ${pc.green(displayValue)}`);\n}\n\nexport async function configGetCommand(key: string): Promise<void> {\n const config = await readUserConfig();\n const value = config[key];\n if (value === undefined) {\n p.log.warn(`${pc.cyan(key)} is not set`);\n } else {\n const displayValue = key.includes(\"key\") ? value.slice(0, 8) + \"...\" : value;\n p.log.info(`${pc.cyan(key)} = ${pc.green(displayValue)}`);\n }\n}\n\nexport async function configListCommand(): Promise<void> {\n const config = await readUserConfig();\n const entries = Object.entries(config);\n if (entries.length === 0) {\n p.log.info(\"No user configuration set.\");\n p.log.info(`Run ${pc.cyan(\"kitn config set <key> <value>\")} to configure.`);\n return;\n }\n for (const [key, value] of entries) {\n const displayValue = key.includes(\"key\") ? value.slice(0, 8) + \"...\" : value;\n p.log.info(`${pc.cyan(key)} = ${pc.green(displayValue)}`);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig, getRegistryUrl, readLock } from \"../utils/config.js\";\nimport type { RegistryEntry } from \"../utils/config.js\";\n\ninterface RegistryAddOptions {\n cwd?: string;\n overwrite?: boolean;\n homepage?: string;\n description?: string;\n}\n\ninterface RegistryRemoveOptions {\n cwd?: string;\n force?: boolean;\n}\n\ninterface RegistryListOptions {\n cwd?: string;\n}\n\nexport async function registryAddCommand(\n namespace: string,\n url: string,\n opts: RegistryAddOptions = {},\n) {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n if (!namespace.startsWith(\"@\")) {\n throw new Error(\"Namespace must start with @ (e.g. @myteam)\");\n }\n if (!url.includes(\"{type}\")) {\n throw new Error(\"URL template must include {type} placeholder\");\n }\n if (!url.includes(\"{name}\")) {\n throw new Error(\"URL template must include {name} placeholder\");\n }\n if (config.registries[namespace] && !opts.overwrite) {\n throw new Error(`Registry '${namespace}' is already configured. Use --overwrite to replace.`);\n }\n\n // Store as rich entry if homepage or description provided, otherwise plain URL\n if (opts.homepage || opts.description) {\n const entry: RegistryEntry = { url };\n if (opts.homepage) entry.homepage = opts.homepage;\n if (opts.description) entry.description = opts.description;\n config.registries[namespace] = entry;\n } else {\n config.registries[namespace] = url;\n }\n await writeConfig(cwd, config);\n\n p.log.success(`Added registry ${pc.bold(namespace)}`);\n p.log.message(pc.dim(` ${url}`));\n if (opts.homepage) p.log.message(pc.dim(` Homepage: ${opts.homepage}`));\n if (opts.description) p.log.message(pc.dim(` ${opts.description}`));\n}\n\nexport async function registryRemoveCommand(\n namespace: string,\n opts: RegistryRemoveOptions = {},\n): Promise<{ affectedComponents: string[] }> {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n if (!config.registries[namespace]) {\n throw new Error(`Registry '${namespace}' is not configured.`);\n }\n if (namespace === \"@kitn\" && !opts.force) {\n throw new Error(\"Cannot remove the default @kitn registry. Use --force to override.\");\n }\n\n const lock = await readLock(cwd);\n const affectedComponents: string[] = [];\n for (const [name, entry] of Object.entries(lock)) {\n if (entry.registry === namespace) {\n affectedComponents.push(name);\n }\n }\n\n delete config.registries[namespace];\n await writeConfig(cwd, config);\n\n p.log.success(`Removed registry ${pc.bold(namespace)}`);\n if (affectedComponents.length > 0) {\n p.log.warn(`${affectedComponents.length} installed component(s) referenced this registry:\\n` + affectedComponents.map((name) => ` ${pc.yellow(\"!\")} ${name}`).join(\"\\n\"));\n }\n\n return { affectedComponents };\n}\n\nexport async function registryListCommand(\n opts: RegistryListOptions = {},\n): Promise<Array<{ namespace: string; url: string; homepage?: string; description?: string }>> {\n const cwd = opts.cwd ?? process.cwd();\n const config = await readConfig(cwd);\n if (!config) throw new Error(\"No kitn.json found. Run `kitn init` first.\");\n\n const entries = Object.entries(config.registries).map(([namespace, value]) => {\n const url = getRegistryUrl(value);\n const homepage = typeof value === \"object\" ? value.homepage : undefined;\n const description = typeof value === \"object\" ? value.description : undefined;\n return { namespace, url, homepage, description };\n });\n\n if (entries.length === 0) {\n p.log.message(pc.dim(\" No registries configured.\"));\n } else {\n const lines: string[] = [];\n for (const { namespace, url, homepage, description } of entries) {\n lines.push(` ${pc.bold(namespace.padEnd(16))} ${pc.dim(url)}`);\n if (description) lines.push(` ${\" \".repeat(16)} ${description}`);\n if (homepage) lines.push(` ${\" \".repeat(16)} ${pc.dim(homepage)}`);\n }\n p.log.message(lines.join(\"\\n\"));\n }\n\n return entries;\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readFile as fsReadFile, writeFile as fsWriteFile, mkdir, readdir } from \"fs/promises\";\nimport { join, dirname, resolve } from \"path\";\nimport { readConfig, readLock } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { readUserConfig } from \"./config.js\";\nimport type {\n ChatMessage,\n ChatPlan,\n PlanStep,\n ChatServiceResponse,\n AskUserItem,\n WriteFileInput,\n ReadFileInput,\n ListFilesInput,\n UpdateEnvInput,\n ToolCall,\n ToolResult,\n} from \"./chat-types.js\";\n\nconst DEFAULT_SERVICE_URL = \"https://chat.kitn.dev\";\nconst GLOBAL_REGISTRY_URL = \"https://kitn-ai.github.io/registry/registries.json\";\n\ninterface GlobalDirectoryEntry {\n name: string;\n url: string;\n homepage?: string;\n description?: string;\n}\n\ninterface GlobalRegistryEntry {\n namespace: string;\n url: string;\n items: Array<{ name: string; type: string; description: string; registryDependencies?: string[] }>;\n}\n\n// ---------------------------------------------------------------------------\n// Pure helper functions (exported for testing)\n// ---------------------------------------------------------------------------\n\nexport function buildServicePayload(messages: ChatMessage[], metadata: Record<string, unknown>) {\n return { messages, metadata };\n}\n\nexport function hasToolCalls(response: ChatServiceResponse): boolean {\n return !!(response.message.toolCalls && response.message.toolCalls.length > 0);\n}\n\nexport function formatTokens(count: number): string {\n if (count >= 1000) return `${(count / 1000).toFixed(1)}k`;\n return `${count}`;\n}\n\nexport function formatElapsed(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remaining = seconds % 60;\n return `${minutes}m ${remaining}s`;\n}\n\nexport function formatSessionStats(elapsedMs: number, totalTokens: number): string {\n return `Session: ${formatElapsed(elapsedMs)} | ${formatTokens(totalTokens)} tokens`;\n}\n\nexport function shouldCompact(lastPromptTokens: number, threshold: number): boolean {\n return lastPromptTokens >= threshold;\n}\n\nexport function applyCompaction(messages: ChatMessage[], summary: string, keepRecent: number = 2): ChatMessage[] {\n const recent = messages.slice(-keepRecent);\n return [\n { role: \"user\" as const, content: `[Context from earlier in conversation]\\n${summary}` },\n ...recent,\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Registry helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch the global registry directory and return indices for registries\n * not already configured in the user's kitn.json.\n */\nexport async function fetchGlobalRegistries(\n configuredNamespaces: string[],\n): Promise<GlobalRegistryEntry[]> {\n let directory: GlobalDirectoryEntry[];\n try {\n const res = await fetch(GLOBAL_REGISTRY_URL);\n if (!res.ok) return [];\n directory = await res.json();\n } catch {\n return [];\n }\n\n const unconfigured = directory.filter(\n (entry) => !configuredNamespaces.includes(entry.name),\n );\n\n if (unconfigured.length === 0) return [];\n\n const results: GlobalRegistryEntry[] = [];\n for (const entry of unconfigured) {\n try {\n const indexUrl = entry.url.replace(\"{type}/{name}.json\", \"registry.json\");\n const res = await fetch(indexUrl);\n if (!res.ok) continue;\n const index = await res.json();\n const items = (index.items ?? []).map((item: any) => ({\n name: item.name,\n type: item.type,\n description: item.description,\n registryDependencies: item.registryDependencies,\n }));\n results.push({ namespace: entry.name, url: entry.url, items });\n } catch {\n // Skip failing registries\n }\n }\n\n return results;\n}\n\n/**\n * Resolve the chat service URL.\n * Priority: urlOverride (--url flag) > KITN_CHAT_URL env > user config (~/.kitn/config.json) > project config (kitn.json chatService.url) > default\n */\nexport async function resolveServiceUrl(\n urlOverride?: string,\n chatServiceConfig?: { url?: string },\n): Promise<string> {\n if (urlOverride) return urlOverride;\n if (process.env.KITN_CHAT_URL) return process.env.KITN_CHAT_URL;\n\n // User-level config (~/.kitn/config.json)\n const userConfig = await readUserConfig();\n if (userConfig[\"chat-url\"]) return userConfig[\"chat-url\"];\n\n // Project-level config (kitn.json)\n if (chatServiceConfig?.url) return chatServiceConfig.url;\n\n return DEFAULT_SERVICE_URL;\n}\n\n// ---------------------------------------------------------------------------\n// Plan formatting\n// ---------------------------------------------------------------------------\n\n/**\n * Format a ChatPlan for display using picocolors.\n */\nexport function formatPlan(plan: ChatPlan): string {\n const lines: string[] = [plan.summary, \"\"];\n\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const num = `${i + 1}.`;\n const label = formatStepLabel(step);\n lines.push(`${num} ${label} - ${step.reason}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatStepLabel(step: PlanStep): string {\n switch (step.action) {\n case \"add\":\n return `Add ${pc.cyan(step.component!)}`;\n case \"remove\":\n return `Remove ${pc.red(step.component!)}`;\n case \"create\":\n return `Create ${pc.green(step.name!)} ${pc.dim(`(${step.type})`)}`;\n case \"link\":\n return `Link ${pc.cyan(step.toolName!)} → ${pc.cyan(step.agentName!)}`;\n case \"unlink\":\n return `Unlink ${pc.red(step.toolName!)} from ${pc.cyan(step.agentName!)}`;\n case \"registry-add\":\n return `Add registry ${pc.magenta(step.namespace!)}`;\n case \"update\":\n return `Update ${pc.yellow(step.component!)}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Step execution\n// ---------------------------------------------------------------------------\n\nasync function executeStep(step: PlanStep): Promise<void> {\n switch (step.action) {\n case \"registry-add\": {\n const { registryAddCommand } = await import(\"./registry.js\");\n await registryAddCommand(step.namespace!, step.url!, { overwrite: true });\n break;\n }\n case \"add\": {\n const { addCommand } = await import(\"./add.js\");\n await addCommand([step.component!], { yes: true });\n break;\n }\n case \"create\": {\n const { createCommand } = await import(\"./create.js\");\n await createCommand(step.type!, step.name!);\n break;\n }\n case \"link\": {\n const { linkCommand } = await import(\"./link.js\");\n await linkCommand(\"tool\", step.toolName, { to: step.agentName });\n break;\n }\n case \"remove\": {\n const { removeCommand } = await import(\"./remove.js\");\n await removeCommand(step.component);\n break;\n }\n case \"unlink\": {\n const { unlinkCommand } = await import(\"./unlink.js\");\n await unlinkCommand(\"tool\", step.toolName, { from: step.agentName });\n break;\n }\n case \"update\": {\n const { addCommand } = await import(\"./add.js\");\n await addCommand([step.component!], { overwrite: true, yes: true });\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tool handlers (exported for testing)\n// ---------------------------------------------------------------------------\n\nexport async function handleAskUser(input: { items: AskUserItem[] }): Promise<string> {\n const responses: string[] = [];\n for (const item of input.items) {\n switch (item.type) {\n case \"info\":\n p.log.info(item.text);\n break;\n case \"warning\":\n p.log.warn(item.text);\n break;\n case \"confirmation\": {\n const confirmed = await p.confirm({ message: item.text });\n if (p.isCancel(confirmed)) return \"User cancelled.\";\n responses.push(confirmed ? \"Yes\" : \"No\");\n break;\n }\n case \"option\": {\n if (!item.choices?.length) { responses.push(\"No choices provided.\"); break; }\n const selected = await p.select({\n message: item.text,\n options: item.choices.map((c) => ({ value: c, label: c })),\n });\n if (p.isCancel(selected)) return \"User cancelled.\";\n responses.push(`User selected: ${selected}`);\n break;\n }\n case \"question\": {\n const answer = await p.text({ message: item.text, placeholder: item.context });\n if (p.isCancel(answer)) return \"User cancelled.\";\n responses.push(`User answered: ${answer}`);\n break;\n }\n }\n }\n return responses.join(\"\\n\");\n}\n\nexport async function handleCreatePlan(plan: ChatPlan, cwd: string): Promise<string> {\n p.log.message(formatPlan(plan));\n const steps = plan.steps;\n let selectedSteps: PlanStep[];\n\n if (steps.length === 1) {\n const confirm = await p.confirm({ message: `Run: ${formatStepLabel(steps[0])}?` });\n if (p.isCancel(confirm) || !confirm) return \"User cancelled the plan.\";\n selectedSteps = steps;\n } else {\n const action = await p.select({\n message: \"How would you like to proceed?\",\n options: [\n { value: \"all\", label: \"Yes, run all steps\" },\n { value: \"select\", label: \"Select which steps to run\" },\n { value: \"cancel\", label: \"Cancel\" },\n ],\n });\n if (p.isCancel(action) || action === \"cancel\") return \"User cancelled the plan.\";\n if (action === \"select\") {\n const choices = await p.multiselect({\n message: \"Select steps to run:\",\n options: steps.map((step, i) => ({ value: i, label: `${formatStepLabel(step)} - ${step.reason}` })),\n });\n if (p.isCancel(choices)) return \"User cancelled the plan.\";\n selectedSteps = (choices as number[]).map((i) => steps[i]);\n } else {\n selectedSteps = steps;\n }\n }\n\n const results: string[] = [];\n const s = p.spinner();\n for (const step of selectedSteps) {\n s.start(`Running: ${formatStepLabel(step)}...`);\n try {\n await executeStep(step);\n s.stop(pc.green(`Done: ${formatStepLabel(step)}`));\n results.push(`Completed: ${step.action} ${step.component ?? step.name ?? \"\"}`);\n } catch (err: any) {\n s.stop(pc.red(`Failed: ${formatStepLabel(step)}`));\n results.push(`Failed: ${step.action} ${step.component ?? step.name ?? \"\"} — ${err.message}`);\n }\n }\n return results.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// File operation handlers (exported for testing)\n// ---------------------------------------------------------------------------\n\nexport async function handleWriteFile(input: WriteFileInput, cwd: string): Promise<string> {\n const fullPath = resolve(cwd, input.path);\n if (!fullPath.startsWith(resolve(cwd))) {\n return `Rejected: path '${input.path}' would escape project directory`;\n }\n await mkdir(dirname(fullPath), { recursive: true });\n await fsWriteFile(fullPath, input.content, \"utf-8\");\n p.log.success(`Wrote ${pc.cyan(input.path)}${input.description ? ` — ${input.description}` : \"\"}`);\n return `Wrote ${input.path}`;\n}\n\nexport async function handleReadFile(input: ReadFileInput, cwd: string): Promise<string> {\n const fullPath = resolve(cwd, input.path);\n if (!fullPath.startsWith(resolve(cwd))) {\n return `Rejected: path '${input.path}' would escape project directory`;\n }\n try {\n return await fsReadFile(fullPath, \"utf-8\");\n } catch {\n return `File not found: ${input.path}`;\n }\n}\n\nexport async function handleListFiles(input: ListFilesInput, cwd: string): Promise<string> {\n const searchDir = input.directory ? join(cwd, input.directory) : cwd;\n try {\n const entries = await readdir(searchDir, { recursive: true });\n const filtered = entries.filter((e) => {\n if (input.pattern.startsWith(\"*.\")) {\n const ext = input.pattern.slice(1);\n return String(e).endsWith(ext);\n }\n return true;\n });\n return filtered.length > 0 ? `Files found:\\n${filtered.join(\"\\n\")}` : \"No files found matching the pattern.\";\n } catch {\n return `Directory not found: ${input.directory ?? \".\"}`;\n }\n}\n\nexport async function handleUpdateEnv(input: UpdateEnvInput, cwd: string): Promise<string> {\n const value = await p.password({ message: `Enter ${input.key} (${input.description}):` });\n if (p.isCancel(value) || !value) return \"User cancelled.\";\n return handleUpdateEnvDirect(input, cwd, value);\n}\n\nexport async function handleUpdateEnvDirect(input: UpdateEnvInput, cwd: string, value: string): Promise<string> {\n const envPath = join(cwd, \".env\");\n let existing = \"\";\n try { existing = await fsReadFile(envPath, \"utf-8\"); } catch {}\n\n const lines = existing.split(\"\\n\");\n const keyIndex = lines.findIndex((l) => l.startsWith(`${input.key}=`));\n\n let newContent: string;\n if (keyIndex >= 0) {\n lines[keyIndex] = `${input.key}=${value}`;\n newContent = lines.join(\"\\n\");\n } else {\n newContent = existing + (existing && !existing.endsWith(\"\\n\") ? \"\\n\" : \"\") + `${input.key}=${value}\\n`;\n }\n\n await fsWriteFile(envPath, newContent, \"utf-8\");\n p.log.success(`Set ${pc.cyan(input.key)} in .env`);\n return `Successfully set ${input.key} in .env`;\n}\n\n// ---------------------------------------------------------------------------\n// Tool call dispatcher\n// ---------------------------------------------------------------------------\n\nasync function handleToolCalls(toolCalls: ToolCall[], cwd: string): Promise<ToolResult[]> {\n const results: ToolResult[] = [];\n for (const call of toolCalls) {\n let result: string;\n try {\n switch (call.name) {\n case \"askUser\":\n result = await handleAskUser(call.input as { items: AskUserItem[] });\n break;\n case \"createPlan\":\n result = await handleCreatePlan(call.input as ChatPlan, cwd);\n break;\n case \"writeFile\":\n result = await handleWriteFile(call.input as WriteFileInput, cwd);\n break;\n case \"readFile\":\n result = await handleReadFile(call.input as ReadFileInput, cwd);\n break;\n case \"listFiles\":\n result = await handleListFiles(call.input as ListFilesInput, cwd);\n break;\n case \"updateEnv\":\n result = await handleUpdateEnv(call.input as UpdateEnvInput, cwd);\n break;\n default:\n result = `Unknown tool: ${call.name}`;\n }\n } catch (err: any) {\n result = `Error executing ${call.name}: ${err.message ?? \"Unknown error\"}`;\n }\n results.push({ toolCallId: call.id, result });\n }\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Compaction\n// ---------------------------------------------------------------------------\n\nasync function compactConversation(messages: ChatMessage[], serviceUrl: string): Promise<void> {\n try {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (process.env.KITN_API_KEY) headers[\"Authorization\"] = `Bearer ${process.env.KITN_API_KEY}`;\n\n const res = await fetch(`${serviceUrl}/api/chat/compact`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({ messages }),\n });\n\n if (res.ok) {\n const data = await res.json() as { summary: string };\n const compacted = applyCompaction(messages, data.summary);\n messages.length = 0;\n messages.push(...compacted);\n }\n } catch {\n // Compaction is best-effort; if it fails, continue with full history\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main command\n// ---------------------------------------------------------------------------\n\nexport async function chatCommand(message: string | undefined, opts?: { url?: string }): Promise<void> {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n p.intro(pc.bold(\"kitn assistant\"));\n\n // If no message, prompt for one\n if (!message) {\n const input = await p.text({\n message: \"What would you like to do?\",\n placeholder: \"e.g., I want to build a weather agent\",\n });\n if (p.isCancel(input) || !input) { p.cancel(\"Cancelled.\"); return; }\n message = input;\n }\n\n // Gather project context\n const s = p.spinner();\n s.start(\"Gathering project context...\");\n\n let registryIndex: unknown;\n let installed: string[];\n let globalRegistryIndex: GlobalRegistryEntry[] | undefined;\n\n try {\n const configuredNamespaces = Object.keys(config.registries);\n const fetcher = new RegistryFetcher(config.registries);\n const [indices, globalEntries, lock] = await Promise.all([\n Promise.all(\n configuredNamespaces.map(async (ns) => {\n try {\n return await fetcher.fetchIndex(ns);\n } catch {\n return null;\n }\n }),\n ),\n fetchGlobalRegistries(configuredNamespaces),\n readLock(cwd),\n ]);\n registryIndex = indices\n .filter(Boolean)\n .flatMap((index: any) => (index.items ?? []).map((item: any) => ({\n name: item.name,\n type: item.type,\n description: item.description,\n registryDependencies: item.registryDependencies,\n })));\n installed = Object.keys(lock);\n globalRegistryIndex = globalEntries.length > 0 ? globalEntries : undefined;\n } catch {\n s.stop(pc.red(\"Failed to gather context\"));\n p.log.error(\"Could not read project context.\");\n process.exit(1);\n }\n s.stop(\"Context gathered\");\n\n // Initialize conversation\n const messages: ChatMessage[] = [{ role: \"user\", content: message }];\n const serviceUrl = await resolveServiceUrl(opts?.url, config.chatService);\n const metadata: Record<string, unknown> = { registryIndex, installed };\n if (globalRegistryIndex) metadata.globalRegistryIndex = globalRegistryIndex;\n\n let totalTokens = 0;\n let lastInputTokens = 0;\n const sessionStart = Date.now();\n const MAX_PROMPT_TOKENS = 100_000;\n\n // Agentic loop\n while (true) {\n const turnStart = Date.now();\n\n // Check for compaction — use last turn's input tokens (represents full context size)\n if (shouldCompact(lastInputTokens, MAX_PROMPT_TOKENS)) {\n s.start(\"Compacting conversation...\");\n await compactConversation(messages, serviceUrl);\n s.stop(pc.dim(\"Conversation compacted.\"));\n }\n\n s.start(\"Thinking...\");\n\n // Call service\n let response: ChatServiceResponse;\n try {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (process.env.KITN_API_KEY) headers[\"Authorization\"] = `Bearer ${process.env.KITN_API_KEY}`;\n\n const res = await fetch(`${serviceUrl}/api/chat`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(buildServicePayload(messages, metadata)),\n });\n\n if (!res.ok) {\n s.stop(pc.red(\"Request failed\"));\n p.log.error(`Chat service returned ${res.status}: ${res.statusText}`);\n break;\n }\n response = await res.json() as ChatServiceResponse;\n } catch (err: any) {\n s.stop(pc.red(\"Connection failed\"));\n p.log.error(`Could not reach chat service at ${serviceUrl}. ${err.message ?? \"\"}`);\n break;\n }\n\n const elapsed = Date.now() - turnStart;\n totalTokens += response.usage.outputTokens;\n lastInputTokens = response.usage.inputTokens;\n\n // Handle rejected\n if ((response as any).rejected) {\n s.stop(\"Done\");\n p.log.warn((response as any).text ?? \"Request was rejected.\");\n break;\n }\n\n // If no tool calls — just text, conversation ends\n if (!hasToolCalls(response)) {\n s.stop(`Done ${pc.dim(`(${formatElapsed(elapsed)} | ${formatTokens(response.usage.outputTokens)} tokens)`)}`);\n if (response.message.content) p.log.message(response.message.content);\n break;\n }\n\n s.stop(`${pc.dim(`(${formatElapsed(elapsed)} | ${formatTokens(response.usage.outputTokens)} tokens)`)}`);\n\n // Append assistant message to history\n messages.push({\n role: \"assistant\",\n content: response.message.content,\n toolCalls: response.message.toolCalls,\n });\n\n // Handle each tool call\n const toolResults = await handleToolCalls(response.message.toolCalls!, cwd);\n\n // Append tool results to history\n messages.push({ role: \"tool\", toolResults });\n }\n\n const totalElapsed = Date.now() - sessionStart;\n p.outro(pc.green(\"Done! \") + pc.dim(formatSessionStats(totalElapsed, totalTokens)));\n}\n","import { Command } from \"commander\";\nimport { startUpdateCheck } from \"./utils/update-check.js\";\n\ndeclare const __CLI_VERSION__: string;\nconst VERSION = typeof __CLI_VERSION__ !== \"undefined\" ? __CLI_VERSION__ : \"0.0.0-dev\";\n\nconst printUpdateNotice = startUpdateCheck(VERSION);\n\nconst program = new Command()\n .name(\"kitn\")\n .description(\"Install AI agent components from the kitn registry\")\n .version(VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Initialize kitn in your project\")\n .option(\"-r, --runtime <runtime>\", \"runtime to use (bun, node, deno)\")\n .option(\"-f, --framework <framework>\", \"HTTP framework (hono, hono-openapi, elysia)\")\n .option(\"-b, --base <path>\", \"base directory for components (default: src/ai)\")\n .option(\"-y, --yes\", \"accept all defaults without prompting\")\n .action(async (opts) => {\n const { initCommand } = await import(\"./commands/init.js\");\n await initCommand(opts);\n });\n\nprogram\n .command(\"add\")\n .alias(\"install\")\n .description(\"Add components from the registry (supports type-first: kitn add agent <name>)\")\n .argument(\"[components...]\", \"component names or type followed by names\")\n .option(\"-o, --overwrite\", \"overwrite existing files without prompting\")\n .option(\"-t, --type <type>\", \"filter by component type during resolution\")\n .option(\"-y, --yes\", \"skip confirmation prompt\")\n .action(async (components: string[], opts) => {\n const { addCommand } = await import(\"./commands/add.js\");\n await addCommand(components, opts);\n });\n\nprogram\n .command(\"list\")\n .argument(\"[type]\", \"filter by type (agents, tools, skills, storages, packages)\")\n .description(\"List available and installed components\")\n .option(\"-i, --installed\", \"only show installed components\")\n .option(\"-t, --type <type>\", \"filter by type (agent, tool, skill, storage, package)\")\n .option(\"-r, --registry <namespace>\", \"only show components from this registry\")\n .option(\"-v, --verbose\", \"show version numbers\")\n .action(async (type, opts) => {\n const { listCommand } = await import(\"./commands/list.js\");\n await listCommand(type, opts);\n });\n\nprogram\n .command(\"diff\")\n .description(\"Show differences between local and registry version\")\n .argument(\"<component>\", \"component name\")\n .action(async (component: string) => {\n const { diffCommand } = await import(\"./commands/diff.js\");\n await diffCommand(component);\n });\n\nprogram\n .command(\"remove\")\n .alias(\"uninstall\")\n .description(\"Remove an installed component\")\n .argument(\"[component]\", \"component name to remove (interactive if omitted)\")\n .action(async (component?: string) => {\n const { removeCommand } = await import(\"./commands/remove.js\");\n await removeCommand(component);\n });\n\nprogram\n .command(\"update\")\n .description(\"Update installed components to latest registry version\")\n .argument(\"[components...]\", \"component names to update\")\n .action(async (components: string[]) => {\n const { updateCommand } = await import(\"./commands/update.js\");\n await updateCommand(components);\n });\n\nprogram\n .command(\"create\")\n .description(\"Scaffold a new kitn component\")\n .argument(\"<type>\", \"component type (agent, tool, skill, storage)\")\n .argument(\"<name>\", \"component name\")\n .action(async (type: string, name: string) => {\n const { createCommand } = await import(\"./commands/create.js\");\n await createCommand(type, name);\n });\n\nprogram\n .command(\"link\")\n .description(\"Wire a tool to an agent\")\n .argument(\"[type]\", \"component type (tool)\")\n .argument(\"[name]\", \"component name\")\n .option(\"--to <agent>\", \"target agent name\")\n .option(\"--as <key>\", \"key name in the tools object\")\n .action(async (type: string | undefined, name: string | undefined, opts) => {\n const { linkCommand } = await import(\"./commands/link.js\");\n await linkCommand(type, name, opts);\n });\n\nprogram\n .command(\"unlink\")\n .description(\"Unwire a tool from an agent\")\n .argument(\"[type]\", \"component type (tool)\")\n .argument(\"[name]\", \"component name\")\n .option(\"--from <agent>\", \"target agent name\")\n .action(async (type: string | undefined, name: string | undefined, opts) => {\n const { unlinkCommand } = await import(\"./commands/unlink.js\");\n await unlinkCommand(type, name, opts);\n });\n\nprogram\n .command(\"info\")\n .description(\"Show details about a component\")\n .argument(\"<component>\", \"component name (e.g. weather-agent, @acme/tool@1.0.0)\")\n .action(async (component: string) => {\n const { infoCommand } = await import(\"./commands/info.js\");\n await infoCommand(component);\n });\n\nprogram\n .command(\"check\")\n .description(\"Check for CLI updates\")\n .action(async () => {\n const { checkCommand } = await import(\"./commands/check.js\");\n await checkCommand(VERSION);\n });\n\nprogram\n .command(\"rules\")\n .description(\"Regenerate AI coding tool rules files\")\n .action(async () => {\n const { rulesCommand } = await import(\"./commands/rules.js\");\n await rulesCommand();\n });\n\nprogram\n .command(\"chat\")\n .description(\"AI-powered scaffolding assistant\")\n .argument(\"[message]\", \"What you want to do\")\n .option(\"-u, --url <url>\", \"Chat service URL\")\n .action(async (message: string | undefined, opts: { url?: string }) => {\n const { chatCommand } = await import(\"./commands/chat.js\");\n await chatCommand(message, opts);\n });\n\nconst registry = program\n .command(\"registry\")\n .description(\"Manage component registries\");\n\nregistry\n .command(\"add\")\n .description(\"Add a component registry\")\n .argument(\"<namespace>\", \"registry namespace (e.g. @myteam)\")\n .argument(\"<url>\", \"URL template with {type} and {name} placeholders\")\n .option(\"-o, --overwrite\", \"overwrite if namespace already exists\")\n .option(\"--homepage <url>\", \"registry homepage URL\")\n .option(\"--description <text>\", \"short description of the registry\")\n .action(async (namespace: string, url: string, opts) => {\n const { registryAddCommand } = await import(\"./commands/registry.js\");\n await registryAddCommand(namespace, url, opts);\n });\n\nregistry\n .command(\"remove\")\n .description(\"Remove a component registry\")\n .argument(\"<namespace>\", \"registry namespace to remove (e.g. @myteam)\")\n .option(\"-f, --force\", \"allow removing the default @kitn registry\")\n .action(async (namespace: string, opts) => {\n const { registryRemoveCommand } = await import(\"./commands/registry.js\");\n await registryRemoveCommand(namespace, opts);\n });\n\nregistry\n .command(\"list\")\n .description(\"List all configured registries\")\n .action(async () => {\n const { registryListCommand } = await import(\"./commands/registry.js\");\n await registryListCommand();\n });\n\nconst config = program\n .command(\"config\")\n .description(\"Manage user-level configuration\");\n\nconfig\n .command(\"set\")\n .description(\"Set a config value\")\n .argument(\"<key>\", \"config key (chat-url, api-key)\")\n .argument(\"<value>\", \"config value\")\n .action(async (key: string, value: string) => {\n const { configSetCommand } = await import(\"./commands/config.js\");\n await configSetCommand(key, value);\n });\n\nconfig\n .command(\"get\")\n .description(\"Get a config value\")\n .argument(\"<key>\", \"config key\")\n .action(async (key: string) => {\n const { configGetCommand } = await import(\"./commands/config.js\");\n await configGetCommand(key);\n });\n\nconfig\n .command(\"list\")\n .description(\"List all config values\")\n .action(async () => {\n const { configListCommand } = await import(\"./commands/config.js\");\n await configListCommand();\n });\n\nawait program.parseAsync();\n// Skip the deferred update notice if `kitn check` already handled it\nconst ranCommand = program.args[0];\nif (ranCommand !== \"check\") {\n printUpdateNotice();\n}\n"],"mappings":"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","names":["join","readFile","writeFile","join","config","readFile","writeFile","join","text","config","resolve","readFile","writeFile","mkdir","access","pc","readFile","writeFile","access","join","config","join","z","componentType","p","pc","join","dirname","readFile","writeFile","mkdir","unlink","relative","config","fetcher","s","baseDir","barrelPath","barrelDir","updated","confirm","writeFile","mkdir","readFile","join","dirname","config","p","pc","mkdir","readFile","writeFile","join","confirm","config","p","pc","config","p","join","config","p","pc","join","relative","dirname","unlink","readFile","writeFile","existsSync","config","entry","p","config","p","pc","join","relative","existsSync","readFile","writeFile","mkdir","config","readFile","join","relative","config","filePath","source","exportName","agentName","newBlock","p","pc","readFile","writeFile","config","p","pc","readFile","writeFile","basename","config","p","pc","config","execSync","p","pc","p","pc","config","p","pc","readFile","writeFile","mkdir","join","homedir","existsSync","CONFIG_FILE","config","init_config","p","pc","config","p","pc","mkdir","readdir","join","dirname","registryAddCommand","addCommand","createCommand","linkCommand","removeCommand","unlinkCommand","confirm","config","init_config","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand","createCommand","linkCommand","unlinkCommand","infoCommand","checkCommand","rulesCommand","chatCommand","registryAddCommand","registryRemoveCommand","registryListCommand","configSetCommand","configGetCommand","configListCommand"]}
|