@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 CHANGED
@@ -391,10 +391,10 @@ async function logout() {
391
391
  }
392
392
 
393
393
  // src/commands/init.ts
394
- import * as p3 from "@clack/prompts";
395
- import pc4 from "picocolors";
396
- import path3 from "path";
397
- import os3 from "os";
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
- p3.intro(pc4.cyan(`aiorg init ${kitName}`));
441
- const resolvedPath = targetPath ? path3.resolve(targetPath.replace(/^~/, os3.homedir())) : path3.resolve(process.cwd(), kitName);
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: ${pc4.yellow(resolvedPath)}`);
444
- log(pc4.dim("Use --force to overwrite"));
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 = p3.spinner();
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 ${pc4.cyan(versionInfo.packageDisplayName)} v${versionInfo.version}`);
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 = path3.join(tempDir, "kit.zip");
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 ${pc4.yellow(resolvedPath)}`);
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 outro5 = outroMessages[kitName] || "Happy building!";
515
- p3.outro(pc4.green(outro5));
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 p4 from "@clack/prompts";
520
- import pc5 from "picocolors";
521
- import path6 from "path";
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 fs3 from "fs-extra";
526
- import path4 from "path";
527
- import { z as z3 } from "zod";
528
- var VersionJsonSchema = z3.object({
529
- version: z3.string(),
530
- packageName: z3.string(),
531
- packageDisplayName: z3.string().optional(),
532
- releasedAt: z3.string().optional(),
533
- minUpgradeFrom: z3.string().optional(),
534
- fileCategories: z3.object({
535
- alwaysReplace: z3.array(z3.string()).optional(),
536
- neverTouch: z3.array(z3.string()).optional(),
537
- mergeIfChanged: z3.array(z3.string()).optional(),
538
- addOnly: z3.array(z3.string()).optional()
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: z3.record(z3.string(), z3.any()).optional()
811
+ changelog: z4.record(z4.string(), z4.any()).optional()
541
812
  });
542
- var KitJsonSchema = z3.object({
543
- name: z3.string(),
544
- displayName: z3.string().optional(),
545
- type: z3.enum(["bootstrap", "inject"]).optional()
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 = path4.join(dirPath, ".claude", "version.json");
549
- const kitJsonPath = path4.join(dirPath, ".claude", "kit.json");
550
- if (!await fs3.pathExists(versionJsonPath)) {
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 fs3.readJson(versionJsonPath);
825
+ const versionRaw = await fs4.readJson(versionJsonPath);
555
826
  const versionJson = VersionJsonSchema.parse(versionRaw);
556
827
  let kitJson;
557
- if (await fs3.pathExists(kitJsonPath)) {
828
+ if (await fs4.pathExists(kitJsonPath)) {
558
829
  try {
559
- const kitRaw = await fs3.readJson(kitJsonPath);
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 fs4 from "fs-extra";
582
- import path5 from "path";
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 = path5.join(sourceDir, file);
621
- const destPath = path5.join(destDir, file);
891
+ const srcPath = path6.join(sourceDir, file);
892
+ const destPath = path6.join(destDir, file);
622
893
  try {
623
- await fs4.ensureDir(path5.dirname(destPath));
624
- await fs4.copy(srcPath, destPath, { overwrite: true });
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 = path5.join(sourceDir, file);
653
- const destPath = path5.join(destDir, file);
923
+ const srcPath = path6.join(sourceDir, file);
924
+ const destPath = path6.join(destDir, file);
654
925
  try {
655
- const destExists = await fs4.pathExists(destPath);
926
+ const destExists = await fs5.pathExists(destPath);
656
927
  if (destExists && file.endsWith(".json")) {
657
- const incoming = await fs4.readJson(srcPath);
658
- const existing = await fs4.readJson(destPath);
928
+ const incoming = await fs5.readJson(srcPath);
929
+ const existing = await fs5.readJson(destPath);
659
930
  const merged = merge({}, incoming, existing);
660
- await fs4.writeJson(destPath, merged, { spaces: 2 });
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 fs4.ensureDir(path5.dirname(destPath));
666
- await fs4.copy(srcPath, destPath);
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 = path5.join(sourceDir, file);
696
- const destPath = path5.join(destDir, file);
966
+ const srcPath = path6.join(sourceDir, file);
967
+ const destPath = path6.join(destDir, file);
697
968
  try {
698
- const destExists = await fs4.pathExists(destPath);
969
+ const destExists = await fs5.pathExists(destPath);
699
970
  if (!destExists) {
700
- await fs4.ensureDir(path5.dirname(destPath));
701
- await fs4.copy(srcPath, destPath);
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 = path5.join(dirPath, ".git");
723
- return await fs4.pathExists(gitDir);
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
- p4.intro(pc5.cyan("aiorg upgrade"));
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(pc5.dim("Run this command from a folder with .claude/version.json"));
1026
+ log(pc6.dim("Run this command from a folder with .claude/version.json"));
756
1027
  process.exit(1);
757
1028
  }
758
- keyValue("Kit", pc5.magenta(kit.displayName));
759
- keyValue("Current version", pc5.cyan(`v${kit.version}`));
760
- const spinner4 = p4.spinner();
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 (${pc5.cyan(`v${kit.version}`)})`);
773
- p4.outro("");
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: ${pc5.cyan(`v${kit.version}`)} \u2192 ${pc5.green(`v${latest.version}`)}`
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(`${pc5.green(`v${version2}`)}${highlights ? ` - ${pc5.white(highlights)}` : ""}`);
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(pc5.dim(` + ${item}`));
1086
+ log(pc6.dim(` + ${item}`));
804
1087
  }
805
1088
  if (entry.added.length > 2) {
806
- log(pc5.dim(` + ... and ${entry.added.length - 2} more`));
1089
+ log(pc6.dim(` + ... and ${entry.added.length - 2} more`));
807
1090
  }
808
1091
  }
809
1092
  if (entry.upgradeNotes && version2 === latest.version) {
810
- log(pc5.yellow(` Note: ${entry.upgradeNotes}`));
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(pc5.dim(pattern));
1102
+ listItem(pc6.dim(pattern));
820
1103
  }
821
1104
  if (neverTouch.length > 5) {
822
- log(pc5.dim(` ... and ${neverTouch.length - 5} more patterns`));
1105
+ log(pc6.dim(` ... and ${neverTouch.length - 5} more patterns`));
823
1106
  }
824
1107
  if (!options.yes) {
825
1108
  blank();
826
- const shouldUpgrade = await p4.confirm({
1109
+ const shouldUpgrade = await p5.confirm({
827
1110
  message: "Proceed with upgrade?",
828
1111
  initialValue: true
829
1112
  });
830
- if (p4.isCancel(shouldUpgrade) || !shouldUpgrade) {
831
- p4.cancel("Upgrade cancelled");
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 p4.confirm({
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 = path6.join(tempDir, "kit.zip");
892
- const extractPath = path6.join(tempDir, "extracted");
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}: ${pc5.cyan(`v${kit.version}`)} \u2192 ${pc5.green(`v${latest.version}`)}`
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(pc5.dim(err));
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(pc5.yellow("\u26A0\uFE0F Restart Claude Code to use new commands"));
940
- log(pc5.dim(' Type "exit" then start a new session'));
941
- p4.outro(pc5.green("Upgrade complete!"));
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 pc6 from "picocolors";
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", pc6.cyan(`v${CLI_VERSION}`));
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(pc6.dim("Run this command from a folder containing a kit"));
1238
+ log(pc7.dim("Run this command from a folder containing a kit"));
956
1239
  return;
