@kitnai/cli 0.1.12 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @kitnai/cli
2
2
 
3
- CLI for installing AI agent components from the kitn registry.
3
+ CLI for installing AI agent components from kitn registries.
4
4
 
5
5
  ## Installation
6
6
 
@@ -38,7 +38,7 @@ After answering, the CLI automatically installs the core engine and HTTP routes
38
38
 
39
39
  ### `kitn add [components...]`
40
40
 
41
- Add components from the registry. Resolves `registryDependencies` transitively.
41
+ Add components from a registry. Resolves `registryDependencies` transitively.
42
42
 
43
43
  ```bash
44
44
  # Add a single component
@@ -47,6 +47,12 @@ kitn add weather-agent
47
47
  # Add multiple components
48
48
  kitn add weather-agent hackernews-tool eli5
49
49
 
50
+ # Add from a third-party registry
51
+ kitn add @acme/custom-agent
52
+
53
+ # Add a specific version
54
+ kitn add weather-agent@1.2.0
55
+
50
56
  # Overwrite existing files without prompting
51
57
  kitn add weather-agent --overwrite
52
58
 
@@ -54,6 +60,10 @@ kitn add weather-agent --overwrite
54
60
  kitn add --type agent
55
61
  ```
56
62
 
63
+ Components from the default `@kitn` registry don't need a namespace prefix. Components from other registries use `@namespace/name` format.
64
+
65
+ Third-party components install into a namespace subdirectory (e.g. `src/ai/agents/acme/custom-agent.ts`).
66
+
57
67
  **Flags:**
58
68
 
59
69
  | Flag | Description |
@@ -70,20 +80,24 @@ After installation, the CLI:
70
80
 
71
81
  ### `kitn list`
72
82
 
73
- List available and installed components from the registry.
83
+ List available and installed components from configured registries.
74
84
 
75
85
  ```bash
76
86
  # List all components from all registries
77
87
  kitn list
78
88
 
79
- # Only show installed components
80
- kitn list --installed
81
-
82
89
  # Filter by type
90
+ kitn list agents
83
91
  kitn list --type tool
84
92
 
93
+ # Only show installed components
94
+ kitn list --installed
95
+
85
96
  # Filter by registry
86
- kitn list --registry @myteam
97
+ kitn list --registry @acme
98
+
99
+ # Show version numbers
100
+ kitn list --verbose
87
101
  ```
88
102
 
89
103
  **Flags:**
@@ -91,10 +105,9 @@ kitn list --registry @myteam
91
105
  | Flag | Description |
92
106
  |------|-------------|
93
107
  | `-i, --installed` | Only show installed components |
94
- | `-t, --type <type>` | Filter by type (`agent`, `tool`, `skill`, `storage`) |
108
+ | `-t, --type <type>` | Filter by type (`agent`, `tool`, `skill`, `storage`, `package`) |
95
109
  | `-r, --registry <namespace>` | Only show components from this registry |
96
-
97
- Shows installed version, latest registry version, and an update indicator when a newer version is available.
110
+ | `-v, --verbose` | Show version numbers |
98
111
 
99
112
  ### `kitn diff <component>`
100
113
 
@@ -128,40 +141,80 @@ kitn update weather-agent weather-tool
128
141
  kitn update
129
142
  ```
130
143
 
131
- This re-fetches components from the registry and applies the same conflict resolution as `kitn add --overwrite`.
144
+ Re-fetches components from the registry and applies the same conflict resolution as `kitn add --overwrite`.
132
145
 
133
146
  ### `kitn info <component>`
134
147
 
135
148
  Show details about a component from the registry.
136
149
 
137
150
  ```bash
151
+ # Default registry
138
152
  kitn info weather-agent
153
+
154
+ # With namespace and version
155
+ kitn info @acme/tool@1.0.0
139
156
  ```
140
157
 
141
158
  Displays the component's description, type, version, dependencies, files, and changelog.
142
159
 
160
+ ### `kitn create <type> <name>`
161
+
162
+ Scaffold a new kitn component.
163
+
164
+ ```bash
165
+ kitn create agent my-agent
166
+ kitn create tool my-tool
167
+ ```
168
+
169
+ Creates a new component directory with a manifest and template source file.
170
+
171
+ ### `kitn build`
172
+
173
+ Build registry JSON from components that have `registry.json` manifests.
174
+
175
+ ```bash
176
+ # Scan from current directory
177
+ kitn build
178
+
179
+ # Specify directories and output
180
+ kitn build src/components --output dist/r
181
+ ```
182
+
143
183
  ### `kitn registry`
144
184
 
145
185
  Manage component registries.
146
186
 
147
187
  ```bash
148
- # Add a custom registry
188
+ # Add a registry with metadata
189
+ kitn registry add @acme https://acme.dev/r/{type}/{name}.json \
190
+ --homepage https://acme.dev \
191
+ --description "Acme AI components"
192
+
193
+ # Add a plain registry (URL only)
149
194
  kitn registry add @myteam https://registry.myteam.dev/r/{type}/{name}.json
150
195
 
151
- # List configured registries
196
+ # List configured registries (shows URL, homepage, description)
152
197
  kitn registry list
153
198
 
154
199
  # Remove a registry
155
200
  kitn registry remove @myteam
201
+
202
+ # Overwrite an existing registry
203
+ kitn registry add @myteam https://new-url.dev/r/{type}/{name}.json --overwrite
204
+
205
+ # Remove the default @kitn registry (requires --force)
206
+ kitn registry remove @kitn --force
156
207
  ```
157
208
 
158
209
  **Subcommands:**
159
210
 
160
211
  | Subcommand | Description |
161
212
  |------------|-------------|
162
- | `add <namespace> <url>` | Add a registry (`-o` to overwrite) |
163
- | `list` | List all configured registries |
164
- | `remove <namespace>` | Remove a registry (`-f` to remove `@kitn`) |
213
+ | `add <namespace> <url>` | Add a registry. Options: `-o` overwrite, `--homepage`, `--description` |
214
+ | `list` | List all configured registries with URLs and metadata |
215
+ | `remove <namespace>` | Remove a registry. `-f` required to remove `@kitn` |
216
+
217
+ The URL template uses `{type}` and `{name}` placeholders. Components are fetched by replacing these with the component's type directory (`agents`, `tools`, `skills`, `storage`, `package`) and name. The registry index is fetched by replacing `{type}/{name}.json` with `registry.json`.
165
218
 
166
219
  ## Configuration
167
220
 
@@ -182,7 +235,11 @@ Created by `kitn init`. Controls where components are installed and which regist
182
235
  "storage": "src/ai/storage"
183
236
  },
184
237
  "registries": {
185
- "@kitn": "https://kitn-ai.github.io/registry/r/{type}/{name}.json"
238
+ "@kitn": {
239
+ "url": "https://kitn-ai.github.io/kitn/r/{type}/{name}.json",
240
+ "homepage": "https://kitn.ai",
241
+ "description": "Official kitn AI agent components"
242
+ }
186
243
  }
187
244
  }
188
245
  ```
@@ -192,18 +249,27 @@ Created by `kitn init`. Controls where components are installed and which regist
192
249
  | `runtime` | `bun`, `node`, or `deno` |
193
250
  | `framework` | `hono` |
194
251
  | `aliases` | Directory paths for each component type |
