@kitnai/cli 0.1.2 → 0.1.4

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 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 readFile(join(projectDir, CONFIG_FILE), "utf-8");
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 writeFile(join(projectDir, CONFIG_FILE), JSON.stringify(data, null, 2) + "\n");
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 pc from "picocolors";
64
+ import pc2 from "picocolors";
65
65
  async function initCommand() {
66
- p.intro(pc.bgCyan(pc.black(" kitn ")));
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(pc.green("Done! Run `kitn add core` to install the engine, then `kitn add routes` for HTTP routes."));
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 join2 } from "path";
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(join2(dir, lockfile));
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 readFile2, writeFile as writeFile2, mkdir, access as access2 } from "fs/promises";
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 readFile2(filePath, "utf-8");
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 readFile2(filePath, "utf-8");
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 mkdir(dirname(filePath), { recursive: true });
296
- await writeFile2(filePath, content);
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 pc2 from "picocolors";
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(` ${pc2.yellow(key)}: ${description}`);
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 join3 } from "path";
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 = join3(targetDir, targetPath);
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,10 +381,13 @@ var init_import_rewriter = __esm({
381
381
  });
382
382
 
383
383
  // src/installers/tsconfig-patcher.ts
384
- import { readFile as readFile3, writeFile as writeFile3 } from "fs/promises";
385
- import { join as join4 } from "path";
384
+ import { readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
385
+ import { join as join5 } from "path";
386
+ function stripJsonc(text2) {
387
+ return text2.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "").replace(/,\s*([}\]])/g, "$1");
388
+ }
386
389
  function patchTsconfig(tsconfigContent, paths) {
387
- const config = JSON.parse(tsconfigContent);
390
+ const config = JSON.parse(stripJsonc(tsconfigContent));
388
391
  if (!config.compilerOptions) {
389
392
  config.compilerOptions = {};
390
393
  }
@@ -397,15 +400,15 @@ function patchTsconfig(tsconfigContent, paths) {
397
400
  return JSON.stringify(config, null, 2) + "\n";
398
401
  }
399
402
  async function patchProjectTsconfig(projectDir, paths) {
400
- const tsconfigPath = join4(projectDir, "tsconfig.json");
403
+ const tsconfigPath = join5(projectDir, "tsconfig.json");
401
404
  let content;
402
405
  try {
403
- content = await readFile3(tsconfigPath, "utf-8");
406
+ content = await readFile4(tsconfigPath, "utf-8");
404
407
  } catch {
405
408
  content = "{}";
406
409
  }
407
410
  const patched = patchTsconfig(content, paths);
408
- await writeFile3(tsconfigPath, patched);
411
+ await writeFile4(tsconfigPath, patched);
409
412
  }
410
413
  var init_tsconfig_patcher = __esm({
411
414
  "src/installers/tsconfig-patcher.ts"() {
@@ -519,10 +522,10 @@ __export(add_exports, {
519
522
  addCommand: () => addCommand
520
523
  });
521
524
  import * as p2 from "@clack/prompts";
522
- import pc3 from "picocolors";
523
- import { join as join5 } from "path";
525
+ import pc4 from "picocolors";
526
+ import { join as join6 } from "path";
524
527
  async function addCommand(components, opts) {
525
- p2.intro(pc3.bgCyan(pc3.black(" kitn add ")));
528
+ p2.intro(pc4.bgCyan(pc4.black(" kitn add ")));
526
529
  const cwd = process.cwd();
527
530
  const config = await readConfig(cwd);
528
531
  if (!config) {
@@ -555,7 +558,7 @@ async function addCommand(components, opts) {
555
558
  return fetcher.fetchItem(name, dir, ref.namespace, ref.version);
556
559
  });
557
560
  } catch (err) {
558
- s.stop(pc3.red("Failed to resolve dependencies"));
561
+ s.stop(pc4.red("Failed to resolve dependencies"));
559
562
  p2.log.error(err.message);
560
563
  process.exit(1);
561
564
  }
@@ -563,8 +566,8 @@ async function addCommand(components, opts) {
563
566
  p2.log.info("Components to install:");
564
567
  for (const item of resolved) {
565
568
  const isExplicit = resolvedComponents.includes(item.name) || components.includes(item.name);
566
- const label = isExplicit ? item.name : `${item.name} ${pc3.dim("(dependency)")}`;
567
- p2.log.message(` ${pc3.cyan(label)}`);
569
+ const label = isExplicit ? item.name : `${item.name} ${pc4.dim("(dependency)")}`;
570
+ p2.log.message(` ${pc4.cyan(label)}`);
568
571
  }
569
572
  const created = [];
570
573
  const updated = [];
@@ -579,8 +582,8 @@ async function addCommand(components, opts) {
579
582
  if (item.type === "kitn:package") {
580
583
  const baseDir = config.aliases.base ?? "src/ai";
581
584
  for (const file of item.files) {
582
- const targetPath = join5(cwd, baseDir, file.path);
583
- const relativePath = join5(baseDir, file.path);
585
+ const targetPath = join6(cwd, baseDir, file.path);
586
+ const relativePath = join6(baseDir, file.path);
584
587
  const status = await checkFileStatus(targetPath, file.content);
585
588
  switch (status) {
586
589
  case "new" /* New */:
@@ -597,7 +600,7 @@ async function addCommand(components, opts) {
597
600
  } else {
598
601
  const existing = await readExistingFile(targetPath);
599
602
  const diff = generateDiff(relativePath, existing ?? "", file.content);
600
- p2.log.message(pc3.dim(diff));
603
+ p2.log.message(pc4.dim(diff));
601
604
  const action = await p2.select({
602
605
  message: `${relativePath} already exists and differs. What to do?`,
603
606
  options: [
@@ -619,7 +622,7 @@ async function addCommand(components, opts) {
619
622
  const resolvedPaths = {};
620
623
  const installDir = item.installDir ?? item.name;
621
624
  for (const [key, values] of Object.entries(item.tsconfig)) {
622
- resolvedPaths[key] = values.map((v) => `./${join5(baseDir, installDir, v)}`);
625
+ resolvedPaths[key] = values.map((v) => `./${join6(baseDir, installDir, v)}`);
623
626
  }
624
627
  await patchProjectTsconfig(cwd, resolvedPaths);
625
628
  p2.log.info(`Patched tsconfig.json with paths: ${Object.keys(resolvedPaths).join(", ")}`);
@@ -632,7 +635,7 @@ async function addCommand(components, opts) {
632
635
  registry: ref.namespace,
633
636
  version: item.version ?? "1.0.0",
634
637
  installedAt: (/* @__PURE__ */ new Date()).toISOString(),
635
- files: item.files.map((f) => join5(baseDir, f.path)),
638
+ files: item.files.map((f) => join6(baseDir, f.path)),
636
639
  hash: contentHash(allContent)
637
640
  };
638
641
  config.installed = installed;
@@ -651,8 +654,8 @@ async function addCommand(components, opts) {
651
654
  }
652
655
  })();
653
656
  const fileName = file.path.split("/").pop();
654
- const targetPath = join5(cwd, config.aliases[aliasKey], fileName);
655
- const relativePath = join5(config.aliases[aliasKey], fileName);
657
+ const targetPath = join6(cwd, config.aliases[aliasKey], fileName);
658
+ const relativePath = join6(config.aliases[aliasKey], fileName);
656
659
  const content = rewriteKitnImports(file.content, item.type, fileName, config.aliases);
657
660
  const status = await checkFileStatus(targetPath, content);
658
661
  switch (status) {
@@ -670,7 +673,7 @@ async function addCommand(components, opts) {
670
673
  } else {
671
674
  const existing = await readExistingFile(targetPath);
672
675
  const diff = generateDiff(relativePath, existing ?? "", content);
673
- p2.log.message(pc3.dim(diff));
676
+ p2.log.message(pc4.dim(diff));
674
677
  const action = await p2.select({
675
678
  message: `${relativePath} already exists and differs. What to do?`,
676
679
  options: [
@@ -713,7 +716,7 @@ async function addCommand(components, opts) {
713
716
  }
714
717
  })();
715
718
  const fileName = f.path.split("/").pop();
716
- return join5(config.aliases[aliasKey], fileName);
719
+ return join6(config.aliases[aliasKey], fileName);
717
720
  }),
718
721
  hash: contentHash(allContent)
719
722
  };
@@ -730,21 +733,21 @@ async function addCommand(components, opts) {
730
733
  installDependencies(pm, uniqueDeps, cwd);
731
734
  s.stop("Dependencies installed");
732
735
  } catch {
733
- s.stop(pc3.yellow("Some dependencies failed to install"));
736
+ s.stop(pc4.yellow("Some dependencies failed to install"));
734
737
  }
735
738
  }
736
739
  }
737
740
  if (created.length > 0) {
738
741
  p2.log.success(`Created ${created.length} file(s):`);
739
- for (const f of created) p2.log.message(` ${pc3.green("+")} ${f}`);
742
+ for (const f of created) p2.log.message(` ${pc4.green("+")} ${f}`);
740
743
  }
741
744
  if (updated.length > 0) {
742
745
  p2.log.success(`Updated ${updated.length} file(s):`);
743
- for (const f of updated) p2.log.message(` ${pc3.yellow("~")} ${f}`);
746
+ for (const f of updated) p2.log.message(` ${pc4.yellow("~")} ${f}`);
744
747
  }
745
748
  if (skipped.length > 0) {
746
749
  p2.log.info(`Skipped ${skipped.length} file(s):`);
747
- for (const f of skipped) p2.log.message(` ${pc3.dim("-")} ${f}`);
750
+ for (const f of skipped) p2.log.message(` ${pc4.dim("-")} ${f}`);
748
751
  }
749
752
  if (allEnvWarnings.length > 0) {
750
753
  p2.log.warn("Missing environment variables:");
@@ -752,10 +755,10 @@ async function addCommand(components, opts) {
752
755
  }
753
756
  for (const item of resolved) {
754
757
  if (item.docs) {
755
- p2.log.info(`${pc3.bold(item.name)}: ${item.docs}`);
758
+ p2.log.info(`${pc4.bold(item.name)}: ${item.docs}`);
756
759
  }
757
760
  }
758
- p2.outro(pc3.green("Done!"));
761
+ p2.outro(pc4.green("Done!"));
759
762
  }
760
763
  var init_add = __esm({
761
764
  "src/commands/add.ts"() {
@@ -781,7 +784,7 @@ __export(list_exports, {
781
784
  listCommand: () => listCommand
782
785
  });
783
786
  import * as p3 from "@clack/prompts";
784
- import pc4 from "picocolors";
787
+ import pc5 from "picocolors";
785
788
  async function listCommand(opts) {
786
789
  const cwd = process.cwd();
787
790
  const config = await readConfig(cwd);
@@ -792,7 +795,7 @@ async function listCommand(opts) {
792
795
  const fetcher = new RegistryFetcher(config.registries);
793
796
  const namespacesToFetch = opts.registry ? [opts.registry] : Object.keys(config.registries);
794
797
  if (opts.registry && !config.registries[opts.registry]) {
795
- p3.log.error(`Registry ${pc4.bold(opts.registry)} is not configured. Run ${pc4.bold("kitn registry list")} to see configured registries.`);
798
+ p3.log.error(`Registry ${pc5.bold(opts.registry)} is not configured. Run ${pc5.bold("kitn registry list")} to see configured registries.`);
796
799
  process.exit(1);
797
800
  }
798
801
  const s = p3.spinner();
@@ -810,13 +813,13 @@ async function listCommand(opts) {
810
813
  }
811
814
  }
812
815
  if (allItems.length === 0 && errors.length > 0) {
813
- s.stop(pc4.red("Failed to fetch registries"));
816
+ s.stop(pc5.red("Failed to fetch registries"));
814
817
  for (const e of errors) p3.log.error(e);
815
818
  process.exit(1);
816
819
  }
817
820
  s.stop(`Found ${allItems.length} components across ${namespacesToFetch.length - errors.length} ${namespacesToFetch.length - errors.length === 1 ? "registry" : "registries"}`);
818
821
  for (const e of errors) {
819
- p3.log.warn(`${pc4.yellow("\u26A0")} Failed to fetch ${e}`);
822
+ p3.log.warn(`${pc5.yellow("\u26A0")} Failed to fetch ${e}`);
820
823
  }
821
824
  const installed = config.installed ?? {};
822
825
  const typeGroups = /* @__PURE__ */ new Map();
@@ -829,23 +832,23 @@ async function listCommand(opts) {
829
832
  let installedCount = 0;
830
833
  let updateCount = 0;
831
834
  for (const [group, items] of typeGroups) {
832
- p3.log.message(pc4.bold(`
835
+ p3.log.message(pc5.bold(`
833
836
  ${group.charAt(0).toUpperCase() + group.slice(1)}s:`));
834
837
  for (const item of items) {
835
838
  const displayName = item.namespace === "@kitn" ? item.name : `${item.namespace}/${item.name}`;
836
839
  const inst = installed[item.name] ?? installed[displayName];
837
840
  if (opts.installed && !inst) continue;
838
- const version = pc4.dim(`v${item.version ?? "1.0.0"}`);
841
+ const version = pc5.dim(`v${item.version ?? "1.0.0"}`);
839
842
  if (inst) {
840
843
  installedCount++;
841
- const status = pc4.green("\u2713");
844
+ const status = pc5.green("\u2713");
842
845
  const hasUpdate = item.version && inst.version !== item.version;
843
- const updateTag = hasUpdate ? pc4.yellow(` \u2B06 v${item.version} available`) : "";
846
+ const updateTag = hasUpdate ? pc5.yellow(` \u2B06 v${item.version} available`) : "";
844
847
  if (hasUpdate) updateCount++;
845
- p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc4.dim(item.description)}${updateTag}`);
848
+ p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc5.dim(item.description)}${updateTag}`);
846
849
  } else {
847
- const status = pc4.dim("\u25CB");
848
- p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc4.dim(item.description)}`);
850
+ const status = pc5.dim("\u25CB");
851
+ p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc5.dim(item.description)}`);
849
852
  }
850
853
  }
851
854
  }
@@ -853,7 +856,7 @@ ${group.charAt(0).toUpperCase() + group.slice(1)}s:`));
853
856
  const parts = [`${installedCount} installed`, `${availableCount} available`];
854
857
  if (updateCount > 0) parts.push(`${updateCount} update${updateCount === 1 ? "" : "s"} available`);
855
858
  p3.log.message("");
856
- p3.log.message(pc4.dim(` ${parts.join(", ")}`));
859
+ p3.log.message(pc5.dim(` ${parts.join(", ")}`));
857
860
  }
858
861
  var init_list = __esm({
859
862
  "src/commands/list.ts"() {
@@ -869,7 +872,7 @@ __export(diff_exports, {
869
872
  diffCommand: () => diffCommand
870
873
  });
871
874
  import * as p4 from "@clack/prompts";
872
- import { join as join6 } from "path";
875
+ import { join as join7 } from "path";
873
876
  async function diffCommand(componentName) {
874
877
  const cwd = process.cwd();
875
878
  const config = await readConfig(cwd);
@@ -899,8 +902,8 @@ async function diffCommand(componentName) {
899
902
  for (const file of registryItem.files) {
900
903
  if (indexItem.type === "kitn:package") {
901
904
  const baseDir = config.aliases.base ?? "src/ai";
902
- const localPath = join6(cwd, baseDir, file.path);
903
- const relativePath = join6(baseDir, file.path);
905
+ const localPath = join7(cwd, baseDir, file.path);
906
+ const relativePath = join7(baseDir, file.path);
904
907
  const localContent = await readExistingFile(localPath);
905
908
  if (localContent === null) {
906
909
  p4.log.warn(`${relativePath}: file missing locally`);
@@ -924,7 +927,7 @@ async function diffCommand(componentName) {
924
927
  return "storage";
925
928
  }
926
929
  })();
927
- const localPath = join6(cwd, config.aliases[aliasKey], fileName);
930
+ const localPath = join7(cwd, config.aliases[aliasKey], fileName);
928
931
  const localContent = await readExistingFile(localPath);
929
932
  if (localContent === null) {
930
933
  p4.log.warn(`${fileName}: file missing locally`);
@@ -957,8 +960,8 @@ __export(remove_exports, {
957
960
  removeCommand: () => removeCommand
958
961
  });
959
962
  import * as p5 from "@clack/prompts";
960
- import pc5 from "picocolors";
961
- import { join as join7 } from "path";
963
+ import pc6 from "picocolors";
964
+ import { join as join8 } from "path";
962
965
  import { unlink } from "fs/promises";
963
966
  async function removeCommand(componentName) {
964
967
  const cwd = process.cwd();
@@ -986,7 +989,7 @@ async function removeCommand(componentName) {
986
989
  const deleted = [];
987
990
  for (const filePath of installed.files) {
988
991
  try {
989
- await unlink(join7(cwd, filePath));
992
+ await unlink(join8(cwd, filePath));
990
993
  deleted.push(filePath);
991
994
  } catch {
992
995
  p5.log.warn(`Could not delete ${filePath} (may have been moved or renamed)`);
@@ -999,7 +1002,7 @@ async function removeCommand(componentName) {
999
1002
  await writeConfig(cwd, config);
1000
1003
  if (deleted.length > 0) {
1001
1004
  p5.log.success(`Removed ${ref.name}:`);
1002
- for (const f of deleted) p5.log.message(` ${pc5.red("-")} ${f}`);
1005
+ for (const f of deleted) p5.log.message(` ${pc6.red("-")} ${f}`);
1003
1006
  }
1004
1007
  }
1005
1008
  var init_remove = __esm({
@@ -1047,7 +1050,7 @@ __export(info_exports, {
1047
1050
  infoCommand: () => infoCommand
1048
1051
  });
1049
1052
  import * as p7 from "@clack/prompts";
1050
- import pc6 from "picocolors";
1053
+ import pc7 from "picocolors";
1051
1054
  async function infoCommand(component) {
1052
1055
  const cwd = process.cwd();
1053
1056
  const config = await readConfig(cwd);
@@ -1063,13 +1066,13 @@ async function infoCommand(component) {
1063
1066
  try {
1064
1067
  index = await fetcher.fetchIndex(ref.namespace);
1065
1068
  } catch (err) {
1066
- s.stop(pc6.red("Failed to fetch registry"));
1069
+ s.stop(pc7.red("Failed to fetch registry"));
1067
1070
  p7.log.error(err.message);
1068
1071
  process.exit(1);
1069
1072
  }
1070
1073
  const indexItem = index.items.find((i) => i.name === ref.name);
1071
1074
  if (!indexItem) {
1072
- s.stop(pc6.red("Component not found"));
1075
+ s.stop(pc7.red("Component not found"));
1073
1076
  p7.log.error(`Component '${ref.name}' not found in registry.`);
1074
1077
  process.exit(1);
1075
1078
  }
@@ -1078,7 +1081,7 @@ async function infoCommand(component) {
1078
1081
  try {
1079
1082
  item = await fetcher.fetchItem(ref.name, dir, ref.namespace, ref.version);
1080
1083
  } catch (err) {
1081
- s.stop(pc6.red("Failed to fetch component"));
1084
+ s.stop(pc7.red("Failed to fetch component"));
1082
1085
  p7.log.error(err.message);
1083
1086
  process.exit(1);
1084
1087
  }
@@ -1087,62 +1090,62 @@ async function infoCommand(component) {
1087
1090
  const typeName = indexItem.type.replace("kitn:", "");
1088
1091
  console.log();
1089
1092
  console.log(
1090
- ` ${pc6.bold(item.name)} ${pc6.cyan(`v${version}`)}${" ".repeat(Math.max(1, 40 - item.name.length - version.length - 2))}${pc6.dim(ref.namespace)}`
1093
+ ` ${pc7.bold(item.name)} ${pc7.cyan(`v${version}`)}${" ".repeat(Math.max(1, 40 - item.name.length - version.length - 2))}${pc7.dim(ref.namespace)}`
1091
1094
  );
1092
- console.log(` ${pc6.dim(item.description)}`);
1095
+ console.log(` ${pc7.dim(item.description)}`);
1093
1096
  console.log();
1094
- console.log(` ${pc6.dim("Type:")} ${typeName}`);
1097
+ console.log(` ${pc7.dim("Type:")} ${typeName}`);
1095
1098
  if (item.dependencies?.length) {
1096
1099
  console.log(
1097
- ` ${pc6.dim("Dependencies:")} ${item.dependencies.join(", ")}`
1100
+ ` ${pc7.dim("Dependencies:")} ${item.dependencies.join(", ")}`
1098
1101
  );
1099
1102
  }
1100
1103
  if (item.registryDependencies?.length) {
1101
1104
  console.log(
1102
- ` ${pc6.dim("Registry deps:")} ${item.registryDependencies.join(", ")}`
1105
+ ` ${pc7.dim("Registry deps:")} ${item.registryDependencies.join(", ")}`
1103
1106
  );
1104
1107
  }
1105
1108
  if (item.categories?.length) {
1106
1109
  console.log(
1107
- ` ${pc6.dim("Categories:")} ${item.categories.join(", ")}`
1110
+ ` ${pc7.dim("Categories:")} ${item.categories.join(", ")}`
1108
1111
  );
1109
1112
  }
1110
1113
  if (item.updatedAt) {
1111
- console.log(` ${pc6.dim("Updated:")} ${item.updatedAt}`);
1114
+ console.log(` ${pc7.dim("Updated:")} ${item.updatedAt}`);
1112
1115
  }
1113
1116
  const versions = indexItem.versions;
1114
1117
  if (versions?.length) {
1115
- console.log(` ${pc6.dim("Versions:")} ${versions.join(", ")}`);
1118
+ console.log(` ${pc7.dim("Versions:")} ${versions.join(", ")}`);
1116
1119
  }
1117
1120
  if (item.changelog?.length) {
1118
1121
  console.log();
1119
- console.log(` ${pc6.bold("Changelog:")}`);
1122
+ console.log(` ${pc7.bold("Changelog:")}`);
1120
1123
  for (const entry of item.changelog) {
1121
- const tag = entry.type === "feature" ? pc6.green(entry.type) : entry.type === "fix" ? pc6.yellow(entry.type) : entry.type === "breaking" ? pc6.red(entry.type) : pc6.dim(entry.type);
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);
1122
1125
  console.log(
1123
- ` ${pc6.cyan(entry.version)} ${pc6.dim(entry.date)} ${tag} ${entry.note}`
1126
+ ` ${pc7.cyan(entry.version)} ${pc7.dim(entry.date)} ${tag} ${entry.note}`
1124
1127
  );
1125
1128
  }
1126
1129
  }
1127
1130
  console.log();
1128
1131
  const fileCount = item.files.length;
1129
- console.log(` ${pc6.bold(`Files:`)} ${pc6.dim(`(${fileCount})`)}`);
1132
+ console.log(` ${pc7.bold(`Files:`)} ${pc7.dim(`(${fileCount})`)}`);
1130
1133
  const maxShown = 10;
1131
1134
  for (const file of item.files.slice(0, maxShown)) {
1132
- console.log(` ${pc6.dim(file.path)}`);
1135
+ console.log(` ${pc7.dim(file.path)}`);
1133
1136
  }
1134
1137
  if (fileCount > maxShown) {
1135
- console.log(` ${pc6.dim(`... and ${fileCount - maxShown} more`)}`);
1138
+ console.log(` ${pc7.dim(`... and ${fileCount - maxShown} more`)}`);
1136
1139
  }
1137
1140
  const installed = config.installed?.[item.name];
1138
1141
  if (installed) {
1139
1142
  console.log();
1140
1143
  console.log(
1141
- ` ${pc6.green("Installed")} ${pc6.dim(`v${installed.version}`)}`
1144
+ ` ${pc7.green("Installed")} ${pc7.dim(`v${installed.version}`)}`
1142
1145
  );
1143
1146
  if (version !== installed.version) {
1144
1147
  console.log(
1145
- ` ${pc6.yellow("Update available:")} ${pc6.dim(`v${installed.version}`)} \u2192 ${pc6.cyan(`v${version}`)}`
1148
+ ` ${pc7.yellow("Update available:")} ${pc7.dim(`v${installed.version}`)} \u2192 ${pc7.cyan(`v${version}`)}`
1146
1149
  );
1147
1150
  }
1148
1151
  }
@@ -1166,7 +1169,7 @@ __export(registry_exports, {
1166
1169
  registryRemoveCommand: () => registryRemoveCommand
1167
1170
  });
1168
1171
  import * as p8 from "@clack/prompts";
1169
- import pc7 from "picocolors";
1172
+ import pc8 from "picocolors";
1170
1173
  async function registryAddCommand(namespace, url, opts = {}) {
1171
1174
  const cwd = opts.cwd ?? process.cwd();
1172
1175
  const config = await readConfig(cwd);
@@ -1185,8 +1188,8 @@ async function registryAddCommand(namespace, url, opts = {}) {
1185
1188
  }
1186
1189
  config.registries[namespace] = url;
1187
1190
  await writeConfig(cwd, config);
1188
- p8.log.success(`Added registry ${pc7.bold(namespace)}`);
1189
- p8.log.message(pc7.dim(` ${url}`));
1191
+ p8.log.success(`Added registry ${pc8.bold(namespace)}`);
1192
+ p8.log.message(pc8.dim(` ${url}`));
1190
1193
  }
1191
1194
  async function registryRemoveCommand(namespace, opts = {}) {
1192
1195
  const cwd = opts.cwd ?? process.cwd();
@@ -1208,11 +1211,11 @@ async function registryRemoveCommand(namespace, opts = {}) {
1208
1211
  }
1209
1212
  delete config.registries[namespace];
1210
1213
  await writeConfig(cwd, config);
1211
- p8.log.success(`Removed registry ${pc7.bold(namespace)}`);
1214
+ p8.log.success(`Removed registry ${pc8.bold(namespace)}`);
1212
1215
  if (affectedComponents.length > 0) {
1213
1216
  p8.log.warn(`${affectedComponents.length} installed component(s) referenced this registry:`);
1214
1217
  for (const name of affectedComponents) {
1215
- p8.log.message(` ${pc7.yellow("!")} ${name}`);
1218
+ p8.log.message(` ${pc8.yellow("!")} ${name}`);
1216
1219
  }
1217
1220
  }
1218
1221
  return { affectedComponents };
@@ -1223,10 +1226,10 @@ async function registryListCommand(opts = {}) {
1223
1226
  if (!config) throw new Error("No kitn.json found. Run `kitn init` first.");
1224
1227
  const entries = Object.entries(config.registries).map(([namespace, url]) => ({ namespace, url }));
1225
1228
  if (entries.length === 0) {
1226
- p8.log.message(pc7.dim(" No registries configured."));
1229
+ p8.log.message(pc8.dim(" No registries configured."));
1227
1230
  } else {
1228
1231
  for (const { namespace, url } of entries) {
1229
- p8.log.message(` ${pc7.bold(namespace.padEnd(16))} ${pc7.dim(url)}`);
1232
+ p8.log.message(` ${pc8.bold(namespace.padEnd(16))} ${pc8.dim(url)}`);
1230
1233
  }
1231
1234
  }
1232
1235
  return entries;
@@ -1240,7 +1243,85 @@ var init_registry = __esm({
1240
1243
 
1241
1244
  // src/index.ts
1242
1245
  import { Command } from "commander";
1243
- var program = new Command().name("kitn").description("Install AI agent components from the kitn registry").version("0.1.0");
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.4" : "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);
1244
1325
  program.command("init").description("Initialize kitn in your project").action(async () => {
1245
1326
  const { initCommand: initCommand2 } = await Promise.resolve().then(() => (init_init(), init_exports));
1246
1327
  await initCommand2();
@@ -1282,5 +1363,6 @@ registry.command("list").description("List all configured registries").action(as
1282
1363
  const { registryListCommand: registryListCommand2 } = await Promise.resolve().then(() => (init_registry(), registry_exports));
1283
1364
  await registryListCommand2();
1284
1365
  });
1285
- program.parse();
1366
+ await program.parseAsync();
1367
+ printUpdateNotice();
1286
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 * 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(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","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"]}
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "@kitnai/cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "type": "module",
5
5
  "description": "CLI for installing AI agent components from the kitn registry",
6
6
  "bin": {
7
7
  "kitn": "./dist/index.js"
8
8
  },
9
- "files": ["dist"],
9
+ "files": [
10
+ "dist"
11
+ ],
10
12
  "publishConfig": {
11
13
  "access": "public"
12
14
  },
@@ -30,7 +32,13 @@
30
32
  "tsup": "^8.4.0",
31
33
  "typescript": "^5.9.3"
32
34
  },
33
- "keywords": ["ai", "agents", "cli", "registry", "kitn"],
35
+ "keywords": [
36
+ "ai",
37
+ "agents",
38
+ "cli",
39
+ "registry",
40
+ "kitn"
41
+ ],
34
42
  "license": "MIT",
35
43
  "repository": {
36
44
  "type": "git",