@kitnai/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,826 @@
1
+ #!/usr/bin/env node
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __esm = (fn, res) => function __init() {
5
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
6
+ };
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+
12
+ // src/utils/config.ts
13
+ import { readFile, writeFile } from "fs/promises";
14
+ import { join } from "path";
15
+ import { z } from "zod";
16
+ async function readConfig(projectDir) {
17
+ try {
18
+ const raw = await readFile(join(projectDir, CONFIG_FILE), "utf-8");
19
+ return configSchema.parse(JSON.parse(raw));
20
+ } catch {
21
+ return null;
22
+ }
23
+ }
24
+ async function writeConfig(projectDir, config) {
25
+ const data = { $schema: "https://kitn.dev/schema/config.json", ...config };
26
+ await writeFile(join(projectDir, CONFIG_FILE), JSON.stringify(data, null, 2) + "\n");
27
+ }
28
+ var componentType, installedComponentSchema, configSchema, CONFIG_FILE;
29
+ var init_config = __esm({
30
+ "src/utils/config.ts"() {
31
+ "use strict";
32
+ componentType = z.enum(["kitn:agent", "kitn:tool", "kitn:skill", "kitn:storage"]);
33
+ installedComponentSchema = z.object({
34
+ version: z.string(),
35
+ installedAt: z.string(),
36
+ files: z.array(z.string()),
37
+ hash: z.string()
38
+ });
39
+ configSchema = z.object({
40
+ $schema: z.string().optional(),
41
+ runtime: z.enum(["bun", "node", "deno"]),
42
+ aliases: z.object({
43
+ agents: z.string(),
44
+ tools: z.string(),
45
+ skills: z.string(),
46
+ storage: z.string()
47
+ }),
48
+ registries: z.record(z.string(), z.string()),
49
+ _installed: z.record(z.string(), installedComponentSchema).optional()
50
+ });
51
+ CONFIG_FILE = "kitn.json";
52
+ }
53
+ });
54
+
55
+ // src/utils/detect.ts
56
+ import { access } from "fs/promises";
57
+ import { join as join2 } from "path";
58
+ async function detectPackageManager(dir) {
59
+ for (const [lockfile, pm] of LOCKFILE_MAP) {
60
+ try {
61
+ await access(join2(dir, lockfile));
62
+ return pm;
63
+ } catch {
64
+ }
65
+ }
66
+ return null;
67
+ }
68
+ var LOCKFILE_MAP;
69
+ var init_detect = __esm({
70
+ "src/utils/detect.ts"() {
71
+ "use strict";
72
+ LOCKFILE_MAP = [
73
+ ["bun.lock", "bun"],
74
+ ["bun.lockb", "bun"],
75
+ ["pnpm-lock.yaml", "pnpm"],
76
+ ["yarn.lock", "yarn"],
77
+ ["package-lock.json", "npm"]
78
+ ];
79
+ }
80
+ });
81
+
82
+ // src/installers/dep-installer.ts
83
+ import { execSync } from "child_process";
84
+ function installDependencies(pm, deps, projectDir) {
85
+ if (deps.length === 0) return;
86
+ const pkgs = deps.join(" ");
87
+ const cmd = (() => {
88
+ switch (pm) {
89
+ case "bun":
90
+ return `bun add ${pkgs}`;
91
+ case "pnpm":
92
+ return `pnpm add ${pkgs}`;
93
+ case "yarn":
94
+ return `yarn add ${pkgs}`;
95
+ case "npm":
96
+ return `npm install ${pkgs}`;
97
+ }
98
+ })();
99
+ execSync(cmd, { cwd: projectDir, stdio: "pipe" });
100
+ }
101
+ var init_dep_installer = __esm({
102
+ "src/installers/dep-installer.ts"() {
103
+ "use strict";
104
+ }
105
+ });
106
+
107
+ // src/commands/init.ts
108
+ var init_exports = {};
109
+ __export(init_exports, {
110
+ initCommand: () => initCommand
111
+ });
112
+ import * as p from "@clack/prompts";
113
+ import pc from "picocolors";
114
+ async function initCommand() {
115
+ p.intro(pc.bgCyan(pc.black(" kitn ")));
116
+ const cwd = process.cwd();
117
+ const existing = await readConfig(cwd);
118
+ if (existing) {
119
+ p.log.warn("kitn.json already exists in this directory.");
120
+ const shouldContinue = await p.confirm({
121
+ message: "Overwrite existing configuration?",
122
+ initialValue: false
123
+ });
124
+ if (p.isCancel(shouldContinue) || !shouldContinue) {
125
+ p.cancel("Init cancelled.");
126
+ process.exit(0);
127
+ }
128
+ }
129
+ const runtime = await p.select({
130
+ message: "Which runtime do you use?",
131
+ options: [
132
+ { value: "bun", label: "Bun", hint: "recommended" },
133
+ { value: "node", label: "Node.js" },
134
+ { value: "deno", label: "Deno" }
135
+ ]
136
+ });
137
+ if (p.isCancel(runtime)) {
138
+ p.cancel("Init cancelled.");
139
+ process.exit(0);
140
+ }
141
+ const aliases = await p.group({
142
+ agents: () => p.text({
143
+ message: "Where should agents be installed?",
144
+ initialValue: "src/agents",
145
+ placeholder: "src/agents"
146
+ }),
147
+ tools: () => p.text({
148
+ message: "Where should tools be installed?",
149
+ initialValue: "src/tools",
150
+ placeholder: "src/tools"
151
+ }),
152
+ skills: () => p.text({
153
+ message: "Where should skills be installed?",
154
+ initialValue: "src/skills",
155
+ placeholder: "src/skills"
156
+ }),
157
+ storage: () => p.text({
158
+ message: "Where should storage adapters be installed?",
159
+ initialValue: "src/storage",
160
+ placeholder: "src/storage"
161
+ })
162
+ });
163
+ if (p.isCancel(aliases)) {
164
+ p.cancel("Init cancelled.");
165
+ process.exit(0);
166
+ }
167
+ const config = {
168
+ runtime,
169
+ aliases: {
170
+ agents: aliases.agents,
171
+ tools: aliases.tools,
172
+ skills: aliases.skills,
173
+ storage: aliases.storage
174
+ },
175
+ registries: {
176
+ "@kitn": "https://kitn-ai.github.io/kitn/r/{type}/{name}.json"
177
+ }
178
+ };
179
+ const s = p.spinner();
180
+ s.start("Writing kitn.json");
181
+ await writeConfig(cwd, config);
182
+ s.stop("Created kitn.json");
183
+ const pm = await detectPackageManager(cwd);
184
+ if (pm) {
185
+ const shouldInstall = await p.confirm({
186
+ message: `Install @kitnai/server using ${pm}?`,
187
+ initialValue: true
188
+ });
189
+ if (!p.isCancel(shouldInstall) && shouldInstall) {
190
+ s.start("Installing @kitnai/server...");
191
+ try {
192
+ installDependencies(pm, ["@kitnai/server"], cwd);
193
+ s.stop("Installed @kitnai/server");
194
+ } catch {
195
+ s.stop(pc.yellow("Failed to install @kitnai/server \u2014 you can install it manually"));
196
+ }
197
+ }
198
+ } else {
199
+ p.log.info("No package manager detected. Install @kitnai/server manually.");
200
+ }
201
+ p.outro(pc.green("Done! Run `kitn add <component>` to add your first component."));
202
+ }
203
+ var init_init = __esm({
204
+ "src/commands/init.ts"() {
205
+ "use strict";
206
+ init_config();
207
+ init_detect();
208
+ init_dep_installer();
209
+ }
210
+ });
211
+
212
+ // src/registry/fetcher.ts
213
+ var RegistryFetcher;
214
+ var init_fetcher = __esm({
215
+ "src/registry/fetcher.ts"() {
216
+ "use strict";
217
+ RegistryFetcher = class {
218
+ registries;
219
+ cache = /* @__PURE__ */ new Map();
220
+ fetchFn;
221
+ constructor(registries, fetchFn) {
222
+ this.registries = registries;
223
+ this.fetchFn = fetchFn ?? this.defaultFetch;
224
+ }
225
+ resolveUrl(name, typeDir) {
226
+ const template = this.registries["@kitn"];
227
+ if (!template) throw new Error("No @kitn registry configured");
228
+ return template.replace("{name}", name).replace("{type}", typeDir);
229
+ }
230
+ async fetchItem(name, typeDir) {
231
+ const url = this.resolveUrl(name, typeDir);
232
+ if (!this.cache.has(url)) {
233
+ this.cache.set(url, this.fetchFn(url));
234
+ }
235
+ return this.cache.get(url);
236
+ }
237
+ async fetchIndex() {
238
+ const template = this.registries["@kitn"];
239
+ if (!template) throw new Error("No @kitn registry configured");
240
+ const baseUrl = template.replace("{type}/{name}.json", "registry.json");
241
+ const res = await fetch(baseUrl);
242
+ if (!res.ok) throw new Error(`Failed to fetch registry index: ${res.statusText}`);
243
+ return res.json();
244
+ }
245
+ async defaultFetch(url) {
246
+ const res = await fetch(url);
247
+ if (!res.ok) throw new Error(`Failed to fetch ${url}: ${res.statusText}`);
248
+ return res.json();
249
+ }
250
+ };
251
+ }
252
+ });
253
+
254
+ // src/registry/resolver.ts
255
+ async function resolveDependencies(names, fetchItem) {
256
+ const visited = /* @__PURE__ */ new Set();
257
+ const items = /* @__PURE__ */ new Map();
258
+ const edges = [];
259
+ async function resolve(name) {
260
+ if (visited.has(name)) return;
261
+ visited.add(name);
262
+ const item = await fetchItem(name);
263
+ items.set(name, item);
264
+ const deps = item.registryDependencies ?? [];
265
+ for (const dep of deps) {
266
+ edges.push([dep, name]);
267
+ await resolve(dep);
268
+ }
269
+ }
270
+ for (const name of names) {
271
+ await resolve(name);
272
+ }
273
+ return topologicalSort(items, edges);
274
+ }
275
+ function topologicalSort(items, edges) {
276
+ const inDegree = /* @__PURE__ */ new Map();
277
+ const adjacency = /* @__PURE__ */ new Map();
278
+ for (const name of items.keys()) {
279
+ inDegree.set(name, 0);
280
+ adjacency.set(name, []);
281
+ }
282
+ for (const [from, to] of edges) {
283
+ adjacency.get(from)?.push(to);
284
+ inDegree.set(to, (inDegree.get(to) ?? 0) + 1);
285
+ }
286
+ const queue = [];
287
+ for (const [name, degree] of inDegree) {
288
+ if (degree === 0) queue.push(name);
289
+ }
290
+ const sorted = [];
291
+ while (queue.length > 0) {
292
+ const name = queue.shift();
293
+ sorted.push(items.get(name));
294
+ for (const neighbor of adjacency.get(name) ?? []) {
295
+ const newDegree = (inDegree.get(neighbor) ?? 1) - 1;
296
+ inDegree.set(neighbor, newDegree);
297
+ if (newDegree === 0) queue.push(neighbor);
298
+ }
299
+ }
300
+ if (sorted.length !== items.size) {
301
+ const missing = [...items.keys()].filter((n) => !sorted.some((s) => s.name === n));
302
+ throw new Error(`Circular dependency detected involving: ${missing.join(", ")}`);
303
+ }
304
+ return sorted;
305
+ }
306
+ var init_resolver = __esm({
307
+ "src/registry/resolver.ts"() {
308
+ "use strict";
309
+ }
310
+ });
311
+
312
+ // src/installers/file-writer.ts
313
+ import { readFile as readFile2, writeFile as writeFile2, mkdir, access as access2 } from "fs/promises";
314
+ import { dirname } from "path";
315
+ import { createPatch } from "diff";
316
+ async function checkFileStatus(filePath, newContent) {
317
+ try {
318
+ await access2(filePath);
319
+ } catch {
320
+ return "new" /* New */;
321
+ }
322
+ const existing = await readFile2(filePath, "utf-8");
323
+ return existing === newContent ? "identical" /* Identical */ : "different" /* Different */;
324
+ }
325
+ function generateDiff(filePath, oldContent, newContent) {
326
+ return createPatch(filePath, oldContent, newContent, "local", "registry");
327
+ }
328
+ async function readExistingFile(filePath) {
329
+ try {
330
+ return await readFile2(filePath, "utf-8");
331
+ } catch {
332
+ return null;
333
+ }
334
+ }
335
+ async function writeComponentFile(filePath, content) {
336
+ await mkdir(dirname(filePath), { recursive: true });
337
+ await writeFile2(filePath, content);
338
+ }
339
+ var init_file_writer = __esm({
340
+ "src/installers/file-writer.ts"() {
341
+ "use strict";
342
+ }
343
+ });
344
+
345
+ // src/installers/env-checker.ts
346
+ import pc2 from "picocolors";
347
+ function checkEnvVars(envVars) {
348
+ const missing = [];
349
+ for (const [key, description] of Object.entries(envVars)) {
350
+ if (!process.env[key]) {
351
+ missing.push(` ${pc2.yellow(key)}: ${description}`);
352
+ }
353
+ }
354
+ return missing;
355
+ }
356
+ var init_env_checker = __esm({
357
+ "src/installers/env-checker.ts"() {
358
+ "use strict";
359
+ }
360
+ });
361
+
362
+ // src/utils/hash.ts
363
+ import { createHash } from "crypto";
364
+ function contentHash(content) {
365
+ return createHash("sha256").update(content).digest("hex").slice(0, 8);
366
+ }
367
+ var init_hash = __esm({
368
+ "src/utils/hash.ts"() {
369
+ "use strict";
370
+ }
371
+ });
372
+
373
+ // src/registry/schema.ts
374
+ import { z as z2 } from "zod";
375
+ var componentType2, registryFileSchema, registryItemSchema, registryIndexItemSchema, registryIndexSchema, typeToDir;
376
+ var init_schema = __esm({
377
+ "src/registry/schema.ts"() {
378
+ "use strict";
379
+ componentType2 = z2.enum(["kitn:agent", "kitn:tool", "kitn:skill", "kitn:storage"]);
380
+ registryFileSchema = z2.object({
381
+ path: z2.string(),
382
+ content: z2.string(),
383
+ type: componentType2
384
+ });
385
+ registryItemSchema = z2.object({
386
+ $schema: z2.string().optional(),
387
+ name: z2.string(),
388
+ type: componentType2,
389
+ description: z2.string(),
390
+ dependencies: z2.array(z2.string()).optional(),
391
+ devDependencies: z2.array(z2.string()).optional(),
392
+ registryDependencies: z2.array(z2.string()).optional(),
393
+ envVars: z2.record(z2.string(), z2.string()).optional(),
394
+ files: z2.array(registryFileSchema),
395
+ docs: z2.string().optional(),
396
+ categories: z2.array(z2.string()).optional(),
397
+ version: z2.string().optional()
398
+ });
399
+ registryIndexItemSchema = z2.object({
400
+ name: z2.string(),
401
+ type: componentType2,
402
+ description: z2.string(),
403
+ registryDependencies: z2.array(z2.string()).optional(),
404
+ categories: z2.array(z2.string()).optional(),
405
+ version: z2.string().optional()
406
+ });
407
+ registryIndexSchema = z2.object({
408
+ $schema: z2.string().optional(),
409
+ version: z2.string(),
410
+ items: z2.array(registryIndexItemSchema)
411
+ });
412
+ typeToDir = {
413
+ "kitn:agent": "agents",
414
+ "kitn:tool": "tools",
415
+ "kitn:skill": "skills",
416
+ "kitn:storage": "storage"
417
+ };
418
+ }
419
+ });
420
+
421
+ // src/commands/add.ts
422
+ var add_exports = {};
423
+ __export(add_exports, {
424
+ addCommand: () => addCommand
425
+ });
426
+ import * as p2 from "@clack/prompts";
427
+ import pc3 from "picocolors";
428
+ import { join as join3 } from "path";
429
+ async function addCommand(components, opts) {
430
+ p2.intro(pc3.bgCyan(pc3.black(" kitn add ")));
431
+ const cwd = process.cwd();
432
+ const config = await readConfig(cwd);
433
+ if (!config) {
434
+ p2.log.error("No kitn.json found. Run `kitn init` first.");
435
+ process.exit(1);
436
+ }
437
+ if (components.length === 0) {
438
+ p2.log.error("Please specify at least one component to add.");
439
+ process.exit(1);
440
+ }
441
+ const fetcher = new RegistryFetcher(config.registries);
442
+ const s = p2.spinner();
443
+ s.start("Resolving dependencies...");
444
+ let resolved;
445
+ try {
446
+ resolved = await resolveDependencies(components, async (name) => {
447
+ const index = await fetcher.fetchIndex();
448
+ const indexItem = index.items.find((i) => i.name === name);
449
+ if (!indexItem) throw new Error(`Component '${name}' not found in registry`);
450
+ const dir = typeToDir[indexItem.type];
451
+ return fetcher.fetchItem(name, dir);
452
+ });
453
+ } catch (err) {
454
+ s.stop(pc3.red("Failed to resolve dependencies"));
455
+ p2.log.error(err.message);
456
+ process.exit(1);
457
+ }
458
+ s.stop(`Resolved ${resolved.length} component(s)`);
459
+ p2.log.info("Components to install:");
460
+ for (const item of resolved) {
461
+ const isExplicit = components.includes(item.name);
462
+ const label = isExplicit ? item.name : `${item.name} ${pc3.dim("(dependency)")}`;
463
+ p2.log.message(` ${pc3.cyan(label)}`);
464
+ }
465
+ const created = [];
466
+ const updated = [];
467
+ const skipped = [];
468
+ const allDeps = [];
469
+ const allEnvWarnings = [];
470
+ for (const item of resolved) {
471
+ if (item.dependencies) allDeps.push(...item.dependencies);
472
+ if (item.envVars) {
473
+ allEnvWarnings.push(...checkEnvVars(item.envVars));
474
+ }
475
+ for (const file of item.files) {
476
+ const aliasKey = (() => {
477
+ switch (item.type) {
478
+ case "kitn:agent":
479
+ return "agents";
480
+ case "kitn:tool":
481
+ return "tools";
482
+ case "kitn:skill":
483
+ return "skills";
484
+ case "kitn:storage":
485
+ return "storage";
486
+ }
487
+ })();
488
+ const fileName = file.path.split("/").pop();
489
+ const targetPath = join3(cwd, config.aliases[aliasKey], fileName);
490
+ const relativePath = join3(config.aliases[aliasKey], fileName);
491
+ const status = await checkFileStatus(targetPath, file.content);
492
+ switch (status) {
493
+ case "new" /* New */:
494
+ await writeComponentFile(targetPath, file.content);
495
+ created.push(relativePath);
496
+ break;
497
+ case "identical" /* Identical */:
498
+ skipped.push(relativePath);
499
+ break;
500
+ case "different" /* Different */:
501
+ if (opts.overwrite) {
502
+ await writeComponentFile(targetPath, file.content);
503
+ updated.push(relativePath);
504
+ } else {
505
+ const existing = await readExistingFile(targetPath);
506
+ const diff = generateDiff(relativePath, existing ?? "", file.content);
507
+ p2.log.message(pc3.dim(diff));
508
+ const action = await p2.select({
509
+ message: `${relativePath} already exists and differs. What to do?`,
510
+ options: [
511
+ { value: "skip", label: "Keep local version" },
512
+ { value: "overwrite", label: "Overwrite with registry version" }
513
+ ]
514
+ });
515
+ if (!p2.isCancel(action) && action === "overwrite") {
516
+ await writeComponentFile(targetPath, file.content);
517
+ updated.push(relativePath);
518
+ } else {
519
+ skipped.push(relativePath);
520
+ }
521
+ }
522
+ break;
523
+ }
524
+ }
525
+ const installed = config._installed ?? {};
526
+ const allContent = item.files.map((f) => f.content).join("\n");
527
+ installed[item.name] = {
528
+ version: item.version ?? "1.0.0",
529
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
530
+ files: item.files.map((f) => {
531
+ const aliasKey = (() => {
532
+ switch (item.type) {
533
+ case "kitn:agent":
534
+ return "agents";
535
+ case "kitn:tool":
536
+ return "tools";
537
+ case "kitn:skill":
538
+ return "skills";
539
+ case "kitn:storage":
540
+ return "storage";
541
+ }
542
+ })();
543
+ const fileName = f.path.split("/").pop();
544
+ return join3(config.aliases[aliasKey], fileName);
545
+ }),
546
+ hash: contentHash(allContent)
547
+ };
548
+ config._installed = installed;
549
+ }
550
+ await writeConfig(cwd, config);
551
+ const uniqueDeps = [...new Set(allDeps)];
552
+ if (uniqueDeps.length > 0) {
553
+ const pm = await detectPackageManager(cwd);
554
+ if (pm) {
555
+ s.start(`Installing ${uniqueDeps.length} npm dependenc${uniqueDeps.length === 1 ? "y" : "ies"}...`);
556
+ try {
557
+ installDependencies(pm, uniqueDeps, cwd);
558
+ s.stop("Dependencies installed");
559
+ } catch {
560
+ s.stop(pc3.yellow("Some dependencies failed to install"));
561
+ }
562
+ }
563
+ }
564
+ if (created.length > 0) {
565
+ p2.log.success(`Created ${created.length} file(s):`);
566
+ for (const f of created) p2.log.message(` ${pc3.green("+")} ${f}`);
567
+ }
568
+ if (updated.length > 0) {
569
+ p2.log.success(`Updated ${updated.length} file(s):`);
570
+ for (const f of updated) p2.log.message(` ${pc3.yellow("~")} ${f}`);
571
+ }
572
+ if (skipped.length > 0) {
573
+ p2.log.info(`Skipped ${skipped.length} file(s):`);
574
+ for (const f of skipped) p2.log.message(` ${pc3.dim("-")} ${f}`);
575
+ }
576
+ if (allEnvWarnings.length > 0) {
577
+ p2.log.warn("Missing environment variables:");
578
+ for (const w of allEnvWarnings) p2.log.message(w);
579
+ }
580
+ for (const item of resolved) {
581
+ if (item.docs) {
582
+ p2.log.info(`${pc3.bold(item.name)}: ${item.docs}`);
583
+ }
584
+ }
585
+ p2.outro(pc3.green("Done!"));
586
+ }
587
+ var init_add = __esm({
588
+ "src/commands/add.ts"() {
589
+ "use strict";
590
+ init_config();
591
+ init_detect();
592
+ init_fetcher();
593
+ init_resolver();
594
+ init_file_writer();
595
+ init_dep_installer();
596
+ init_env_checker();
597
+ init_hash();
598
+ init_schema();
599
+ }
600
+ });
601
+
602
+ // src/commands/list.ts
603
+ var list_exports = {};
604
+ __export(list_exports, {
605
+ listCommand: () => listCommand
606
+ });
607
+ import * as p3 from "@clack/prompts";
608
+ import pc4 from "picocolors";
609
+ async function listCommand(opts) {
610
+ const cwd = process.cwd();
611
+ const config = await readConfig(cwd);
612
+ if (!config) {
613
+ p3.log.error("No kitn.json found. Run `kitn init` first.");
614
+ process.exit(1);
615
+ }
616
+ const fetcher = new RegistryFetcher(config.registries);
617
+ const s = p3.spinner();
618
+ s.start("Fetching registry index...");
619
+ let index;
620
+ try {
621
+ index = await fetcher.fetchIndex();
622
+ } catch (err) {
623
+ s.stop(pc4.red("Failed to fetch registry"));
624
+ p3.log.error(err.message);
625
+ process.exit(1);
626
+ }
627
+ s.stop(`Found ${index.items.length} components`);
628
+ const installed = config._installed ?? {};
629
+ const typeGroups = /* @__PURE__ */ new Map();
630
+ for (const item of index.items) {
631
+ if (opts.type && !item.type.endsWith(opts.type)) continue;
632
+ const group2 = item.type.replace("kitn:", "");
633
+ if (!typeGroups.has(group2)) typeGroups.set(group2, []);
634
+ typeGroups.get(group2).push(item);
635
+ }
636
+ for (const [group2, items] of typeGroups) {
637
+ p3.log.message(pc4.bold(`
638
+ ${group2.charAt(0).toUpperCase() + group2.slice(1)}s:`));
639
+ for (const item of items) {
640
+ const inst = installed[item.name];
641
+ if (opts.installed && !inst) continue;
642
+ if (inst) {
643
+ const status = pc4.green("\u2713");
644
+ p3.log.message(` ${status} ${item.name} ${pc4.dim(item.description)}`);
645
+ } else {
646
+ const status = pc4.dim("\u25CB");
647
+ p3.log.message(` ${status} ${item.name} ${pc4.dim(item.description)}`);
648
+ }
649
+ }
650
+ }
651
+ }
652
+ var init_list = __esm({
653
+ "src/commands/list.ts"() {
654
+ "use strict";
655
+ init_config();
656
+ init_fetcher();
657
+ }
658
+ });
659
+
660
+ // src/commands/diff.ts
661
+ var diff_exports = {};
662
+ __export(diff_exports, {
663
+ diffCommand: () => diffCommand
664
+ });
665
+ import * as p4 from "@clack/prompts";
666
+ import { join as join4 } from "path";
667
+ async function diffCommand(componentName) {
668
+ const cwd = process.cwd();
669
+ const config = await readConfig(cwd);
670
+ if (!config) {
671
+ p4.log.error("No kitn.json found. Run `kitn init` first.");
672
+ process.exit(1);
673
+ }
674
+ const installed = config._installed?.[componentName];
675
+ if (!installed) {
676
+ p4.log.error(`Component '${componentName}' is not installed.`);
677
+ process.exit(1);
678
+ }
679
+ const fetcher = new RegistryFetcher(config.registries);
680
+ const index = await fetcher.fetchIndex();
681
+ const indexItem = index.items.find((i) => i.name === componentName);
682
+ if (!indexItem) {
683
+ p4.log.error(`Component '${componentName}' not found in registry.`);
684
+ process.exit(1);
685
+ }
686
+ const dir = typeToDir[indexItem.type];
687
+ const registryItem = await fetcher.fetchItem(componentName, dir);
688
+ let hasDiff = false;
689
+ for (const file of registryItem.files) {
690
+ const fileName = file.path.split("/").pop();
691
+ const aliasKey = (() => {
692
+ switch (indexItem.type) {
693
+ case "kitn:agent":
694
+ return "agents";
695
+ case "kitn:tool":
696
+ return "tools";
697
+ case "kitn:skill":
698
+ return "skills";
699
+ case "kitn:storage":
700
+ return "storage";
701
+ }
702
+ })();
703
+ const localPath = join4(cwd, config.aliases[aliasKey], fileName);
704
+ const localContent = await readExistingFile(localPath);
705
+ if (localContent === null) {
706
+ p4.log.warn(`${fileName}: file missing locally`);
707
+ hasDiff = true;
708
+ } else if (localContent !== file.content) {
709
+ const diff = generateDiff(fileName, localContent, file.content);
710
+ console.log(diff);
711
+ hasDiff = true;
712
+ }
713
+ }
714
+ if (!hasDiff) {
715
+ p4.log.success(`${componentName}: up to date, no differences.`);
716
+ }
717
+ }
718
+ var init_diff = __esm({
719
+ "src/commands/diff.ts"() {
720
+ "use strict";
721
+ init_config();
722
+ init_fetcher();
723
+ init_file_writer();
724
+ init_schema();
725
+ }
726
+ });
727
+
728
+ // src/commands/remove.ts
729
+ var remove_exports = {};
730
+ __export(remove_exports, {
731
+ removeCommand: () => removeCommand
732
+ });
733
+ import * as p5 from "@clack/prompts";
734
+ import pc5 from "picocolors";
735
+ import { join as join5 } from "path";
736
+ import { unlink } from "fs/promises";
737
+ async function removeCommand(componentName) {
738
+ const cwd = process.cwd();
739
+ const config = await readConfig(cwd);
740
+ if (!config) {
741
+ p5.log.error("No kitn.json found. Run `kitn init` first.");
742
+ process.exit(1);
743
+ }
744
+ const installed = config._installed?.[componentName];
745
+ if (!installed) {
746
+ p5.log.error(`Component '${componentName}' is not installed.`);
747
+ process.exit(1);
748
+ }
749
+ const shouldRemove = await p5.confirm({
750
+ message: `Remove ${componentName}? This will delete ${installed.files.length} file(s).`,
751
+ initialValue: false
752
+ });
753
+ if (p5.isCancel(shouldRemove) || !shouldRemove) {
754
+ p5.cancel("Remove cancelled.");
755
+ process.exit(0);
756
+ }
757
+ const deleted = [];
758
+ for (const filePath of installed.files) {
759
+ try {
760
+ await unlink(join5(cwd, filePath));
761
+ deleted.push(filePath);
762
+ } catch {
763
+ p5.log.warn(`Could not delete ${filePath} (may have been moved or renamed)`);
764
+ }
765
+ }
766
+ delete config._installed[componentName];
767
+ if (Object.keys(config._installed).length === 0) {
768
+ delete config._installed;
769
+ }
770
+ await writeConfig(cwd, config);
771
+ if (deleted.length > 0) {
772
+ p5.log.success(`Removed ${componentName}:`);
773
+ for (const f of deleted) p5.log.message(` ${pc5.red("-")} ${f}`);
774
+ }
775
+ }
776
+ var init_remove = __esm({
777
+ "src/commands/remove.ts"() {
778
+ "use strict";
779
+ init_config();
780
+ }
781
+ });
782
+
783
+ // src/commands/update.ts
784
+ var update_exports = {};
785
+ __export(update_exports, {
786
+ updateCommand: () => updateCommand
787
+ });
788
+ async function updateCommand(components) {
789
+ await addCommand(components, { overwrite: true });
790
+ }
791
+ var init_update = __esm({
792
+ "src/commands/update.ts"() {
793
+ "use strict";
794
+ init_add();
795
+ }
796
+ });
797
+
798
+ // src/index.ts
799
+ import { Command } from "commander";
800
+ var program = new Command().name("kitn").description("Install AI agent components from the kitn registry").version("0.1.0");
801
+ program.command("init").description("Initialize kitn in your project").action(async () => {
802
+ const { initCommand: initCommand2 } = await Promise.resolve().then(() => (init_init(), init_exports));
803
+ await initCommand2();
804
+ });
805
+ program.command("add").description("Add components from the kitn registry").argument("[components...]", "component names to install").option("-o, --overwrite", "overwrite existing files without prompting").option("-t, --type <type>", "filter by component type").action(async (components, opts) => {
806
+ const { addCommand: addCommand2 } = await Promise.resolve().then(() => (init_add(), add_exports));
807
+ await addCommand2(components, opts);
808
+ });
809
+ program.command("list").description("List available and installed components").option("-i, --installed", "only show installed components").option("-t, --type <type>", "filter by type (agent, tool, skill, storage)").action(async (opts) => {
810
+ const { listCommand: listCommand2 } = await Promise.resolve().then(() => (init_list(), list_exports));
811
+ await listCommand2(opts);
812
+ });
813
+ program.command("diff").description("Show differences between local and registry version").argument("<component>", "component name").action(async (component) => {
814
+ const { diffCommand: diffCommand2 } = await Promise.resolve().then(() => (init_diff(), diff_exports));
815
+ await diffCommand2(component);
816
+ });
817
+ program.command("remove").description("Remove an installed component").argument("<component>", "component name to remove").action(async (component) => {
818
+ const { removeCommand: removeCommand2 } = await Promise.resolve().then(() => (init_remove(), remove_exports));
819
+ await removeCommand2(component);
820
+ });
821
+ program.command("update").description("Update installed components to latest registry version").argument("[components...]", "component names to update").action(async (components) => {
822
+ const { updateCommand: updateCommand2 } = await Promise.resolve().then(() => (init_update(), update_exports));
823
+ await updateCommand2(components);
824
+ });
825
+ program.parse();
826
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/config.ts","../src/utils/detect.ts","../src/installers/dep-installer.ts","../src/commands/init.ts","../src/registry/fetcher.ts","../src/registry/resolver.ts","../src/installers/file-writer.ts","../src/installers/env-checker.ts","../src/utils/hash.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/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\"]);\ntype ComponentType = z.infer<typeof componentType>;\n\nconst installedComponentSchema = z.object({\n version: z.string(),\n installedAt: z.string(),\n files: z.array(z.string()),\n hash: z.string(),\n});\n\nconst configSchema = z.object({\n $schema: z.string().optional(),\n runtime: z.enum([\"bun\", \"node\", \"deno\"]),\n aliases: z.object({\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\nconst typeToAliasKey: Record<ComponentType, keyof KitnConfig[\"aliases\"]> = {\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 { 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 { execSync } from \"child_process\";\nimport type { PackageManager } from \"../utils/detect.js\";\n\nexport function installDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add ${pkgs}`;\n case \"pnpm\": return `pnpm add ${pkgs}`;\n case \"yarn\": return `yarn add ${pkgs}`;\n case \"npm\": return `npm install ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n\nexport function installDevDependencies(pm: PackageManager, deps: string[], projectDir: string): void {\n if (deps.length === 0) return;\n const pkgs = deps.join(\" \");\n const cmd = (() => {\n switch (pm) {\n case \"bun\": return `bun add -d ${pkgs}`;\n case \"pnpm\": return `pnpm add -D ${pkgs}`;\n case \"yarn\": return `yarn add -D ${pkgs}`;\n case \"npm\": return `npm install -D ${pkgs}`;\n }\n })();\n execSync(cmd, { cwd: projectDir, stdio: \"pipe\" });\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig } from \"../utils/config.js\";\nimport { detectPackageManager } from \"../utils/detect.js\";\nimport { installDependencies } from \"../installers/dep-installer.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 aliases = await p.group({\n agents: () =>\n p.text({\n message: \"Where should agents be installed?\",\n initialValue: \"src/agents\",\n placeholder: \"src/agents\",\n }),\n tools: () =>\n p.text({\n message: \"Where should tools be installed?\",\n initialValue: \"src/tools\",\n placeholder: \"src/tools\",\n }),\n skills: () =>\n p.text({\n message: \"Where should skills be installed?\",\n initialValue: \"src/skills\",\n placeholder: \"src/skills\",\n }),\n storage: () =>\n p.text({\n message: \"Where should storage adapters be installed?\",\n initialValue: \"src/storage\",\n placeholder: \"src/storage\",\n }),\n });\n if (p.isCancel(aliases)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n const config = {\n runtime: runtime as \"bun\" | \"node\" | \"deno\",\n aliases: {\n agents: aliases.agents as string,\n tools: aliases.tools as string,\n skills: aliases.skills as string,\n storage: aliases.storage as string,\n },\n registries: {\n \"@kitn\": \"https://kitn-ai.github.io/kitn/r/{type}/{name}.json\",\n },\n };\n\n const s = p.spinner();\n\n s.start(\"Writing kitn.json\");\n await writeConfig(cwd, config);\n s.stop(\"Created kitn.json\");\n\n const pm = await detectPackageManager(cwd);\n if (pm) {\n const shouldInstall = await p.confirm({\n message: `Install @kitnai/server using ${pm}?`,\n initialValue: true,\n });\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n s.start(\"Installing @kitnai/server...\");\n try {\n installDependencies(pm, [\"@kitnai/server\"], cwd);\n s.stop(\"Installed @kitnai/server\");\n } catch {\n s.stop(pc.yellow(\"Failed to install @kitnai/server — you can install it manually\"));\n }\n }\n } else {\n p.log.info(\"No package manager detected. Install @kitnai/server manually.\");\n }\n\n p.outro(pc.green(\"Done! Run `kitn add <component>` to add your first component.\"));\n}\n","import type { RegistryItem, RegistryIndex } from \"./schema.js\";\n\ntype TypeDir = \"agents\" | \"tools\" | \"skills\" | \"storage\";\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): string {\n const template = this.registries[\"@kitn\"];\n if (!template) throw new Error(\"No @kitn registry configured\");\n return template.replace(\"{name}\", name).replace(\"{type}\", typeDir);\n }\n\n async fetchItem(name: string, typeDir: TypeDir): Promise<RegistryItem> {\n const url = this.resolveUrl(name, typeDir);\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(): Promise<RegistryIndex> {\n const template = this.registries[\"@kitn\"];\n if (!template) throw new Error(\"No @kitn registry configured\");\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 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 { createHash } from \"crypto\";\n\nexport function contentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 8);\n}\n","import { z } from \"zod\";\n\nexport const componentType = z.enum([\"kitn:agent\", \"kitn:tool\", \"kitn:skill\", \"kitn:storage\"]);\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 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 docs: z.string().optional(),\n categories: z.array(z.string()).optional(),\n version: z.string().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});\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};\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 { contentHash } from \"../utils/hash.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 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(components, async (name) => {\n const index = await fetcher.fetchIndex();\n const indexItem = index.items.find((i) => i.name === name);\n if (!indexItem) throw new Error(`Component '${name}' not found in registry`);\n const dir = typeToDir[indexItem.type];\n return fetcher.fetchItem(name, dir as any);\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 = 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 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 keyof typeof config.aliases;\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\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 const installed = config._installed ?? {};\n const allContent = item.files.map((f) => f.content).join(\"\\n\");\n installed[item.name] = {\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 keyof typeof config.aliases;\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 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\";\n\ninterface ListOptions {\n installed?: boolean;\n type?: string;\n}\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 s = p.spinner();\n s.start(\"Fetching registry index...\");\n\n let index;\n try {\n index = await fetcher.fetchIndex();\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 s.stop(`Found ${index.items.length} components`);\n\n const installed = config._installed ?? {};\n const typeGroups = new Map<string, typeof index.items>();\n\n for (const item of index.items) {\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 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 inst = installed[item.name];\n if (opts.installed && !inst) continue;\n\n if (inst) {\n const status = pc.green(\"✓\");\n p.log.message(` ${status} ${item.name} ${pc.dim(item.description)}`);\n } else {\n const status = pc.dim(\"○\");\n p.log.message(` ${status} ${item.name} ${pc.dim(item.description)}`);\n }\n }\n }\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { join } from \"path\";\nimport { readConfig } from \"../utils/config.js\";\nimport { RegistryFetcher } from \"../registry/fetcher.js\";\nimport { readExistingFile, generateDiff } from \"../installers/file-writer.js\";\nimport { 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 const installed = config._installed?.[componentName];\n if (!installed) {\n p.log.error(`Component '${componentName}' is not installed.`);\n process.exit(1);\n }\n\n const fetcher = new RegistryFetcher(config.registries);\n const index = await fetcher.fetchIndex();\n const indexItem = index.items.find((i) => i.name === componentName);\n if (!indexItem) {\n p.log.error(`Component '${componentName}' not found in registry.`);\n process.exit(1);\n }\n\n const dir = typeToDir[indexItem.type] as any;\n const registryItem = await fetcher.fetchItem(componentName, dir);\n\n let hasDiff = false;\n for (const file of registryItem.files) {\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 keyof typeof config.aliases;\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 if (!hasDiff) {\n p.log.success(`${componentName}: 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\";\n\nexport async function removeCommand(componentName: string) {\n const cwd = process.cwd();\n const config = await readConfig(cwd);\n if (!config) {\n p.log.error(\"No kitn.json found. Run `kitn init` first.\");\n process.exit(1);\n }\n\n const installed = config._installed?.[componentName];\n if (!installed) {\n p.log.error(`Component '${componentName}' is not installed.`);\n process.exit(1);\n }\n\n const shouldRemove = await p.confirm({\n message: `Remove ${componentName}? 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![componentName];\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 ${componentName}:`);\n for (const f of deleted) p.log.message(` ${pc.red(\"-\")} ${f}`);\n }\n}\n","import { addCommand } from \"./add.js\";\n\nexport async function updateCommand(components: string[]) {\n await addCommand(components, { overwrite: true });\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)\")\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.parse();\n"],"mappings":"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","names":["join","readFile","writeFile","access","pc","z","componentType","p","pc","join","p","pc","group","p","join","p","pc","join","initCommand","addCommand","listCommand","diffCommand","removeCommand","updateCommand"]}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@kitnai/cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "CLI for installing AI agent components from the kitn registry",
6
+ "bin": {
7
+ "kitn": "./dist/index.js"
8
+ },
9
+ "files": ["dist"],
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "scripts": {
14
+ "dev": "tsup --watch",
15
+ "build": "tsup",
16
+ "test": "bun test",
17
+ "typecheck": "tsc --noEmit",
18
+ "prepublishOnly": "bun run build"
19
+ },
20
+ "dependencies": {
21
+ "@clack/prompts": "^0.9.1",
22
+ "commander": "^13.1.0",
23
+ "diff": "^7.0.0",
24
+ "picocolors": "^1.1.1",
25
+ "zod": "^3.24.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/bun": "^1.3.9",
29
+ "@types/diff": "^7.0.0",
30
+ "tsup": "^8.4.0",
31
+ "typescript": "^5.9.3"
32
+ },
33
+ "keywords": ["ai", "agents", "cli", "registry", "kitn"],
34
+ "license": "MIT",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/kitn-ai/kitn",
38
+ "directory": "packages/cli"
39
+ }
40
+ }