kubit-forge 0.0.1-canary.85d379a

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 (201) hide show
  1. package/CHANGELOG.md +229 -0
  2. package/LICENSE +201 -0
  3. package/README.md +841 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +14294 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +772 -0
  8. package/dist/index.js +1979 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/templates/README.md +243 -0
  11. package/dist/templates/config/README.md +94 -0
  12. package/dist/templates/config/config-templates.ts +138 -0
  13. package/dist/templates/config/defaults.ts +105 -0
  14. package/dist/templates/config/index.ts +6 -0
  15. package/dist/templates/features/.prettierignore.template +28 -0
  16. package/dist/templates/features/.prettierrc.template +10 -0
  17. package/dist/templates/features/README.md +111 -0
  18. package/dist/templates/features/bernova-foundations.ts.template +50 -0
  19. package/dist/templates/features/bernova-globalStyles.ts.template +33 -0
  20. package/dist/templates/features/bernova-mediaQueries.ts.template +6 -0
  21. package/dist/templates/features/bernova-theme.ts.template +1 -0
  22. package/dist/templates/features/bernova.config.json.template +58 -0
  23. package/dist/templates/features/changesets-config.json.template +11 -0
  24. package/dist/templates/features/changesets-readme.md.template +31 -0
  25. package/dist/templates/features/commitlint.config.js.template +23 -0
  26. package/dist/templates/features/cypress-support-commands.ts.template +22 -0
  27. package/dist/templates/features/cypress-support-e2e.ts.template +20 -0
  28. package/dist/templates/features/cypress.config.ts.template +23 -0
  29. package/dist/templates/features/eslint.config.js.template +13 -0
  30. package/dist/templates/features/husky-commit-msg.template +4 -0
  31. package/dist/templates/features/husky-pre-commit.template +4 -0
  32. package/dist/templates/features/index.ts +5 -0
  33. package/dist/templates/features/jest-setup.ts.template +1 -0
  34. package/dist/templates/features/jest.config.ts.template +23 -0
  35. package/dist/templates/features/lint-staged.config.js.template +5 -0
  36. package/dist/templates/features/playwright-example.spec.ts.template +14 -0
  37. package/dist/templates/features/playwright.config.ts.template +42 -0
  38. package/dist/templates/features/template-loader.ts +31 -0
  39. package/dist/templates/features/vitest-setup.ts.template +1 -0
  40. package/dist/templates/features/vitest.config.ts.template +11 -0
  41. package/dist/templates/generators/README.md +181 -0
  42. package/dist/templates/generators/index.ts +9 -0
  43. package/dist/templates/generators/plugin.ts +245 -0
  44. package/dist/templates/generators/react-app-bernova.ts +356 -0
  45. package/dist/templates/generators/react-component.ts +103 -0
  46. package/dist/templates/generators/react-hook.ts +56 -0
  47. package/dist/templates/generators/react-kubit-ui.ts +794 -0
  48. package/dist/templates/generators/react-page.ts +65 -0
  49. package/dist/templates-physical/kubit-full/.prettierrc +0 -0
  50. package/dist/templates-physical/kubit-full/README.md +223 -0
  51. package/dist/templates-physical/kubit-full/bernova.config.json +0 -0
  52. package/dist/templates-physical/kubit-full/eslint.config.js +0 -0
  53. package/dist/templates-physical/kubit-full/index.html +17 -0
  54. package/dist/templates-physical/kubit-full/package.json +53 -0
  55. package/dist/templates-physical/kubit-full/src/App.css +118 -0
  56. package/dist/templates-physical/kubit-full/src/App.tsx +75 -0
  57. package/dist/templates-physical/kubit-full/src/charts/ChartsShowcase.css +0 -0
  58. package/dist/templates-physical/kubit-full/src/charts/ChartsShowcase.tsx +0 -0
  59. package/dist/templates-physical/kubit-full/src/components/ComponentsShowcase.css +147 -0
  60. package/dist/templates-physical/kubit-full/src/components/ComponentsShowcase.tsx +0 -0
  61. package/dist/templates-physical/kubit-full/src/main.tsx +0 -0
  62. package/dist/templates-physical/kubit-full/src/styles/index.css +6 -0
  63. package/dist/templates-physical/kubit-full/src/styles/theme/components/button.ts +0 -0
  64. package/dist/templates-physical/kubit-full/src/styles/theme/components/card.ts +0 -0
  65. package/dist/templates-physical/kubit-full/src/styles/theme/components/input.ts +0 -0
  66. package/dist/templates-physical/kubit-full/src/styles/theme/foundations.ts +0 -0
  67. package/dist/templates-physical/kubit-full/src/styles/theme/globalStyles.ts +0 -0
  68. package/dist/templates-physical/kubit-full/src/styles/theme/mediaQueries.ts +0 -0
  69. package/dist/templates-physical/kubit-full/src/styles/theme/theme.ts +0 -0
  70. package/dist/templates-physical/kubit-full/src/test/setup.ts +0 -0
  71. package/dist/templates-physical/kubit-full/tsconfig.json +29 -0
  72. package/dist/templates-physical/kubit-full/tsconfig.node.json +11 -0
  73. package/dist/templates-physical/kubit-full/vite.config.ts +24 -0
  74. package/dist/templates-physical/kubit-full/vitest.config.ts +26 -0
  75. package/dist/templates-physical/react/.env.example +6 -0
  76. package/dist/templates-physical/react/.prettierrc +8 -0
  77. package/dist/templates-physical/react/README.md +81 -0
  78. package/dist/templates-physical/react/eslint.config.js +7 -0
  79. package/dist/templates-physical/react/index.html +13 -0
  80. package/dist/templates-physical/react/package.json +39 -0
  81. package/dist/templates-physical/react/src/app/App.module.css +39 -0
  82. package/dist/templates-physical/react/src/app/App.test.tsx +14 -0
  83. package/dist/templates-physical/react/src/app/App.tsx +17 -0
  84. package/dist/templates-physical/react/src/main.tsx +10 -0
  85. package/dist/templates-physical/react/src/styles/index.css +39 -0
  86. package/dist/templates-physical/react/src/test/setup.ts +57 -0
  87. package/dist/templates-physical/react/tsconfig.json +25 -0
  88. package/dist/templates-physical/react/tsconfig.node.json +10 -0
  89. package/dist/templates-physical/react/vite.config.ts +16 -0
  90. package/dist/templates-physical/react/vitest.config.ts +22 -0
  91. package/dist/templates-physical/react-bernova/.eslintrc.cjs +15 -0
  92. package/dist/templates-physical/react-bernova/.prettierrc +10 -0
  93. package/dist/templates-physical/react-bernova/README.md +150 -0
  94. package/dist/templates-physical/react-bernova/bernova.config.json +58 -0
  95. package/dist/templates-physical/react-bernova/eslint.config.js +7 -0
  96. package/dist/templates-physical/react-bernova/index.html +21 -0
  97. package/dist/templates-physical/react-bernova/package.json +43 -0
  98. package/dist/templates-physical/react-bernova/src/App.css +89 -0
  99. package/dist/templates-physical/react-bernova/src/App.tsx +51 -0
  100. package/dist/templates-physical/react-bernova/src/index.css +54 -0
  101. package/dist/templates-physical/react-bernova/src/main.tsx +10 -0
  102. package/dist/templates-physical/react-bernova/src/styles/foundations.ts +91 -0
  103. package/dist/templates-physical/react-bernova/src/styles/globalStyles.ts +118 -0
  104. package/dist/templates-physical/react-bernova/src/styles/mediaQueries.ts +18 -0
  105. package/dist/templates-physical/react-bernova/src/styles/theme.ts +94 -0
  106. package/dist/templates-physical/react-bernova/src/test/setup.ts +9 -0
  107. package/dist/templates-physical/react-bernova/tsconfig.json +31 -0
  108. package/dist/templates-physical/react-bernova/tsconfig.node.json +10 -0
  109. package/dist/templates-physical/react-bernova/vite.config.ts +20 -0
  110. package/dist/templates-physical/react-bernova/vitest.config.ts +18 -0
  111. package/dist/templates-physical/vanilla/.env.example +6 -0
  112. package/dist/templates-physical/vanilla/.prettierrc +8 -0
  113. package/dist/templates-physical/vanilla/README.md +76 -0
  114. package/dist/templates-physical/vanilla/eslint.config.js +7 -0
  115. package/dist/templates-physical/vanilla/index.html +13 -0
  116. package/dist/templates-physical/vanilla/package.json +28 -0
  117. package/dist/templates-physical/vanilla/src/app.module.css +39 -0
  118. package/dist/templates-physical/vanilla/src/app.test.ts +20 -0
  119. package/dist/templates-physical/vanilla/src/app.ts +31 -0
  120. package/dist/templates-physical/vanilla/src/main.ts +9 -0
  121. package/dist/templates-physical/vanilla/src/styles/main.css +39 -0
  122. package/dist/templates-physical/vanilla/tsconfig.json +23 -0
  123. package/dist/templates-physical/vanilla/vite.config.ts +14 -0
  124. package/dist/templates-physical/vanilla/vitest.config.ts +14 -0
  125. package/package.json +131 -0
  126. package/templates/kubit-full/.prettierrc +0 -0
  127. package/templates/kubit-full/README.md +223 -0
  128. package/templates/kubit-full/bernova.config.json +0 -0
  129. package/templates/kubit-full/eslint.config.js +0 -0
  130. package/templates/kubit-full/index.html +17 -0
  131. package/templates/kubit-full/package.json +53 -0
  132. package/templates/kubit-full/src/App.css +118 -0
  133. package/templates/kubit-full/src/App.tsx +75 -0
  134. package/templates/kubit-full/src/charts/ChartsShowcase.css +0 -0
  135. package/templates/kubit-full/src/charts/ChartsShowcase.tsx +0 -0
  136. package/templates/kubit-full/src/components/ComponentsShowcase.css +147 -0
  137. package/templates/kubit-full/src/components/ComponentsShowcase.tsx +0 -0
  138. package/templates/kubit-full/src/main.tsx +0 -0
  139. package/templates/kubit-full/src/styles/index.css +6 -0
  140. package/templates/kubit-full/src/styles/theme/components/button.ts +0 -0
  141. package/templates/kubit-full/src/styles/theme/components/card.ts +0 -0
  142. package/templates/kubit-full/src/styles/theme/components/input.ts +0 -0
  143. package/templates/kubit-full/src/styles/theme/foundations.ts +0 -0
  144. package/templates/kubit-full/src/styles/theme/globalStyles.ts +0 -0
  145. package/templates/kubit-full/src/styles/theme/mediaQueries.ts +0 -0
  146. package/templates/kubit-full/src/styles/theme/theme.ts +0 -0
  147. package/templates/kubit-full/src/test/setup.ts +0 -0
  148. package/templates/kubit-full/tsconfig.json +29 -0
  149. package/templates/kubit-full/tsconfig.node.json +11 -0
  150. package/templates/kubit-full/vite.config.ts +24 -0
  151. package/templates/kubit-full/vitest.config.ts +26 -0
  152. package/templates/react/.env.example +6 -0
  153. package/templates/react/.prettierrc +8 -0
  154. package/templates/react/README.md +81 -0
  155. package/templates/react/eslint.config.js +7 -0
  156. package/templates/react/index.html +13 -0
  157. package/templates/react/package.json +39 -0
  158. package/templates/react/src/app/App.module.css +39 -0
  159. package/templates/react/src/app/App.test.tsx +14 -0
  160. package/templates/react/src/app/App.tsx +17 -0
  161. package/templates/react/src/main.tsx +10 -0
  162. package/templates/react/src/styles/index.css +39 -0
  163. package/templates/react/src/test/setup.ts +57 -0
  164. package/templates/react/tsconfig.json +25 -0
  165. package/templates/react/tsconfig.node.json +10 -0
  166. package/templates/react/vite.config.ts +16 -0
  167. package/templates/react/vitest.config.ts +22 -0
  168. package/templates/react-bernova/.eslintrc.cjs +15 -0
  169. package/templates/react-bernova/.prettierrc +10 -0
  170. package/templates/react-bernova/README.md +150 -0
  171. package/templates/react-bernova/bernova.config.json +58 -0
  172. package/templates/react-bernova/eslint.config.js +7 -0
  173. package/templates/react-bernova/index.html +21 -0
  174. package/templates/react-bernova/package.json +43 -0
  175. package/templates/react-bernova/src/App.css +89 -0
  176. package/templates/react-bernova/src/App.tsx +51 -0
  177. package/templates/react-bernova/src/index.css +54 -0
  178. package/templates/react-bernova/src/main.tsx +10 -0
  179. package/templates/react-bernova/src/styles/foundations.ts +91 -0
  180. package/templates/react-bernova/src/styles/globalStyles.ts +118 -0
  181. package/templates/react-bernova/src/styles/mediaQueries.ts +18 -0
  182. package/templates/react-bernova/src/styles/theme.ts +94 -0
  183. package/templates/react-bernova/src/test/setup.ts +9 -0
  184. package/templates/react-bernova/tsconfig.json +31 -0
  185. package/templates/react-bernova/tsconfig.node.json +10 -0
  186. package/templates/react-bernova/vite.config.ts +20 -0
  187. package/templates/react-bernova/vitest.config.ts +18 -0
  188. package/templates/vanilla/.env.example +6 -0
  189. package/templates/vanilla/.prettierrc +8 -0
  190. package/templates/vanilla/README.md +76 -0
  191. package/templates/vanilla/eslint.config.js +7 -0
  192. package/templates/vanilla/index.html +13 -0
  193. package/templates/vanilla/package.json +28 -0
  194. package/templates/vanilla/src/app.module.css +39 -0
  195. package/templates/vanilla/src/app.test.ts +20 -0
  196. package/templates/vanilla/src/app.ts +31 -0
  197. package/templates/vanilla/src/main.ts +9 -0
  198. package/templates/vanilla/src/styles/main.css +39 -0
  199. package/templates/vanilla/tsconfig.json +23 -0
  200. package/templates/vanilla/vite.config.ts +14 -0
  201. package/templates/vanilla/vitest.config.ts +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/plugin-manager.ts","../src/core/plugin-dependency-resolver.ts","../src/core/plugin-registry.ts","../src/core/plugin-sandbox.ts","../src/core/plugin-validator.ts","../src/core/plugin-version-manager.ts","../src/types/index.ts","../src/utils/config-loader.ts","../src/templates/config/defaults.ts","../src/templates/config/config-templates.ts","../src/utils/logger.ts","../src/utils/theme.ts","../src/utils/task-runner.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { join } from 'path';\n\nimport type {\n Plugin,\n PluginContext,\n CommandRegistration,\n TaskRegistration,\n GeneratorRegistration,\n ProviderRegistration,\n Logger,\n CommandResult,\n TaskResult,\n} from '../types/index.js';\nimport type { PluginMetadata } from './plugin-dependency-resolver.js';\n\nimport { PluginDependencyResolver } from './plugin-dependency-resolver.js';\nimport { PluginRegistry } from './plugin-registry.js';\nimport { SandboxManager } from './plugin-sandbox.js';\nimport { PluginValidator } from './plugin-validator.js';\nimport { PluginVersionManager } from './plugin-version-manager.js';\n\nexport interface PluginLoadOptions {\n validate?: boolean;\n skipSecurityCheck?: boolean;\n useSandbox?: boolean;\n checkDependencies?: boolean;\n}\n\nexport class PluginManager {\n private plugins: Map<string, Plugin> = new Map();\n private commands: Map<string, CommandRegistration> = new Map();\n private tasks: Map<string, TaskRegistration> = new Map();\n private generators: Map<string, GeneratorRegistration> = new Map();\n private providers: Map<string, ProviderRegistration[]> = new Map();\n private logger: Logger;\n private cwd: string;\n private validator: PluginValidator;\n private registry: PluginRegistry;\n private sandboxManager: SandboxManager;\n private versionManager: PluginVersionManager;\n private dependencyResolver: PluginDependencyResolver;\n\n constructor(logger: Logger, cwd: string) {\n this.logger = logger;\n this.cwd = cwd;\n this.validator = new PluginValidator();\n this.registry = new PluginRegistry(logger);\n this.sandboxManager = new SandboxManager(logger);\n this.versionManager = new PluginVersionManager(logger);\n this.dependencyResolver = new PluginDependencyResolver(logger);\n }\n\n /**\n * Load plugins from config or auto-detect\n */\n async loadPlugins(\n pluginNames: string[],\n ctx: PluginContext,\n options: PluginLoadOptions = {}\n ): Promise<void> {\n // Resolve dependencies first\n if (options.checkDependencies !== false) {\n const resolution = this.dependencyResolver.resolve(pluginNames);\n\n if (resolution.errors.length > 0) {\n this.logger.error('Plugin dependency resolution failed:');\n resolution.errors.forEach((err) => this.logger.error(` - ${err}`));\n throw new Error('Cannot load plugins due to dependency errors');\n }\n\n if (resolution.warnings.length > 0) {\n resolution.warnings.forEach((warn) => this.logger.warn(warn));\n }\n\n // Use resolved load order\n pluginNames = resolution.loadOrder;\n this.logger.debug(`Plugin load order: ${pluginNames.join(' -> ')}`);\n }\n\n // Load plugins in order\n for (const pluginName of pluginNames) {\n try {\n await this.loadPlugin(pluginName, ctx, options);\n } catch (error) {\n this.logger.warn(\n `Failed to load plugin '${pluginName}': ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n }\n\n /**\n * Load a single plugin\n */\n private async loadPlugin(\n pluginName: string,\n ctx: PluginContext,\n options: PluginLoadOptions = {}\n ): Promise<void> {\n // Try to resolve plugin\n let pluginModule: { default?: Plugin; [key: string]: unknown };\n\n try {\n // Try as npm package\n const pluginPath = join(this.cwd, 'node_modules', pluginName);\n if (existsSync(pluginPath)) {\n pluginModule = await import(pluginPath);\n } else {\n // Try as local path\n pluginModule = await import(pluginName);\n }\n } catch {\n throw new Error(`Cannot resolve plugin '${pluginName}'`);\n }\n\n const plugin = (pluginModule.default || pluginModule) as Plugin;\n\n if (!plugin.name || !plugin.version) {\n throw new Error(`Invalid plugin '${pluginName}': missing name or version`);\n }\n\n // Register version\n this.versionManager.registerInstalled(plugin.name, plugin.version);\n\n // Check version compatibility\n const versionCheck = this.versionManager.checkCompatibility(plugin.name);\n if (!versionCheck.compatible) {\n this.logger.error(`Plugin '${plugin.name}' version compatibility check failed:`);\n versionCheck.issues.forEach((issue) => this.logger.error(` - ${issue}`));\n throw new Error(`Plugin '${plugin.name}' is not compatible`);\n }\n\n if (versionCheck.warnings.length > 0) {\n versionCheck.warnings.forEach((warn) => this.logger.warn(warn));\n }\n\n // Validate plugin if requested\n if (options.validate !== false) {\n const validation = this.validator.validate(plugin);\n\n if (!validation.valid) {\n throw new Error(\n `Plugin '${plugin.name}' validation failed:\\n${validation.errors.join('\\n')}`\n );\n }\n\n // Show warnings\n if (validation.warnings.length > 0) {\n for (const warning of validation.warnings) {\n this.logger.warn(`Plugin '${plugin.name}': ${warning}`);\n }\n }\n\n // Check security issues\n if (!options.skipSecurityCheck && validation.securityIssues.length > 0) {\n this.logger.warn(`\\nSecurity notice for plugin '${plugin.name}':`);\n for (const issue of validation.securityIssues) {\n this.logger.warn(` - ${issue}`);\n }\n\n const securityLevel = this.validator.getSecurityLevel(plugin);\n if (securityLevel === 'dangerous') {\n this.logger.warn(\n '\\nThis plugin requires dangerous permissions. Only install if you trust the source.'\n );\n }\n }\n }\n\n // Store plugin\n this.plugins.set(plugin.name, plugin);\n\n // Call onLoad hook\n if (plugin.onLoad) {\n await plugin.onLoad(ctx);\n }\n\n // Register commands\n if (plugin.registerCommands) {\n const commands = plugin.registerCommands();\n for (const cmd of commands) {\n this.commands.set(cmd.name, cmd);\n this.logger.debug(`Registered command '${cmd.name}' from plugin '${plugin.name}'`);\n }\n }\n\n // Register tasks\n if (plugin.registerTasks) {\n const tasks = plugin.registerTasks();\n for (const task of tasks) {\n this.tasks.set(task.name, task);\n this.logger.debug(`Registered task '${task.name}' from plugin '${plugin.name}'`);\n }\n }\n\n // Register generators\n if (plugin.registerGenerators) {\n const generators = plugin.registerGenerators();\n for (const gen of generators) {\n this.generators.set(gen.kind, gen);\n this.logger.debug(`Registered generator '${gen.kind}' from plugin '${plugin.name}'`);\n }\n }\n\n // Register providers\n if (plugin.registerProviders) {\n const providers = plugin.registerProviders();\n for (const provider of providers) {\n if (!this.providers.has(provider.command)) {\n this.providers.set(provider.command, []);\n }\n this.providers.get(provider.command)!.push(provider);\n this.logger.debug(\n `Registered provider for '${provider.command}' from plugin '${plugin.name}'`\n );\n }\n }\n\n this.logger.debug(`Loaded plugin '${plugin.name}' v${plugin.version}`);\n }\n\n /**\n * Get all loaded plugins\n */\n getPlugins(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Get command by name\n */\n getCommand(name: string): CommandRegistration | undefined {\n return this.commands.get(name);\n }\n\n /**\n * Get all commands\n */\n getCommands(): CommandRegistration[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Get task by name\n */\n getTask(name: string): TaskRegistration | undefined {\n return this.tasks.get(name);\n }\n\n /**\n * Get all tasks\n */\n getTasks(): TaskRegistration[] {\n return Array.from(this.tasks.values());\n }\n\n /**\n * Get generator by kind\n */\n getGenerator(kind: string): GeneratorRegistration | undefined {\n return this.generators.get(kind);\n }\n\n /**\n * Get all generators\n */\n getGenerators(): GeneratorRegistration[] {\n return Array.from(this.generators.values());\n }\n\n /**\n * Get best provider for a command\n */\n getProvider(command: string, ctx: PluginContext): ProviderRegistration | undefined {\n const providers = this.providers.get(command) || [];\n\n // Filter providers that can handle this context\n const capable = providers.filter((p) => p.canHandle(ctx));\n\n if (capable.length === 0) {\n return undefined;\n }\n\n // Sort by priority (highest first)\n capable.sort((a, b) => b.priority - a.priority);\n\n return capable[0];\n }\n\n /**\n * Call beforeCommand hooks\n */\n async callBeforeCommand(command: string, ctx: PluginContext): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.beforeCommand) {\n await plugin.beforeCommand(command, ctx);\n }\n }\n }\n\n /**\n * Call afterCommand hooks\n */\n async callAfterCommand(command: string, ctx: PluginContext, result: unknown): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.afterCommand) {\n await plugin.afterCommand(command, ctx, result as CommandResult);\n }\n }\n }\n\n /**\n * Call beforeTask hooks\n */\n async callBeforeTask(task: string, ctx: PluginContext): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.beforeTask) {\n await plugin.beforeTask(task, ctx);\n }\n }\n }\n\n /**\n * Call afterTask hooks\n */\n async callAfterTask(task: string, ctx: PluginContext, result: unknown): Promise<void> {\n for (const plugin of this.plugins.values()) {\n if (plugin.afterTask) {\n await plugin.afterTask(task, ctx, result as TaskResult);\n }\n }\n }\n\n /**\n * Search for plugins in registry\n */\n async searchPlugins(query: string, options?: { verified?: boolean; category?: string }) {\n return this.registry.search(query, options);\n }\n\n /**\n * Get plugin info from registry\n */\n async getPluginInfo(name: string) {\n return this.registry.getInfo(name);\n }\n\n /**\n * Get featured plugins\n */\n async getFeaturedPlugins() {\n return this.registry.getFeatured();\n }\n\n /**\n * Check if plugin is loaded\n */\n isLoaded(pluginName: string): boolean {\n return this.plugins.has(pluginName);\n }\n\n /**\n * Get loaded plugin by name\n */\n getPlugin(pluginName: string): Plugin | undefined {\n return this.plugins.get(pluginName);\n }\n\n /**\n * Unload a plugin\n */\n async unloadPlugin(pluginName: string): Promise<void> {\n const plugin = this.plugins.get(pluginName);\n if (!plugin) {\n return;\n }\n\n // Remove registered commands\n if (plugin.registerCommands) {\n const commands = plugin.registerCommands();\n for (const cmd of commands) {\n this.commands.delete(cmd.name);\n }\n }\n\n // Remove registered tasks\n if (plugin.registerTasks) {\n const tasks = plugin.registerTasks();\n for (const task of tasks) {\n this.tasks.delete(task.name);\n }\n }\n\n // Remove registered generators\n if (plugin.registerGenerators) {\n const generators = plugin.registerGenerators();\n for (const gen of generators) {\n this.generators.delete(gen.kind);\n }\n }\n\n // Remove registered providers\n if (plugin.registerProviders) {\n const providers = plugin.registerProviders();\n for (const provider of providers) {\n const list = this.providers.get(provider.command);\n if (list) {\n const index = list.indexOf(provider);\n if (index !== -1) {\n list.splice(index, 1);\n }\n }\n }\n }\n\n // Remove plugin\n this.plugins.delete(pluginName);\n this.logger.debug(`Unloaded plugin '${pluginName}'`);\n }\n\n /**\n * Get plugin statistics\n */\n getStats() {\n return {\n commands: this.commands.size,\n dependencies: this.dependencyResolver.getStats(),\n generators: this.generators.size,\n plugins: this.plugins.size,\n providers: Array.from(this.providers.values()).reduce((sum, list) => sum + list.length, 0),\n tasks: this.tasks.size,\n versions: this.versionManager.getStats(),\n };\n }\n\n /**\n * Get version manager\n */\n getVersionManager(): PluginVersionManager {\n return this.versionManager;\n }\n\n /**\n * Get dependency resolver\n */\n getDependencyResolver(): PluginDependencyResolver {\n return this.dependencyResolver;\n }\n\n /**\n * Get sandbox manager\n */\n getSandboxManager(): SandboxManager {\n return this.sandboxManager;\n }\n\n /**\n * Register plugin metadata for dependency resolution\n */\n registerPluginMetadata(metadata: PluginMetadata): void {\n this.dependencyResolver.register(metadata);\n }\n\n /**\n * Check plugin updates\n */\n async checkUpdates(): Promise<Array<{ name: string; current: string; latest: string }>> {\n const updates: Array<{ name: string; current: string; latest: string }> = [];\n\n for (const plugin of this.plugins.values()) {\n try {\n const info = await this.registry.getInfo(plugin.name);\n if (info && info.version) {\n this.versionManager.setLatest(plugin.name, info.version);\n\n if (this.versionManager.hasUpdate(plugin.name)) {\n updates.push({\n current: plugin.version,\n latest: info.version,\n name: plugin.name,\n });\n }\n }\n } catch {\n // Ignore errors for individual plugins\n }\n }\n\n return updates;\n }\n}\n","/**\n * Plugin Dependency Resolver\n *\n * Resolves plugin dependencies, checks compatibility, and determines load order.\n */\n\nimport type { Logger } from '../types/index.js';\n\nexport interface PluginDependency {\n name: string;\n version: string;\n optional?: boolean;\n reason?: string;\n}\n\nexport interface PluginMetadata {\n name: string;\n version: string;\n dependencies?: PluginDependency[];\n peerDependencies?: PluginDependency[];\n conflicts?: string[];\n}\n\nexport interface DependencyGraph {\n nodes: Map<string, PluginMetadata>;\n edges: Map<string, Set<string>>;\n}\n\nexport interface ResolutionResult {\n loadOrder: string[];\n errors: string[];\n warnings: string[];\n missing: PluginDependency[];\n conflicts: Array<{ plugin: string; conflictsWith: string }>;\n}\n\nexport class PluginDependencyResolver {\n private logger: Logger;\n private plugins: Map<string, PluginMetadata> = new Map();\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Register plugin metadata\n */\n register(metadata: PluginMetadata): void {\n this.plugins.set(metadata.name, metadata);\n this.logger.debug(`Registered plugin metadata: ${metadata.name}@${metadata.version}`);\n }\n\n /**\n * Resolve dependencies and determine load order\n */\n resolve(pluginNames: string[]): ResolutionResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n const missing: PluginDependency[] = [];\n const conflicts: Array<{ plugin: string; conflictsWith: string }> = [];\n\n // Build dependency graph\n const graph = this.buildDependencyGraph(pluginNames);\n\n // Check for missing dependencies\n for (const pluginName of pluginNames) {\n const metadata = this.plugins.get(pluginName);\n if (!metadata) {\n // Plugin metadata not registered - it might not be installed\n // This is a warning, not an error, to allow CLI to work without plugins\n warnings.push(`Plugin '${pluginName}' not found (not installed or not registered)`);\n continue;\n }\n\n // Check required dependencies\n if (metadata.dependencies) {\n for (const dep of metadata.dependencies) {\n if (!this.plugins.has(dep.name)) {\n if (dep.optional) {\n warnings.push(\n `Optional dependency '${dep.name}' for '${pluginName}' is not installed`\n );\n } else {\n errors.push(`Required dependency '${dep.name}' for '${pluginName}' is not installed`);\n missing.push(dep);\n }\n }\n }\n }\n\n // Check peer dependencies\n if (metadata.peerDependencies) {\n for (const peer of metadata.peerDependencies) {\n if (!this.plugins.has(peer.name)) {\n warnings.push(`Peer dependency '${peer.name}' for '${pluginName}' is not installed`);\n if (!peer.optional) {\n missing.push(peer);\n }\n }\n }\n }\n\n // Check conflicts\n if (metadata.conflicts) {\n for (const conflict of metadata.conflicts) {\n if (this.plugins.has(conflict)) {\n errors.push(`Plugin '${pluginName}' conflicts with '${conflict}'`);\n conflicts.push({ conflictsWith: conflict, plugin: pluginName });\n }\n }\n }\n }\n\n // Detect circular dependencies\n const circular = this.detectCircularDependencies(graph);\n if (circular.length > 0) {\n errors.push(`Circular dependencies detected: ${circular.join(' -> ')}`);\n }\n\n // Calculate load order using topological sort\n let loadOrder: string[] = [];\n if (errors.length === 0) {\n try {\n loadOrder = this.topologicalSort(graph);\n } catch (error) {\n errors.push(\n `Failed to resolve load order: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n return {\n conflicts,\n errors,\n loadOrder,\n missing,\n warnings,\n };\n }\n\n /**\n * Build dependency graph\n */\n private buildDependencyGraph(pluginNames: string[]): DependencyGraph {\n const nodes = new Map<string, PluginMetadata>();\n const edges = new Map<string, Set<string>>();\n\n const visited = new Set<string>();\n const queue = [...pluginNames];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (visited.has(current)) {\n continue;\n }\n\n visited.add(current);\n const metadata = this.plugins.get(current);\n\n if (!metadata) {\n continue;\n }\n\n nodes.set(current, metadata);\n\n // Add edges for dependencies\n if (metadata.dependencies) {\n for (const dep of metadata.dependencies) {\n if (!edges.has(current)) {\n edges.set(current, new Set());\n }\n edges.get(current)!.add(dep.name);\n\n // Add dependency to queue\n if (!visited.has(dep.name)) {\n queue.push(dep.name);\n }\n }\n }\n\n // Add edges for peer dependencies\n if (metadata.peerDependencies) {\n for (const peer of metadata.peerDependencies) {\n if (!edges.has(current)) {\n edges.set(current, new Set());\n }\n edges.get(current)!.add(peer.name);\n\n if (!visited.has(peer.name)) {\n queue.push(peer.name);\n }\n }\n }\n }\n\n return { edges, nodes };\n }\n\n /**\n * Detect circular dependencies\n */\n private detectCircularDependencies(graph: DependencyGraph): string[] {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const path: string[] = [];\n\n const dfs = (node: string): boolean => {\n visited.add(node);\n recursionStack.add(node);\n path.push(node);\n\n const dependencies = graph.edges.get(node) || new Set();\n for (const dep of dependencies) {\n if (!visited.has(dep)) {\n if (dfs(dep)) {\n return true;\n }\n } else if (recursionStack.has(dep)) {\n // Found cycle\n return true;\n }\n }\n\n recursionStack.delete(node);\n path.pop();\n return false;\n };\n\n for (const node of graph.nodes.keys()) {\n if (!visited.has(node)) {\n if (dfs(node)) {\n return path;\n }\n }\n }\n\n return [];\n }\n\n /**\n * Topological sort to determine load order\n */\n private topologicalSort(graph: DependencyGraph): string[] {\n const inDegree = new Map<string, number>();\n const result: string[] = [];\n\n // Initialize in-degree\n for (const node of graph.nodes.keys()) {\n inDegree.set(node, 0);\n }\n\n // Calculate in-degree\n for (const dependencies of graph.edges.values()) {\n for (const dep of dependencies) {\n if (graph.nodes.has(dep)) {\n inDegree.set(dep, (inDegree.get(dep) || 0) + 1);\n }\n }\n }\n\n // Queue nodes with in-degree 0\n const queue: string[] = [];\n for (const [node, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(node);\n }\n }\n\n // Process queue\n while (queue.length > 0) {\n const current = queue.shift()!;\n result.push(current);\n\n const dependencies = graph.edges.get(current) || new Set();\n for (const dep of dependencies) {\n if (!graph.nodes.has(dep)) {\n continue;\n }\n\n const newDegree = (inDegree.get(dep) || 0) - 1;\n inDegree.set(dep, newDegree);\n\n if (newDegree === 0) {\n queue.push(dep);\n }\n }\n }\n\n // Check if all nodes were processed\n if (result.length !== graph.nodes.size) {\n throw new Error('Circular dependency detected');\n }\n\n return result.reverse(); // Reverse to get correct load order\n }\n\n /**\n * Get dependency tree for a plugin\n */\n getDependencyTree(pluginName: string): DependencyTree {\n const metadata = this.plugins.get(pluginName);\n if (!metadata) {\n return { dependencies: [], name: pluginName, version: 'unknown' };\n }\n\n const tree: DependencyTree = {\n dependencies: [],\n name: metadata.name,\n version: metadata.version,\n };\n\n if (metadata.dependencies) {\n for (const dep of metadata.dependencies) {\n const depTree = this.getDependencyTree(dep.name);\n tree.dependencies.push(depTree);\n }\n }\n\n return tree;\n }\n\n /**\n * Get all dependencies (flat list)\n */\n getAllDependencies(pluginName: string): Set<string> {\n const dependencies = new Set<string>();\n const visited = new Set<string>();\n\n const traverse = (name: string) => {\n if (visited.has(name)) {\n return;\n }\n\n visited.add(name);\n const metadata = this.plugins.get(name);\n\n if (!metadata) {\n return;\n }\n\n if (metadata.dependencies) {\n for (const dep of metadata.dependencies) {\n dependencies.add(dep.name);\n traverse(dep.name);\n }\n }\n\n if (metadata.peerDependencies) {\n for (const peer of metadata.peerDependencies) {\n dependencies.add(peer.name);\n traverse(peer.name);\n }\n }\n };\n\n traverse(pluginName);\n return dependencies;\n }\n\n /**\n * Check if plugin can be safely unloaded\n */\n canUnload(pluginName: string): { canUnload: boolean; blockedBy: string[] } {\n const blockedBy: string[] = [];\n\n // Check if any loaded plugin depends on this one\n for (const [name] of this.plugins.entries()) {\n if (name === pluginName) {\n continue;\n }\n\n const deps = this.getAllDependencies(name);\n if (deps.has(pluginName)) {\n blockedBy.push(name);\n }\n }\n\n return {\n blockedBy,\n canUnload: blockedBy.length === 0,\n };\n }\n\n /**\n * Get plugins that depend on a specific plugin\n */\n getDependents(pluginName: string): string[] {\n const dependents: string[] = [];\n\n for (const [name] of this.plugins.entries()) {\n if (name === pluginName) {\n continue;\n }\n\n const metadata = this.plugins.get(name);\n if (!metadata) {\n continue;\n }\n\n if (metadata.dependencies) {\n const hasDep = metadata.dependencies.some((dep) => dep.name === pluginName);\n if (hasDep) {\n dependents.push(name);\n }\n }\n\n if (metadata.peerDependencies) {\n const hasPeer = metadata.peerDependencies.some((peer) => peer.name === pluginName);\n if (hasPeer) {\n dependents.push(name);\n }\n }\n }\n\n return dependents;\n }\n\n /**\n * Clear all registered plugins\n */\n clear(): void {\n this.plugins.clear();\n }\n\n /**\n * Get statistics\n */\n getStats() {\n let totalDeps = 0;\n let totalPeerDeps = 0;\n let totalConflicts = 0;\n\n for (const metadata of this.plugins.values()) {\n totalDeps += metadata.dependencies?.length || 0;\n totalPeerDeps += metadata.peerDependencies?.length || 0;\n totalConflicts += metadata.conflicts?.length || 0;\n }\n\n return {\n totalConflicts: totalConflicts,\n totalDependencies: totalDeps,\n totalPeerDependencies: totalPeerDeps,\n totalPlugins: this.plugins.size,\n };\n }\n}\n\nexport interface DependencyTree {\n name: string;\n version: string;\n dependencies: DependencyTree[];\n}\n","import type { Logger } from '../types/index.js';\n\n/**\n * Plugin information from registry\n */\nexport interface PluginInfo {\n /** Plugin name (npm package name) */\n name: string;\n /** Current version */\n version: string;\n /** Short description */\n description: string;\n /** Author name */\n author: string;\n /** Homepage URL */\n homepage?: string;\n /** Repository URL */\n repository?: string;\n /** Whether this is a verified plugin */\n verified: boolean;\n /** Required kubit-forge version */\n kubitVersion?: string;\n /** Plugin category */\n category: 'quality' | 'generator' | 'framework' | 'tooling' | 'utility';\n /** Download count (weekly) */\n downloads?: number;\n /** Last update date */\n updated?: string;\n /** Required capabilities */\n capabilities?: string[];\n /** Tags for search */\n tags?: string[];\n}\n\n/**\n * Plugin registry client\n *\n * Manages plugin discovery, search, and metadata retrieval.\n * Uses npm registry as source of truth with optional curated index.\n */\nexport class PluginRegistry {\n private logger: Logger;\n\n constructor(logger: Logger, _registryUrl: string = 'https://registry.npmjs.org') {\n this.logger = logger;\n }\n\n /**\n * Search for plugins matching query\n *\n * @param query - Search query\n * @param options - Search options\n * @returns Array of matching plugins\n */\n async search(\n query: string,\n options: { verified?: boolean; category?: string } = {}\n ): Promise<PluginInfo[]> {\n this.logger.debug(`Searching plugins: ${query}`);\n\n // In production, this would query npm registry or curated index\n // For now, return mock data\n const mockPlugins: PluginInfo[] = [\n {\n author: 'Kubit Team',\n capabilities: ['fs:write', 'shell:run'],\n category: 'tooling',\n description: 'Bernova Design System integration for Kubit projects',\n downloads: 15000,\n kubitVersion: '^2.0.0',\n name: '@kubit/plugin-bernova',\n tags: ['css', 'bernova', 'design-system', 'styling'],\n verified: true,\n version: '1.2.0',\n },\n {\n author: 'Kubit Team',\n capabilities: ['fs:write', 'shell:run', 'net:localhost'],\n category: 'tooling',\n description: 'Storybook integration with hot reload',\n downloads: 12000,\n kubitVersion: '^2.0.0',\n name: '@kubit/plugin-storybook',\n tags: ['storybook', 'components', 'ui'],\n verified: true,\n version: '2.0.1',\n },\n {\n author: 'Kubit Team',\n capabilities: ['fs:read', 'fs:write'],\n category: 'utility',\n description: 'Internationalization support with i18next',\n downloads: 8000,\n kubitVersion: '^2.0.0',\n name: '@kubit/plugin-i18n',\n tags: ['i18n', 'translation', 'localization'],\n verified: true,\n version: '1.5.0',\n },\n ];\n\n // Filter by query\n let results = mockPlugins.filter(\n (p) =>\n p.name.toLowerCase().includes(query.toLowerCase()) ||\n p.description.toLowerCase().includes(query.toLowerCase()) ||\n p.tags?.some((t) => t.toLowerCase().includes(query.toLowerCase()))\n );\n\n // Apply filters\n if (options.verified !== undefined) {\n results = results.filter((p) => p.verified === options.verified);\n }\n\n if (options.category) {\n results = results.filter((p) => p.category === options.category);\n }\n\n return results;\n }\n\n /**\n * Get detailed information about a plugin\n *\n * @param name - Plugin name\n * @returns Plugin information or null if not found\n */\n async getInfo(name: string): Promise<PluginInfo | null> {\n this.logger.debug(`Fetching plugin info: ${name}`);\n\n // In production, query npm registry\n // For now, return mock data\n const mockPlugin: PluginInfo = {\n author: 'Plugin Author',\n capabilities: ['fs:read'],\n category: 'utility',\n description: 'Plugin description',\n downloads: 1000,\n homepage: `https://github.com/kubit-ui/${name}`,\n kubitVersion: '^2.0.0',\n name,\n repository: `https://github.com/kubit-ui/${name}`,\n tags: ['utility'],\n updated: new Date().toISOString(),\n verified: false,\n version: '1.0.0',\n };\n\n return mockPlugin;\n }\n\n /**\n * Check if a plugin is verified\n *\n * @param name - Plugin name\n * @returns True if verified\n */\n async isVerified(name: string): Promise<boolean> {\n const info = await this.getInfo(name);\n return info?.verified || false;\n }\n\n /**\n * Get compatible plugins for current kubit-forge version\n *\n * @param kubitVersion - Current kubit-forge version\n * @returns Array of compatible plugins\n */\n async getCompatible(_kubitVersion: string): Promise<PluginInfo[]> {\n // In production, filter by semver compatibility\n return this.search('', {});\n }\n\n /**\n * Get featured/recommended plugins\n *\n * @returns Array of featured plugins\n */\n async getFeatured(): Promise<PluginInfo[]> {\n return this.search('', { verified: true });\n }\n}\n","/**\n * Plugin Sandbox\n *\n * Provides isolated execution environment for plugins with controlled access\n * to system resources and APIs.\n */\n\nimport type { Worker } from 'worker_threads';\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nimport type { Logger, Plugin } from '../types/index.js';\n\nexport interface SandboxOptions {\n timeout?: number;\n memoryLimit?: number;\n allowedCapabilities?: string[];\n allowNetwork?: boolean;\n allowFileSystem?: boolean;\n allowProcessEnv?: boolean;\n}\n\nexport interface SandboxedPlugin {\n plugin: Plugin;\n sandbox: PluginSandbox;\n}\n\nexport class PluginSandbox {\n private logger: Logger;\n private options: Required<SandboxOptions>;\n private worker?: Worker;\n private isRunning = false;\n\n constructor(logger: Logger, options: SandboxOptions = {}) {\n this.logger = logger;\n this.options = {\n allowedCapabilities: options.allowedCapabilities || [],\n allowFileSystem: options.allowFileSystem ?? true,\n allowNetwork: options.allowNetwork ?? false,\n allowProcessEnv: options.allowProcessEnv ?? true,\n memoryLimit: options.memoryLimit || 512 * 1024 * 1024, // 512MB\n timeout: options.timeout || 30000, // 30 seconds\n };\n }\n\n /**\n * Execute plugin in sandboxed environment\n */\n async execute<T>(pluginPath: string, method: string, args: unknown[]): Promise<T> {\n if (this.isRunning) {\n throw new Error('Sandbox is already running');\n }\n\n this.isRunning = true;\n\n try {\n // Validate plugin path\n if (!existsSync(pluginPath)) {\n throw new Error(`Plugin not found: ${pluginPath}`);\n }\n\n // Create sandbox context\n const sandboxContext = this.createSandboxContext();\n\n // Execute in worker thread\n const result = await this.executeInWorker<T>(pluginPath, method, args, sandboxContext);\n\n return result;\n } finally {\n this.isRunning = false;\n this.cleanup();\n }\n }\n\n /**\n * Create restricted context for plugin\n */\n private createSandboxContext(): Record<string, unknown> {\n const context: Record<string, unknown> = {\n console: {\n error: (...args: unknown[]) => this.logger.error(args.join(' ')),\n log: (...args: unknown[]) => this.logger.info(args.join(' ')),\n warn: (...args: unknown[]) => this.logger.warn(args.join(' ')),\n },\n };\n\n // Add allowed capabilities\n if (this.options.allowProcessEnv) {\n context.process = {\n arch: process.arch,\n cwd: process.cwd,\n env: { ...process.env },\n platform: process.platform,\n };\n }\n\n if (this.options.allowFileSystem) {\n // Provide restricted fs access\n context.fs = this.createRestrictedFS();\n }\n\n if (this.options.allowNetwork) {\n // Provide restricted network access\n context.fetch = fetch;\n }\n\n return context;\n }\n\n /**\n * Create restricted filesystem API\n */\n private createRestrictedFS() {\n const cwd = process.cwd();\n\n return {\n exists: (path: string) => {\n const fullPath = join(cwd, path);\n if (!fullPath.startsWith(cwd)) {\n throw new Error('Access denied: Path outside project directory');\n }\n return existsSync(fullPath);\n },\n mkdir: (path: string) => {\n const fullPath = join(cwd, path);\n if (!fullPath.startsWith(cwd)) {\n throw new Error('Access denied: Path outside project directory');\n }\n return mkdirSync(fullPath, { recursive: true });\n },\n readFile: (path: string) => {\n const fullPath = join(cwd, path);\n if (!fullPath.startsWith(cwd)) {\n throw new Error('Access denied: Path outside project directory');\n }\n return readFileSync(fullPath, 'utf-8');\n },\n writeFile: (path: string, content: string) => {\n const fullPath = join(cwd, path);\n if (!fullPath.startsWith(cwd)) {\n throw new Error('Access denied: Path outside project directory');\n }\n return writeFileSync(fullPath, content, 'utf-8');\n },\n };\n }\n\n /**\n * Execute plugin method in worker thread\n */\n private async executeInWorker<T>(\n pluginPath: string,\n method: string,\n args: unknown[],\n _context: Record<string, unknown>\n ): Promise<T> {\n const timeout = setTimeout(() => {\n if (this.worker) {\n this.worker.terminate();\n }\n }, this.options.timeout);\n\n try {\n // For now, execute directly (worker_threads require more setup)\n // In production, this should use Worker threads\n const pluginModule = await import(pluginPath);\n const plugin = pluginModule.default || pluginModule;\n const pluginInstance = plugin.default || plugin;\n\n if (!pluginInstance[method]) {\n clearTimeout(timeout);\n throw new Error(`Method '${method}' not found in plugin`);\n }\n\n const result = pluginInstance[method](...args);\n\n if (result instanceof Promise) {\n return result\n .then((res: T) => {\n clearTimeout(timeout);\n return res;\n })\n .catch((err: Error) => {\n clearTimeout(timeout);\n throw err;\n });\n }\n clearTimeout(timeout);\n return result as T;\n } catch (error) {\n clearTimeout(timeout);\n throw error;\n }\n }\n\n /**\n * Check if capability is allowed\n */\n hasCapability(capability: string): boolean {\n return this.options.allowedCapabilities.includes(capability);\n }\n\n /**\n * Get sandbox statistics\n */\n getStats() {\n return {\n allowedCapabilities: this.options.allowedCapabilities,\n allowFileSystem: this.options.allowFileSystem,\n allowNetwork: this.options.allowNetwork,\n isRunning: this.isRunning,\n memoryLimit: this.options.memoryLimit,\n timeout: this.options.timeout,\n };\n }\n\n /**\n * Cleanup resources\n */\n private cleanup(): void {\n if (this.worker) {\n this.worker.terminate();\n this.worker = undefined;\n }\n }\n\n /**\n * Terminate sandbox\n */\n terminate(): void {\n this.cleanup();\n this.isRunning = false;\n }\n}\n\n/**\n * Sandbox Manager\n * Manages multiple sandboxes for different plugins\n */\nexport class SandboxManager {\n private sandboxes: Map<string, PluginSandbox> = new Map();\n private logger: Logger;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Create sandbox for plugin\n */\n createSandbox(pluginName: string, options: SandboxOptions = {}): PluginSandbox {\n if (this.sandboxes.has(pluginName)) {\n throw new Error(`Sandbox already exists for plugin '${pluginName}'`);\n }\n\n const sandbox = new PluginSandbox(this.logger, options);\n this.sandboxes.set(pluginName, sandbox);\n\n this.logger.debug(`Created sandbox for plugin '${pluginName}'`);\n return sandbox;\n }\n\n /**\n * Get sandbox for plugin\n */\n getSandbox(pluginName: string): PluginSandbox | undefined {\n return this.sandboxes.get(pluginName);\n }\n\n /**\n * Remove sandbox\n */\n removeSandbox(pluginName: string): void {\n const sandbox = this.sandboxes.get(pluginName);\n if (sandbox) {\n sandbox.terminate();\n this.sandboxes.delete(pluginName);\n this.logger.debug(`Removed sandbox for plugin '${pluginName}'`);\n }\n }\n\n /**\n * Terminate all sandboxes\n */\n terminateAll(): void {\n for (const [pluginName, sandbox] of this.sandboxes.entries()) {\n sandbox.terminate();\n this.logger.debug(`Terminated sandbox for plugin '${pluginName}'`);\n }\n this.sandboxes.clear();\n }\n\n /**\n * Get statistics for all sandboxes\n */\n getStats() {\n const stats: Record<string, unknown> = {};\n for (const [pluginName, sandbox] of this.sandboxes.entries()) {\n stats[pluginName] = sandbox.getStats();\n }\n return {\n sandboxes: stats,\n totalSandboxes: this.sandboxes.size,\n };\n }\n}\n","/**\n * Plugin Validator\n * Validates plugin structure, security, and capabilities\n */\n\nimport type { Plugin, PluginCapability } from '../types/index.js';\n\nexport interface PluginValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n securityIssues: string[];\n}\n\nexport class PluginValidator {\n /**\n * Validate a plugin\n */\n validate(plugin: Plugin): PluginValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n const securityIssues: string[] = [];\n\n // Required fields\n if (!plugin.name) {\n errors.push('Plugin must have a name');\n } else {\n // Validate name format\n if (!/^[@a-z0-9-]+\\/[a-z0-9-]+$|^[a-z0-9-]+$/.test(plugin.name)) {\n errors.push(\n 'Plugin name must be in format \"name\" or \"@scope/name\" with lowercase letters, numbers, and hyphens'\n );\n }\n }\n\n if (!plugin.version) {\n errors.push('Plugin must have a version');\n } else {\n // Validate semver format\n if (!/^\\d+\\.\\d+\\.\\d+(-[a-z0-9.-]+)?(\\+[a-z0-9.-]+)?$/i.test(plugin.version)) {\n errors.push('Plugin version must follow semver format (e.g., 1.0.0)');\n }\n }\n\n // Validate capabilities\n if (plugin.capabilities) {\n const validCapabilities: PluginCapability[] = [\n 'fs:read',\n 'fs:write',\n 'shell:run',\n 'net:localhost',\n 'process:env',\n ];\n\n for (const cap of plugin.capabilities) {\n if (!validCapabilities.includes(cap)) {\n errors.push(`Invalid capability: ${cap}`);\n }\n\n // Security warnings for dangerous capabilities\n if (cap === 'fs:write') {\n securityIssues.push('Plugin requests file system write access');\n }\n if (cap === 'shell:run') {\n securityIssues.push('Plugin requests shell command execution');\n }\n if (cap === 'process:env') {\n warnings.push('Plugin requests access to environment variables');\n }\n }\n }\n\n // Validate lifecycle hooks\n const validHooks = [\n 'onLoad',\n 'onConfigLoaded',\n 'onProjectDetected',\n 'beforeCommand',\n 'afterCommand',\n 'beforeTask',\n 'afterTask',\n ];\n\n for (const hook of validHooks) {\n if (hook in plugin && typeof plugin[hook as keyof Plugin] !== 'function') {\n errors.push(`Hook '${hook}' must be a function`);\n }\n }\n\n // Validate registration methods\n const validRegistrations = [\n 'registerCommands',\n 'registerTasks',\n 'registerGenerators',\n 'registerProviders',\n ];\n\n for (const method of validRegistrations) {\n if (method in plugin && typeof plugin[method as keyof Plugin] !== 'function') {\n errors.push(`Registration method '${method}' must be a function`);\n }\n }\n\n // Warnings for missing common fields\n if (!plugin.capabilities || plugin.capabilities.length === 0) {\n warnings.push('Plugin does not declare any capabilities');\n }\n\n return {\n errors,\n securityIssues,\n valid: errors.length === 0,\n warnings,\n };\n }\n\n /**\n * Check if plugin requires user approval based on capabilities\n */\n requiresApproval(plugin: Plugin): boolean {\n if (!plugin.capabilities) {\n return false;\n }\n\n const dangerousCapabilities: PluginCapability[] = ['fs:write', 'shell:run'];\n return plugin.capabilities.some((cap) => dangerousCapabilities.includes(cap));\n }\n\n /**\n * Get security level of plugin\n */\n getSecurityLevel(plugin: Plugin): 'safe' | 'moderate' | 'dangerous' {\n if (!plugin.capabilities || plugin.capabilities.length === 0) {\n return 'safe';\n }\n\n const dangerousCapabilities: PluginCapability[] = ['fs:write', 'shell:run'];\n const hasDangerous = plugin.capabilities.some((cap) => dangerousCapabilities.includes(cap));\n\n if (hasDangerous) {\n return 'dangerous';\n }\n\n const moderateCapabilities: PluginCapability[] = ['process:env', 'net:localhost'];\n const hasModerate = plugin.capabilities.some((cap) => moderateCapabilities.includes(cap));\n\n if (hasModerate) {\n return 'moderate';\n }\n\n return 'safe';\n }\n\n /**\n * Validate command registration\n */\n validateCommand(command: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!command.name || typeof command.name !== 'string') {\n errors.push('Command must have a name (string)');\n }\n\n if (!command.description || typeof command.description !== 'string') {\n errors.push('Command must have a description (string)');\n }\n\n if (!command.action || typeof command.action !== 'function') {\n errors.push('Command must have an action (function)');\n }\n\n if (command.options && !Array.isArray(command.options)) {\n errors.push('Command options must be an array');\n }\n\n return {\n errors,\n valid: errors.length === 0,\n };\n }\n\n /**\n * Validate task registration\n */\n validateTask(task: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!task.name || typeof task.name !== 'string') {\n errors.push('Task must have a name (string)');\n }\n\n if (!task.description || typeof task.description !== 'string') {\n errors.push('Task must have a description (string)');\n }\n\n if (!task.run || typeof task.run !== 'function') {\n errors.push('Task must have a run function');\n }\n\n return {\n errors,\n valid: errors.length === 0,\n };\n }\n\n /**\n * Validate generator registration\n */\n validateGenerator(generator: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!generator.kind || typeof generator.kind !== 'string') {\n errors.push('Generator must have a kind (string)');\n }\n\n if (!generator.description || typeof generator.description !== 'string') {\n errors.push('Generator must have a description (string)');\n }\n\n if (!generator.generate || typeof generator.generate !== 'function') {\n errors.push('Generator must have a generate function');\n }\n\n return {\n errors,\n valid: errors.length === 0,\n };\n }\n\n /**\n * Validate provider registration\n */\n validateProvider(provider: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!provider.command || typeof provider.command !== 'string') {\n errors.push('Provider must have a command (string)');\n }\n\n if (typeof provider.priority !== 'number') {\n errors.push('Provider must have a priority (number)');\n }\n\n if (!provider.canHandle || typeof provider.canHandle !== 'function') {\n errors.push('Provider must have a canHandle function');\n }\n\n if (!provider.handler || typeof provider.handler !== 'function') {\n errors.push('Provider must have a handler function');\n }\n\n return {\n errors,\n valid: errors.length === 0,\n };\n }\n}\n","/**\n * Plugin Version Manager\n *\n * Manages plugin versions, compatibility checks, and version resolution.\n */\n\nimport { satisfies, valid, coerce, gt, lt, eq } from 'semver';\n\nimport type { Logger } from '../types/index.js';\n\nexport interface PluginVersion {\n name: string;\n version: string;\n installedVersion?: string;\n requiredVersion?: string;\n compatible: boolean;\n updateAvailable?: boolean;\n latestVersion?: string;\n}\n\nexport interface VersionConstraint {\n plugin: string;\n version: string;\n reason?: string;\n}\n\nexport interface CompatibilityCheck {\n compatible: boolean;\n issues: string[];\n warnings: string[];\n recommendations: string[];\n}\n\nexport class PluginVersionManager {\n private logger: Logger;\n private installedVersions: Map<string, string> = new Map();\n private requiredVersions: Map<string, string> = new Map();\n private latestVersions: Map<string, string> = new Map();\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n /**\n * Register installed plugin version\n */\n registerInstalled(pluginName: string, version: string): void {\n const normalized = this.normalizeVersion(version);\n if (!normalized) {\n this.logger.warn(`Invalid version for plugin '${pluginName}': ${version}`);\n return;\n }\n\n this.installedVersions.set(pluginName, normalized);\n this.logger.debug(`Registered plugin '${pluginName}' version ${normalized}`);\n }\n\n /**\n * Set required version for plugin\n */\n setRequired(pluginName: string, versionRange: string): void {\n this.requiredVersions.set(pluginName, versionRange);\n this.logger.debug(`Set required version for '${pluginName}': ${versionRange}`);\n }\n\n /**\n * Set latest available version\n */\n setLatest(pluginName: string, version: string): void {\n const normalized = this.normalizeVersion(version);\n if (normalized) {\n this.latestVersions.set(pluginName, normalized);\n }\n }\n\n /**\n * Check if plugin version satisfies requirement\n */\n satisfies(pluginName: string, versionRange: string): boolean {\n const installed = this.installedVersions.get(pluginName);\n if (!installed) {\n return false;\n }\n\n try {\n return satisfies(installed, versionRange);\n } catch {\n this.logger.warn(`Invalid version range for '${pluginName}': ${versionRange}`);\n return false;\n }\n }\n\n /**\n * Check compatibility of plugin\n */\n checkCompatibility(pluginName: string): CompatibilityCheck {\n const issues: string[] = [];\n const warnings: string[] = [];\n const recommendations: string[] = [];\n\n const installed = this.installedVersions.get(pluginName);\n const required = this.requiredVersions.get(pluginName);\n const latest = this.latestVersions.get(pluginName);\n\n // Check if installed\n if (!installed) {\n issues.push(`Plugin '${pluginName}' is not installed`);\n return { compatible: false, issues, recommendations, warnings };\n }\n\n // Check required version\n if (required && !this.satisfies(pluginName, required)) {\n issues.push(\n `Plugin '${pluginName}' version ${installed} does not satisfy requirement ${required}`\n );\n }\n\n // Check for updates\n if (latest && gt(latest, installed)) {\n warnings.push(`Plugin '${pluginName}' has an update available: ${installed} → ${latest}`);\n recommendations.push(`Run: kubit-forge plugin:update ${pluginName}`);\n }\n\n // Check if version is very old (major version behind)\n if (latest) {\n const installedMajor = parseInt(installed.split('.')[0], 10);\n const latestMajor = parseInt(latest.split('.')[0], 10);\n\n if (latestMajor > installedMajor + 1) {\n warnings.push(\n `Plugin '${pluginName}' is ${latestMajor - installedMajor} major versions behind`\n );\n recommendations.push(`Consider upgrading to version ${latest}`);\n }\n }\n\n return {\n compatible: issues.length === 0,\n issues,\n recommendations,\n warnings,\n };\n }\n\n /**\n * Get plugin version info\n */\n getVersionInfo(pluginName: string): PluginVersion {\n const installed = this.installedVersions.get(pluginName);\n const required = this.requiredVersions.get(pluginName);\n const latest = this.latestVersions.get(pluginName);\n\n const compatible = required ? this.satisfies(pluginName, required) : true;\n const updateAvailable = installed && latest ? gt(latest, installed) : false;\n\n return {\n compatible,\n installedVersion: installed,\n latestVersion: latest,\n name: pluginName,\n requiredVersion: required,\n updateAvailable,\n version: installed || 'not-installed',\n };\n }\n\n /**\n * Get all plugin versions\n */\n getAllVersions(): PluginVersion[] {\n const allPlugins = new Set([\n ...this.installedVersions.keys(),\n ...this.requiredVersions.keys(),\n ...this.latestVersions.keys(),\n ]);\n\n return Array.from(allPlugins).map((plugin) => this.getVersionInfo(plugin));\n }\n\n /**\n * Check if update is available\n */\n hasUpdate(pluginName: string): boolean {\n const installed = this.installedVersions.get(pluginName);\n const latest = this.latestVersions.get(pluginName);\n\n if (!installed || !latest) {\n return false;\n }\n\n return gt(latest, installed);\n }\n\n /**\n * Get plugins with updates available\n */\n getUpdatablePlugins(): PluginVersion[] {\n return this.getAllVersions().filter((p) => p.updateAvailable);\n }\n\n /**\n * Get incompatible plugins\n */\n getIncompatiblePlugins(): PluginVersion[] {\n return this.getAllVersions().filter((p) => !p.compatible);\n }\n\n /**\n * Resolve version conflicts\n */\n resolveConflicts(constraints: VersionConstraint[]): {\n resolved: Map<string, string>;\n conflicts: string[];\n } {\n const resolved = new Map<string, string>();\n const conflicts: string[] = [];\n\n // Group constraints by plugin\n const byPlugin = new Map<string, VersionConstraint[]>();\n for (const constraint of constraints) {\n if (!byPlugin.has(constraint.plugin)) {\n byPlugin.set(constraint.plugin, []);\n }\n byPlugin.get(constraint.plugin)!.push(constraint);\n }\n\n // Resolve each plugin\n for (const [plugin, pluginConstraints] of byPlugin.entries()) {\n if (pluginConstraints.length === 1) {\n // Single constraint, easy\n resolved.set(plugin, pluginConstraints[0].version);\n continue;\n }\n\n // Multiple constraints, find compatible version\n const versions = pluginConstraints.map((c) => c.version);\n const compatible = this.findCompatibleVersion(versions);\n\n if (compatible) {\n resolved.set(plugin, compatible);\n } else {\n conflicts.push(\n `Cannot resolve version for '${plugin}': ${versions.join(', ')} are incompatible`\n );\n }\n }\n\n return { conflicts, resolved };\n }\n\n /**\n * Find compatible version from multiple constraints\n */\n private findCompatibleVersion(versionRanges: string[]): string | null {\n // Get all installed versions that satisfy all ranges\n const candidates: string[] = [];\n\n // For simplicity, try to find a version that satisfies all ranges\n // In a real implementation, this would use a proper SAT solver\n for (const range of versionRanges) {\n const normalized = this.normalizeVersion(range);\n if (normalized && candidates.length === 0) {\n candidates.push(normalized);\n }\n }\n\n // Check if candidate satisfies all ranges\n for (const candidate of candidates) {\n const satisfiesAll = versionRanges.every((range) => {\n try {\n return satisfies(candidate, range);\n } catch {\n return false;\n }\n });\n\n if (satisfiesAll) {\n return candidate;\n }\n }\n\n return null;\n }\n\n /**\n * Normalize version string\n */\n private normalizeVersion(version: string): string | null {\n // Try to parse as valid semver\n if (valid(version)) {\n return version;\n }\n\n // Try to coerce\n const coerced = coerce(version);\n if (coerced) {\n return coerced.version;\n }\n\n return null;\n }\n\n /**\n * Compare two versions\n */\n compare(version1: string, version2: string): number {\n const v1 = this.normalizeVersion(version1);\n const v2 = this.normalizeVersion(version2);\n\n if (!v1 || !v2) {\n return 0;\n }\n\n if (gt(v1, v2)) {\n return 1;\n }\n if (lt(v1, v2)) {\n return -1;\n }\n return 0;\n }\n\n /**\n * Check if version is equal\n */\n isEqual(version1: string, version2: string): boolean {\n const v1 = this.normalizeVersion(version1);\n const v2 = this.normalizeVersion(version2);\n\n if (!v1 || !v2) {\n return false;\n }\n\n return eq(v1, v2);\n }\n\n /**\n * Get version statistics\n */\n getStats() {\n const all = this.getAllVersions();\n return {\n compatible: all.filter((p) => p.compatible).length,\n incompatible: all.filter((p) => !p.compatible).length,\n installed: all.filter((p) => p.installedVersion).length,\n totalPlugins: all.length,\n updatable: all.filter((p) => p.updateAvailable).length,\n };\n }\n\n /**\n * Clear all version data\n */\n clear(): void {\n this.installedVersions.clear();\n this.requiredVersions.clear();\n this.latestVersions.clear();\n }\n}\n","import { z } from 'zod';\n\n// ============================================================================\n// Config Schema\n// ============================================================================\n\nexport const KubitConfigSchema = z.object({\n commands: z\n .object({\n buildProvider: z.string().optional(),\n devProvider: z.string().optional(),\n })\n .optional(),\n\n env: z\n .object({\n required: z.array(z.string()).optional(),\n schema: z.string().optional(),\n })\n .optional(),\n\n kubit: z\n .object({\n cliVersion: z.string().optional(),\n })\n .optional(),\n\n paths: z\n .object({\n dist: z.string().default('dist'),\n envExample: z.string().default('.env.example'),\n envLocal: z.string().default('.env.local'),\n src: z.string().default('src'),\n })\n .optional(),\n\n plugins: z\n .object({\n enabled: z.array(z.string()).optional(),\n })\n .optional(),\n\n project: z.object({\n devPort: z.number().default(5173),\n language: z.enum(['ts', 'js']).default('ts'),\n name: z.string(),\n nodeVersion: z.string().default('20'),\n packageManager: z.enum(['pnpm', 'npm', 'yarn']).default('pnpm'),\n stack: z.enum(['react', 'vanilla']),\n type: z.enum(['web', 'library']).default('web'),\n }),\n\n quality: z\n .object({\n format: z.boolean().default(true),\n lint: z.boolean().default(true),\n typecheck: z.boolean().default(true),\n unitTest: z.boolean().default(true),\n })\n .optional(),\n});\n\nexport type KubitConfig = z.infer<typeof KubitConfigSchema>;\n\n// ============================================================================\n// Plugin System Types\n// ============================================================================\n\nexport interface PluginContext {\n config: KubitConfig;\n cwd: string;\n logger: Logger;\n runner: TaskRunner;\n hookManager?: HookManager;\n pluginManager?: any; // Will be typed properly later\n}\n\nexport interface Plugin {\n name: string;\n version: string;\n capabilities?: PluginCapability[];\n\n // Lifecycle hooks\n onLoad?(ctx: PluginContext): Promise<void> | void;\n onConfigLoaded?(ctx: PluginContext): Promise<void> | void;\n onProjectDetected?(ctx: PluginContext): Promise<void> | void;\n\n // Command hooks\n beforeCommand?(command: string, ctx: PluginContext): Promise<void> | void;\n afterCommand?(command: string, ctx: PluginContext, result: CommandResult): Promise<void> | void;\n\n // Task hooks\n beforeTask?(task: string, ctx: PluginContext): Promise<void> | void;\n afterTask?(task: string, ctx: PluginContext, result: TaskResult): Promise<void> | void;\n\n // Registration\n registerCommands?(): CommandRegistration[];\n registerTasks?(): TaskRegistration[];\n registerGenerators?(): GeneratorRegistration[];\n registerProviders?(): ProviderRegistration[];\n}\n\nexport type PluginCapability =\n | 'fs:read'\n | 'fs:write'\n | 'shell:run'\n | 'net:localhost'\n | 'process:env';\n\n// ============================================================================\n// Command System Types\n// ============================================================================\n\nexport interface CommandRegistration {\n name: string;\n description: string;\n options?: CommandOption[];\n action: (args: any, ctx: PluginContext) => Promise<CommandResult>;\n}\n\nexport interface CommandOption {\n flags: string;\n description: string;\n defaultValue?: any;\n}\n\nexport interface CommandResult {\n status: 'ok' | 'error' | 'warning' | 'skipped';\n message?: string;\n data?: any;\n errors?: CommandError[];\n timings?: Record<string, number>;\n}\n\nexport interface CommandError {\n code: string;\n message: string;\n cause?: string;\n solution?: string;\n docsUrl?: string;\n}\n\n// ============================================================================\n// Task System Types\n// ============================================================================\n\nexport interface TaskRegistration {\n name: string;\n description: string;\n run: (ctx: PluginContext) => Promise<TaskResult>;\n}\n\nexport interface TaskResult {\n status: 'ok' | 'error' | 'skipped';\n message?: string;\n duration?: number;\n output?: string;\n exitCode?: number;\n}\n\nexport interface TaskRunner {\n run(command: string, args?: string[], options?: RunOptions): Promise<TaskResult>;\n runTask(taskName: string): Promise<TaskResult>;\n}\n\nexport interface RunOptions {\n cwd?: string;\n env?: Record<string, string>;\n silent?: boolean;\n captureOutput?: boolean;\n}\n\n// ============================================================================\n// Generator System Types\n// ============================================================================\n\nexport interface GeneratorRegistration {\n kind: string;\n description: string;\n generate: (name: string, options: any, ctx: PluginContext) => Promise<GeneratorResult>;\n}\n\nexport interface GeneratorResult {\n status: 'ok' | 'error';\n filesCreated?: string[];\n message?: string;\n}\n\n// ============================================================================\n// Provider System Types\n// ============================================================================\n\nexport interface ProviderRegistration {\n command: string; // 'dev', 'build', 'preview', etc.\n priority: number; // Higher priority wins\n canHandle: (ctx: PluginContext) => boolean;\n handler: (args: any, ctx: PluginContext) => Promise<CommandResult>;\n}\n\n// ============================================================================\n// Logger Types\n// ============================================================================\n\nexport interface Logger {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string, error?: Error): void;\n debug(message: string): void;\n step(message: string): void;\n json(data: any): void;\n}\n\n// ============================================================================\n// Global Options Types\n// ============================================================================\n\nexport interface GlobalOptions {\n cwd?: string;\n config?: string;\n json?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n noColor?: boolean;\n dryRun?: boolean;\n yes?: boolean;\n profile?: boolean;\n}\n\n// ============================================================================\n// Init Command Types\n// ============================================================================\n\nexport interface InitOptions {\n stack: 'react' | 'vanilla';\n name: string;\n ts?: boolean;\n js?: boolean;\n pm?: 'pnpm' | 'npm' | 'yarn';\n noTest?: boolean;\n router?: boolean;\n}\n\n// ============================================================================\n// Check Command Types\n// ============================================================================\n\nexport interface CheckResult {\n status: 'ok' | 'error';\n steps: CheckStep[];\n summary: {\n total: number;\n passed: number;\n failed: number;\n skipped: number;\n duration: number;\n };\n}\n\nexport interface CheckStep {\n name: string;\n status: 'ok' | 'error' | 'skipped';\n duration: number;\n message?: string;\n errors?: string[];\n}\n\n// ============================================================================\n// Doctor Command Types\n// ============================================================================\n\nexport interface DoctorResult {\n status: 'ok' | 'warning' | 'error';\n checks: DoctorCheck[];\n recommendations?: string[];\n}\n\nexport interface DoctorCheck {\n category: 'system' | 'project' | 'dependencies' | 'config' | 'env' | 'quality' | 'security';\n name: string;\n status: 'ok' | 'warning' | 'error';\n message: string;\n solution?: string;\n details?: any;\n}\n\n// ============================================================================\n// Env Command Types\n// ============================================================================\n\nexport interface EnvValidationResult {\n valid: boolean;\n missing: string[];\n invalid: string[];\n warnings: string[];\n}\n\n// ============================================================================\n// Plugin Hooks Types\n// ============================================================================\n\nexport type HookResult = void | Promise<void> | { skip?: boolean; modify?: unknown };\n\nexport type HookHandler = (...args: unknown[]) => HookResult;\n\nexport interface PluginHooks {\n // Lifecycle hooks\n 'plugin:loaded'?: HookHandler;\n 'plugin:unloaded'?: HookHandler;\n\n // Init hooks\n 'init:before'?: HookHandler;\n 'init:after'?: HookHandler;\n\n // Build hooks\n 'build:before'?: HookHandler;\n 'build:after'?: HookHandler;\n 'build:error'?: HookHandler;\n\n // Dev hooks\n 'dev:before'?: HookHandler;\n 'dev:after'?: HookHandler;\n 'dev:ready'?: HookHandler;\n\n // Test hooks\n 'test:before'?: HookHandler;\n 'test:after'?: HookHandler;\n 'test:error'?: HookHandler;\n\n // Lint hooks\n 'lint:before'?: HookHandler;\n 'lint:after'?: HookHandler;\n\n // Format hooks\n 'format:before'?: HookHandler;\n 'format:after'?: HookHandler;\n\n // Check hooks\n 'check:before'?: HookHandler;\n 'check:after'?: HookHandler;\n\n // Doctor hooks\n 'doctor:before'?: HookHandler;\n 'doctor:after'?: HookHandler;\n\n // Add feature hooks\n 'add:before'?: HookHandler;\n 'add:after'?: HookHandler;\n\n // Generate hooks\n 'generate:before'?: HookHandler;\n 'generate:after'?: HookHandler;\n\n // Config hooks\n 'config:loaded'?: HookHandler;\n 'config:validated'?: HookHandler;\n\n // File hooks\n 'file:created'?: HookHandler;\n 'file:modified'?: HookHandler;\n 'file:deleted'?: HookHandler;\n\n // Task hooks\n 'task:before'?: HookHandler;\n 'task:after'?: HookHandler;\n 'task:error'?: HookHandler;\n\n // Custom hooks (plugins can define their own)\n [key: string]: HookHandler | undefined;\n}\n\nexport interface PluginHookContext {\n hookName: string;\n args: any[];\n ctx: PluginContext;\n}\n\nexport interface HookManager {\n register(\n hookName: string,\n handler: HookHandler,\n priorityOrPluginName?: number | string,\n pluginName?: string\n ): void;\n unregister(hookName: string, handler: HookHandler): void;\n trigger(hookName: string, ...args: unknown[]): Promise<void>;\n has(hookName: string): boolean;\n list(): string[];\n}\n\n// ============================================================================\n// Recipe System Types\n// ============================================================================\n\n/**\n * Recipe Step Types\n */\nexport type RecipeStepType =\n | 'command' // Execute CLI command\n | 'shell' // Execute shell command\n | 'file' // File operations\n | 'template' // Process template\n | 'prompt' // Interactive prompt\n | 'condition' // Conditional execution\n | 'loop' // Loop over items\n | 'parallel' // Parallel execution\n | 'plugin' // Execute plugin\n | 'recipe'; // Execute sub-recipe\n\n/**\n * Recipe Step Status\n */\nexport type RecipeStepStatus =\n | 'pending'\n | 'running'\n | 'completed'\n | 'failed'\n | 'skipped'\n | 'rolled-back';\n\n/**\n * File Operation Types\n */\nexport type FileOperationType = 'create' | 'update' | 'delete' | 'copy' | 'move' | 'append';\n\n/**\n * Recipe Step - Base interface\n */\nexport interface RecipeStep {\n id: string;\n name: string;\n description?: string;\n type: RecipeStepType;\n condition?: string | ((ctx: RecipeContext) => boolean | Promise<boolean>);\n continueOnError?: boolean;\n rollback?: RecipeRollbackAction;\n timeout?: number;\n retry?: {\n attempts: number;\n delay: number;\n };\n}\n\n/**\n * Command Step - Execute CLI command\n */\nexport interface RecipeCommandStep extends RecipeStep {\n type: 'command';\n command: string;\n args?: Record<string, unknown>;\n}\n\n/**\n * Shell Step - Execute shell command\n */\nexport interface RecipeShellStep extends RecipeStep {\n type: 'shell';\n script: string;\n env?: Record<string, string>;\n cwd?: string;\n}\n\n/**\n * File Step - File operations\n */\nexport interface RecipeFileStep extends RecipeStep {\n type: 'file';\n operation: FileOperationType;\n source?: string;\n target: string;\n content?: string;\n template?: string;\n variables?: Record<string, unknown>;\n}\n\n/**\n * Template Step - Process template\n */\nexport interface RecipeTemplateStep extends RecipeStep {\n type: 'template';\n source: string;\n target: string;\n variables?: Record<string, unknown>;\n}\n\n/**\n * Prompt Step - Interactive prompt\n */\nexport interface RecipePromptStep extends RecipeStep {\n type: 'prompt';\n prompts: Array<{\n name: string;\n type: 'text' | 'confirm' | 'select' | 'multiselect';\n message: string;\n default?: unknown;\n choices?: Array<{ label: string; value: unknown }>;\n validate?: (value: unknown) => boolean | string;\n }>;\n saveAs?: string;\n}\n\n/**\n * Condition Step - Conditional execution\n */\nexport interface RecipeConditionStep extends RecipeStep {\n type: 'condition';\n if: string | ((ctx: RecipeContext) => boolean | Promise<boolean>);\n then: RecipeStep[];\n else?: RecipeStep[];\n}\n\n/**\n * Loop Step - Loop over items\n */\nexport interface RecipeLoopStep extends RecipeStep {\n type: 'loop';\n items: unknown[] | string;\n itemName: string;\n steps: RecipeStep[];\n}\n\n/**\n * Parallel Step - Execute steps in parallel\n */\nexport interface RecipeParallelStep extends RecipeStep {\n type: 'parallel';\n steps: RecipeStep[];\n maxConcurrency?: number;\n}\n\n/**\n * Plugin Step - Execute plugin\n */\nexport interface RecipePluginStep extends RecipeStep {\n type: 'plugin';\n plugin: string;\n action: string;\n args?: Record<string, unknown>;\n}\n\n/**\n * Recipe Step - Execute sub-recipe\n */\nexport interface RecipeRecipeStep extends RecipeStep {\n type: 'recipe';\n recipe: string;\n variables?: Record<string, unknown>;\n}\n\n/**\n * Union type for all step types\n */\nexport type RecipeStepUnion =\n | RecipeCommandStep\n | RecipeShellStep\n | RecipeFileStep\n | RecipeTemplateStep\n | RecipePromptStep\n | RecipeConditionStep\n | RecipeLoopStep\n | RecipeParallelStep\n | RecipePluginStep\n | RecipeRecipeStep;\n\n/**\n * Rollback Action\n */\nexport interface RecipeRollbackAction {\n type: 'command' | 'shell' | 'file' | 'custom';\n action: string | ((ctx: RecipeContext) => Promise<void>);\n args?: Record<string, unknown>;\n}\n\n/**\n * Recipe Definition\n */\nexport interface Recipe {\n name: string;\n version: string;\n description: string;\n author?: string;\n tags?: string[];\n category?: 'setup' | 'feature' | 'tooling' | 'deployment' | 'maintenance';\n\n // Requirements\n requires?: {\n kubitVersion?: string;\n nodeVersion?: string;\n plugins?: string[];\n tools?: string[];\n };\n\n // Variables\n variables?: Record<\n string,\n {\n type: 'string' | 'number' | 'boolean' | 'array' | 'object';\n description?: string;\n default?: unknown;\n required?: boolean;\n validate?: string | ((value: unknown) => boolean | string);\n }\n >;\n\n // Steps\n steps: RecipeStepUnion[];\n\n // Hooks\n hooks?: {\n beforeRecipe?: (ctx: RecipeContext) => Promise<void> | void;\n afterRecipe?: (ctx: RecipeContext, result: RecipeResult) => Promise<void> | void;\n onError?: (ctx: RecipeContext, error: Error) => Promise<void> | void;\n onRollback?: (ctx: RecipeContext) => Promise<void> | void;\n };\n}\n\n/**\n * Recipe Context\n */\nexport interface RecipeContext extends PluginContext {\n recipe: Recipe;\n variables: Record<string, unknown>;\n state: Record<string, unknown>;\n results: Map<string, RecipeStepResult>;\n rollbackStack: Array<() => Promise<void>>;\n}\n\n/**\n * Recipe Step Result\n */\nexport interface RecipeStepResult {\n stepId: string;\n status: RecipeStepStatus;\n startTime: Date;\n endTime?: Date;\n duration?: number;\n output?: unknown;\n error?: Error;\n}\n\n/**\n * Recipe Result\n */\nexport interface RecipeResult {\n status: 'ok' | 'error' | 'partial';\n message: string;\n steps: RecipeStepResult[];\n totalDuration: number;\n completedSteps: number;\n failedSteps: number;\n skippedSteps: number;\n rolledBack: boolean;\n}\n\n/**\n * Recipe Registry Info\n */\nexport interface RecipeInfo {\n name: string;\n version: string;\n description: string;\n author: string;\n category: 'setup' | 'feature' | 'tooling' | 'deployment' | 'maintenance';\n tags: string[];\n verified: boolean;\n downloads?: number;\n updated?: string;\n requires?: {\n kubitVersion?: string;\n nodeVersion?: string;\n plugins?: string[];\n };\n}\n\n// ============================================================================\n// Feature System Types\n// ============================================================================\n\n/**\n * Feature Category\n */\nexport type FeatureCategory =\n | 'quality' // Linting, formatting, testing\n | 'tooling' // Development tools\n | 'routing' // Routing solutions\n | 'state' // State management\n | 'ui' // UI libraries\n | 'git' // Git hooks and workflows\n | 'deployment' // Deployment tools\n | 'documentation'; // Documentation tools\n\n/**\n * Feature Status\n */\nexport type FeatureStatus = 'not-installed' | 'installed' | 'configured' | 'outdated';\n\n/**\n * Config Merge Strategy\n */\nexport type ConfigMergeStrategy = 'merge' | 'replace' | 'append' | 'skip';\n\n/**\n * Feature Definition\n */\nexport interface Feature {\n name: string;\n version: string;\n description: string;\n category: FeatureCategory;\n tags?: string[];\n\n // Requirements\n requires?: {\n nodeVersion?: string;\n packageManager?: 'pnpm' | 'npm' | 'yarn';\n dependencies?: string[];\n };\n\n // Conflicts\n conflicts?: string[];\n\n // Installation\n dependencies?: string[];\n devDependencies?: string[];\n peerDependencies?: string[];\n\n // Configuration files\n configFiles?: FeatureConfigFile[];\n\n // Scripts to add to package.json\n scripts?: Record<string, string>;\n\n // Post-install instructions\n instructions?: string;\n\n // Lifecycle hooks\n hooks?: {\n beforeInstall?: (ctx: FeatureContext) => Promise<void> | void;\n afterInstall?: (ctx: FeatureContext) => Promise<void> | void;\n beforeConfigure?: (ctx: FeatureContext) => Promise<void> | void;\n afterConfigure?: (ctx: FeatureContext) => Promise<void> | void;\n };\n}\n\n/**\n * Feature Config File\n */\nexport interface FeatureConfigFile {\n path: string;\n content: string | Record<string, unknown>;\n mergeStrategy?: ConfigMergeStrategy;\n backup?: boolean;\n}\n\n/**\n * Feature Context\n */\nexport interface FeatureContext extends PluginContext {\n feature: Feature;\n projectType: 'react' | 'vanilla' | 'unknown';\n packageManager: 'pnpm' | 'npm' | 'yarn';\n existingConfig: Map<string, unknown>;\n dryRun?: boolean;\n}\n\n/**\n * Feature Detection Result\n */\nexport interface FeatureDetectionResult {\n name: string;\n status: FeatureStatus;\n version?: string;\n configFiles: string[];\n issues?: string[];\n}\n\n/**\n * Feature Installation Result\n */\nexport interface FeatureInstallResult {\n success: boolean;\n feature: string;\n filesCreated: string[];\n filesModified: string[];\n scriptsAdded: string[];\n dependenciesInstalled: string[];\n rollbackAvailable: boolean;\n instructions?: string;\n errors?: string[];\n}\n\n/**\n * Feature Rollback Info\n */\nexport interface FeatureRollbackInfo {\n feature: string;\n timestamp: Date;\n filesCreated: string[];\n filesModified: Array<{ path: string; backup: string }>;\n scriptsAdded: string[];\n dependenciesInstalled: string[];\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { parse as parseToml } from 'smol-toml';\n\nimport type { KubitConfig } from '../types/index.js';\n\nimport { ConfigTemplateLoader } from '../templates/config/index.js';\nimport { KubitConfigSchema } from '../types/index.js';\n\nexport class ConfigLoader {\n private cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = cwd;\n }\n\n /**\n * Load kubit config from project\n * Supports: kubit.config.toml, kubit.config.json\n */\n async load(configPath?: string): Promise<KubitConfig | null> {\n const configFile = configPath ? join(this.cwd, configPath) : this.findConfigFile();\n\n if (!configFile) {\n return null;\n }\n\n try {\n const content = readFileSync(configFile, 'utf-8');\n let rawConfig: unknown;\n\n if (configFile.endsWith('.toml')) {\n rawConfig = parseToml(content);\n } else if (configFile.endsWith('.json')) {\n rawConfig = JSON.parse(content);\n } else {\n throw new Error(`Unsupported config format: ${configFile}`);\n }\n\n // Validate with Zod\n const config = KubitConfigSchema.parse(rawConfig);\n return config;\n } catch (error) {\n throw new Error(\n `Failed to load config from ${configFile}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n /**\n * Auto-detect project configuration when no config file exists\n */\n async autoDetect(): Promise<Partial<KubitConfig>> {\n const packageJsonPath = join(this.cwd, 'package.json');\n\n // If no package.json, return minimal default config\n if (!existsSync(packageJsonPath)) {\n const projectName = this.cwd.split('/').pop() || 'my-project';\n return ConfigTemplateLoader.buildDefault({\n minimal: true,\n name: projectName,\n });\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));\n const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n\n // Detect stack\n let stack: 'react' | 'vanilla' = 'vanilla';\n if (deps.react) {\n stack = 'react';\n }\n\n // Detect language\n const language = existsSync(join(this.cwd, 'tsconfig.json')) ? 'ts' : 'js';\n\n // Detect package manager\n let packageManager: 'pnpm' | 'npm' | 'yarn' = 'npm';\n if (existsSync(join(this.cwd, 'pnpm-lock.yaml'))) {\n packageManager = 'pnpm';\n } else if (existsSync(join(this.cwd, 'yarn.lock'))) {\n packageManager = 'yarn';\n } else if (existsSync(join(this.cwd, 'package-lock.json'))) {\n packageManager = 'npm';\n }\n\n // Build config using templates\n const config = ConfigTemplateLoader.buildDefault({\n language,\n name: packageJson.name || 'my-app',\n packageManager,\n stack,\n type: 'web',\n });\n\n // Override quality settings based on detected tools\n config.quality = {\n ...config.quality,\n format: true,\n lint: true,\n typecheck: language === 'ts',\n unitTest: !!deps.vitest || !!deps.jest,\n };\n\n return config;\n }\n\n private findConfigFile(): string | null {\n const candidates = ['kubit.config.toml', 'kubit.config.json'];\n\n for (const candidate of candidates) {\n const path = join(this.cwd, candidate);\n if (existsSync(path)) {\n return path;\n }\n }\n\n return null;\n }\n}\n","/**\n * Default configuration templates\n * Centralized defaults for project configuration\n */\n\nexport interface ProjectDefaults {\n nodeVersion: string;\n devPort: number;\n packageManager: 'pnpm' | 'npm' | 'yarn';\n}\n\nexport interface PathsDefaults {\n src: string;\n dist: string;\n envExample: string;\n envLocal: string;\n}\n\nexport interface QualityDefaults {\n lint: boolean;\n format: boolean;\n typecheck: boolean;\n unitTest: boolean;\n}\n\nexport interface PluginDefaults {\n enabled: string[];\n}\n\n/**\n * Default project configuration\n */\nexport const PROJECT_DEFAULTS: ProjectDefaults = {\n nodeVersion: '20',\n devPort: 5173,\n packageManager: 'pnpm',\n};\n\n/**\n * Default paths configuration\n */\nexport const PATHS_DEFAULTS: PathsDefaults = {\n src: 'src',\n dist: 'dist',\n envExample: '.env.example',\n envLocal: '.env.local',\n};\n\n/**\n * Default quality configuration for new projects\n */\nexport const QUALITY_DEFAULTS: QualityDefaults = {\n lint: true,\n format: true,\n typecheck: true,\n unitTest: true,\n};\n\n/**\n * Minimal quality configuration (for auto-detect without tools)\n */\nexport const QUALITY_MINIMAL: QualityDefaults = {\n lint: false,\n format: false,\n typecheck: false,\n unitTest: false,\n};\n\n/**\n * Default plugins configuration\n */\nexport const PLUGIN_DEFAULTS: PluginDefaults = {\n enabled: [],\n};\n\n/**\n * Available plugin choices for interactive config\n */\nexport const AVAILABLE_PLUGINS = [\n '@kubit/plugin-bernova',\n '@kubit/plugin-storybook',\n '@kubit/plugin-testing-library',\n '@kubit/plugin-playwright',\n '@kubit/plugin-docker',\n] as const;\n\n/**\n * Package manager choices\n */\nexport const PACKAGE_MANAGERS = ['pnpm', 'npm', 'yarn'] as const;\n\n/**\n * Supported stacks\n */\nexport const STACKS = ['react', 'vanilla'] as const;\n\n/**\n * Supported languages\n */\nexport const LANGUAGES = ['ts', 'js'] as const;\n\n/**\n * Project types\n */\nexport const PROJECT_TYPES = ['web', 'library'] as const;\n","/**\n * Configuration template loader and builder\n * Provides utilities to build configurations from templates\n */\n\nimport type { KubitConfig } from '../../types/index.js';\nimport {\n PROJECT_DEFAULTS,\n PATHS_DEFAULTS,\n QUALITY_DEFAULTS,\n QUALITY_MINIMAL,\n PLUGIN_DEFAULTS,\n type ProjectDefaults,\n type PathsDefaults,\n type QualityDefaults,\n type PluginDefaults,\n} from './defaults.js';\n\nexport interface ConfigTemplateOptions {\n name?: string;\n type?: 'web' | 'library';\n stack?: 'react' | 'vanilla';\n language?: 'ts' | 'js';\n packageManager?: 'pnpm' | 'npm' | 'yarn';\n nodeVersion?: string;\n devPort?: number;\n minimal?: boolean;\n}\n\nexport class ConfigTemplateLoader {\n /**\n * Build a complete default configuration\n */\n static buildDefault(options: ConfigTemplateOptions = {}): KubitConfig {\n return {\n kubit: {\n cliVersion: '^4.0.0',\n },\n project: this.buildProjectConfig(options),\n paths: this.buildPathsConfig(),\n quality: this.buildQualityConfig(options),\n plugins: this.buildPluginsConfig(),\n };\n }\n\n /**\n * Build project configuration with defaults\n */\n static buildProjectConfig(options: ConfigTemplateOptions = {}): KubitConfig['project'] {\n return {\n name: options.name || 'my-project',\n type: options.type || 'web',\n stack: options.stack || 'vanilla',\n language: options.language || 'js',\n packageManager: options.packageManager || PROJECT_DEFAULTS.packageManager,\n nodeVersion: options.nodeVersion || PROJECT_DEFAULTS.nodeVersion,\n devPort: options.devPort || PROJECT_DEFAULTS.devPort,\n };\n }\n\n /**\n * Build paths configuration with defaults\n */\n static buildPathsConfig(overrides?: Partial<PathsDefaults>): KubitConfig['paths'] {\n return {\n ...PATHS_DEFAULTS,\n ...overrides,\n };\n }\n\n /**\n * Build quality configuration with defaults\n */\n static buildQualityConfig(options: ConfigTemplateOptions = {}): KubitConfig['quality'] {\n const baseDefaults = options.minimal ? QUALITY_MINIMAL : QUALITY_DEFAULTS;\n\n return {\n ...baseDefaults,\n // Auto-adjust typecheck based on language\n typecheck: options.language === 'ts' ? baseDefaults.typecheck : false,\n };\n }\n\n /**\n * Build plugins configuration with defaults\n */\n static buildPluginsConfig(plugins?: string[]): KubitConfig['plugins'] {\n return {\n enabled: plugins || PLUGIN_DEFAULTS.enabled,\n };\n }\n\n /**\n * Get project defaults\n */\n static getProjectDefaults(): ProjectDefaults {\n return { ...PROJECT_DEFAULTS };\n }\n\n /**\n * Get paths defaults\n */\n static getPathsDefaults(): PathsDefaults {\n return { ...PATHS_DEFAULTS };\n }\n\n /**\n * Get quality defaults\n */\n static getQualityDefaults(minimal = false): QualityDefaults {\n return minimal ? { ...QUALITY_MINIMAL } : { ...QUALITY_DEFAULTS };\n }\n\n /**\n * Get plugin defaults\n */\n static getPluginDefaults(): PluginDefaults {\n return { ...PLUGIN_DEFAULTS };\n }\n\n /**\n * Merge partial config with defaults\n */\n static mergeWithDefaults(\n partial: Partial<KubitConfig>,\n options: ConfigTemplateOptions = {}\n ): KubitConfig {\n const defaults = this.buildDefault(options);\n\n return {\n kubit: partial.kubit || defaults.kubit,\n project: { ...defaults.project, ...(partial.project || {}) } as KubitConfig['project'],\n paths: { ...defaults.paths, ...(partial.paths || {}) } as KubitConfig['paths'],\n quality: { ...defaults.quality, ...(partial.quality || {}) } as KubitConfig['quality'],\n plugins: { ...defaults.plugins, ...(partial.plugins || {}) } as KubitConfig['plugins'],\n };\n }\n}\n","import chalk from 'chalk';\n\nimport type { Logger } from '../types/index.js';\n\nimport { colors, symbols } from './theme.js';\n\nexport class ConsoleLogger implements Logger {\n private useColor: boolean;\n private isVerbose: boolean;\n private isQuiet: boolean;\n private useJson: boolean;\n\n constructor(\n options: {\n noColor?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n json?: boolean;\n } = {}\n ) {\n this.useColor = !options.noColor;\n this.isVerbose = options.verbose || false;\n this.isQuiet = options.quiet || false;\n this.useJson = options.json || false;\n }\n\n info(message: string): void {\n if (this.isQuiet) {\n return;\n }\n if (this.useJson) {\n console.log(JSON.stringify({ level: 'info', message }));\n return;\n }\n console.log(this.useColor ? colors.info(symbols.info) : 'i', message);\n }\n\n success(message: string): void {\n if (this.isQuiet) {\n return;\n }\n if (this.useJson) {\n console.log(JSON.stringify({ level: 'success', message }));\n return;\n }\n console.log(this.useColor ? colors.success(symbols.success) : symbols.success, message);\n }\n\n warn(message: string): void {\n if (this.useJson) {\n console.log(JSON.stringify({ level: 'warning', message }));\n return;\n }\n console.warn(this.useColor ? colors.warning(symbols.warning) : symbols.warning, message);\n }\n\n error(message: string, error?: Error): void {\n if (this.useJson) {\n console.log(\n JSON.stringify({\n error: error?.message,\n level: 'error',\n message,\n stack: error?.stack,\n })\n );\n return;\n }\n console.error(this.useColor ? colors.error(symbols.error) : symbols.error, message);\n if (error && this.isVerbose) {\n console.error(chalk.gray(error.stack || error.message));\n }\n }\n\n debug(message: string): void {\n if (!this.isVerbose) {\n return;\n }\n if (this.useJson) {\n console.log(JSON.stringify({ level: 'debug', message }));\n return;\n }\n console.log(this.useColor ? colors.muted(symbols.pointer) : symbols.pointer, message);\n }\n\n step(message: string): void {\n if (this.isQuiet) {\n return;\n }\n if (this.useJson) {\n console.log(JSON.stringify({ level: 'step', message }));\n return;\n }\n console.log(this.useColor ? colors.primary(symbols.step) : symbols.step, message);\n }\n\n json(data: any): void {\n console.log(JSON.stringify(data, null, 2));\n }\n}\n","import chalk from 'chalk';\n\n/**\n * Brand colors for Kubit CLI\n * Consistent color palette across all CLI output\n */\nexport const colors = {\n bold: chalk.bold,\n boolean: chalk.hex('#06b6d4'), // Cyan\n\n code: chalk.hex('#e879f9'),\n dim: chalk.dim,\n error: chalk.hex('#ef4444'), // Red\n info: chalk.hex('#3b82f6'), // Blue\n\n keyword: chalk.hex('#a855f7'), // Purple\n // Special\n link: chalk.hex('#3b82f6').underline,\n // UI colors\n muted: chalk.hex('#6b7280'), // Gray\n\n number: chalk.hex('#f97316'), // Orange\n // Primary brand colors\n primary: chalk.hex('#6366f1'), // Indigo - main brand color\n secondary: chalk.hex('#8b5cf6'), // Purple - accent color\n // Syntax highlighting\n string: chalk.hex('#22c55e'), // Green\n\n // Semantic colors\n success: chalk.hex('#10b981'), // Green\n warning: chalk.hex('#f59e0b'), // Amber\n} as const;\n\n/**\n * Box drawing characters for frames and borders\n */\nexport const box = {\n bottomLeft: '└',\n bottomRight: '┘',\n cross: '┼',\n horizontal: '─',\n horizontalDown: '┬',\n horizontalUp: '┴',\n topLeft: '┌',\n topRight: '┐',\n vertical: '│',\n verticalLeft: '┤',\n verticalRight: '├',\n} as const;\n\n/**\n * Symbols for different message types\n */\nexport const symbols = {\n bullet: '•',\n ellipsis: '...',\n error: '✗',\n info: 'i',\n line: '─',\n pointer: '›',\n step: '→',\n success: '✓',\n warning: '!',\n} as const;\n\n/**\n * Create a styled box with content\n */\nexport function createBox(\n content: string,\n options: {\n title?: string;\n padding?: number;\n color?: keyof typeof colors;\n } = {}\n): string {\n const { color = 'primary', padding = 1, title } = options;\n const lines = content.split('\\n');\n const maxLength = Math.max(...lines.map((l) => l.length));\n const width = maxLength + padding * 2;\n\n const colorFn = colors[color];\n const pad = ' '.repeat(padding);\n\n let result = '';\n\n // Top border\n if (title) {\n const titleText = ` ${title} `;\n const leftPad = Math.floor((width - titleText.length) / 2);\n const rightPad = width - titleText.length - leftPad;\n result +=\n colorFn(\n box.topLeft +\n box.horizontal.repeat(leftPad) +\n titleText +\n box.horizontal.repeat(rightPad) +\n box.topRight\n ) + '\\n';\n } else {\n result += colorFn(box.topLeft + box.horizontal.repeat(width) + box.topRight) + '\\n';\n }\n\n // Content\n for (const line of lines) {\n const paddedLine = line + ' '.repeat(maxLength - line.length);\n result += colorFn(box.vertical) + pad + paddedLine + pad + colorFn(box.vertical) + '\\n';\n }\n\n // Bottom border\n result += colorFn(box.bottomLeft + box.horizontal.repeat(width) + box.bottomRight);\n\n return result;\n}\n\n/**\n * Create a banner with brand styling\n */\nexport function createBanner(version: string): string {\n const lines = [\n '',\n ' KUBIT CLI',\n ` v${version}`,\n '',\n ' Modern Web Development Made Simple',\n '',\n ];\n\n return createBox(lines.join('\\n'), {\n color: 'primary',\n padding: 2,\n });\n}\n\n/**\n * Create a section header\n */\nexport function createHeader(text: string): string {\n return '\\n' + colors.primary.bold(text) + '\\n' + colors.muted(box.horizontal.repeat(text.length));\n}\n\n/**\n * Create a list item\n */\nexport function createListItem(text: string, checked = false): string {\n const symbol = checked ? colors.success(symbols.success) : colors.muted(symbols.bullet);\n return `${symbol} ${text}`;\n}\n\n/**\n * Create a progress indicator\n */\nexport function createProgress(current: number, total: number, label: string): string {\n const percentage = Math.round((current / total) * 100);\n const barLength = 20;\n const filled = Math.round((current / total) * barLength);\n const empty = barLength - filled;\n\n const bar = colors.primary('█'.repeat(filled)) + colors.muted('░'.repeat(empty));\n const counter = colors.muted(`[${current}/${total}]`);\n\n return `${bar} ${percentage}% ${counter} ${label}`;\n}\n\n/**\n * Create a key-value pair display\n */\nexport function createKeyValue(key: string, value: string): string {\n return `${colors.muted(key + ':')} ${colors.bold(value)}`;\n}\n\n/**\n * Create a command example\n */\nexport function createCommand(command: string): string {\n return colors.code(`$ ${command}`);\n}\n\n/**\n * Create a file path display\n */\nexport function createPath(path: string): string {\n return colors.info(path);\n}\n\n/**\n * Create a divider line\n */\nexport function createDivider(length = 50, char = box.horizontal): string {\n return colors.muted(char.repeat(length));\n}\n","import { execa } from 'execa';\n\nimport type { TaskRunner, TaskResult, RunOptions, Logger } from '../types/index.js';\n\nexport class DefaultTaskRunner implements TaskRunner {\n private tasks: Map<string, () => Promise<TaskResult>> = new Map();\n private logger: Logger;\n\n constructor(logger: Logger) {\n this.logger = logger;\n }\n\n registerTask(name: string, task: () => Promise<TaskResult>): void {\n this.tasks.set(name, task);\n }\n\n async run(command: string, args: string[] = [], options: RunOptions = {}): Promise<TaskResult> {\n const startTime = Date.now();\n const cwd = options.cwd || process.cwd();\n\n try {\n if (!options.silent) {\n this.logger.debug(`Running: ${command} ${args.join(' ')}`);\n }\n\n const result = await execa(command, args, {\n all: true,\n cwd,\n env: { ...process.env, ...options.env },\n reject: false,\n });\n\n const duration = Date.now() - startTime;\n\n if (result.exitCode === 0) {\n return {\n duration,\n exitCode: result.exitCode,\n output: options.captureOutput ? result.all : undefined,\n status: 'ok',\n };\n }\n return {\n duration,\n exitCode: result.exitCode,\n message: `Command failed with exit code ${result.exitCode}`,\n output: result.all,\n status: 'error',\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n duration,\n message: error instanceof Error ? error.message : 'Unknown error',\n status: 'error',\n };\n }\n }\n\n async runTask(taskName: string): Promise<TaskResult> {\n const task = this.tasks.get(taskName);\n if (!task) {\n return {\n message: `Task '${taskName}' not found`,\n status: 'error',\n };\n }\n\n return await task();\n }\n}\n"],"mappings":"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","names":["existsSync","join","join","existsSync","readFileSync","existsSync","join","join","readFileSync","existsSync","chalk","chalk"]}
@@ -0,0 +1,243 @@
1
+ # Templates System
2
+
3
+ Centralized template system for configurations and code generation.
4
+
5
+ ## Structure
6
+
7
+ ```
8
+ templates/
9
+ ├── config/ # Configuration templates
10
+ │ ├── defaults.ts # Default configuration constants
11
+ │ ├── config-templates.ts # Config loader and builder
12
+ │ ├── index.ts # Exports
13
+ │ └── README.md # Documentation
14
+
15
+ ├── generators/ # Code generation templates
16
+ │ ├── react-component.ts # React component templates
17
+ │ ├── react-page.ts # React page templates
18
+ │ ├── react-hook.ts # React hook templates
19
+ │ ├── plugin.ts # Plugin templates
20
+ │ ├── index.ts # Exports
21
+ │ └── README.md # Documentation
22
+
23
+ └── features/ # Feature/tool templates
24
+ ├── *.template # Configuration files (23 templates)
25
+ ├── template-loader.ts # Template loader
26
+ ├── index.ts # Exports
27
+ └── README.md # Documentation
28
+ ```
29
+
30
+ ## Purpose
31
+
32
+ ### 1. Configuration Templates (`config/`)
33
+
34
+ Centralizes all default configuration values for the project:
35
+
36
+ - Node versions
37
+ - Development ports
38
+ - Package managers
39
+ - File paths
40
+ - Quality configuration (lint, format, test)
41
+
42
+ **Used by:**
43
+
44
+ - `utils/config-loader.ts`
45
+ - `utils/interactive-config.ts`
46
+ - `commands/init.ts`
47
+ - `commands/dev.ts`
48
+
49
+ ### 2. Generator Templates (`generators/`)
50
+
51
+ Centralizes all generated code templates:
52
+
53
+ - React components
54
+ - React pages
55
+ - Custom hooks
56
+ - Plugins
57
+ - Tests
58
+ - Storybook stories
59
+
60
+ **Used by:**
61
+
62
+ - `commands/generate.ts`
63
+ - `commands/plugin-init.ts`
64
+
65
+ ### 3. Feature Templates (`features/`)
66
+
67
+ Centralizes configuration files for features/tools:
68
+
69
+ - Testing (Vitest, Jest, Cypress, Playwright)
70
+ - Code Quality (ESLint, Prettier, lint-staged)
71
+ - Git Hooks (Husky)
72
+ - Changesets
73
+ - Design Systems (Bernova)
74
+
75
+ **Used by:**
76
+
77
+ - `commands/add/index.ts`
78
+
79
+ ## System Benefits
80
+
81
+ ### ✅ Centralization
82
+
83
+ - Single place for each template type
84
+ - Easy to find and modify
85
+
86
+ ### ✅ Consistency
87
+
88
+ - All generated files follow the same pattern
89
+ - Same default values throughout the application
90
+
91
+ ### ✅ Maintainability
92
+
93
+ - Changes propagate automatically
94
+ - No duplicated code
95
+
96
+ ### ✅ Separation of Concerns
97
+
98
+ - Commands orchestrate, templates generate
99
+ - Business logic separated from templates
100
+
101
+ ### ✅ Testability
102
+
103
+ - Templates can be tested in isolation
104
+ - Easy to verify generated output
105
+
106
+ ### ✅ Type Safety
107
+
108
+ - TypeScript ensures correct types
109
+ - Well-defined interfaces
110
+
111
+ ## Quick Usage
112
+
113
+ ### Configuration
114
+
115
+ ```typescript
116
+ import { ConfigTemplateLoader, PROJECT_DEFAULTS } from './templates/config';
117
+
118
+ // Get defaults
119
+ const port = PROJECT_DEFAULTS.devPort; // 5173
120
+
121
+ // Build complete configuration
122
+ const config = ConfigTemplateLoader.buildDefault({
123
+ name: 'my-app',
124
+ stack: 'react',
125
+ language: 'ts',
126
+ });
127
+ ```
128
+
129
+ ### Generators
130
+
131
+ ```typescript
132
+ import {
133
+ generateComponentTemplate,
134
+ generatePageTemplate,
135
+ generatePluginIndexTemplate,
136
+ } from './templates/generators';
137
+
138
+ // Generate component
139
+ const component = generateComponentTemplate({ name: 'Button' });
140
+
141
+ // Generate page
142
+ const page = generatePageTemplate({ name: 'Home', route: '/home' });
143
+
144
+ // Generate plugin
145
+ const plugin = generatePluginIndexTemplate({
146
+ pluginName: '@kubit/plugin-example',
147
+ name: 'example',
148
+ description: 'Example plugin',
149
+ author: 'John Doe',
150
+ year: 2024,
151
+ });
152
+ ```
153
+
154
+ ### Features
155
+
156
+ ```typescript
157
+ import { loadFeatureTemplate, loadFeatureTemplates } from './templates/features';
158
+
159
+ // Load a template
160
+ const vitestConfig = loadFeatureTemplate('vitest.config.ts.template');
161
+
162
+ // Load multiple templates
163
+ const templates = loadFeatureTemplates(['vitest.config.ts.template', 'eslint.config.js.template']);
164
+ ```
165
+
166
+ ## Conventions
167
+
168
+ ### File Names
169
+
170
+ - `kebab-case.ts` for template files
171
+ - Grouped by type (react-\*, plugin, etc.)
172
+
173
+ ### Function Names
174
+
175
+ - `generate[Type]Template` for generators
176
+ - `build[Type]Config` for configuration
177
+
178
+ ### Parameters
179
+
180
+ - Interfaces with `TemplateParams` or `Options` suffix
181
+ - Always typed with TypeScript
182
+
183
+ ### Return Types
184
+
185
+ - `string` for text templates
186
+ - Objects for JSON/configuration
187
+
188
+ ### Documentation
189
+
190
+ - JSDoc on all exported functions
191
+ - README.md in each subdirectory
192
+
193
+ ## Extension
194
+
195
+ To add new templates:
196
+
197
+ 1. **Create template file** in the appropriate directory
198
+ 2. **Define interface** for parameters
199
+ 3. **Implement generator** functions
200
+ 4. **Export** in `index.ts`
201
+ 5. **Document** in README.md
202
+ 6. **Use** in corresponding commands
203
+
204
+ ### Example
205
+
206
+ ```typescript
207
+ // templates/generators/react-context.ts
208
+ export interface ContextTemplateParams {
209
+ name: string;
210
+ }
211
+
212
+ export function generateContextTemplate(params: ContextTemplateParams): string {
213
+ const { name } = params;
214
+ return `// Template code here`;
215
+ }
216
+
217
+ // templates/generators/index.ts
218
+ export * from './react-context.js';
219
+
220
+ // commands/generate.ts
221
+ import { generateContextTemplate } from '../templates/generators';
222
+ const code = generateContextTemplate({ name: 'Auth' });
223
+ ```
224
+
225
+ ## Metrics
226
+
227
+ ### Files Created
228
+
229
+ - **Config templates**: 3 files + README
230
+ - **Generator templates**: 4 files + README
231
+ - **Total**: 9 files (~1000 lines)
232
+
233
+ ### Impact on Commands
234
+
235
+ - **Code reduction**: 30-60% in refactored commands
236
+ - **Better readability**: Shorter and clearer commands
237
+ - **Less duplication**: Reusable templates
238
+
239
+ ## See Also
240
+
241
+ - [Config Templates README](./config/README.md)
242
+ - [Generator Templates README](./generators/README.md)
243
+ - [REFACTOR_SUMMARY.md](../../../REFACTOR_SUMMARY.md)