mycontext-cli 2.0.27 → 2.0.29

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.
Files changed (173) hide show
  1. package/README.md +71 -342
  2. package/dist/agents/implementations/CodeGenSubAgent.d.ts.map +1 -1
  3. package/dist/agents/implementations/CodeGenSubAgent.js +67 -14
  4. package/dist/agents/implementations/CodeGenSubAgent.js.map +1 -1
  5. package/dist/agents/implementations/DesignPipelineAgent.d.ts +80 -0
  6. package/dist/agents/implementations/DesignPipelineAgent.d.ts.map +1 -0
  7. package/dist/agents/implementations/DesignPipelineAgent.js +1406 -0
  8. package/dist/agents/implementations/DesignPipelineAgent.js.map +1 -0
  9. package/dist/agents/implementations/FeatureAssemblyAgent.d.ts +67 -0
  10. package/dist/agents/implementations/FeatureAssemblyAgent.d.ts.map +1 -0
  11. package/dist/agents/implementations/FeatureAssemblyAgent.js +564 -0
  12. package/dist/agents/implementations/FeatureAssemblyAgent.js.map +1 -0
  13. package/dist/agents/implementations/PromptConstructorAgent.d.ts +10 -0
  14. package/dist/agents/implementations/PromptConstructorAgent.d.ts.map +1 -1
  15. package/dist/agents/implementations/PromptConstructorAgent.js +172 -12
  16. package/dist/agents/implementations/PromptConstructorAgent.js.map +1 -1
  17. package/dist/agents/implementations/RoleBasedGenerator.d.ts +52 -0
  18. package/dist/agents/implementations/RoleBasedGenerator.d.ts.map +1 -0
  19. package/dist/agents/implementations/RoleBasedGenerator.js +370 -0
  20. package/dist/agents/implementations/RoleBasedGenerator.js.map +1 -0
  21. package/dist/cli.js +111 -56
  22. package/dist/cli.js.map +1 -1
  23. package/dist/clients/ClaudeSDKClient.d.ts +48 -0
  24. package/dist/clients/ClaudeSDKClient.d.ts.map +1 -0
  25. package/dist/clients/ClaudeSDKClient.js +158 -0
  26. package/dist/clients/ClaudeSDKClient.js.map +1 -0
  27. package/dist/clients/MyContextAIClient.d.ts +73 -0
  28. package/dist/clients/MyContextAIClient.d.ts.map +1 -0
  29. package/dist/clients/MyContextAIClient.js +280 -0
  30. package/dist/clients/MyContextAIClient.js.map +1 -0
  31. package/dist/clients/ProviderChain.d.ts +87 -0
  32. package/dist/clients/ProviderChain.d.ts.map +1 -0
  33. package/dist/clients/ProviderChain.js +246 -0
  34. package/dist/clients/ProviderChain.js.map +1 -0
  35. package/dist/clients/XAIClient.d.ts +48 -0
  36. package/dist/clients/XAIClient.d.ts.map +1 -0
  37. package/dist/clients/XAIClient.js +152 -0
  38. package/dist/clients/XAIClient.js.map +1 -0
  39. package/dist/commands/assemble-features.d.ts +40 -0
  40. package/dist/commands/assemble-features.d.ts.map +1 -0
  41. package/dist/commands/assemble-features.js +383 -0
  42. package/dist/commands/assemble-features.js.map +1 -0
  43. package/dist/commands/clone-starter.d.ts +32 -0
  44. package/dist/commands/clone-starter.d.ts.map +1 -0
  45. package/dist/commands/clone-starter.js +218 -0
  46. package/dist/commands/clone-starter.js.map +1 -0
  47. package/dist/commands/design-analyze.d.ts +46 -0
  48. package/dist/commands/design-analyze.d.ts.map +1 -0
  49. package/dist/commands/design-analyze.js +232 -0
  50. package/dist/commands/design-analyze.js.map +1 -0
  51. package/dist/commands/generate-components.d.ts +11 -0
  52. package/dist/commands/generate-components.d.ts.map +1 -1
  53. package/dist/commands/generate-components.js +342 -12
  54. package/dist/commands/generate-components.js.map +1 -1
  55. package/dist/commands/generate-context-files.d.ts +9 -0
  56. package/dist/commands/generate-context-files.d.ts.map +1 -1
  57. package/dist/commands/generate-context-files.js +57 -0
  58. package/dist/commands/generate-context-files.js.map +1 -1
  59. package/dist/commands/generate.d.ts +5 -0
  60. package/dist/commands/generate.d.ts.map +1 -1
  61. package/dist/commands/generate.js +109 -2
  62. package/dist/commands/generate.js.map +1 -1
  63. package/dist/commands/init.d.ts +1 -0
  64. package/dist/commands/init.d.ts.map +1 -1
  65. package/dist/commands/init.js +32 -10
  66. package/dist/commands/init.js.map +1 -1
  67. package/dist/commands/preview-components.d.ts +12 -0
  68. package/dist/commands/preview-components.d.ts.map +1 -0
  69. package/dist/commands/preview-components.js +122 -0
  70. package/dist/commands/preview-components.js.map +1 -0
  71. package/dist/commands/refine-component.d.ts +43 -0
  72. package/dist/commands/refine-component.d.ts.map +1 -0
  73. package/dist/commands/refine-component.js +313 -0
  74. package/dist/commands/refine-component.js.map +1 -0
  75. package/dist/commands/review-context.d.ts +47 -0
  76. package/dist/commands/review-context.d.ts.map +1 -0
  77. package/dist/commands/review-context.js +335 -0
  78. package/dist/commands/review-context.js.map +1 -0
  79. package/dist/commands/setup-complete.d.ts.map +1 -1
  80. package/dist/commands/setup-complete.js +38 -2
  81. package/dist/commands/setup-complete.js.map +1 -1
  82. package/dist/commands/workflow.d.ts.map +1 -1
  83. package/dist/commands/workflow.js +86 -7
  84. package/dist/commands/workflow.js.map +1 -1
  85. package/dist/config/intent-dictionary.json +3700 -0
  86. package/dist/package.json +12 -1
  87. package/dist/services/ContextValidator.d.ts +99 -0
  88. package/dist/services/ContextValidator.d.ts.map +1 -0
  89. package/dist/services/ContextValidator.js +433 -0
  90. package/dist/services/ContextValidator.js.map +1 -0
  91. package/dist/services/IntentEnricher.d.ts +61 -0
  92. package/dist/services/IntentEnricher.d.ts.map +1 -0
  93. package/dist/services/IntentEnricher.js +318 -0
  94. package/dist/services/IntentEnricher.js.map +1 -0
  95. package/dist/services/IntentValidator.d.ts +114 -0
  96. package/dist/services/IntentValidator.d.ts.map +1 -0
  97. package/dist/services/IntentValidator.js +680 -0
  98. package/dist/services/IntentValidator.js.map +1 -0
  99. package/dist/services/MutationLogger.d.ts +54 -0
  100. package/dist/services/MutationLogger.d.ts.map +1 -0
  101. package/dist/services/MutationLogger.js +164 -0
  102. package/dist/services/MutationLogger.js.map +1 -0
  103. package/dist/services/RegressionRunner.d.ts +49 -0
  104. package/dist/services/RegressionRunner.d.ts.map +1 -0
  105. package/dist/services/RegressionRunner.js +285 -0
  106. package/dist/services/RegressionRunner.js.map +1 -0
  107. package/dist/services/TriggerLogger.d.ts +101 -0
  108. package/dist/services/TriggerLogger.d.ts.map +1 -0
  109. package/dist/services/TriggerLogger.js +263 -0
  110. package/dist/services/TriggerLogger.js.map +1 -0
  111. package/dist/types/design-pipeline.d.ts +300 -0
  112. package/dist/types/design-pipeline.d.ts.map +1 -0
  113. package/dist/types/design-pipeline.js +9 -0
  114. package/dist/types/design-pipeline.js.map +1 -0
  115. package/dist/types/feature-bundle.d.ts +239 -0
  116. package/dist/types/feature-bundle.d.ts.map +1 -0
  117. package/dist/types/feature-bundle.js +9 -0
  118. package/dist/types/feature-bundle.js.map +1 -0
  119. package/dist/types/index.d.ts +2 -0
  120. package/dist/types/index.d.ts.map +1 -1
  121. package/dist/types/index.js +2 -0
  122. package/dist/types/index.js.map +1 -1
  123. package/dist/types/intent-dictionary.d.ts +525 -0
  124. package/dist/types/intent-dictionary.d.ts.map +1 -0
  125. package/dist/types/intent-dictionary.js +11 -0
  126. package/dist/types/intent-dictionary.js.map +1 -0
  127. package/dist/types/role-permissions.d.ts +167 -0
  128. package/dist/types/role-permissions.d.ts.map +1 -0
  129. package/dist/types/role-permissions.js +9 -0
  130. package/dist/types/role-permissions.js.map +1 -0
  131. package/dist/utils/contextEnricher.d.ts +41 -0
  132. package/dist/utils/contextEnricher.d.ts.map +1 -0
  133. package/dist/utils/contextEnricher.js +327 -0
  134. package/dist/utils/contextEnricher.js.map +1 -0
  135. package/dist/utils/designFallbacks.d.ts +48 -0
  136. package/dist/utils/designFallbacks.d.ts.map +1 -0
  137. package/dist/utils/designFallbacks.js +885 -0
  138. package/dist/utils/designFallbacks.js.map +1 -0
  139. package/dist/utils/designManifestManager.d.ts +89 -0
  140. package/dist/utils/designManifestManager.d.ts.map +1 -0
  141. package/dist/utils/designManifestManager.js +533 -0
  142. package/dist/utils/designManifestManager.js.map +1 -0
  143. package/dist/utils/designPipelineStateManager.d.ts +63 -0
  144. package/dist/utils/designPipelineStateManager.d.ts.map +1 -0
  145. package/dist/utils/designPipelineStateManager.js +174 -0
  146. package/dist/utils/designPipelineStateManager.js.map +1 -0
  147. package/dist/utils/envExampleGenerator.d.ts.map +1 -1
  148. package/dist/utils/envExampleGenerator.js +41 -171
  149. package/dist/utils/envExampleGenerator.js.map +1 -1
  150. package/dist/utils/featureBundleManager.d.ts +90 -0
  151. package/dist/utils/featureBundleManager.d.ts.map +1 -0
  152. package/dist/utils/featureBundleManager.js +340 -0
  153. package/dist/utils/featureBundleManager.js.map +1 -0
  154. package/dist/utils/githubCloner.d.ts +93 -0
  155. package/dist/utils/githubCloner.d.ts.map +1 -0
  156. package/dist/utils/githubCloner.js +305 -0
  157. package/dist/utils/githubCloner.js.map +1 -0
  158. package/dist/utils/hybridAIClient.d.ts.map +1 -1
  159. package/dist/utils/hybridAIClient.js +21 -0
  160. package/dist/utils/hybridAIClient.js.map +1 -1
  161. package/dist/utils/openRouterClient.d.ts +10 -0
  162. package/dist/utils/openRouterClient.d.ts.map +1 -0
  163. package/dist/utils/openRouterClient.js +61 -0
  164. package/dist/utils/openRouterClient.js.map +1 -0
  165. package/dist/utils/rolePermissionMapper.d.ts +89 -0
  166. package/dist/utils/rolePermissionMapper.d.ts.map +1 -0
  167. package/dist/utils/rolePermissionMapper.js +337 -0
  168. package/dist/utils/rolePermissionMapper.js.map +1 -0
  169. package/dist/utils/unifiedDesignContextLoader.d.ts +76 -0
  170. package/dist/utils/unifiedDesignContextLoader.d.ts.map +1 -0
  171. package/dist/utils/unifiedDesignContextLoader.js +344 -0
  172. package/dist/utils/unifiedDesignContextLoader.js.map +1 -0
  173. package/package.json +12 -1