195
- | `registries` | Named registries with URL templates |
252
+ | `registries` | Named registries each value is a URL string or an object with `url`, `homepage`, `description` |
196
253
  | `installed` | Auto-managed tracking of installed components (don't edit manually) |
197
254
 
198
- ### Custom Registries
255
+ ### Registry entries
199
256
 
200
- Add custom registries via the CLI or by editing `kitn.json` directly:
257
+ Registry entries can be a plain URL string or a rich object:
201
258
 
202
- ```bash
203
- kitn registry add @myteam https://registry.myteam.dev/r/{type}/{name}.json
259
+ ```json
260
+ {
261
+ "registries": {
262
+ "@kitn": {
263
+ "url": "https://kitn-ai.github.io/kitn/r/{type}/{name}.json",
264
+ "homepage": "https://kitn.ai",
265
+ "description": "Official kitn AI agent components"
266
+ },
267
+ "@myteam": "https://registry.myteam.dev/r/{type}/{name}.json"
268
+ }
269
+ }
204
270
  ```
205
271
 
206
- The URL template uses `{type}` and `{name}` placeholders. Components are fetched by replacing these with the component's type directory (`agents`, `tools`, `skills`, `storage`) and name. The registry index is fetched by replacing `{type}/{name}.json` with `registry.json` in the URL template.
272
+ Both formats are supported. The CLI stores a rich object when `--homepage` or `--description` is provided, and a plain string otherwise.
207
273
 
208
274
  ## Package Manager Detection
209
275
 
@@ -219,3 +285,7 @@ The CLI automatically detects your package manager by checking for lockfiles in
219
285
  Components are **source code**, not packages. `kitn add` copies TypeScript files directly into your project. You own the code and can modify it freely.
220
286
 
221
287
  The CLI tracks what it installed in `kitn.json` under `installed`, storing file paths and content hashes. This enables `kitn diff` to detect local changes and `kitn update` to apply registry updates.
288
+
289
+ ### Hosting your own registry
290
+
291
+ Any HTTP server that serves JSON files matching the registry schema can be a kitn registry. See the [registry documentation](https://github.com/kitn-ai/registry) for the schema specification and instructions on registering your registry in the public directory.
package/dist/index.js CHANGED
@@ -979,7 +979,7 @@ async function initCommand() {
979
979
  },
980
980
  registries: {
981
981
  "@kitn": {
982
- url: "https://kitn-ai.github.io/registry/r/{type}/{name}.json",
982
+ url: "https://kitn-ai.github.io/kitn/r/{type}/{name}.json",
983
983
  homepage: "https://kitn.ai",
984
984
  description: "Official kitn AI agent components"
985
985
  }
@@ -2247,7 +2247,7 @@ function startUpdateCheck(currentVersion) {
2247
2247
  }
2248
2248
 
2249
2249
  // src/index.ts
2250
- var VERSION = true ? "0.1.12" : "0.0.0-dev";
2250
+ var VERSION = true ? "0.1.14" : "0.0.0-dev";
2251
2251
  var printUpdateNotice = startUpdateCheck(VERSION);
2252
2252
  var program = new Command().name("kitn").description("Install AI agent components from the kitn registry").version(VERSION);
2253
2253
  program.command("init").description("Initialize kitn in your project").action(async () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/config.ts","../src/installers/tsconfig-patcher.ts","../src/installers/barrel-manager.ts","../src/utils/detect.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/registry/schema.ts","../src/commands/add.ts","../src/commands/init.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/registry/build-output.ts","../src/registry/builder.ts","../src/commands/build.ts","../src/commands/create.ts","../src/commands/info.ts","../src/commands/registry.ts","../src/index.ts","../src/utils/update-check.ts"],"sourcesContent":["import { readFile, writeFile } 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\"]);\ntype ComponentType = z.infer<typeof componentType>;\n\nconst installedComponentSchema = z.object({\n registry: z.string().optional(),\n version: z.string(),\n installedAt: z.string(),\n files: z.array(z.string()),\n hash: z.string(),\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 configSchema = z.object({\n $schema: z.string().optional(),\n runtime: z.enum([\"bun\", \"node\", \"deno\"]),\n framework: z.enum([\"hono\", \"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 }),\n registries: z.record(z.string(), registryValueSchema),\n installed: z.record(z.string(), installedComponentSchema).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 CONFIG_FILE = \"kitn.json\";\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\ntype RequiredAliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\";\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};\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 base = config.aliases[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 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 { 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","import type { RegistryItem, RegistryIndex } from \"./schema.js\";\nimport type { RegistryEntry } from \"../utils/config.js\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"package\";\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\";\n\nconst KNOWN_TYPES: readonly AliasKey[] = [\"agents\", \"tools\", \"skills\", \"storage\"];\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};\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<AliasKey, string>,\n): string {\n const sourceAliasKey = TYPE_TO_ALIAS_KEY[fileType];\n if (!sourceAliasKey) return content;\n\n const sourceDir = aliases[sourceAliasKey];\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 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 { z } from \"zod\";\n\nexport const componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\"]);\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 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 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 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};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig, writeConfig, getInstallPath } 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 } from \"../installers/dep-installer.js\";\nimport { collectEnvVars, handleEnvVars } from \"../installers/env-writer.js\";\nimport { rewriteKitnImports } from \"../installers/import-rewriter.js\";\nimport { createBarrelFile, addImportToBarrel } from \"../installers/barrel-manager.js\";\nimport { contentHash } from \"../utils/hash.js\";\nimport { parseComponentRef, type ComponentRef } from \"../utils/parse-ref.js\";\nimport { typeToDir, type RegistryItem, type ComponentType } from \"../registry/schema.js\";\nimport { existsSync } from \"fs\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { relative } from \"path\";\n\ninterface AddOptions {\n overwrite?: boolean;\n type?: string;\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 if (components.length === 0) {\n p.log.error(\"Please specify at least one component to add.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" to framework-specific package name, then parse refs\n const resolvedComponents = components.map((c) => {\n if (c === \"routes\") {\n const fw = config.framework ?? \"hono\";\n return fw;\n }\n return c;\n });\n\n const refs = resolvedComponents.map(parseComponentRef);\n const fetcher = new RegistryFetcher(config.registries);\n\n const s = p.spinner();\n s.start(\"Resolving dependencies...\");\n\n let resolved: RegistryItem[];\n try {\n resolved = await resolveDependencies(resolvedComponents, 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 const indexItem = index.items.find((i) => i.name === name);\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 p.log.info(\"Components to install:\");\n for (const item of resolved) {\n const isExplicit = resolvedComponents.includes(item.name) || components.includes(item.name);\n const label = isExplicit ? item.name : `${item.name} ${pc.dim(\"(dependency)\")}`;\n p.log.message(` ${pc.cyan(label)}`);\n }\n\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n const allDeps: string[] = [];\n for (const item of resolved) {\n if (item.dependencies) allDeps.push(...item.dependencies);\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 installed\n const installed = config.installed ?? {};\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 installed[installedKey] = {\n registry: ref.namespace,\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 };\n config.installed = installed;\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 }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\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 installed\n const installed = config.installed ?? {};\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 installed[installedKey] = {\n registry: ns,\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 };\n config.installed = installed;\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\"]);\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 \"./${baseDir}/plugin.js\";`,\n ``,\n `app.route(\"/api\", ai.router);`,\n `await ai.initialize();`,\n ].join(\"\\n\"),\n \"Add this to your server entry point\",\n );\n }\n }\n\n await writeConfig(cwd, config);\n\n const uniqueDeps = [...new Set(allDeps)];\n if (uniqueDeps.length > 0) {\n const pm = await detectPackageManager(cwd);\n if (pm) {\n s.start(`Installing ${uniqueDeps.length} npm dependenc${uniqueDeps.length === 1 ? \"y\" : \"ies\"}...`);\n try {\n installDependencies(pm, uniqueDeps, 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(`Created ${created.length} file(s):`);\n for (const f of created) p.log.message(` ${pc.green(\"+\")} ${f}`);\n }\n if (updated.length > 0) {\n p.log.success(`Updated ${updated.length} file(s):`);\n for (const f of updated) p.log.message(` ${pc.yellow(\"~\")} ${f}`);\n }\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s):`);\n for (const f of skipped) p.log.message(` ${pc.dim(\"-\")} ${f}`);\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 installedNames = new Set(resolved.map((r) => r.name));\n const hints: string[] = [];\n\n if (installedNames.has(\"core\") && !installedNames.has(config.framework ?? \"hono\")) {\n hints.push(`Run ${pc.cyan(`kitn add routes`)} to install the HTTP adapter.`);\n }\n\n const fw = config.framework ?? \"hono\";\n if (installedNames.has(fw) || (installedNames.has(\"core\") && installedNames.has(fw))) {\n hints.push(`Configure your AI provider in ${pc.bold(baseDir + \"/plugin.ts\")}, then add to your server:`);\n hints.push(\"\");\n hints.push(pc.dim(` import { ai } from \"./${baseDir}/plugin.js\";`));\n hints.push(pc.dim(``));\n hints.push(pc.dim(` app.route(\"/api\", ai.router);`));\n hints.push(pc.dim(` await ai.initialize();`));\n hints.push(\"\");\n }\n\n if (hints.length > 0) {\n p.log.message(pc.bold(\"\\nNext steps:\"));\n for (const hint of hints) p.log.message(hint);\n }\n\n p.outro(pc.green(\"Done!\"));\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { mkdir, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\nimport { patchProjectTsconfig } from \"../installers/tsconfig-patcher.js\";\nimport { createBarrelFile } from \"../installers/barrel-manager.js\";\nimport { addCommand } from \"./add.js\";\n\nconst PLUGIN_TEMPLATE = `import { createAIPlugin } from \"@kitn/hono-routes\";\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\nexport async function initCommand() {\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 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 const runtime = 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(runtime)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\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\n const baseDir = base as string;\n const config = {\n runtime: runtime as \"bun\" | \"node\" | \"deno\",\n framework: \"hono\" as const,\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: \"https://kitn-ai.github.io/registry/r/{type}/{name}.json\",\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/hono-routes, 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 + Hono routes\n p.log.info(\"Installing core engine and routes...\");\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, PLUGIN_TEMPLATE);\n\n p.log.success(`Created ${pc.bold(baseDir + \"/plugin.ts\")} — configure your AI provider there`);\n\n p.note(\n [\n `import { ai } from \"./${baseDir}/plugin.js\";`,\n ``,\n `app.route(\"/api\", ai.router);`,\n `await ai.initialize();`,\n ].join(\"\\n\"),\n \"Add this to your server entry point:\",\n );\n\n p.outro(\"Done!\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig } from \"../utils/config.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\nconst 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};\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 ? TYPE_ALIASES[rawType.toLowerCase()] : 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 = config.installed ?? {};\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 } 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 package name\n const input = componentName === \"routes\" ? (config.framework ?? \"hono\") : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in installed — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = config.installed?.[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 } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { removeImportFromBarrel } from \"../installers/barrel-manager.js\";\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 // Resolve \"routes\" alias to framework-specific package name\n const input = componentName === \"routes\" ? (config.framework ?? \"hono\") : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in installed — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = config.installed?.[installedKey];\n if (!installed) {\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 ${installed.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 const deleted: string[] = [];\n for (const filePath of installed.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 // Check if the file is in a barrel-eligible directory\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 config.installed![installedKey];\n if (Object.keys(config.installed!).length === 0) {\n delete config.installed;\n }\n await writeConfig(cwd, config);\n\n if (deleted.length > 0) {\n p.log.success(`Removed ${ref.name}:`);\n for (const f of deleted) p.log.message(` ${pc.red(\"-\")} ${f}`);\n }\n}\n","import { addCommand } from \"./add.js\";\nimport { readConfig } 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 installed = config.installed;\n if (!installed || Object.keys(installed).length === 0) {\n p.log.info(\"No installed components to update.\");\n return;\n }\n\n components = Object.keys(installed);\n }\n\n await addCommand(components, { overwrite: true });\n}\n","import { readdir, stat, writeFile, mkdir, access, readFile } from \"fs/promises\";\nimport { join, resolve, relative } from \"path\";\nimport { typeToDir, type RegistryItem, type RegistryIndex } from \"./schema.js\";\n\n/** Directories to skip when walking the full tree */\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \"dist\",\n \".git\",\n \"r\",\n \"test\",\n \"tests\",\n \".claude\",\n]);\n\n/** Check whether a file exists */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Walk a directory tree recursively, collecting directories that contain registry.json.\n * Skips directories in the SKIP_DIRS set.\n */\nasync function walkForRegistryJson(dir: string): Promise<string[]> {\n const results: string[] = [];\n\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n // Check if this directory itself has registry.json\n if (await fileExists(join(dir, \"registry.json\"))) {\n results.push(dir);\n // Don't recurse into component directories — they won't nest further\n return results;\n }\n\n // Recurse into subdirectories\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIP_DIRS.has(entry.name)) {\n const subResults = await walkForRegistryJson(join(dir, entry.name));\n results.push(...subResults);\n }\n }\n\n return results;\n}\n\n/**\n * Discover directories containing registry.json files.\n *\n * If `paths` is provided, each path is checked:\n * - If it directly contains registry.json, it's included.\n * - Otherwise, its immediate subdirectories are checked for registry.json.\n *\n * If `paths` is not provided, the full directory tree from `cwd` is walked,\n * skipping directories in SKIP_DIRS.\n *\n * @returns Array of absolute directory paths containing registry.json.\n */\nexport async function scanForComponents(\n cwd: string,\n paths?: string[]\n): Promise<string[]> {\n const resolvedCwd = resolve(cwd);\n\n if (paths && paths.length > 0) {\n const results: string[] = [];\n\n for (const p of paths) {\n const absPath = resolve(resolvedCwd, p);\n\n // Check if this path directly contains registry.json\n if (await fileExists(join(absPath, \"registry.json\"))) {\n results.push(absPath);\n continue;\n }\n\n // Otherwise, scan one level of subdirectories\n let entries;\n try {\n entries = await readdir(absPath, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subDir = join(absPath, entry.name);\n if (await fileExists(join(subDir, \"registry.json\"))) {\n results.push(subDir);\n }\n }\n }\n }\n\n return results;\n }\n\n // No paths specified — walk the full tree\n return walkForRegistryJson(resolvedCwd);\n}\n\n/**\n * Extract version strings from versioned filenames like `weather@1.0.0.json`.\n */\nfunction parseVersionFromFilename(\n name: string,\n componentName: string\n): string | null {\n const prefix = `${componentName}@`;\n const suffix = \".json\";\n if (name.startsWith(prefix) && name.endsWith(suffix)) {\n return name.slice(prefix.length, -suffix.length);\n }\n return null;\n}\n\n/**\n * Write the built registry output to the output directory.\n *\n * For each item:\n * 1. Creates the type subdirectory (e.g., tools/, package/)\n * 2. Writes `<typeDir>/<name>.json` — latest version, always overwritten\n * 3. Writes `<typeDir>/<name>@<version>.json` — versioned copy, immutable (skipped if exists)\n * 4. Scans existing versioned files to collect all available versions\n *\n * After all items:\n * 5. Writes `registry.json` index with metadata (no file content)\n *\n * @returns `{ written, skipped }` arrays of relative file paths.\n */\nexport async function writeRegistryOutput(\n outputDir: string,\n items: RegistryItem[]\n): Promise<{ written: string[]; skipped: string[] }> {\n const written: string[] = [];\n const skipped: string[] = [];\n const resolvedOutput = resolve(outputDir);\n\n const indexItems: RegistryIndex[\"items\"] = [];\n\n for (const item of items) {\n const dir = typeToDir[item.type];\n const typeDir = join(resolvedOutput, dir);\n await mkdir(typeDir, { recursive: true });\n\n const itemJson = JSON.stringify(item, null, 2);\n\n // 1. Write latest version (always overwritten)\n const latestPath = join(typeDir, `${item.name}.json`);\n const latestRelative = `${dir}/${item.name}.json`;\n await writeFile(latestPath, itemJson, \"utf-8\");\n written.push(latestRelative);\n\n // 2. Write versioned copy (immutable)\n if (item.version) {\n const versionedFilename = `${item.name}@${item.version}.json`;\n const versionedPath = join(typeDir, versionedFilename);\n const versionedRelative = `${dir}/${versionedFilename}`;\n\n if (await fileExists(versionedPath)) {\n skipped.push(versionedRelative);\n } else {\n await writeFile(versionedPath, itemJson, \"utf-8\");\n written.push(versionedRelative);\n }\n }\n\n // 3. Scan for all versioned files to collect versions\n const versions: string[] = [];\n let entries: string[];\n try {\n entries = await readdir(typeDir);\n } catch {\n entries = [];\n }\n\n for (const filename of entries) {\n const ver = parseVersionFromFilename(filename, item.name);\n if (ver) {\n versions.push(ver);\n }\n }\n\n // Sort versions (simple string sort is fine for semver with consistent formatting)\n versions.sort();\n\n // 4. Build index item (no file content)\n indexItems.push({\n name: item.name,\n type: item.type,\n description: item.description,\n ...(item.registryDependencies &&\n item.registryDependencies.length > 0 && {\n registryDependencies: item.registryDependencies,\n }),\n ...(item.categories &&\n item.categories.length > 0 && { categories: item.categories }),\n ...(item.version && { version: item.version }),\n ...(versions.length > 0 && { versions }),\n ...(item.updatedAt && { updatedAt: item.updatedAt }),\n });\n }\n\n // 5. Write registry.json index\n const index: RegistryIndex = {\n version: \"1\",\n items: indexItems,\n };\n\n const indexPath = join(resolvedOutput, \"registry.json\");\n await writeFile(indexPath, JSON.stringify(index, null, 2), \"utf-8\");\n written.push(\"registry.json\");\n\n return { written, skipped };\n}\n","import { readFile, readdir } from \"fs/promises\";\nimport { join, relative } from \"path\";\nimport {\n componentConfigSchema,\n registryItemSchema,\n typeToDir,\n type ComponentConfig,\n type RegistryItem,\n} from \"./schema.js\";\n\n/** Build tooling devDependencies to exclude from the output */\nconst EXCLUDED_DEV_DEPS = new Set([\n \"typescript\",\n \"@types/bun\",\n \"@types/node\",\n \"tsup\",\n \"vitest\",\n \"jest\",\n \"@types/jest\",\n]);\n\nfunction isExcludedDevDep(name: string): boolean {\n return EXCLUDED_DEV_DEPS.has(name) || name.startsWith(\"@types/\");\n}\n\n/** Strip @scope/ prefix from a package name (e.g., @kitnai/core -> core) */\nfunction stripScope(name: string): string {\n const match = name.match(/^@[^/]+\\/(.+)$/);\n return match ? match[1] : name;\n}\n\n/** Recursively read all .ts files from a directory */\nasync function readTsFiles(\n dir: string,\n baseDir: string,\n exclude: string[]\n): Promise<{ relativePath: string; content: string }[]> {\n const results: { relativePath: string; content: string }[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relPath = relative(baseDir, fullPath);\n\n if (entry.isDirectory()) {\n const nested = await readTsFiles(fullPath, baseDir, exclude);\n results.push(...nested);\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n if (exclude.includes(relPath)) {\n continue;\n }\n const content = await readFile(fullPath, \"utf-8\");\n results.push({ relativePath: relPath, content });\n }\n }\n\n return results;\n}\n\n/**\n * Build a RegistryItem from a component directory.\n *\n * Reads registry.json (required) + optional package.json + source files,\n * and produces a validated RegistryItem.\n */\nexport async function buildComponent(componentDir: string): Promise<RegistryItem> {\n // 1. Read and validate registry.json\n let rawConfig: string;\n try {\n rawConfig = await readFile(join(componentDir, \"registry.json\"), \"utf-8\");\n } catch {\n throw new Error(\n `No registry.json found in ${componentDir}. Every component must have a registry.json file.`\n );\n }\n\n let config: ComponentConfig;\n try {\n config = componentConfigSchema.parse(JSON.parse(rawConfig));\n } catch (err) {\n throw new Error(\n `Invalid registry.json in ${componentDir}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // 2. Try to read package.json (optional)\n let pkg: {\n name?: string;\n version?: string;\n description?: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n } | null = null;\n\n try {\n const rawPkg = await readFile(join(componentDir, \"package.json\"), \"utf-8\");\n pkg = JSON.parse(rawPkg);\n } catch {\n // No package.json, that's fine for standalone components\n }\n\n // 3. Resolve metadata by merging registry.json + package.json\n const name = config.name ?? (pkg?.name ? stripScope(pkg.name) : undefined);\n const version = config.version ?? pkg?.version;\n const description = config.description ?? pkg?.description;\n\n if (!name) {\n throw new Error(\n `Component in ${componentDir} is missing a name. Provide \"name\" in registry.json or have a package.json with a \"name\" field.`\n );\n }\n if (!description) {\n throw new Error(\n `Component in ${componentDir} is missing a description. Provide \"description\" in registry.json or have a package.json with a \"description\" field.`\n );\n }\n\n // Resolve dependencies from package.json if available\n let dependencies = config.dependencies;\n let devDependencies = config.devDependencies;\n\n if (pkg && !config.dependencies) {\n const deps: string[] = [];\n if (pkg.dependencies) {\n for (const [depName, depVersion] of Object.entries(pkg.dependencies)) {\n if (depVersion !== \"workspace:*\") {\n deps.push(depName);\n }\n }\n }\n if (pkg.peerDependencies) {\n for (const [depName, depVersion] of Object.entries(pkg.peerDependencies)) {\n if (depVersion !== \"workspace:*\") {\n deps.push(depName);\n }\n }\n }\n if (deps.length > 0) {\n dependencies = deps;\n }\n }\n\n if (pkg && !config.devDependencies) {\n const devDeps: string[] = [];\n if (pkg.devDependencies) {\n for (const depName of Object.keys(pkg.devDependencies)) {\n if (!isExcludedDevDep(depName)) {\n devDeps.push(depName);\n }\n }\n }\n if (devDeps.length > 0) {\n devDependencies = devDeps;\n }\n }\n\n // 4. Read source files\n const isPackage = config.type === \"kitn:package\";\n const dirPrefix = config.installDir ?? typeToDir[config.type];\n\n let files: { path: string; content: string; type: typeof config.type }[];\n\n if (isPackage) {\n // For packages: recursively read .ts files from src/ (or sourceDir override)\n const sourceDir = config.sourceDir ?? \"src\";\n const sourcePath = join(componentDir, sourceDir);\n const exclude = config.exclude ?? [];\n\n let tsFiles: { relativePath: string; content: string }[];\n try {\n tsFiles = await readTsFiles(sourcePath, sourcePath, exclude);\n } catch {\n throw new Error(\n `Cannot read source directory \"${sourceDir}\" in ${componentDir}. Make sure it exists.`\n );\n }\n\n files = tsFiles.map((f) => ({\n path: `${dirPrefix}/${f.relativePath}`,\n content: f.content,\n type: config.type,\n }));\n } else {\n // For standalone components: read files listed in the files array\n if (!config.files || config.files.length === 0) {\n throw new Error(\n `Component \"${name}\" (type: ${config.type}) has no \"files\" array in registry.json. Standalone components must list their source files.`\n );\n }\n\n files = await Promise.all(\n config.files.map(async (filePath) => {\n const fullPath = join(componentDir, filePath);\n let content: string;\n try {\n content = await readFile(fullPath, \"utf-8\");\n } catch {\n throw new Error(\n `Cannot read file \"${filePath}\" referenced in registry.json for component \"${name}\". Make sure the file exists at ${fullPath}.`\n );\n }\n return {\n path: `${dirPrefix}/${filePath}`,\n content,\n type: config.type,\n };\n })\n );\n }\n\n // 5. Build the RegistryItem\n const item: RegistryItem = {\n name,\n type: config.type,\n description,\n files,\n };\n\n // Add optional fields only if present\n if (version) item.version = version;\n if (dependencies && dependencies.length > 0) item.dependencies = dependencies;\n if (devDependencies && devDependencies.length > 0) item.devDependencies = devDependencies;\n if (config.registryDependencies && config.registryDependencies.length > 0) {\n item.registryDependencies = config.registryDependencies;\n }\n if (config.envVars) item.envVars = config.envVars;\n if (config.tsconfig) item.tsconfig = config.tsconfig;\n if (config.docs) item.docs = config.docs;\n if (config.categories && config.categories.length > 0) item.categories = config.categories;\n if (config.changelog && config.changelog.length > 0) item.changelog = config.changelog;\n if (isPackage && config.installDir) item.installDir = config.installDir;\n\n // 6. Validate the result\n try {\n return registryItemSchema.parse(item);\n } catch (err) {\n throw new Error(\n `Built component \"${name}\" failed validation: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { resolve, relative } from \"path\";\nimport { scanForComponents, writeRegistryOutput } from \"../registry/build-output.js\";\nimport { buildComponent } from \"../registry/builder.js\";\nimport type { RegistryItem } from \"../registry/schema.js\";\n\ninterface BuildOptions {\n output?: string;\n}\n\nexport async function buildCommand(paths: string[], opts: BuildOptions) {\n p.intro(pc.bgCyan(pc.black(\" kitn build \")));\n\n const cwd = process.cwd();\n const outputDir = resolve(cwd, opts.output ?? \"dist/r\");\n\n const s = p.spinner();\n s.start(\"Scanning for components...\");\n\n const componentDirs = await scanForComponents(cwd, paths.length > 0 ? paths : undefined);\n\n if (componentDirs.length === 0) {\n s.stop(\"No components found\");\n p.log.info(\n `No directories with ${pc.bold(\"registry.json\")} found. Run ${pc.bold(\"kitn create\")} to scaffold a component.`\n );\n return;\n }\n\n s.stop(`Found ${componentDirs.length} component(s)`);\n for (const dir of componentDirs) {\n p.log.message(` ${pc.dim(relative(cwd, dir))}`);\n }\n\n s.start(\"Building components...\");\n\n const items: RegistryItem[] = [];\n const errors: { dir: string; error: string }[] = [];\n\n for (const dir of componentDirs) {\n try {\n const item = await buildComponent(dir);\n items.push(item);\n } catch (err: any) {\n errors.push({ dir: relative(cwd, dir), error: err.message });\n }\n }\n\n if (errors.length > 0) {\n s.stop(pc.red(`Build failed with ${errors.length} error(s)`));\n for (const { dir, error } of errors) {\n p.log.error(`${pc.bold(dir)}: ${error}`);\n }\n process.exit(1);\n }\n\n const { written, skipped } = await writeRegistryOutput(outputDir, items);\n\n s.stop(pc.green(`Built ${items.length} component(s)`));\n\n if (written.length > 0) {\n p.log.success(`Wrote ${written.length} file(s):`);\n for (const f of written) {\n p.log.message(` ${pc.green(\"+\")} ${f}`);\n }\n }\n\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s) (already exist):`);\n for (const f of skipped) {\n p.log.message(` ${pc.dim(\"-\")} ${f}`);\n }\n }\n\n p.outro(`Output: ${pc.cyan(relative(cwd, outputDir) || \".\")}`);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { mkdir, writeFile } from \"fs/promises\";\n\nconst VALID_TYPES = [\"agent\", \"tool\", \"skill\", \"storage\"] as const;\ntype ComponentType = (typeof VALID_TYPES)[number];\n\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toTitleCase(str: string): string {\n return str\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\nfunction generateRegistryJson(\n type: ComponentType,\n name: string,\n sourceFile: string\n): object {\n const base: Record<string, unknown> = {\n $schema: \"https://kitn.dev/schema/registry.json\",\n name,\n type: `kitn:${type}`,\n version: \"0.1.0\",\n description: \"\",\n files: [sourceFile],\n categories: [],\n };\n\n if (type === \"tool\") {\n base.dependencies = [\"ai\", \"zod\"];\n } else if (type === \"agent\" || type === \"storage\") {\n base.dependencies = [];\n }\n\n return base;\n}\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 parameters: 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\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const { stat } = await import(\"fs/promises\");\n const s = await stat(path);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function createComponent(\n type: string,\n name: string,\n opts?: { cwd?: string }\n): Promise<{ dir: string; files: string[] }> {\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 dir = join(cwd, name);\n\n if (await dirExists(dir)) {\n throw new Error(`Directory \"${name}\" already exists`);\n }\n\n await mkdir(dir, { recursive: true });\n\n const validType = type as ComponentType;\n const sourceFile = validType === \"skill\" ? \"README.md\" : `${name}.ts`;\n const registryJson = generateRegistryJson(validType, name, sourceFile);\n\n await writeFile(\n join(dir, \"registry.json\"),\n JSON.stringify(registryJson, null, 2) + \"\\n\"\n );\n\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 }\n\n await writeFile(join(dir, sourceFile), source);\n\n return { dir, files: [\"registry.json\", sourceFile] };\n}\n\nexport async function createCommand(type: string, name: string) {\n p.intro(pc.bgCyan(pc.black(\" kitn create \")));\n\n try {\n const { dir, files } = await createComponent(type, name);\n\n p.log.success(`Created ${pc.bold(type)} component ${pc.cyan(name)}`);\n for (const file of files) {\n p.log.message(` ${pc.green(\"+\")} ${file}`);\n }\n\n const editFile = files.find((f) => f !== \"registry.json\") ?? files[0];\n p.outro(\n `Edit ${pc.cyan(`${name}/${editFile}`)}, then run ${pc.bold(\"kitn build\")}`\n );\n } catch (err: any) {\n p.log.error(err.message);\n process.exit(1);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig } 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 installed = config.installed?.[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 * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig, getRegistryUrl } 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 affectedComponents: string[] = [];\n if (config.installed) {\n for (const [name, entry] of Object.entries(config.installed)) {\n if (entry.registry === namespace) {\n affectedComponents.push(name);\n }\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 for (const name of affectedComponents) {\n p.log.message(` ${pc.yellow(\"!\")} ${name}`);\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 for (const { namespace, url, homepage, description } of entries) {\n p.log.message(` ${pc.bold(namespace.padEnd(16))} ${pc.dim(url)}`);\n if (description) p.log.message(` ${\" \".repeat(16)} ${description}`);\n if (homepage) p.log.message(` ${\" \".repeat(16)} ${pc.dim(homepage)}`);\n }\n }\n\n return entries;\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 .action(async () => {\n const { initCommand } = await import(\"./commands/init.js\");\n await initCommand();\n });\n\nprogram\n .command(\"add\")\n .description(\"Add components from the kitn registry\")\n .argument(\"[components...]\", \"component names to install\")\n .option(\"-o, --overwrite\", \"overwrite existing files without prompting\")\n .option(\"-t, --type <type>\", \"filter by component type\")\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 .description(\"Remove an installed component\")\n .argument(\"<component>\", \"component name to remove\")\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(\"build\")\n .description(\"Build registry JSON from components with registry.json files\")\n .argument(\"[paths...]\", \"directories to build (default: scan from cwd)\")\n .option(\"-o, --output <dir>\", \"output directory\", \"dist/r\")\n .action(async (paths: string[], opts) => {\n const { buildCommand } = await import(\"./commands/build.js\");\n await buildCommand(paths, opts);\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(\"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\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\nawait program.parseAsync();\nprintUpdateNotice();\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport pc from \"picocolors\";\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\nasync 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 message = [\n \"\",\n pc.yellow(` Update available: ${pc.dim(currentVersion)} → ${pc.green(latest)}`),\n pc.dim(` Run ${pc.cyan(\"npx @kitnai/cli@latest\")} or ${pc.cyan(\"npm i -g @kitnai/cli\")}`),\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"],"mappings":"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","names":["readFile","writeFile","join","readFile","writeFile","join","text","join","resolve","readFile","writeFile","mkdir","access","pc","readFile","writeFile","access","join","join","z","componentType","p","pc","join","readFile","writeFile","mkdir","relative","fw","baseDir","p","pc","mkdir","writeFile","join","p","pc","p","join","p","pc","join","relative","dirname","readFile","writeFile","existsSync","p","writeFile","mkdir","access","join","p","readFile","readdir","join","relative","p","pc","resolve","relative","p","pc","join","mkdir","writeFile","stat","p","pc","p","pc","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand","buildCommand","createCommand","infoCommand","registryAddCommand","registryRemoveCommand","registryListCommand"]}
1
+ {"version":3,"sources":["../src/utils/config.ts","../src/installers/tsconfig-patcher.ts","../src/installers/barrel-manager.ts","../src/utils/detect.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/registry/schema.ts","../src/commands/add.ts","../src/commands/init.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/registry/build-output.ts","../src/registry/builder.ts","../src/commands/build.ts","../src/commands/create.ts","../src/commands/info.ts","../src/commands/registry.ts","../src/index.ts","../src/utils/update-check.ts"],"sourcesContent":["import { readFile, writeFile } 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\"]);\ntype ComponentType = z.infer<typeof componentType>;\n\nconst installedComponentSchema = z.object({\n registry: z.string().optional(),\n version: z.string(),\n installedAt: z.string(),\n files: z.array(z.string()),\n hash: z.string(),\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 configSchema = z.object({\n $schema: z.string().optional(),\n runtime: z.enum([\"bun\", \"node\", \"deno\"]),\n framework: z.enum([\"hono\", \"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 }),\n registries: z.record(z.string(), registryValueSchema),\n installed: z.record(z.string(), installedComponentSchema).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 CONFIG_FILE = \"kitn.json\";\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\ntype RequiredAliasKey = \"agents\" | \"tools\" | \"skills\" | \"storage\";\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};\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 base = config.aliases[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 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 { 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","import type { RegistryItem, RegistryIndex } from \"./schema.js\";\nimport type { RegistryEntry } from \"../utils/config.js\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"package\";\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\";\n\nconst KNOWN_TYPES: readonly AliasKey[] = [\"agents\", \"tools\", \"skills\", \"storage\"];\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};\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<AliasKey, string>,\n): string {\n const sourceAliasKey = TYPE_TO_ALIAS_KEY[fileType];\n if (!sourceAliasKey) return content;\n\n const sourceDir = aliases[sourceAliasKey];\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 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 { z } from \"zod\";\n\nexport const componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\", \"kitn:package\"]);\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 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 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 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};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig, writeConfig, getInstallPath } 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 } from \"../installers/dep-installer.js\";\nimport { collectEnvVars, handleEnvVars } from \"../installers/env-writer.js\";\nimport { rewriteKitnImports } from \"../installers/import-rewriter.js\";\nimport { createBarrelFile, addImportToBarrel } from \"../installers/barrel-manager.js\";\nimport { contentHash } from \"../utils/hash.js\";\nimport { parseComponentRef, type ComponentRef } from \"../utils/parse-ref.js\";\nimport { typeToDir, type RegistryItem, type ComponentType } from \"../registry/schema.js\";\nimport { existsSync } from \"fs\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { relative } from \"path\";\n\ninterface AddOptions {\n overwrite?: boolean;\n type?: string;\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 if (components.length === 0) {\n p.log.error(\"Please specify at least one component to add.\");\n process.exit(1);\n }\n\n // Resolve \"routes\" to framework-specific package name, then parse refs\n const resolvedComponents = components.map((c) => {\n if (c === \"routes\") {\n const fw = config.framework ?? \"hono\";\n return fw;\n }\n return c;\n });\n\n const refs = resolvedComponents.map(parseComponentRef);\n const fetcher = new RegistryFetcher(config.registries);\n\n const s = p.spinner();\n s.start(\"Resolving dependencies...\");\n\n let resolved: RegistryItem[];\n try {\n resolved = await resolveDependencies(resolvedComponents, 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 const indexItem = index.items.find((i) => i.name === name);\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 p.log.info(\"Components to install:\");\n for (const item of resolved) {\n const isExplicit = resolvedComponents.includes(item.name) || components.includes(item.name);\n const label = isExplicit ? item.name : `${item.name} ${pc.dim(\"(dependency)\")}`;\n p.log.message(` ${pc.cyan(label)}`);\n }\n\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n const allDeps: string[] = [];\n for (const item of resolved) {\n if (item.dependencies) allDeps.push(...item.dependencies);\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 installed\n const installed = config.installed ?? {};\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 installed[installedKey] = {\n registry: ref.namespace,\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 };\n config.installed = installed;\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 }\n })() as \"agents\" | \"tools\" | \"skills\" | \"storage\";\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 installed\n const installed = config.installed ?? {};\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 installed[installedKey] = {\n registry: ns,\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 };\n config.installed = installed;\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\"]);\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 \"./${baseDir}/plugin.js\";`,\n ``,\n `app.route(\"/api\", ai.router);`,\n `await ai.initialize();`,\n ].join(\"\\n\"),\n \"Add this to your server entry point\",\n );\n }\n }\n\n await writeConfig(cwd, config);\n\n const uniqueDeps = [...new Set(allDeps)];\n if (uniqueDeps.length > 0) {\n const pm = await detectPackageManager(cwd);\n if (pm) {\n s.start(`Installing ${uniqueDeps.length} npm dependenc${uniqueDeps.length === 1 ? \"y\" : \"ies\"}...`);\n try {\n installDependencies(pm, uniqueDeps, 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(`Created ${created.length} file(s):`);\n for (const f of created) p.log.message(` ${pc.green(\"+\")} ${f}`);\n }\n if (updated.length > 0) {\n p.log.success(`Updated ${updated.length} file(s):`);\n for (const f of updated) p.log.message(` ${pc.yellow(\"~\")} ${f}`);\n }\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s):`);\n for (const f of skipped) p.log.message(` ${pc.dim(\"-\")} ${f}`);\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 installedNames = new Set(resolved.map((r) => r.name));\n const hints: string[] = [];\n\n if (installedNames.has(\"core\") && !installedNames.has(config.framework ?? \"hono\")) {\n hints.push(`Run ${pc.cyan(`kitn add routes`)} to install the HTTP adapter.`);\n }\n\n const fw = config.framework ?? \"hono\";\n if (installedNames.has(fw) || (installedNames.has(\"core\") && installedNames.has(fw))) {\n hints.push(`Configure your AI provider in ${pc.bold(baseDir + \"/plugin.ts\")}, then add to your server:`);\n hints.push(\"\");\n hints.push(pc.dim(` import { ai } from \"./${baseDir}/plugin.js\";`));\n hints.push(pc.dim(``));\n hints.push(pc.dim(` app.route(\"/api\", ai.router);`));\n hints.push(pc.dim(` await ai.initialize();`));\n hints.push(\"\");\n }\n\n if (hints.length > 0) {\n p.log.message(pc.bold(\"\\nNext steps:\"));\n for (const hint of hints) p.log.message(hint);\n }\n\n p.outro(pc.green(\"Done!\"));\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { mkdir, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\nimport { patchProjectTsconfig } from \"../installers/tsconfig-patcher.js\";\nimport { createBarrelFile } from \"../installers/barrel-manager.js\";\nimport { addCommand } from \"./add.js\";\n\nconst PLUGIN_TEMPLATE = `import { createAIPlugin } from \"@kitn/hono-routes\";\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\nexport async function initCommand() {\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 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 const runtime = 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(runtime)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\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\n const baseDir = base as string;\n const config = {\n runtime: runtime as \"bun\" | \"node\" | \"deno\",\n framework: \"hono\" as const,\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: \"https://kitn-ai.github.io/kitn/r/{type}/{name}.json\",\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/hono-routes, 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 + Hono routes\n p.log.info(\"Installing core engine and routes...\");\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, PLUGIN_TEMPLATE);\n\n p.log.success(`Created ${pc.bold(baseDir + \"/plugin.ts\")} — configure your AI provider there`);\n\n p.note(\n [\n `import { ai } from \"./${baseDir}/plugin.js\";`,\n ``,\n `app.route(\"/api\", ai.router);`,\n `await ai.initialize();`,\n ].join(\"\\n\"),\n \"Add this to your server entry point:\",\n );\n\n p.outro(\"Done!\");\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig } from \"../utils/config.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\nconst 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};\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 ? TYPE_ALIASES[rawType.toLowerCase()] : 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 = config.installed ?? {};\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 } 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 package name\n const input = componentName === \"routes\" ? (config.framework ?? \"hono\") : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in installed — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = config.installed?.[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 } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.js\";\nimport { removeImportFromBarrel } from \"../installers/barrel-manager.js\";\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 // Resolve \"routes\" alias to framework-specific package name\n const input = componentName === \"routes\" ? (config.framework ?? \"hono\") : componentName;\n const ref = parseComponentRef(input);\n\n // Look up in installed — @kitn uses plain name, third-party uses @namespace/name\n const installedKey = ref.namespace === \"@kitn\" ? ref.name : `${ref.namespace}/${ref.name}`;\n const installed = config.installed?.[installedKey];\n if (!installed) {\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 ${installed.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 const deleted: string[] = [];\n for (const filePath of installed.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 // Check if the file is in a barrel-eligible directory\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 config.installed![installedKey];\n if (Object.keys(config.installed!).length === 0) {\n delete config.installed;\n }\n await writeConfig(cwd, config);\n\n if (deleted.length > 0) {\n p.log.success(`Removed ${ref.name}:`);\n for (const f of deleted) p.log.message(` ${pc.red(\"-\")} ${f}`);\n }\n}\n","import { addCommand } from \"./add.js\";\nimport { readConfig } 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 installed = config.installed;\n if (!installed || Object.keys(installed).length === 0) {\n p.log.info(\"No installed components to update.\");\n return;\n }\n\n components = Object.keys(installed);\n }\n\n await addCommand(components, { overwrite: true });\n}\n","import { readdir, stat, writeFile, mkdir, access, readFile } from \"fs/promises\";\nimport { join, resolve, relative } from \"path\";\nimport { typeToDir, type RegistryItem, type RegistryIndex } from \"./schema.js\";\n\n/** Directories to skip when walking the full tree */\nconst SKIP_DIRS = new Set([\n \"node_modules\",\n \"dist\",\n \".git\",\n \"r\",\n \"test\",\n \"tests\",\n \".claude\",\n]);\n\n/** Check whether a file exists */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Walk a directory tree recursively, collecting directories that contain registry.json.\n * Skips directories in the SKIP_DIRS set.\n */\nasync function walkForRegistryJson(dir: string): Promise<string[]> {\n const results: string[] = [];\n\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return results;\n }\n\n // Check if this directory itself has registry.json\n if (await fileExists(join(dir, \"registry.json\"))) {\n results.push(dir);\n // Don't recurse into component directories — they won't nest further\n return results;\n }\n\n // Recurse into subdirectories\n for (const entry of entries) {\n if (entry.isDirectory() && !SKIP_DIRS.has(entry.name)) {\n const subResults = await walkForRegistryJson(join(dir, entry.name));\n results.push(...subResults);\n }\n }\n\n return results;\n}\n\n/**\n * Discover directories containing registry.json files.\n *\n * If `paths` is provided, each path is checked:\n * - If it directly contains registry.json, it's included.\n * - Otherwise, its immediate subdirectories are checked for registry.json.\n *\n * If `paths` is not provided, the full directory tree from `cwd` is walked,\n * skipping directories in SKIP_DIRS.\n *\n * @returns Array of absolute directory paths containing registry.json.\n */\nexport async function scanForComponents(\n cwd: string,\n paths?: string[]\n): Promise<string[]> {\n const resolvedCwd = resolve(cwd);\n\n if (paths && paths.length > 0) {\n const results: string[] = [];\n\n for (const p of paths) {\n const absPath = resolve(resolvedCwd, p);\n\n // Check if this path directly contains registry.json\n if (await fileExists(join(absPath, \"registry.json\"))) {\n results.push(absPath);\n continue;\n }\n\n // Otherwise, scan one level of subdirectories\n let entries;\n try {\n entries = await readdir(absPath, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subDir = join(absPath, entry.name);\n if (await fileExists(join(subDir, \"registry.json\"))) {\n results.push(subDir);\n }\n }\n }\n }\n\n return results;\n }\n\n // No paths specified — walk the full tree\n return walkForRegistryJson(resolvedCwd);\n}\n\n/**\n * Extract version strings from versioned filenames like `weather@1.0.0.json`.\n */\nfunction parseVersionFromFilename(\n name: string,\n componentName: string\n): string | null {\n const prefix = `${componentName}@`;\n const suffix = \".json\";\n if (name.startsWith(prefix) && name.endsWith(suffix)) {\n return name.slice(prefix.length, -suffix.length);\n }\n return null;\n}\n\n/**\n * Write the built registry output to the output directory.\n *\n * For each item:\n * 1. Creates the type subdirectory (e.g., tools/, package/)\n * 2. Writes `<typeDir>/<name>.json` — latest version, always overwritten\n * 3. Writes `<typeDir>/<name>@<version>.json` — versioned copy, immutable (skipped if exists)\n * 4. Scans existing versioned files to collect all available versions\n *\n * After all items:\n * 5. Writes `registry.json` index with metadata (no file content)\n *\n * @returns `{ written, skipped }` arrays of relative file paths.\n */\nexport async function writeRegistryOutput(\n outputDir: string,\n items: RegistryItem[]\n): Promise<{ written: string[]; skipped: string[] }> {\n const written: string[] = [];\n const skipped: string[] = [];\n const resolvedOutput = resolve(outputDir);\n\n const indexItems: RegistryIndex[\"items\"] = [];\n\n for (const item of items) {\n const dir = typeToDir[item.type];\n const typeDir = join(resolvedOutput, dir);\n await mkdir(typeDir, { recursive: true });\n\n const itemJson = JSON.stringify(item, null, 2);\n\n // 1. Write latest version (always overwritten)\n const latestPath = join(typeDir, `${item.name}.json`);\n const latestRelative = `${dir}/${item.name}.json`;\n await writeFile(latestPath, itemJson, \"utf-8\");\n written.push(latestRelative);\n\n // 2. Write versioned copy (immutable)\n if (item.version) {\n const versionedFilename = `${item.name}@${item.version}.json`;\n const versionedPath = join(typeDir, versionedFilename);\n const versionedRelative = `${dir}/${versionedFilename}`;\n\n if (await fileExists(versionedPath)) {\n skipped.push(versionedRelative);\n } else {\n await writeFile(versionedPath, itemJson, \"utf-8\");\n written.push(versionedRelative);\n }\n }\n\n // 3. Scan for all versioned files to collect versions\n const versions: string[] = [];\n let entries: string[];\n try {\n entries = await readdir(typeDir);\n } catch {\n entries = [];\n }\n\n for (const filename of entries) {\n const ver = parseVersionFromFilename(filename, item.name);\n if (ver) {\n versions.push(ver);\n }\n }\n\n // Sort versions (simple string sort is fine for semver with consistent formatting)\n versions.sort();\n\n // 4. Build index item (no file content)\n indexItems.push({\n name: item.name,\n type: item.type,\n description: item.description,\n ...(item.registryDependencies &&\n item.registryDependencies.length > 0 && {\n registryDependencies: item.registryDependencies,\n }),\n ...(item.categories &&\n item.categories.length > 0 && { categories: item.categories }),\n ...(item.version && { version: item.version }),\n ...(versions.length > 0 && { versions }),\n ...(item.updatedAt && { updatedAt: item.updatedAt }),\n });\n }\n\n // 5. Write registry.json index\n const index: RegistryIndex = {\n version: \"1\",\n items: indexItems,\n };\n\n const indexPath = join(resolvedOutput, \"registry.json\");\n await writeFile(indexPath, JSON.stringify(index, null, 2), \"utf-8\");\n written.push(\"registry.json\");\n\n return { written, skipped };\n}\n","import { readFile, readdir } from \"fs/promises\";\nimport { join, relative } from \"path\";\nimport {\n componentConfigSchema,\n registryItemSchema,\n typeToDir,\n type ComponentConfig,\n type RegistryItem,\n} from \"./schema.js\";\n\n/** Build tooling devDependencies to exclude from the output */\nconst EXCLUDED_DEV_DEPS = new Set([\n \"typescript\",\n \"@types/bun\",\n \"@types/node\",\n \"tsup\",\n \"vitest\",\n \"jest\",\n \"@types/jest\",\n]);\n\nfunction isExcludedDevDep(name: string): boolean {\n return EXCLUDED_DEV_DEPS.has(name) || name.startsWith(\"@types/\");\n}\n\n/** Strip @scope/ prefix from a package name (e.g., @kitnai/core -> core) */\nfunction stripScope(name: string): string {\n const match = name.match(/^@[^/]+\\/(.+)$/);\n return match ? match[1] : name;\n}\n\n/** Recursively read all .ts files from a directory */\nasync function readTsFiles(\n dir: string,\n baseDir: string,\n exclude: string[]\n): Promise<{ relativePath: string; content: string }[]> {\n const results: { relativePath: string; content: string }[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n const relPath = relative(baseDir, fullPath);\n\n if (entry.isDirectory()) {\n const nested = await readTsFiles(fullPath, baseDir, exclude);\n results.push(...nested);\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n if (exclude.includes(relPath)) {\n continue;\n }\n const content = await readFile(fullPath, \"utf-8\");\n results.push({ relativePath: relPath, content });\n }\n }\n\n return results;\n}\n\n/**\n * Build a RegistryItem from a component directory.\n *\n * Reads registry.json (required) + optional package.json + source files,\n * and produces a validated RegistryItem.\n */\nexport async function buildComponent(componentDir: string): Promise<RegistryItem> {\n // 1. Read and validate registry.json\n let rawConfig: string;\n try {\n rawConfig = await readFile(join(componentDir, \"registry.json\"), \"utf-8\");\n } catch {\n throw new Error(\n `No registry.json found in ${componentDir}. Every component must have a registry.json file.`\n );\n }\n\n let config: ComponentConfig;\n try {\n config = componentConfigSchema.parse(JSON.parse(rawConfig));\n } catch (err) {\n throw new Error(\n `Invalid registry.json in ${componentDir}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n // 2. Try to read package.json (optional)\n let pkg: {\n name?: string;\n version?: string;\n description?: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n } | null = null;\n\n try {\n const rawPkg = await readFile(join(componentDir, \"package.json\"), \"utf-8\");\n pkg = JSON.parse(rawPkg);\n } catch {\n // No package.json, that's fine for standalone components\n }\n\n // 3. Resolve metadata by merging registry.json + package.json\n const name = config.name ?? (pkg?.name ? stripScope(pkg.name) : undefined);\n const version = config.version ?? pkg?.version;\n const description = config.description ?? pkg?.description;\n\n if (!name) {\n throw new Error(\n `Component in ${componentDir} is missing a name. Provide \"name\" in registry.json or have a package.json with a \"name\" field.`\n );\n }\n if (!description) {\n throw new Error(\n `Component in ${componentDir} is missing a description. Provide \"description\" in registry.json or have a package.json with a \"description\" field.`\n );\n }\n\n // Resolve dependencies from package.json if available\n let dependencies = config.dependencies;\n let devDependencies = config.devDependencies;\n\n if (pkg && !config.dependencies) {\n const deps: string[] = [];\n if (pkg.dependencies) {\n for (const [depName, depVersion] of Object.entries(pkg.dependencies)) {\n if (depVersion !== \"workspace:*\") {\n deps.push(depName);\n }\n }\n }\n if (pkg.peerDependencies) {\n for (const [depName, depVersion] of Object.entries(pkg.peerDependencies)) {\n if (depVersion !== \"workspace:*\") {\n deps.push(depName);\n }\n }\n }\n if (deps.length > 0) {\n dependencies = deps;\n }\n }\n\n if (pkg && !config.devDependencies) {\n const devDeps: string[] = [];\n if (pkg.devDependencies) {\n for (const depName of Object.keys(pkg.devDependencies)) {\n if (!isExcludedDevDep(depName)) {\n devDeps.push(depName);\n }\n }\n }\n if (devDeps.length > 0) {\n devDependencies = devDeps;\n }\n }\n\n // 4. Read source files\n const isPackage = config.type === \"kitn:package\";\n const dirPrefix = config.installDir ?? typeToDir[config.type];\n\n let files: { path: string; content: string; type: typeof config.type }[];\n\n if (isPackage) {\n // For packages: recursively read .ts files from src/ (or sourceDir override)\n const sourceDir = config.sourceDir ?? \"src\";\n const sourcePath = join(componentDir, sourceDir);\n const exclude = config.exclude ?? [];\n\n let tsFiles: { relativePath: string; content: string }[];\n try {\n tsFiles = await readTsFiles(sourcePath, sourcePath, exclude);\n } catch {\n throw new Error(\n `Cannot read source directory \"${sourceDir}\" in ${componentDir}. Make sure it exists.`\n );\n }\n\n files = tsFiles.map((f) => ({\n path: `${dirPrefix}/${f.relativePath}`,\n content: f.content,\n type: config.type,\n }));\n } else {\n // For standalone components: read files listed in the files array\n if (!config.files || config.files.length === 0) {\n throw new Error(\n `Component \"${name}\" (type: ${config.type}) has no \"files\" array in registry.json. Standalone components must list their source files.`\n );\n }\n\n files = await Promise.all(\n config.files.map(async (filePath) => {\n const fullPath = join(componentDir, filePath);\n let content: string;\n try {\n content = await readFile(fullPath, \"utf-8\");\n } catch {\n throw new Error(\n `Cannot read file \"${filePath}\" referenced in registry.json for component \"${name}\". Make sure the file exists at ${fullPath}.`\n );\n }\n return {\n path: `${dirPrefix}/${filePath}`,\n content,\n type: config.type,\n };\n })\n );\n }\n\n // 5. Build the RegistryItem\n const item: RegistryItem = {\n name,\n type: config.type,\n description,\n files,\n };\n\n // Add optional fields only if present\n if (version) item.version = version;\n if (dependencies && dependencies.length > 0) item.dependencies = dependencies;\n if (devDependencies && devDependencies.length > 0) item.devDependencies = devDependencies;\n if (config.registryDependencies && config.registryDependencies.length > 0) {\n item.registryDependencies = config.registryDependencies;\n }\n if (config.envVars) item.envVars = config.envVars;\n if (config.tsconfig) item.tsconfig = config.tsconfig;\n if (config.docs) item.docs = config.docs;\n if (config.categories && config.categories.length > 0) item.categories = config.categories;\n if (config.changelog && config.changelog.length > 0) item.changelog = config.changelog;\n if (isPackage && config.installDir) item.installDir = config.installDir;\n\n // 6. Validate the result\n try {\n return registryItemSchema.parse(item);\n } catch (err) {\n throw new Error(\n `Built component \"${name}\" failed validation: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { resolve, relative } from \"path\";\nimport { scanForComponents, writeRegistryOutput } from \"../registry/build-output.js\";\nimport { buildComponent } from \"../registry/builder.js\";\nimport type { RegistryItem } from \"../registry/schema.js\";\n\ninterface BuildOptions {\n output?: string;\n}\n\nexport async function buildCommand(paths: string[], opts: BuildOptions) {\n p.intro(pc.bgCyan(pc.black(\" kitn build \")));\n\n const cwd = process.cwd();\n const outputDir = resolve(cwd, opts.output ?? \"dist/r\");\n\n const s = p.spinner();\n s.start(\"Scanning for components...\");\n\n const componentDirs = await scanForComponents(cwd, paths.length > 0 ? paths : undefined);\n\n if (componentDirs.length === 0) {\n s.stop(\"No components found\");\n p.log.info(\n `No directories with ${pc.bold(\"registry.json\")} found. Run ${pc.bold(\"kitn create\")} to scaffold a component.`\n );\n return;\n }\n\n s.stop(`Found ${componentDirs.length} component(s)`);\n for (const dir of componentDirs) {\n p.log.message(` ${pc.dim(relative(cwd, dir))}`);\n }\n\n s.start(\"Building components...\");\n\n const items: RegistryItem[] = [];\n const errors: { dir: string; error: string }[] = [];\n\n for (const dir of componentDirs) {\n try {\n const item = await buildComponent(dir);\n items.push(item);\n } catch (err: any) {\n errors.push({ dir: relative(cwd, dir), error: err.message });\n }\n }\n\n if (errors.length > 0) {\n s.stop(pc.red(`Build failed with ${errors.length} error(s)`));\n for (const { dir, error } of errors) {\n p.log.error(`${pc.bold(dir)}: ${error}`);\n }\n process.exit(1);\n }\n\n const { written, skipped } = await writeRegistryOutput(outputDir, items);\n\n s.stop(pc.green(`Built ${items.length} component(s)`));\n\n if (written.length > 0) {\n p.log.success(`Wrote ${written.length} file(s):`);\n for (const f of written) {\n p.log.message(` ${pc.green(\"+\")} ${f}`);\n }\n }\n\n if (skipped.length > 0) {\n p.log.info(`Skipped ${skipped.length} file(s) (already exist):`);\n for (const f of skipped) {\n p.log.message(` ${pc.dim(\"-\")} ${f}`);\n }\n }\n\n p.outro(`Output: ${pc.cyan(relative(cwd, outputDir) || \".\")}`);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { mkdir, writeFile } from \"fs/promises\";\n\nconst VALID_TYPES = [\"agent\", \"tool\", \"skill\", \"storage\"] as const;\ntype ComponentType = (typeof VALID_TYPES)[number];\n\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toTitleCase(str: string): string {\n return str\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\nfunction generateRegistryJson(\n type: ComponentType,\n name: string,\n sourceFile: string\n): object {\n const base: Record<string, unknown> = {\n $schema: \"https://kitn.dev/schema/registry.json\",\n name,\n type: `kitn:${type}`,\n version: \"0.1.0\",\n description: \"\",\n files: [sourceFile],\n categories: [],\n };\n\n if (type === \"tool\") {\n base.dependencies = [\"ai\", \"zod\"];\n } else if (type === \"agent\" || type === \"storage\") {\n base.dependencies = [];\n }\n\n return base;\n}\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 parameters: 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\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const { stat } = await import(\"fs/promises\");\n const s = await stat(path);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function createComponent(\n type: string,\n name: string,\n opts?: { cwd?: string }\n): Promise<{ dir: string; files: string[] }> {\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 dir = join(cwd, name);\n\n if (await dirExists(dir)) {\n throw new Error(`Directory \"${name}\" already exists`);\n }\n\n await mkdir(dir, { recursive: true });\n\n const validType = type as ComponentType;\n const sourceFile = validType === \"skill\" ? \"README.md\" : `${name}.ts`;\n const registryJson = generateRegistryJson(validType, name, sourceFile);\n\n await writeFile(\n join(dir, \"registry.json\"),\n JSON.stringify(registryJson, null, 2) + \"\\n\"\n );\n\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 }\n\n await writeFile(join(dir, sourceFile), source);\n\n return { dir, files: [\"registry.json\", sourceFile] };\n}\n\nexport async function createCommand(type: string, name: string) {\n p.intro(pc.bgCyan(pc.black(\" kitn create \")));\n\n try {\n const { dir, files } = await createComponent(type, name);\n\n p.log.success(`Created ${pc.bold(type)} component ${pc.cyan(name)}`);\n for (const file of files) {\n p.log.message(` ${pc.green(\"+\")} ${file}`);\n }\n\n const editFile = files.find((f) => f !== \"registry.json\") ?? files[0];\n p.outro(\n `Edit ${pc.cyan(`${name}/${editFile}`)}, then run ${pc.bold(\"kitn build\")}`\n );\n } catch (err: any) {\n p.log.error(err.message);\n process.exit(1);\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig } 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 installed = config.installed?.[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 * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig, getRegistryUrl } 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 affectedComponents: string[] = [];\n if (config.installed) {\n for (const [name, entry] of Object.entries(config.installed)) {\n if (entry.registry === namespace) {\n affectedComponents.push(name);\n }\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 for (const name of affectedComponents) {\n p.log.message(` ${pc.yellow(\"!\")} ${name}`);\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 for (const { namespace, url, homepage, description } of entries) {\n p.log.message(` ${pc.bold(namespace.padEnd(16))} ${pc.dim(url)}`);\n if (description) p.log.message(` ${\" \".repeat(16)} ${description}`);\n if (homepage) p.log.message(` ${\" \".repeat(16)} ${pc.dim(homepage)}`);\n }\n }\n\n return entries;\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 .action(async () => {\n const { initCommand } = await import(\"./commands/init.js\");\n await initCommand();\n });\n\nprogram\n .command(\"add\")\n .description(\"Add components from the kitn registry\")\n .argument(\"[components...]\", \"component names to install\")\n .option(\"-o, --overwrite\", \"overwrite existing files without prompting\")\n .option(\"-t, --type <type>\", \"filter by component type\")\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 .description(\"Remove an installed component\")\n .argument(\"<component>\", \"component name to remove\")\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(\"build\")\n .description(\"Build registry JSON from components with registry.json files\")\n .argument(\"[paths...]\", \"directories to build (default: scan from cwd)\")\n .option(\"-o, --output <dir>\", \"output directory\", \"dist/r\")\n .action(async (paths: string[], opts) => {\n const { buildCommand } = await import(\"./commands/build.js\");\n await buildCommand(paths, opts);\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(\"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\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\nawait program.parseAsync();\nprintUpdateNotice();\n","import { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { homedir } from \"os\";\nimport pc from \"picocolors\";\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\nasync 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 message = [\n \"\",\n pc.yellow(` Update available: ${pc.dim(currentVersion)} → ${pc.green(latest)}`),\n pc.dim(` Run ${pc.cyan(\"npx @kitnai/cli@latest\")} or ${pc.cyan(\"npm i -g @kitnai/cli\")}`),\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"],"mappings":"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","names":["readFile","writeFile","join","readFile","writeFile","join","text","join","resolve","readFile","writeFile","mkdir","access","pc","readFile","writeFile","access","join","join","z","componentType","p","pc","join","readFile","writeFile","mkdir","relative","fw","baseDir","p","pc","mkdir","writeFile","join","p","pc","p","join","p","pc","join","relative","dirname","readFile","writeFile","existsSync","p","writeFile","mkdir","access","join","p","readFile","readdir","join","relative","p","pc","resolve","relative","p","pc","join","mkdir","writeFile","stat","p","pc","p","pc","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand","buildCommand","createCommand","infoCommand","registryAddCommand","registryRemoveCommand","registryListCommand"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitnai/cli",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "type": "module",
5
5
  "description": "CLI for installing AI agent components from the kitn registry",
6
6
  "bin": {