957
1240
  }
958
- keyValue(kit.displayName, pc6.cyan(`v${kit.version}`));
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: ${pc6.cyan(`v${kit.version}`)} \u2192 ${pc6.green(`v${latest.version}`)}`
1247
+ `Update available: ${pc7.cyan(`v${kit.version}`)} \u2192 ${pc7.green(`v${latest.version}`)}`
965
1248
  );
966
- log(pc6.dim("Run 'aiorg upgrade' to update"));
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(pc6.dim("Could not check for updates"));
1256
+ log(pc7.dim("Could not check for updates"));
974
1257
  }
975
1258
  }
976
1259
 
977
1260
  // src/commands/list.ts
978
- import pc7 from "picocolors";
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(pc7.bold("Available Kits"));
1275
+ console.log(pc8.bold("Available Kits"));
993
1276
  blank();
994
1277
  if (freeKits.length > 0) {
995
- console.log(pc7.green(pc7.bold("FREE")));
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(pc7.yellow(pc7.bold("PAID")));
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(pc7.dim("\u2500".repeat(50)));
1291
+ console.log(pc8.dim("\u2500".repeat(50)));
1009
1292
  blank();
1010
- console.log(pc7.dim("Free kits work without login."));
1011
- console.log(pc7.dim(`Run '${pc7.cyan("aiorg login")}' first for paid kits.`));
1012
- console.log(pc7.dim(`Visit ${pc7.cyan("https://aiorg.dev")} for details.`));
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 ? pc7.yellow(price) : "";
1300
+ const priceStr = price ? pc8.yellow(price) : "";
1018
1301
  console.log(
1019
- ` ${pc7.bold(kit.name.padEnd(24))} ${pc7.cyan(`v${kit.version}`)} ${priceStr}`
1302
+ ` ${pc8.bold(kit.name.padEnd(24))} ${pc8.cyan(`v${kit.version}`)} ${priceStr}`
1020
1303
  );
1021
1304
  if (kit.description) {
1022
- console.log(` ${pc7.dim(kit.description)}`);
1305
+ console.log(` ${pc8.dim(kit.description)}`);
1023
1306
  }
1024
1307
  console.log(
1025
- ` ${pc7.dim("\u2192")} ${pc7.dim("npx @aiorg/cli init")} ${pc7.magenta(kit.name)} ${pc7.dim("~/my-project")}`
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, path7, options) => {
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, path7, options);
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":"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","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiorg/cli",
3
- "version": "1.1.7",
3
+ "version": "1.2.1",
4
4
  "description": "CLI for downloading and upgrading aiorg kits",
5
5
  "type": "module",
6
6
  "publishConfig": {