@aiorg/cli 1.1.7 → 1.2.1
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 +493 -109
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -391,10 +391,10 @@ async function logout() {
|
|
|
391
391
|
}
|
|
392
392
|
|
|
393
393
|
// src/commands/init.ts
|
|
394
|
-
import * as
|
|
395
|
-
import
|
|
396
|
-
import
|
|
397
|
-
import
|
|
394
|
+
import * as p4 from "@clack/prompts";
|
|
395
|
+
import pc5 from "picocolors";
|
|
396
|
+
import path4 from "path";
|
|
397
|
+
import os4 from "os";
|
|
398
398
|
|
|
399
399
|
// src/lib/extract.ts
|
|
400
400
|
import extractZip from "extract-zip";
|
|
@@ -435,21 +435,291 @@ async function getFileSizeKB(filePath) {
|
|
|
435
435
|
return Math.round(stats.size / 1024);
|
|
436
436
|
}
|
|
437
437
|
|
|
438
|
+
// src/lib/project.ts
|
|
439
|
+
import fs3 from "fs-extra";
|
|
440
|
+
import path3 from "path";
|
|
441
|
+
import os3 from "os";
|
|
442
|
+
import * as p3 from "@clack/prompts";
|
|
443
|
+
import pc4 from "picocolors";
|
|
444
|
+
import { z as z3 } from "zod";
|
|
445
|
+
var AiorgFileSchema = z3.object({
|
|
446
|
+
project: z3.string(),
|
|
447
|
+
version: z3.string().optional()
|
|
448
|
+
});
|
|
449
|
+
var ContextJsonSchema = z3.object({
|
|
450
|
+
version: z3.string(),
|
|
451
|
+
business: z3.object({
|
|
452
|
+
name: z3.string(),
|
|
453
|
+
description: z3.string().optional(),
|
|
454
|
+
stage: z3.enum(["idea", "building", "launched", "pmf", "scaling"]).optional(),
|
|
455
|
+
launchDate: z3.string().optional()
|
|
456
|
+
}),
|
|
457
|
+
validation: z3.object({
|
|
458
|
+
ideaValidated: z3.boolean().optional(),
|
|
459
|
+
ideaScore: z3.number().optional(),
|
|
460
|
+
targetCustomer: z3.string().optional(),
|
|
461
|
+
valueProp: z3.string().optional(),
|
|
462
|
+
validatedAt: z3.string().optional()
|
|
463
|
+
}).optional(),
|
|
464
|
+
pmf: z3.object({
|
|
465
|
+
status: z3.enum(["not-started", "searching", "approaching", "achieved"]).optional(),
|
|
466
|
+
score: z3.number().nullable().optional(),
|
|
467
|
+
seanEllisScore: z3.number().nullable().optional(),
|
|
468
|
+
activationRate: z3.number().nullable().optional(),
|
|
469
|
+
weeklyRetention: z3.number().nullable().optional(),
|
|
470
|
+
measuredAt: z3.string().nullable().optional()
|
|
471
|
+
}).optional(),
|
|
472
|
+
installedKits: z3.array(z3.string()).optional(),
|
|
473
|
+
lastUpdated: z3.string(),
|
|
474
|
+
updatedBy: z3.string()
|
|
475
|
+
});
|
|
476
|
+
function getAiorgDir() {
|
|
477
|
+
return path3.join(os3.homedir(), ".aiorg");
|
|
478
|
+
}
|
|
479
|
+
function getProjectsDir() {
|
|
480
|
+
return path3.join(getAiorgDir(), "projects");
|
|
481
|
+
}
|
|
482
|
+
function getProjectDir(projectName) {
|
|
483
|
+
return path3.join(getProjectsDir(), projectName);
|
|
484
|
+
}
|
|
485
|
+
async function initializeAiorg() {
|
|
486
|
+
const aiorgDir = getAiorgDir();
|
|
487
|
+
const projectsDir = getProjectsDir();
|
|
488
|
+
await fs3.ensureDir(projectsDir);
|
|
489
|
+
const configPath = path3.join(aiorgDir, "config.json");
|
|
490
|
+
if (!await fs3.pathExists(configPath)) {
|
|
491
|
+
await fs3.writeJson(configPath, {
|
|
492
|
+
version: "1.0.0",
|
|
493
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
494
|
+
}, { spaces: 2 });
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
async function listProjects() {
|
|
498
|
+
const projectsDir = getProjectsDir();
|
|
499
|
+
if (!await fs3.pathExists(projectsDir)) {
|
|
500
|
+
return [];
|
|
501
|
+
}
|
|
502
|
+
const entries = await fs3.readdir(projectsDir, { withFileTypes: true });
|
|
503
|
+
return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
|
|
504
|
+
}
|
|
505
|
+
async function createProject(projectName, businessName, kitName) {
|
|
506
|
+
const projectDir = getProjectDir(projectName);
|
|
507
|
+
await initializeAiorg();
|
|
508
|
+
await fs3.ensureDir(projectDir);
|
|
509
|
+
const contextJson = {
|
|
510
|
+
version: "1.0.0",
|
|
511
|
+
business: {
|
|
512
|
+
name: businessName,
|
|
513
|
+
stage: "building"
|
|
514
|
+
},
|
|
515
|
+
validation: {},
|
|
516
|
+
pmf: {
|
|
517
|
+
status: "not-started",
|
|
518
|
+
score: null,
|
|
519
|
+
seanEllisScore: null,
|
|
520
|
+
activationRate: null,
|
|
521
|
+
weeklyRetention: null,
|
|
522
|
+
measuredAt: null
|
|
523
|
+
},
|
|
524
|
+
installedKits: [kitName],
|
|
525
|
+
lastUpdated: (/* @__PURE__ */ new Date()).toISOString(),
|
|
526
|
+
updatedBy: kitName
|
|
527
|
+
};
|
|
528
|
+
await fs3.writeJson(
|
|
529
|
+
path3.join(projectDir, "context.json"),
|
|
530
|
+
contextJson,
|
|
531
|
+
{ spaces: 2 }
|
|
532
|
+
);
|
|
533
|
+
await fs3.writeJson(
|
|
534
|
+
path3.join(projectDir, "learnings.json"),
|
|
535
|
+
{
|
|
536
|
+
version: "1.0.0",
|
|
537
|
+
whatWorks: [],
|
|
538
|
+
whatDoesntWork: []
|
|
539
|
+
},
|
|
540
|
+
{ spaces: 2 }
|
|
541
|
+
);
|
|
542
|
+
}
|
|
543
|
+
async function readAiorgFile(dirPath) {
|
|
544
|
+
const aiorgPath = path3.join(dirPath, ".aiorg");
|
|
545
|
+
if (!await fs3.pathExists(aiorgPath)) {
|
|
546
|
+
return null;
|
|
547
|
+
}
|
|
548
|
+
try {
|
|
549
|
+
const content = await fs3.readJson(aiorgPath);
|
|
550
|
+
return AiorgFileSchema.parse(content);
|
|
551
|
+
} catch {
|
|
552
|
+
return null;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
async function writeAiorgFile(dirPath, projectName) {
|
|
556
|
+
const aiorgPath = path3.join(dirPath, ".aiorg");
|
|
557
|
+
const aiorgFile = {
|
|
558
|
+
project: projectName,
|
|
559
|
+
version: "1.0.0"
|
|
560
|
+
};
|
|
561
|
+
await fs3.writeJson(aiorgPath, aiorgFile, { spaces: 2 });
|
|
562
|
+
}
|
|
563
|
+
async function addKitToProject(projectName, kitName) {
|
|
564
|
+
const contextPath = path3.join(getProjectDir(projectName), "context.json");
|
|
565
|
+
if (!await fs3.pathExists(contextPath)) {
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
try {
|
|
569
|
+
const context = await fs3.readJson(contextPath);
|
|
570
|
+
const installedKits = context.installedKits || [];
|
|
571
|
+
if (!installedKits.includes(kitName)) {
|
|
572
|
+
installedKits.push(kitName);
|
|
573
|
+
context.installedKits = installedKits;
|
|
574
|
+
context.lastUpdated = (/* @__PURE__ */ new Date()).toISOString();
|
|
575
|
+
await fs3.writeJson(contextPath, context, { spaces: 2 });
|
|
576
|
+
}
|
|
577
|
+
} catch {
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
async function readProjectContext(projectName) {
|
|
581
|
+
const contextPath = path3.join(getProjectDir(projectName), "context.json");
|
|
582
|
+
if (!await fs3.pathExists(contextPath)) {
|
|
583
|
+
return null;
|
|
584
|
+
}
|
|
585
|
+
try {
|
|
586
|
+
const content = await fs3.readJson(contextPath);
|
|
587
|
+
return ContextJsonSchema.parse(content);
|
|
588
|
+
} catch {
|
|
589
|
+
return null;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
function suggestProjectName(dirPath) {
|
|
593
|
+
const dirName = path3.basename(dirPath);
|
|
594
|
+
return dirName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
595
|
+
}
|
|
596
|
+
async function setupProject(targetPath, kitName, options = {}) {
|
|
597
|
+
const existingAiorg = await readAiorgFile(targetPath);
|
|
598
|
+
if (existingAiorg) {
|
|
599
|
+
await addKitToProject(existingAiorg.project, kitName);
|
|
600
|
+
if (!options.silent) {
|
|
601
|
+
const context = await readProjectContext(existingAiorg.project);
|
|
602
|
+
if (context) {
|
|
603
|
+
blank();
|
|
604
|
+
info(`Linked to project: ${pc4.cyan(existingAiorg.project)}`);
|
|
605
|
+
if (context.business?.name) {
|
|
606
|
+
log(pc4.dim(` Business: ${context.business.name}`));
|
|
607
|
+
}
|
|
608
|
+
if (context.installedKits && context.installedKits.length > 0) {
|
|
609
|
+
log(pc4.dim(` Installed kits: ${context.installedKits.join(", ")}`));
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
return existingAiorg.project;
|
|
614
|
+
}
|
|
615
|
+
await initializeAiorg();
|
|
616
|
+
const existingProjects = await listProjects();
|
|
617
|
+
let projectName;
|
|
618
|
+
if (existingProjects.length > 0) {
|
|
619
|
+
blank();
|
|
620
|
+
header("Project Setup");
|
|
621
|
+
log(pc4.dim("AI Org kits can share context across a project."));
|
|
622
|
+
blank();
|
|
623
|
+
const projectChoice = await p3.select({
|
|
624
|
+
message: "Link this kit to:",
|
|
625
|
+
options: [
|
|
626
|
+
...existingProjects.map((name) => ({
|
|
627
|
+
value: name,
|
|
628
|
+
label: name,
|
|
629
|
+
hint: "existing project"
|
|
630
|
+
})),
|
|
631
|
+
{
|
|
632
|
+
value: "__new__",
|
|
633
|
+
label: "Create new project",
|
|
634
|
+
hint: "start fresh"
|
|
635
|
+
}
|
|
636
|
+
]
|
|
637
|
+
});
|
|
638
|
+
if (p3.isCancel(projectChoice)) {
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
if (projectChoice === "__new__") {
|
|
642
|
+
const newProjectName = await askForNewProject(targetPath, kitName);
|
|
643
|
+
if (!newProjectName) return null;
|
|
644
|
+
projectName = newProjectName;
|
|
645
|
+
} else {
|
|
646
|
+
projectName = projectChoice;
|
|
647
|
+
await addKitToProject(projectName, kitName);
|
|
648
|
+
}
|
|
649
|
+
} else {
|
|
650
|
+
blank();
|
|
651
|
+
header("Project Setup");
|
|
652
|
+
log(pc4.dim("AI Org kits share context through projects."));
|
|
653
|
+
log(pc4.dim("This helps kits work together and share data."));
|
|
654
|
+
blank();
|
|
655
|
+
const newProjectName = await askForNewProject(targetPath, kitName);
|
|
656
|
+
if (!newProjectName) return null;
|
|
657
|
+
projectName = newProjectName;
|
|
658
|
+
}
|
|
659
|
+
await writeAiorgFile(targetPath, projectName);
|
|
660
|
+
if (!options.silent) {
|
|
661
|
+
blank();
|
|
662
|
+
success(`Project ${pc4.cyan(projectName)} linked`);
|
|
663
|
+
log(pc4.dim(` Context: ~/.aiorg/projects/${projectName}/`));
|
|
664
|
+
}
|
|
665
|
+
return projectName;
|
|
666
|
+
}
|
|
667
|
+
async function askForNewProject(targetPath, kitName) {
|
|
668
|
+
const suggestedName = suggestProjectName(targetPath);
|
|
669
|
+
const projectName = await p3.text({
|
|
670
|
+
message: "Project name:",
|
|
671
|
+
placeholder: suggestedName,
|
|
672
|
+
defaultValue: suggestedName,
|
|
673
|
+
validate: (value) => {
|
|
674
|
+
if (!value) return "Project name is required";
|
|
675
|
+
if (!/^[a-z0-9-]+$/.test(value)) {
|
|
676
|
+
return "Use lowercase letters, numbers, and hyphens only";
|
|
677
|
+
}
|
|
678
|
+
return void 0;
|
|
679
|
+
}
|
|
680
|
+
});
|
|
681
|
+
if (p3.isCancel(projectName)) {
|
|
682
|
+
return null;
|
|
683
|
+
}
|
|
684
|
+
const defaultDisplayName = projectName.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
685
|
+
await createProject(
|
|
686
|
+
projectName,
|
|
687
|
+
defaultDisplayName,
|
|
688
|
+
kitName
|
|
689
|
+
);
|
|
690
|
+
return projectName;
|
|
691
|
+
}
|
|
692
|
+
async function needsProjectMigration(dirPath) {
|
|
693
|
+
const aiorgFile = await readAiorgFile(dirPath);
|
|
694
|
+
if (aiorgFile) {
|
|
695
|
+
return false;
|
|
696
|
+
}
|
|
697
|
+
const hasClaudeDir = await fs3.pathExists(path3.join(dirPath, ".claude"));
|
|
698
|
+
const hasVersionJson = await fs3.pathExists(path3.join(dirPath, ".claude", "version.json"));
|
|
699
|
+
return hasClaudeDir && hasVersionJson;
|
|
700
|
+
}
|
|
701
|
+
async function migrateToProjectSystem(dirPath, kitName) {
|
|
702
|
+
blank();
|
|
703
|
+
info("This kit installation needs to be linked to a project.");
|
|
704
|
+
log(pc4.dim("Projects allow kits to share context and work together."));
|
|
705
|
+
return setupProject(dirPath, kitName);
|
|
706
|
+
}
|
|
707
|
+
|
|
438
708
|
// src/commands/init.ts
|
|
439
709
|
async function init(kitName, targetPath, options) {
|
|
440
|
-
|
|
441
|
-
const resolvedPath = targetPath ?
|
|
710
|
+
p4.intro(pc5.cyan(`aiorg init ${kitName}`));
|
|
711
|
+
const resolvedPath = targetPath ? path4.resolve(targetPath.replace(/^~/, os4.homedir())) : path4.resolve(process.cwd(), kitName);
|
|
442
712
|
if (!options.force && await dirExistsAndNotEmpty(resolvedPath)) {
|
|
443
|
-
error(`Folder already exists: ${
|
|
444
|
-
log(
|
|
713
|
+
error(`Folder already exists: ${pc5.yellow(resolvedPath)}`);
|
|
714
|
+
log(pc5.dim("Use --force to overwrite"));
|
|
445
715
|
process.exit(1);
|
|
446
716
|
}
|
|
447
|
-
const spinner4 =
|
|
717
|
+
const spinner4 = p4.spinner();
|
|
448
718
|
spinner4.start("Fetching version info...");
|
|
449
719
|
let versionInfo;
|
|
450
720
|
try {
|
|
451
721
|
versionInfo = await fetchLatestVersion(kitName);
|
|
452
|
-
spinner4.stop(`Found ${
|
|
722
|
+
spinner4.stop(`Found ${pc5.cyan(versionInfo.packageDisplayName)} v${versionInfo.version}`);
|
|
453
723
|
} catch (error2) {
|
|
454
724
|
spinner4.stop("Failed to fetch version info");
|
|
455
725
|
throw error2;
|
|
@@ -486,14 +756,14 @@ async function init(kitName, targetPath, options) {
|
|
|
486
756
|
let tempDir = null;
|
|
487
757
|
try {
|
|
488
758
|
tempDir = await createTempDir("aiorg-init-");
|
|
489
|
-
const zipPath =
|
|
759
|
+
const zipPath = path4.join(tempDir, "kit.zip");
|
|
490
760
|
const zipData = await downloadFile(downloadInfo.downloadUrl);
|
|
491
761
|
await saveToFile(zipData, zipPath);
|
|
492
762
|
const sizeKB = await getFileSizeKB(zipPath);
|
|
493
763
|
spinner4.stop(`Downloaded ${kitName} v${versionInfo.version} (${sizeKB} KB)`);
|
|
494
764
|
spinner4.start(`Extracting to ${resolvedPath}...`);
|
|
495
765
|
await extractZipToDir(zipPath, resolvedPath);
|
|
496
|
-
spinner4.stop(`Extracted to ${
|
|
766
|
+
spinner4.stop(`Extracted to ${pc5.yellow(resolvedPath)}`);
|
|
497
767
|
await cleanupTempDir(tempDir);
|
|
498
768
|
} catch (error2) {
|
|
499
769
|
if (tempDir) {
|
|
@@ -503,6 +773,7 @@ async function init(kitName, targetPath, options) {
|
|
|
503
773
|
}
|
|
504
774
|
blank();
|
|
505
775
|
success(`${versionInfo.packageDisplayName} v${versionInfo.version} installed!`);
|
|
776
|
+
await setupProject(resolvedPath, kitName);
|
|
506
777
|
blank();
|
|
507
778
|
log("Next steps:");
|
|
508
779
|
listItem(`cd ${resolvedPath}`);
|
|
@@ -511,52 +782,52 @@ async function init(kitName, targetPath, options) {
|
|
|
511
782
|
const outroMessages = {
|
|
512
783
|
"investor-os": "Happy investing!"
|
|
513
784
|
};
|
|
514
|
-
const
|
|
515
|
-
|
|
785
|
+
const outro6 = outroMessages[kitName] || "Happy building!";
|
|
786
|
+
p4.outro(pc5.green(outro6));
|
|
516
787
|
}
|
|
517
788
|
|
|
518
789
|
// src/commands/upgrade.ts
|
|
519
|
-
import * as
|
|
520
|
-
import
|
|
521
|
-
import
|
|
790
|
+
import * as p5 from "@clack/prompts";
|
|
791
|
+
import pc6 from "picocolors";
|
|
792
|
+
import path7 from "path";
|
|
522
793
|
import semver from "semver";
|
|
523
794
|
|
|
524
795
|
// src/lib/detect.ts
|
|
525
|
-
import
|
|
526
|
-
import
|
|
527
|
-
import { z as
|
|
528
|
-
var VersionJsonSchema =
|
|
529
|
-
version:
|
|
530
|
-
packageName:
|
|
531
|
-
packageDisplayName:
|
|
532
|
-
releasedAt:
|
|
533
|
-
minUpgradeFrom:
|
|
534
|
-
fileCategories:
|
|
535
|
-
alwaysReplace:
|
|
536
|
-
neverTouch:
|
|
537
|
-
mergeIfChanged:
|
|
538
|
-
addOnly:
|
|
796
|
+
import fs4 from "fs-extra";
|
|
797
|
+
import path5 from "path";
|
|
798
|
+
import { z as z4 } from "zod";
|
|
799
|
+
var VersionJsonSchema = z4.object({
|
|
800
|
+
version: z4.string(),
|
|
801
|
+
packageName: z4.string(),
|
|
802
|
+
packageDisplayName: z4.string().optional(),
|
|
803
|
+
releasedAt: z4.string().optional(),
|
|
804
|
+
minUpgradeFrom: z4.string().optional(),
|
|
805
|
+
fileCategories: z4.object({
|
|
806
|
+
alwaysReplace: z4.array(z4.string()).optional(),
|
|
807
|
+
neverTouch: z4.array(z4.string()).optional(),
|
|
808
|
+
mergeIfChanged: z4.array(z4.string()).optional(),
|
|
809
|
+
addOnly: z4.array(z4.string()).optional()
|
|
539
810
|
}).optional(),
|
|
540
|
-
changelog:
|
|
811
|
+
changelog: z4.record(z4.string(), z4.any()).optional()
|
|
541
812
|
});
|
|
542
|
-
var KitJsonSchema =
|
|
543
|
-
name:
|
|
544
|
-
displayName:
|
|
545
|
-
type:
|
|
813
|
+
var KitJsonSchema = z4.object({
|
|
814
|
+
name: z4.string(),
|
|
815
|
+
displayName: z4.string().optional(),
|
|
816
|
+
type: z4.enum(["bootstrap", "inject"]).optional()
|
|
546
817
|
});
|
|
547
818
|
async function detectKit(dirPath) {
|
|
548
|
-
const versionJsonPath =
|
|
549
|
-
const kitJsonPath =
|
|
550
|
-
if (!await
|
|
819
|
+
const versionJsonPath = path5.join(dirPath, ".claude", "version.json");
|
|
820
|
+
const kitJsonPath = path5.join(dirPath, ".claude", "kit.json");
|
|
821
|
+
if (!await fs4.pathExists(versionJsonPath)) {
|
|
551
822
|
return null;
|
|
552
823
|
}
|
|
553
824
|
try {
|
|
554
|
-
const versionRaw = await
|
|
825
|
+
const versionRaw = await fs4.readJson(versionJsonPath);
|
|
555
826
|
const versionJson = VersionJsonSchema.parse(versionRaw);
|
|
556
827
|
let kitJson;
|
|
557
|
-
if (await
|
|
828
|
+
if (await fs4.pathExists(kitJsonPath)) {
|
|
558
829
|
try {
|
|
559
|
-
const kitRaw = await
|
|
830
|
+
const kitRaw = await fs4.readJson(kitJsonPath);
|
|
560
831
|
kitJson = KitJsonSchema.parse(kitRaw);
|
|
561
832
|
} catch {
|
|
562
833
|
}
|
|
@@ -578,8 +849,8 @@ async function detectKitInCwd() {
|
|
|
578
849
|
}
|
|
579
850
|
|
|
580
851
|
// src/lib/apply.ts
|
|
581
|
-
import
|
|
582
|
-
import
|
|
852
|
+
import fs5 from "fs-extra";
|
|
853
|
+
import path6 from "path";
|
|
583
854
|
import { glob } from "glob";
|
|
584
855
|
import { minimatch } from "minimatch";
|
|
585
856
|
import { merge } from "lodash-es";
|
|
@@ -617,11 +888,11 @@ async function applyFileCategories(sourceDir, destDir, versionJson) {
|
|
|
617
888
|
processedFiles.add(file);
|
|
618
889
|
continue;
|
|
619
890
|
}
|
|
620
|
-
const srcPath =
|
|
621
|
-
const destPath =
|
|
891
|
+
const srcPath = path6.join(sourceDir, file);
|
|
892
|
+
const destPath = path6.join(destDir, file);
|
|
622
893
|
try {
|
|
623
|
-
await
|
|
624
|
-
await
|
|
894
|
+
await fs5.ensureDir(path6.dirname(destPath));
|
|
895
|
+
await fs5.copy(srcPath, destPath, { overwrite: true });
|
|
625
896
|
result.replaced.push(file);
|
|
626
897
|
processedFiles.add(file);
|
|
627
898
|
} catch (err) {
|
|
@@ -649,21 +920,21 @@ async function applyFileCategories(sourceDir, destDir, versionJson) {
|
|
|
649
920
|
processedFiles.add(file);
|
|
650
921
|
continue;
|
|
651
922
|
}
|
|
652
|
-
const srcPath =
|
|
653
|
-
const destPath =
|
|
923
|
+
const srcPath = path6.join(sourceDir, file);
|
|
924
|
+
const destPath = path6.join(destDir, file);
|
|
654
925
|
try {
|
|
655
|
-
const destExists = await
|
|
926
|
+
const destExists = await fs5.pathExists(destPath);
|
|
656
927
|
if (destExists && file.endsWith(".json")) {
|
|
657
|
-
const incoming = await
|
|
658
|
-
const existing = await
|
|
928
|
+
const incoming = await fs5.readJson(srcPath);
|
|
929
|
+
const existing = await fs5.readJson(destPath);
|
|
659
930
|
const merged = merge({}, incoming, existing);
|
|
660
|
-
await
|
|
931
|
+
await fs5.writeJson(destPath, merged, { spaces: 2 });
|
|
661
932
|
result.merged.push(file);
|
|
662
933
|
} else if (destExists) {
|
|
663
934
|
result.skipped.push(file);
|
|
664
935
|
} else {
|
|
665
|
-
await
|
|
666
|
-
await
|
|
936
|
+
await fs5.ensureDir(path6.dirname(destPath));
|
|
937
|
+
await fs5.copy(srcPath, destPath);
|
|
667
938
|
result.replaced.push(file);
|
|
668
939
|
}
|
|
669
940
|
processedFiles.add(file);
|
|
@@ -692,13 +963,13 @@ async function applyFileCategories(sourceDir, destDir, versionJson) {
|
|
|
692
963
|
processedFiles.add(file);
|
|
693
964
|
continue;
|
|
694
965
|
}
|
|
695
|
-
const srcPath =
|
|
696
|
-
const destPath =
|
|
966
|
+
const srcPath = path6.join(sourceDir, file);
|
|
967
|
+
const destPath = path6.join(destDir, file);
|
|
697
968
|
try {
|
|
698
|
-
const destExists = await
|
|
969
|
+
const destExists = await fs5.pathExists(destPath);
|
|
699
970
|
if (!destExists) {
|
|
700
|
-
await
|
|
701
|
-
await
|
|
971
|
+
await fs5.ensureDir(path6.dirname(destPath));
|
|
972
|
+
await fs5.copy(srcPath, destPath);
|
|
702
973
|
result.added.push(file);
|
|
703
974
|
} else {
|
|
704
975
|
result.skipped.push(file);
|
|
@@ -719,8 +990,8 @@ function matchesPattern(filePath, pattern) {
|
|
|
719
990
|
}
|
|
720
991
|
async function isGitRepo(dirPath) {
|
|
721
992
|
try {
|
|
722
|
-
const gitDir =
|
|
723
|
-
return await
|
|
993
|
+
const gitDir = path6.join(dirPath, ".git");
|
|
994
|
+
return await fs5.pathExists(gitDir);
|
|
724
995
|
} catch {
|
|
725
996
|
return false;
|
|
726
997
|
}
|
|
@@ -748,16 +1019,28 @@ async function createGitBackup(dirPath, message) {
|
|
|
748
1019
|
|
|
749
1020
|
// src/commands/upgrade.ts
|
|
750
1021
|
async function upgrade(options) {
|
|
751
|
-
|
|
1022
|
+
p5.intro(pc6.cyan("aiorg upgrade"));
|
|
752
1023
|
const kit = await detectKitInCwd();
|
|
753
1024
|
if (!kit) {
|
|
754
1025
|
error("Not in a kit directory");
|
|
755
|
-
log(
|
|
1026
|
+
log(pc6.dim("Run this command from a folder with .claude/version.json"));
|
|
756
1027
|
process.exit(1);
|
|
757
1028
|
}
|
|
758
|
-
keyValue("Kit",
|
|
759
|
-
keyValue("Current version",
|
|
760
|
-
|
|
1029
|
+
keyValue("Kit", pc6.magenta(kit.displayName));
|
|
1030
|
+
keyValue("Current version", pc6.cyan(`v${kit.version}`));
|
|
1031
|
+
if (await needsProjectMigration(kit.rootPath)) {
|
|
1032
|
+
const projectName = await migrateToProjectSystem(kit.rootPath, kit.name);
|
|
1033
|
+
if (!projectName) {
|
|
1034
|
+
blank();
|
|
1035
|
+
log(pc6.dim("Skipping project setup. You can run it later."));
|
|
1036
|
+
}
|
|
1037
|
+
} else {
|
|
1038
|
+
const aiorgFile = await readAiorgFile(kit.rootPath);
|
|
1039
|
+
if (aiorgFile) {
|
|
1040
|
+
await addKitToProject(aiorgFile.project, kit.name);
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
const spinner4 = p5.spinner();
|
|
761
1044
|
spinner4.start("Checking for updates...");
|
|
762
1045
|
let latest;
|
|
763
1046
|
try {
|
|
@@ -769,13 +1052,13 @@ async function upgrade(options) {
|
|
|
769
1052
|
}
|
|
770
1053
|
if (!semver.gt(latest.version, kit.version)) {
|
|
771
1054
|
blank();
|
|
772
|
-
success(`Already on latest version (${
|
|
773
|
-
|
|
1055
|
+
success(`Already on latest version (${pc6.cyan(`v${kit.version}`)})`);
|
|
1056
|
+
p5.outro("");
|
|
774
1057
|
return;
|
|
775
1058
|
}
|
|
776
1059
|
blank();
|
|
777
1060
|
log(
|
|
778
|
-
`Update available: ${
|
|
1061
|
+
`Update available: ${pc6.cyan(`v${kit.version}`)} \u2192 ${pc6.green(`v${latest.version}`)}`
|
|
779
1062
|
);
|
|
780
1063
|
if (latest.allVersions && Array.isArray(latest.allVersions)) {
|
|
781
1064
|
const versionsToShow = latest.allVersions.filter((v) => {
|
|
@@ -797,17 +1080,17 @@ async function upgrade(options) {
|
|
|
797
1080
|
if (!entry) continue;
|
|
798
1081
|
const highlights = entry.highlights?.join(", ") || "";
|
|
799
1082
|
blank();
|
|
800
|
-
log(`${
|
|
1083
|
+
log(`${pc6.green(`v${version2}`)}${highlights ? ` - ${pc6.white(highlights)}` : ""}`);
|
|
801
1084
|
if (entry.added && entry.added.length > 0) {
|
|
802
1085
|
for (const item of entry.added.slice(0, 2)) {
|
|
803
|
-
log(
|
|
1086
|
+
log(pc6.dim(` + ${item}`));
|
|
804
1087
|
}
|
|
805
1088
|
if (entry.added.length > 2) {
|
|
806
|
-
log(
|
|
1089
|
+
log(pc6.dim(` + ... and ${entry.added.length - 2} more`));
|
|
807
1090
|
}
|
|
808
1091
|
}
|
|
809
1092
|
if (entry.upgradeNotes && version2 === latest.version) {
|
|
810
|
-
log(
|
|
1093
|
+
log(pc6.yellow(` Note: ${entry.upgradeNotes}`));
|
|
811
1094
|
}
|
|
812
1095
|
}
|
|
813
1096
|
}
|
|
@@ -816,19 +1099,19 @@ async function upgrade(options) {
|
|
|
816
1099
|
log("Your data will be preserved:");
|
|
817
1100
|
const neverTouch = kit.versionJson.fileCategories?.neverTouch ?? [];
|
|
818
1101
|
for (const pattern of neverTouch.slice(0, 5)) {
|
|
819
|
-
listItem(
|
|
1102
|
+
listItem(pc6.dim(pattern));
|
|
820
1103
|
}
|
|
821
1104
|
if (neverTouch.length > 5) {
|
|
822
|
-
log(
|
|
1105
|
+
log(pc6.dim(` ... and ${neverTouch.length - 5} more patterns`));
|
|
823
1106
|
}
|
|
824
1107
|
if (!options.yes) {
|
|
825
1108
|
blank();
|
|
826
|
-
const shouldUpgrade = await
|
|
1109
|
+
const shouldUpgrade = await p5.confirm({
|
|
827
1110
|
message: "Proceed with upgrade?",
|
|
828
1111
|
initialValue: true
|
|
829
1112
|
});
|
|
830
|
-
if (
|
|
831
|
-
|
|
1113
|
+
if (p5.isCancel(shouldUpgrade) || !shouldUpgrade) {
|
|
1114
|
+
p5.cancel("Upgrade cancelled");
|
|
832
1115
|
return;
|
|
833
1116
|
}
|
|
834
1117
|
}
|
|
@@ -857,7 +1140,7 @@ async function upgrade(options) {
|
|
|
857
1140
|
);
|
|
858
1141
|
spinner4.stop(created ? "Git backup created" : "No changes to backup");
|
|
859
1142
|
} else if (!options.yes) {
|
|
860
|
-
const shouldBackup = await
|
|
1143
|
+
const shouldBackup = await p5.confirm({
|
|
861
1144
|
message: "Create git backup commit first?",
|
|
862
1145
|
initialValue: true
|
|
863
1146
|
});
|
|
@@ -888,8 +1171,8 @@ async function upgrade(options) {
|
|
|
888
1171
|
let tempDir = null;
|
|
889
1172
|
try {
|
|
890
1173
|
tempDir = await createTempDir("aiorg-upgrade-");
|
|
891
|
-
const zipPath =
|
|
892
|
-
const extractPath =
|
|
1174
|
+
const zipPath = path7.join(tempDir, "kit.zip");
|
|
1175
|
+
const extractPath = path7.join(tempDir, "extracted");
|
|
893
1176
|
const zipData = await downloadFile(downloadInfo.downloadUrl);
|
|
894
1177
|
await saveToFile(zipData, zipPath);
|
|
895
1178
|
const sizeKB = await getFileSizeKB(zipPath);
|
|
@@ -910,7 +1193,7 @@ async function upgrade(options) {
|
|
|
910
1193
|
spinner4.stop("Updates applied");
|
|
911
1194
|
blank();
|
|
912
1195
|
success(
|
|
913
|
-
`Upgraded ${kit.displayName}: ${
|
|
1196
|
+
`Upgraded ${kit.displayName}: ${pc6.cyan(`v${kit.version}`)} \u2192 ${pc6.green(`v${latest.version}`)}`
|
|
914
1197
|
);
|
|
915
1198
|
blank();
|
|
916
1199
|
keyValue("Files updated", String(result.replaced.length));
|
|
@@ -925,7 +1208,7 @@ async function upgrade(options) {
|
|
|
925
1208
|
blank();
|
|
926
1209
|
warn(`${result.errors.length} errors occurred:`);
|
|
927
1210
|
for (const err of result.errors) {
|
|
928
|
-
listItem(
|
|
1211
|
+
listItem(pc6.dim(err));
|
|
929
1212
|
}
|
|
930
1213
|
}
|
|
931
1214
|
await cleanupTempDir(tempDir);
|
|
@@ -936,46 +1219,46 @@ async function upgrade(options) {
|
|
|
936
1219
|
throw error2;
|
|
937
1220
|
}
|
|
938
1221
|
blank();
|
|
939
|
-
log(
|
|
940
|
-
log(
|
|
941
|
-
|
|
1222
|
+
log(pc6.yellow("\u26A0\uFE0F Restart Claude Code to use new commands"));
|
|
1223
|
+
log(pc6.dim(' Type "exit" then start a new session'));
|
|
1224
|
+
p5.outro(pc6.green("Upgrade complete!"));
|
|
942
1225
|
}
|
|
943
1226
|
|
|
944
1227
|
// src/commands/version.ts
|
|
945
|
-
import
|
|
1228
|
+
import pc7 from "picocolors";
|
|
946
1229
|
import semver2 from "semver";
|
|
947
1230
|
var CLI_VERSION = "1.0.0";
|
|
948
1231
|
async function version() {
|
|
949
1232
|
header("aiorg version");
|
|
950
|
-
keyValue("CLI",
|
|
1233
|
+
keyValue("CLI", pc7.cyan(`v${CLI_VERSION}`));
|
|
951
1234
|
const kit = await detectKitInCwd();
|
|
952
1235
|
if (!kit) {
|
|
953
1236
|
blank();
|
|
954
1237
|
info("No kit detected in current directory");
|
|
955
|
-
log(
|
|
1238
|
+
log(pc7.dim("Run this command from a folder containing a kit"));
|
|
956
1239
|
return;
|
|
957
1240
|
}
|
|
958
|
-
keyValue(kit.displayName,
|
|
1241
|
+
keyValue(kit.displayName, pc7.cyan(`v${kit.version}`));
|
|
959
1242
|
try {
|
|
960
1243
|
const latest = await fetchLatestVersion(kit.name);
|
|
961
1244
|
if (semver2.gt(latest.version, kit.version)) {
|
|
962
1245
|
blank();
|
|
963
1246
|
warn(
|
|
964
|
-
`Update available: ${
|
|
1247
|
+
`Update available: ${pc7.cyan(`v${kit.version}`)} \u2192 ${pc7.green(`v${latest.version}`)}`
|
|
965
1248
|
);
|
|
966
|
-
log(
|
|
1249
|
+
log(pc7.dim("Run 'aiorg upgrade' to update"));
|
|
967
1250
|
} else {
|
|
968
1251
|
blank();
|
|
969
1252
|
success("You are on the latest version");
|
|
970
1253
|
}
|
|
971
1254
|
} catch {
|
|
972
1255
|
blank();
|
|
973
|
-
log(
|
|
1256
|
+
log(pc7.dim("Could not check for updates"));
|
|
974
1257
|
}
|
|
975
1258
|
}
|
|
976
1259
|
|
|
977
1260
|
// src/commands/list.ts
|
|
978
|
-
import
|
|
1261
|
+
import pc8 from "picocolors";
|
|
979
1262
|
function formatPrice(cents) {
|
|
980
1263
|
if (cents === 0) return "";
|
|
981
1264
|
return `$${(cents / 100).toFixed(0)}`;
|
|
@@ -989,44 +1272,137 @@ async function list() {
|
|
|
989
1272
|
const freeKits = kits.filter((k) => k.tier === "free");
|
|
990
1273
|
const paidKits = kits.filter((k) => k.tier === "paid");
|
|
991
1274
|
blank();
|
|
992
|
-
console.log(
|
|
1275
|
+
console.log(pc8.bold("Available Kits"));
|
|
993
1276
|
blank();
|
|
994
1277
|
if (freeKits.length > 0) {
|
|
995
|
-
console.log(
|
|
1278
|
+
console.log(pc8.green(pc8.bold("FREE")));
|
|
996
1279
|
blank();
|
|
997
1280
|
for (const kit of freeKits) {
|
|
998
1281
|
printKit(kit);
|
|
999
1282
|
}
|
|
1000
1283
|
}
|
|
1001
1284
|
if (paidKits.length > 0) {
|
|
1002
|
-
console.log(
|
|
1285
|
+
console.log(pc8.yellow(pc8.bold("PAID")));
|
|
1003
1286
|
blank();
|
|
1004
1287
|
for (const kit of paidKits) {
|
|
1005
1288
|
printKit(kit);
|
|
1006
1289
|
}
|
|
1007
1290
|
}
|
|
1008
|
-
console.log(
|
|
1291
|
+
console.log(pc8.dim("\u2500".repeat(50)));
|
|
1009
1292
|
blank();
|
|
1010
|
-
console.log(
|
|
1011
|
-
console.log(
|
|
1012
|
-
console.log(
|
|
1293
|
+
console.log(pc8.dim("Free kits work without login."));
|
|
1294
|
+
console.log(pc8.dim(`Run '${pc8.cyan("aiorg login")}' first for paid kits.`));
|
|
1295
|
+
console.log(pc8.dim(`Visit ${pc8.cyan("https://aiorg.dev")} for details.`));
|
|
1013
1296
|
blank();
|
|
1014
1297
|
}
|
|
1015
1298
|
function printKit(kit) {
|
|
1016
1299
|
const price = formatPrice(kit.priceCents);
|
|
1017
|
-
const priceStr = price ?
|
|
1300
|
+
const priceStr = price ? pc8.yellow(price) : "";
|
|
1018
1301
|
console.log(
|
|
1019
|
-
` ${
|
|
1302
|
+
` ${pc8.bold(kit.name.padEnd(24))} ${pc8.cyan(`v${kit.version}`)} ${priceStr}`
|
|
1020
1303
|
);
|
|
1021
1304
|
if (kit.description) {
|
|
1022
|
-
console.log(` ${
|
|
1305
|
+
console.log(` ${pc8.dim(kit.description)}`);
|
|
1023
1306
|
}
|
|
1024
1307
|
console.log(
|
|
1025
|
-
` ${
|
|
1308
|
+
` ${pc8.dim("\u2192")} ${pc8.dim("npx @aiorg/cli init")} ${pc8.magenta(kit.name)} ${pc8.dim("~/my-project")}`
|
|
1026
1309
|
);
|
|
1027
1310
|
blank();
|
|
1028
1311
|
}
|
|
1029
1312
|
|
|
1313
|
+
// src/commands/status.ts
|
|
1314
|
+
import * as p6 from "@clack/prompts";
|
|
1315
|
+
import pc9 from "picocolors";
|
|
1316
|
+
async function status() {
|
|
1317
|
+
p6.intro(pc9.cyan("aiorg status"));
|
|
1318
|
+
const kit = await detectKitInCwd();
|
|
1319
|
+
const aiorgFile = await readAiorgFile(process.cwd());
|
|
1320
|
+
if (!kit && !aiorgFile) {
|
|
1321
|
+
const projects = await listProjects();
|
|
1322
|
+
if (projects.length === 0) {
|
|
1323
|
+
info("No AI Org projects found");
|
|
1324
|
+
blank();
|
|
1325
|
+
log(pc9.dim("Get started with:"));
|
|
1326
|
+
listItem("npx @aiorg/cli init <kit-name> <path>");
|
|
1327
|
+
p6.outro("");
|
|
1328
|
+
return;
|
|
1329
|
+
}
|
|
1330
|
+
header("Your Projects");
|
|
1331
|
+
for (const projectName of projects) {
|
|
1332
|
+
const context = await readProjectContext(projectName);
|
|
1333
|
+
if (context) {
|
|
1334
|
+
blank();
|
|
1335
|
+
log(pc9.cyan(projectName));
|
|
1336
|
+
if (context.business?.name) {
|
|
1337
|
+
log(pc9.dim(` Business: ${context.business.name}`));
|
|
1338
|
+
}
|
|
1339
|
+
if (context.business?.stage) {
|
|
1340
|
+
log(pc9.dim(` Stage: ${context.business.stage}`));
|
|
1341
|
+
}
|
|
1342
|
+
if (context.installedKits && context.installedKits.length > 0) {
|
|
1343
|
+
log(pc9.dim(` Kits: ${context.installedKits.join(", ")}`));
|
|
1344
|
+
}
|
|
1345
|
+
if (context.pmf?.status && context.pmf.status !== "not-started") {
|
|
1346
|
+
log(pc9.dim(` PMF: ${context.pmf.status}`));
|
|
1347
|
+
}
|
|
1348
|
+
} else {
|
|
1349
|
+
blank();
|
|
1350
|
+
log(pc9.cyan(projectName));
|
|
1351
|
+
log(pc9.dim(" (no context)"));
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
blank();
|
|
1355
|
+
log(pc9.dim(`Projects stored in: ~/.aiorg/projects/`));
|
|
1356
|
+
p6.outro("");
|
|
1357
|
+
return;
|
|
1358
|
+
}
|
|
1359
|
+
if (kit) {
|
|
1360
|
+
keyValue("Kit", pc9.magenta(kit.displayName));
|
|
1361
|
+
keyValue("Version", pc9.cyan(`v${kit.version}`));
|
|
1362
|
+
}
|
|
1363
|
+
if (aiorgFile) {
|
|
1364
|
+
keyValue("Project", pc9.cyan(aiorgFile.project));
|
|
1365
|
+
const context = await readProjectContext(aiorgFile.project);
|
|
1366
|
+
if (context) {
|
|
1367
|
+
blank();
|
|
1368
|
+
header("Project Context");
|
|
1369
|
+
if (context.business?.name) {
|
|
1370
|
+
keyValue("Business", context.business.name);
|
|
1371
|
+
}
|
|
1372
|
+
if (context.business?.stage) {
|
|
1373
|
+
keyValue("Stage", context.business.stage);
|
|
1374
|
+
}
|
|
1375
|
+
if (context.validation?.ideaValidated) {
|
|
1376
|
+
keyValue("Idea Validated", pc9.green("Yes"));
|
|
1377
|
+
if (context.validation.ideaScore) {
|
|
1378
|
+
keyValue("Idea Score", `${context.validation.ideaScore}/100`);
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
if (context.pmf?.status && context.pmf.status !== "not-started") {
|
|
1382
|
+
const pmfColor = context.pmf.status === "achieved" ? pc9.green : pc9.yellow;
|
|
1383
|
+
keyValue("PMF Status", pmfColor(context.pmf.status));
|
|
1384
|
+
if (context.pmf.score !== null && context.pmf.score !== void 0) {
|
|
1385
|
+
keyValue("PMF Score", `${context.pmf.score}/100`);
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
if (context.installedKits && context.installedKits.length > 0) {
|
|
1389
|
+
blank();
|
|
1390
|
+
log(pc9.dim("Installed kits:"));
|
|
1391
|
+
for (const kitName of context.installedKits) {
|
|
1392
|
+
listItem(kitName);
|
|
1393
|
+
}
|
|
1394
|
+
}
|
|
1395
|
+
blank();
|
|
1396
|
+
log(pc9.dim(`Context: ~/.aiorg/projects/${aiorgFile.project}/`));
|
|
1397
|
+
}
|
|
1398
|
+
} else if (kit) {
|
|
1399
|
+
blank();
|
|
1400
|
+
warn("Not linked to a project");
|
|
1401
|
+
log(pc9.dim("Run upgrade to set up project linking"));
|
|
1402
|
+
}
|
|
1403
|
+
p6.outro("");
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1030
1406
|
// src/index.ts
|
|
1031
1407
|
var cli = cac("aiorg");
|
|
1032
1408
|
cli.command("login", "Save your license key").action(async () => {
|
|
@@ -1045,9 +1421,9 @@ cli.command("logout", "Remove saved license key").action(async () => {
|
|
|
1045
1421
|
process.exit(1);
|
|
1046
1422
|
}
|
|
1047
1423
|
});
|
|
1048
|
-
cli.command("init <kit> [path]", "Download and extract a kit").option("--force", "Overwrite existing folder").action(async (kit,
|
|
1424
|
+
cli.command("init <kit> [path]", "Download and extract a kit").option("--force", "Overwrite existing folder").action(async (kit, path8, options) => {
|
|
1049
1425
|
try {
|
|
1050
|
-
await init(kit,
|
|
1426
|
+
await init(kit, path8, options);
|
|
1051
1427
|
} catch (error2) {
|
|
1052
1428
|
error(error2 instanceof Error ? error2.message : "Init failed");
|
|
1053
1429
|
process.exit(1);
|
|
@@ -1077,6 +1453,14 @@ cli.command("version", "Show CLI and kit versions").action(async () => {
|
|
|
1077
1453
|
process.exit(1);
|
|
1078
1454
|
}
|
|
1079
1455
|
});
|
|
1456
|
+
cli.command("status", "Show project and kit status").action(async () => {
|
|
1457
|
+
try {
|
|
1458
|
+
await status();
|
|
1459
|
+
} catch (error2) {
|
|
1460
|
+
error(error2 instanceof Error ? error2.message : "Status check failed");
|
|
1461
|
+
process.exit(1);
|
|
1462
|
+
}
|
|
1463
|
+
});
|
|
1080
1464
|
cli.help();
|
|
1081
1465
|
cli.version("1.0.0");
|
|
1082
1466
|
cli.parse();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/lib/api.ts","../src/lib/auth.ts","../src/utils/logger.ts","../src/commands/logout.ts","../src/commands/init.ts","../src/lib/extract.ts","../src/commands/upgrade.ts","../src/lib/detect.ts","../src/lib/apply.ts","../src/commands/version.ts","../src/commands/list.ts"],"sourcesContent":["import cac from 'cac'\nimport { login } from './commands/login.js'\nimport { logout } from './commands/logout.js'\nimport { init } from './commands/init.js'\nimport { upgrade } from './commands/upgrade.js'\nimport { version } from './commands/version.js'\nimport { list } from './commands/list.js'\nimport * as logger from './utils/logger.js'\n\nconst cli = cac('aiorg')\n\n// Login command\ncli\n .command('login', 'Save your license key')\n .action(async () => {\n try {\n await login()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Login failed')\n process.exit(1)\n }\n })\n\n// Logout command\ncli\n .command('logout', 'Remove saved license key')\n .action(async () => {\n try {\n await logout()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Logout failed')\n process.exit(1)\n }\n })\n\n// Init command\ncli\n .command('init <kit> [path]', 'Download and extract a kit')\n .option('--force', 'Overwrite existing folder')\n .action(async (kit: string, path: string | undefined, options: { force?: boolean }) => {\n try {\n await init(kit, path, options)\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Init failed')\n process.exit(1)\n }\n })\n\n// Upgrade command\ncli\n .command('upgrade', 'Upgrade kit in current directory')\n .option('--yes, -y', 'Skip confirmation')\n .option('--backup', 'Always create git backup')\n .action(async (options: { yes?: boolean; backup?: boolean }) => {\n try {\n await upgrade(options)\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Upgrade failed')\n process.exit(1)\n }\n })\n\n// List command\ncli\n .command('list', 'Show available kits')\n .alias('ls')\n .action(async () => {\n try {\n await list()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Failed to list kits')\n process.exit(1)\n }\n })\n\n// Version command\ncli\n .command('version', 'Show CLI and kit versions')\n .action(async () => {\n try {\n await version()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Version check failed')\n process.exit(1)\n }\n })\n\n// Global options\ncli.help()\ncli.version('1.0.0')\n\n// Parse and run\ncli.parse()\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport { verifyLicense } from '../lib/api.js'\nimport { saveLicenseKey, isLoggedIn, loadConfig } from '../lib/auth.js'\nimport * as logger from '../utils/logger.js'\n\nexport async function login(): Promise<void> {\n p.intro(pc.cyan('aiorg login'))\n\n // Check if already logged in\n if (await isLoggedIn()) {\n const config = await loadConfig()\n const shouldContinue = await p.confirm({\n message: `Already logged in${config?.email ? ` as ${pc.cyan(config.email)}` : ''}. Replace license key?`,\n initialValue: false,\n })\n\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.outro('Login cancelled')\n return\n }\n }\n\n // Get license key\n const licenseKey = await p.text({\n message: 'Enter your license key',\n placeholder: 'ak_live_xxxxx',\n validate: (value) => {\n if (!value) return 'License key is required'\n if (!value.startsWith('ak_')) return 'License key should start with \"ak_\"'\n return undefined\n },\n })\n\n if (p.isCancel(licenseKey)) {\n p.cancel('Login cancelled')\n process.exit(0)\n }\n\n // Verify with API\n const spinner = p.spinner()\n spinner.start('Verifying license...')\n\n try {\n const result = await verifyLicense(licenseKey)\n\n if (!result.valid) {\n spinner.stop('License verification failed')\n logger.error(result.error || 'Invalid license key')\n process.exit(1)\n }\n\n // Save to config\n const kitsRecord: Record<string, { tier: 'free' | 'paid'; purchasedAt: string }> = {}\n if (result.kits) {\n for (const kit of result.kits) {\n kitsRecord[kit.name] = {\n tier: kit.tier,\n purchasedAt: kit.purchasedAt,\n }\n }\n }\n\n await saveLicenseKey(licenseKey, result.email, kitsRecord)\n spinner.stop('License verified')\n\n // Show success\n logger.blank()\n logger.success(`Logged in${result.email ? ` as ${pc.cyan(result.email)}` : ''}`)\n\n if (result.kits && result.kits.length > 0) {\n logger.blank()\n logger.log('Licensed kits:')\n for (const kit of result.kits) {\n logger.listItem(`${kit.name} (${kit.tier})`)\n }\n }\n\n p.outro('Ready to use aiorg kits!')\n } catch (error) {\n spinner.stop('License verification failed')\n throw error\n }\n}\n","import { z } from 'zod'\n\nconst API_BASE_URL = process.env.AIORG_API_URL?.trim() || 'https://aiorg.dev'\nconst API_TIMEOUT_MS = 30000 // 30 seconds\n\n/**\n * Fetch with timeout support\n */\nasync function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeoutMs: number = API_TIMEOUT_MS\n): Promise<Response> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n return response\n } finally {\n clearTimeout(timeout)\n }\n}\n\n// Response schemas\nconst LatestVersionSchema = z.object({\n version: z.string(),\n releasedAt: z.string(),\n packageName: z.string(),\n packageDisplayName: z.string(),\n changelog: z.record(z.string(), z.any()).optional(),\n allVersions: z\n .array(\n z.object({\n version: z.string(),\n changelog: z.record(z.string(), z.any()).optional(),\n releasedAt: z.string().optional(),\n })\n )\n .optional(),\n tier: z.enum(['free', 'paid', 'private']).optional(),\n type: z.enum(['template', 'companion', 'inject']).optional(),\n})\n\nconst DownloadResponseSchema = z.object({\n downloadUrl: z.string(),\n version: z.string(),\n filename: z.string(),\n})\n\nconst VerifyLicenseResponseSchema = z.object({\n valid: z.boolean(),\n email: z.string().optional(),\n kits: z\n .array(\n z.object({\n name: z.string(),\n tier: z.enum(['free', 'paid', 'private']),\n purchasedAt: z.string(),\n })\n )\n .optional(),\n error: z.string().optional(),\n})\n\nconst ListKitsSchema = z.object({\n kits: z.array(z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string().nullable(),\n tier: z.enum(['free', 'paid', 'private']),\n type: z.enum(['template', 'companion', 'inject']),\n deployMode: z.string().nullable(),\n version: z.string(),\n priceCents: z.number(),\n }))\n})\n\nexport type LatestVersion = z.infer<typeof LatestVersionSchema>\nexport type DownloadResponse = z.infer<typeof DownloadResponseSchema>\nexport type VerifyLicenseResponse = z.infer<typeof VerifyLicenseResponseSchema>\nexport type ListKitsResponse = z.infer<typeof ListKitsSchema>\n\nclass APIError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message)\n this.name = 'APIError'\n }\n}\n\n/**\n * Fetch latest version info for a kit\n */\nexport async function fetchLatestVersion(\n kitName: string\n): Promise<LatestVersion> {\n const url = `${API_BASE_URL}/api/kits/${kitName}/latest`\n\n try {\n const response = await fetchWithTimeout(url)\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new APIError(`Kit not found: \"${kitName}\"`, 404)\n }\n throw new APIError(`Failed to fetch version info`, response.status)\n }\n\n const data = await response.json()\n return LatestVersionSchema.parse(data)\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Request timed out')\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * Get download URL for a kit (license key optional for free kits)\n */\nexport async function getDownloadUrl(\n kitName: string,\n licenseKey: string | null\n): Promise<DownloadResponse> {\n const url = `${API_BASE_URL}/api/kits/${kitName}/download`\n\n const headers: Record<string, string> = {}\n if (licenseKey) {\n headers.Authorization = `Bearer ${licenseKey}`\n }\n\n try {\n const response = await fetchWithTimeout(url, { headers })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new APIError('Invalid or expired license key', 401)\n }\n if (response.status === 403) {\n throw new APIError(\n 'License key does not have access to this kit',\n 403\n )\n }\n if (response.status === 404) {\n throw new APIError(`Kit not found: \"${kitName}\"`, 404)\n }\n throw new APIError(`Failed to get download URL`, response.status)\n }\n\n const data = await response.json()\n return DownloadResponseSchema.parse(data)\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Request timed out')\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * Verify a license key with the API\n */\nexport async function verifyLicense(\n licenseKey: string,\n kitName?: string\n): Promise<VerifyLicenseResponse> {\n const url = `${API_BASE_URL}/api/licenses/verify`\n\n try {\n const response = await fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n key: licenseKey,\n kit: kitName,\n }),\n })\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({})) as { error?: string }\n throw new APIError(\n data.error || 'License verification failed',\n response.status\n )\n }\n\n const data = await response.json()\n return VerifyLicenseResponseSchema.parse(data)\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Request timed out')\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * Download a file from a URL\n */\nexport async function downloadFile(url: string): Promise<ArrayBuffer> {\n const DOWNLOAD_TIMEOUT_MS = 120000 // 2 minutes for file downloads\n\n try {\n const response = await fetchWithTimeout(url, {}, DOWNLOAD_TIMEOUT_MS)\n\n if (!response.ok) {\n throw new APIError(`Download failed`, response.status)\n }\n\n return await response.arrayBuffer()\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Download timed out')\n }\n throw new APIError(\n `Download failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * Fetch list of all available kits\n */\nexport async function fetchKitsList(): Promise<ListKitsResponse> {\n const url = `${API_BASE_URL}/api/kits`\n\n try {\n const response = await fetchWithTimeout(url)\n\n if (!response.ok) {\n throw new APIError('Failed to fetch kits list', response.status)\n }\n\n const data = await response.json()\n return ListKitsSchema.parse(data)\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Request timed out')\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n","import fs from 'fs-extra'\nimport path from 'path'\nimport os from 'os'\nimport { z } from 'zod'\n\nconst CONFIG_DIR = path.join(os.homedir(), '.aiorg')\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json')\n\nconst KitLicenseSchema = z.object({\n tier: z.enum(['free', 'paid', 'private']),\n purchasedAt: z.string(),\n})\n\nconst ConfigSchema = z.object({\n licenseKey: z.string(),\n email: z.string().optional(),\n kits: z.record(z.string(), KitLicenseSchema).optional(),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\nexport type KitLicense = z.infer<typeof KitLicenseSchema>\n\n/**\n * Get the config directory path\n */\nexport function getConfigDir(): string {\n return CONFIG_DIR\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigFile(): string {\n return CONFIG_FILE\n}\n\n/**\n * Ensure config directory exists\n */\nexport async function ensureConfigDir(): Promise<void> {\n await fs.ensureDir(CONFIG_DIR)\n}\n\n/**\n * Check if user is logged in (has config file with license key)\n */\nexport async function isLoggedIn(): Promise<boolean> {\n try {\n const config = await loadConfig()\n return !!config?.licenseKey\n } catch {\n return false\n }\n}\n\n/**\n * Load config from disk\n */\nexport async function loadConfig(): Promise<Config | null> {\n try {\n if (!(await fs.pathExists(CONFIG_FILE))) {\n return null\n }\n const raw = await fs.readJson(CONFIG_FILE)\n return ConfigSchema.parse(raw)\n } catch {\n return null\n }\n}\n\n/**\n * Save config to disk\n */\nexport async function saveConfig(config: Config): Promise<void> {\n await ensureConfigDir()\n await fs.writeJson(CONFIG_FILE, config, { spaces: 2 })\n}\n\n/**\n * Get license key from config or environment\n */\nexport async function getLicenseKey(): Promise<string | null> {\n // Check environment first\n const envKey = process.env.AIORG_LICENSE_KEY\n if (envKey) {\n return envKey\n }\n\n // Check config file\n const config = await loadConfig()\n return config?.licenseKey ?? null\n}\n\n/**\n * Save license key to config\n */\nexport async function saveLicenseKey(\n licenseKey: string,\n email?: string,\n kits?: Record<string, KitLicense>\n): Promise<void> {\n const existing = await loadConfig()\n await saveConfig({\n ...(existing || {}),\n licenseKey,\n email: email ?? existing?.email,\n kits: kits ?? existing?.kits,\n })\n}\n\n/**\n * Clear config (logout)\n */\nexport async function clearConfig(): Promise<void> {\n try {\n await fs.remove(CONFIG_FILE)\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Add kit to user's licensed kits\n */\nexport async function addLicensedKit(\n kitName: string,\n tier: 'free' | 'paid' | 'private' = 'paid'\n): Promise<void> {\n const config = await loadConfig()\n if (!config) {\n throw new Error('Not logged in')\n }\n\n const kits = config.kits ?? {}\n kits[kitName] = {\n tier,\n purchasedAt: new Date().toISOString().split('T')[0],\n }\n\n await saveConfig({ ...config, kits })\n}\n","import pc from 'picocolors'\n\n/**\n * Log a success message\n */\nexport function success(message: string): void {\n console.log(pc.green('✓'), message)\n}\n\n/**\n * Log an error message\n */\nexport function error(message: string): void {\n console.log(pc.red('✗'), message)\n}\n\n/**\n * Log a warning message\n */\nexport function warn(message: string): void {\n console.log(pc.yellow('!'), message)\n}\n\n/**\n * Log an info message\n */\nexport function info(message: string): void {\n console.log(pc.blue('ℹ'), message)\n}\n\n/**\n * Log a plain message\n */\nexport function log(message: string): void {\n console.log(message)\n}\n\n/**\n * Log a blank line\n */\nexport function blank(): void {\n console.log()\n}\n\n/**\n * Log a header\n */\nexport function header(title: string): void {\n console.log()\n console.log(pc.bold(title))\n console.log(pc.dim('─'.repeat(40)))\n}\n\n/**\n * Log a key-value pair\n */\nexport function keyValue(key: string, value: string): void {\n console.log(`${pc.dim(key + ':')} ${value}`)\n}\n\n/**\n * Log a list item\n */\nexport function listItem(item: string, indent: number = 0): void {\n const prefix = ' '.repeat(indent)\n console.log(`${prefix}${pc.dim('•')} ${item}`)\n}\n\n/**\n * Format a version for display\n */\nexport function formatVersion(version: string): string {\n return pc.cyan(`v${version}`)\n}\n\n/**\n * Format a kit name for display\n */\nexport function formatKit(name: string): string {\n return pc.magenta(name)\n}\n\n/**\n * Format a path for display\n */\nexport function formatPath(path: string): string {\n return pc.yellow(path)\n}\n\n/**\n * Format a command for display\n */\nexport function formatCommand(cmd: string): string {\n return pc.cyan(cmd)\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport { clearConfig, isLoggedIn, loadConfig } from '../lib/auth.js'\nimport * as logger from '../utils/logger.js'\n\nexport async function logout(): Promise<void> {\n p.intro(pc.cyan('aiorg logout'))\n\n // Check if logged in\n if (!(await isLoggedIn())) {\n logger.info('Not currently logged in')\n p.outro('')\n return\n }\n\n const config = await loadConfig()\n const email = config?.email\n\n // Confirm\n const shouldLogout = await p.confirm({\n message: `Log out${email ? ` from ${pc.cyan(email)}` : ''}?`,\n initialValue: true,\n })\n\n if (p.isCancel(shouldLogout) || !shouldLogout) {\n p.cancel('Logout cancelled')\n return\n }\n\n // Clear config\n await clearConfig()\n\n logger.success('Logged out')\n p.outro('')\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport path from 'path'\nimport os from 'os'\nimport { getLicenseKey, isLoggedIn } from '../lib/auth.js'\nimport { fetchLatestVersion, getDownloadUrl, downloadFile } from '../lib/api.js'\nimport {\n createTempDir,\n saveToFile,\n extractZipToDir,\n cleanupTempDir,\n dirExistsAndNotEmpty,\n getFileSizeKB,\n} from '../lib/extract.js'\nimport * as logger from '../utils/logger.js'\nimport { login } from './login.js'\n\ninterface InitOptions {\n force?: boolean\n}\n\nexport async function init(\n kitName: string,\n targetPath: string | undefined,\n options: InitOptions\n): Promise<void> {\n p.intro(pc.cyan(`aiorg init ${kitName}`))\n\n // Resolve target path\n const resolvedPath = targetPath\n ? path.resolve(targetPath.replace(/^~/, os.homedir()))\n : path.resolve(process.cwd(), kitName)\n\n // Check if target exists\n if (!options.force && (await dirExistsAndNotEmpty(resolvedPath))) {\n logger.error(`Folder already exists: ${pc.yellow(resolvedPath)}`)\n logger.log(pc.dim('Use --force to overwrite'))\n process.exit(1)\n }\n\n // Fetch latest version info first (to check tier)\n const spinner = p.spinner()\n spinner.start('Fetching version info...')\n\n let versionInfo\n try {\n versionInfo = await fetchLatestVersion(kitName)\n spinner.stop(`Found ${pc.cyan(versionInfo.packageDisplayName)} v${versionInfo.version}`)\n } catch (error) {\n spinner.stop('Failed to fetch version info')\n throw error\n }\n\n const isFreeKit = versionInfo.tier === 'free'\n let licenseKey: string | null = null\n\n // Only require login for paid kits\n if (!isFreeKit) {\n if (!(await isLoggedIn())) {\n logger.info('Not logged in. Please log in first.')\n logger.blank()\n await login()\n logger.blank()\n }\n\n licenseKey = await getLicenseKey()\n if (!licenseKey) {\n logger.error('No license key found. Run \"aiorg login\" first.')\n process.exit(1)\n }\n }\n\n // Get download URL\n if (isFreeKit) {\n spinner.start('Getting download URL...')\n } else {\n spinner.start('Verifying license...')\n }\n\n let downloadInfo\n try {\n downloadInfo = await getDownloadUrl(kitName, licenseKey)\n spinner.stop(isFreeKit ? 'Ready to download' : 'License verified')\n } catch (error) {\n spinner.stop(isFreeKit ? 'Failed to get download URL' : 'License verification failed')\n throw error\n }\n\n // Download ZIP\n spinner.start(`Downloading ${kitName} v${versionInfo.version}...`)\n\n let tempDir: string | null = null\n try {\n tempDir = await createTempDir('aiorg-init-')\n const zipPath = path.join(tempDir, 'kit.zip')\n\n const zipData = await downloadFile(downloadInfo.downloadUrl)\n await saveToFile(zipData, zipPath)\n\n const sizeKB = await getFileSizeKB(zipPath)\n spinner.stop(`Downloaded ${kitName} v${versionInfo.version} (${sizeKB} KB)`)\n\n // Extract to target\n spinner.start(`Extracting to ${resolvedPath}...`)\n await extractZipToDir(zipPath, resolvedPath)\n spinner.stop(`Extracted to ${pc.yellow(resolvedPath)}`)\n\n // Cleanup\n await cleanupTempDir(tempDir)\n } catch (error) {\n if (tempDir) {\n await cleanupTempDir(tempDir)\n }\n throw error\n }\n\n // Success message\n logger.blank()\n logger.success(`${versionInfo.packageDisplayName} v${versionInfo.version} installed!`)\n logger.blank()\n logger.log('Next steps:')\n logger.listItem(`cd ${resolvedPath}`)\n logger.listItem('claude')\n logger.listItem('/setup')\n\n // Kit-specific outro messages\n const outroMessages: Record<string, string> = {\n 'investor-os': 'Happy investing!',\n }\n const outro = outroMessages[kitName] || 'Happy building!'\n p.outro(pc.green(outro))\n}\n","import extractZip from 'extract-zip'\nimport fs from 'fs-extra'\nimport path from 'path'\nimport os from 'os'\n\n/**\n * Create a temporary directory for downloads\n */\nexport async function createTempDir(prefix: string = 'aiorg-'): Promise<string> {\n const tempDir = path.join(os.tmpdir(), `${prefix}${Date.now()}`)\n await fs.ensureDir(tempDir)\n return tempDir\n}\n\n/**\n * Save buffer to a file\n */\nexport async function saveToFile(\n data: ArrayBuffer,\n filePath: string\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, Buffer.from(data))\n}\n\n/**\n * Extract ZIP file to a directory\n */\nexport async function extractZipToDir(\n zipPath: string,\n destPath: string\n): Promise<void> {\n await fs.ensureDir(destPath)\n await extractZip(zipPath, { dir: destPath })\n}\n\n/**\n * Clean up temporary directory\n */\nexport async function cleanupTempDir(tempDir: string): Promise<void> {\n try {\n await fs.remove(tempDir)\n } catch {\n // Ignore cleanup errors\n }\n}\n\n/**\n * Check if a directory exists and is not empty\n */\nexport async function dirExistsAndNotEmpty(dirPath: string): Promise<boolean> {\n try {\n const exists = await fs.pathExists(dirPath)\n if (!exists) return false\n\n const files = await fs.readdir(dirPath)\n return files.length > 0\n } catch {\n return false\n }\n}\n\n/**\n * Get the size of a file in KB\n */\nexport async function getFileSizeKB(filePath: string): Promise<number> {\n const stats = await fs.stat(filePath)\n return Math.round(stats.size / 1024)\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport path from 'path'\nimport semver from 'semver'\nimport { detectKitInCwd, detectKit } from '../lib/detect.js'\nimport { getLicenseKey, isLoggedIn } from '../lib/auth.js'\nimport { fetchLatestVersion, getDownloadUrl, downloadFile } from '../lib/api.js'\nimport {\n createTempDir,\n saveToFile,\n extractZipToDir,\n cleanupTempDir,\n getFileSizeKB,\n} from '../lib/extract.js'\nimport { applyFileCategories, isGitRepo, createGitBackup } from '../lib/apply.js'\nimport * as logger from '../utils/logger.js'\nimport { login } from './login.js'\n\ninterface UpgradeOptions {\n yes?: boolean\n backup?: boolean\n}\n\nexport async function upgrade(options: UpgradeOptions): Promise<void> {\n p.intro(pc.cyan('aiorg upgrade'))\n\n // Detect kit in current directory\n const kit = await detectKitInCwd()\n\n if (!kit) {\n logger.error('Not in a kit directory')\n logger.log(pc.dim('Run this command from a folder with .claude/version.json'))\n process.exit(1)\n }\n\n logger.keyValue('Kit', pc.magenta(kit.displayName))\n logger.keyValue('Current version', pc.cyan(`v${kit.version}`))\n\n // Check for updates\n const spinner = p.spinner()\n spinner.start('Checking for updates...')\n\n let latest\n try {\n latest = await fetchLatestVersion(kit.name)\n spinner.stop('Version info fetched')\n } catch (error) {\n spinner.stop('Failed to check for updates')\n throw error\n }\n\n // Compare versions\n if (!semver.gt(latest.version, kit.version)) {\n logger.blank()\n logger.success(`Already on latest version (${pc.cyan(`v${kit.version}`)})`)\n p.outro('')\n return\n }\n\n // Show update available\n logger.blank()\n logger.log(\n `Update available: ${pc.cyan(`v${kit.version}`)} → ${pc.green(`v${latest.version}`)}`\n )\n\n // Show changelog for ALL intermediate versions\n // API returns allVersions array with { version, changelog, releasedAt } objects\n if (latest.allVersions && Array.isArray(latest.allVersions)) {\n // Filter versions between current and latest (exclusive current, inclusive latest)\n const versionsToShow = latest.allVersions\n .filter((v: { version: string }) => {\n if (!semver.valid(v.version)) return false\n try {\n return semver.gt(v.version, kit.version) && semver.lte(v.version, latest.version)\n } catch {\n return false\n }\n })\n .sort((a: { version: string }, b: { version: string }) =>\n semver.rcompare(a.version, b.version)\n ) // newest first\n\n if (versionsToShow.length > 0) {\n logger.blank()\n const versionCount = versionsToShow.length\n logger.header(`Changelog (${versionCount} version${versionCount > 1 ? 's' : ''})`)\n\n for (const versionEntry of versionsToShow) {\n const { version, changelog: entry } = versionEntry as {\n version: string\n changelog: { highlights?: string[]; added?: string[]; upgradeNotes?: string }\n }\n if (!entry) continue\n\n // Version header with highlights\n const highlights = entry.highlights?.join(', ') || ''\n logger.blank()\n logger.log(`${pc.green(`v${version}`)}${highlights ? ` - ${pc.white(highlights)}` : ''}`)\n\n // Show first 2 added items (condensed)\n if (entry.added && entry.added.length > 0) {\n for (const item of entry.added.slice(0, 2)) {\n logger.log(pc.dim(` + ${item}`))\n }\n if (entry.added.length > 2) {\n logger.log(pc.dim(` + ... and ${entry.added.length - 2} more`))\n }\n }\n\n // Show upgrade notes if present (important for breaking changes)\n if (entry.upgradeNotes && version === latest.version) {\n logger.log(pc.yellow(` Note: ${entry.upgradeNotes}`))\n }\n }\n }\n }\n\n // Show what will be preserved\n logger.blank()\n logger.log('Your data will be preserved:')\n const neverTouch = kit.versionJson.fileCategories?.neverTouch ?? []\n for (const pattern of neverTouch.slice(0, 5)) {\n logger.listItem(pc.dim(pattern))\n }\n if (neverTouch.length > 5) {\n logger.log(pc.dim(` ... and ${neverTouch.length - 5} more patterns`))\n }\n\n // Confirm upgrade\n if (!options.yes) {\n logger.blank()\n const shouldUpgrade = await p.confirm({\n message: 'Proceed with upgrade?',\n initialValue: true,\n })\n\n if (p.isCancel(shouldUpgrade) || !shouldUpgrade) {\n p.cancel('Upgrade cancelled')\n return\n }\n }\n\n // Check if kit is free (no license required)\n const isFreeKit = latest.tier === 'free'\n let licenseKey: string | null = null\n\n // Only require login for paid kits\n if (!isFreeKit) {\n if (!(await isLoggedIn())) {\n logger.blank()\n logger.info('Login required for download')\n await login()\n logger.blank()\n }\n\n licenseKey = await getLicenseKey()\n if (!licenseKey) {\n logger.error('No license key found')\n process.exit(1)\n }\n }\n\n // Git backup\n const inGitRepo = await isGitRepo(kit.rootPath)\n if (inGitRepo) {\n if (options.backup) {\n spinner.start('Creating git backup...')\n const created = await createGitBackup(\n kit.rootPath,\n `chore: backup before upgrade to v${latest.version}`\n )\n spinner.stop(created ? 'Git backup created' : 'No changes to backup')\n } else if (!options.yes) {\n const shouldBackup = await p.confirm({\n message: 'Create git backup commit first?',\n initialValue: true,\n })\n\n if (shouldBackup === true) {\n spinner.start('Creating git backup...')\n const created = await createGitBackup(\n kit.rootPath,\n `chore: backup before upgrade to v${latest.version}`\n )\n spinner.stop(created ? 'Git backup created' : 'No changes to backup')\n }\n }\n }\n\n // Get download URL\n if (isFreeKit) {\n spinner.start('Getting download URL...')\n } else {\n spinner.start('Verifying license...')\n }\n\n let downloadInfo\n try {\n downloadInfo = await getDownloadUrl(kit.name, licenseKey)\n spinner.stop(isFreeKit ? 'Ready to download' : 'License verified')\n } catch (error) {\n spinner.stop(isFreeKit ? 'Failed to get download URL' : 'License verification failed')\n throw error\n }\n\n // Download\n spinner.start(`Downloading v${latest.version}...`)\n\n let tempDir: string | null = null\n try {\n tempDir = await createTempDir('aiorg-upgrade-')\n const zipPath = path.join(tempDir, 'kit.zip')\n const extractPath = path.join(tempDir, 'extracted')\n\n const zipData = await downloadFile(downloadInfo.downloadUrl)\n await saveToFile(zipData, zipPath)\n\n const sizeKB = await getFileSizeKB(zipPath)\n spinner.stop(`Downloaded v${latest.version} (${sizeKB} KB)`)\n\n // Extract to temp\n spinner.start('Extracting...')\n await extractZipToDir(zipPath, extractPath)\n spinner.stop('Extracted')\n\n // Read fileCategories from NEW version (extracted), not old local version\n // This is critical - old kit might not have fileCategories defined\n const newKit = await detectKit(extractPath)\n if (!newKit) {\n throw new Error('Failed to read version.json from downloaded kit')\n }\n\n // Apply fileCategories from new version\n spinner.start('Applying updates...')\n const result = await applyFileCategories(\n extractPath,\n kit.rootPath,\n newKit.versionJson\n )\n spinner.stop('Updates applied')\n\n // Show summary\n logger.blank()\n logger.success(\n `Upgraded ${kit.displayName}: ${pc.cyan(`v${kit.version}`)} → ${pc.green(`v${latest.version}`)}`\n )\n logger.blank()\n logger.keyValue('Files updated', String(result.replaced.length))\n if (result.merged.length > 0) {\n logger.keyValue('Files merged', String(result.merged.length))\n }\n if (result.added.length > 0) {\n logger.keyValue('Files added', String(result.added.length))\n }\n logger.keyValue('Files preserved', String(result.skipped.length))\n\n if (result.errors.length > 0) {\n logger.blank()\n logger.warn(`${result.errors.length} errors occurred:`)\n for (const err of result.errors) {\n logger.listItem(pc.dim(err))\n }\n }\n\n // Cleanup\n await cleanupTempDir(tempDir)\n } catch (error) {\n if (tempDir) {\n await cleanupTempDir(tempDir)\n }\n throw error\n }\n\n // Post-upgrade note\n logger.blank()\n logger.log(pc.yellow('⚠️ Restart Claude Code to use new commands'))\n logger.log(pc.dim(' Type \"exit\" then start a new session'))\n\n p.outro(pc.green('Upgrade complete!'))\n}\n","import fs from 'fs-extra'\nimport path from 'path'\nimport { z } from 'zod'\n\nconst VersionJsonSchema = z.object({\n version: z.string(),\n packageName: z.string(),\n packageDisplayName: z.string().optional(),\n releasedAt: z.string().optional(),\n minUpgradeFrom: z.string().optional(),\n fileCategories: z\n .object({\n alwaysReplace: z.array(z.string()).optional(),\n neverTouch: z.array(z.string()).optional(),\n mergeIfChanged: z.array(z.string()).optional(),\n addOnly: z.array(z.string()).optional(),\n })\n .optional(),\n changelog: z.record(z.string(), z.any()).optional(),\n})\n\nconst KitJsonSchema = z.object({\n name: z.string(),\n displayName: z.string().optional(),\n type: z.enum(['bootstrap', 'inject']).optional(),\n})\n\nexport type VersionJson = z.infer<typeof VersionJsonSchema>\nexport type KitJson = z.infer<typeof KitJsonSchema>\n\nexport interface DetectedKit {\n name: string\n displayName: string\n version: string\n versionJson: VersionJson\n kitJson?: KitJson\n rootPath: string\n}\n\n/**\n * Detect kit in a directory by looking for .claude/version.json or .claude/kit.json\n */\nexport async function detectKit(dirPath: string): Promise<DetectedKit | null> {\n const versionJsonPath = path.join(dirPath, '.claude', 'version.json')\n const kitJsonPath = path.join(dirPath, '.claude', 'kit.json')\n\n // Check for version.json (required)\n if (!(await fs.pathExists(versionJsonPath))) {\n return null\n }\n\n try {\n const versionRaw = await fs.readJson(versionJsonPath)\n const versionJson = VersionJsonSchema.parse(versionRaw)\n\n // Optionally load kit.json\n let kitJson: KitJson | undefined\n if (await fs.pathExists(kitJsonPath)) {\n try {\n const kitRaw = await fs.readJson(kitJsonPath)\n kitJson = KitJsonSchema.parse(kitRaw)\n } catch {\n // Ignore kit.json parse errors\n }\n }\n\n return {\n name: kitJson?.name ?? versionJson.packageName,\n displayName:\n kitJson?.displayName ??\n versionJson.packageDisplayName ??\n versionJson.packageName,\n version: versionJson.version,\n versionJson,\n kitJson,\n rootPath: dirPath,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Detect kit in current working directory\n */\nexport async function detectKitInCwd(): Promise<DetectedKit | null> {\n return detectKit(process.cwd())\n}\n\n/**\n * Get file categories from version.json\n */\nexport function getFileCategories(versionJson: VersionJson): {\n alwaysReplace: string[]\n neverTouch: string[]\n mergeIfChanged: string[]\n addOnly: string[]\n} {\n return {\n alwaysReplace: versionJson.fileCategories?.alwaysReplace ?? [],\n neverTouch: versionJson.fileCategories?.neverTouch ?? [],\n mergeIfChanged: versionJson.fileCategories?.mergeIfChanged ?? [],\n addOnly: versionJson.fileCategories?.addOnly ?? [],\n }\n}\n","import fs from 'fs-extra'\nimport path from 'path'\nimport { glob } from 'glob'\nimport { minimatch } from 'minimatch'\nimport { merge } from 'lodash-es'\nimport type { VersionJson } from './detect.js'\n\n/**\n * Safely extract error message from unknown error\n */\nfunction getErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message\n return String(err)\n}\n\nexport interface ApplyResult {\n replaced: string[]\n merged: string[]\n added: string[]\n skipped: string[]\n errors: string[]\n}\n\n/**\n * Apply fileCategories from source to destination\n * - alwaysReplace: copy/overwrite from source\n * - neverTouch: skip entirely\n * - mergeIfChanged: deep merge JSON files (user values win)\n * - addOnly: add only if file doesn't exist\n */\nexport async function applyFileCategories(\n sourceDir: string,\n destDir: string,\n versionJson: VersionJson\n): Promise<ApplyResult> {\n const result: ApplyResult = {\n replaced: [],\n merged: [],\n added: [],\n skipped: [],\n errors: [],\n }\n\n const alwaysReplace = versionJson.fileCategories?.alwaysReplace ?? []\n const neverTouch = versionJson.fileCategories?.neverTouch ?? []\n const mergeIfChanged = versionJson.fileCategories?.mergeIfChanged ?? []\n const addOnly = versionJson.fileCategories?.addOnly ?? []\n\n // Track processed files to avoid duplicates\n const processedFiles = new Set<string>()\n\n // 1. Process alwaysReplace patterns\n for (const pattern of alwaysReplace) {\n try {\n const files = await glob(pattern, {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n })\n\n for (const file of files) {\n if (processedFiles.has(file)) continue\n\n // Check if file matches any neverTouch pattern\n const shouldSkip = neverTouch.some((ntPattern) => {\n return matchesPattern(file, ntPattern)\n })\n\n if (shouldSkip) {\n result.skipped.push(file)\n processedFiles.add(file)\n continue\n }\n\n const srcPath = path.join(sourceDir, file)\n const destPath = path.join(destDir, file)\n\n try {\n await fs.ensureDir(path.dirname(destPath))\n await fs.copy(srcPath, destPath, { overwrite: true })\n result.replaced.push(file)\n processedFiles.add(file)\n } catch (err) {\n result.errors.push(`Failed to copy ${file}: ${getErrorMessage(err)}`)\n }\n }\n } catch (err) {\n result.errors.push(`Failed to process pattern ${pattern}: ${getErrorMessage(err)}`)\n }\n }\n\n // 2. Process mergeIfChanged patterns (JSON deep merge)\n for (const pattern of mergeIfChanged) {\n try {\n const files = await glob(pattern, {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n })\n\n for (const file of files) {\n if (processedFiles.has(file)) continue\n\n // Check if file matches any neverTouch pattern\n const shouldSkip = neverTouch.some((ntPattern) => {\n return matchesPattern(file, ntPattern)\n })\n\n if (shouldSkip) {\n result.skipped.push(file)\n processedFiles.add(file)\n continue\n }\n\n const srcPath = path.join(sourceDir, file)\n const destPath = path.join(destDir, file)\n\n try {\n const destExists = await fs.pathExists(destPath)\n\n if (destExists && file.endsWith('.json')) {\n // Merge JSON files - user's values win (existing overwrites incoming)\n const incoming = await fs.readJson(srcPath)\n const existing = await fs.readJson(destPath)\n\n // Deep merge: start with incoming, overlay existing (user's changes win)\n const merged = merge({}, incoming, existing)\n\n await fs.writeJson(destPath, merged, { spaces: 2 })\n result.merged.push(file)\n } else if (destExists) {\n // Non-JSON file exists - skip (preserve user's version)\n result.skipped.push(file)\n } else {\n // File doesn't exist - copy it\n await fs.ensureDir(path.dirname(destPath))\n await fs.copy(srcPath, destPath)\n result.replaced.push(file)\n }\n processedFiles.add(file)\n } catch (err) {\n result.errors.push(`Failed to merge ${file}: ${getErrorMessage(err)}`)\n }\n }\n } catch (err) {\n result.errors.push(`Failed to process merge pattern ${pattern}: ${getErrorMessage(err)}`)\n }\n }\n\n // 3. Process addOnly patterns (add if missing)\n for (const pattern of addOnly) {\n try {\n const files = await glob(pattern, {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n })\n\n for (const file of files) {\n if (processedFiles.has(file)) continue\n\n // Check if file matches any neverTouch pattern\n const shouldSkip = neverTouch.some((ntPattern) => {\n return matchesPattern(file, ntPattern)\n })\n\n if (shouldSkip) {\n result.skipped.push(file)\n processedFiles.add(file)\n continue\n }\n\n const srcPath = path.join(sourceDir, file)\n const destPath = path.join(destDir, file)\n\n try {\n const destExists = await fs.pathExists(destPath)\n\n if (!destExists) {\n // Only add if file doesn't exist\n await fs.ensureDir(path.dirname(destPath))\n await fs.copy(srcPath, destPath)\n result.added.push(file)\n } else {\n // File exists - skip\n result.skipped.push(file)\n }\n processedFiles.add(file)\n } catch (err) {\n result.errors.push(`Failed to add ${file}: ${getErrorMessage(err)}`)\n }\n }\n } catch (err) {\n result.errors.push(`Failed to process addOnly pattern ${pattern}: ${getErrorMessage(err)}`)\n }\n }\n\n return result\n}\n\n/**\n * Pattern matching using minimatch (supports *, **, etc.)\n */\nfunction matchesPattern(filePath: string, pattern: string): boolean {\n return minimatch(filePath, pattern, { dot: true })\n}\n\n/**\n * Check if git is available and directory is a git repo\n */\nexport async function isGitRepo(dirPath: string): Promise<boolean> {\n try {\n const gitDir = path.join(dirPath, '.git')\n return await fs.pathExists(gitDir)\n } catch {\n return false\n }\n}\n\n/**\n * Create a git backup commit\n */\nexport async function createGitBackup(\n dirPath: string,\n message: string\n): Promise<boolean> {\n try {\n const { spawnSync } = await import('child_process')\n\n // Stage all changes\n spawnSync('git', ['add', '-A'], { cwd: dirPath, stdio: 'pipe' })\n\n // Check if there are changes to commit\n const diffResult = spawnSync('git', ['diff', '--cached', '--quiet'], {\n cwd: dirPath,\n stdio: 'pipe',\n })\n\n if (diffResult.status === 0) {\n // No changes\n return false\n }\n\n // Has changes, commit them (using spawnSync to avoid shell injection)\n const commitResult = spawnSync('git', ['commit', '-m', message], {\n cwd: dirPath,\n stdio: 'pipe',\n })\n\n return commitResult.status === 0\n } catch {\n return false\n }\n}\n","import pc from 'picocolors'\nimport semver from 'semver'\nimport { detectKitInCwd } from '../lib/detect.js'\nimport { fetchLatestVersion } from '../lib/api.js'\nimport * as logger from '../utils/logger.js'\n\nconst CLI_VERSION = '1.0.0'\n\nexport async function version(): Promise<void> {\n logger.header('aiorg version')\n\n // CLI version\n logger.keyValue('CLI', pc.cyan(`v${CLI_VERSION}`))\n\n // Detect kit in current directory\n const kit = await detectKitInCwd()\n\n if (!kit) {\n logger.blank()\n logger.info('No kit detected in current directory')\n logger.log(pc.dim('Run this command from a folder containing a kit'))\n return\n }\n\n // Show current kit version\n logger.keyValue(kit.displayName, pc.cyan(`v${kit.version}`))\n\n // Check for updates\n try {\n const latest = await fetchLatestVersion(kit.name)\n\n if (semver.gt(latest.version, kit.version)) {\n logger.blank()\n logger.warn(\n `Update available: ${pc.cyan(`v${kit.version}`)} → ${pc.green(`v${latest.version}`)}`\n )\n logger.log(pc.dim(\"Run 'aiorg upgrade' to update\"))\n } else {\n logger.blank()\n logger.success('You are on the latest version')\n }\n } catch {\n // Silently ignore API errors for version check\n logger.blank()\n logger.log(pc.dim('Could not check for updates'))\n }\n}\n","import pc from 'picocolors'\nimport { fetchKitsList } from '../lib/api.js'\nimport * as logger from '../utils/logger.js'\n\n/**\n * Format price in cents to display string\n */\nfunction formatPrice(cents: number): string {\n if (cents === 0) return ''\n return `$${(cents / 100).toFixed(0)}`\n}\n\n/**\n * List all available kits\n */\nexport async function list(): Promise<void> {\n const { kits } = await fetchKitsList()\n\n if (kits.length === 0) {\n logger.warn('No kits available')\n return\n }\n\n // Group by tier\n const freeKits = kits.filter(k => k.tier === 'free')\n const paidKits = kits.filter(k => k.tier === 'paid')\n\n logger.blank()\n console.log(pc.bold('Available Kits'))\n logger.blank()\n\n // Free kits\n if (freeKits.length > 0) {\n console.log(pc.green(pc.bold('FREE')))\n logger.blank()\n for (const kit of freeKits) {\n printKit(kit)\n }\n }\n\n // Paid kits\n if (paidKits.length > 0) {\n console.log(pc.yellow(pc.bold('PAID')))\n logger.blank()\n for (const kit of paidKits) {\n printKit(kit)\n }\n }\n\n // Footer\n console.log(pc.dim('─'.repeat(50)))\n logger.blank()\n console.log(pc.dim('Free kits work without login.'))\n console.log(pc.dim(`Run '${pc.cyan('aiorg login')}' first for paid kits.`))\n console.log(pc.dim(`Visit ${pc.cyan('https://aiorg.dev')} for details.`))\n logger.blank()\n}\n\nfunction printKit(kit: {\n name: string\n displayName: string\n description: string | null\n tier: 'free' | 'paid'\n version: string\n priceCents: number\n}): void {\n const price = formatPrice(kit.priceCents)\n const priceStr = price ? pc.yellow(price) : ''\n\n // Kit name and version\n console.log(\n ` ${pc.bold(kit.name.padEnd(24))} ${pc.cyan(`v${kit.version}`)} ${priceStr}`\n )\n\n // Description\n if (kit.description) {\n console.log(` ${pc.dim(kit.description)}`)\n }\n\n // Example command\n console.log(\n ` ${pc.dim('→')} ${pc.dim('npx @aiorg/cli init')} ${pc.magenta(kit.name)} ${pc.dim('~/my-project')}`\n )\n\n logger.blank()\n}\n"],"mappings":"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","names":["pc","error","data","z","pc","spinner","error","p","pc","pc","p","pc","path","os","fs","path","os","pc","path","os","spinner","error","outro","p","pc","path","fs","path","z","fs","path","pc","spinner","error","version","path","pc","semver","pc","semver","pc","pc","error","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/lib/api.ts","../src/lib/auth.ts","../src/utils/logger.ts","../src/commands/logout.ts","../src/commands/init.ts","../src/lib/extract.ts","../src/lib/project.ts","../src/commands/upgrade.ts","../src/lib/detect.ts","../src/lib/apply.ts","../src/commands/version.ts","../src/commands/list.ts","../src/commands/status.ts"],"sourcesContent":["import cac from 'cac'\nimport { login } from './commands/login.js'\nimport { logout } from './commands/logout.js'\nimport { init } from './commands/init.js'\nimport { upgrade } from './commands/upgrade.js'\nimport { version } from './commands/version.js'\nimport { list } from './commands/list.js'\nimport { status } from './commands/status.js'\nimport * as logger from './utils/logger.js'\n\nconst cli = cac('aiorg')\n\n// Login command\ncli\n .command('login', 'Save your license key')\n .action(async () => {\n try {\n await login()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Login failed')\n process.exit(1)\n }\n })\n\n// Logout command\ncli\n .command('logout', 'Remove saved license key')\n .action(async () => {\n try {\n await logout()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Logout failed')\n process.exit(1)\n }\n })\n\n// Init command\ncli\n .command('init <kit> [path]', 'Download and extract a kit')\n .option('--force', 'Overwrite existing folder')\n .action(async (kit: string, path: string | undefined, options: { force?: boolean }) => {\n try {\n await init(kit, path, options)\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Init failed')\n process.exit(1)\n }\n })\n\n// Upgrade command\ncli\n .command('upgrade', 'Upgrade kit in current directory')\n .option('--yes, -y', 'Skip confirmation')\n .option('--backup', 'Always create git backup')\n .action(async (options: { yes?: boolean; backup?: boolean }) => {\n try {\n await upgrade(options)\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Upgrade failed')\n process.exit(1)\n }\n })\n\n// List command\ncli\n .command('list', 'Show available kits')\n .alias('ls')\n .action(async () => {\n try {\n await list()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Failed to list kits')\n process.exit(1)\n }\n })\n\n// Version command\ncli\n .command('version', 'Show CLI and kit versions')\n .action(async () => {\n try {\n await version()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Version check failed')\n process.exit(1)\n }\n })\n\n// Status command\ncli\n .command('status', 'Show project and kit status')\n .action(async () => {\n try {\n await status()\n } catch (error) {\n logger.error(error instanceof Error ? error.message : 'Status check failed')\n process.exit(1)\n }\n })\n\n// Global options\ncli.help()\ncli.version('1.0.0')\n\n// Parse and run\ncli.parse()\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport { verifyLicense } from '../lib/api.js'\nimport { saveLicenseKey, isLoggedIn, loadConfig } from '../lib/auth.js'\nimport * as logger from '../utils/logger.js'\n\nexport async function login(): Promise<void> {\n p.intro(pc.cyan('aiorg login'))\n\n // Check if already logged in\n if (await isLoggedIn()) {\n const config = await loadConfig()\n const shouldContinue = await p.confirm({\n message: `Already logged in${config?.email ? ` as ${pc.cyan(config.email)}` : ''}. Replace license key?`,\n initialValue: false,\n })\n\n if (p.isCancel(shouldContinue) || !shouldContinue) {\n p.outro('Login cancelled')\n return\n }\n }\n\n // Get license key\n const licenseKey = await p.text({\n message: 'Enter your license key',\n placeholder: 'ak_live_xxxxx',\n validate: (value) => {\n if (!value) return 'License key is required'\n if (!value.startsWith('ak_')) return 'License key should start with \"ak_\"'\n return undefined\n },\n })\n\n if (p.isCancel(licenseKey)) {\n p.cancel('Login cancelled')\n process.exit(0)\n }\n\n // Verify with API\n const spinner = p.spinner()\n spinner.start('Verifying license...')\n\n try {\n const result = await verifyLicense(licenseKey)\n\n if (!result.valid) {\n spinner.stop('License verification failed')\n logger.error(result.error || 'Invalid license key')\n process.exit(1)\n }\n\n // Save to config\n const kitsRecord: Record<string, { tier: 'free' | 'paid'; purchasedAt: string }> = {}\n if (result.kits) {\n for (const kit of result.kits) {\n kitsRecord[kit.name] = {\n tier: kit.tier,\n purchasedAt: kit.purchasedAt,\n }\n }\n }\n\n await saveLicenseKey(licenseKey, result.email, kitsRecord)\n spinner.stop('License verified')\n\n // Show success\n logger.blank()\n logger.success(`Logged in${result.email ? ` as ${pc.cyan(result.email)}` : ''}`)\n\n if (result.kits && result.kits.length > 0) {\n logger.blank()\n logger.log('Licensed kits:')\n for (const kit of result.kits) {\n logger.listItem(`${kit.name} (${kit.tier})`)\n }\n }\n\n p.outro('Ready to use aiorg kits!')\n } catch (error) {\n spinner.stop('License verification failed')\n throw error\n }\n}\n","import { z } from 'zod'\n\nconst API_BASE_URL = process.env.AIORG_API_URL?.trim() || 'https://aiorg.dev'\nconst API_TIMEOUT_MS = 30000 // 30 seconds\n\n/**\n * Fetch with timeout support\n */\nasync function fetchWithTimeout(\n url: string,\n options: RequestInit = {},\n timeoutMs: number = API_TIMEOUT_MS\n): Promise<Response> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n })\n return response\n } finally {\n clearTimeout(timeout)\n }\n}\n\n// Response schemas\nconst LatestVersionSchema = z.object({\n version: z.string(),\n releasedAt: z.string(),\n packageName: z.string(),\n packageDisplayName: z.string(),\n changelog: z.record(z.string(), z.any()).optional(),\n allVersions: z\n .array(\n z.object({\n version: z.string(),\n changelog: z.record(z.string(), z.any()).optional(),\n releasedAt: z.string().optional(),\n })\n )\n .optional(),\n tier: z.enum(['free', 'paid', 'private']).optional(),\n type: z.enum(['template', 'companion', 'inject']).optional(),\n})\n\nconst DownloadResponseSchema = z.object({\n downloadUrl: z.string(),\n version: z.string(),\n filename: z.string(),\n})\n\nconst VerifyLicenseResponseSchema = z.object({\n valid: z.boolean(),\n email: z.string().optional(),\n kits: z\n .array(\n z.object({\n name: z.string(),\n tier: z.enum(['free', 'paid', 'private']),\n purchasedAt: z.string(),\n })\n )\n .optional(),\n error: z.string().optional(),\n})\n\nconst ListKitsSchema = z.object({\n kits: z.array(z.object({\n name: z.string(),\n displayName: z.string(),\n description: z.string().nullable(),\n tier: z.enum(['free', 'paid', 'private']),\n type: z.enum(['template', 'companion', 'inject']),\n deployMode: z.string().nullable(),\n version: z.string(),\n priceCents: z.number(),\n }))\n})\n\nexport type LatestVersion = z.infer<typeof LatestVersionSchema>\nexport type DownloadResponse = z.infer<typeof DownloadResponseSchema>\nexport type VerifyLicenseResponse = z.infer<typeof VerifyLicenseResponseSchema>\nexport type ListKitsResponse = z.infer<typeof ListKitsSchema>\n\nclass APIError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message)\n this.name = 'APIError'\n }\n}\n\n/**\n * Fetch latest version info for a kit\n */\nexport async function fetchLatestVersion(\n kitName: string\n): Promise<LatestVersion> {\n const url = `${API_BASE_URL}/api/kits/${kitName}/latest`\n\n try {\n const response = await fetchWithTimeout(url)\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new APIError(`Kit not found: \"${kitName}\"`, 404)\n }\n throw new APIError(`Failed to fetch version info`, response.status)\n }\n\n const data = await response.json()\n return LatestVersionSchema.parse(data)\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Request timed out')\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * Get download URL for a kit (license key optional for free kits)\n */\nexport async function getDownloadUrl(\n kitName: string,\n licenseKey: string | null\n): Promise<DownloadResponse> {\n const url = `${API_BASE_URL}/api/kits/${kitName}/download`\n\n const headers: Record<string, string> = {}\n if (licenseKey) {\n headers.Authorization = `Bearer ${licenseKey}`\n }\n\n try {\n const response = await fetchWithTimeout(url, { headers })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new APIError('Invalid or expired license key', 401)\n }\n if (response.status === 403) {\n throw new APIError(\n 'License key does not have access to this kit',\n 403\n )\n }\n if (response.status === 404) {\n throw new APIError(`Kit not found: \"${kitName}\"`, 404)\n }\n throw new APIError(`Failed to get download URL`, response.status)\n }\n\n const data = await response.json()\n return DownloadResponseSchema.parse(data)\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Request timed out')\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * Verify a license key with the API\n */\nexport async function verifyLicense(\n licenseKey: string,\n kitName?: string\n): Promise<VerifyLicenseResponse> {\n const url = `${API_BASE_URL}/api/licenses/verify`\n\n try {\n const response = await fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n key: licenseKey,\n kit: kitName,\n }),\n })\n\n if (!response.ok) {\n const data = await response.json().catch(() => ({})) as { error?: string }\n throw new APIError(\n data.error || 'License verification failed',\n response.status\n )\n }\n\n const data = await response.json()\n return VerifyLicenseResponseSchema.parse(data)\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Request timed out')\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * Download a file from a URL\n */\nexport async function downloadFile(url: string): Promise<ArrayBuffer> {\n const DOWNLOAD_TIMEOUT_MS = 120000 // 2 minutes for file downloads\n\n try {\n const response = await fetchWithTimeout(url, {}, DOWNLOAD_TIMEOUT_MS)\n\n if (!response.ok) {\n throw new APIError(`Download failed`, response.status)\n }\n\n return await response.arrayBuffer()\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Download timed out')\n }\n throw new APIError(\n `Download failed: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n\n/**\n * Fetch list of all available kits\n */\nexport async function fetchKitsList(): Promise<ListKitsResponse> {\n const url = `${API_BASE_URL}/api/kits`\n\n try {\n const response = await fetchWithTimeout(url)\n\n if (!response.ok) {\n throw new APIError('Failed to fetch kits list', response.status)\n }\n\n const data = await response.json()\n return ListKitsSchema.parse(data)\n } catch (error) {\n if (error instanceof APIError) throw error\n if (error instanceof Error && error.name === 'AbortError') {\n throw new APIError('Request timed out')\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n}\n","import fs from 'fs-extra'\nimport path from 'path'\nimport os from 'os'\nimport { z } from 'zod'\n\nconst CONFIG_DIR = path.join(os.homedir(), '.aiorg')\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json')\n\nconst KitLicenseSchema = z.object({\n tier: z.enum(['free', 'paid', 'private']),\n purchasedAt: z.string(),\n})\n\nconst ConfigSchema = z.object({\n licenseKey: z.string(),\n email: z.string().optional(),\n kits: z.record(z.string(), KitLicenseSchema).optional(),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\nexport type KitLicense = z.infer<typeof KitLicenseSchema>\n\n/**\n * Get the config directory path\n */\nexport function getConfigDir(): string {\n return CONFIG_DIR\n}\n\n/**\n * Get the config file path\n */\nexport function getConfigFile(): string {\n return CONFIG_FILE\n}\n\n/**\n * Ensure config directory exists\n */\nexport async function ensureConfigDir(): Promise<void> {\n await fs.ensureDir(CONFIG_DIR)\n}\n\n/**\n * Check if user is logged in (has config file with license key)\n */\nexport async function isLoggedIn(): Promise<boolean> {\n try {\n const config = await loadConfig()\n return !!config?.licenseKey\n } catch {\n return false\n }\n}\n\n/**\n * Load config from disk\n */\nexport async function loadConfig(): Promise<Config | null> {\n try {\n if (!(await fs.pathExists(CONFIG_FILE))) {\n return null\n }\n const raw = await fs.readJson(CONFIG_FILE)\n return ConfigSchema.parse(raw)\n } catch {\n return null\n }\n}\n\n/**\n * Save config to disk\n */\nexport async function saveConfig(config: Config): Promise<void> {\n await ensureConfigDir()\n await fs.writeJson(CONFIG_FILE, config, { spaces: 2 })\n}\n\n/**\n * Get license key from config or environment\n */\nexport async function getLicenseKey(): Promise<string | null> {\n // Check environment first\n const envKey = process.env.AIORG_LICENSE_KEY\n if (envKey) {\n return envKey\n }\n\n // Check config file\n const config = await loadConfig()\n return config?.licenseKey ?? null\n}\n\n/**\n * Save license key to config\n */\nexport async function saveLicenseKey(\n licenseKey: string,\n email?: string,\n kits?: Record<string, KitLicense>\n): Promise<void> {\n const existing = await loadConfig()\n await saveConfig({\n ...(existing || {}),\n licenseKey,\n email: email ?? existing?.email,\n kits: kits ?? existing?.kits,\n })\n}\n\n/**\n * Clear config (logout)\n */\nexport async function clearConfig(): Promise<void> {\n try {\n await fs.remove(CONFIG_FILE)\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Add kit to user's licensed kits\n */\nexport async function addLicensedKit(\n kitName: string,\n tier: 'free' | 'paid' | 'private' = 'paid'\n): Promise<void> {\n const config = await loadConfig()\n if (!config) {\n throw new Error('Not logged in')\n }\n\n const kits = config.kits ?? {}\n kits[kitName] = {\n tier,\n purchasedAt: new Date().toISOString().split('T')[0],\n }\n\n await saveConfig({ ...config, kits })\n}\n","import pc from 'picocolors'\n\n/**\n * Log a success message\n */\nexport function success(message: string): void {\n console.log(pc.green('✓'), message)\n}\n\n/**\n * Log an error message\n */\nexport function error(message: string): void {\n console.log(pc.red('✗'), message)\n}\n\n/**\n * Log a warning message\n */\nexport function warn(message: string): void {\n console.log(pc.yellow('!'), message)\n}\n\n/**\n * Log an info message\n */\nexport function info(message: string): void {\n console.log(pc.blue('ℹ'), message)\n}\n\n/**\n * Log a plain message\n */\nexport function log(message: string): void {\n console.log(message)\n}\n\n/**\n * Log a blank line\n */\nexport function blank(): void {\n console.log()\n}\n\n/**\n * Log a header\n */\nexport function header(title: string): void {\n console.log()\n console.log(pc.bold(title))\n console.log(pc.dim('─'.repeat(40)))\n}\n\n/**\n * Log a key-value pair\n */\nexport function keyValue(key: string, value: string): void {\n console.log(`${pc.dim(key + ':')} ${value}`)\n}\n\n/**\n * Log a list item\n */\nexport function listItem(item: string, indent: number = 0): void {\n const prefix = ' '.repeat(indent)\n console.log(`${prefix}${pc.dim('•')} ${item}`)\n}\n\n/**\n * Format a version for display\n */\nexport function formatVersion(version: string): string {\n return pc.cyan(`v${version}`)\n}\n\n/**\n * Format a kit name for display\n */\nexport function formatKit(name: string): string {\n return pc.magenta(name)\n}\n\n/**\n * Format a path for display\n */\nexport function formatPath(path: string): string {\n return pc.yellow(path)\n}\n\n/**\n * Format a command for display\n */\nexport function formatCommand(cmd: string): string {\n return pc.cyan(cmd)\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport { clearConfig, isLoggedIn, loadConfig } from '../lib/auth.js'\nimport * as logger from '../utils/logger.js'\n\nexport async function logout(): Promise<void> {\n p.intro(pc.cyan('aiorg logout'))\n\n // Check if logged in\n if (!(await isLoggedIn())) {\n logger.info('Not currently logged in')\n p.outro('')\n return\n }\n\n const config = await loadConfig()\n const email = config?.email\n\n // Confirm\n const shouldLogout = await p.confirm({\n message: `Log out${email ? ` from ${pc.cyan(email)}` : ''}?`,\n initialValue: true,\n })\n\n if (p.isCancel(shouldLogout) || !shouldLogout) {\n p.cancel('Logout cancelled')\n return\n }\n\n // Clear config\n await clearConfig()\n\n logger.success('Logged out')\n p.outro('')\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport path from 'path'\nimport os from 'os'\nimport { getLicenseKey, isLoggedIn } from '../lib/auth.js'\nimport { fetchLatestVersion, getDownloadUrl, downloadFile } from '../lib/api.js'\nimport {\n createTempDir,\n saveToFile,\n extractZipToDir,\n cleanupTempDir,\n dirExistsAndNotEmpty,\n getFileSizeKB,\n} from '../lib/extract.js'\nimport { setupProject } from '../lib/project.js'\nimport * as logger from '../utils/logger.js'\nimport { login } from './login.js'\n\ninterface InitOptions {\n force?: boolean\n}\n\nexport async function init(\n kitName: string,\n targetPath: string | undefined,\n options: InitOptions\n): Promise<void> {\n p.intro(pc.cyan(`aiorg init ${kitName}`))\n\n // Resolve target path\n const resolvedPath = targetPath\n ? path.resolve(targetPath.replace(/^~/, os.homedir()))\n : path.resolve(process.cwd(), kitName)\n\n // Check if target exists\n if (!options.force && (await dirExistsAndNotEmpty(resolvedPath))) {\n logger.error(`Folder already exists: ${pc.yellow(resolvedPath)}`)\n logger.log(pc.dim('Use --force to overwrite'))\n process.exit(1)\n }\n\n // Fetch latest version info first (to check tier)\n const spinner = p.spinner()\n spinner.start('Fetching version info...')\n\n let versionInfo\n try {\n versionInfo = await fetchLatestVersion(kitName)\n spinner.stop(`Found ${pc.cyan(versionInfo.packageDisplayName)} v${versionInfo.version}`)\n } catch (error) {\n spinner.stop('Failed to fetch version info')\n throw error\n }\n\n const isFreeKit = versionInfo.tier === 'free'\n let licenseKey: string | null = null\n\n // Only require login for paid kits\n if (!isFreeKit) {\n if (!(await isLoggedIn())) {\n logger.info('Not logged in. Please log in first.')\n logger.blank()\n await login()\n logger.blank()\n }\n\n licenseKey = await getLicenseKey()\n if (!licenseKey) {\n logger.error('No license key found. Run \"aiorg login\" first.')\n process.exit(1)\n }\n }\n\n // Get download URL\n if (isFreeKit) {\n spinner.start('Getting download URL...')\n } else {\n spinner.start('Verifying license...')\n }\n\n let downloadInfo\n try {\n downloadInfo = await getDownloadUrl(kitName, licenseKey)\n spinner.stop(isFreeKit ? 'Ready to download' : 'License verified')\n } catch (error) {\n spinner.stop(isFreeKit ? 'Failed to get download URL' : 'License verification failed')\n throw error\n }\n\n // Download ZIP\n spinner.start(`Downloading ${kitName} v${versionInfo.version}...`)\n\n let tempDir: string | null = null\n try {\n tempDir = await createTempDir('aiorg-init-')\n const zipPath = path.join(tempDir, 'kit.zip')\n\n const zipData = await downloadFile(downloadInfo.downloadUrl)\n await saveToFile(zipData, zipPath)\n\n const sizeKB = await getFileSizeKB(zipPath)\n spinner.stop(`Downloaded ${kitName} v${versionInfo.version} (${sizeKB} KB)`)\n\n // Extract to target\n spinner.start(`Extracting to ${resolvedPath}...`)\n await extractZipToDir(zipPath, resolvedPath)\n spinner.stop(`Extracted to ${pc.yellow(resolvedPath)}`)\n\n // Cleanup\n await cleanupTempDir(tempDir)\n } catch (error) {\n if (tempDir) {\n await cleanupTempDir(tempDir)\n }\n throw error\n }\n\n // Success message\n logger.blank()\n logger.success(`${versionInfo.packageDisplayName} v${versionInfo.version} installed!`)\n\n // Setup project linking (for kit ecosystem)\n await setupProject(resolvedPath, kitName)\n logger.blank()\n logger.log('Next steps:')\n logger.listItem(`cd ${resolvedPath}`)\n logger.listItem('claude')\n logger.listItem('/setup')\n\n // Kit-specific outro messages\n const outroMessages: Record<string, string> = {\n 'investor-os': 'Happy investing!',\n }\n const outro = outroMessages[kitName] || 'Happy building!'\n p.outro(pc.green(outro))\n}\n","import extractZip from 'extract-zip'\nimport fs from 'fs-extra'\nimport path from 'path'\nimport os from 'os'\n\n/**\n * Create a temporary directory for downloads\n */\nexport async function createTempDir(prefix: string = 'aiorg-'): Promise<string> {\n const tempDir = path.join(os.tmpdir(), `${prefix}${Date.now()}`)\n await fs.ensureDir(tempDir)\n return tempDir\n}\n\n/**\n * Save buffer to a file\n */\nexport async function saveToFile(\n data: ArrayBuffer,\n filePath: string\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, Buffer.from(data))\n}\n\n/**\n * Extract ZIP file to a directory\n */\nexport async function extractZipToDir(\n zipPath: string,\n destPath: string\n): Promise<void> {\n await fs.ensureDir(destPath)\n await extractZip(zipPath, { dir: destPath })\n}\n\n/**\n * Clean up temporary directory\n */\nexport async function cleanupTempDir(tempDir: string): Promise<void> {\n try {\n await fs.remove(tempDir)\n } catch {\n // Ignore cleanup errors\n }\n}\n\n/**\n * Check if a directory exists and is not empty\n */\nexport async function dirExistsAndNotEmpty(dirPath: string): Promise<boolean> {\n try {\n const exists = await fs.pathExists(dirPath)\n if (!exists) return false\n\n const files = await fs.readdir(dirPath)\n return files.length > 0\n } catch {\n return false\n }\n}\n\n/**\n * Get the size of a file in KB\n */\nexport async function getFileSizeKB(filePath: string): Promise<number> {\n const stats = await fs.stat(filePath)\n return Math.round(stats.size / 1024)\n}\n","import fs from 'fs-extra'\nimport path from 'path'\nimport os from 'os'\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport { z } from 'zod'\nimport * as logger from '../utils/logger.js'\n\n// Schema for .aiorg file (links folder to project)\nconst AiorgFileSchema = z.object({\n project: z.string(),\n version: z.string().optional(),\n})\n\n// Schema for context.json (shared business context)\nconst ContextJsonSchema = z.object({\n version: z.string(),\n business: z.object({\n name: z.string(),\n description: z.string().optional(),\n stage: z.enum(['idea', 'building', 'launched', 'pmf', 'scaling']).optional(),\n launchDate: z.string().optional(),\n }),\n validation: z.object({\n ideaValidated: z.boolean().optional(),\n ideaScore: z.number().optional(),\n targetCustomer: z.string().optional(),\n valueProp: z.string().optional(),\n validatedAt: z.string().optional(),\n }).optional(),\n pmf: z.object({\n status: z.enum(['not-started', 'searching', 'approaching', 'achieved']).optional(),\n score: z.number().nullable().optional(),\n seanEllisScore: z.number().nullable().optional(),\n activationRate: z.number().nullable().optional(),\n weeklyRetention: z.number().nullable().optional(),\n measuredAt: z.string().nullable().optional(),\n }).optional(),\n installedKits: z.array(z.string()).optional(),\n lastUpdated: z.string(),\n updatedBy: z.string(),\n})\n\nexport type AiorgFile = z.infer<typeof AiorgFileSchema>\nexport type ContextJson = z.infer<typeof ContextJsonSchema>\n\n/**\n * Get the path to ~/.aiorg/ directory\n */\nexport function getAiorgDir(): string {\n return path.join(os.homedir(), '.aiorg')\n}\n\n/**\n * Get the path to ~/.aiorg/projects/ directory\n */\nexport function getProjectsDir(): string {\n return path.join(getAiorgDir(), 'projects')\n}\n\n/**\n * Get the path to a specific project's directory\n */\nexport function getProjectDir(projectName: string): string {\n return path.join(getProjectsDir(), projectName)\n}\n\n/**\n * Check if ~/.aiorg/ exists and is initialized\n */\nexport async function isAiorgInitialized(): Promise<boolean> {\n return fs.pathExists(getProjectsDir())\n}\n\n/**\n * Initialize ~/.aiorg/ directory structure\n */\nexport async function initializeAiorg(): Promise<void> {\n const aiorgDir = getAiorgDir()\n const projectsDir = getProjectsDir()\n\n await fs.ensureDir(projectsDir)\n\n // Create config.json if it doesn't exist\n const configPath = path.join(aiorgDir, 'config.json')\n if (!(await fs.pathExists(configPath))) {\n await fs.writeJson(configPath, {\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n }, { spaces: 2 })\n }\n}\n\n/**\n * List all existing projects\n */\nexport async function listProjects(): Promise<string[]> {\n const projectsDir = getProjectsDir()\n\n if (!(await fs.pathExists(projectsDir))) {\n return []\n }\n\n const entries = await fs.readdir(projectsDir, { withFileTypes: true })\n return entries\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n}\n\n/**\n * Check if a project exists\n */\nexport async function projectExists(projectName: string): Promise<boolean> {\n const projectDir = getProjectDir(projectName)\n return fs.pathExists(projectDir)\n}\n\n/**\n * Create a new project\n */\nexport async function createProject(\n projectName: string,\n businessName: string,\n kitName: string\n): Promise<void> {\n const projectDir = getProjectDir(projectName)\n\n // Ensure parent directories exist\n await initializeAiorg()\n\n // Create project directory\n await fs.ensureDir(projectDir)\n\n // Create context.json\n const contextJson: ContextJson = {\n version: '1.0.0',\n business: {\n name: businessName,\n stage: 'building',\n },\n validation: {},\n pmf: {\n status: 'not-started',\n score: null,\n seanEllisScore: null,\n activationRate: null,\n weeklyRetention: null,\n measuredAt: null,\n },\n installedKits: [kitName],\n lastUpdated: new Date().toISOString(),\n updatedBy: kitName,\n }\n\n await fs.writeJson(\n path.join(projectDir, 'context.json'),\n contextJson,\n { spaces: 2 }\n )\n\n // Create empty learnings.json\n await fs.writeJson(\n path.join(projectDir, 'learnings.json'),\n {\n version: '1.0.0',\n whatWorks: [],\n whatDoesntWork: [],\n },\n { spaces: 2 }\n )\n}\n\n/**\n * Read the .aiorg file from a directory\n */\nexport async function readAiorgFile(dirPath: string): Promise<AiorgFile | null> {\n const aiorgPath = path.join(dirPath, '.aiorg')\n\n if (!(await fs.pathExists(aiorgPath))) {\n return null\n }\n\n try {\n const content = await fs.readJson(aiorgPath)\n return AiorgFileSchema.parse(content)\n } catch {\n return null\n }\n}\n\n/**\n * Write the .aiorg file to a directory\n */\nexport async function writeAiorgFile(dirPath: string, projectName: string): Promise<void> {\n const aiorgPath = path.join(dirPath, '.aiorg')\n const aiorgFile: AiorgFile = {\n project: projectName,\n version: '1.0.0',\n }\n await fs.writeJson(aiorgPath, aiorgFile, { spaces: 2 })\n}\n\n/**\n * Add a kit to an existing project's installedKits list\n */\nexport async function addKitToProject(projectName: string, kitName: string): Promise<void> {\n const contextPath = path.join(getProjectDir(projectName), 'context.json')\n\n if (!(await fs.pathExists(contextPath))) {\n return\n }\n\n try {\n const context = await fs.readJson(contextPath)\n const installedKits = context.installedKits || []\n\n if (!installedKits.includes(kitName)) {\n installedKits.push(kitName)\n context.installedKits = installedKits\n context.lastUpdated = new Date().toISOString()\n await fs.writeJson(contextPath, context, { spaces: 2 })\n }\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Read context.json for a project\n */\nexport async function readProjectContext(projectName: string): Promise<ContextJson | null> {\n const contextPath = path.join(getProjectDir(projectName), 'context.json')\n\n if (!(await fs.pathExists(contextPath))) {\n return null\n }\n\n try {\n const content = await fs.readJson(contextPath)\n return ContextJsonSchema.parse(content)\n } catch {\n return null\n }\n}\n\n/**\n * Suggest a project name from the directory name\n */\nexport function suggestProjectName(dirPath: string): string {\n const dirName = path.basename(dirPath)\n // Convert to kebab-case, remove special chars\n return dirName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n}\n\n/**\n * Interactive project setup\n * Returns the project name that was set up\n */\nexport async function setupProject(\n targetPath: string,\n kitName: string,\n options: { silent?: boolean } = {}\n): Promise<string | null> {\n // Check if already linked to a project\n const existingAiorg = await readAiorgFile(targetPath)\n if (existingAiorg) {\n // Already has a project, just add the kit\n await addKitToProject(existingAiorg.project, kitName)\n\n if (!options.silent) {\n const context = await readProjectContext(existingAiorg.project)\n if (context) {\n logger.blank()\n logger.info(`Linked to project: ${pc.cyan(existingAiorg.project)}`)\n if (context.business?.name) {\n logger.log(pc.dim(` Business: ${context.business.name}`))\n }\n if (context.installedKits && context.installedKits.length > 0) {\n logger.log(pc.dim(` Installed kits: ${context.installedKits.join(', ')}`))\n }\n }\n }\n\n return existingAiorg.project\n }\n\n // Initialize ~/.aiorg/ if needed\n await initializeAiorg()\n\n // Get existing projects\n const existingProjects = await listProjects()\n\n let projectName: string\n\n if (existingProjects.length > 0) {\n // Ask: new or existing project?\n logger.blank()\n logger.header('Project Setup')\n logger.log(pc.dim('AI Org kits can share context across a project.'))\n logger.blank()\n\n const projectChoice = await p.select({\n message: 'Link this kit to:',\n options: [\n ...existingProjects.map(name => ({\n value: name,\n label: name,\n hint: 'existing project',\n })),\n {\n value: '__new__',\n label: 'Create new project',\n hint: 'start fresh',\n },\n ],\n })\n\n if (p.isCancel(projectChoice)) {\n return null\n }\n\n if (projectChoice === '__new__') {\n // Create new project\n const newProjectName = await askForNewProject(targetPath, kitName)\n if (!newProjectName) return null\n projectName = newProjectName\n } else {\n projectName = projectChoice as string\n // Add kit to existing project\n await addKitToProject(projectName, kitName)\n }\n } else {\n // First project ever\n logger.blank()\n logger.header('Project Setup')\n logger.log(pc.dim('AI Org kits share context through projects.'))\n logger.log(pc.dim('This helps kits work together and share data.'))\n logger.blank()\n\n const newProjectName = await askForNewProject(targetPath, kitName)\n if (!newProjectName) return null\n projectName = newProjectName\n }\n\n // Create .aiorg file\n await writeAiorgFile(targetPath, projectName)\n\n // Show success\n if (!options.silent) {\n logger.blank()\n logger.success(`Project ${pc.cyan(projectName)} linked`)\n logger.log(pc.dim(` Context: ~/.aiorg/projects/${projectName}/`))\n }\n\n return projectName\n}\n\n/**\n * Ask user for new project details and create it\n */\nasync function askForNewProject(\n targetPath: string,\n kitName: string\n): Promise<string | null> {\n const suggestedName = suggestProjectName(targetPath)\n\n const projectName = await p.text({\n message: 'Project name:',\n placeholder: suggestedName,\n defaultValue: suggestedName,\n validate: (value) => {\n if (!value) return 'Project name is required'\n if (!/^[a-z0-9-]+$/.test(value)) {\n return 'Use lowercase letters, numbers, and hyphens only'\n }\n return undefined\n },\n })\n\n if (p.isCancel(projectName)) {\n return null\n }\n\n // Generate default display name from project name (title case)\n const defaultDisplayName = (projectName as string)\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ')\n\n // Create the project with project name as display name\n // Business kits can update this later via /setup\n await createProject(\n projectName as string,\n defaultDisplayName,\n kitName\n )\n\n return projectName as string\n}\n\n/**\n * Check if this is an existing kit installation that needs migration\n * (has kit files but no .aiorg file)\n */\nexport async function needsProjectMigration(dirPath: string): Promise<boolean> {\n const aiorgFile = await readAiorgFile(dirPath)\n if (aiorgFile) {\n // Already has project link\n return false\n }\n\n // Check for signs of existing kit installation\n const hasClaudeDir = await fs.pathExists(path.join(dirPath, '.claude'))\n const hasVersionJson = await fs.pathExists(path.join(dirPath, '.claude', 'version.json'))\n\n return hasClaudeDir && hasVersionJson\n}\n\n/**\n * Migrate an existing installation to the project system\n */\nexport async function migrateToProjectSystem(\n dirPath: string,\n kitName: string\n): Promise<string | null> {\n logger.blank()\n logger.info('This kit installation needs to be linked to a project.')\n logger.log(pc.dim('Projects allow kits to share context and work together.'))\n\n return setupProject(dirPath, kitName)\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport path from 'path'\nimport semver from 'semver'\nimport { detectKitInCwd, detectKit } from '../lib/detect.js'\nimport { getLicenseKey, isLoggedIn } from '../lib/auth.js'\nimport { fetchLatestVersion, getDownloadUrl, downloadFile } from '../lib/api.js'\nimport {\n createTempDir,\n saveToFile,\n extractZipToDir,\n cleanupTempDir,\n getFileSizeKB,\n} from '../lib/extract.js'\nimport { applyFileCategories, isGitRepo, createGitBackup } from '../lib/apply.js'\nimport { needsProjectMigration, migrateToProjectSystem, readAiorgFile, addKitToProject } from '../lib/project.js'\nimport * as logger from '../utils/logger.js'\nimport { login } from './login.js'\n\ninterface UpgradeOptions {\n yes?: boolean\n backup?: boolean\n}\n\nexport async function upgrade(options: UpgradeOptions): Promise<void> {\n p.intro(pc.cyan('aiorg upgrade'))\n\n // Detect kit in current directory\n const kit = await detectKitInCwd()\n\n if (!kit) {\n logger.error('Not in a kit directory')\n logger.log(pc.dim('Run this command from a folder with .claude/version.json'))\n process.exit(1)\n }\n\n logger.keyValue('Kit', pc.magenta(kit.displayName))\n logger.keyValue('Current version', pc.cyan(`v${kit.version}`))\n\n // Check if this installation needs project migration\n if (await needsProjectMigration(kit.rootPath)) {\n const projectName = await migrateToProjectSystem(kit.rootPath, kit.name)\n if (!projectName) {\n // User cancelled migration - that's OK, continue with upgrade\n logger.blank()\n logger.log(pc.dim('Skipping project setup. You can run it later.'))\n }\n } else {\n // Already has project, just ensure kit is listed\n const aiorgFile = await readAiorgFile(kit.rootPath)\n if (aiorgFile) {\n await addKitToProject(aiorgFile.project, kit.name)\n }\n }\n\n // Check for updates\n const spinner = p.spinner()\n spinner.start('Checking for updates...')\n\n let latest\n try {\n latest = await fetchLatestVersion(kit.name)\n spinner.stop('Version info fetched')\n } catch (error) {\n spinner.stop('Failed to check for updates')\n throw error\n }\n\n // Compare versions\n if (!semver.gt(latest.version, kit.version)) {\n logger.blank()\n logger.success(`Already on latest version (${pc.cyan(`v${kit.version}`)})`)\n p.outro('')\n return\n }\n\n // Show update available\n logger.blank()\n logger.log(\n `Update available: ${pc.cyan(`v${kit.version}`)} → ${pc.green(`v${latest.version}`)}`\n )\n\n // Show changelog for ALL intermediate versions\n // API returns allVersions array with { version, changelog, releasedAt } objects\n if (latest.allVersions && Array.isArray(latest.allVersions)) {\n // Filter versions between current and latest (exclusive current, inclusive latest)\n const versionsToShow = latest.allVersions\n .filter((v: { version: string }) => {\n if (!semver.valid(v.version)) return false\n try {\n return semver.gt(v.version, kit.version) && semver.lte(v.version, latest.version)\n } catch {\n return false\n }\n })\n .sort((a: { version: string }, b: { version: string }) =>\n semver.rcompare(a.version, b.version)\n ) // newest first\n\n if (versionsToShow.length > 0) {\n logger.blank()\n const versionCount = versionsToShow.length\n logger.header(`Changelog (${versionCount} version${versionCount > 1 ? 's' : ''})`)\n\n for (const versionEntry of versionsToShow) {\n const { version, changelog: entry } = versionEntry as {\n version: string\n changelog: { highlights?: string[]; added?: string[]; upgradeNotes?: string }\n }\n if (!entry) continue\n\n // Version header with highlights\n const highlights = entry.highlights?.join(', ') || ''\n logger.blank()\n logger.log(`${pc.green(`v${version}`)}${highlights ? ` - ${pc.white(highlights)}` : ''}`)\n\n // Show first 2 added items (condensed)\n if (entry.added && entry.added.length > 0) {\n for (const item of entry.added.slice(0, 2)) {\n logger.log(pc.dim(` + ${item}`))\n }\n if (entry.added.length > 2) {\n logger.log(pc.dim(` + ... and ${entry.added.length - 2} more`))\n }\n }\n\n // Show upgrade notes if present (important for breaking changes)\n if (entry.upgradeNotes && version === latest.version) {\n logger.log(pc.yellow(` Note: ${entry.upgradeNotes}`))\n }\n }\n }\n }\n\n // Show what will be preserved\n logger.blank()\n logger.log('Your data will be preserved:')\n const neverTouch = kit.versionJson.fileCategories?.neverTouch ?? []\n for (const pattern of neverTouch.slice(0, 5)) {\n logger.listItem(pc.dim(pattern))\n }\n if (neverTouch.length > 5) {\n logger.log(pc.dim(` ... and ${neverTouch.length - 5} more patterns`))\n }\n\n // Confirm upgrade\n if (!options.yes) {\n logger.blank()\n const shouldUpgrade = await p.confirm({\n message: 'Proceed with upgrade?',\n initialValue: true,\n })\n\n if (p.isCancel(shouldUpgrade) || !shouldUpgrade) {\n p.cancel('Upgrade cancelled')\n return\n }\n }\n\n // Check if kit is free (no license required)\n const isFreeKit = latest.tier === 'free'\n let licenseKey: string | null = null\n\n // Only require login for paid kits\n if (!isFreeKit) {\n if (!(await isLoggedIn())) {\n logger.blank()\n logger.info('Login required for download')\n await login()\n logger.blank()\n }\n\n licenseKey = await getLicenseKey()\n if (!licenseKey) {\n logger.error('No license key found')\n process.exit(1)\n }\n }\n\n // Git backup\n const inGitRepo = await isGitRepo(kit.rootPath)\n if (inGitRepo) {\n if (options.backup) {\n spinner.start('Creating git backup...')\n const created = await createGitBackup(\n kit.rootPath,\n `chore: backup before upgrade to v${latest.version}`\n )\n spinner.stop(created ? 'Git backup created' : 'No changes to backup')\n } else if (!options.yes) {\n const shouldBackup = await p.confirm({\n message: 'Create git backup commit first?',\n initialValue: true,\n })\n\n if (shouldBackup === true) {\n spinner.start('Creating git backup...')\n const created = await createGitBackup(\n kit.rootPath,\n `chore: backup before upgrade to v${latest.version}`\n )\n spinner.stop(created ? 'Git backup created' : 'No changes to backup')\n }\n }\n }\n\n // Get download URL\n if (isFreeKit) {\n spinner.start('Getting download URL...')\n } else {\n spinner.start('Verifying license...')\n }\n\n let downloadInfo\n try {\n downloadInfo = await getDownloadUrl(kit.name, licenseKey)\n spinner.stop(isFreeKit ? 'Ready to download' : 'License verified')\n } catch (error) {\n spinner.stop(isFreeKit ? 'Failed to get download URL' : 'License verification failed')\n throw error\n }\n\n // Download\n spinner.start(`Downloading v${latest.version}...`)\n\n let tempDir: string | null = null\n try {\n tempDir = await createTempDir('aiorg-upgrade-')\n const zipPath = path.join(tempDir, 'kit.zip')\n const extractPath = path.join(tempDir, 'extracted')\n\n const zipData = await downloadFile(downloadInfo.downloadUrl)\n await saveToFile(zipData, zipPath)\n\n const sizeKB = await getFileSizeKB(zipPath)\n spinner.stop(`Downloaded v${latest.version} (${sizeKB} KB)`)\n\n // Extract to temp\n spinner.start('Extracting...')\n await extractZipToDir(zipPath, extractPath)\n spinner.stop('Extracted')\n\n // Read fileCategories from NEW version (extracted), not old local version\n // This is critical - old kit might not have fileCategories defined\n const newKit = await detectKit(extractPath)\n if (!newKit) {\n throw new Error('Failed to read version.json from downloaded kit')\n }\n\n // Apply fileCategories from new version\n spinner.start('Applying updates...')\n const result = await applyFileCategories(\n extractPath,\n kit.rootPath,\n newKit.versionJson\n )\n spinner.stop('Updates applied')\n\n // Show summary\n logger.blank()\n logger.success(\n `Upgraded ${kit.displayName}: ${pc.cyan(`v${kit.version}`)} → ${pc.green(`v${latest.version}`)}`\n )\n logger.blank()\n logger.keyValue('Files updated', String(result.replaced.length))\n if (result.merged.length > 0) {\n logger.keyValue('Files merged', String(result.merged.length))\n }\n if (result.added.length > 0) {\n logger.keyValue('Files added', String(result.added.length))\n }\n logger.keyValue('Files preserved', String(result.skipped.length))\n\n if (result.errors.length > 0) {\n logger.blank()\n logger.warn(`${result.errors.length} errors occurred:`)\n for (const err of result.errors) {\n logger.listItem(pc.dim(err))\n }\n }\n\n // Cleanup\n await cleanupTempDir(tempDir)\n } catch (error) {\n if (tempDir) {\n await cleanupTempDir(tempDir)\n }\n throw error\n }\n\n // Post-upgrade note\n logger.blank()\n logger.log(pc.yellow('⚠️ Restart Claude Code to use new commands'))\n logger.log(pc.dim(' Type \"exit\" then start a new session'))\n\n p.outro(pc.green('Upgrade complete!'))\n}\n","import fs from 'fs-extra'\nimport path from 'path'\nimport { z } from 'zod'\n\nconst VersionJsonSchema = z.object({\n version: z.string(),\n packageName: z.string(),\n packageDisplayName: z.string().optional(),\n releasedAt: z.string().optional(),\n minUpgradeFrom: z.string().optional(),\n fileCategories: z\n .object({\n alwaysReplace: z.array(z.string()).optional(),\n neverTouch: z.array(z.string()).optional(),\n mergeIfChanged: z.array(z.string()).optional(),\n addOnly: z.array(z.string()).optional(),\n })\n .optional(),\n changelog: z.record(z.string(), z.any()).optional(),\n})\n\nconst KitJsonSchema = z.object({\n name: z.string(),\n displayName: z.string().optional(),\n type: z.enum(['bootstrap', 'inject']).optional(),\n})\n\nexport type VersionJson = z.infer<typeof VersionJsonSchema>\nexport type KitJson = z.infer<typeof KitJsonSchema>\n\nexport interface DetectedKit {\n name: string\n displayName: string\n version: string\n versionJson: VersionJson\n kitJson?: KitJson\n rootPath: string\n}\n\n/**\n * Detect kit in a directory by looking for .claude/version.json or .claude/kit.json\n */\nexport async function detectKit(dirPath: string): Promise<DetectedKit | null> {\n const versionJsonPath = path.join(dirPath, '.claude', 'version.json')\n const kitJsonPath = path.join(dirPath, '.claude', 'kit.json')\n\n // Check for version.json (required)\n if (!(await fs.pathExists(versionJsonPath))) {\n return null\n }\n\n try {\n const versionRaw = await fs.readJson(versionJsonPath)\n const versionJson = VersionJsonSchema.parse(versionRaw)\n\n // Optionally load kit.json\n let kitJson: KitJson | undefined\n if (await fs.pathExists(kitJsonPath)) {\n try {\n const kitRaw = await fs.readJson(kitJsonPath)\n kitJson = KitJsonSchema.parse(kitRaw)\n } catch {\n // Ignore kit.json parse errors\n }\n }\n\n return {\n name: kitJson?.name ?? versionJson.packageName,\n displayName:\n kitJson?.displayName ??\n versionJson.packageDisplayName ??\n versionJson.packageName,\n version: versionJson.version,\n versionJson,\n kitJson,\n rootPath: dirPath,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Detect kit in current working directory\n */\nexport async function detectKitInCwd(): Promise<DetectedKit | null> {\n return detectKit(process.cwd())\n}\n\n/**\n * Get file categories from version.json\n */\nexport function getFileCategories(versionJson: VersionJson): {\n alwaysReplace: string[]\n neverTouch: string[]\n mergeIfChanged: string[]\n addOnly: string[]\n} {\n return {\n alwaysReplace: versionJson.fileCategories?.alwaysReplace ?? [],\n neverTouch: versionJson.fileCategories?.neverTouch ?? [],\n mergeIfChanged: versionJson.fileCategories?.mergeIfChanged ?? [],\n addOnly: versionJson.fileCategories?.addOnly ?? [],\n }\n}\n","import fs from 'fs-extra'\nimport path from 'path'\nimport { glob } from 'glob'\nimport { minimatch } from 'minimatch'\nimport { merge } from 'lodash-es'\nimport type { VersionJson } from './detect.js'\n\n/**\n * Safely extract error message from unknown error\n */\nfunction getErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message\n return String(err)\n}\n\nexport interface ApplyResult {\n replaced: string[]\n merged: string[]\n added: string[]\n skipped: string[]\n errors: string[]\n}\n\n/**\n * Apply fileCategories from source to destination\n * - alwaysReplace: copy/overwrite from source\n * - neverTouch: skip entirely\n * - mergeIfChanged: deep merge JSON files (user values win)\n * - addOnly: add only if file doesn't exist\n */\nexport async function applyFileCategories(\n sourceDir: string,\n destDir: string,\n versionJson: VersionJson\n): Promise<ApplyResult> {\n const result: ApplyResult = {\n replaced: [],\n merged: [],\n added: [],\n skipped: [],\n errors: [],\n }\n\n const alwaysReplace = versionJson.fileCategories?.alwaysReplace ?? []\n const neverTouch = versionJson.fileCategories?.neverTouch ?? []\n const mergeIfChanged = versionJson.fileCategories?.mergeIfChanged ?? []\n const addOnly = versionJson.fileCategories?.addOnly ?? []\n\n // Track processed files to avoid duplicates\n const processedFiles = new Set<string>()\n\n // 1. Process alwaysReplace patterns\n for (const pattern of alwaysReplace) {\n try {\n const files = await glob(pattern, {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n })\n\n for (const file of files) {\n if (processedFiles.has(file)) continue\n\n // Check if file matches any neverTouch pattern\n const shouldSkip = neverTouch.some((ntPattern) => {\n return matchesPattern(file, ntPattern)\n })\n\n if (shouldSkip) {\n result.skipped.push(file)\n processedFiles.add(file)\n continue\n }\n\n const srcPath = path.join(sourceDir, file)\n const destPath = path.join(destDir, file)\n\n try {\n await fs.ensureDir(path.dirname(destPath))\n await fs.copy(srcPath, destPath, { overwrite: true })\n result.replaced.push(file)\n processedFiles.add(file)\n } catch (err) {\n result.errors.push(`Failed to copy ${file}: ${getErrorMessage(err)}`)\n }\n }\n } catch (err) {\n result.errors.push(`Failed to process pattern ${pattern}: ${getErrorMessage(err)}`)\n }\n }\n\n // 2. Process mergeIfChanged patterns (JSON deep merge)\n for (const pattern of mergeIfChanged) {\n try {\n const files = await glob(pattern, {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n })\n\n for (const file of files) {\n if (processedFiles.has(file)) continue\n\n // Check if file matches any neverTouch pattern\n const shouldSkip = neverTouch.some((ntPattern) => {\n return matchesPattern(file, ntPattern)\n })\n\n if (shouldSkip) {\n result.skipped.push(file)\n processedFiles.add(file)\n continue\n }\n\n const srcPath = path.join(sourceDir, file)\n const destPath = path.join(destDir, file)\n\n try {\n const destExists = await fs.pathExists(destPath)\n\n if (destExists && file.endsWith('.json')) {\n // Merge JSON files - user's values win (existing overwrites incoming)\n const incoming = await fs.readJson(srcPath)\n const existing = await fs.readJson(destPath)\n\n // Deep merge: start with incoming, overlay existing (user's changes win)\n const merged = merge({}, incoming, existing)\n\n await fs.writeJson(destPath, merged, { spaces: 2 })\n result.merged.push(file)\n } else if (destExists) {\n // Non-JSON file exists - skip (preserve user's version)\n result.skipped.push(file)\n } else {\n // File doesn't exist - copy it\n await fs.ensureDir(path.dirname(destPath))\n await fs.copy(srcPath, destPath)\n result.replaced.push(file)\n }\n processedFiles.add(file)\n } catch (err) {\n result.errors.push(`Failed to merge ${file}: ${getErrorMessage(err)}`)\n }\n }\n } catch (err) {\n result.errors.push(`Failed to process merge pattern ${pattern}: ${getErrorMessage(err)}`)\n }\n }\n\n // 3. Process addOnly patterns (add if missing)\n for (const pattern of addOnly) {\n try {\n const files = await glob(pattern, {\n cwd: sourceDir,\n dot: true,\n nodir: true,\n })\n\n for (const file of files) {\n if (processedFiles.has(file)) continue\n\n // Check if file matches any neverTouch pattern\n const shouldSkip = neverTouch.some((ntPattern) => {\n return matchesPattern(file, ntPattern)\n })\n\n if (shouldSkip) {\n result.skipped.push(file)\n processedFiles.add(file)\n continue\n }\n\n const srcPath = path.join(sourceDir, file)\n const destPath = path.join(destDir, file)\n\n try {\n const destExists = await fs.pathExists(destPath)\n\n if (!destExists) {\n // Only add if file doesn't exist\n await fs.ensureDir(path.dirname(destPath))\n await fs.copy(srcPath, destPath)\n result.added.push(file)\n } else {\n // File exists - skip\n result.skipped.push(file)\n }\n processedFiles.add(file)\n } catch (err) {\n result.errors.push(`Failed to add ${file}: ${getErrorMessage(err)}`)\n }\n }\n } catch (err) {\n result.errors.push(`Failed to process addOnly pattern ${pattern}: ${getErrorMessage(err)}`)\n }\n }\n\n return result\n}\n\n/**\n * Pattern matching using minimatch (supports *, **, etc.)\n */\nfunction matchesPattern(filePath: string, pattern: string): boolean {\n return minimatch(filePath, pattern, { dot: true })\n}\n\n/**\n * Check if git is available and directory is a git repo\n */\nexport async function isGitRepo(dirPath: string): Promise<boolean> {\n try {\n const gitDir = path.join(dirPath, '.git')\n return await fs.pathExists(gitDir)\n } catch {\n return false\n }\n}\n\n/**\n * Create a git backup commit\n */\nexport async function createGitBackup(\n dirPath: string,\n message: string\n): Promise<boolean> {\n try {\n const { spawnSync } = await import('child_process')\n\n // Stage all changes\n spawnSync('git', ['add', '-A'], { cwd: dirPath, stdio: 'pipe' })\n\n // Check if there are changes to commit\n const diffResult = spawnSync('git', ['diff', '--cached', '--quiet'], {\n cwd: dirPath,\n stdio: 'pipe',\n })\n\n if (diffResult.status === 0) {\n // No changes\n return false\n }\n\n // Has changes, commit them (using spawnSync to avoid shell injection)\n const commitResult = spawnSync('git', ['commit', '-m', message], {\n cwd: dirPath,\n stdio: 'pipe',\n })\n\n return commitResult.status === 0\n } catch {\n return false\n }\n}\n","import pc from 'picocolors'\nimport semver from 'semver'\nimport { detectKitInCwd } from '../lib/detect.js'\nimport { fetchLatestVersion } from '../lib/api.js'\nimport * as logger from '../utils/logger.js'\n\nconst CLI_VERSION = '1.0.0'\n\nexport async function version(): Promise<void> {\n logger.header('aiorg version')\n\n // CLI version\n logger.keyValue('CLI', pc.cyan(`v${CLI_VERSION}`))\n\n // Detect kit in current directory\n const kit = await detectKitInCwd()\n\n if (!kit) {\n logger.blank()\n logger.info('No kit detected in current directory')\n logger.log(pc.dim('Run this command from a folder containing a kit'))\n return\n }\n\n // Show current kit version\n logger.keyValue(kit.displayName, pc.cyan(`v${kit.version}`))\n\n // Check for updates\n try {\n const latest = await fetchLatestVersion(kit.name)\n\n if (semver.gt(latest.version, kit.version)) {\n logger.blank()\n logger.warn(\n `Update available: ${pc.cyan(`v${kit.version}`)} → ${pc.green(`v${latest.version}`)}`\n )\n logger.log(pc.dim(\"Run 'aiorg upgrade' to update\"))\n } else {\n logger.blank()\n logger.success('You are on the latest version')\n }\n } catch {\n // Silently ignore API errors for version check\n logger.blank()\n logger.log(pc.dim('Could not check for updates'))\n }\n}\n","import pc from 'picocolors'\nimport { fetchKitsList } from '../lib/api.js'\nimport * as logger from '../utils/logger.js'\n\n/**\n * Format price in cents to display string\n */\nfunction formatPrice(cents: number): string {\n if (cents === 0) return ''\n return `$${(cents / 100).toFixed(0)}`\n}\n\n/**\n * List all available kits\n */\nexport async function list(): Promise<void> {\n const { kits } = await fetchKitsList()\n\n if (kits.length === 0) {\n logger.warn('No kits available')\n return\n }\n\n // Group by tier\n const freeKits = kits.filter(k => k.tier === 'free')\n const paidKits = kits.filter(k => k.tier === 'paid')\n\n logger.blank()\n console.log(pc.bold('Available Kits'))\n logger.blank()\n\n // Free kits\n if (freeKits.length > 0) {\n console.log(pc.green(pc.bold('FREE')))\n logger.blank()\n for (const kit of freeKits) {\n printKit(kit)\n }\n }\n\n // Paid kits\n if (paidKits.length > 0) {\n console.log(pc.yellow(pc.bold('PAID')))\n logger.blank()\n for (const kit of paidKits) {\n printKit(kit)\n }\n }\n\n // Footer\n console.log(pc.dim('─'.repeat(50)))\n logger.blank()\n console.log(pc.dim('Free kits work without login.'))\n console.log(pc.dim(`Run '${pc.cyan('aiorg login')}' first for paid kits.`))\n console.log(pc.dim(`Visit ${pc.cyan('https://aiorg.dev')} for details.`))\n logger.blank()\n}\n\nfunction printKit(kit: {\n name: string\n displayName: string\n description: string | null\n tier: 'free' | 'paid'\n version: string\n priceCents: number\n}): void {\n const price = formatPrice(kit.priceCents)\n const priceStr = price ? pc.yellow(price) : ''\n\n // Kit name and version\n console.log(\n ` ${pc.bold(kit.name.padEnd(24))} ${pc.cyan(`v${kit.version}`)} ${priceStr}`\n )\n\n // Description\n if (kit.description) {\n console.log(` ${pc.dim(kit.description)}`)\n }\n\n // Example command\n console.log(\n ` ${pc.dim('→')} ${pc.dim('npx @aiorg/cli init')} ${pc.magenta(kit.name)} ${pc.dim('~/my-project')}`\n )\n\n logger.blank()\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\nimport { detectKitInCwd } from '../lib/detect.js'\nimport {\n readAiorgFile,\n readProjectContext,\n listProjects,\n getProjectDir,\n} from '../lib/project.js'\nimport * as logger from '../utils/logger.js'\n\nexport async function status(): Promise<void> {\n p.intro(pc.cyan('aiorg status'))\n\n // Check for kit in current directory\n const kit = await detectKitInCwd()\n const aiorgFile = await readAiorgFile(process.cwd())\n\n if (!kit && !aiorgFile) {\n // Show global status\n const projects = await listProjects()\n\n if (projects.length === 0) {\n logger.info('No AI Org projects found')\n logger.blank()\n logger.log(pc.dim('Get started with:'))\n logger.listItem('npx @aiorg/cli init <kit-name> <path>')\n p.outro('')\n return\n }\n\n logger.header('Your Projects')\n\n for (const projectName of projects) {\n const context = await readProjectContext(projectName)\n if (context) {\n logger.blank()\n logger.log(pc.cyan(projectName))\n if (context.business?.name) {\n logger.log(pc.dim(` Business: ${context.business.name}`))\n }\n if (context.business?.stage) {\n logger.log(pc.dim(` Stage: ${context.business.stage}`))\n }\n if (context.installedKits && context.installedKits.length > 0) {\n logger.log(pc.dim(` Kits: ${context.installedKits.join(', ')}`))\n }\n if (context.pmf?.status && context.pmf.status !== 'not-started') {\n logger.log(pc.dim(` PMF: ${context.pmf.status}`))\n }\n } else {\n logger.blank()\n logger.log(pc.cyan(projectName))\n logger.log(pc.dim(' (no context)'))\n }\n }\n\n logger.blank()\n logger.log(pc.dim(`Projects stored in: ~/.aiorg/projects/`))\n p.outro('')\n return\n }\n\n // Show status for current directory\n if (kit) {\n logger.keyValue('Kit', pc.magenta(kit.displayName))\n logger.keyValue('Version', pc.cyan(`v${kit.version}`))\n }\n\n if (aiorgFile) {\n logger.keyValue('Project', pc.cyan(aiorgFile.project))\n\n const context = await readProjectContext(aiorgFile.project)\n if (context) {\n logger.blank()\n logger.header('Project Context')\n\n if (context.business?.name) {\n logger.keyValue('Business', context.business.name)\n }\n if (context.business?.stage) {\n logger.keyValue('Stage', context.business.stage)\n }\n if (context.validation?.ideaValidated) {\n logger.keyValue('Idea Validated', pc.green('Yes'))\n if (context.validation.ideaScore) {\n logger.keyValue('Idea Score', `${context.validation.ideaScore}/100`)\n }\n }\n if (context.pmf?.status && context.pmf.status !== 'not-started') {\n const pmfColor = context.pmf.status === 'achieved' ? pc.green : pc.yellow\n logger.keyValue('PMF Status', pmfColor(context.pmf.status))\n if (context.pmf.score !== null && context.pmf.score !== undefined) {\n logger.keyValue('PMF Score', `${context.pmf.score}/100`)\n }\n }\n if (context.installedKits && context.installedKits.length > 0) {\n logger.blank()\n logger.log(pc.dim('Installed kits:'))\n for (const kitName of context.installedKits) {\n logger.listItem(kitName)\n }\n }\n\n logger.blank()\n logger.log(pc.dim(`Context: ~/.aiorg/projects/${aiorgFile.project}/`))\n }\n } else if (kit) {\n logger.blank()\n logger.warn('Not linked to a project')\n logger.log(pc.dim('Run upgrade to set up project linking'))\n }\n\n p.outro('')\n}\n"],"mappings":";;;AAAA,OAAO,SAAS;;;ACAhB,YAAY,OAAO;AACnB,OAAOA,SAAQ;;;ACDf,SAAS,SAAS;AAElB,IAAM,eAAe,QAAQ,IAAI,eAAe,KAAK,KAAK;AAC1D,IAAM,iBAAiB;AAKvB,eAAe,iBACb,KACA,UAAuB,CAAC,GACxB,YAAoB,gBACD;AACnB,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAE9D,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,GAAG;AAAA,MACH,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,WAAO;AAAA,EACT,UAAE;AACA,iBAAa,OAAO;AAAA,EACtB;AACF;AAGA,IAAM,sBAAsB,EAAE,OAAO;AAAA,EACnC,SAAS,EAAE,OAAO;AAAA,EAClB,YAAY,EAAE,OAAO;AAAA,EACrB,aAAa,EAAE,OAAO;AAAA,EACtB,oBAAoB,EAAE,OAAO;AAAA,EAC7B,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClD,aAAa,EACV;AAAA,IACC,EAAE,OAAO;AAAA,MACP,SAAS,EAAE,OAAO;AAAA,MAClB,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MAClD,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAClC,CAAC;AAAA,EACH,EACC,SAAS;AAAA,EACZ,MAAM,EAAE,KAAK,CAAC,QAAQ,QAAQ,SAAS,CAAC,EAAE,SAAS;AAAA,EACnD,MAAM,EAAE,KAAK,CAAC,YAAY,aAAa,QAAQ,CAAC,EAAE,SAAS;AAC7D,CAAC;AAED,IAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,aAAa,EAAE,OAAO;AAAA,EACtB,SAAS,EAAE,OAAO;AAAA,EAClB,UAAU,EAAE,OAAO;AACrB,CAAC;AAED,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAC3C,OAAO,EAAE,QAAQ;AAAA,EACjB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAM,EACH;AAAA,IACC,EAAE,OAAO;AAAA,MACP,MAAM,EAAE,OAAO;AAAA,MACf,MAAM,EAAE,KAAK,CAAC,QAAQ,QAAQ,SAAS,CAAC;AAAA,MACxC,aAAa,EAAE,OAAO;AAAA,IACxB,CAAC;AAAA,EACH,EACC,SAAS;AAAA,EACZ,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,IAAM,iBAAiB,EAAE,OAAO;AAAA,EAC9B,MAAM,EAAE,MAAM,EAAE,OAAO;AAAA,IACrB,MAAM,EAAE,OAAO;AAAA,IACf,aAAa,EAAE,OAAO;AAAA,IACtB,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,IACjC,MAAM,EAAE,KAAK,CAAC,QAAQ,QAAQ,SAAS,CAAC;AAAA,IACxC,MAAM,EAAE,KAAK,CAAC,YAAY,aAAa,QAAQ,CAAC;AAAA,IAChD,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAChC,SAAS,EAAE,OAAO;AAAA,IAClB,YAAY,EAAE,OAAO;AAAA,EACvB,CAAC,CAAC;AACJ,CAAC;AAOD,IAAM,WAAN,cAAuB,MAAM;AAAA,EAC3B,YACE,SACO,YACP;AACA,UAAM,OAAO;AAFN;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAKA,eAAsB,mBACpB,SACwB;AACxB,QAAM,MAAM,GAAG,YAAY,aAAa,OAAO;AAE/C,MAAI;AACF,UAAM,WAAW,MAAM,iBAAiB,GAAG;AAE3C,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,SAAS,mBAAmB,OAAO,KAAK,GAAG;AAAA,MACvD;AACA,YAAM,IAAI,SAAS,gCAAgC,SAAS,MAAM;AAAA,IACpE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,oBAAoB,MAAM,IAAI;AAAA,EACvC,SAASC,QAAO;AACd,QAAIA,kBAAiB,SAAU,OAAMA;AACrC,QAAIA,kBAAiB,SAASA,OAAM,SAAS,cAAc;AACzD,YAAM,IAAI,SAAS,mBAAmB;AAAA,IACxC;AACA,UAAM,IAAI;AAAA,MACR,kBAAkBA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AAAA,IAC5E;AAAA,EACF;AACF;AAKA,eAAsB,eACpB,SACA,YAC2B;AAC3B,QAAM,MAAM,GAAG,YAAY,aAAa,OAAO;AAE/C,QAAM,UAAkC,CAAC;AACzC,MAAI,YAAY;AACd,YAAQ,gBAAgB,UAAU,UAAU;AAAA,EAC9C;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,iBAAiB,KAAK,EAAE,QAAQ,CAAC;AAExD,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,SAAS,kCAAkC,GAAG;AAAA,MAC1D;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,SAAS,mBAAmB,OAAO,KAAK,GAAG;AAAA,MACvD;AACA,YAAM,IAAI,SAAS,8BAA8B,SAAS,MAAM;AAAA,IAClE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,uBAAuB,MAAM,IAAI;AAAA,EAC1C,SAASA,QAAO;AACd,QAAIA,kBAAiB,SAAU,OAAMA;AACrC,QAAIA,kBAAiB,SAASA,OAAM,SAAS,cAAc;AACzD,YAAM,IAAI,SAAS,mBAAmB;AAAA,IACxC;AACA,UAAM,IAAI;AAAA,MACR,kBAAkBA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AAAA,IAC5E;AAAA,EACF;AACF;AAKA,eAAsB,cACpB,YACA,SACgC;AAChC,QAAM,MAAM,GAAG,YAAY;AAE3B,MAAI;AACF,UAAM,WAAW,MAAM,iBAAiB,KAAK;AAAA,MAC3C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,KAAK;AAAA,QACL,KAAK;AAAA,MACP,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAMC,QAAO,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACnD,YAAM,IAAI;AAAA,QACRA,MAAK,SAAS;AAAA,QACd,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,4BAA4B,MAAM,IAAI;AAAA,EAC/C,SAASD,QAAO;AACd,QAAIA,kBAAiB,SAAU,OAAMA;AACrC,QAAIA,kBAAiB,SAASA,OAAM,SAAS,cAAc;AACzD,YAAM,IAAI,SAAS,mBAAmB;AAAA,IACxC;AACA,UAAM,IAAI;AAAA,MACR,kBAAkBA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AAAA,IAC5E;AAAA,EACF;AACF;AAKA,eAAsB,aAAa,KAAmC;AACpE,QAAM,sBAAsB;AAE5B,MAAI;AACF,UAAM,WAAW,MAAM,iBAAiB,KAAK,CAAC,GAAG,mBAAmB;AAEpE,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,SAAS,mBAAmB,SAAS,MAAM;AAAA,IACvD;AAEA,WAAO,MAAM,SAAS,YAAY;AAAA,EACpC,SAASA,QAAO;AACd,QAAIA,kBAAiB,SAAU,OAAMA;AACrC,QAAIA,kBAAiB,SAASA,OAAM,SAAS,cAAc;AACzD,YAAM,IAAI,SAAS,oBAAoB;AAAA,IACzC;AACA,UAAM,IAAI;AAAA,MACR,oBAAoBA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AAAA,IAC9E;AAAA,EACF;AACF;AAKA,eAAsB,gBAA2C;AAC/D,QAAM,MAAM,GAAG,YAAY;AAE3B,MAAI;AACF,UAAM,WAAW,MAAM,iBAAiB,GAAG;AAE3C,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,SAAS,6BAA6B,SAAS,MAAM;AAAA,IACjE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,eAAe,MAAM,IAAI;AAAA,EAClC,SAASA,QAAO;AACd,QAAIA,kBAAiB,SAAU,OAAMA;AACrC,QAAIA,kBAAiB,SAASA,OAAM,SAAS,cAAc;AACzD,YAAM,IAAI,SAAS,mBAAmB;AAAA,IACxC;AACA,UAAM,IAAI;AAAA,MACR,kBAAkBA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AAAA,IAC5E;AAAA,EACF;AACF;;;ACxQA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,KAAAE,UAAS;AAElB,IAAM,aAAa,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ;AACnD,IAAM,cAAc,KAAK,KAAK,YAAY,aAAa;AAEvD,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EAChC,MAAMA,GAAE,KAAK,CAAC,QAAQ,QAAQ,SAAS,CAAC;AAAA,EACxC,aAAaA,GAAE,OAAO;AACxB,CAAC;AAED,IAAM,eAAeA,GAAE,OAAO;AAAA,EAC5B,YAAYA,GAAE,OAAO;AAAA,EACrB,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAMA,GAAE,OAAOA,GAAE,OAAO,GAAG,gBAAgB,EAAE,SAAS;AACxD,CAAC;AAsBD,eAAsB,kBAAiC;AACrD,QAAM,GAAG,UAAU,UAAU;AAC/B;AAKA,eAAsB,aAA+B;AACnD,MAAI;AACF,UAAM,SAAS,MAAM,WAAW;AAChC,WAAO,CAAC,CAAC,QAAQ;AAAA,EACnB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,aAAqC;AACzD,MAAI;AACF,QAAI,CAAE,MAAM,GAAG,WAAW,WAAW,GAAI;AACvC,aAAO;AAAA,IACT;AACA,UAAM,MAAM,MAAM,GAAG,SAAS,WAAW;AACzC,WAAO,aAAa,MAAM,GAAG;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,WAAW,QAA+B;AAC9D,QAAM,gBAAgB;AACtB,QAAM,GAAG,UAAU,aAAa,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACvD;AAKA,eAAsB,gBAAwC;AAE5D,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,MAAM,WAAW;AAChC,SAAO,QAAQ,cAAc;AAC/B;AAKA,eAAsB,eACpB,YACA,OACA,MACe;AACf,QAAM,WAAW,MAAM,WAAW;AAClC,QAAM,WAAW;AAAA,IACf,GAAI,YAAY,CAAC;AAAA,IACjB;AAAA,IACA,OAAO,SAAS,UAAU;AAAA,IAC1B,MAAM,QAAQ,UAAU;AAAA,EAC1B,CAAC;AACH;AAKA,eAAsB,cAA6B;AACjD,MAAI;AACF,UAAM,GAAG,OAAO,WAAW;AAAA,EAC7B,QAAQ;AAAA,EAER;AACF;;;ACvHA,OAAO,QAAQ;AAKR,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,IAAI,GAAG,MAAM,QAAG,GAAG,OAAO;AACpC;AAKO,SAAS,MAAM,SAAuB;AAC3C,UAAQ,IAAI,GAAG,IAAI,QAAG,GAAG,OAAO;AAClC;AAKO,SAAS,KAAK,SAAuB;AAC1C,UAAQ,IAAI,GAAG,OAAO,GAAG,GAAG,OAAO;AACrC;AAKO,SAAS,KAAK,SAAuB;AAC1C,UAAQ,IAAI,GAAG,KAAK,QAAG,GAAG,OAAO;AACnC;AAKO,SAAS,IAAI,SAAuB;AACzC,UAAQ,IAAI,OAAO;AACrB;AAKO,SAAS,QAAc;AAC5B,UAAQ,IAAI;AACd;AAKO,SAAS,OAAO,OAAqB;AAC1C,UAAQ,IAAI;AACZ,UAAQ,IAAI,GAAG,KAAK,KAAK,CAAC;AAC1B,UAAQ,IAAI,GAAG,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACpC;AAKO,SAAS,SAAS,KAAa,OAAqB;AACzD,UAAQ,IAAI,GAAG,GAAG,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,EAAE;AAC7C;AAKO,SAAS,SAAS,MAAc,SAAiB,GAAS;AAC/D,QAAM,SAAS,KAAK,OAAO,MAAM;AACjC,UAAQ,IAAI,GAAG,MAAM,GAAG,GAAG,IAAI,QAAG,CAAC,IAAI,IAAI,EAAE;AAC/C;;;AH5DA,eAAsB,QAAuB;AAC3C,EAAE,QAAMC,IAAG,KAAK,aAAa,CAAC;AAG9B,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,iBAAiB,MAAQ,UAAQ;AAAA,MACrC,SAAS,oBAAoB,QAAQ,QAAQ,OAAOA,IAAG,KAAK,OAAO,KAAK,CAAC,KAAK,EAAE;AAAA,MAChF,cAAc;AAAA,IAChB,CAAC;AAED,QAAM,WAAS,cAAc,KAAK,CAAC,gBAAgB;AACjD,MAAE,QAAM,iBAAiB;AACzB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,MAAQ,OAAK;AAAA,IAC9B,SAAS;AAAA,IACT,aAAa;AAAA,IACb,UAAU,CAAC,UAAU;AACnB,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,CAAC,MAAM,WAAW,KAAK,EAAG,QAAO;AACrC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAM,WAAS,UAAU,GAAG;AAC1B,IAAE,SAAO,iBAAiB;AAC1B,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAMC,WAAY,UAAQ;AAC1B,EAAAA,SAAQ,MAAM,sBAAsB;AAEpC,MAAI;AACF,UAAM,SAAS,MAAM,cAAc,UAAU;AAE7C,QAAI,CAAC,OAAO,OAAO;AACjB,MAAAA,SAAQ,KAAK,6BAA6B;AAC1C,MAAO,MAAM,OAAO,SAAS,qBAAqB;AAClD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,aAA6E,CAAC;AACpF,QAAI,OAAO,MAAM;AACf,iBAAW,OAAO,OAAO,MAAM;AAC7B,mBAAW,IAAI,IAAI,IAAI;AAAA,UACrB,MAAM,IAAI;AAAA,UACV,aAAa,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,YAAY,OAAO,OAAO,UAAU;AACzD,IAAAA,SAAQ,KAAK,kBAAkB;AAG/B,IAAO,MAAM;AACb,IAAO,QAAQ,YAAY,OAAO,QAAQ,OAAOD,IAAG,KAAK,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE;AAE/E,QAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AACzC,MAAO,MAAM;AACb,MAAO,IAAI,gBAAgB;AAC3B,iBAAW,OAAO,OAAO,MAAM;AAC7B,QAAO,SAAS,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG;AAAA,MAC7C;AAAA,IACF;AAEA,IAAE,QAAM,0BAA0B;AAAA,EACpC,SAASE,QAAO;AACd,IAAAD,SAAQ,KAAK,6BAA6B;AAC1C,UAAMC;AAAA,EACR;AACF;;;AInFA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AAIf,eAAsB,SAAwB;AAC5C,EAAE,SAAMC,IAAG,KAAK,cAAc,CAAC;AAG/B,MAAI,CAAE,MAAM,WAAW,GAAI;AACzB,IAAO,KAAK,yBAAyB;AACrC,IAAE,SAAM,EAAE;AACV;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,QAAQ,QAAQ;AAGtB,QAAM,eAAe,MAAQ,WAAQ;AAAA,IACnC,SAAS,UAAU,QAAQ,SAASA,IAAG,KAAK,KAAK,CAAC,KAAK,EAAE;AAAA,IACzD,cAAc;AAAA,EAChB,CAAC;AAED,MAAM,YAAS,YAAY,KAAK,CAAC,cAAc;AAC7C,IAAE,UAAO,kBAAkB;AAC3B;AAAA,EACF;AAGA,QAAM,YAAY;AAElB,EAAO,QAAQ,YAAY;AAC3B,EAAE,SAAM,EAAE;AACZ;;;AClCA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;;;ACHf,OAAO,gBAAgB;AACvB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAKf,eAAsB,cAAc,SAAiB,UAA2B;AAC9E,QAAM,UAAUD,MAAK,KAAKC,IAAG,OAAO,GAAG,GAAG,MAAM,GAAG,KAAK,IAAI,CAAC,EAAE;AAC/D,QAAMF,IAAG,UAAU,OAAO;AAC1B,SAAO;AACT;AAKA,eAAsB,WACpB,MACA,UACe;AACf,QAAMA,IAAG,UAAUC,MAAK,QAAQ,QAAQ,CAAC;AACzC,QAAMD,IAAG,UAAU,UAAU,OAAO,KAAK,IAAI,CAAC;AAChD;AAKA,eAAsB,gBACpB,SACA,UACe;AACf,QAAMA,IAAG,UAAU,QAAQ;AAC3B,QAAM,WAAW,SAAS,EAAE,KAAK,SAAS,CAAC;AAC7C;AAKA,eAAsB,eAAe,SAAgC;AACnE,MAAI;AACF,UAAMA,IAAG,OAAO,OAAO;AAAA,EACzB,QAAQ;AAAA,EAER;AACF;AAKA,eAAsB,qBAAqB,SAAmC;AAC5E,MAAI;AACF,UAAM,SAAS,MAAMA,IAAG,WAAW,OAAO;AAC1C,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,QAAQ,MAAMA,IAAG,QAAQ,OAAO;AACtC,WAAO,MAAM,SAAS;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,cAAc,UAAmC;AACrE,QAAM,QAAQ,MAAMA,IAAG,KAAK,QAAQ;AACpC,SAAO,KAAK,MAAM,MAAM,OAAO,IAAI;AACrC;;;ACpEA,OAAOG,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AACf,SAAS,KAAAC,UAAS;AAIlB,IAAM,kBAAkBC,GAAE,OAAO;AAAA,EAC/B,SAASA,GAAE,OAAO;AAAA,EAClB,SAASA,GAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAGD,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACjC,SAASA,GAAE,OAAO;AAAA,EAClB,UAAUA,GAAE,OAAO;AAAA,IACjB,MAAMA,GAAE,OAAO;AAAA,IACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,OAAOA,GAAE,KAAK,CAAC,QAAQ,YAAY,YAAY,OAAO,SAAS,CAAC,EAAE,SAAS;AAAA,IAC3E,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC;AAAA,EACD,YAAYA,GAAE,OAAO;AAAA,IACnB,eAAeA,GAAE,QAAQ,EAAE,SAAS;AAAA,IACpC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,gBAAgBA,GAAE,OAAO,EAAE,SAAS;AAAA,IACpC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,CAAC,EAAE,SAAS;AAAA,EACZ,KAAKA,GAAE,OAAO;AAAA,IACZ,QAAQA,GAAE,KAAK,CAAC,eAAe,aAAa,eAAe,UAAU,CAAC,EAAE,SAAS;AAAA,IACjF,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IACtC,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAC/C,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAC/C,iBAAiBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAChD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,CAAC,EAAE,SAAS;AAAA,EACZ,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,aAAaA,GAAE,OAAO;AAAA,EACtB,WAAWA,GAAE,OAAO;AACtB,CAAC;AAQM,SAAS,cAAsB;AACpC,SAAOC,MAAK,KAAKC,IAAG,QAAQ,GAAG,QAAQ;AACzC;AAKO,SAAS,iBAAyB;AACvC,SAAOD,MAAK,KAAK,YAAY,GAAG,UAAU;AAC5C;AAKO,SAAS,cAAc,aAA6B;AACzD,SAAOA,MAAK,KAAK,eAAe,GAAG,WAAW;AAChD;AAYA,eAAsB,kBAAiC;AACrD,QAAM,WAAW,YAAY;AAC7B,QAAM,cAAc,eAAe;AAEnC,QAAME,IAAG,UAAU,WAAW;AAG9B,QAAM,aAAaC,MAAK,KAAK,UAAU,aAAa;AACpD,MAAI,CAAE,MAAMD,IAAG,WAAW,UAAU,GAAI;AACtC,UAAMA,IAAG,UAAU,YAAY;AAAA,MAC7B,SAAS;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,GAAG,EAAE,QAAQ,EAAE,CAAC;AAAA,EAClB;AACF;AAKA,eAAsB,eAAkC;AACtD,QAAM,cAAc,eAAe;AAEnC,MAAI,CAAE,MAAMA,IAAG,WAAW,WAAW,GAAI;AACvC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,MAAMA,IAAG,QAAQ,aAAa,EAAE,eAAe,KAAK,CAAC;AACrE,SAAO,QACJ,OAAO,WAAS,MAAM,YAAY,CAAC,EACnC,IAAI,WAAS,MAAM,IAAI;AAC5B;AAaA,eAAsB,cACpB,aACA,cACA,SACe;AACf,QAAM,aAAa,cAAc,WAAW;AAG5C,QAAM,gBAAgB;AAGtB,QAAME,IAAG,UAAU,UAAU;AAG7B,QAAM,cAA2B;AAAA,IAC/B,SAAS;AAAA,IACT,UAAU;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,YAAY,CAAC;AAAA,IACb,KAAK;AAAA,MACH,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,IACd;AAAA,IACA,eAAe,CAAC,OAAO;AAAA,IACvB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,WAAW;AAAA,EACb;AAEA,QAAMA,IAAG;AAAA,IACPC,MAAK,KAAK,YAAY,cAAc;AAAA,IACpC;AAAA,IACA,EAAE,QAAQ,EAAE;AAAA,EACd;AAGA,QAAMD,IAAG;AAAA,IACPC,MAAK,KAAK,YAAY,gBAAgB;AAAA,IACtC;AAAA,MACE,SAAS;AAAA,MACT,WAAW,CAAC;AAAA,MACZ,gBAAgB,CAAC;AAAA,IACnB;AAAA,IACA,EAAE,QAAQ,EAAE;AAAA,EACd;AACF;AAKA,eAAsB,cAAc,SAA4C;AAC9E,QAAM,YAAYA,MAAK,KAAK,SAAS,QAAQ;AAE7C,MAAI,CAAE,MAAMD,IAAG,WAAW,SAAS,GAAI;AACrC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,MAAMA,IAAG,SAAS,SAAS;AAC3C,WAAO,gBAAgB,MAAM,OAAO;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,eAAe,SAAiB,aAAoC;AACxF,QAAM,YAAYC,MAAK,KAAK,SAAS,QAAQ;AAC7C,QAAM,YAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACA,QAAMD,IAAG,UAAU,WAAW,WAAW,EAAE,QAAQ,EAAE,CAAC;AACxD;AAKA,eAAsB,gBAAgB,aAAqB,SAAgC;AACzF,QAAM,cAAcC,MAAK,KAAK,cAAc,WAAW,GAAG,cAAc;AAExE,MAAI,CAAE,MAAMD,IAAG,WAAW,WAAW,GAAI;AACvC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAMA,IAAG,SAAS,WAAW;AAC7C,UAAM,gBAAgB,QAAQ,iBAAiB,CAAC;AAEhD,QAAI,CAAC,cAAc,SAAS,OAAO,GAAG;AACpC,oBAAc,KAAK,OAAO;AAC1B,cAAQ,gBAAgB;AACxB,cAAQ,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC7C,YAAMA,IAAG,UAAU,aAAa,SAAS,EAAE,QAAQ,EAAE,CAAC;AAAA,IACxD;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAKA,eAAsB,mBAAmB,aAAkD;AACzF,QAAM,cAAcC,MAAK,KAAK,cAAc,WAAW,GAAG,cAAc;AAExE,MAAI,CAAE,MAAMD,IAAG,WAAW,WAAW,GAAI;AACvC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,MAAMA,IAAG,SAAS,WAAW;AAC7C,WAAO,kBAAkB,MAAM,OAAO;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,mBAAmB,SAAyB;AAC1D,QAAM,UAAUC,MAAK,SAAS,OAAO;AAErC,SAAO,QACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE;AACzB;AAMA,eAAsB,aACpB,YACA,SACA,UAAgC,CAAC,GACT;AAExB,QAAM,gBAAgB,MAAM,cAAc,UAAU;AACpD,MAAI,eAAe;AAEjB,UAAM,gBAAgB,cAAc,SAAS,OAAO;AAEpD,QAAI,CAAC,QAAQ,QAAQ;AACnB,YAAM,UAAU,MAAM,mBAAmB,cAAc,OAAO;AAC9D,UAAI,SAAS;AACX,QAAO,MAAM;AACb,QAAO,KAAK,sBAAsBC,IAAG,KAAK,cAAc,OAAO,CAAC,EAAE;AAClE,YAAI,QAAQ,UAAU,MAAM;AAC1B,UAAO,IAAIA,IAAG,IAAI,eAAe,QAAQ,SAAS,IAAI,EAAE,CAAC;AAAA,QAC3D;AACA,YAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AAC7D,UAAO,IAAIA,IAAG,IAAI,qBAAqB,QAAQ,cAAc,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AAEA,WAAO,cAAc;AAAA,EACvB;AAGA,QAAM,gBAAgB;AAGtB,QAAM,mBAAmB,MAAM,aAAa;AAE5C,MAAI;AAEJ,MAAI,iBAAiB,SAAS,GAAG;AAE/B,IAAO,MAAM;AACb,IAAO,OAAO,eAAe;AAC7B,IAAO,IAAIA,IAAG,IAAI,iDAAiD,CAAC;AACpE,IAAO,MAAM;AAEb,UAAM,gBAAgB,MAAQ,UAAO;AAAA,MACnC,SAAS;AAAA,MACT,SAAS;AAAA,QACP,GAAG,iBAAiB,IAAI,WAAS;AAAA,UAC/B,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR,EAAE;AAAA,QACF;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAM,YAAS,aAAa,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,WAAW;AAE/B,YAAM,iBAAiB,MAAM,iBAAiB,YAAY,OAAO;AACjE,UAAI,CAAC,eAAgB,QAAO;AAC5B,oBAAc;AAAA,IAChB,OAAO;AACL,oBAAc;AAEd,YAAM,gBAAgB,aAAa,OAAO;AAAA,IAC5C;AAAA,EACF,OAAO;AAEL,IAAO,MAAM;AACb,IAAO,OAAO,eAAe;AAC7B,IAAO,IAAIA,IAAG,IAAI,6CAA6C,CAAC;AAChE,IAAO,IAAIA,IAAG,IAAI,+CAA+C,CAAC;AAClE,IAAO,MAAM;AAEb,UAAM,iBAAiB,MAAM,iBAAiB,YAAY,OAAO;AACjE,QAAI,CAAC,eAAgB,QAAO;AAC5B,kBAAc;AAAA,EAChB;AAGA,QAAM,eAAe,YAAY,WAAW;AAG5C,MAAI,CAAC,QAAQ,QAAQ;AACnB,IAAO,MAAM;AACb,IAAO,QAAQ,WAAWA,IAAG,KAAK,WAAW,CAAC,SAAS;AACvD,IAAO,IAAIA,IAAG,IAAI,gCAAgC,WAAW,GAAG,CAAC;AAAA,EACnE;AAEA,SAAO;AACT;AAKA,eAAe,iBACb,YACA,SACwB;AACxB,QAAM,gBAAgB,mBAAmB,UAAU;AAEnD,QAAM,cAAc,MAAQ,QAAK;AAAA,IAC/B,SAAS;AAAA,IACT,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU,CAAC,UAAU;AACnB,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,CAAC,eAAe,KAAK,KAAK,GAAG;AAC/B,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAM,YAAS,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAGA,QAAM,qBAAsB,YACzB,MAAM,GAAG,EACT,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EACxD,KAAK,GAAG;AAIX,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAMA,eAAsB,sBAAsB,SAAmC;AAC7E,QAAM,YAAY,MAAM,cAAc,OAAO;AAC7C,MAAI,WAAW;AAEb,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,MAAMF,IAAG,WAAWC,MAAK,KAAK,SAAS,SAAS,CAAC;AACtE,QAAM,iBAAiB,MAAMD,IAAG,WAAWC,MAAK,KAAK,SAAS,WAAW,cAAc,CAAC;AAExF,SAAO,gBAAgB;AACzB;AAKA,eAAsB,uBACpB,SACA,SACwB;AACxB,EAAO,MAAM;AACb,EAAO,KAAK,wDAAwD;AACpE,EAAO,IAAIC,IAAG,IAAI,yDAAyD,CAAC;AAE5E,SAAO,aAAa,SAAS,OAAO;AACtC;;;AF3ZA,eAAsB,KACpB,SACA,YACA,SACe;AACf,EAAE,SAAMC,IAAG,KAAK,cAAc,OAAO,EAAE,CAAC;AAGxC,QAAM,eAAe,aACjBC,MAAK,QAAQ,WAAW,QAAQ,MAAMC,IAAG,QAAQ,CAAC,CAAC,IACnDD,MAAK,QAAQ,QAAQ,IAAI,GAAG,OAAO;AAGvC,MAAI,CAAC,QAAQ,SAAU,MAAM,qBAAqB,YAAY,GAAI;AAChE,IAAO,MAAM,0BAA0BD,IAAG,OAAO,YAAY,CAAC,EAAE;AAChE,IAAO,IAAIA,IAAG,IAAI,0BAA0B,CAAC;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAMG,WAAY,WAAQ;AAC1B,EAAAA,SAAQ,MAAM,0BAA0B;AAExC,MAAI;AACJ,MAAI;AACF,kBAAc,MAAM,mBAAmB,OAAO;AAC9C,IAAAA,SAAQ,KAAK,SAASH,IAAG,KAAK,YAAY,kBAAkB,CAAC,KAAK,YAAY,OAAO,EAAE;AAAA,EACzF,SAASI,QAAO;AACd,IAAAD,SAAQ,KAAK,8BAA8B;AAC3C,UAAMC;AAAA,EACR;AAEA,QAAM,YAAY,YAAY,SAAS;AACvC,MAAI,aAA4B;AAGhC,MAAI,CAAC,WAAW;AACd,QAAI,CAAE,MAAM,WAAW,GAAI;AACzB,MAAO,KAAK,qCAAqC;AACjD,MAAO,MAAM;AACb,YAAM,MAAM;AACZ,MAAO,MAAM;AAAA,IACf;AAEA,iBAAa,MAAM,cAAc;AACjC,QAAI,CAAC,YAAY;AACf,MAAO,MAAM,gDAAgD;AAC7D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,WAAW;AACb,IAAAD,SAAQ,MAAM,yBAAyB;AAAA,EACzC,OAAO;AACL,IAAAA,SAAQ,MAAM,sBAAsB;AAAA,EACtC;AAEA,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,eAAe,SAAS,UAAU;AACvD,IAAAA,SAAQ,KAAK,YAAY,sBAAsB,kBAAkB;AAAA,EACnE,SAASC,QAAO;AACd,IAAAD,SAAQ,KAAK,YAAY,+BAA+B,6BAA6B;AACrF,UAAMC;AAAA,EACR;AAGA,EAAAD,SAAQ,MAAM,eAAe,OAAO,KAAK,YAAY,OAAO,KAAK;AAEjE,MAAI,UAAyB;AAC7B,MAAI;AACF,cAAU,MAAM,cAAc,aAAa;AAC3C,UAAM,UAAUF,MAAK,KAAK,SAAS,SAAS;AAE5C,UAAM,UAAU,MAAM,aAAa,aAAa,WAAW;AAC3D,UAAM,WAAW,SAAS,OAAO;AAEjC,UAAM,SAAS,MAAM,cAAc,OAAO;AAC1C,IAAAE,SAAQ,KAAK,cAAc,OAAO,KAAK,YAAY,OAAO,KAAK,MAAM,MAAM;AAG3E,IAAAA,SAAQ,MAAM,iBAAiB,YAAY,KAAK;AAChD,UAAM,gBAAgB,SAAS,YAAY;AAC3C,IAAAA,SAAQ,KAAK,gBAAgBH,IAAG,OAAO,YAAY,CAAC,EAAE;AAGtD,UAAM,eAAe,OAAO;AAAA,EAC9B,SAASI,QAAO;AACd,QAAI,SAAS;AACX,YAAM,eAAe,OAAO;AAAA,IAC9B;AACA,UAAMA;AAAA,EACR;AAGA,EAAO,MAAM;AACb,EAAO,QAAQ,GAAG,YAAY,kBAAkB,KAAK,YAAY,OAAO,aAAa;AAGrF,QAAM,aAAa,cAAc,OAAO;AACxC,EAAO,MAAM;AACb,EAAO,IAAI,aAAa;AACxB,EAAO,SAAS,MAAM,YAAY,EAAE;AACpC,EAAO,SAAS,QAAQ;AACxB,EAAO,SAAS,QAAQ;AAGxB,QAAM,gBAAwC;AAAA,IAC5C,eAAe;AAAA,EACjB;AACA,QAAMC,SAAQ,cAAc,OAAO,KAAK;AACxC,EAAE,SAAML,IAAG,MAAMK,MAAK,CAAC;AACzB;;;AGvIA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,YAAY;;;ACHnB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,KAAAC,UAAS;AAElB,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACjC,SAASA,GAAE,OAAO;AAAA,EAClB,aAAaA,GAAE,OAAO;AAAA,EACtB,oBAAoBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,gBAAgBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACpC,gBAAgBA,GACb,OAAO;AAAA,IACN,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAC5C,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACzC,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAC7C,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,CAAC,EACA,SAAS;AAAA,EACZ,WAAWA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,IAAI,CAAC,EAAE,SAAS;AACpD,CAAC;AAED,IAAM,gBAAgBA,GAAE,OAAO;AAAA,EAC7B,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAMA,GAAE,KAAK,CAAC,aAAa,QAAQ,CAAC,EAAE,SAAS;AACjD,CAAC;AAiBD,eAAsB,UAAU,SAA8C;AAC5E,QAAM,kBAAkBD,MAAK,KAAK,SAAS,WAAW,cAAc;AACpE,QAAM,cAAcA,MAAK,KAAK,SAAS,WAAW,UAAU;AAG5D,MAAI,CAAE,MAAMD,IAAG,WAAW,eAAe,GAAI;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,aAAa,MAAMA,IAAG,SAAS,eAAe;AACpD,UAAM,cAAc,kBAAkB,MAAM,UAAU;AAGtD,QAAI;AACJ,QAAI,MAAMA,IAAG,WAAW,WAAW,GAAG;AACpC,UAAI;AACF,cAAM,SAAS,MAAMA,IAAG,SAAS,WAAW;AAC5C,kBAAU,cAAc,MAAM,MAAM;AAAA,MACtC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,SAAS,QAAQ,YAAY;AAAA,MACnC,aACE,SAAS,eACT,YAAY,sBACZ,YAAY;AAAA,MACd,SAAS,YAAY;AAAA,MACrB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,iBAA8C;AAClE,SAAO,UAAU,QAAQ,IAAI,CAAC;AAChC;;;ACvFA,OAAOG,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AAMtB,SAAS,gBAAgB,KAAsB;AAC7C,MAAI,eAAe,MAAO,QAAO,IAAI;AACrC,SAAO,OAAO,GAAG;AACnB;AAiBA,eAAsB,oBACpB,WACA,SACA,aACsB;AACtB,QAAM,SAAsB;AAAA,IAC1B,UAAU,CAAC;AAAA,IACX,QAAQ,CAAC;AAAA,IACT,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,QAAQ,CAAC;AAAA,EACX;AAEA,QAAM,gBAAgB,YAAY,gBAAgB,iBAAiB,CAAC;AACpE,QAAM,aAAa,YAAY,gBAAgB,cAAc,CAAC;AAC9D,QAAM,iBAAiB,YAAY,gBAAgB,kBAAkB,CAAC;AACtE,QAAM,UAAU,YAAY,gBAAgB,WAAW,CAAC;AAGxD,QAAM,iBAAiB,oBAAI,IAAY;AAGvC,aAAW,WAAW,eAAe;AACnC,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,SAAS;AAAA,QAChC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,OAAO;AAAA,MACT,CAAC;AAED,iBAAW,QAAQ,OAAO;AACxB,YAAI,eAAe,IAAI,IAAI,EAAG;AAG9B,cAAM,aAAa,WAAW,KAAK,CAAC,cAAc;AAChD,iBAAO,eAAe,MAAM,SAAS;AAAA,QACvC,CAAC;AAED,YAAI,YAAY;AACd,iBAAO,QAAQ,KAAK,IAAI;AACxB,yBAAe,IAAI,IAAI;AACvB;AAAA,QACF;AAEA,cAAM,UAAUA,MAAK,KAAK,WAAW,IAAI;AACzC,cAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AAExC,YAAI;AACF,gBAAMD,IAAG,UAAUC,MAAK,QAAQ,QAAQ,CAAC;AACzC,gBAAMD,IAAG,KAAK,SAAS,UAAU,EAAE,WAAW,KAAK,CAAC;AACpD,iBAAO,SAAS,KAAK,IAAI;AACzB,yBAAe,IAAI,IAAI;AAAA,QACzB,SAAS,KAAK;AACZ,iBAAO,OAAO,KAAK,kBAAkB,IAAI,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,QACtE;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,OAAO,KAAK,6BAA6B,OAAO,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,IACpF;AAAA,EACF;AAGA,aAAW,WAAW,gBAAgB;AACpC,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,SAAS;AAAA,QAChC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,OAAO;AAAA,MACT,CAAC;AAED,iBAAW,QAAQ,OAAO;AACxB,YAAI,eAAe,IAAI,IAAI,EAAG;AAG9B,cAAM,aAAa,WAAW,KAAK,CAAC,cAAc;AAChD,iBAAO,eAAe,MAAM,SAAS;AAAA,QACvC,CAAC;AAED,YAAI,YAAY;AACd,iBAAO,QAAQ,KAAK,IAAI;AACxB,yBAAe,IAAI,IAAI;AACvB;AAAA,QACF;AAEA,cAAM,UAAUC,MAAK,KAAK,WAAW,IAAI;AACzC,cAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AAExC,YAAI;AACF,gBAAM,aAAa,MAAMD,IAAG,WAAW,QAAQ;AAE/C,cAAI,cAAc,KAAK,SAAS,OAAO,GAAG;AAExC,kBAAM,WAAW,MAAMA,IAAG,SAAS,OAAO;AAC1C,kBAAM,WAAW,MAAMA,IAAG,SAAS,QAAQ;AAG3C,kBAAM,SAAS,MAAM,CAAC,GAAG,UAAU,QAAQ;AAE3C,kBAAMA,IAAG,UAAU,UAAU,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClD,mBAAO,OAAO,KAAK,IAAI;AAAA,UACzB,WAAW,YAAY;AAErB,mBAAO,QAAQ,KAAK,IAAI;AAAA,UAC1B,OAAO;AAEL,kBAAMA,IAAG,UAAUC,MAAK,QAAQ,QAAQ,CAAC;AACzC,kBAAMD,IAAG,KAAK,SAAS,QAAQ;AAC/B,mBAAO,SAAS,KAAK,IAAI;AAAA,UAC3B;AACA,yBAAe,IAAI,IAAI;AAAA,QACzB,SAAS,KAAK;AACZ,iBAAO,OAAO,KAAK,mBAAmB,IAAI,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,QACvE;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,OAAO,KAAK,mCAAmC,OAAO,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,IAC1F;AAAA,EACF;AAGA,aAAW,WAAW,SAAS;AAC7B,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,SAAS;AAAA,QAChC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,OAAO;AAAA,MACT,CAAC;AAED,iBAAW,QAAQ,OAAO;AACxB,YAAI,eAAe,IAAI,IAAI,EAAG;AAG9B,cAAM,aAAa,WAAW,KAAK,CAAC,cAAc;AAChD,iBAAO,eAAe,MAAM,SAAS;AAAA,QACvC,CAAC;AAED,YAAI,YAAY;AACd,iBAAO,QAAQ,KAAK,IAAI;AACxB,yBAAe,IAAI,IAAI;AACvB;AAAA,QACF;AAEA,cAAM,UAAUC,MAAK,KAAK,WAAW,IAAI;AACzC,cAAM,WAAWA,MAAK,KAAK,SAAS,IAAI;AAExC,YAAI;AACF,gBAAM,aAAa,MAAMD,IAAG,WAAW,QAAQ;AAE/C,cAAI,CAAC,YAAY;AAEf,kBAAMA,IAAG,UAAUC,MAAK,QAAQ,QAAQ,CAAC;AACzC,kBAAMD,IAAG,KAAK,SAAS,QAAQ;AAC/B,mBAAO,MAAM,KAAK,IAAI;AAAA,UACxB,OAAO;AAEL,mBAAO,QAAQ,KAAK,IAAI;AAAA,UAC1B;AACA,yBAAe,IAAI,IAAI;AAAA,QACzB,SAAS,KAAK;AACZ,iBAAO,OAAO,KAAK,iBAAiB,IAAI,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,QACrE;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,OAAO,KAAK,qCAAqC,OAAO,KAAK,gBAAgB,GAAG,CAAC,EAAE;AAAA,IAC5F;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,eAAe,UAAkB,SAA0B;AAClE,SAAO,UAAU,UAAU,SAAS,EAAE,KAAK,KAAK,CAAC;AACnD;AAKA,eAAsB,UAAU,SAAmC;AACjE,MAAI;AACF,UAAM,SAASC,MAAK,KAAK,SAAS,MAAM;AACxC,WAAO,MAAMD,IAAG,WAAW,MAAM;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,gBACpB,SACA,SACkB;AAClB,MAAI;AACF,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,eAAe;AAGlD,cAAU,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE,KAAK,SAAS,OAAO,OAAO,CAAC;AAG/D,UAAM,aAAa,UAAU,OAAO,CAAC,QAAQ,YAAY,SAAS,GAAG;AAAA,MACnE,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAED,QAAI,WAAW,WAAW,GAAG;AAE3B,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,UAAU,OAAO,CAAC,UAAU,MAAM,OAAO,GAAG;AAAA,MAC/D,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAED,WAAO,aAAa,WAAW;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AFrOA,eAAsB,QAAQ,SAAwC;AACpE,EAAE,SAAME,IAAG,KAAK,eAAe,CAAC;AAGhC,QAAM,MAAM,MAAM,eAAe;AAEjC,MAAI,CAAC,KAAK;AACR,IAAO,MAAM,wBAAwB;AACrC,IAAO,IAAIA,IAAG,IAAI,0DAA0D,CAAC;AAC7E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,EAAO,SAAS,OAAOA,IAAG,QAAQ,IAAI,WAAW,CAAC;AAClD,EAAO,SAAS,mBAAmBA,IAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC;AAG7D,MAAI,MAAM,sBAAsB,IAAI,QAAQ,GAAG;AAC7C,UAAM,cAAc,MAAM,uBAAuB,IAAI,UAAU,IAAI,IAAI;AACvE,QAAI,CAAC,aAAa;AAEhB,MAAO,MAAM;AACb,MAAO,IAAIA,IAAG,IAAI,+CAA+C,CAAC;AAAA,IACpE;AAAA,EACF,OAAO;AAEL,UAAM,YAAY,MAAM,cAAc,IAAI,QAAQ;AAClD,QAAI,WAAW;AACb,YAAM,gBAAgB,UAAU,SAAS,IAAI,IAAI;AAAA,IACnD;AAAA,EACF;AAGA,QAAMC,WAAY,WAAQ;AAC1B,EAAAA,SAAQ,MAAM,yBAAyB;AAEvC,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,mBAAmB,IAAI,IAAI;AAC1C,IAAAA,SAAQ,KAAK,sBAAsB;AAAA,EACrC,SAASC,QAAO;AACd,IAAAD,SAAQ,KAAK,6BAA6B;AAC1C,UAAMC;AAAA,EACR;AAGA,MAAI,CAAC,OAAO,GAAG,OAAO,SAAS,IAAI,OAAO,GAAG;AAC3C,IAAO,MAAM;AACb,IAAO,QAAQ,8BAA8BF,IAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,GAAG;AAC1E,IAAE,SAAM,EAAE;AACV;AAAA,EACF;AAGA,EAAO,MAAM;AACb,EAAO;AAAA,IACL,qBAAqBA,IAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,WAAMA,IAAG,MAAM,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,EACrF;AAIA,MAAI,OAAO,eAAe,MAAM,QAAQ,OAAO,WAAW,GAAG;AAE3D,UAAM,iBAAiB,OAAO,YAC3B,OAAO,CAAC,MAA2B;AAClC,UAAI,CAAC,OAAO,MAAM,EAAE,OAAO,EAAG,QAAO;AACrC,UAAI;AACF,eAAO,OAAO,GAAG,EAAE,SAAS,IAAI,OAAO,KAAK,OAAO,IAAI,EAAE,SAAS,OAAO,OAAO;AAAA,MAClF,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC,EACA;AAAA,MAAK,CAAC,GAAwB,MAC7B,OAAO,SAAS,EAAE,SAAS,EAAE,OAAO;AAAA,IACtC;AAEF,QAAI,eAAe,SAAS,GAAG;AAC7B,MAAO,MAAM;AACb,YAAM,eAAe,eAAe;AACpC,MAAO,OAAO,cAAc,YAAY,WAAW,eAAe,IAAI,MAAM,EAAE,GAAG;AAEjF,iBAAW,gBAAgB,gBAAgB;AACzC,cAAM,EAAE,SAAAG,UAAS,WAAW,MAAM,IAAI;AAItC,YAAI,CAAC,MAAO;AAGZ,cAAM,aAAa,MAAM,YAAY,KAAK,IAAI,KAAK;AACnD,QAAO,MAAM;AACb,QAAO,IAAI,GAAGH,IAAG,MAAM,IAAIG,QAAO,EAAE,CAAC,GAAG,aAAa,MAAMH,IAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE;AAGxF,YAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,qBAAW,QAAQ,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG;AAC1C,YAAO,IAAIA,IAAG,IAAI,OAAO,IAAI,EAAE,CAAC;AAAA,UAClC;AACA,cAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,YAAO,IAAIA,IAAG,IAAI,eAAe,MAAM,MAAM,SAAS,CAAC,OAAO,CAAC;AAAA,UACjE;AAAA,QACF;AAGA,YAAI,MAAM,gBAAgBG,aAAY,OAAO,SAAS;AACpD,UAAO,IAAIH,IAAG,OAAO,WAAW,MAAM,YAAY,EAAE,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAO,MAAM;AACb,EAAO,IAAI,8BAA8B;AACzC,QAAM,aAAa,IAAI,YAAY,gBAAgB,cAAc,CAAC;AAClE,aAAW,WAAW,WAAW,MAAM,GAAG,CAAC,GAAG;AAC5C,IAAO,SAASA,IAAG,IAAI,OAAO,CAAC;AAAA,EACjC;AACA,MAAI,WAAW,SAAS,GAAG;AACzB,IAAO,IAAIA,IAAG,IAAI,aAAa,WAAW,SAAS,CAAC,gBAAgB,CAAC;AAAA,EACvE;AAGA,MAAI,CAAC,QAAQ,KAAK;AAChB,IAAO,MAAM;AACb,UAAM,gBAAgB,MAAQ,WAAQ;AAAA,MACpC,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AAED,QAAM,YAAS,aAAa,KAAK,CAAC,eAAe;AAC/C,MAAE,UAAO,mBAAmB;AAC5B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,OAAO,SAAS;AAClC,MAAI,aAA4B;AAGhC,MAAI,CAAC,WAAW;AACd,QAAI,CAAE,MAAM,WAAW,GAAI;AACzB,MAAO,MAAM;AACb,MAAO,KAAK,6BAA6B;AACzC,YAAM,MAAM;AACZ,MAAO,MAAM;AAAA,IACf;AAEA,iBAAa,MAAM,cAAc;AACjC,QAAI,CAAC,YAAY;AACf,MAAO,MAAM,sBAAsB;AACnC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,YAAY,MAAM,UAAU,IAAI,QAAQ;AAC9C,MAAI,WAAW;AACb,QAAI,QAAQ,QAAQ;AAClB,MAAAC,SAAQ,MAAM,wBAAwB;AACtC,YAAM,UAAU,MAAM;AAAA,QACpB,IAAI;AAAA,QACJ,oCAAoC,OAAO,OAAO;AAAA,MACpD;AACA,MAAAA,SAAQ,KAAK,UAAU,uBAAuB,sBAAsB;AAAA,IACtE,WAAW,CAAC,QAAQ,KAAK;AACvB,YAAM,eAAe,MAAQ,WAAQ;AAAA,QACnC,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,CAAC;AAED,UAAI,iBAAiB,MAAM;AACzB,QAAAA,SAAQ,MAAM,wBAAwB;AACtC,cAAM,UAAU,MAAM;AAAA,UACpB,IAAI;AAAA,UACJ,oCAAoC,OAAO,OAAO;AAAA,QACpD;AACA,QAAAA,SAAQ,KAAK,UAAU,uBAAuB,sBAAsB;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAGA,MAAI,WAAW;AACb,IAAAA,SAAQ,MAAM,yBAAyB;AAAA,EACzC,OAAO;AACL,IAAAA,SAAQ,MAAM,sBAAsB;AAAA,EACtC;AAEA,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,eAAe,IAAI,MAAM,UAAU;AACxD,IAAAA,SAAQ,KAAK,YAAY,sBAAsB,kBAAkB;AAAA,EACnE,SAASC,QAAO;AACd,IAAAD,SAAQ,KAAK,YAAY,+BAA+B,6BAA6B;AACrF,UAAMC;AAAA,EACR;AAGA,EAAAD,SAAQ,MAAM,gBAAgB,OAAO,OAAO,KAAK;AAEjD,MAAI,UAAyB;AAC7B,MAAI;AACF,cAAU,MAAM,cAAc,gBAAgB;AAC9C,UAAM,UAAUG,MAAK,KAAK,SAAS,SAAS;AAC5C,UAAM,cAAcA,MAAK,KAAK,SAAS,WAAW;AAElD,UAAM,UAAU,MAAM,aAAa,aAAa,WAAW;AAC3D,UAAM,WAAW,SAAS,OAAO;AAEjC,UAAM,SAAS,MAAM,cAAc,OAAO;AAC1C,IAAAH,SAAQ,KAAK,eAAe,OAAO,OAAO,KAAK,MAAM,MAAM;AAG3D,IAAAA,SAAQ,MAAM,eAAe;AAC7B,UAAM,gBAAgB,SAAS,WAAW;AAC1C,IAAAA,SAAQ,KAAK,WAAW;AAIxB,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AAGA,IAAAA,SAAQ,MAAM,qBAAqB;AACnC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,IAAI;AAAA,MACJ,OAAO;AAAA,IACT;AACA,IAAAA,SAAQ,KAAK,iBAAiB;AAG9B,IAAO,MAAM;AACb,IAAO;AAAA,MACL,YAAY,IAAI,WAAW,KAAKD,IAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,WAAMA,IAAG,MAAM,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,IAChG;AACA,IAAO,MAAM;AACb,IAAO,SAAS,iBAAiB,OAAO,OAAO,SAAS,MAAM,CAAC;AAC/D,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,MAAO,SAAS,gBAAgB,OAAO,OAAO,OAAO,MAAM,CAAC;AAAA,IAC9D;AACA,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,MAAO,SAAS,eAAe,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,IAC5D;AACA,IAAO,SAAS,mBAAmB,OAAO,OAAO,QAAQ,MAAM,CAAC;AAEhE,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,MAAO,MAAM;AACb,MAAO,KAAK,GAAG,OAAO,OAAO,MAAM,mBAAmB;AACtD,iBAAW,OAAO,OAAO,QAAQ;AAC/B,QAAO,SAASA,IAAG,IAAI,GAAG,CAAC;AAAA,MAC7B;AAAA,IACF;AAGA,UAAM,eAAe,OAAO;AAAA,EAC9B,SAASE,QAAO;AACd,QAAI,SAAS;AACX,YAAM,eAAe,OAAO;AAAA,IAC9B;AACA,UAAMA;AAAA,EACR;AAGA,EAAO,MAAM;AACb,EAAO,IAAIF,IAAG,OAAO,uDAA6C,CAAC;AACnE,EAAO,IAAIA,IAAG,IAAI,yCAAyC,CAAC;AAE5D,EAAE,SAAMA,IAAG,MAAM,mBAAmB,CAAC;AACvC;;;AGxSA,OAAOK,SAAQ;AACf,OAAOC,aAAY;AAKnB,IAAM,cAAc;AAEpB,eAAsB,UAAyB;AAC7C,EAAO,OAAO,eAAe;AAG7B,EAAO,SAAS,OAAOC,IAAG,KAAK,IAAI,WAAW,EAAE,CAAC;AAGjD,QAAM,MAAM,MAAM,eAAe;AAEjC,MAAI,CAAC,KAAK;AACR,IAAO,MAAM;AACb,IAAO,KAAK,sCAAsC;AAClD,IAAO,IAAIA,IAAG,IAAI,iDAAiD,CAAC;AACpE;AAAA,EACF;AAGA,EAAO,SAAS,IAAI,aAAaA,IAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC;AAG3D,MAAI;AACF,UAAM,SAAS,MAAM,mBAAmB,IAAI,IAAI;AAEhD,QAAIC,QAAO,GAAG,OAAO,SAAS,IAAI,OAAO,GAAG;AAC1C,MAAO,MAAM;AACb,MAAO;AAAA,QACL,qBAAqBD,IAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,WAAMA,IAAG,MAAM,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,MACrF;AACA,MAAO,IAAIA,IAAG,IAAI,+BAA+B,CAAC;AAAA,IACpD,OAAO;AACL,MAAO,MAAM;AACb,MAAO,QAAQ,+BAA+B;AAAA,IAChD;AAAA,EACF,QAAQ;AAEN,IAAO,MAAM;AACb,IAAO,IAAIA,IAAG,IAAI,6BAA6B,CAAC;AAAA,EAClD;AACF;;;AC9CA,OAAOE,SAAQ;AAOf,SAAS,YAAY,OAAuB;AAC1C,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,KAAK,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACrC;AAKA,eAAsB,OAAsB;AAC1C,QAAM,EAAE,KAAK,IAAI,MAAM,cAAc;AAErC,MAAI,KAAK,WAAW,GAAG;AACrB,IAAO,KAAK,mBAAmB;AAC/B;AAAA,EACF;AAGA,QAAM,WAAW,KAAK,OAAO,OAAK,EAAE,SAAS,MAAM;AACnD,QAAM,WAAW,KAAK,OAAO,OAAK,EAAE,SAAS,MAAM;AAEnD,EAAO,MAAM;AACb,UAAQ,IAAIC,IAAG,KAAK,gBAAgB,CAAC;AACrC,EAAO,MAAM;AAGb,MAAI,SAAS,SAAS,GAAG;AACvB,YAAQ,IAAIA,IAAG,MAAMA,IAAG,KAAK,MAAM,CAAC,CAAC;AACrC,IAAO,MAAM;AACb,eAAW,OAAO,UAAU;AAC1B,eAAS,GAAG;AAAA,IACd;AAAA,EACF;AAGA,MAAI,SAAS,SAAS,GAAG;AACvB,YAAQ,IAAIA,IAAG,OAAOA,IAAG,KAAK,MAAM,CAAC,CAAC;AACtC,IAAO,MAAM;AACb,eAAW,OAAO,UAAU;AAC1B,eAAS,GAAG;AAAA,IACd;AAAA,EACF;AAGA,UAAQ,IAAIA,IAAG,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAClC,EAAO,MAAM;AACb,UAAQ,IAAIA,IAAG,IAAI,+BAA+B,CAAC;AACnD,UAAQ,IAAIA,IAAG,IAAI,QAAQA,IAAG,KAAK,aAAa,CAAC,wBAAwB,CAAC;AAC1E,UAAQ,IAAIA,IAAG,IAAI,SAASA,IAAG,KAAK,mBAAmB,CAAC,eAAe,CAAC;AACxE,EAAO,MAAM;AACf;AAEA,SAAS,SAAS,KAOT;AACP,QAAM,QAAQ,YAAY,IAAI,UAAU;AACxC,QAAM,WAAW,QAAQA,IAAG,OAAO,KAAK,IAAI;AAG5C,UAAQ;AAAA,IACN,KAAKA,IAAG,KAAK,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC,IAAIA,IAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,KAAK,QAAQ;AAAA,EAC9E;AAGA,MAAI,IAAI,aAAa;AACnB,YAAQ,IAAI,KAAKA,IAAG,IAAI,IAAI,WAAW,CAAC,EAAE;AAAA,EAC5C;AAGA,UAAQ;AAAA,IACN,KAAKA,IAAG,IAAI,QAAG,CAAC,IAAIA,IAAG,IAAI,qBAAqB,CAAC,IAAIA,IAAG,QAAQ,IAAI,IAAI,CAAC,IAAIA,IAAG,IAAI,cAAc,CAAC;AAAA,EACrG;AAEA,EAAO,MAAM;AACf;;;ACrFA,YAAYC,QAAO;AACnB,OAAOC,SAAQ;AAUf,eAAsB,SAAwB;AAC5C,EAAE,SAAMC,IAAG,KAAK,cAAc,CAAC;AAG/B,QAAM,MAAM,MAAM,eAAe;AACjC,QAAM,YAAY,MAAM,cAAc,QAAQ,IAAI,CAAC;AAEnD,MAAI,CAAC,OAAO,CAAC,WAAW;AAEtB,UAAM,WAAW,MAAM,aAAa;AAEpC,QAAI,SAAS,WAAW,GAAG;AACzB,MAAO,KAAK,0BAA0B;AACtC,MAAO,MAAM;AACb,MAAO,IAAIA,IAAG,IAAI,mBAAmB,CAAC;AACtC,MAAO,SAAS,uCAAuC;AACvD,MAAE,SAAM,EAAE;AACV;AAAA,IACF;AAEA,IAAO,OAAO,eAAe;AAE7B,eAAW,eAAe,UAAU;AAClC,YAAM,UAAU,MAAM,mBAAmB,WAAW;AACpD,UAAI,SAAS;AACX,QAAO,MAAM;AACb,QAAO,IAAIA,IAAG,KAAK,WAAW,CAAC;AAC/B,YAAI,QAAQ,UAAU,MAAM;AAC1B,UAAO,IAAIA,IAAG,IAAI,eAAe,QAAQ,SAAS,IAAI,EAAE,CAAC;AAAA,QAC3D;AACA,YAAI,QAAQ,UAAU,OAAO;AAC3B,UAAO,IAAIA,IAAG,IAAI,YAAY,QAAQ,SAAS,KAAK,EAAE,CAAC;AAAA,QACzD;AACA,YAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AAC7D,UAAO,IAAIA,IAAG,IAAI,WAAW,QAAQ,cAAc,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,QAClE;AACA,YAAI,QAAQ,KAAK,UAAU,QAAQ,IAAI,WAAW,eAAe;AAC/D,UAAO,IAAIA,IAAG,IAAI,UAAU,QAAQ,IAAI,MAAM,EAAE,CAAC;AAAA,QACnD;AAAA,MACF,OAAO;AACL,QAAO,MAAM;AACb,QAAO,IAAIA,IAAG,KAAK,WAAW,CAAC;AAC/B,QAAO,IAAIA,IAAG,IAAI,gBAAgB,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,IAAO,MAAM;AACb,IAAO,IAAIA,IAAG,IAAI,wCAAwC,CAAC;AAC3D,IAAE,SAAM,EAAE;AACV;AAAA,EACF;AAGA,MAAI,KAAK;AACP,IAAO,SAAS,OAAOA,IAAG,QAAQ,IAAI,WAAW,CAAC;AAClD,IAAO,SAAS,WAAWA,IAAG,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC;AAAA,EACvD;AAEA,MAAI,WAAW;AACb,IAAO,SAAS,WAAWA,IAAG,KAAK,UAAU,OAAO,CAAC;AAErD,UAAM,UAAU,MAAM,mBAAmB,UAAU,OAAO;AAC1D,QAAI,SAAS;AACX,MAAO,MAAM;AACb,MAAO,OAAO,iBAAiB;AAE/B,UAAI,QAAQ,UAAU,MAAM;AAC1B,QAAO,SAAS,YAAY,QAAQ,SAAS,IAAI;AAAA,MACnD;AACA,UAAI,QAAQ,UAAU,OAAO;AAC3B,QAAO,SAAS,SAAS,QAAQ,SAAS,KAAK;AAAA,MACjD;AACA,UAAI,QAAQ,YAAY,eAAe;AACrC,QAAO,SAAS,kBAAkBA,IAAG,MAAM,KAAK,CAAC;AACjD,YAAI,QAAQ,WAAW,WAAW;AAChC,UAAO,SAAS,cAAc,GAAG,QAAQ,WAAW,SAAS,MAAM;AAAA,QACrE;AAAA,MACF;AACA,UAAI,QAAQ,KAAK,UAAU,QAAQ,IAAI,WAAW,eAAe;AAC/D,cAAM,WAAW,QAAQ,IAAI,WAAW,aAAaA,IAAG,QAAQA,IAAG;AACnE,QAAO,SAAS,cAAc,SAAS,QAAQ,IAAI,MAAM,CAAC;AAC1D,YAAI,QAAQ,IAAI,UAAU,QAAQ,QAAQ,IAAI,UAAU,QAAW;AACjE,UAAO,SAAS,aAAa,GAAG,QAAQ,IAAI,KAAK,MAAM;AAAA,QACzD;AAAA,MACF;AACA,UAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AAC7D,QAAO,MAAM;AACb,QAAO,IAAIA,IAAG,IAAI,iBAAiB,CAAC;AACpC,mBAAW,WAAW,QAAQ,eAAe;AAC3C,UAAO,SAAS,OAAO;AAAA,QACzB;AAAA,MACF;AAEA,MAAO,MAAM;AACb,MAAO,IAAIA,IAAG,IAAI,8BAA8B,UAAU,OAAO,GAAG,CAAC;AAAA,IACvE;AAAA,EACF,WAAW,KAAK;AACd,IAAO,MAAM;AACb,IAAO,KAAK,yBAAyB;AACrC,IAAO,IAAIA,IAAG,IAAI,uCAAuC,CAAC;AAAA,EAC5D;AAEA,EAAE,SAAM,EAAE;AACZ;;;AdxGA,IAAM,MAAM,IAAI,OAAO;AAGvB,IACG,QAAQ,SAAS,uBAAuB,EACxC,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,MAAM;AAAA,EACd,SAASC,QAAO;AACd,IAAO,MAAMA,kBAAiB,QAAQA,OAAM,UAAU,cAAc;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,UAAU,0BAA0B,EAC5C,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,OAAO;AAAA,EACf,SAASA,QAAO;AACd,IAAO,MAAMA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,qBAAqB,4BAA4B,EACzD,OAAO,WAAW,2BAA2B,EAC7C,OAAO,OAAO,KAAaC,OAA0B,YAAiC;AACrF,MAAI;AACF,UAAM,KAAK,KAAKA,OAAM,OAAO;AAAA,EAC/B,SAASD,QAAO;AACd,IAAO,MAAMA,kBAAiB,QAAQA,OAAM,UAAU,aAAa;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,WAAW,kCAAkC,EACrD,OAAO,aAAa,mBAAmB,EACvC,OAAO,YAAY,0BAA0B,EAC7C,OAAO,OAAO,YAAiD;AAC9D,MAAI;AACF,UAAM,QAAQ,OAAO;AAAA,EACvB,SAASA,QAAO;AACd,IAAO,MAAMA,kBAAiB,QAAQA,OAAM,UAAU,gBAAgB;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,QAAQ,qBAAqB,EACrC,MAAM,IAAI,EACV,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,KAAK;AAAA,EACb,SAASA,QAAO;AACd,IAAO,MAAMA,kBAAiB,QAAQA,OAAM,UAAU,qBAAqB;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,WAAW,2BAA2B,EAC9C,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,QAAQ;AAAA,EAChB,SAASA,QAAO;AACd,IAAO,MAAMA,kBAAiB,QAAQA,OAAM,UAAU,sBAAsB;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IACG,QAAQ,UAAU,6BAA6B,EAC/C,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,OAAO;AAAA,EACf,SAASA,QAAO;AACd,IAAO,MAAMA,kBAAiB,QAAQA,OAAM,UAAU,qBAAqB;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAGH,IAAI,KAAK;AACT,IAAI,QAAQ,OAAO;AAGnB,IAAI,MAAM;","names":["pc","error","data","z","pc","spinner","error","p","pc","pc","p","pc","path","os","fs","path","os","fs","path","os","p","pc","z","z","path","os","fs","path","fs","path","pc","pc","path","os","spinner","error","outro","p","pc","path","fs","path","z","fs","path","pc","spinner","error","version","path","pc","semver","pc","semver","pc","pc","p","pc","pc","error","path"]}
|