@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 +176 -94
- package/dist/index.js.map +1 -1
- package/package.json +11 -3
package/dist/index.js
CHANGED
|
@@ -10,12 +10,12 @@ var __export = (target, all) => {
|
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
// src/utils/config.ts
|
|
13
|
-
import { readFile, writeFile } from "fs/promises";
|
|
14
|
-
import { join } from "path";
|
|
13
|
+
import { readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
|
|
14
|
+
import { join as join2 } from "path";
|
|
15
15
|
import { z } from "zod";
|
|
16
16
|
async function readConfig(projectDir) {
|
|
17
17
|
try {
|
|
18
|
-
const raw = await
|
|
18
|
+
const raw = await readFile2(join2(projectDir, CONFIG_FILE), "utf-8");
|
|
19
19
|
return configSchema.parse(JSON.parse(raw));
|
|
20
20
|
} catch {
|
|
21
21
|
return null;
|
|
@@ -23,7 +23,7 @@ async function readConfig(projectDir) {
|
|
|
23
23
|
}
|
|
24
24
|
async function writeConfig(projectDir, config) {
|
|
25
25
|
const data = { $schema: "https://kitn.dev/schema/config.json", ...config };
|
|
26
|
-
await
|
|
26
|
+
await writeFile2(join2(projectDir, CONFIG_FILE), JSON.stringify(data, null, 2) + "\n");
|
|
27
27
|
}
|
|
28
28
|
var componentType, installedComponentSchema, configSchema, CONFIG_FILE;
|
|
29
29
|
var init_config = __esm({
|
|
@@ -61,9 +61,9 @@ __export(init_exports, {
|
|
|
61
61
|
initCommand: () => initCommand
|
|
62
62
|
});
|
|
63
63
|
import * as p from "@clack/prompts";
|
|
64
|
-
import
|
|
64
|
+
import pc2 from "picocolors";
|
|
65
65
|
async function initCommand() {
|
|
66
|
-
p.intro(
|
|
66
|
+
p.intro(pc2.bgCyan(pc2.black(" kitn ")));
|
|
67
67
|
const cwd = process.cwd();
|
|
68
68
|
const existing = await readConfig(cwd);
|
|
69
69
|
if (existing) {
|
|
@@ -131,7 +131,7 @@ async function initCommand() {
|
|
|
131
131
|
s.start("Writing kitn.json");
|
|
132
132
|
await writeConfig(cwd, config);
|
|
133
133
|
s.stop("Created kitn.json");
|
|
134
|
-
p.outro(
|
|
134
|
+
p.outro(pc2.green("Done! Run `kitn add core` to install the engine, then `kitn add routes` for HTTP routes."));
|
|
135
135
|
}
|
|
136
136
|
var init_init = __esm({
|
|
137
137
|
"src/commands/init.ts"() {
|
|
@@ -142,11 +142,11 @@ var init_init = __esm({
|
|
|
142
142
|
|
|
143
143
|
// src/utils/detect.ts
|
|
144
144
|
import { access } from "fs/promises";
|
|
145
|
-
import { join as
|
|
145
|
+
import { join as join3 } from "path";
|
|
146
146
|
async function detectPackageManager(dir) {
|
|
147
147
|
for (const [lockfile, pm] of LOCKFILE_MAP) {
|
|
148
148
|
try {
|
|
149
|
-
await access(
|
|
149
|
+
await access(join3(dir, lockfile));
|
|
150
150
|
return pm;
|
|
151
151
|
} catch {
|
|
152
152
|
}
|
|
@@ -269,7 +269,7 @@ var init_resolver = __esm({
|
|
|
269
269
|
});
|
|
270
270
|
|
|
271
271
|
// src/installers/file-writer.ts
|
|
272
|
-
import { readFile as
|
|
272
|
+
import { readFile as readFile3, writeFile as writeFile3, mkdir as mkdir2, access as access2 } from "fs/promises";
|
|
273
273
|
import { dirname } from "path";
|
|
274
274
|
import { createPatch } from "diff";
|
|
275
275
|
async function checkFileStatus(filePath, newContent) {
|
|
@@ -278,7 +278,7 @@ async function checkFileStatus(filePath, newContent) {
|
|
|
278
278
|
} catch {
|
|
279
279
|
return "new" /* New */;
|
|
280
280
|
}
|
|
281
|
-
const existing = await
|
|
281
|
+
const existing = await readFile3(filePath, "utf-8");
|
|
282
282
|
return existing === newContent ? "identical" /* Identical */ : "different" /* Different */;
|
|
283
283
|
}
|
|
284
284
|
function generateDiff(filePath, oldContent, newContent) {
|
|
@@ -286,14 +286,14 @@ function generateDiff(filePath, oldContent, newContent) {
|
|
|
286
286
|
}
|
|
287
287
|
async function readExistingFile(filePath) {
|
|
288
288
|
try {
|
|
289
|
-
return await
|
|
289
|
+
return await readFile3(filePath, "utf-8");
|
|
290
290
|
} catch {
|
|
291
291
|
return null;
|
|
292
292
|
}
|
|
293
293
|
}
|
|
294
294
|
async function writeComponentFile(filePath, content) {
|
|
295
|
-
await
|
|
296
|
-
await
|
|
295
|
+
await mkdir2(dirname(filePath), { recursive: true });
|
|
296
|
+
await writeFile3(filePath, content);
|
|
297
297
|
}
|
|
298
298
|
var init_file_writer = __esm({
|
|
299
299
|
"src/installers/file-writer.ts"() {
|
|
@@ -327,12 +327,12 @@ var init_dep_installer = __esm({
|
|
|
327
327
|
});
|
|
328
328
|
|
|
329
329
|
// src/installers/env-checker.ts
|
|
330
|
-
import
|
|
330
|
+
import pc3 from "picocolors";
|
|
331
331
|
function checkEnvVars(envVars) {
|
|
332
332
|
const missing = [];
|
|
333
333
|
for (const [key, description] of Object.entries(envVars)) {
|
|
334
334
|
if (!process.env[key]) {
|
|
335
|
-
missing.push(` ${
|
|
335
|
+
missing.push(` ${pc3.yellow(key)}: ${description}`);
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
338
|
return missing;
|
|
@@ -344,7 +344,7 @@ var init_env_checker = __esm({
|
|
|
344
344
|
});
|
|
345
345
|
|
|
346
346
|
// src/installers/import-rewriter.ts
|
|
347
|
-
import { relative, join as
|
|
347
|
+
import { relative, join as join4 } from "path";
|
|
348
348
|
function rewriteKitnImports(content, fileType, fileName, aliases) {
|
|
349
349
|
const sourceAliasKey = TYPE_TO_ALIAS_KEY[fileType];
|
|
350
350
|
if (!sourceAliasKey) return content;
|
|
@@ -356,7 +356,7 @@ function rewriteKitnImports(content, fileType, fileName, aliases) {
|
|
|
356
356
|
return `${prefix}@kitn/${type}/${targetPath}${quote}`;
|
|
357
357
|
}
|
|
358
358
|
const targetDir = aliases[type];
|
|
359
|
-
const targetFile =
|
|
359
|
+
const targetFile = join4(targetDir, targetPath);
|
|
360
360
|
let rel = relative(sourceDir, targetFile);
|
|
361
361
|
rel = rel.split("\\").join("/");
|
|
362
362
|
if (!rel.startsWith(".")) {
|
|
@@ -381,10 +381,13 @@ var init_import_rewriter = __esm({
|
|
|
381
381
|
});
|
|
382
382
|
|
|
383
383
|
// src/installers/tsconfig-patcher.ts
|
|
384
|
-
import { readFile as
|
|
385
|
-
import { join as
|
|
384
|
+
import { readFile as readFile4, writeFile as writeFile4 } from "fs/promises";
|
|
385
|
+
import { join as join5 } from "path";
|
|
386
|
+
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 =
|
|
403
|
+
const tsconfigPath = join5(projectDir, "tsconfig.json");
|
|
401
404
|
let content;
|
|
402
405
|
try {
|
|
403
|
-
content = await
|
|
406
|
+
content = await readFile4(tsconfigPath, "utf-8");
|
|
404
407
|
} catch {
|
|
405
408
|
content = "{}";
|
|
406
409
|
}
|
|
407
410
|
const patched = patchTsconfig(content, paths);
|
|
408
|
-
await
|
|
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
|
|
523
|
-
import { join as
|
|
525
|
+
import pc4 from "picocolors";
|
|
526
|
+
import { join as join6 } from "path";
|
|
524
527
|
async function addCommand(components, opts) {
|
|
525
|
-
p2.intro(
|
|
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(
|
|
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} ${
|
|
567
|
-
p2.log.message(` ${
|
|
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 =
|
|
583
|
-
const relativePath =
|
|
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(
|
|
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) => `./${
|
|
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) =>
|
|
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 =
|
|
655
|
-
const relativePath =
|
|
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(
|
|
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
|
|
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(
|
|
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(` ${
|
|
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(` ${
|
|
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(` ${
|
|
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(`${
|
|
758
|
+
p2.log.info(`${pc4.bold(item.name)}: ${item.docs}`);
|
|
756
759
|
}
|
|
757
760
|
}
|
|
758
|
-
p2.outro(
|
|
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
|
|
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 ${
|
|
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(
|
|
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(`${
|
|
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(
|
|
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 =
|
|
841
|
+
const version = pc5.dim(`v${item.version ?? "1.0.0"}`);
|
|
839
842
|
if (inst) {
|
|
840
843
|
installedCount++;
|
|
841
|
-
const status =
|
|
844
|
+
const status = pc5.green("\u2713");
|
|
842
845
|
const hasUpdate = item.version && inst.version !== item.version;
|
|
843
|
-
const updateTag = hasUpdate ?
|
|
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} ${
|
|
848
|
+
p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc5.dim(item.description)}${updateTag}`);
|
|
846
849
|
} else {
|
|
847
|
-
const status =
|
|
848
|
-
p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${
|
|
850
|
+
const status = pc5.dim("\u25CB");
|
|
851
|
+
p3.log.message(` ${status} ${displayName.padEnd(20)} ${version} ${pc5.dim(item.description)}`);
|
|
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(
|
|
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
|
|
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 =
|
|
903
|
-
const relativePath =
|
|
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 =
|
|
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
|
|
961
|
-
import { join as
|
|
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(
|
|
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(` ${
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
` ${
|
|
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(` ${
|
|
1095
|
+
console.log(` ${pc7.dim(item.description)}`);
|
|
1093
1096
|
console.log();
|
|
1094
|
-
console.log(` ${
|
|
1097
|
+
console.log(` ${pc7.dim("Type:")} ${typeName}`);
|
|
1095
1098
|
if (item.dependencies?.length) {
|
|
1096
1099
|
console.log(
|
|
1097
|
-
` ${
|
|
1100
|
+
` ${pc7.dim("Dependencies:")} ${item.dependencies.join(", ")}`
|
|
1098
1101
|
);
|
|
1099
1102
|
}
|
|
1100
1103
|
if (item.registryDependencies?.length) {
|
|
1101
1104
|
console.log(
|
|
1102
|
-
` ${
|
|
1105
|
+
` ${pc7.dim("Registry deps:")} ${item.registryDependencies.join(", ")}`
|
|
1103
1106
|
);
|
|
1104
1107
|
}
|
|
1105
1108
|
if (item.categories?.length) {
|
|
1106
1109
|
console.log(
|
|
1107
|
-
` ${
|
|
1110
|
+
` ${pc7.dim("Categories:")} ${item.categories.join(", ")}`
|
|
1108
1111
|
);
|
|
1109
1112
|
}
|
|
1110
1113
|
if (item.updatedAt) {
|
|
1111
|
-
console.log(` ${
|
|
1114
|
+
console.log(` ${pc7.dim("Updated:")} ${item.updatedAt}`);
|
|
1112
1115
|
}
|
|
1113
1116
|
const versions = indexItem.versions;
|
|
1114
1117
|
if (versions?.length) {
|
|
1115
|
-
console.log(` ${
|
|
1118
|
+
console.log(` ${pc7.dim("Versions:")} ${versions.join(", ")}`);
|
|
1116
1119
|
}
|
|
1117
1120
|
if (item.changelog?.length) {
|
|
1118
1121
|
console.log();
|
|
1119
|
-
console.log(` ${
|
|
1122
|
+
console.log(` ${pc7.bold("Changelog:")}`);
|
|
1120
1123
|
for (const entry of item.changelog) {
|
|
1121
|
-
const tag = entry.type === "feature" ?
|
|
1124
|
+
const tag = entry.type === "feature" ? pc7.green(entry.type) : entry.type === "fix" ? pc7.yellow(entry.type) : entry.type === "breaking" ? pc7.red(entry.type) : pc7.dim(entry.type);
|
|
1122
1125
|
console.log(
|
|
1123
|
-
` ${
|
|
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(` ${
|
|
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(` ${
|
|
1135
|
+
console.log(` ${pc7.dim(file.path)}`);
|
|
1133
1136
|
}
|
|
1134
1137
|
if (fileCount > maxShown) {
|
|
1135
|
-
console.log(` ${
|
|
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
|
-
` ${
|
|
1144
|
+
` ${pc7.green("Installed")} ${pc7.dim(`v${installed.version}`)}`
|
|
1142
1145
|
);
|
|
1143
1146
|
if (version !== installed.version) {
|
|
1144
1147
|
console.log(
|
|
1145
|
-
` ${
|
|
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
|
|
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 ${
|
|
1189
|
-
p8.log.message(
|
|
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 ${
|
|
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(` ${
|
|
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(
|
|
1229
|
+
p8.log.message(pc8.dim(" No registries configured."));
|
|
1227
1230
|
} else {
|
|
1228
1231
|
for (const { namespace, url } of entries) {
|
|
1229
|
-
p8.log.message(` ${
|
|
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
|
-
|
|
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.
|
|
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":";;;;;;;;;;;;AAAA,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AACrB,SAAS,SAAS;AAgClB,eAAsB,WAAW,YAAgD;AAC/E,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,KAAK,YAAY,WAAW,GAAG,OAAO;AACjE,WAAO,aAAa,MAAM,KAAK,MAAM,GAAG,CAAC;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,YAAY,YAAoB,QAAmC;AACvF,QAAM,OAAO,EAAE,SAAS,uCAAuC,GAAG,OAAO;AACzE,QAAM,UAAU,KAAK,YAAY,WAAW,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AACrF;AA9CA,IAIM,eAGA,0BAQO,cAiBP;AAhCN;AAAA;AAAA;AAIA,IAAM,gBAAgB,EAAE,KAAK,CAAC,cAAc,aAAa,cAAc,gBAAgB,cAAc,CAAC;AAGtG,IAAM,2BAA2B,EAAE,OAAO;AAAA,MACxC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,SAAS,EAAE,OAAO;AAAA,MAClB,aAAa,EAAE,OAAO;AAAA,MACtB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,MACzB,MAAM,EAAE,OAAO;AAAA,IACjB,CAAC;AAEM,IAAM,eAAe,EAAE,OAAO;AAAA,MACnC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,SAAS,EAAE,KAAK,CAAC,OAAO,QAAQ,MAAM,CAAC;AAAA,MACvC,WAAW,EAAE,KAAK,CAAC,QAAQ,cAAc,UAAU,WAAW,SAAS,CAAC,EAAE,SAAS;AAAA,MACnF,SAAS,EAAE,OAAO;AAAA,QAChB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,QAAQ,EAAE,OAAO;AAAA,QACjB,OAAO,EAAE,OAAO;AAAA,QAChB,QAAQ,EAAE,OAAO;AAAA,QACjB,SAAS,EAAE,OAAO;AAAA,MACpB,CAAC;AAAA,MACD,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAAA,MAC3C,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,wBAAwB,EAAE,SAAS;AAAA,IACrE,CAAC;AAID,IAAM,cAAc;AAAA;AAAA;;;AChCpB;AAAA;AAAA;AAAA;AAAA,YAAY,OAAO;AACnB,OAAO,QAAQ;AAGf,eAAsB,cAAc;AAClC,EAAE,QAAM,GAAG,OAAO,GAAG,MAAM,QAAQ,CAAC,CAAC;AAErC,QAAM,MAAM,QAAQ,IAAI;AAExB,QAAM,WAAW,MAAM,WAAW,GAAG;AACrC,MAAI,UAAU;AACZ,IAAE,MAAI,KAAK,6CAA6C;AACxD,UAAM,iBAAiB,MAAQ,UAAQ;AAAA,MACrC,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAM,WAAS,cAAc,KAAK,CAAC,gBAAgB;AACjD,MAAE,SAAO,iBAAiB;AAC1B,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,UAAU,MAAQ,SAAO;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,cAAc;AAAA,MAClD,EAAE,OAAO,QAAQ,OAAO,UAAU;AAAA,MAClC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,IACjC;AAAA,EACF,CAAC;AACD,MAAM,WAAS,OAAO,GAAG;AACvB,IAAE,SAAO,iBAAiB;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,MAAQ,SAAO;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,cAAc;AAAA,MACpD,EAAE,OAAO,cAAc,OAAO,sBAAsB,MAAM,cAAc;AAAA,MACxE,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,cAAc;AAAA,MACxD,EAAE,OAAO,WAAW,OAAO,WAAW,MAAM,cAAc;AAAA,MAC1D,EAAE,OAAO,WAAW,OAAO,WAAW,MAAM,cAAc;AAAA,IAC5D;AAAA,EACF,CAAC;AACD,MAAM,WAAS,SAAS,GAAG;AACzB,IAAE,SAAO,iBAAiB;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,MAAQ,OAAK;AAAA,IACxB,SAAS;AAAA,IACT,cAAc;AAAA,IACd,aAAa;AAAA,EACf,CAAC;AACD,MAAM,WAAS,IAAI,GAAG;AACpB,IAAE,SAAO,iBAAiB;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU;AAChB,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,QAAQ,GAAG,OAAO;AAAA,MAClB,OAAO,GAAG,OAAO;AAAA,MACjB,QAAQ,GAAG,OAAO;AAAA,MAClB,SAAS,GAAG,OAAO;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,IAAM,UAAQ;AACpB,IAAE,MAAM,mBAAmB;AAC3B,QAAM,YAAY,KAAK,MAAM;AAC7B,IAAE,KAAK,mBAAmB;AAE1B,EAAE,QAAM,GAAG,MAAM,0FAA0F,CAAC;AAC9G;AAlFA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA,SAAS,cAAc;AACvB,SAAS,QAAAA,aAAY;AAYrB,eAAsB,qBAAqB,KAA6C;AACtF,aAAW,CAAC,UAAU,EAAE,KAAK,cAAc;AACzC,QAAI;AACF,YAAM,OAAOA,MAAK,KAAK,QAAQ,CAAC;AAChC,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAvBA,IAKM;AALN;AAAA;AAAA;AAKA,IAAM,eAA2C;AAAA,MAC/C,CAAC,YAAY,KAAK;AAAA,MAClB,CAAC,aAAa,KAAK;AAAA,MACnB,CAAC,kBAAkB,MAAM;AAAA,MACzB,CAAC,aAAa,MAAM;AAAA,MACpB,CAAC,qBAAqB,KAAK;AAAA,IAC7B;AAAA;AAAA;;;ACXA,IAKa;AALb;AAAA;AAAA;AAKO,IAAM,kBAAN,MAAsB;AAAA,MACnB;AAAA,MACA,QAAQ,oBAAI,IAAmC;AAAA,MAC/C;AAAA,MAER,YAAY,YAAoC,SAAmB;AACjE,aAAK,aAAa;AAClB,aAAK,UAAU,WAAW,KAAK;AAAA,MACjC;AAAA,MAEA,WAAW,MAAc,SAAkB,YAAY,SAAS,SAA0B;AACxF,cAAM,WAAW,KAAK,WAAW,SAAS;AAC1C,YAAI,CAAC,SAAU,OAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE;AACxE,cAAM,WAAW,UAAU,GAAG,IAAI,IAAI,OAAO,KAAK;AAClD,eAAO,SAAS,QAAQ,UAAU,QAAQ,EAAE,QAAQ,UAAU,OAAO;AAAA,MACvE;AAAA,MAEA,MAAM,UAAU,MAAc,SAAkB,YAAY,SAAS,SAAyC;AAC5G,cAAM,MAAM,KAAK,WAAW,MAAM,SAAS,WAAW,OAAO;AAC7D,YAAI,CAAC,KAAK,MAAM,IAAI,GAAG,GAAG;AACxB,eAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,GAAG,CAAC;AAAA,QACvC;AACA,eAAO,KAAK,MAAM,IAAI,GAAG;AAAA,MAC3B;AAAA,MAEA,MAAM,WAAW,YAAY,SAAiC;AAC5D,cAAM,WAAW,KAAK,WAAW,SAAS;AAC1C,YAAI,CAAC,SAAU,OAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE;AACxE,cAAM,UAAU,SAAS,QAAQ,sBAAsB,eAAe;AACtE,cAAM,MAAM,MAAM,MAAM,OAAO;AAC/B,YAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mCAAmC,IAAI,UAAU,EAAE;AAChF,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,MAEA,MAAc,aAAa,KAAoC;AAC7D,cAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,YAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mBAAmB,GAAG,KAAK,IAAI,UAAU,EAAE;AACxE,eAAO,IAAI,KAAK;AAAA,MAClB;AAAA,IACF;AAAA;AAAA;;;ACxCA,eAAsB,oBACpB,OACA,WACyB;AACzB,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,QAAQ,oBAAI,IAA0B;AAC5C,QAAM,QAA4B,CAAC;AAEnC,iBAAe,QAAQ,MAA6B;AAClD,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,YAAQ,IAAI,IAAI;AAEhB,UAAM,OAAO,MAAM,UAAU,IAAI;AACjC,UAAM,IAAI,MAAM,IAAI;AAEpB,UAAM,OAAO,KAAK,wBAAwB,CAAC;AAC3C,eAAW,OAAO,MAAM;AACtB,YAAM,KAAK,CAAC,KAAK,IAAI,CAAC;AACtB,YAAM,QAAQ,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,IAAI;AAAA,EACpB;AAEA,SAAO,gBAAgB,OAAO,KAAK;AACrC;AAEA,SAAS,gBACP,OACA,OACgB;AAChB,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,YAAY,oBAAI,IAAsB;AAE5C,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,aAAS,IAAI,MAAM,CAAC;AACpB,cAAU,IAAI,MAAM,CAAC,CAAC;AAAA,EACxB;AAEA,aAAW,CAAC,MAAM,EAAE,KAAK,OAAO;AAC9B,cAAU,IAAI,IAAI,GAAG,KAAK,EAAE;AAC5B,aAAS,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,KAAK,CAAC;AAAA,EAC9C;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,MAAM,MAAM,KAAK,UAAU;AACrC,QAAI,WAAW,EAAG,OAAM,KAAK,IAAI;AAAA,EACnC;AAEA,QAAM,SAAyB,CAAC;AAChC,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,OAAO,MAAM,MAAM;AACzB,WAAO,KAAK,MAAM,IAAI,IAAI,CAAE;AAE5B,eAAW,YAAY,UAAU,IAAI,IAAI,KAAK,CAAC,GAAG;AAChD,YAAM,aAAa,SAAS,IAAI,QAAQ,KAAK,KAAK;AAClD,eAAS,IAAI,UAAU,SAAS;AAChC,UAAI,cAAc,EAAG,OAAM,KAAK,QAAQ;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,MAAM,MAAM;AAChC,UAAM,UAAU,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACjF,UAAM,IAAI,MAAM,2CAA2C,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,EACjF;AAEA,SAAO;AACT;AAzEA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,YAAAC,WAAU,aAAAC,YAAW,OAAO,UAAAC,eAAc;AACnD,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAQ5B,eAAsB,gBAAgB,UAAkB,YAAyC;AAC/F,MAAI;AACF,UAAMA,QAAO,QAAQ;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAMF,UAAS,UAAU,OAAO;AACjD,SAAO,aAAa,aAAa,8BAAuB;AAC1D;AAEO,SAAS,aAAa,UAAkB,YAAoB,YAA4B;AAC7F,SAAO,YAAY,UAAU,YAAY,YAAY,SAAS,UAAU;AAC1E;AAEA,eAAsB,iBAAiB,UAA0C;AAC/E,MAAI;AACF,WAAO,MAAMA,UAAS,UAAU,OAAO;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,mBAAmB,UAAkB,SAAgC;AACzF,QAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAMC,WAAU,UAAU,OAAO;AACnC;AAnCA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,gBAAgB;AAGlB,SAAS,oBAAoB,IAAoB,MAAgB,YAA0B;AAChG,MAAI,KAAK,WAAW,EAAG;AACvB,QAAM,OAAO,KAAK,KAAK,GAAG;AAC1B,QAAM,OAAO,MAAM;AACjB,YAAQ,IAAI;AAAA,MACV,KAAK;AAAO,eAAO,WAAW,IAAI;AAAA,MAClC,KAAK;AAAQ,eAAO,YAAY,IAAI;AAAA,MACpC,KAAK;AAAQ,eAAO,YAAY,IAAI;AAAA,MACpC,KAAK;AAAO,eAAO,eAAe,IAAI;AAAA,IACxC;AAAA,EACF,GAAG;AACH,WAAS,KAAK,EAAE,KAAK,YAAY,OAAO,OAAO,CAAC;AAClD;AAfA;AAAA;AAAA;AAAA;AAAA;;;ACAA,OAAOE,SAAQ;AAER,SAAS,aAAa,SAA2C;AACtE,QAAM,UAAoB,CAAC;AAC3B,aAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,OAAO,GAAG;AACxD,QAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AACrB,cAAQ,KAAK,KAAKA,IAAG,OAAO,GAAG,CAAC,KAAK,WAAW,EAAE;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AACT;AAVA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,UAAmB,QAAAC,aAAmB;AAmBxC,SAAS,mBACd,SACA,UACA,UACA,SACQ;AACR,QAAM,iBAAiB,kBAAkB,QAAQ;AACjD,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,YAAY,QAAQ,cAAc;AAGxC,SAAO,QAAQ;AAAA,IACb;AAAA,IACA,CAAC,QAAQ,QAAgB,MAAc,YAAoB,UAAkB;AAC3E,UAAI,CAAC,YAAY,SAAS,IAAgB,GAAG;AAC3C,eAAO,GAAG,MAAM,SAAS,IAAI,IAAI,UAAU,GAAG,KAAK;AAAA,MACrD;AAEA,YAAM,YAAY,QAAQ,IAAgB;AAC1C,YAAM,aAAaA,MAAK,WAAW,UAAU;AAC7C,UAAI,MAAM,SAAS,WAAW,UAAU;AAGxC,YAAM,IAAI,MAAM,IAAI,EAAE,KAAK,GAAG;AAG9B,UAAI,CAAC,IAAI,WAAW,GAAG,GAAG;AACxB,cAAM,KAAK,GAAG;AAAA,MAChB;AAEA,aAAO,GAAG,MAAM,GAAG,GAAG,GAAG,KAAK;AAAA,IAChC;AAAA,EACF;AACF;AArDA,IAIM,aAEA;AANN;AAAA;AAAA;AAIA,IAAM,cAAmC,CAAC,UAAU,SAAS,UAAU,SAAS;AAEhF,IAAM,oBAA8C;AAAA,MAClD,cAAc;AAAA,MACd,aAAa;AAAA,MACb,cAAc;AAAA,MACd,gBAAgB;AAAA,IAClB;AAAA;AAAA;;;ACXA,SAAS,YAAAC,WAAU,aAAAC,kBAAiB;AACpC,SAAS,QAAAC,aAAY;AAMd,SAAS,cACd,iBACA,OACQ;AACR,QAAM,SAAS,KAAK,MAAM,eAAe;AAEzC,MAAI,CAAC,OAAO,iBAAiB;AAC3B,WAAO,kBAAkB,CAAC;AAAA,EAC5B;AACA,MAAI,CAAC,OAAO,gBAAgB,OAAO;AACjC,WAAO,gBAAgB,QAAQ,CAAC;AAAA,EAClC;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,WAAO,gBAAgB,MAAM,GAAG,IAAI;AAAA,EACtC;AAEA,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI;AAC3C;AAMA,eAAsB,qBACpB,YACA,OACe;AACf,QAAM,eAAeA,MAAK,YAAY,eAAe;AACrD,MAAI;AACJ,MAAI;AACF,cAAU,MAAMF,UAAS,cAAc,OAAO;AAAA,EAChD,QAAQ;AACN,cAAU;AAAA,EACZ;AAEA,QAAM,UAAU,cAAc,SAAS,KAAK;AAC5C,QAAMC,WAAU,cAAc,OAAO;AACvC;AA7CA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,kBAAkB;AAEpB,SAAS,YAAY,SAAyB;AACnD,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACtE;AAJA;AAAA;AAAA;AAAA;AAAA;;;ACMO,SAAS,kBAAkB,OAA6B;AAC7D,MAAI,YAAY;AAChB,MAAI,OAAO;AAGX,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,UAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAI,aAAa,IAAI;AACnB,YAAM,IAAI,MAAM,gCAAgC,KAAK,4BAA4B;AAAA,IACnF;AACA,gBAAY,KAAK,MAAM,GAAG,QAAQ;AAClC,WAAO,KAAK,MAAM,WAAW,CAAC;AAAA,EAChC;AAGA,QAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,MAAI,UAAU,IAAI;AAChB,WAAO,EAAE,WAAW,MAAM,MAAM,SAAS,OAAU;AAAA,EACrD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,MAAM,GAAG,KAAK;AAAA,IACzB,SAAS,KAAK,MAAM,QAAQ,CAAC;AAAA,EAC/B;AACF;AA/BA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,KAAAE,UAAS;AAAlB,IAEaC,gBAGA,oBAMA,sBAQA,oBAoBA,yBAWA,qBAOA;AAzDb;AAAA;AAAA;AAEO,IAAMA,iBAAgBD,GAAE,KAAK,CAAC,cAAc,aAAa,cAAc,gBAAgB,cAAc,CAAC;AAGtG,IAAM,qBAAqBA,GAAE,OAAO;AAAA,MACzC,MAAMA,GAAE,OAAO;AAAA,MACf,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMC;AAAA,IACR,CAAC;AAEM,IAAM,uBAAuBD,GAAE,OAAO;AAAA,MAC3C,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMA,GAAE,KAAK,CAAC,WAAW,OAAO,YAAY,SAAS,CAAC;AAAA,MACtD,MAAMA,GAAE,OAAO;AAAA,IACjB,CAAC;AAGM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,MACzC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMC;AAAA,MACN,aAAaD,GAAE,OAAO;AAAA,MACtB,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MAC3C,iBAAiBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MAC9C,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnD,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnD,OAAOA,GAAE,MAAM,kBAAkB;AAAA,MACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,MAC7D,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACzC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,WAAWA,GAAE,MAAM,oBAAoB,EAAE,SAAS;AAAA,IACpD,CAAC;AAGM,IAAM,0BAA0BA,GAAE,OAAO;AAAA,MAC9C,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMC;AAAA,MACN,aAAaD,GAAE,OAAO;AAAA,MACtB,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACnD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACzC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MACvC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,CAAC;AAEM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,MAC1C,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,SAASA,GAAE,OAAO;AAAA,MAClB,OAAOA,GAAE,MAAM,uBAAuB;AAAA,IACxC,CAAC;AAGM,IAAM,YAA2C;AAAA,MACtD,cAAc;AAAA,MACd,aAAa;AAAA,MACb,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAAA;AAAA;;;AC/DA;AAAA;AAAA;AAAA;AAAA,YAAYE,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,QAAAC,aAAY;AAyBrB,eAAsB,WAAW,YAAsB,MAAkB;AACvE,EAAE,SAAMD,IAAG,OAAOA,IAAG,MAAM,YAAY,CAAC,CAAC;AAEzC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,IAAE,OAAI,MAAM,+CAA+C;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,qBAAqB,WAAW,IAAI,CAAC,MAAM;AAC/C,QAAI,MAAM,UAAU;AAClB,YAAM,KAAK,OAAO,aAAa;AAC/B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,OAAO,mBAAmB,IAAI,iBAAiB;AACrD,QAAM,UAAU,IAAI,gBAAgB,OAAO,UAAU;AAErD,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,2BAA2B;AAEnC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,oBAAoB,oBAAoB,OAAO,SAAS;AACvE,YAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK,EAAE,WAAW,SAAS,MAAM,SAAS,OAAU;AAChG,YAAM,QAAQ,MAAM,QAAQ,WAAW,IAAI,SAAS;AACpD,YAAM,YAAY,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACzD,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,cAAc,IAAI,kBAAkB,IAAI,SAAS,WAAW;AAC5F,YAAM,MAAM,UAAU,UAAU,IAAI;AACpC,aAAO,QAAQ,UAAU,MAAM,KAAY,IAAI,WAAW,IAAI,OAAO;AAAA,IACvE,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,MAAE,KAAKA,IAAG,IAAI,gCAAgC,CAAC;AAC/C,IAAE,OAAI,MAAM,IAAI,OAAO;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,YAAY,SAAS,MAAM,eAAe;AAEjD,EAAE,OAAI,KAAK,wBAAwB;AACnC,aAAW,QAAQ,UAAU;AAC3B,UAAM,aAAa,mBAAmB,SAAS,KAAK,IAAI,KAAK,WAAW,SAAS,KAAK,IAAI;AAC1F,UAAM,QAAQ,aAAa,KAAK,OAAO,GAAG,KAAK,IAAI,IAAIA,IAAG,IAAI,cAAc,CAAC;AAC7E,IAAE,OAAI,QAAQ,KAAKA,IAAG,KAAK,KAAK,CAAC,EAAE;AAAA,EACrC;AAEA,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,iBAA2B,CAAC;AAElC,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,aAAc,SAAQ,KAAK,GAAG,KAAK,YAAY;AACxD,QAAI,KAAK,SAAS;AAChB,qBAAe,KAAK,GAAG,aAAa,KAAK,OAAO,CAAC;AAAA,IACnD;AAEA,QAAI,KAAK,SAAS,gBAAgB;AAEhC,YAAM,UAAU,OAAO,QAAQ,QAAQ;AAEvC,iBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAM,aAAaC,MAAK,KAAK,SAAS,KAAK,IAAI;AAC/C,cAAM,eAAeA,MAAK,SAAS,KAAK,IAAI;AAE5C,cAAM,SAAS,MAAM,gBAAgB,YAAY,KAAK,OAAO;AAE7D,gBAAQ,QAAQ;AAAA,UACd;AACE,kBAAM,mBAAmB,YAAY,KAAK,OAAO;AACjD,oBAAQ,KAAK,YAAY;AACzB;AAAA,UAEF;AACE,oBAAQ,KAAK,YAAY;AACzB;AAAA,UAEF;AACE,gBAAI,KAAK,WAAW;AAClB,oBAAM,mBAAmB,YAAY,KAAK,OAAO;AACjD,sBAAQ,KAAK,YAAY;AAAA,YAC3B,OAAO;AACL,oBAAM,WAAW,MAAM,iBAAiB,UAAU;AAClD,oBAAM,OAAO,aAAa,cAAc,YAAY,IAAI,KAAK,OAAO;AACpE,cAAE,OAAI,QAAQD,IAAG,IAAI,IAAI,CAAC;AAE1B,oBAAM,SAAS,MAAQ,UAAO;AAAA,gBAC5B,SAAS,GAAG,YAAY;AAAA,gBACxB,SAAS;AAAA,kBACP,EAAE,OAAO,QAAQ,OAAO,qBAAqB;AAAA,kBAC7C,EAAE,OAAO,aAAa,OAAO,kCAAkC;AAAA,gBACjE;AAAA,cACF,CAAC;AAED,kBAAI,CAAG,YAAS,MAAM,KAAK,WAAW,aAAa;AACjD,sBAAM,mBAAmB,YAAY,KAAK,OAAO;AACjD,wBAAQ,KAAK,YAAY;AAAA,cAC3B,OAAO;AACL,wBAAQ,KAAK,YAAY;AAAA,cAC3B;AAAA,YACF;AACA;AAAA,QACJ;AAAA,MACF;AAGA,UAAI,KAAK,UAAU;AACjB,cAAM,gBAA0C,CAAC;AACjD,cAAM,aAAa,KAAK,cAAc,KAAK;AAC3C,mBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACzD,wBAAc,GAAG,IAAI,OAAO,IAAI,CAAC,MAAM,KAAKC,MAAK,SAAS,YAAY,CAAC,CAAC,EAAE;AAAA,QAC5E;AACA,cAAM,qBAAqB,KAAK,aAAa;AAC7C,QAAE,OAAI,KAAK,qCAAqC,OAAO,KAAK,aAAa,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACzF;AAGA,YAAM,YAAY,OAAO,aAAa,CAAC;AACvC,YAAM,aAAa,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAC7D,YAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,KAAK,EAAE,WAAW,SAAS,MAAM,KAAK,MAAM,SAAS,OAAU;AAChH,YAAM,eAAe,IAAI,cAAc,UAAU,KAAK,OAAO,GAAG,IAAI,SAAS,IAAI,KAAK,IAAI;AAC1F,gBAAU,YAAY,IAAI;AAAA,QACxB,UAAU,IAAI;AAAA,QACd,SAAS,KAAK,WAAW;AAAA,QACzB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,OAAO,KAAK,MAAM,IAAI,CAAC,MAAMA,MAAK,SAAS,EAAE,IAAI,CAAC;AAAA,QAClD,MAAM,YAAY,UAAU;AAAA,MAC9B;AACA,aAAO,YAAY;AAAA,IAErB,OAAO;AAEL,iBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAM,YAAY,MAAM;AACtB,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK;AAAc,qBAAO;AAAA,YAC1B,KAAK;AAAa,qBAAO;AAAA,YACzB,KAAK;AAAc,qBAAO;AAAA,YAC1B,KAAK;AAAgB,qBAAO;AAAA,UAC9B;AAAA,QACF,GAAG;AAEH,cAAM,WAAW,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI;AAC1C,cAAM,aAAaA,MAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,QAAQ;AAC/D,cAAM,eAAeA,MAAK,OAAO,QAAQ,QAAQ,GAAG,QAAQ;AAC5D,cAAM,UAAU,mBAAmB,KAAK,SAAS,KAAK,MAAM,UAAU,OAAO,OAAO;AAEpF,cAAM,SAAS,MAAM,gBAAgB,YAAY,OAAO;AAExD,gBAAQ,QAAQ;AAAA,UACd;AACE,kBAAM,mBAAmB,YAAY,OAAO;AAC5C,oBAAQ,KAAK,YAAY;AACzB;AAAA,UAEF;AACE,oBAAQ,KAAK,YAAY;AACzB;AAAA,UAEF;AACE,gBAAI,KAAK,WAAW;AAClB,oBAAM,mBAAmB,YAAY,OAAO;AAC5C,sBAAQ,KAAK,YAAY;AAAA,YAC3B,OAAO;AACL,oBAAM,WAAW,MAAM,iBAAiB,UAAU;AAClD,oBAAM,OAAO,aAAa,cAAc,YAAY,IAAI,OAAO;AAC/D,cAAE,OAAI,QAAQD,IAAG,IAAI,IAAI,CAAC;AAE1B,oBAAM,SAAS,MAAQ,UAAO;AAAA,gBAC5B,SAAS,GAAG,YAAY;AAAA,gBACxB,SAAS;AAAA,kBACP,EAAE,OAAO,QAAQ,OAAO,qBAAqB;AAAA,kBAC7C,EAAE,OAAO,aAAa,OAAO,kCAAkC;AAAA,gBACjE;AAAA,cACF,CAAC;AAED,kBAAI,CAAG,YAAS,MAAM,KAAK,WAAW,aAAa;AACjD,sBAAM,mBAAmB,YAAY,OAAO;AAC5C,wBAAQ,KAAK,YAAY;AAAA,cAC3B,OAAO;AACL,wBAAQ,KAAK,YAAY;AAAA,cAC3B;AAAA,YACF;AACA;AAAA,QACJ;AAAA,MACF;AAGA,YAAM,YAAY,OAAO,aAAa,CAAC;AACvC,YAAM,aAAa,KAAK,MAAM,IAAI,CAAC,MAAM;AACvC,cAAM,KAAK,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI;AACjC,eAAO,mBAAmB,EAAE,SAAS,KAAK,MAAM,IAAI,OAAO,OAAO;AAAA,MACpE,CAAC,EAAE,KAAK,IAAI;AACZ,YAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,KAAK,EAAE,WAAW,SAAS,MAAM,KAAK,MAAM,SAAS,OAAU;AAChH,YAAM,eAAe,IAAI,cAAc,UAAU,KAAK,OAAO,GAAG,IAAI,SAAS,IAAI,KAAK,IAAI;AAC1F,gBAAU,YAAY,IAAI;AAAA,QACxB,UAAU,IAAI;AAAA,QACd,SAAS,KAAK,WAAW;AAAA,QACzB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,OAAO,KAAK,MAAM,IAAI,CAAC,MAAM;AAC3B,gBAAM,YAAY,MAAM;AACtB,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK;AAAc,uBAAO;AAAA,cAC1B,KAAK;AAAa,uBAAO;AAAA,cACzB,KAAK;AAAc,uBAAO;AAAA,cAC1B,KAAK;AAAgB,uBAAO;AAAA,YAC9B;AAAA,UACF,GAAG;AACH,gBAAM,WAAW,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI;AACvC,iBAAOC,MAAK,OAAO,QAAQ,QAAQ,GAAG,QAAQ;AAAA,QAChD,CAAC;AAAA,QACD,MAAM,YAAY,UAAU;AAAA,MAC9B;AACA,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,MAAM;AAE7B,QAAM,aAAa,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AACvC,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK,MAAM,qBAAqB,GAAG;AACzC,QAAI,IAAI;AACN,QAAE,MAAM,cAAc,WAAW,MAAM,iBAAiB,WAAW,WAAW,IAAI,MAAM,KAAK,KAAK;AAClG,UAAI;AACF,4BAAoB,IAAI,YAAY,GAAG;AACvC,UAAE,KAAK,wBAAwB;AAAA,MACjC,QAAQ;AACN,UAAE,KAAKD,IAAG,OAAO,qCAAqC,CAAC;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,QAAQ,WAAW,QAAQ,MAAM,WAAW;AAClD,eAAW,KAAK,QAAS,CAAE,OAAI,QAAQ,KAAKA,IAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EAClE;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,QAAQ,WAAW,QAAQ,MAAM,WAAW;AAClD,eAAW,KAAK,QAAS,CAAE,OAAI,QAAQ,KAAKA,IAAG,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EACnE;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,KAAK,WAAW,QAAQ,MAAM,WAAW;AAC/C,eAAW,KAAK,QAAS,CAAE,OAAI,QAAQ,KAAKA,IAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EAChE;AAEA,MAAI,eAAe,SAAS,GAAG;AAC7B,IAAE,OAAI,KAAK,gCAAgC;AAC3C,eAAW,KAAK,eAAgB,CAAE,OAAI,QAAQ,CAAC;AAAA,EACjD;AAEA,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,MAAM;AACb,MAAE,OAAI,KAAK,GAAGA,IAAG,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;AAAA,IAClD;AAAA,EACF;AAEA,EAAE,SAAMA,IAAG,MAAM,OAAO,CAAC;AAC3B;AAvSA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACpBA;AAAA;AAAA;AAAA;AAAA,YAAYE,QAAO;AACnB,OAAOC,SAAQ;AAaf,eAAsB,YAAY,MAAmB;AACnD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,IAAI,gBAAgB,OAAO,UAAU;AAErD,QAAM,oBAAoB,KAAK,WAC3B,CAAC,KAAK,QAAQ,IACd,OAAO,KAAK,OAAO,UAAU;AAEjC,MAAI,KAAK,YAAY,CAAC,OAAO,WAAW,KAAK,QAAQ,GAAG;AACtD,IAAE,OAAI,MAAM,YAAYA,IAAG,KAAK,KAAK,QAAQ,CAAC,2BAA2BA,IAAG,KAAK,oBAAoB,CAAC,gCAAgC;AACtI,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,4BAA4B;AAEpC,QAAM,WAAqC,CAAC;AAC5C,QAAM,SAAmB,CAAC;AAE1B,aAAW,aAAa,mBAAmB;AACzC,QAAI;AACF,YAAM,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAChD,iBAAW,QAAQ,MAAM,OAAO;AAC9B,iBAAS,KAAK,EAAE,GAAG,MAAM,UAAU,CAAC;AAAA,MACtC;AAAA,IACF,SAAS,KAAU;AACjB,aAAO,KAAK,GAAG,SAAS,KAAK,IAAI,OAAO,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,KAAK,OAAO,SAAS,GAAG;AAC9C,MAAE,KAAKA,IAAG,IAAI,4BAA4B,CAAC;AAC3C,eAAW,KAAK,OAAQ,CAAE,OAAI,MAAM,CAAC;AACrC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,SAAS,SAAS,MAAM,sBAAsB,kBAAkB,SAAS,OAAO,MAAM,IAAI,kBAAkB,SAAS,OAAO,WAAW,IAAI,aAAa,YAAY,EAAE;AAE7K,aAAW,KAAK,QAAQ;AACtB,IAAE,OAAI,KAAK,GAAGA,IAAG,OAAO,QAAG,CAAC,oBAAoB,CAAC,EAAE;AAAA,EACrD;AAEA,QAAM,YAAY,OAAO,aAAa,CAAC;AACvC,QAAM,aAAa,oBAAI,IAAsC;AAE7D,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,QAAQ,CAAC,KAAK,KAAK,SAAS,KAAK,IAAI,EAAG;AAEjD,UAAM,QAAQ,KAAK,KAAK,QAAQ,SAAS,EAAE;AAC3C,QAAI,CAAC,WAAW,IAAI,KAAK,EAAG,YAAW,IAAI,OAAO,CAAC,CAAC;AACpD,eAAW,IAAI,KAAK,EAAG,KAAK,IAAI;AAAA,EAClC;AAEA,MAAI,iBAAiB;AACrB,MAAI,cAAc;AAElB,aAAW,CAAC,OAAO,KAAK,KAAK,YAAY;AACvC,IAAE,OAAI,QAAQA,IAAG,KAAK;AAAA,EAAK,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC;AAE9E,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,KAAK,cAAc,UAAU,KAAK,OAAO,GAAG,KAAK,SAAS,IAAI,KAAK,IAAI;AAC3F,YAAM,OAAO,UAAU,KAAK,IAAI,KAAK,UAAU,WAAW;AAC1D,UAAI,KAAK,aAAa,CAAC,KAAM;AAE7B,YAAM,UAAUA,IAAG,IAAI,IAAI,KAAK,WAAW,OAAO,EAAE;AAEpD,UAAI,MAAM;AACR;AACA,cAAM,SAASA,IAAG,MAAM,QAAG;AAC3B,cAAM,YAAY,KAAK,WAAW,KAAK,YAAY,KAAK;AACxD,cAAM,YAAY,YAAYA,IAAG,OAAO,YAAO,KAAK,OAAO,YAAY,IAAI;AAC3E,YAAI,UAAW;AACf,QAAE,OAAI,QAAQ,KAAK,MAAM,IAAI,YAAY,OAAO,EAAE,CAAC,IAAI,OAAO,KAAKA,IAAG,IAAI,KAAK,WAAW,CAAC,GAAG,SAAS,EAAE;AAAA,MAC3G,OAAO;AACL,cAAM,SAASA,IAAG,IAAI,QAAG;AACzB,QAAE,OAAI,QAAQ,KAAK,MAAM,IAAI,YAAY,OAAO,EAAE,CAAC,IAAI,OAAO,KAAKA,IAAG,IAAI,KAAK,WAAW,CAAC,EAAE;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,SAAS,SAAS;AACzC,QAAM,QAAQ,CAAC,GAAG,cAAc,cAAc,GAAG,cAAc,YAAY;AAC3E,MAAI,cAAc,EAAG,OAAM,KAAK,GAAG,WAAW,UAAU,gBAAgB,IAAI,KAAK,GAAG,YAAY;AAChG,EAAE,OAAI,QAAQ,EAAE;AAChB,EAAE,OAAI,QAAQA,IAAG,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AAC/C;AAzGA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACHA;AAAA;AAAA;AAAA;AAAA,YAAYC,QAAO;AAEnB,SAAS,QAAAC,aAAY;AAOrB,eAAsB,YAAY,eAAuB;AACvD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,QAAQ,kBAAkB,WAAY,OAAO,aAAa,SAAU;AAC1E,QAAM,MAAM,kBAAkB,KAAK;AAGnC,QAAM,eAAe,IAAI,cAAc,UAAU,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI,IAAI,IAAI;AACxF,QAAM,YAAY,OAAO,YAAY,YAAY;AACjD,MAAI,CAAC,WAAW;AACd,IAAE,OAAI,MAAM,cAAc,IAAI,IAAI,qBAAqB;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,UAAU,YAAY,IAAI;AAC5C,QAAM,UAAU,IAAI,gBAAgB,OAAO,UAAU;AACrD,QAAM,QAAQ,MAAM,QAAQ,WAAW,SAAS;AAChD,QAAM,YAAY,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;AAC7D,MAAI,CAAC,WAAW;AACd,IAAE,OAAI,MAAM,cAAc,IAAI,IAAI,kBAAkB,SAAS,YAAY;AACzE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,UAAU,UAAU,IAAI;AACpC,QAAM,eAAe,MAAM,QAAQ,UAAU,IAAI,MAAM,KAAK,WAAW,IAAI,OAAO;AAElF,MAAI,UAAU;AACd,aAAW,QAAQ,aAAa,OAAO;AACrC,QAAI,UAAU,SAAS,gBAAgB;AAErC,YAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,YAAM,YAAYA,MAAK,KAAK,SAAS,KAAK,IAAI;AAC9C,YAAM,eAAeA,MAAK,SAAS,KAAK,IAAI;AAC5C,YAAM,eAAe,MAAM,iBAAiB,SAAS;AAErD,UAAI,iBAAiB,MAAM;AACzB,QAAE,OAAI,KAAK,GAAG,YAAY,wBAAwB;AAClD,kBAAU;AAAA,MACZ,WAAW,iBAAiB,KAAK,SAAS;AACxC,cAAM,OAAO,aAAa,cAAc,cAAc,KAAK,OAAO;AAClE,gBAAQ,IAAI,IAAI;AAChB,kBAAU;AAAA,MACZ;AAAA,IACF,OAAO;AAEL,YAAM,WAAW,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI;AAC1C,YAAM,YAAY,MAAM;AACtB,gBAAQ,UAAU,MAAM;AAAA,UACtB,KAAK;AAAc,mBAAO;AAAA,UAC1B,KAAK;AAAa,mBAAO;AAAA,UACzB,KAAK;AAAc,mBAAO;AAAA,UAC1B,KAAK;AAAgB,mBAAO;AAAA,QAC9B;AAAA,MACF,GAAG;AACH,YAAM,YAAYA,MAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,QAAQ;AAC9D,YAAM,eAAe,MAAM,iBAAiB,SAAS;AAErD,UAAI,iBAAiB,MAAM;AACzB,QAAE,OAAI,KAAK,GAAG,QAAQ,wBAAwB;AAC9C,kBAAU;AAAA,MACZ,WAAW,iBAAiB,KAAK,SAAS;AACxC,cAAM,OAAO,aAAa,UAAU,cAAc,KAAK,OAAO;AAC9D,gBAAQ,IAAI,IAAI;AAChB,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,IAAE,OAAI,QAAQ,GAAG,IAAI,IAAI,+BAA+B;AAAA,EAC1D;AACF;AAtFA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACPA;AAAA;AAAA;AAAA;AAAA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAc;AAIvB,eAAsB,cAAc,eAAuB;AACzD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,QAAQ,kBAAkB,WAAY,OAAO,aAAa,SAAU;AAC1E,QAAM,MAAM,kBAAkB,KAAK;AAGnC,QAAM,eAAe,IAAI,cAAc,UAAU,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI,IAAI,IAAI;AACxF,QAAM,YAAY,OAAO,YAAY,YAAY;AACjD,MAAI,CAAC,WAAW;AACd,IAAE,OAAI,MAAM,cAAc,IAAI,IAAI,qBAAqB;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAe,MAAQ,WAAQ;AAAA,IACnC,SAAS,UAAU,IAAI,IAAI,sBAAsB,UAAU,MAAM,MAAM;AAAA,IACvE,cAAc;AAAA,EAChB,CAAC;AACD,MAAM,YAAS,YAAY,KAAK,CAAC,cAAc;AAC7C,IAAE,UAAO,mBAAmB;AAC5B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAoB,CAAC;AAC3B,aAAW,YAAY,UAAU,OAAO;AACtC,QAAI;AACF,YAAM,OAAOA,MAAK,KAAK,QAAQ,CAAC;AAChC,cAAQ,KAAK,QAAQ;AAAA,IACvB,QAAQ;AACN,MAAE,OAAI,KAAK,oBAAoB,QAAQ,mCAAmC;AAAA,IAC5E;AAAA,EACF;AAEA,SAAO,OAAO,UAAW,YAAY;AACrC,MAAI,OAAO,KAAK,OAAO,SAAU,EAAE,WAAW,GAAG;AAC/C,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,YAAY,KAAK,MAAM;AAE7B,MAAI,QAAQ,SAAS,GAAG;AACtB,IAAE,OAAI,QAAQ,WAAW,IAAI,IAAI,GAAG;AACpC,eAAW,KAAK,QAAS,CAAE,OAAI,QAAQ,KAAKD,IAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EAChE;AACF;AAxDA;AAAA;AAAA;AAIA;AACA;AAAA;AAAA;;;ACLA;AAAA;AAAA;AAAA;AAEA,YAAYE,QAAO;AAEnB,eAAsB,cAAc,YAAsB;AAExD,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,SAAS,MAAM,WAAW,GAAG;AACnC,QAAI,CAAC,QAAQ;AACX,MAAE,OAAI,MAAM,4CAA4C;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,YAAY,OAAO;AACzB,QAAI,CAAC,aAAa,OAAO,KAAK,SAAS,EAAE,WAAW,GAAG;AACrD,MAAE,OAAI,KAAK,oCAAoC;AAC/C;AAAA,IACF;AAEA,iBAAa,OAAO,KAAK,SAAS;AAAA,EACpC;AAEA,QAAM,WAAW,YAAY,EAAE,WAAW,KAAK,CAAC;AAClD;AAxBA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA;AAAA;AAAA;AAAA;AAAA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AAMf,eAAsB,YAAY,WAAmB;AACnD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,QAAQ;AACX,IAAE,OAAI,MAAM,4CAA4C;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,kBAAkB,SAAS;AACvC,QAAM,UAAU,IAAI,gBAAgB,OAAO,UAAU;AAErD,QAAM,IAAM,WAAQ;AACpB,IAAE,MAAM,4BAA4B;AAGpC,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,QAAQ,WAAW,IAAI,SAAS;AAAA,EAChD,SAAS,KAAU;AACjB,MAAE,KAAKA,IAAG,IAAI,0BAA0B,CAAC;AACzC,IAAE,OAAI,MAAM,IAAI,OAAO;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,YAAY,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI;AAC7D,MAAI,CAAC,WAAW;AACd,MAAE,KAAKA,IAAG,IAAI,qBAAqB,CAAC;AACpC,IAAE,OAAI,MAAM,cAAc,IAAI,IAAI,0BAA0B;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,MAAM,UAAU,UAAU,IAAI;AACpC,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,QAAQ,UAAU,IAAI,MAAM,KAAK,IAAI,WAAW,IAAI,OAAO;AAAA,EAC1E,SAAS,KAAU;AACjB,MAAE,KAAKA,IAAG,IAAI,2BAA2B,CAAC;AAC1C,IAAE,OAAI,MAAM,IAAI,OAAO;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,IAAE,KAAK,iBAAiB;AAGxB,QAAM,UAAU,KAAK,WAAW,UAAU,WAAW;AACrD,QAAM,WAAW,UAAU,KAAK,QAAQ,SAAS,EAAE;AAGnD,UAAQ,IAAI;AACZ,UAAQ;AAAA,IACN,KAAKA,IAAG,KAAK,KAAK,IAAI,CAAC,IAAIA,IAAG,KAAK,IAAI,OAAO,EAAE,CAAC,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,SAAS,QAAQ,SAAS,CAAC,CAAC,CAAC,GAAGA,IAAG,IAAI,IAAI,SAAS,CAAC;AAAA,EACjJ;AACA,UAAQ,IAAI,KAAKA,IAAG,IAAI,KAAK,WAAW,CAAC,EAAE;AAC3C,UAAQ,IAAI;AAGZ,UAAQ,IAAI,KAAKA,IAAG,IAAI,OAAO,CAAC,cAAc,QAAQ,EAAE;AAExD,MAAI,KAAK,cAAc,QAAQ;AAC7B,YAAQ;AAAA,MACN,KAAKA,IAAG,IAAI,eAAe,CAAC,MAAM,KAAK,aAAa,KAAK,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,KAAK,sBAAsB,QAAQ;AACrC,YAAQ;AAAA,MACN,KAAKA,IAAG,IAAI,gBAAgB,CAAC,KAAK,KAAK,qBAAqB,KAAK,IAAI,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,QAAQ;AAC3B,YAAQ;AAAA,MACN,KAAKA,IAAG,IAAI,aAAa,CAAC,QAAQ,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,KAAK,WAAW;AAClB,YAAQ,IAAI,KAAKA,IAAG,IAAI,UAAU,CAAC,WAAW,KAAK,SAAS,EAAE;AAAA,EAChE;AAGA,QAAM,WAAW,UAAU;AAC3B,MAAI,UAAU,QAAQ;AACpB,YAAQ,IAAI,KAAKA,IAAG,IAAI,WAAW,CAAC,UAAU,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,EACrE;AAGA,MAAI,KAAK,WAAW,QAAQ;AAC1B,YAAQ,IAAI;AACZ,YAAQ,IAAI,KAAKA,IAAG,KAAK,YAAY,CAAC,EAAE;AACxC,eAAW,SAAS,KAAK,WAAW;AAClC,YAAM,MACJ,MAAM,SAAS,YACXA,IAAG,MAAM,MAAM,IAAI,IACnB,MAAM,SAAS,QACbA,IAAG,OAAO,MAAM,IAAI,IACpB,MAAM,SAAS,aACbA,IAAG,IAAI,MAAM,IAAI,IACjBA,IAAG,IAAI,MAAM,IAAI;AAC3B,cAAQ;AAAA,QACN,OAAOA,IAAG,KAAK,MAAM,OAAO,CAAC,KAAKA,IAAG,IAAI,MAAM,IAAI,CAAC,KAAK,GAAG,KAAK,MAAM,IAAI;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,IAAI;AACZ,QAAM,YAAY,KAAK,MAAM;AAC7B,UAAQ,IAAI,KAAKA,IAAG,KAAK,QAAQ,CAAC,IAAIA,IAAG,IAAI,IAAI,SAAS,GAAG,CAAC,EAAE;AAChE,QAAM,WAAW;AACjB,aAAW,QAAQ,KAAK,MAAM,MAAM,GAAG,QAAQ,GAAG;AAChD,YAAQ,IAAI,OAAOA,IAAG,IAAI,KAAK,IAAI,CAAC,EAAE;AAAA,EACxC;AACA,MAAI,YAAY,UAAU;AACxB,YAAQ,IAAI,OAAOA,IAAG,IAAI,WAAW,YAAY,QAAQ,OAAO,CAAC,EAAE;AAAA,EACrE;AAGA,QAAM,YAAY,OAAO,YAAY,KAAK,IAAI;AAC9C,MAAI,WAAW;AACb,YAAQ,IAAI;AACZ,YAAQ;AAAA,MACN,KAAKA,IAAG,MAAM,WAAW,CAAC,IAAIA,IAAG,IAAI,IAAI,UAAU,OAAO,EAAE,CAAC;AAAA,IAC/D;AACA,QAAI,YAAY,UAAU,SAAS;AACjC,cAAQ;AAAA,QACN,KAAKA,IAAG,OAAO,mBAAmB,CAAC,IAAIA,IAAG,IAAI,IAAI,UAAU,OAAO,EAAE,CAAC,WAAMA,IAAG,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,MACpG;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI;AACd;AA5IA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAAA;;;ACLA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AAiBf,eAAsB,mBACpB,WACA,KACA,OAA2B,CAAC,GAC5B;AACA,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAEzE,MAAI,CAAC,UAAU,WAAW,GAAG,GAAG;AAC9B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,MAAI,CAAC,IAAI,SAAS,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,MAAI,CAAC,IAAI,SAAS,QAAQ,GAAG;AAC3B,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,MAAI,OAAO,WAAW,SAAS,KAAK,CAAC,KAAK,WAAW;AACnD,UAAM,IAAI,MAAM,aAAa,SAAS,sDAAsD;AAAA,EAC9F;AAEA,SAAO,WAAW,SAAS,IAAI;AAC/B,QAAM,YAAY,KAAK,MAAM;AAE7B,EAAE,OAAI,QAAQ,kBAAkBA,IAAG,KAAK,SAAS,CAAC,EAAE;AACpD,EAAE,OAAI,QAAQA,IAAG,IAAI,KAAK,GAAG,EAAE,CAAC;AAClC;AAEA,eAAsB,sBACpB,WACA,OAA8B,CAAC,GACY;AAC3C,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAEzE,MAAI,CAAC,OAAO,WAAW,SAAS,GAAG;AACjC,UAAM,IAAI,MAAM,aAAa,SAAS,sBAAsB;AAAA,EAC9D;AACA,MAAI,cAAc,WAAW,CAAC,KAAK,OAAO;AACxC,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACtF;AAEA,QAAM,qBAA+B,CAAC;AACtC,MAAI,OAAO,WAAW;AACpB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAC5D,UAAI,MAAM,aAAa,WAAW;AAChC,2BAAmB,KAAK,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,WAAW,SAAS;AAClC,QAAM,YAAY,KAAK,MAAM;AAE7B,EAAE,OAAI,QAAQ,oBAAoBA,IAAG,KAAK,SAAS,CAAC,EAAE;AACtD,MAAI,mBAAmB,SAAS,GAAG;AACjC,IAAE,OAAI,KAAK,GAAG,mBAAmB,MAAM,mDAAmD;AAC1F,eAAW,QAAQ,oBAAoB;AACrC,MAAE,OAAI,QAAQ,KAAKA,IAAG,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,EAAE,mBAAmB;AAC9B;AAEA,eAAsB,oBACpB,OAA4B,CAAC,GACuB;AACpD,QAAM,MAAM,KAAK,OAAO,QAAQ,IAAI;AACpC,QAAM,SAAS,MAAM,WAAW,GAAG;AACnC,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAEzE,QAAM,UAAU,OAAO,QAAQ,OAAO,UAAU,EAAE,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,EAAE;AAEhG,MAAI,QAAQ,WAAW,GAAG;AACxB,IAAE,OAAI,QAAQA,IAAG,IAAI,6BAA6B,CAAC;AAAA,EACrD,OAAO;AACL,eAAW,EAAE,WAAW,IAAI,KAAK,SAAS;AACxC,MAAE,OAAI,QAAQ,KAAKA,IAAG,KAAK,UAAU,OAAO,EAAE,CAAC,CAAC,IAAIA,IAAG,IAAI,GAAG,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AACT;AAvGA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA,SAAS,eAAe;AAExB,IAAM,UAAU,IAAI,QAAQ,EACzB,KAAK,MAAM,EACX,YAAY,oDAAoD,EAChE,QAAQ,OAAO;AAElB,QACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,YAAY;AAClB,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,QAAMA,aAAY;AACpB,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,YAAY,uCAAuC,EACnD,SAAS,mBAAmB,4BAA4B,EACxD,OAAO,mBAAmB,4CAA4C,EACtE,OAAO,qBAAqB,0BAA0B,EACtD,OAAO,OAAO,YAAsB,SAAS;AAC5C,QAAM,EAAE,YAAAC,YAAW,IAAI,MAAM;AAC7B,QAAMA,YAAW,YAAY,IAAI;AACnC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,yCAAyC,EACrD,OAAO,mBAAmB,gCAAgC,EAC1D,OAAO,qBAAqB,uDAAuD,EACnF,OAAO,8BAA8B,yCAAyC,EAC9E,OAAO,OAAO,SAAS;AACtB,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,QAAMA,aAAY,IAAI;AACxB,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,qDAAqD,EACjE,SAAS,eAAe,gBAAgB,EACxC,OAAO,OAAO,cAAsB;AACnC,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,QAAMA,aAAY,SAAS;AAC7B,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,+BAA+B,EAC3C,SAAS,eAAe,0BAA0B,EAClD,OAAO,OAAO,cAAsB;AACnC,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,QAAMA,eAAc,SAAS;AAC/B,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,wDAAwD,EACpE,SAAS,mBAAmB,2BAA2B,EACvD,OAAO,OAAO,eAAyB;AACtC,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,QAAMA,eAAc,UAAU;AAChC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,SAAS,eAAe,uDAAuD,EAC/E,OAAO,OAAO,cAAsB;AACnC,QAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,QAAMA,aAAY,SAAS;AAC7B,CAAC;AAEH,IAAM,WAAW,QACd,QAAQ,UAAU,EAClB,YAAY,6BAA6B;AAE5C,SACG,QAAQ,KAAK,EACb,YAAY,0BAA0B,EACtC,SAAS,eAAe,mCAAmC,EAC3D,SAAS,SAAS,kDAAkD,EACpE,OAAO,mBAAmB,uCAAuC,EACjE,OAAO,OAAO,WAAmB,KAAa,SAAS;AACtD,QAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,QAAMA,oBAAmB,WAAW,KAAK,IAAI;AAC/C,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,SAAS,eAAe,6CAA6C,EACrE,OAAO,eAAe,2CAA2C,EACjE,OAAO,OAAO,WAAmB,SAAS;AACzC,QAAM,EAAE,uBAAAC,uBAAsB,IAAI,MAAM;AACxC,QAAMA,uBAAsB,WAAW,IAAI;AAC7C,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,gCAAgC,EAC5C,OAAO,YAAY;AAClB,QAAM,EAAE,qBAAAC,qBAAoB,IAAI,MAAM;AACtC,QAAMA,qBAAoB;AAC5B,CAAC;AAEH,QAAQ,MAAM;","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.
|
|
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": [
|
|
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": [
|
|
35
|
+
"keywords": [
|
|
36
|
+
"ai",
|
|
37
|
+
"agents",
|
|
38
|
+
"cli",
|
|
39
|
+
"registry",
|
|
40
|
+
"kitn"
|
|
41
|
+
],
|
|
34
42
|
"license": "MIT",
|
|
35
43
|
"repository": {
|
|
36
44
|
"type": "git",
|