@kitnai/cli 0.1.3 → 0.1.5
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 +55 -19
- package/dist/index.js +172 -93
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,9 +32,10 @@ kitn init
|
|
|
32
32
|
|
|
33
33
|
Prompts for:
|
|
34
34
|
- **Runtime**: bun, node, or deno
|
|
35
|
-
- **
|
|
35
|
+
- **Framework**: hono, cloudflare, elysia, fastify, express
|
|
36
|
+
- **Install path**: Base directory for kitn components (defaults to `src/ai`)
|
|
36
37
|
|
|
37
|
-
|
|
38
|
+
Then run `kitn add core` to install the engine and `kitn add routes` for HTTP routes.
|
|
38
39
|
|
|
39
40
|
### `kitn add [components...]`
|
|
40
41
|
|
|
@@ -73,7 +74,7 @@ After installation, the CLI:
|
|
|
73
74
|
List available and installed components from the registry.
|
|
74
75
|
|
|
75
76
|
```bash
|
|
76
|
-
# List all components
|
|
77
|
+
# List all components from all registries
|
|
77
78
|
kitn list
|
|
78
79
|
|
|
79
80
|
# Only show installed components
|
|
@@ -81,6 +82,9 @@ kitn list --installed
|
|
|
81
82
|
|
|
82
83
|
# Filter by type
|
|
83
84
|
kitn list --type tool
|
|
85
|
+
|
|
86
|
+
# Filter by registry
|
|
87
|
+
kitn list --registry @myteam
|
|
84
88
|
```
|
|
85
89
|
|
|
86
90
|
**Flags:**
|
|
@@ -88,7 +92,10 @@ kitn list --type tool
|
|
|
88
92
|
| Flag | Description |
|
|
89
93
|
|------|-------------|
|
|
90
94
|
| `-i, --installed` | Only show installed components |
|
|
91
|
-
| `-t, --type <type>` | Filter by type (`agent`, `tool`, `skill`, `storage`) |
|
|
95
|
+
| `-t, --type <type>` | Filter by type (`agent`, `tool`, `skill`, `storage`, `package`) |
|
|
96
|
+
| `-r, --registry <namespace>` | Only show components from this registry |
|
|
97
|
+
|
|
98
|
+
Shows installed version, latest registry version, and an update indicator when a newer version is available.
|
|
92
99
|
|
|
93
100
|
### `kitn diff <component>`
|
|
94
101
|
|
|
@@ -124,6 +131,39 @@ kitn update
|
|
|
124
131
|
|
|
125
132
|
This re-fetches components from the registry and applies the same conflict resolution as `kitn add --overwrite`.
|
|
126
133
|
|
|
134
|
+
### `kitn info <component>`
|
|
135
|
+
|
|
136
|
+
Show details about a component from the registry.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
kitn info weather-agent
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Displays the component's description, type, version, dependencies, files, and changelog.
|
|
143
|
+
|
|
144
|
+
### `kitn registry`
|
|
145
|
+
|
|
146
|
+
Manage component registries.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# Add a custom registry
|
|
150
|
+
kitn registry add @myteam https://registry.myteam.dev/r/{type}/{name}.json
|
|
151
|
+
|
|
152
|
+
# List configured registries
|
|
153
|
+
kitn registry list
|
|
154
|
+
|
|
155
|
+
# Remove a registry
|
|
156
|
+
kitn registry remove @myteam
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Subcommands:**
|
|
160
|
+
|
|
161
|
+
| Subcommand | Description |
|
|
162
|
+
|------------|-------------|
|
|
163
|
+
| `add <namespace> <url>` | Add a registry (`-o` to overwrite) |
|
|
164
|
+
| `list` | List all configured registries |
|
|
165
|
+
| `remove <namespace>` | Remove a registry (`-f` to remove `@kitn`) |
|
|
166
|
+
|
|
127
167
|
## Configuration
|
|
128
168
|
|
|
129
169
|
### `kitn.json`
|
|
@@ -134,11 +174,13 @@ Created by `kitn init`. Controls where components are installed and which regist
|
|
|
134
174
|
{
|
|
135
175
|
"$schema": "https://kitn.dev/schema/config.json",
|
|
136
176
|
"runtime": "bun",
|
|
177
|
+
"framework": "hono",
|
|
137
178
|
"aliases": {
|
|
138
|
-
"
|
|
139
|
-
"
|
|
140
|
-
"
|
|
141
|
-
"
|
|
179
|
+
"base": "src/ai",
|
|
180
|
+
"agents": "src/ai/agents",
|
|
181
|
+
"tools": "src/ai/tools",
|
|
182
|
+
"skills": "src/ai/skills",
|
|
183
|
+
"storage": "src/ai/storage"
|
|
142
184
|
},
|
|
143
185
|
"registries": {
|
|
144
186
|
"@kitn": "https://kitn-ai.github.io/registry/r/{type}/{name}.json"
|
|
@@ -149,26 +191,20 @@ Created by `kitn init`. Controls where components are installed and which regist
|
|
|
149
191
|
| Field | Description |
|
|
150
192
|
|-------|-------------|
|
|
151
193
|
| `runtime` | `bun`, `node`, or `deno` |
|
|
194
|
+
| `framework` | `hono`, `cloudflare`, `elysia`, `fastify`, or `express` |
|
|
152
195
|
| `aliases` | Directory paths for each component type |
|
|
153
196
|
| `registries` | Named registries with URL templates |
|
|
154
197
|
| `installed` | Auto-managed tracking of installed components (don't edit manually) |
|
|
155
198
|
|
|
156
199
|
### Custom Registries
|
|
157
200
|
|
|
158
|
-
Add custom registries
|
|
201
|
+
Add custom registries via the CLI or by editing `kitn.json` directly:
|
|
159
202
|
|
|
160
|
-
```
|
|
161
|
-
{
|
|
162
|
-
"registries": {
|
|
163
|
-
"@kitn": "https://kitn-ai.github.io/registry/r/{type}/{name}.json",
|
|
164
|
-
"@myteam": "https://registry.myteam.dev/r/{type}/{name}.json"
|
|
165
|
-
}
|
|
166
|
-
}
|
|
203
|
+
```bash
|
|
204
|
+
kitn registry add @myteam https://registry.myteam.dev/r/{type}/{name}.json
|
|
167
205
|
```
|
|
168
206
|
|
|
169
|
-
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.
|
|
170
|
-
|
|
171
|
-
The registry index is fetched by replacing `{type}/{name}.json` with `registry.json` in the URL template.
|
|
207
|
+
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.
|
|
172
208
|
|
|
173
209
|
## Package Manager Detection
|
|
174
210
|
|
package/dist/index.js
CHANGED
|
@@ -10,12 +10,12 @@ var __export = (target, all) => {
|
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
// src/utils/config.ts
|
|
13
|
-
import { readFile, writeFile } from "fs/promises";
|
|
14
|
-
import { join } from "path";
|
|
13
|
+
import { readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
|
|
14
|
+
import { join as join2 } from "path";
|
|
15
15
|
import { z } from "zod";
|
|
16
16
|
async function readConfig(projectDir) {
|
|
17
17
|
try {
|
|
18
|
-
const raw = await
|
|
18
|
+
const raw = await readFile2(join2(projectDir, CONFIG_FILE), "utf-8");
|
|
19
19
|
return configSchema.parse(JSON.parse(raw));
|
|
20
20
|
} catch {
|
|
21
21
|
return null;
|
|
@@ -23,7 +23,7 @@ async function readConfig(projectDir) {
|
|
|
23
23
|
}
|
|
24
24
|
async function writeConfig(projectDir, config) {
|
|
25
25
|
const data = { $schema: "https://kitn.dev/schema/config.json", ...config };
|
|
26
|
-
await
|
|
26
|
+
await writeFile2(join2(projectDir, CONFIG_FILE), JSON.stringify(data, null, 2) + "\n");
|
|
27
27
|
}
|
|
28
28
|
var componentType, installedComponentSchema, configSchema, CONFIG_FILE;
|
|
29
29
|
var init_config = __esm({
|
|
@@ -61,9 +61,9 @@ __export(init_exports, {
|
|
|
61
61
|
initCommand: () => initCommand
|
|
62
62
|
});
|
|
63
63
|
import * as p from "@clack/prompts";
|
|
64
|
-
import
|
|
64
|
+
import pc2 from "picocolors";
|
|
65
65
|
async function initCommand() {
|
|
66
|
-
p.intro(
|
|
66
|
+
p.intro(pc2.bgCyan(pc2.black(" kitn ")));
|
|
67
67
|
const cwd = process.cwd();
|
|
68
68
|
const existing = await readConfig(cwd);
|
|
69
69
|
if (existing) {
|
|
@@ -131,7 +131,7 @@ async function initCommand() {
|
|
|
131
131
|
s.start("Writing kitn.json");
|
|
132
132
|
await writeConfig(cwd, config);
|
|
133
133
|
s.stop("Created kitn.json");
|
|
134
|
-
p.outro(
|
|
134
|
+
p.outro(pc2.green("Done! Run `kitn add core` to install the engine, then `kitn add routes` for HTTP routes."));
|
|
135
135
|
}
|
|
136
136
|
var init_init = __esm({
|
|
137
137
|
"src/commands/init.ts"() {
|
|
@@ -142,11 +142,11 @@ var init_init = __esm({
|
|
|
142
142
|
|
|
143
143
|
// src/utils/detect.ts
|
|
144
144
|
import { access } from "fs/promises";
|
|
145
|
-
import { join as
|
|
145
|
+
import { join as join3 } from "path";
|
|
146
146
|
async function detectPackageManager(dir) {
|
|
147
147
|
for (const [lockfile, pm] of LOCKFILE_MAP) {
|
|
148
148
|
try {
|
|
149
|
-
await access(
|
|
149
|
+
await access(join3(dir, lockfile));
|
|
150
150
|
return pm;
|
|
151
151
|
} catch {
|
|
152
152
|
}
|
|
@@ -269,7 +269,7 @@ var init_resolver = __esm({
|
|
|
269
269
|
});
|
|
270
270
|
|
|
271
271
|
// src/installers/file-writer.ts
|
|
272
|
-
import { readFile as
|
|
272
|
+
import { readFile as readFile3, writeFile as writeFile3, mkdir as mkdir2, access as access2 } from "fs/promises";
|
|
273
273
|
import { dirname } from "path";
|
|
274
274
|
import { createPatch } from "diff";
|
|
275
275
|
async function checkFileStatus(filePath, newContent) {
|
|
@@ -278,7 +278,7 @@ async function checkFileStatus(filePath, newContent) {
|
|
|
278
278
|
} catch {
|
|
279
279
|
return "new" /* New */;
|
|
280
280
|
}
|
|
281
|
-
const existing = await
|
|
281
|
+
const existing = await readFile3(filePath, "utf-8");
|
|
282
282
|
return existing === newContent ? "identical" /* Identical */ : "different" /* Different */;
|
|
283
283
|
}
|
|
284
284
|
function generateDiff(filePath, oldContent, newContent) {
|
|
@@ -286,14 +286,14 @@ function generateDiff(filePath, oldContent, newContent) {
|
|
|
286
286
|
}
|
|
287
287
|
async function readExistingFile(filePath) {
|
|
288
288
|
try {
|
|
289
|
-
return await
|
|
289
|
+
return await readFile3(filePath, "utf-8");
|
|
290
290
|
} catch {
|
|
291
291
|
return null;
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
async function writeComponentFile(filePath, content) {
|
|
295
|
-
await
|
|
296
|
-
await
|
|
295
|
+
await mkdir2(dirname(filePath), { recursive: true });
|
|
296
|
+
await writeFile3(filePath, content);
|
|
297
297
|
}
|
|
298
298
|
var init_file_writer = __esm({
|
|
299
299
|
"src/installers/file-writer.ts"() {
|
|
@@ -327,12 +327,12 @@ var init_dep_installer = __esm({
|
|
|
327
327
|
});
|
|
328
328
|
|
|
329
329
|
// src/installers/env-checker.ts
|
|
330
|
-
import
|
|
330
|
+
import pc3 from "picocolors";
|
|
331
331
|
function checkEnvVars(envVars) {
|
|
332
332
|
const missing = [];
|
|
333
333
|
for (const [key, description] of Object.entries(envVars)) {
|
|
334
334
|
if (!process.env[key]) {
|
|
335
|
-
missing.push(` ${
|
|
335
|
+
missing.push(` ${pc3.yellow(key)}: ${description}`);
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
338
|
return missing;
|
|
@@ -344,7 +344,7 @@ var init_env_checker = __esm({
|
|
|
344
344
|
});
|
|
345
345
|
|
|
346
346
|
// src/installers/import-rewriter.ts
|
|
347
|
-
import { relative, join as
|
|
347
|
+
import { relative, join as join4 } from "path";
|
|
348
348
|
function rewriteKitnImports(content, fileType, fileName, aliases) {
|
|
349
349
|
const sourceAliasKey = TYPE_TO_ALIAS_KEY[fileType];
|
|
350
350
|
if (!sourceAliasKey) return content;
|
|
@@ -356,7 +356,7 @@ function rewriteKitnImports(content, fileType, fileName, aliases) {
|
|
|
356
356
|
return `${prefix}@kitn/${type}/${targetPath}${quote}`;
|
|
357
357
|
}
|
|
358
358
|
const targetDir = aliases[type];
|
|
359
|
-
const targetFile =
|
|
359
|
+
const targetFile = join4(targetDir, targetPath);
|
|
360
360
|
let rel = relative(sourceDir, targetFile);
|
|
361
361
|
rel = rel.split("\\").join("/");
|
|
362
362
|
if (!rel.startsWith(".")) {
|
|
@@ -381,8 +381,8 @@ var init_import_rewriter = __esm({
|
|
|
381
381
|
});
|
|
382
382
|
|
|
383
383
|
// src/installers/tsconfig-patcher.ts
|
|
384
|
-
import { readFile as
|
|
385
|
-
import { join as
|
|
384
|
+
import { readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
|
|
385
|
+
import { join as join5 } from "path";
|
|
386
386
|
function stripJsonc(text2) {
|
|
387
387
|
return text2.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "").replace(/,\s*([}\]])/g, "$1");
|
|
388
388
|
}
|
|
@@ -400,15 +400,15 @@ function patchTsconfig(tsconfigContent, paths) {
|
|
|
400
400
|
return JSON.stringify(config, null, 2) + "\n";
|
|
401
401
|
}
|
|
402
402
|
async function patchProjectTsconfig(projectDir, paths) {
|
|
403
|
-
const tsconfigPath =
|
|
403
|
+
const tsconfigPath = join5(projectDir, "tsconfig.json");
|
|
404
404
|
let content;
|
|
405
405
|
try {
|
|
406
|
-
content = await
|
|
406
|
+
content = await readFile4(tsconfigPath, "utf-8");
|
|
407
407
|
} catch {
|
|
408
408
|
content = "{}";
|
|
409
409
|
}
|
|
410
410
|
const patched = patchTsconfig(content, paths);
|
|
411
|
-
await
|
|
411
|
+
await writeFile4(tsconfigPath, patched);
|
|
412
412
|
}
|
|
413
413
|
var init_tsconfig_patcher = __esm({
|
|
414
414
|
"src/installers/tsconfig-patcher.ts"() {
|
|
@@ -522,10 +522,10 @@ __export(add_exports, {
|
|
|
522
522
|
addCommand: () => addCommand
|
|
523
523
|
});
|
|
524
524
|
import * as p2 from "@clack/prompts";
|
|
525
|
-
import
|
|
526
|
-
import { join as
|
|
525
|
+
import pc4 from "picocolors";
|
|
526
|
+
import { join as join6 } from "path";
|
|
527
527
|
async function addCommand(components, opts) {
|
|
528
|
-
p2.intro(
|
|
528
|
+
p2.intro(pc4.bgCyan(pc4.black(" kitn add ")));
|
|
529
529
|
const cwd = process.cwd();
|
|
530
530
|
const config = await readConfig(cwd);
|
|
531
531
|
if (!config) {
|
|
@@ -558,7 +558,7 @@ async function addCommand(components, opts) {
|
|
|
558
558
|
return fetcher.fetchItem(name, dir, ref.namespace, ref.version);
|
|
559
559
|
});
|
|
560
560
|
} catch (err) {
|
|
561
|
-
s.stop(
|
|
561
|
+
s.stop(pc4.red("Failed to resolve dependencies"));
|
|
562
562
|
p2.log.error(err.message);
|
|
563
563
|
process.exit(1);
|
|
564
564
|
}
|
|
@@ -566,8 +566,8 @@ async function addCommand(components, opts) {
|
|
|
566
566
|
p2.log.info("Components to install:");
|
|
567
567
|
for (const item of resolved) {
|
|
568
568
|
const isExplicit = resolvedComponents.includes(item.name) || components.includes(item.name);
|
|
569
|
-
const label = isExplicit ? item.name : `${item.name} ${
|
|
570
|
-
p2.log.message(` ${
|
|
569
|
+
const label = isExplicit ? item.name : `${item.name} ${pc4.dim("(dependency)")}`;
|
|
570
|
+
p2.log.message(` ${pc4.cyan(label)}`);
|
|
571
571
|
}
|
|
572
572
|
const created = [];
|
|
573
573
|
const updated = [];
|
|
@@ -582,8 +582,8 @@ async function addCommand(components, opts) {
|
|
|
582
582
|
if (item.type === "kitn:package") {
|
|
583
583
|
const baseDir = config.aliases.base ?? "src/ai";
|
|
584
584
|
for (const file of item.files) {
|
|
585
|
-
const targetPath =
|
|
586
|
-
const relativePath =
|
|
585
|
+
const targetPath = join6(cwd, baseDir, file.path);
|
|
586
|
+
const relativePath = join6(baseDir, file.path);
|
|
587
587
|
const status = await checkFileStatus(targetPath, file.content);
|
|
588
588
|
switch (status) {
|
|
589
589
|
case "new" /* New */:
|
|
@@ -600,7 +600,7 @@ async function addCommand(components, opts) {
|
|
|
600
600
|
} else {
|
|
601
601
|
const existing = await readExistingFile(targetPath);
|
|
602
602
|
const diff = generateDiff(relativePath, existing ?? "", file.content);
|
|
603
|
-
p2.log.message(
|
|
603
|
+
p2.log.message(pc4.dim(diff));
|
|
604
604
|
const action = await p2.select({
|
|
605
605
|
message: `${relativePath} already exists and differs. What to do?`,
|
|
606
606
|
options: [
|
|
@@ -622,7 +622,7 @@ async function addCommand(components, opts) {
|
|
|
622
622
|
const resolvedPaths = {};
|
|
623
623
|
const installDir = item.installDir ?? item.name;
|
|
624
624
|
for (const [key, values] of Object.entries(item.tsconfig)) {
|
|
625
|
-
resolvedPaths[key] = values.map((v) => `./${
|
|
625
|
+
resolvedPaths[key] = values.map((v) => `./${join6(baseDir, installDir, v)}`);
|
|
626
626
|
}
|
|
627
627
|
await patchProjectTsconfig(cwd, resolvedPaths);
|
|
628
628
|
p2.log.info(`Patched tsconfig.json with paths: ${Object.keys(resolvedPaths).join(", ")}`);
|
|
@@ -635,7 +635,7 @@ async function addCommand(components, opts) {
|
|
|
635
635
|
registry: ref.namespace,
|
|
636
636
|
version: item.version ?? "1.0.0",
|
|
637
637
|
installedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
638
|
-
files: item.files.map((f) =>
|
|
638
|
+
files: item.files.map((f) => join6(baseDir, f.path)),
|
|
639
639
|
hash: contentHash(allContent)
|
|
640
640
|
};
|
|
641
641
|
config.installed = installed;
|
|
@@ -654,8 +654,8 @@ async function addCommand(components, opts) {
|
|
|
654
654
|
}
|
|
655
655
|
})();
|
|
656
656
|
const fileName = file.path.split("/").pop();
|
|
657
|
-
const targetPath =
|
|
658
|
-
const relativePath =
|
|
657
|
+
const targetPath = join6(cwd, config.aliases[aliasKey], fileName);
|
|
658
|
+
const relativePath = join6(config.aliases[aliasKey], fileName);
|
|
659
659
|
const content = rewriteKitnImports(file.content, item.type, fileName, config.aliases);
|
|
660
660
|
const status = await checkFileStatus(targetPath, content);
|
|
661
661
|
switch (status) {
|
|
@@ -673,7 +673,7 @@ async function addCommand(components, opts) {
|
|
|
673
673
|
} else {
|
|
674
674
|
const existing = await readExistingFile(targetPath);
|
|
675
675
|
const diff = generateDiff(relativePath, existing ?? "", content);
|
|
676
|
-
p2.log.message(
|
|
676
|
+
p2.log.message(pc4.dim(diff));
|
|
677
677
|
const action = await p2.select({
|
|
678
678
|
message: `${relativePath} already exists and differs. What to do?`,
|
|
679
679
|
options: [
|
|
@@ -716,7 +716,7 @@ async function addCommand(components, opts) {
|
|
|
716
716
|
}
|
|
717
717
|
})();
|
|
718
718
|
const fileName = f.path.split("/").pop();
|
|
719
|
-
return
|
|
719
|
+
return join6(config.aliases[aliasKey], fileName);
|
|
720
720
|
}),
|
|
721
721
|
hash: contentHash(allContent)
|
|
722
722
|
};
|
|
@@ -733,21 +733,21 @@ async function addCommand(components, opts) {
|
|
|
733
733
|
installDependencies(pm, uniqueDeps, cwd);
|
|
734
734
|
s.stop("Dependencies installed");
|
|
735
735
|
} catch {
|
|
736
|
-
s.stop(
|
|
736
|
+
s.stop(pc4.yellow("Some dependencies failed to install"));
|
|
737
737
|
}
|
|
738
738
|
}
|
|
739
739
|
}
|
|
740
740
|
if (created.length > 0) {
|
|
741
741
|
p2.log.success(`Created ${created.length} file(s):`);
|
|
742
|
-
for (const f of created) p2.log.message(` ${
|
|
742
|
+
for (const f of created) p2.log.message(` ${pc4.green("+")} ${f}`);
|
|
743
743
|
}
|
|
744
744
|
if (updated.length > 0) {
|
|
745
745
|
p2.log.success(`Updated ${updated.length} file(s):`);
|
|
746
|
-
for (const f of updated) p2.log.message(` ${
|
|
746
|
+
for (const f of updated) p2.log.message(` ${pc4.yellow("~")} ${f}`);
|
|
747
747
|
}
|
|
748
748
|
if (skipped.length > 0) {
|
|
749
749
|
p2.log.info(`Skipped ${skipped.length} file(s):`);
|
|
750
|
-
for (const f of skipped) p2.log.message(` ${
|
|
750
|
+
for (const f of skipped) p2.log.message(` ${pc4.dim("-")} ${f}`);
|
|
751
751
|
}
|
|
752
752
|
if (allEnvWarnings.length > 0) {
|
|
753
753
|
p2.log.warn("Missing environment variables:");
|
|
@@ -755,10 +755,10 @@ async function addCommand(components, opts) {
|
|
|
755
755
|
}
|
|
756
756
|
for (const item of resolved) {
|
|
757
757
|
if (item.docs) {
|
|
758
|
-
p2.log.info(`${
|
|
758
|
+
p2.log.info(`${pc4.bold(item.name)}: ${item.docs}`);
|
|
759
759
|
}
|
|
760
760
|
}
|
|
761
|
-
p2.outro(
|
|
761
|
+
p2.outro(pc4.green("Done!"));
|
|
762
762
|
}
|
|
763
763
|
var init_add = __esm({
|
|
764
764
|
"src/commands/add.ts"() {
|
|
@@ -784,7 +784,7 @@ __export(list_exports, {
|
|
|
784
784
|
listCommand: () => listCommand
|
|
785
785
|
});
|
|
786
786
|
import * as p3 from "@clack/prompts";
|
|
787
|
-
import
|
|
787
|
+
import pc5 from "picocolors";
|
|
788
788
|
async function listCommand(opts) {
|
|
789
789
|
const cwd = process.cwd();
|
|
790
790
|
const config = await readConfig(cwd);
|
|
@@ -795,7 +795,7 @@ async function listCommand(opts) {
|
|
|
795
795
|
const fetcher = new RegistryFetcher(config.registries);
|
|
796
796
|
const namespacesToFetch = opts.registry ? [opts.registry] : Object.keys(config.registries);
|
|
797
797
|
if (opts.registry && !config.registries[opts.registry]) {
|
|
798
|
-
p3.log.error(`Registry ${
|
|
798
|
+
p3.log.error(`Registry ${pc5.bold(opts.registry)} is not configured. Run ${pc5.bold("kitn registry list")} to see configured registries.`);
|
|
799
799
|
process.exit(1);
|
|
800
800
|
}
|
|
801
801
|
const s = p3.spinner();
|
|
@@ -813,13 +813,13 @@ async function listCommand(opts) {
|
|
|
813
813
|
}
|
|
814
814
|
}
|
|
815
815
|
if (allItems.length === 0 && errors.length > 0) {
|
|
816
|
-
s.stop(
|
|
816
|
+
s.stop(pc5.red("Failed to fetch registries"));
|
|
817
817
|
for (const e of errors) p3.log.error(e);
|
|
818
818
|
process.exit(1);
|
|
819
819
|
}
|
|
820
820
|
s.stop(`Found ${allItems.length} components across ${namespacesToFetch.length - errors.length} ${namespacesToFetch.length - errors.length === 1 ? "registry" : "registries"}`);
|
|
821
821
|
for (const e of errors) {
|
|
822
|
-
p3.log.warn(`${
|
|
822
|
+
p3.log.warn(`${pc5.yellow("\u26A0")} Failed to fetch ${e}`);
|
|
823
823
|
}
|
|
824
824
|
const installed = config.installed ?? {};
|
|
825
825
|
const typeGroups = /* @__PURE__ */ new Map();
|
|
@@ -832,23 +832,23 @@ async function listCommand(opts) {
|
|
|
832
832
|
let installedCount = 0;
|
|
833
833
|
let updateCount = 0;
|
|
834
834
|
for (const [group, items] of typeGroups) {
|
|
835
|
-
p3.log.message(
|
|
835
|
+
p3.log.message(pc5.bold(`
|
|
836
836
|
${group.charAt(0).toUpperCase() + group.slice(1)}s:`));
|
|
837
837
|
for (const item of items) {
|
|
838
838
|
const displayName = item.namespace === "@kitn" ? item.name : `${item.namespace}/${item.name}`;
|
|
839
839
|
const inst = installed[item.name] ?? installed[displayName];
|
|
840
840
|
if (opts.installed && !inst) continue;
|
|
841
|
-
const version =
|
|
841
|
+
const version = pc5.dim(`v${item.version ?? "1.0.0"}`);
|
|
842
842
|
if (inst) {
|
|
843
843
|
installedCount++;
|
|
844
|
-
const status =
|
|
844
|
+
const status = pc5.green("\u2713");
|
|
845
845
|
const hasUpdate = item.version && inst.version !== item.version;
|
|
846
|
-
const updateTag = hasUpdate ?
|
|
846
|
+
const updateTag = hasUpdate ? pc5.yellow(` \u2B06 v${item.version} available`) : "";
|
|
847
847
|
if (hasUpdate) updateCount++;
|
|
848
|
-
p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${
|
|
848
|
+
p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc5.dim(item.description)}${updateTag}`);
|
|
849
849
|
} else {
|
|
850
|
-
const status =
|
|
851
|
-
p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${
|
|
850
|
+
const status = pc5.dim("\u25CB");
|
|
851
|
+
p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc5.dim(item.description)}`);
|
|
852
852
|
}
|
|
853
853
|
}
|
|
854
854
|
}
|
|
@@ -856,7 +856,7 @@ ${group.charAt(0).toUpperCase() + group.slice(1)}s:`));
|
|
|
856
856
|
const parts = [`${installedCount} installed`, `${availableCount} available`];
|
|
857
857
|
if (updateCount > 0) parts.push(`${updateCount} update${updateCount === 1 ? "" : "s"} available`);
|
|
858
858
|
p3.log.message("");
|
|
859
|
-
p3.log.message(
|
|
859
|
+
p3.log.message(pc5.dim(` ${parts.join(", ")}`));
|
|
860
860
|
}
|
|
861
861
|
var init_list = __esm({
|
|
862
862
|
"src/commands/list.ts"() {
|
|
@@ -872,7 +872,7 @@ __export(diff_exports, {
|
|
|
872
872
|
diffCommand: () => diffCommand
|
|
873
873
|
});
|
|
874
874
|
import * as p4 from "@clack/prompts";
|
|
875
|
-
import { join as
|
|
875
|
+
import { join as join7 } from "path";
|
|
876
876
|
async function diffCommand(componentName) {
|
|
877
877
|
const cwd = process.cwd();
|
|
878
878
|
const config = await readConfig(cwd);
|
|
@@ -902,8 +902,8 @@ async function diffCommand(componentName) {
|
|
|
902
902
|
for (const file of registryItem.files) {
|
|
903
903
|
if (indexItem.type === "kitn:package") {
|
|
904
904
|
const baseDir = config.aliases.base ?? "src/ai";
|
|
905
|
-
const localPath =
|
|
906
|
-
const relativePath =
|
|
905
|
+
const localPath = join7(cwd, baseDir, file.path);
|
|
906
|
+
const relativePath = join7(baseDir, file.path);
|
|
907
907
|
const localContent = await readExistingFile(localPath);
|
|
908
908
|
if (localContent === null) {
|
|
909
909
|
p4.log.warn(`${relativePath}: file missing locally`);
|
|
@@ -927,7 +927,7 @@ async function diffCommand(componentName) {
|
|
|
927
927
|
return "storage";
|
|
928
928
|
}
|
|
929
929
|
})();
|
|
930
|
-
const localPath =
|
|
930
|
+
const localPath = join7(cwd, config.aliases[aliasKey], fileName);
|
|
931
931
|
const localContent = await readExistingFile(localPath);
|
|
932
932
|
if (localContent === null) {
|
|
933
933
|
p4.log.warn(`${fileName}: file missing locally`);
|
|
@@ -960,8 +960,8 @@ __export(remove_exports, {
|
|
|
960
960
|
removeCommand: () => removeCommand
|
|
961
961
|
});
|
|
962
962
|
import * as p5 from "@clack/prompts";
|
|
963
|
-
import
|
|
964
|
-
import { join as
|
|
963
|
+
import pc6 from "picocolors";
|
|
964
|
+
import { join as join8 } from "path";
|
|
965
965
|
import { unlink } from "fs/promises";
|
|
966
966
|
async function removeCommand(componentName) {
|
|
967
967
|
const cwd = process.cwd();
|
|
@@ -989,7 +989,7 @@ async function removeCommand(componentName) {
|
|
|
989
989
|
const deleted = [];
|
|
990
990
|
for (const filePath of installed.files) {
|
|
991
991
|
try {
|
|
992
|
-
await unlink(
|
|
992
|
+
await unlink(join8(cwd, filePath));
|
|
993
993
|
deleted.push(filePath);
|
|
994
994
|
} catch {
|
|
995
995
|
p5.log.warn(`Could not delete ${filePath} (may have been moved or renamed)`);
|
|
@@ -1002,7 +1002,7 @@ async function removeCommand(componentName) {
|
|
|
1002
1002
|
await writeConfig(cwd, config);
|
|
1003
1003
|
if (deleted.length > 0) {
|
|
1004
1004
|
p5.log.success(`Removed ${ref.name}:`);
|
|
1005
|
-
for (const f of deleted) p5.log.message(` ${
|
|
1005
|
+
for (const f of deleted) p5.log.message(` ${pc6.red("-")} ${f}`);
|
|
1006
1006
|
}
|
|
1007
1007
|
}
|
|
1008
1008
|
var init_remove = __esm({
|
|
@@ -1050,7 +1050,7 @@ __export(info_exports, {
|
|
|
1050
1050
|
infoCommand: () => infoCommand
|
|
1051
1051
|
});
|
|
1052
1052
|
import * as p7 from "@clack/prompts";
|
|
1053
|
-
import
|
|
1053
|
+
import pc7 from "picocolors";
|
|
1054
1054
|
async function infoCommand(component) {
|
|
1055
1055
|
const cwd = process.cwd();
|
|
1056
1056
|
const config = await readConfig(cwd);
|
|
@@ -1066,13 +1066,13 @@ async function infoCommand(component) {
|
|
|
1066
1066
|
try {
|
|
1067
1067
|
index = await fetcher.fetchIndex(ref.namespace);
|
|
1068
1068
|
} catch (err) {
|
|
1069
|
-
s.stop(
|
|
1069
|
+
s.stop(pc7.red("Failed to fetch registry"));
|
|
1070
1070
|
p7.log.error(err.message);
|
|
1071
1071
|
process.exit(1);
|
|
1072
1072
|
}
|
|
1073
1073
|
const indexItem = index.items.find((i) => i.name === ref.name);
|
|
1074
1074
|
if (!indexItem) {
|
|
1075
|
-
s.stop(
|
|
1075
|
+
s.stop(pc7.red("Component not found"));
|
|
1076
1076
|
p7.log.error(`Component '${ref.name}' not found in registry.`);
|
|
1077
1077
|
process.exit(1);
|
|
1078
1078
|
}
|
|
@@ -1081,7 +1081,7 @@ async function infoCommand(component) {
|
|
|
1081
1081
|
try {
|
|
1082
1082
|
item = await fetcher.fetchItem(ref.name, dir, ref.namespace, ref.version);
|
|
1083
1083
|
} catch (err) {
|
|
1084
|
-
s.stop(
|
|
1084
|
+
s.stop(pc7.red("Failed to fetch component"));
|
|
1085
1085
|
p7.log.error(err.message);
|
|
1086
1086
|
process.exit(1);
|
|
1087
1087
|
}
|
|
@@ -1090,62 +1090,62 @@ async function infoCommand(component) {
|
|
|
1090
1090
|
const typeName = indexItem.type.replace("kitn:", "");
|
|
1091
1091
|
console.log();
|
|
1092
1092
|
console.log(
|
|
1093
|
-
` ${
|
|
1093
|
+
` ${pc7.bold(item.name)} ${pc7.cyan(`v${version}`)}${" ".repeat(Math.max(1, 40 - item.name.length - version.length - 2))}${pc7.dim(ref.namespace)}`
|
|
1094
1094
|
);
|
|
1095
|
-
console.log(` ${
|
|
1095
|
+
console.log(` ${pc7.dim(item.description)}`);
|
|
1096
1096
|
console.log();
|
|
1097
|
-
console.log(` ${
|
|
1097
|
+
console.log(` ${pc7.dim("Type:")} ${typeName}`);
|
|
1098
1098
|
if (item.dependencies?.length) {
|
|
1099
1099
|
console.log(
|
|
1100
|
-
` ${
|
|
1100
|
+
` ${pc7.dim("Dependencies:")} ${item.dependencies.join(", ")}`
|
|
1101
1101
|
);
|
|
1102
1102
|
}
|
|
1103
1103
|
if (item.registryDependencies?.length) {
|
|
1104
1104
|
console.log(
|
|
1105
|
-
` ${
|
|
1105
|
+
` ${pc7.dim("Registry deps:")} ${item.registryDependencies.join(", ")}`
|
|
1106
1106
|
);
|
|
1107
1107
|
}
|
|
1108
1108
|
if (item.categories?.length) {
|
|
1109
1109
|
console.log(
|
|
1110
|
-
` ${
|
|
1110
|
+
` ${pc7.dim("Categories:")} ${item.categories.join(", ")}`
|
|
1111
1111
|
);
|
|
1112
1112
|
}
|
|
1113
1113
|
if (item.updatedAt) {
|
|
1114
|
-
console.log(` ${
|
|
1114
|
+
console.log(` ${pc7.dim("Updated:")} ${item.updatedAt}`);
|
|
1115
1115
|
}
|
|
1116
1116
|
const versions = indexItem.versions;
|
|
1117
1117
|
if (versions?.length) {
|
|
1118
|
-
console.log(` ${
|
|
1118
|
+
console.log(` ${pc7.dim("Versions:")} ${versions.join(", ")}`);
|
|
1119
1119
|
}
|
|
1120
1120
|
if (item.changelog?.length) {
|
|
1121
1121
|
console.log();
|
|
1122
|
-
console.log(` ${
|
|
1122
|
+
console.log(` ${pc7.bold("Changelog:")}`);
|
|
1123
1123
|
for (const entry of item.changelog) {
|
|
1124
|
-
const tag = entry.type === "feature" ?
|
|
1124
|
+
const tag = entry.type === "feature" ? pc7.green(entry.type) : entry.type === "fix" ? pc7.yellow(entry.type) : entry.type === "breaking" ? pc7.red(entry.type) : pc7.dim(entry.type);
|
|
1125
1125
|
console.log(
|
|
1126
|
-
` ${
|
|
1126
|
+
` ${pc7.cyan(entry.version)} ${pc7.dim(entry.date)} ${tag} ${entry.note}`
|
|
1127
1127
|
);
|
|
1128
1128
|
}
|
|
1129
1129
|
}
|
|
1130
1130
|
console.log();
|
|
1131
1131
|
const fileCount = item.files.length;
|
|
1132
|
-
console.log(` ${
|
|
1132
|
+
console.log(` ${pc7.bold(`Files:`)} ${pc7.dim(`(${fileCount})`)}`);
|
|
1133
1133
|
const maxShown = 10;
|
|
1134
1134
|
for (const file of item.files.slice(0, maxShown)) {
|
|
1135
|
-
console.log(` ${
|
|
1135
|
+
console.log(` ${pc7.dim(file.path)}`);
|
|
1136
1136
|
}
|
|
1137
1137
|
if (fileCount > maxShown) {
|
|
1138
|
-
console.log(` ${
|
|
1138
|
+
console.log(` ${pc7.dim(`... and ${fileCount - maxShown} more`)}`);
|
|
1139
1139
|
}
|
|
1140
1140
|
const installed = config.installed?.[item.name];
|
|
1141
1141
|
if (installed) {
|
|
1142
1142
|
console.log();
|
|
1143
1143
|
console.log(
|
|
1144
|
-
` ${
|
|
1144
|
+
` ${pc7.green("Installed")} ${pc7.dim(`v${installed.version}`)}`
|
|
1145
1145
|
);
|
|
1146
1146
|
if (version !== installed.version) {
|
|
1147
1147
|
console.log(
|
|
1148
|
-
` ${
|
|
1148
|
+
` ${pc7.yellow("Update available:")} ${pc7.dim(`v${installed.version}`)} \u2192 ${pc7.cyan(`v${version}`)}`
|
|
1149
1149
|
);
|
|
1150
1150
|
}
|
|
1151
1151
|
}
|
|
@@ -1169,7 +1169,7 @@ __export(registry_exports, {
|
|
|
1169
1169
|
registryRemoveCommand: () => registryRemoveCommand
|
|
1170
1170
|
});
|
|
1171
1171
|
import * as p8 from "@clack/prompts";
|
|
1172
|
-
import
|
|
1172
|
+
import pc8 from "picocolors";
|
|
1173
1173
|
async function registryAddCommand(namespace, url, opts = {}) {
|
|
1174
1174
|
const cwd = opts.cwd ?? process.cwd();
|
|
1175
1175
|
const config = await readConfig(cwd);
|
|
@@ -1188,8 +1188,8 @@ async function registryAddCommand(namespace, url, opts = {}) {
|
|
|
1188
1188
|
}
|
|
1189
1189
|
config.registries[namespace] = url;
|
|
1190
1190
|
await writeConfig(cwd, config);
|
|
1191
|
-
p8.log.success(`Added registry ${
|
|
1192
|
-
p8.log.message(
|
|
1191
|
+
p8.log.success(`Added registry ${pc8.bold(namespace)}`);
|
|
1192
|
+
p8.log.message(pc8.dim(` ${url}`));
|
|
1193
1193
|
}
|
|
1194
1194
|
async function registryRemoveCommand(namespace, opts = {}) {
|
|
1195
1195
|
const cwd = opts.cwd ?? process.cwd();
|
|
@@ -1211,11 +1211,11 @@ async function registryRemoveCommand(namespace, opts = {}) {
|
|
|
1211
1211
|
}
|
|
1212
1212
|
delete config.registries[namespace];
|
|
1213
1213
|
await writeConfig(cwd, config);
|
|
1214
|
-
p8.log.success(`Removed registry ${
|
|
1214
|
+
p8.log.success(`Removed registry ${pc8.bold(namespace)}`);
|
|
1215
1215
|
if (affectedComponents.length > 0) {
|
|
1216
1216
|
p8.log.warn(`${affectedComponents.length} installed component(s) referenced this registry:`);
|
|
1217
1217
|
for (const name of affectedComponents) {
|
|
1218
|
-
p8.log.message(` ${
|
|
1218
|
+
p8.log.message(` ${pc8.yellow("!")} ${name}`);
|
|
1219
1219
|
}
|
|
1220
1220
|
}
|
|
1221
1221
|
return { affectedComponents };
|
|
@@ -1226,10 +1226,10 @@ async function registryListCommand(opts = {}) {
|
|
|
1226
1226
|
if (!config) throw new Error("No kitn.json found. Run `kitn init` first.");
|
|
1227
1227
|
const entries = Object.entries(config.registries).map(([namespace, url]) => ({ namespace, url }));
|
|
1228
1228
|
if (entries.length === 0) {
|
|
1229
|
-
p8.log.message(
|
|
1229
|
+
p8.log.message(pc8.dim(" No registries configured."));
|
|
1230
1230
|
} else {
|
|
1231
1231
|
for (const { namespace, url } of entries) {
|
|
1232
|
-
p8.log.message(` ${
|
|
1232
|
+
p8.log.message(` ${pc8.bold(namespace.padEnd(16))} ${pc8.dim(url)}`);
|
|
1233
1233
|
}
|
|
1234
1234
|
}
|
|
1235
1235
|
return entries;
|
|
@@ -1243,7 +1243,85 @@ var init_registry = __esm({
|
|
|
1243
1243
|
|
|
1244
1244
|
// src/index.ts
|
|
1245
1245
|
import { Command } from "commander";
|
|
1246
|
-
|
|
1246
|
+
|
|
1247
|
+
// src/utils/update-check.ts
|
|
1248
|
+
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
1249
|
+
import { join } from "path";
|
|
1250
|
+
import { homedir } from "os";
|
|
1251
|
+
import pc from "picocolors";
|
|
1252
|
+
var CACHE_DIR = join(homedir(), ".kitn");
|
|
1253
|
+
var CACHE_FILE = join(CACHE_DIR, "update-check.json");
|
|
1254
|
+
var CHECK_INTERVAL = 60 * 60 * 1e3;
|
|
1255
|
+
async function readCache() {
|
|
1256
|
+
try {
|
|
1257
|
+
const raw = await readFile(CACHE_FILE, "utf-8");
|
|
1258
|
+
return JSON.parse(raw);
|
|
1259
|
+
} catch {
|
|
1260
|
+
return null;
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
async function writeCache(entry) {
|
|
1264
|
+
try {
|
|
1265
|
+
await mkdir(CACHE_DIR, { recursive: true });
|
|
1266
|
+
await writeFile(CACHE_FILE, JSON.stringify(entry));
|
|
1267
|
+
} catch {
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
async function fetchLatestVersion() {
|
|
1271
|
+
try {
|
|
1272
|
+
const controller = new AbortController();
|
|
1273
|
+
const timeout = setTimeout(() => controller.abort(), 3e3);
|
|
1274
|
+
const res = await fetch("https://registry.npmjs.org/@kitnai/cli/latest", {
|
|
1275
|
+
signal: controller.signal
|
|
1276
|
+
});
|
|
1277
|
+
clearTimeout(timeout);
|
|
1278
|
+
if (!res.ok) return null;
|
|
1279
|
+
const data = await res.json();
|
|
1280
|
+
return data.version ?? null;
|
|
1281
|
+
} catch {
|
|
1282
|
+
return null;
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
function isNewer(latest, current) {
|
|
1286
|
+
const [lMaj, lMin, lPat] = latest.split(".").map(Number);
|
|
1287
|
+
const [cMaj, cMin, cPat] = current.split(".").map(Number);
|
|
1288
|
+
if (lMaj !== cMaj) return lMaj > cMaj;
|
|
1289
|
+
if (lMin !== cMin) return lMin > cMin;
|
|
1290
|
+
return lPat > cPat;
|
|
1291
|
+
}
|
|
1292
|
+
function startUpdateCheck(currentVersion) {
|
|
1293
|
+
let message = "";
|
|
1294
|
+
const check = (async () => {
|
|
1295
|
+
const cache = await readCache();
|
|
1296
|
+
let latest = null;
|
|
1297
|
+
if (cache && Date.now() - cache.checkedAt < CHECK_INTERVAL) {
|
|
1298
|
+
latest = cache.latest;
|
|
1299
|
+
} else {
|
|
1300
|
+
latest = await fetchLatestVersion();
|
|
1301
|
+
if (latest) {
|
|
1302
|
+
await writeCache({ latest, checkedAt: Date.now() });
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
if (latest && isNewer(latest, currentVersion)) {
|
|
1306
|
+
message = [
|
|
1307
|
+
"",
|
|
1308
|
+
pc.yellow(` Update available: ${pc.dim(currentVersion)} \u2192 ${pc.green(latest)}`),
|
|
1309
|
+
pc.dim(` Run ${pc.cyan("npx @kitnai/cli@latest")} or ${pc.cyan("npm i -g @kitnai/cli")}`),
|
|
1310
|
+
""
|
|
1311
|
+
].join("\n");
|
|
1312
|
+
}
|
|
1313
|
+
})();
|
|
1314
|
+
check.catch(() => {
|
|
1315
|
+
});
|
|
1316
|
+
return () => {
|
|
1317
|
+
if (message) process.stderr.write(message);
|
|
1318
|
+
};
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
// src/index.ts
|
|
1322
|
+
var VERSION = true ? "0.1.5" : "0.0.0-dev";
|
|
1323
|
+
var printUpdateNotice = startUpdateCheck(VERSION);
|
|
1324
|
+
var program = new Command().name("kitn").description("Install AI agent components from the kitn registry").version(VERSION);
|
|
1247
1325
|
program.command("init").description("Initialize kitn in your project").action(async () => {
|
|
1248
1326
|
const { initCommand: initCommand2 } = await Promise.resolve().then(() => (init_init(), init_exports));
|
|
1249
1327
|
await initCommand2();
|
|
@@ -1285,5 +1363,6 @@ registry.command("list").description("List all configured registries").action(as
|
|
|
1285
1363
|
const { registryListCommand: registryListCommand2 } = await Promise.resolve().then(() => (init_registry(), registry_exports));
|
|
1286
1364
|
await registryListCommand2();
|
|
1287
1365
|
});
|
|
1288
|
-
program.
|
|
1366
|
+
await program.parseAsync();
|
|
1367
|
+
printUpdateNotice();
|
|
1289
1368
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/config.ts","../src/commands/init.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-checker.ts","../src/installers/import-rewriter.ts","../src/installers/tsconfig-patcher.ts","../src/utils/hash.ts","../src/utils/parse-ref.ts","../src/registry/schema.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/commands/info.ts","../src/commands/registry.ts","../src/index.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\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(), z.string()),\n installed: z.record(z.string(), installedComponentSchema).optional(),\n});\n\nexport type KitnConfig = z.infer<typeof configSchema>;\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<ComponentType, RequiredAliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n};\n\nexport function getInstallPath(\n config: KitnConfig,\n type: ComponentType,\n fileName: string\n): string {\n const aliasKey = typeToAliasKey[type];\n return join(config.aliases[aliasKey], fileName);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\n\nexport async function initCommand() {\n p.intro(pc.bgCyan(pc.black(\" kitn \")));\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 framework = await p.select({\n message: \"Which framework are you using?\",\n options: [\n { value: \"hono\", label: \"Hono\", hint: \"recommended\" },\n { value: \"cloudflare\", label: \"Cloudflare Workers\", hint: \"coming soon\" },\n { value: \"elysia\", label: \"Elysia\", hint: \"coming soon\" },\n { value: \"fastify\", label: \"Fastify\", hint: \"coming soon\" },\n { value: \"express\", label: \"Express\", hint: \"coming soon\" },\n ],\n });\n if (p.isCancel(framework)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const base = await p.text({\n message: \"Where should kitn packages 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: framework as \"hono\" | \"cloudflare\" | \"elysia\" | \"fastify\" | \"express\",\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\": \"https://kitn-ai.github.io/registry/r/{type}/{name}.json\",\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 p.outro(pc.green(\"Done! Run `kitn add core` to install the engine, then `kitn add routes` for HTTP routes.\"));\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\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"package\";\ntype FetchFn = (url: string) => Promise<RegistryItem>;\n\nexport class RegistryFetcher {\n private registries: Record<string, string>;\n private cache = new Map<string, Promise<RegistryItem>>();\n private fetchFn: FetchFn;\n\n constructor(registries: Record<string, string>, 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 template = this.registries[namespace];\n if (!template) throw new Error(`No registry configured for ${namespace}`);\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 template = this.registries[namespace];\n if (!template) throw new Error(`No registry configured for ${namespace}`);\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 pc from \"picocolors\";\n\nexport function checkEnvVars(envVars: Record<string, string>): string[] {\n const missing: string[] = [];\n for (const [key, description] of Object.entries(envVars)) {\n if (!process.env[key]) {\n missing.push(` ${pc.yellow(key)}: ${description}`);\n }\n }\n return missing;\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 { 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 * Returns the updated JSON string.\n */\nexport function patchTsconfig(\n tsconfigContent: string,\n paths: Record<string, 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 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): 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);\n await writeFile(tsconfigPath, patched);\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 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(), z.string()).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 { checkEnvVars } from \"../installers/env-checker.js\";\nimport { rewriteKitnImports } from \"../installers/import-rewriter.js\";\nimport { patchProjectTsconfig } from \"../installers/tsconfig-patcher.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\";\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 const allEnvWarnings: string[] = [];\n\n for (const item of resolved) {\n if (item.dependencies) allDeps.push(...item.dependencies);\n if (item.envVars) {\n allEnvWarnings.push(...checkEnvVars(item.envVars));\n }\n\n if (item.type === \"kitn:package\") {\n // Package install — multi-file, preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n\n for (const file of item.files) {\n const targetPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n\n const status = await checkFileStatus(targetPath, file.content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, file.content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", file.content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Patch tsconfig.json with package paths\n if (item.tsconfig) {\n const resolvedPaths: Record<string, string[]> = {};\n const installDir = item.installDir ?? item.name;\n for (const [key, values] of Object.entries(item.tsconfig)) {\n resolvedPaths[key] = values.map((v) => `./${join(baseDir, installDir, v)}`);\n }\n await patchProjectTsconfig(cwd, resolvedPaths);\n p.log.info(`Patched tsconfig.json with paths: ${Object.keys(resolvedPaths).join(\", \")}`);\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 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 targetPath = join(cwd, config.aliases[aliasKey], fileName);\n const relativePath = join(config.aliases[aliasKey], fileName);\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 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) => {\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 const fileName = f.path.split(\"/\").pop()!;\n return join(config.aliases[aliasKey], fileName);\n }),\n hash: contentHash(allContent),\n };\n config.installed = installed;\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 if (allEnvWarnings.length > 0) {\n p.log.warn(\"Missing environment variables:\");\n for (const w of allEnvWarnings) p.log.message(w);\n }\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 p.outro(pc.green(\"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}\n\ntype IndexItemWithNamespace = RegistryIndex[\"items\"][number] & { namespace: string };\n\nexport async function listCommand(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 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 index...\");\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 across ${namespacesToFetch.length - errors.length} ${namespacesToFetch.length - errors.length === 1 ? \"registry\" : \"registries\"}`);\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 if (opts.type && !item.type.endsWith(opts.type)) continue;\n\n const group = item.type.replace(\"kitn:\", \"\");\n if (!typeGroups.has(group)) typeGroups.set(group, []);\n typeGroups.get(group)!.push(item);\n }\n\n let installedCount = 0;\n let updateCount = 0;\n\n for (const [group, items] of typeGroups) {\n p.log.message(pc.bold(`\\n${group.charAt(0).toUpperCase() + group.slice(1)}s:`));\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 version = pc.dim(`v${item.version ?? \"1.0.0\"}`);\n\n if (inst) {\n installedCount++;\n const status = pc.green(\"✓\");\n const hasUpdate = item.version && inst.version !== item.version;\n const updateTag = hasUpdate ? pc.yellow(` ⬆ v${item.version} available`) : \"\";\n if (hasUpdate) updateCount++;\n p.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc.dim(item.description)}${updateTag}`);\n } else {\n const status = pc.dim(\"○\");\n p.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc.dim(item.description)}`);\n }\n }\n }\n\n const availableCount = allItems.length - installedCount;\n const parts = [`${installedCount} installed`, `${availableCount} available`];\n if (updateCount > 0) parts.push(`${updateCount} update${updateCount === 1 ? \"\" : \"s\"} available`);\n p.log.message(\"\");\n p.log.message(pc.dim(` ${parts.join(\", \")}`));\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 } from \"path\";\nimport { unlink } from \"fs/promises\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.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 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 * 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 } from \"../utils/config.js\";\n\ninterface RegistryAddOptions {\n cwd?: string;\n overwrite?: boolean;\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 config.registries[namespace] = url;\n await writeConfig(cwd, config);\n\n p.log.success(`Added registry ${pc.bold(namespace)}`);\n p.log.message(pc.dim(` ${url}`));\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 }>> {\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, url]) => ({ namespace, url }));\n\n if (entries.length === 0) {\n p.log.message(pc.dim(\" No registries configured.\"));\n } else {\n for (const { namespace, url } of entries) {\n p.log.message(` ${pc.bold(namespace.padEnd(16))} ${pc.dim(url)}`);\n }\n }\n\n return entries;\n}\n","import { Command } from \"commander\";\n\nconst program = new Command()\n .name(\"kitn\")\n .description(\"Install AI agent components from the kitn registry\")\n .version(\"0.1.0\");\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 .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 .action(async (opts) => {\n const { listCommand } = await import(\"./commands/list.js\");\n await listCommand(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(\"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 .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\nprogram.parse();\n"],"mappings":"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","names":["join","readFile","writeFile","access","pc","join","readFile","writeFile","join","text","z","componentType","p","pc","join","p","pc","p","join","p","pc","join","p","p","pc","p","pc","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand","infoCommand","registryAddCommand","registryRemoveCommand","registryListCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/config.ts","../src/commands/init.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-checker.ts","../src/installers/import-rewriter.ts","../src/installers/tsconfig-patcher.ts","../src/utils/hash.ts","../src/utils/parse-ref.ts","../src/registry/schema.ts","../src/commands/add.ts","../src/commands/list.ts","../src/commands/diff.ts","../src/commands/remove.ts","../src/commands/update.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\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(), z.string()),\n installed: z.record(z.string(), installedComponentSchema).optional(),\n});\n\nexport type KitnConfig = z.infer<typeof configSchema>;\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<ComponentType, RequiredAliasKey> = {\n \"kitn:agent\": \"agents\",\n \"kitn:tool\": \"tools\",\n \"kitn:skill\": \"skills\",\n \"kitn:storage\": \"storage\",\n};\n\nexport function getInstallPath(\n config: KitnConfig,\n type: ComponentType,\n fileName: string\n): string {\n const aliasKey = typeToAliasKey[type];\n return join(config.aliases[aliasKey], fileName);\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\n\nexport async function initCommand() {\n p.intro(pc.bgCyan(pc.black(\" kitn \")));\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 framework = await p.select({\n message: \"Which framework are you using?\",\n options: [\n { value: \"hono\", label: \"Hono\", hint: \"recommended\" },\n { value: \"cloudflare\", label: \"Cloudflare Workers\", hint: \"coming soon\" },\n { value: \"elysia\", label: \"Elysia\", hint: \"coming soon\" },\n { value: \"fastify\", label: \"Fastify\", hint: \"coming soon\" },\n { value: \"express\", label: \"Express\", hint: \"coming soon\" },\n ],\n });\n if (p.isCancel(framework)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const base = await p.text({\n message: \"Where should kitn packages 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: framework as \"hono\" | \"cloudflare\" | \"elysia\" | \"fastify\" | \"express\",\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\": \"https://kitn-ai.github.io/registry/r/{type}/{name}.json\",\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 p.outro(pc.green(\"Done! Run `kitn add core` to install the engine, then `kitn add routes` for HTTP routes.\"));\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\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\" | \"package\";\ntype FetchFn = (url: string) => Promise<RegistryItem>;\n\nexport class RegistryFetcher {\n private registries: Record<string, string>;\n private cache = new Map<string, Promise<RegistryItem>>();\n private fetchFn: FetchFn;\n\n constructor(registries: Record<string, string>, 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 template = this.registries[namespace];\n if (!template) throw new Error(`No registry configured for ${namespace}`);\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 template = this.registries[namespace];\n if (!template) throw new Error(`No registry configured for ${namespace}`);\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 pc from \"picocolors\";\n\nexport function checkEnvVars(envVars: Record<string, string>): string[] {\n const missing: string[] = [];\n for (const [key, description] of Object.entries(envVars)) {\n if (!process.env[key]) {\n missing.push(` ${pc.yellow(key)}: ${description}`);\n }\n }\n return missing;\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 { 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 * Returns the updated JSON string.\n */\nexport function patchTsconfig(\n tsconfigContent: string,\n paths: Record<string, 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 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): 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);\n await writeFile(tsconfigPath, patched);\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 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(), z.string()).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 { checkEnvVars } from \"../installers/env-checker.js\";\nimport { rewriteKitnImports } from \"../installers/import-rewriter.js\";\nimport { patchProjectTsconfig } from \"../installers/tsconfig-patcher.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\";\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 const allEnvWarnings: string[] = [];\n\n for (const item of resolved) {\n if (item.dependencies) allDeps.push(...item.dependencies);\n if (item.envVars) {\n allEnvWarnings.push(...checkEnvVars(item.envVars));\n }\n\n if (item.type === \"kitn:package\") {\n // Package install — multi-file, preserved directory structure\n const baseDir = config.aliases.base ?? \"src/ai\";\n\n for (const file of item.files) {\n const targetPath = join(cwd, baseDir, file.path);\n const relativePath = join(baseDir, file.path);\n\n const status = await checkFileStatus(targetPath, file.content);\n\n switch (status) {\n case FileStatus.New:\n await writeComponentFile(targetPath, file.content);\n created.push(relativePath);\n break;\n\n case FileStatus.Identical:\n skipped.push(relativePath);\n break;\n\n case FileStatus.Different:\n if (opts.overwrite) {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n const existing = await readExistingFile(targetPath);\n const diff = generateDiff(relativePath, existing ?? \"\", file.content);\n p.log.message(pc.dim(diff));\n\n const action = await p.select({\n message: `${relativePath} already exists and differs. What to do?`,\n options: [\n { value: \"skip\", label: \"Keep local version\" },\n { value: \"overwrite\", label: \"Overwrite with registry version\" },\n ],\n });\n\n if (!p.isCancel(action) && action === \"overwrite\") {\n await writeComponentFile(targetPath, file.content);\n updated.push(relativePath);\n } else {\n skipped.push(relativePath);\n }\n }\n break;\n }\n }\n\n // Patch tsconfig.json with package paths\n if (item.tsconfig) {\n const resolvedPaths: Record<string, string[]> = {};\n const installDir = item.installDir ?? item.name;\n for (const [key, values] of Object.entries(item.tsconfig)) {\n resolvedPaths[key] = values.map((v) => `./${join(baseDir, installDir, v)}`);\n }\n await patchProjectTsconfig(cwd, resolvedPaths);\n p.log.info(`Patched tsconfig.json with paths: ${Object.keys(resolvedPaths).join(\", \")}`);\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 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 targetPath = join(cwd, config.aliases[aliasKey], fileName);\n const relativePath = join(config.aliases[aliasKey], fileName);\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 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) => {\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 const fileName = f.path.split(\"/\").pop()!;\n return join(config.aliases[aliasKey], fileName);\n }),\n hash: contentHash(allContent),\n };\n config.installed = installed;\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 if (allEnvWarnings.length > 0) {\n p.log.warn(\"Missing environment variables:\");\n for (const w of allEnvWarnings) p.log.message(w);\n }\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 p.outro(pc.green(\"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}\n\ntype IndexItemWithNamespace = RegistryIndex[\"items\"][number] & { namespace: string };\n\nexport async function listCommand(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 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 index...\");\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 across ${namespacesToFetch.length - errors.length} ${namespacesToFetch.length - errors.length === 1 ? \"registry\" : \"registries\"}`);\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 if (opts.type && !item.type.endsWith(opts.type)) continue;\n\n const group = item.type.replace(\"kitn:\", \"\");\n if (!typeGroups.has(group)) typeGroups.set(group, []);\n typeGroups.get(group)!.push(item);\n }\n\n let installedCount = 0;\n let updateCount = 0;\n\n for (const [group, items] of typeGroups) {\n p.log.message(pc.bold(`\\n${group.charAt(0).toUpperCase() + group.slice(1)}s:`));\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 version = pc.dim(`v${item.version ?? \"1.0.0\"}`);\n\n if (inst) {\n installedCount++;\n const status = pc.green(\"✓\");\n const hasUpdate = item.version && inst.version !== item.version;\n const updateTag = hasUpdate ? pc.yellow(` ⬆ v${item.version} available`) : \"\";\n if (hasUpdate) updateCount++;\n p.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc.dim(item.description)}${updateTag}`);\n } else {\n const status = pc.dim(\"○\");\n p.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc.dim(item.description)}`);\n }\n }\n }\n\n const availableCount = allItems.length - installedCount;\n const parts = [`${installedCount} installed`, `${availableCount} available`];\n if (updateCount > 0) parts.push(`${updateCount} update${updateCount === 1 ? \"\" : \"s\"} available`);\n p.log.message(\"\");\n p.log.message(pc.dim(` ${parts.join(\", \")}`));\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 } from \"path\";\nimport { unlink } from \"fs/promises\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\nimport { parseComponentRef } from \"../utils/parse-ref.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 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 * 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 } from \"../utils/config.js\";\n\ninterface RegistryAddOptions {\n cwd?: string;\n overwrite?: boolean;\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 config.registries[namespace] = url;\n await writeConfig(cwd, config);\n\n p.log.success(`Added registry ${pc.bold(namespace)}`);\n p.log.message(pc.dim(` ${url}`));\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 }>> {\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, url]) => ({ namespace, url }));\n\n if (entries.length === 0) {\n p.log.message(pc.dim(\" No registries configured.\"));\n } else {\n for (const { namespace, url } of entries) {\n p.log.message(` ${pc.bold(namespace.padEnd(16))} ${pc.dim(url)}`);\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 .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 .action(async (opts) => {\n const { listCommand } = await import(\"./commands/list.js\");\n await listCommand(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(\"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 .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","pc","join","readFile","writeFile","mkdir","access","pc","join","readFile","writeFile","join","text","z","componentType","p","pc","join","p","pc","p","join","p","pc","join","p","p","pc","p","pc","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand","infoCommand","registryAddCommand","registryRemoveCommand","registryListCommand"]}
|