@@ -41,16 +41,21 @@ const fileSystem_1 = require("../utils/fileSystem");
41
41
  const spinner_1 = require("../utils/spinner");
42
42
  const hostedApiClient_1 = require("../utils/hostedApiClient");
43
43
  const completeArchitectureEngine_1 = require("../utils/completeArchitectureEngine");
44
+ const unifiedDesignContextLoader_1 = require("../utils/unifiedDesignContextLoader");
44
45
  const chalk_1 = __importDefault(require("chalk"));
45
46
  const fs = __importStar(require("fs-extra"));
46
47
  const path = __importStar(require("path"));
47
48
  const child_process_1 = require("child_process");
49
+ const review_context_1 = require("./review-context");
50
+ const TriggerLogger_1 = require("../services/TriggerLogger");
48
51
  // --- Orchestration in GenerateComponentsCommand ---
49
52
  class GenerateComponentsCommand {
50
53
  constructor() {
51
54
  this.fs = new fileSystem_1.FileSystemManager();
52
55
  this.hostedApi = new hostedApiClient_1.HostedApiClient();
53
56
  this.architectureEngine = new completeArchitectureEngine_1.CompleteArchitectureEngine();
57
+ this.contextLoader = new unifiedDesignContextLoader_1.UnifiedDesignContextLoader();
58
+ this.triggerLogger = new TriggerLogger_1.TriggerLogger();
54
59
  this.contextArtifacts = {
55
60
  prd: "",
56
61
  types: "",
@@ -259,11 +264,24 @@ class GenerateComponentsCommand {
259
264
  console.log(chalk_1.default.blue("🚀 Using local AI generation (no authentication required)"));
260
265
  userInfo = { userId: "local" };
261
266
  }
262
- // Load context artifacts for richer generation (PRD + Types + Brand)
263
- this.contextArtifacts = await this.loadContextArtifacts();
267
+ // Load unified design context (PRD + Types + Brand + Component List + Design Manifest)
268
+ console.log(chalk_1.default.blue("🔄 Loading unified design context..."));
269
+ const { enrichedContext } = await this.contextLoader.loadUnifiedDesignContext();
270
+ // Convert enriched context to legacy format for compatibility
271
+ this.contextArtifacts = {
272
+ prd: enrichedContext.technical_context.prd,
273
+ types: enrichedContext.technical_context.types,
274
+ brand: enrichedContext.technical_context.brand,
275
+ compListRaw: JSON.stringify(enrichedContext.component_architecture),
276
+ compList: enrichedContext.component_architecture,
277
+ };
264
278
  // Load stack configuration for stack-aware generation
265
279
  await this.loadStackConfig();
266
- // Check if brand context exists - critical for design-consistent components
280
+ // Display design context summary
281
+ console.log(chalk_1.default.green("✅ Unified design context loaded"));
282
+ console.log(chalk_1.default.gray(` Design system: ${enrichedContext.design_system.colors.primary} primary color`));
283
+ console.log(chalk_1.default.gray(` Components: ${enrichedContext.component_architecture.components.length} defined`));
284
+ console.log(chalk_1.default.gray(` Design anchors: ${enrichedContext.design_intent.design_anchors.join(", ")}`));
267
285
  if (!this.contextArtifacts.brand) {
268
286
  console.log(chalk_1.default.yellow("⚠️ No brand context found. Components may not match your design system."));
269
287
  console.log(chalk_1.default.gray("💡 Run 'mycontext generate brand' first for design-consistent components."));
@@ -273,15 +291,21 @@ class GenerateComponentsCommand {
273
291
  }
274
292
  // Determine if we're generating a specific group or all components
275
293
  const isAll = target === "all" || options.all || options["--all"];
276
- const groupName = isAll ? undefined : target;
277
- if (isAll) {
294
+ const isCoreOnly = target === "core" ||
295
+ options.coreOnly ||
296
+ options["--core-only"];
297
+ const groupName = isAll || isCoreOnly ? undefined : target;
298
+ if (isCoreOnly) {
299
+ await this.generateCoreComponents(options, spinner, userInfo.userId);
300
+ }
301
+ else if (isAll) {
278
302
  await this.generateAllComponents(options, spinner, userInfo.userId);
279
303
  }
280
304
  else if (groupName) {
281
305
  await this.generateComponentGroup(groupName, options, spinner, userInfo.userId);
282
306
  }
283
307
  else {
284
- throw new Error("Please specify a group name or 'all' to generate components");
308
+ throw new Error("Please specify a group name, 'all', or use --core-only to generate components");
285
309
  }
286
310
  // Optionally run final canvas normalization
287
311
  if (options.finalCanvas) {
@@ -535,6 +559,294 @@ class GenerateComponentsCommand {
535
559
  catch { }
536
560
  }
537
561
  }
562
+ async generateCoreComponents(options, spinner, userId) {
563
+ spinner.updateText("Generating core 10 components for validation...");
564
+ // Check if critical gaps are addressed
565
+ const criticalGapsAddressed = await review_context_1.ReviewContextCommand.areCriticalGapsAddressed();
566
+ if (!criticalGapsAddressed) {
567
+ console.log(chalk_1.default.red("❌ Critical gaps must be addressed before generating components"));
568
+ console.log(chalk_1.default.blue("💡 Run 'mycontext review:context' to address critical gaps"));
569
+ return;
570
+ }
571
+ // Read component list
572
+ let componentListPath = ".mycontext/04-component-list.json";
573
+ if (!(await this.fs.exists(componentListPath))) {
574
+ componentListPath = ".mycontext/component-list.json";
575
+ }
576
+ if (!(await this.fs.exists(componentListPath))) {
577
+ componentListPath = "context/component-list.json";
578
+ }
579
+ if (!(await this.fs.exists(componentListPath))) {
580
+ throw new Error("Component list not found. Run 'mycontext generate components-list' first.");
581
+ }
582
+ const componentList = JSON.parse(await this.fs.readFile(componentListPath));
583
+ const groups = this.convertHierarchicalToFlat(componentList);
584
+ if (groups.length === 0) {
585
+ throw new Error("No component groups found in component-list.json");
586
+ }
587
+ // Select first 10 components across all groups
588
+ const coreComponents = [];
589
+ let componentCount = 0;
590
+ const maxCoreComponents = 10;
591
+ for (const group of groups) {
592
+ if (componentCount >= maxCoreComponents)
593
+ break;
594
+ const components = group.components || [];
595
+ for (const component of components) {
596
+ if (componentCount >= maxCoreComponents)
597
+ break;
598
+ coreComponents.push({
599
+ ...component,
600
+ groupName: group.name,
601
+ group: group,
602
+ });
603
+ componentCount++;
604
+ }
605
+ }
606
+ if (coreComponents.length === 0) {
607
+ throw new Error("No components found in component-list.json");
608
+ }
609
+ console.log(chalk_1.default.blue(`🎯 Generating ${coreComponents.length} core components for validation`));
610
+ // Ensure shadcn/ui components are available
611
+ await this.ensureShadcnComponentsInstalled(groups, spinner);
612
+ // Ensure form dependencies exist
613
+ await this.ensureFormDeps(spinner);
614
+ // Ensure test scaffold exists (optional)
615
+ if (options.withTests) {
616
+ await this.ensureTestsScaffold(spinner);
617
+ }
618
+ // Create core components directory structure
619
+ const componentsDir = options.output || path.join(".mycontext", "components");
620
+ const mobileDir = path.join(componentsDir, "mobile");
621
+ const desktopDir = path.join(componentsDir, "desktop");
622
+ await this.fs.ensureDir(mobileDir);
623
+ await this.fs.ensureDir(desktopDir);
624
+ let generatedCount = 0;
625
+ // Generate mobile and desktop variants for each core component
626
+ for (const component of coreComponents) {
627
+ spinner.updateText(`Generating ${component.name} (${generatedCount + 1}/${coreComponents.length})...`);
628
+ // Check if component feature is approved
629
+ const featureId = component.name.toLowerCase().replace(/\s+/g, "-");
630
+ const approval = await review_context_1.ReviewContextCommand.getFeatureApproval(featureId);
631
+ if (approval === false) {
632
+ console.log(chalk_1.default.yellow(` ⏭️ Skipping ${component.name} (rejected in review)`));
633
+ continue;
634
+ }
635
+ if (approval === null) {
636
+ console.log(chalk_1.default.yellow(` ⚠️ ${component.name} not reviewed yet - generating anyway`));
637
+ }
638
+ // Generate mobile variant
639
+ await this.generateComponentVariant(component, "mobile", mobileDir, options, userId);
640
+ // Generate desktop variant
641
+ await this.generateComponentVariant(component, "desktop", desktopDir, options, userId);
642
+ // Generate tests if requested
643
+ if (options.withTests) {
644
+ await this.generateComponentTest(component, mobileDir);
645
+ await this.generateComponentTest(component, desktopDir);
646
+ }
647
+ generatedCount++;
648
+ }
649
+ // Generate index files for both variants
650
+ await this.generateCoreIndexFiles(coreComponents, mobileDir, desktopDir);
651
+ // Update preview registry
652
+ if (options.updatePreview !== false) {
653
+ await this.updatePreviewRegistry(componentsDir);
654
+ await this.ensurePreviewRoute();
655
+ }
656
+ // Post-generation checks
657
+ if (options.check) {
658
+ await this.runPostGenerationChecks(componentsDir);
659
+ }
660
+ // Open preview if requested
661
+ if (options.openPreview !== false) {
662
+ await this.openPreview();
663
+ }
664
+ console.log(chalk_1.default.green(`✅ Generated ${generatedCount} core components with mobile and desktop variants`));
665
+ console.log(chalk_1.default.blue(`📁 Components saved to: ${componentsDir}/mobile/ and ${componentsDir}/desktop/`));
666
+ console.log(chalk_1.default.yellow(`🔍 Next: Run 'mycontext preview:components' to validate the core components`));
667
+ // Log trigger event
668
+ await this.triggerLogger.logTrigger("component-refinement", `Generated ${generatedCount} core components for validation`, coreComponents.map((c) => c.name), "Core component generation completed");
669
+ }
670
+ async generateComponentVariant(component, variant, outputDir, options, userId) {
671
+ try {
672
+ // Check if user has local AI keys configured
673
+ const hasLocalKeys = this.hasLocalAIKeys();
674
+ let codeResult;
675
+ if (hasLocalKeys) {
676
+ // Use local AI first (user's own keys) - sub-agent orchestration
677
+ const { orchestrator } = await Promise.resolve().then(() => __importStar(require("../agents/orchestrator/SubAgentOrchestrator")));
678
+ // Execute code generation with retry logic
679
+ let retryCount = 0;
680
+ const maxRetries = 3;
681
+ const baseDelay = 2000; // 2 seconds base delay
682
+ while (retryCount <= maxRetries) {
683
+ try {
684
+ console.log(`🔍 DEBUG: About to call orchestrator.executeAgent for CodeGenSubAgent (attempt ${retryCount + 1}/${maxRetries + 1})`);
685
+ // Use stack configuration timeout if available
686
+ const timeout = this.stackConfig?.timeouts?.generation || 60000;
687
+ // Get enriched context for better AI generation
688
+ const { enrichedContext } = await this.contextLoader.loadUnifiedDesignContext();
689
+ const formattedContext = this.contextLoader
690
+ .getContextEnricher()
691
+ .formatContextForModel(enrichedContext);
692
+ const result = await orchestrator.executeAgent("CodeGenSubAgent", {
693
+ componentName: component.name,
694
+ componentDescription: component.description,
695
+ componentType: component.type,
696
+ variant: variant,
697
+ groupName: component.groupName,
698
+ dependencies: component.dependencies || [],
699
+ enrichedContext: formattedContext,
700
+ userId: userId,
701
+ timeout: timeout,
702
+ temperature: options.temperature || 0.7,
703
+ maxTokens: options.maxTokens || 4000,
704
+ });
705
+ if (result && result.code) {
706
+ codeResult = result;
707
+ break; // Success, exit retry loop
708
+ }
709
+ else {
710
+ throw new Error("No code generated");
711
+ }
712
+ }
713
+ catch (error) {
714
+ console.log(chalk_1.default.yellow(`⚠️ Generation attempt ${retryCount + 1} failed: ${error instanceof Error ? error.message : "Unknown error"}`));
715
+ retryCount++;
716
+ if (retryCount <= maxRetries) {
717
+ const delay = baseDelay * Math.pow(2, retryCount - 1); // Exponential backoff
718
+ console.log(chalk_1.default.gray(` Retrying in ${delay / 1000} seconds...`));
719
+ await new Promise((resolve) => setTimeout(resolve, delay));
720
+ }
721
+ }
722
+ }
723
+ if (!codeResult) {
724
+ throw new Error("All generation attempts failed");
725
+ }
726
+ }
727
+ else {
728
+ // No local keys - try hosted API only
729
+ console.log(chalk_1.default.blue("🔧 Using hosted API for component generation..."));
730
+ try {
731
+ const hostedResult = await this.hostedApi.generateComponent(component.description, {
732
+ componentName: component.name,
733
+ model: "mycontext",
734
+ context: {
735
+ prd: this.contextArtifacts.prd,
736
+ types: this.contextArtifacts.types,
737
+ brand: this.contextArtifacts.brand,
738
+ componentList: this.contextArtifacts.compList,
739
+ },
740
+ variant: variant,
741
+ });
742
+ if (hostedResult.success && hostedResult.data) {
743
+ codeResult = {
744
+ code: hostedResult.data,
745
+ metadata: {
746
+ model: "hosted",
747
+ tokens: hostedResult.data.length / 4,
748
+ latency: 600,
749
+ },
750
+ };
751
+ }
752
+ else {
753
+ throw new Error("Hosted API generation failed");
754
+ }
755
+ }
756
+ catch (error) {
757
+ console.log(chalk_1.default.red("❌ Hosted API failed"));
758
+ console.log(chalk_1.default.yellow("💡 MyContext requires 100% accuracy - no fallbacks"));
759
+ console.log(chalk_1.default.blue("🔄 Retry options:"));
760
+ console.log(chalk_1.default.gray(" 1. Configure a local AI provider API key"));
761
+ console.log(chalk_1.default.gray(" 2. Check your API key configuration"));
762
+ console.log(chalk_1.default.gray(" 3. Try again later with: mycontext generate components"));
763
+ throw new Error("Hosted API unavailable - configure local AI provider");
764
+ }
765
+ }
766
+ // Write component file
767
+ const fileName = `${component.name}.tsx`;
768
+ const filePath = path.join(outputDir, fileName);
769
+ // Add variant-specific styling and imports
770
+ const variantCode = this.addVariantSpecificCode(codeResult.code, variant);
771
+ await this.fs.writeFile(filePath, variantCode);
772
+ console.log(chalk_1.default.green(` ✅ Generated ${variant} variant: ${fileName}`));
773
+ }
774
+ catch (error) {
775
+ console.log(chalk_1.default.red(` ❌ Failed to generate ${variant} variant for ${component.name}: ${error instanceof Error ? error.message : "Unknown error"}`));
776
+ throw error;
777
+ }
778
+ }
779
+ addVariantSpecificCode(code, variant) {
780
+ // Add variant-specific styling and responsive behavior
781
+ const variantImports = variant === "mobile"
782
+ ? `import { cn } from "@/lib/utils";\n`
783
+ : `import { cn } from "@/lib/utils";\n`;
784
+ const variantStyles = variant === "mobile"
785
+ ? `className={cn("min-h-[44px] min-w-[44px] p-2 text-sm", className)}`
786
+ : `className={cn("min-h-[32px] min-w-[32px] p-4 text-base", className)}`;
787
+ // Replace className patterns with variant-specific ones
788
+ let modifiedCode = code.replace(/className=\{cn\([^}]+\)\}/g, variantStyles);
789
+ // Add variant-specific imports if not present
790
+ if (!modifiedCode.includes("import { cn }")) {
791
+ modifiedCode = variantImports + modifiedCode;
792
+ }
793
+ return modifiedCode;
794
+ }
795
+ async generateCoreIndexFiles(coreComponents, mobileDir, desktopDir) {
796
+ // Generate mobile index
797
+ const mobileIndexContent = coreComponents
798
+ .map((comp) => `export { ${comp.name} } from './${comp.name}';`)
799
+ .join("\n");
800
+ await this.fs.writeFile(path.join(mobileDir, "index.ts"), mobileIndexContent);
801
+ // Generate desktop index
802
+ const desktopIndexContent = coreComponents
803
+ .map((comp) => `export { ${comp.name} } from './${comp.name}';`)
804
+ .join("\n");
805
+ await this.fs.writeFile(path.join(desktopDir, "index.ts"), desktopIndexContent);
806
+ console.log(chalk_1.default.green(" ✅ Generated index files for mobile and desktop variants"));
807
+ }
808
+ async openPreview() {
809
+ try {
810
+ // Try to open in browser
811
+ const url = "http://localhost:3000/mycontext-preview";
812
+ // Check if Next.js dev server is running
813
+ try {
814
+ (0, child_process_1.execSync)("curl -s http://localhost:3000 > /dev/null", {
815
+ stdio: "pipe",
816
+ });
817
+ console.log(chalk_1.default.green(`✅ Opening preview at ${url}`));
818
+ // Open in browser
819
+ (0, child_process_1.execSync)(`open ${url}`, { stdio: "pipe" });
820
+ }
821
+ catch {
822
+ console.log(chalk_1.default.yellow("⚠️ Next.js dev server not running"));
823
+ console.log(chalk_1.default.blue("💡 Start your Next.js app with: npm run dev"));
824
+ console.log(chalk_1.default.blue(` Then visit: ${url}`));
825
+ }
826
+ }
827
+ catch (error) {
828
+ console.log(chalk_1.default.yellow("⚠️ Could not open browser automatically"));
829
+ console.log(chalk_1.default.blue("💡 Manually visit: http://localhost:3000/mycontext-preview"));
830
+ }
831
+ }
832
+ async runPostGenerationChecks(componentsDir) {
833
+ console.log(chalk_1.default.blue("🔍 Running post-generation checks..."));
834
+ try {
835
+ // TypeScript check
836
+ console.log(chalk_1.default.gray(" Running TypeScript check..."));
837
+ (0, child_process_1.execSync)("npx tsc --noEmit", { stdio: "pipe" });
838
+ console.log(chalk_1.default.green(" ✅ TypeScript check passed"));
839
+ // Lint check
840
+ console.log(chalk_1.default.gray(" Running ESLint..."));
841
+ (0, child_process_1.execSync)("npx eslint .mycontext/components --ext .ts,.tsx", {
842
+ stdio: "pipe",
843
+ });
844
+ console.log(chalk_1.default.green(" ✅ ESLint check passed"));
845
+ }
846
+ catch (error) {
847
+ console.log(chalk_1.default.yellow(" ⚠️ Some checks failed, but components were generated"));
848
+ }
849
+ }
538
850
  async generateComponentGroup(groupName, options, spinner, userId) {
539
851
  spinner.updateText(`Generating ${groupName} components...`);
540
852
  // Read component list
@@ -737,6 +1049,11 @@ class GenerateComponentsCommand {
737
1049
  console.log(`🔍 DEBUG: About to call orchestrator.executeAgent for CodeGenSubAgent (attempt ${retryCount + 1}/${maxRetries + 1})`);
738
1050
  // Use stack configuration timeout if available
739
1051
  const timeout = this.stackConfig?.timeouts?.generation || 60000;
1052
+ // Get enriched context for better AI generation
1053
+ const { enrichedContext } = await this.contextLoader.loadUnifiedDesignContext();
1054
+ const formattedContext = this.contextLoader
1055
+ .getContextEnricher()
1056
+ .formatContextForModel(enrichedContext);
740
1057
  codeResult = (await Promise.race([
741
1058
  orchestrator.executeAgent("CodeGenSubAgent", {
742
1059
  component,
@@ -744,11 +1061,17 @@ class GenerateComponentsCommand {
744
1061
  options: {
745
1062
  ...options,
746
1063
  context: {
1064
+ // Legacy format for compatibility
747
1065
  prd: this.contextArtifacts.prd,
748
1066
  types: this.contextArtifacts.types,
749
1067
  branding: this.contextArtifacts.brand,
750
1068
  componentList: this.contextArtifacts.compListRaw,
751
- stackConfig: this.stackConfig, // Pass stack config to AI
1069
+ stackConfig: this.stackConfig,
1070
+ // Enhanced context from design manifest
1071
+ enrichedContext: formattedContext,
1072
+ designSystem: enrichedContext.design_system,
1073
+ designIntent: enrichedContext.design_intent,
1074
+ visualTokens: enrichedContext.visual_tokens,
752
1075
  },
753
1076
  },
754
1077
  }),
@@ -1663,11 +1986,18 @@ export default function PreviewPage() {
1663
1986
  const totalRoutes = new Set(queue.flatMap((item) => item.routes.map((r) => r.path))).size;
1664
1987
  console.log(chalk_1.default.gray(` • ${totalRoutes} routes in ${appDir}`));
1665
1988
  }
1666
- console.log(chalk_1.default.blue("\n📖 Next Steps:"));
1667
- console.log(chalk_1.default.gray(" 1. Review generated components in components/"));
1668
- console.log(chalk_1.default.gray(" 2. Review server actions in actions/"));
1669
- console.log(chalk_1.default.gray(" 3. Review routes in app/"));
1670
- console.log(chalk_1.default.gray(" 4. Run: npm run dev"));
1989
+ console.log(chalk_1.default.green("\n All components generated successfully!"));
1990
+ console.log(chalk_1.default.blue("\n➡️ Next Steps:"));
1991
+ console.log(chalk_1.default.cyan(" 1. Preview components:"));
1992
+ console.log(chalk_1.default.white(" mycontext preview components"));
1993
+ console.log(chalk_1.default.cyan(" 2. Run tests:"));
1994
+ console.log(chalk_1.default.white(" npm test"));
1995
+ console.log(chalk_1.default.cyan(" 3. Start development:"));
1996
+ console.log(chalk_1.default.white(" npm run dev"));
1997
+ console.log(chalk_1.default.gray("\n Additional:"));
1998
+ console.log(chalk_1.default.gray(" • Review generated components in components/"));
1999
+ console.log(chalk_1.default.gray(" • Review server actions in actions/"));
2000
+ console.log(chalk_1.default.gray(" • Review routes in app/"));
1671
2001
  }
1672
2002
  /**
1673
2003
  * Convert component list to EnhancedComponent format