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.
- package/CHANGELOG.md +229 -0
- package/LICENSE +201 -0
- package/README.md +841 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +14294 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +772 -0
- package/dist/index.js +1979 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/README.md +243 -0
- package/dist/templates/config/README.md +94 -0
- package/dist/templates/config/config-templates.ts +138 -0
- package/dist/templates/config/defaults.ts +105 -0
- package/dist/templates/config/index.ts +6 -0
- package/dist/templates/features/.prettierignore.template +28 -0
- package/dist/templates/features/.prettierrc.template +10 -0
- package/dist/templates/features/README.md +111 -0
- package/dist/templates/features/bernova-foundations.ts.template +50 -0
- package/dist/templates/features/bernova-globalStyles.ts.template +33 -0
- package/dist/templates/features/bernova-mediaQueries.ts.template +6 -0
- package/dist/templates/features/bernova-theme.ts.template +1 -0
- package/dist/templates/features/bernova.config.json.template +58 -0
- package/dist/templates/features/changesets-config.json.template +11 -0
- package/dist/templates/features/changesets-readme.md.template +31 -0
- package/dist/templates/features/commitlint.config.js.template +23 -0
- package/dist/templates/features/cypress-support-commands.ts.template +22 -0
- package/dist/templates/features/cypress-support-e2e.ts.template +20 -0
- package/dist/templates/features/cypress.config.ts.template +23 -0
- package/dist/templates/features/eslint.config.js.template +13 -0
- package/dist/templates/features/husky-commit-msg.template +4 -0
- package/dist/templates/features/husky-pre-commit.template +4 -0
- package/dist/templates/features/index.ts +5 -0
- package/dist/templates/features/jest-setup.ts.template +1 -0
- package/dist/templates/features/jest.config.ts.template +23 -0
- package/dist/templates/features/lint-staged.config.js.template +5 -0
- package/dist/templates/features/playwright-example.spec.ts.template +14 -0
- package/dist/templates/features/playwright.config.ts.template +42 -0
- package/dist/templates/features/template-loader.ts +31 -0
- package/dist/templates/features/vitest-setup.ts.template +1 -0
- package/dist/templates/features/vitest.config.ts.template +11 -0
- package/dist/templates/generators/README.md +181 -0
- package/dist/templates/generators/index.ts +9 -0
- package/dist/templates/generators/plugin.ts +245 -0
- package/dist/templates/generators/react-app-bernova.ts +356 -0
- package/dist/templates/generators/react-component.ts +103 -0
- package/dist/templates/generators/react-hook.ts +56 -0
- package/dist/templates/generators/react-kubit-ui.ts +794 -0
- package/dist/templates/generators/react-page.ts +65 -0
- package/dist/templates-physical/kubit-full/.prettierrc +0 -0
- package/dist/templates-physical/kubit-full/README.md +223 -0
- package/dist/templates-physical/kubit-full/bernova.config.json +0 -0
- package/dist/templates-physical/kubit-full/eslint.config.js +0 -0
- package/dist/templates-physical/kubit-full/index.html +17 -0
- package/dist/templates-physical/kubit-full/package.json +53 -0
- package/dist/templates-physical/kubit-full/src/App.css +118 -0
- package/dist/templates-physical/kubit-full/src/App.tsx +75 -0
- package/dist/templates-physical/kubit-full/src/charts/ChartsShowcase.css +0 -0
- package/dist/templates-physical/kubit-full/src/charts/ChartsShowcase.tsx +0 -0
- package/dist/templates-physical/kubit-full/src/components/ComponentsShowcase.css +147 -0
- package/dist/templates-physical/kubit-full/src/components/ComponentsShowcase.tsx +0 -0
- package/dist/templates-physical/kubit-full/src/main.tsx +0 -0
- package/dist/templates-physical/kubit-full/src/styles/index.css +6 -0
- package/dist/templates-physical/kubit-full/src/styles/theme/components/button.ts +0 -0
- package/dist/templates-physical/kubit-full/src/styles/theme/components/card.ts +0 -0
- package/dist/templates-physical/kubit-full/src/styles/theme/components/input.ts +0 -0
- package/dist/templates-physical/kubit-full/src/styles/theme/foundations.ts +0 -0
- package/dist/templates-physical/kubit-full/src/styles/theme/globalStyles.ts +0 -0
- package/dist/templates-physical/kubit-full/src/styles/theme/mediaQueries.ts +0 -0
- package/dist/templates-physical/kubit-full/src/styles/theme/theme.ts +0 -0
- package/dist/templates-physical/kubit-full/src/test/setup.ts +0 -0
- package/dist/templates-physical/kubit-full/tsconfig.json +29 -0
- package/dist/templates-physical/kubit-full/tsconfig.node.json +11 -0
- package/dist/templates-physical/kubit-full/vite.config.ts +24 -0
- package/dist/templates-physical/kubit-full/vitest.config.ts +26 -0
- package/dist/templates-physical/react/.env.example +6 -0
- package/dist/templates-physical/react/.prettierrc +8 -0
- package/dist/templates-physical/react/README.md +81 -0
- package/dist/templates-physical/react/eslint.config.js +7 -0
- package/dist/templates-physical/react/index.html +13 -0
- package/dist/templates-physical/react/package.json +39 -0
- package/dist/templates-physical/react/src/app/App.module.css +39 -0
- package/dist/templates-physical/react/src/app/App.test.tsx +14 -0
- package/dist/templates-physical/react/src/app/App.tsx +17 -0
- package/dist/templates-physical/react/src/main.tsx +10 -0
- package/dist/templates-physical/react/src/styles/index.css +39 -0
- package/dist/templates-physical/react/src/test/setup.ts +57 -0
- package/dist/templates-physical/react/tsconfig.json +25 -0
- package/dist/templates-physical/react/tsconfig.node.json +10 -0
- package/dist/templates-physical/react/vite.config.ts +16 -0
- package/dist/templates-physical/react/vitest.config.ts +22 -0
- package/dist/templates-physical/react-bernova/.eslintrc.cjs +15 -0
- package/dist/templates-physical/react-bernova/.prettierrc +10 -0
- package/dist/templates-physical/react-bernova/README.md +150 -0
- package/dist/templates-physical/react-bernova/bernova.config.json +58 -0
- package/dist/templates-physical/react-bernova/eslint.config.js +7 -0
- package/dist/templates-physical/react-bernova/index.html +21 -0
- package/dist/templates-physical/react-bernova/package.json +43 -0
- package/dist/templates-physical/react-bernova/src/App.css +89 -0
- package/dist/templates-physical/react-bernova/src/App.tsx +51 -0
- package/dist/templates-physical/react-bernova/src/index.css +54 -0
- package/dist/templates-physical/react-bernova/src/main.tsx +10 -0
- package/dist/templates-physical/react-bernova/src/styles/foundations.ts +91 -0
- package/dist/templates-physical/react-bernova/src/styles/globalStyles.ts +118 -0
- package/dist/templates-physical/react-bernova/src/styles/mediaQueries.ts +18 -0
- package/dist/templates-physical/react-bernova/src/styles/theme.ts +94 -0
- package/dist/templates-physical/react-bernova/src/test/setup.ts +9 -0
- package/dist/templates-physical/react-bernova/tsconfig.json +31 -0
- package/dist/templates-physical/react-bernova/tsconfig.node.json +10 -0
- package/dist/templates-physical/react-bernova/vite.config.ts +20 -0
- package/dist/templates-physical/react-bernova/vitest.config.ts +18 -0
- package/dist/templates-physical/vanilla/.env.example +6 -0
- package/dist/templates-physical/vanilla/.prettierrc +8 -0
- package/dist/templates-physical/vanilla/README.md +76 -0
- package/dist/templates-physical/vanilla/eslint.config.js +7 -0
- package/dist/templates-physical/vanilla/index.html +13 -0
- package/dist/templates-physical/vanilla/package.json +28 -0
- package/dist/templates-physical/vanilla/src/app.module.css +39 -0
- package/dist/templates-physical/vanilla/src/app.test.ts +20 -0
- package/dist/templates-physical/vanilla/src/app.ts +31 -0
- package/dist/templates-physical/vanilla/src/main.ts +9 -0
- package/dist/templates-physical/vanilla/src/styles/main.css +39 -0
- package/dist/templates-physical/vanilla/tsconfig.json +23 -0
- package/dist/templates-physical/vanilla/vite.config.ts +14 -0
- package/dist/templates-physical/vanilla/vitest.config.ts +14 -0
- package/package.json +131 -0
- package/templates/kubit-full/.prettierrc +0 -0
- package/templates/kubit-full/README.md +223 -0
- package/templates/kubit-full/bernova.config.json +0 -0
- package/templates/kubit-full/eslint.config.js +0 -0
- package/templates/kubit-full/index.html +17 -0
- package/templates/kubit-full/package.json +53 -0
- package/templates/kubit-full/src/App.css +118 -0
- package/templates/kubit-full/src/App.tsx +75 -0
- package/templates/kubit-full/src/charts/ChartsShowcase.css +0 -0
- package/templates/kubit-full/src/charts/ChartsShowcase.tsx +0 -0
- package/templates/kubit-full/src/components/ComponentsShowcase.css +147 -0
- package/templates/kubit-full/src/components/ComponentsShowcase.tsx +0 -0
- package/templates/kubit-full/src/main.tsx +0 -0
- package/templates/kubit-full/src/styles/index.css +6 -0
- package/templates/kubit-full/src/styles/theme/components/button.ts +0 -0
- package/templates/kubit-full/src/styles/theme/components/card.ts +0 -0
- package/templates/kubit-full/src/styles/theme/components/input.ts +0 -0
- package/templates/kubit-full/src/styles/theme/foundations.ts +0 -0
- package/templates/kubit-full/src/styles/theme/globalStyles.ts +0 -0
- package/templates/kubit-full/src/styles/theme/mediaQueries.ts +0 -0
- package/templates/kubit-full/src/styles/theme/theme.ts +0 -0
- package/templates/kubit-full/src/test/setup.ts +0 -0
- package/templates/kubit-full/tsconfig.json +29 -0
- package/templates/kubit-full/tsconfig.node.json +11 -0
- package/templates/kubit-full/vite.config.ts +24 -0
- package/templates/kubit-full/vitest.config.ts +26 -0
- package/templates/react/.env.example +6 -0
- package/templates/react/.prettierrc +8 -0
- package/templates/react/README.md +81 -0
- package/templates/react/eslint.config.js +7 -0
- package/templates/react/index.html +13 -0
- package/templates/react/package.json +39 -0
- package/templates/react/src/app/App.module.css +39 -0
- package/templates/react/src/app/App.test.tsx +14 -0
- package/templates/react/src/app/App.tsx +17 -0
- package/templates/react/src/main.tsx +10 -0
- package/templates/react/src/styles/index.css +39 -0
- package/templates/react/src/test/setup.ts +57 -0
- package/templates/react/tsconfig.json +25 -0
- package/templates/react/tsconfig.node.json +10 -0
- package/templates/react/vite.config.ts +16 -0
- package/templates/react/vitest.config.ts +22 -0
- package/templates/react-bernova/.eslintrc.cjs +15 -0
- package/templates/react-bernova/.prettierrc +10 -0
- package/templates/react-bernova/README.md +150 -0
- package/templates/react-bernova/bernova.config.json +58 -0
- package/templates/react-bernova/eslint.config.js +7 -0
- package/templates/react-bernova/index.html +21 -0
- package/templates/react-bernova/package.json +43 -0
- package/templates/react-bernova/src/App.css +89 -0
- package/templates/react-bernova/src/App.tsx +51 -0
- package/templates/react-bernova/src/index.css +54 -0
- package/templates/react-bernova/src/main.tsx +10 -0
- package/templates/react-bernova/src/styles/foundations.ts +91 -0
- package/templates/react-bernova/src/styles/globalStyles.ts +118 -0
- package/templates/react-bernova/src/styles/mediaQueries.ts +18 -0
- package/templates/react-bernova/src/styles/theme.ts +94 -0
- package/templates/react-bernova/src/test/setup.ts +9 -0
- package/templates/react-bernova/tsconfig.json +31 -0
- package/templates/react-bernova/tsconfig.node.json +10 -0
- package/templates/react-bernova/vite.config.ts +20 -0
- package/templates/react-bernova/vitest.config.ts +18 -0
- package/templates/vanilla/.env.example +6 -0
- package/templates/vanilla/.prettierrc +8 -0
- package/templates/vanilla/README.md +76 -0
- package/templates/vanilla/eslint.config.js +7 -0
- package/templates/vanilla/index.html +13 -0
- package/templates/vanilla/package.json +28 -0
- package/templates/vanilla/src/app.module.css +39 -0
- package/templates/vanilla/src/app.test.ts +20 -0
- package/templates/vanilla/src/app.ts +31 -0
- package/templates/vanilla/src/main.ts +9 -0
- package/templates/vanilla/src/styles/main.css +39 -0
- package/templates/vanilla/tsconfig.json +23 -0
- package/templates/vanilla/vite.config.ts +14 -0
- 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":";;;AAAA,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;;;ACmCd,IAAM,2BAAN,MAA+B;AAAA,EAC5B;AAAA,EACA,UAAuC,oBAAI,IAAI;AAAA,EAEvD,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAgC;AACvC,SAAK,QAAQ,IAAI,SAAS,MAAM,QAAQ;AACxC,SAAK,OAAO,MAAM,+BAA+B,SAAS,IAAI,IAAI,SAAS,OAAO,EAAE;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,aAAyC;AAC/C,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAC5B,UAAM,UAA8B,CAAC;AACrC,UAAM,YAA8D,CAAC;AAGrE,UAAM,QAAQ,KAAK,qBAAqB,WAAW;AAGnD,eAAW,cAAc,aAAa;AACpC,YAAM,WAAW,KAAK,QAAQ,IAAI,UAAU;AAC5C,UAAI,CAAC,UAAU;AAGb,iBAAS,KAAK,WAAW,UAAU,+CAA+C;AAClF;AAAA,MACF;AAGA,UAAI,SAAS,cAAc;AACzB,mBAAW,OAAO,SAAS,cAAc;AACvC,cAAI,CAAC,KAAK,QAAQ,IAAI,IAAI,IAAI,GAAG;AAC/B,gBAAI,IAAI,UAAU;AAChB,uBAAS;AAAA,gBACP,wBAAwB,IAAI,IAAI,UAAU,UAAU;AAAA,cACtD;AAAA,YACF,OAAO;AACL,qBAAO,KAAK,wBAAwB,IAAI,IAAI,UAAU,UAAU,oBAAoB;AACpF,sBAAQ,KAAK,GAAG;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,SAAS,kBAAkB;AAC7B,mBAAW,QAAQ,SAAS,kBAAkB;AAC5C,cAAI,CAAC,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG;AAChC,qBAAS,KAAK,oBAAoB,KAAK,IAAI,UAAU,UAAU,oBAAoB;AACnF,gBAAI,CAAC,KAAK,UAAU;AAClB,sBAAQ,KAAK,IAAI;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,SAAS,WAAW;AACtB,mBAAW,YAAY,SAAS,WAAW;AACzC,cAAI,KAAK,QAAQ,IAAI,QAAQ,GAAG;AAC9B,mBAAO,KAAK,WAAW,UAAU,qBAAqB,QAAQ,GAAG;AACjE,sBAAU,KAAK,EAAE,eAAe,UAAU,QAAQ,WAAW,CAAC;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,2BAA2B,KAAK;AACtD,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,KAAK,mCAAmC,SAAS,KAAK,MAAM,CAAC,EAAE;AAAA,IACxE;AAGA,QAAI,YAAsB,CAAC;AAC3B,QAAI,OAAO,WAAW,GAAG;AACvB,UAAI;AACF,oBAAY,KAAK,gBAAgB,KAAK;AAAA,MACxC,SAAS,OAAO;AACd,eAAO;AAAA,UACL,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,aAAwC;AACnE,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,UAAM,QAAQ,oBAAI,IAAyB;AAE3C,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,QAAQ,CAAC,GAAG,WAAW;AAE7B,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,UAAU,MAAM,MAAM;AAC5B,UAAI,QAAQ,IAAI,OAAO,GAAG;AACxB;AAAA,MACF;AAEA,cAAQ,IAAI,OAAO;AACnB,YAAM,WAAW,KAAK,QAAQ,IAAI,OAAO;AAEzC,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,YAAM,IAAI,SAAS,QAAQ;AAG3B,UAAI,SAAS,cAAc;AACzB,mBAAW,OAAO,SAAS,cAAc;AACvC,cAAI,CAAC,MAAM,IAAI,OAAO,GAAG;AACvB,kBAAM,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,UAC9B;AACA,gBAAM,IAAI,OAAO,EAAG,IAAI,IAAI,IAAI;AAGhC,cAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG;AAC1B,kBAAM,KAAK,IAAI,IAAI;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAGA,UAAI,SAAS,kBAAkB;AAC7B,mBAAW,QAAQ,SAAS,kBAAkB;AAC5C,cAAI,CAAC,MAAM,IAAI,OAAO,GAAG;AACvB,kBAAM,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,UAC9B;AACA,gBAAM,IAAI,OAAO,EAAG,IAAI,KAAK,IAAI;AAEjC,cAAI,CAAC,QAAQ,IAAI,KAAK,IAAI,GAAG;AAC3B,kBAAM,KAAK,KAAK,IAAI;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,OAAO,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,OAAkC;AACnE,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAM,OAAiB,CAAC;AAExB,UAAM,MAAM,CAAC,SAA0B;AACrC,cAAQ,IAAI,IAAI;AAChB,qBAAe,IAAI,IAAI;AACvB,WAAK,KAAK,IAAI;AAEd,YAAM,eAAe,MAAM,MAAM,IAAI,IAAI,KAAK,oBAAI,IAAI;AACtD,iBAAW,OAAO,cAAc;AAC9B,YAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AACrB,cAAI,IAAI,GAAG,GAAG;AACZ,mBAAO;AAAA,UACT;AAAA,QACF,WAAW,eAAe,IAAI,GAAG,GAAG;AAElC,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,qBAAe,OAAO,IAAI;AAC1B,WAAK,IAAI;AACT,aAAO;AAAA,IACT;AAEA,eAAW,QAAQ,MAAM,MAAM,KAAK,GAAG;AACrC,UAAI,CAAC,QAAQ,IAAI,IAAI,GAAG;AACtB,YAAI,IAAI,IAAI,GAAG;AACb,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAkC;AACxD,UAAM,WAAW,oBAAI,IAAoB;AACzC,UAAM,SAAmB,CAAC;AAG1B,eAAW,QAAQ,MAAM,MAAM,KAAK,GAAG;AACrC,eAAS,IAAI,MAAM,CAAC;AAAA,IACtB;AAGA,eAAW,gBAAgB,MAAM,MAAM,OAAO,GAAG;AAC/C,iBAAW,OAAO,cAAc;AAC9B,YAAI,MAAM,MAAM,IAAI,GAAG,GAAG;AACxB,mBAAS,IAAI,MAAM,SAAS,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAGA,UAAM,QAAkB,CAAC;AACzB,eAAW,CAAC,MAAM,MAAM,KAAK,SAAS,QAAQ,GAAG;AAC/C,UAAI,WAAW,GAAG;AAChB,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAGA,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,UAAU,MAAM,MAAM;AAC5B,aAAO,KAAK,OAAO;AAEnB,YAAM,eAAe,MAAM,MAAM,IAAI,OAAO,KAAK,oBAAI,IAAI;AACzD,iBAAW,OAAO,cAAc;AAC9B,YAAI,CAAC,MAAM,MAAM,IAAI,GAAG,GAAG;AACzB;AAAA,QACF;AAEA,cAAM,aAAa,SAAS,IAAI,GAAG,KAAK,KAAK;AAC7C,iBAAS,IAAI,KAAK,SAAS;AAE3B,YAAI,cAAc,GAAG;AACnB,gBAAM,KAAK,GAAG;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,WAAW,MAAM,MAAM,MAAM;AACtC,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,WAAO,OAAO,QAAQ;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,YAAoC;AACpD,UAAM,WAAW,KAAK,QAAQ,IAAI,UAAU;AAC5C,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,cAAc,CAAC,GAAG,MAAM,YAAY,SAAS,UAAU;AAAA,IAClE;AAEA,UAAM,OAAuB;AAAA,MAC3B,cAAc,CAAC;AAAA,MACf,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,IACpB;AAEA,QAAI,SAAS,cAAc;AACzB,iBAAW,OAAO,SAAS,cAAc;AACvC,cAAM,UAAU,KAAK,kBAAkB,IAAI,IAAI;AAC/C,aAAK,aAAa,KAAK,OAAO;AAAA,MAChC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,YAAiC;AAClD,UAAM,eAAe,oBAAI,IAAY;AACrC,UAAM,UAAU,oBAAI,IAAY;AAEhC,UAAM,WAAW,CAAC,SAAiB;AACjC,UAAI,QAAQ,IAAI,IAAI,GAAG;AACrB;AAAA,MACF;AAEA,cAAQ,IAAI,IAAI;AAChB,YAAM,WAAW,KAAK,QAAQ,IAAI,IAAI;AAEtC,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,SAAS,cAAc;AACzB,mBAAW,OAAO,SAAS,cAAc;AACvC,uBAAa,IAAI,IAAI,IAAI;AACzB,mBAAS,IAAI,IAAI;AAAA,QACnB;AAAA,MACF;AAEA,UAAI,SAAS,kBAAkB;AAC7B,mBAAW,QAAQ,SAAS,kBAAkB;AAC5C,uBAAa,IAAI,KAAK,IAAI;AAC1B,mBAAS,KAAK,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,UAAU;AACnB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,YAAiE;AACzE,UAAM,YAAsB,CAAC;AAG7B,eAAW,CAAC,IAAI,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAC3C,UAAI,SAAS,YAAY;AACvB;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,mBAAmB,IAAI;AACzC,UAAI,KAAK,IAAI,UAAU,GAAG;AACxB,kBAAU,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,WAAW,UAAU,WAAW;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA8B;AAC1C,UAAM,aAAuB,CAAC;AAE9B,eAAW,CAAC,IAAI,KAAK,KAAK,QAAQ,QAAQ,GAAG;AAC3C,UAAI,SAAS,YAAY;AACvB;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,QAAQ,IAAI,IAAI;AACtC,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,SAAS,cAAc;AACzB,cAAM,SAAS,SAAS,aAAa,KAAK,CAAC,QAAQ,IAAI,SAAS,UAAU;AAC1E,YAAI,QAAQ;AACV,qBAAW,KAAK,IAAI;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,SAAS,kBAAkB;AAC7B,cAAM,UAAU,SAAS,iBAAiB,KAAK,CAAC,SAAS,KAAK,SAAS,UAAU;AACjF,YAAI,SAAS;AACX,qBAAW,KAAK,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,QAAI,YAAY;AAChB,QAAI,gBAAgB;AACpB,QAAI,iBAAiB;AAErB,eAAW,YAAY,KAAK,QAAQ,OAAO,GAAG;AAC5C,mBAAa,SAAS,cAAc,UAAU;AAC9C,uBAAiB,SAAS,kBAAkB,UAAU;AACtD,wBAAkB,SAAS,WAAW,UAAU;AAAA,IAClD;AAEA,WAAO;AAAA,MACL;AAAA,MACA,mBAAmB;AAAA,MACnB,uBAAuB;AAAA,MACvB,cAAc,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AACF;;;ACrZO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EAER,YAAY,QAAgB,eAAuB,8BAA8B;AAC/E,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OACJ,OACA,UAAqD,CAAC,GAC/B;AACvB,SAAK,OAAO,MAAM,sBAAsB,KAAK,EAAE;AAI/C,UAAM,cAA4B;AAAA,MAChC;AAAA,QACE,QAAQ;AAAA,QACR,cAAc,CAAC,YAAY,WAAW;AAAA,QACtC,UAAU;AAAA,QACV,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM,CAAC,OAAO,WAAW,iBAAiB,SAAS;AAAA,QACnD,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,cAAc,CAAC,YAAY,aAAa,eAAe;AAAA,QACvD,UAAU;AAAA,QACV,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM,CAAC,aAAa,cAAc,IAAI;AAAA,QACtC,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,cAAc,CAAC,WAAW,UAAU;AAAA,QACpC,UAAU;AAAA,QACV,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM,CAAC,QAAQ,eAAe,cAAc;AAAA,QAC5C,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAGA,QAAI,UAAU,YAAY;AAAA,MACxB,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,KACjD,EAAE,YAAY,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,KACxD,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,CAAC;AAAA,IACrE;AAGA,QAAI,QAAQ,aAAa,QAAW;AAClC,gBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,QAAQ;AAAA,IACjE;AAEA,QAAI,QAAQ,UAAU;AACpB,gBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,QAAQ;AAAA,IACjE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QAAQ,MAA0C;AACtD,SAAK,OAAO,MAAM,yBAAyB,IAAI,EAAE;AAIjD,UAAM,aAAyB;AAAA,MAC7B,QAAQ;AAAA,MACR,cAAc,CAAC,SAAS;AAAA,MACxB,UAAU;AAAA,MACV,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU,+BAA+B,IAAI;AAAA,MAC7C,cAAc;AAAA,MACd;AAAA,MACA,YAAY,+BAA+B,IAAI;AAAA,MAC/C,MAAM,CAAC,SAAS;AAAA,MAChB,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChC,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,MAAgC;AAC/C,UAAM,OAAO,MAAM,KAAK,QAAQ,IAAI;AACpC,WAAO,MAAM,YAAY;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,eAA8C;AAEhE,WAAO,KAAK,OAAO,IAAI,CAAC,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAqC;AACzC,WAAO,KAAK,OAAO,IAAI,EAAE,UAAU,KAAK,CAAC;AAAA,EAC3C;AACF;;;AC5KA,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,YAAY;AAkBd,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EAEpB,YAAY,QAAgB,UAA0B,CAAC,GAAG;AACxD,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,MACb,qBAAqB,QAAQ,uBAAuB,CAAC;AAAA,MACrD,iBAAiB,QAAQ,mBAAmB;AAAA,MAC5C,cAAc,QAAQ,gBAAgB;AAAA,MACtC,iBAAiB,QAAQ,mBAAmB;AAAA,MAC5C,aAAa,QAAQ,eAAe,MAAM,OAAO;AAAA;AAAA,MACjD,SAAS,QAAQ,WAAW;AAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,YAAoB,QAAgB,MAA6B;AAChF,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,SAAK,YAAY;AAEjB,QAAI;AAEF,UAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,cAAM,IAAI,MAAM,qBAAqB,UAAU,EAAE;AAAA,MACnD;AAGA,YAAM,iBAAiB,KAAK,qBAAqB;AAGjD,YAAM,SAAS,MAAM,KAAK,gBAAmB,YAAY,QAAQ,MAAM,cAAc;AAErF,aAAO;AAAA,IACT,UAAE;AACA,WAAK,YAAY;AACjB,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAgD;AACtD,UAAM,UAAmC;AAAA,MACvC,SAAS;AAAA,QACP,OAAO,IAAI,SAAoB,KAAK,OAAO,MAAM,KAAK,KAAK,GAAG,CAAC;AAAA,QAC/D,KAAK,IAAI,SAAoB,KAAK,OAAO,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,QAC5D,MAAM,IAAI,SAAoB,KAAK,OAAO,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,MAC/D;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ,iBAAiB;AAChC,cAAQ,UAAU;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd,KAAK,QAAQ;AAAA,QACb,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,QACtB,UAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,iBAAiB;AAEhC,cAAQ,KAAK,KAAK,mBAAmB;AAAA,IACvC;AAEA,QAAI,KAAK,QAAQ,cAAc;AAE7B,cAAQ,QAAQ;AAAA,IAClB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB;AAC3B,UAAM,MAAM,QAAQ,IAAI;AAExB,WAAO;AAAA,MACL,QAAQ,CAAC,SAAiB;AACxB,cAAM,WAAW,KAAK,KAAK,IAAI;AAC/B,YAAI,CAAC,SAAS,WAAW,GAAG,GAAG;AAC7B,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AACA,eAAO,WAAW,QAAQ;AAAA,MAC5B;AAAA,MACA,OAAO,CAAC,SAAiB;AACvB,cAAM,WAAW,KAAK,KAAK,IAAI;AAC/B,YAAI,CAAC,SAAS,WAAW,GAAG,GAAG;AAC7B,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AACA,eAAO,UAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,MAChD;AAAA,MACA,UAAU,CAAC,SAAiB;AAC1B,cAAM,WAAW,KAAK,KAAK,IAAI;AAC/B,YAAI,CAAC,SAAS,WAAW,GAAG,GAAG;AAC7B,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AACA,eAAO,aAAa,UAAU,OAAO;AAAA,MACvC;AAAA,MACA,WAAW,CAAC,MAAc,YAAoB;AAC5C,cAAM,WAAW,KAAK,KAAK,IAAI;AAC/B,YAAI,CAAC,SAAS,WAAW,GAAG,GAAG;AAC7B,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AACA,eAAO,cAAc,UAAU,SAAS,OAAO;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBACZ,YACA,QACA,MACA,UACY;AACZ,UAAM,UAAU,WAAW,MAAM;AAC/B,UAAI,KAAK,QAAQ;AACf,aAAK,OAAO,UAAU;AAAA,MACxB;AAAA,IACF,GAAG,KAAK,QAAQ,OAAO;AAEvB,QAAI;AAGF,YAAM,eAAe,MAAM,OAAO;AAClC,YAAM,SAAS,aAAa,WAAW;AACvC,YAAM,iBAAiB,OAAO,WAAW;AAEzC,UAAI,CAAC,eAAe,MAAM,GAAG;AAC3B,qBAAa,OAAO;AACpB,cAAM,IAAI,MAAM,WAAW,MAAM,uBAAuB;AAAA,MAC1D;AAEA,YAAM,SAAS,eAAe,MAAM,EAAE,GAAG,IAAI;AAE7C,UAAI,kBAAkB,SAAS;AAC7B,eAAO,OACJ,KAAK,CAAC,QAAW;AAChB,uBAAa,OAAO;AACpB,iBAAO;AAAA,QACT,CAAC,EACA,MAAM,CAAC,QAAe;AACrB,uBAAa,OAAO;AACpB,gBAAM;AAAA,QACR,CAAC;AAAA,MACL;AACA,mBAAa,OAAO;AACpB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,mBAAa,OAAO;AACpB,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA6B;AACzC,WAAO,KAAK,QAAQ,oBAAoB,SAAS,UAAU;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,WAAO;AAAA,MACL,qBAAqB,KAAK,QAAQ;AAAA,MAClC,iBAAiB,KAAK,QAAQ;AAAA,MAC9B,cAAc,KAAK,QAAQ;AAAA,MAC3B,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK,QAAQ;AAAA,MAC1B,SAAS,KAAK,QAAQ;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAgB;AACtB,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,UAAU;AACtB,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACnB;AACF;AAMO,IAAM,iBAAN,MAAqB;AAAA,EAClB,YAAwC,oBAAI,IAAI;AAAA,EAChD;AAAA,EAER,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAAoB,UAA0B,CAAC,GAAkB;AAC7E,QAAI,KAAK,UAAU,IAAI,UAAU,GAAG;AAClC,YAAM,IAAI,MAAM,sCAAsC,UAAU,GAAG;AAAA,IACrE;AAEA,UAAM,UAAU,IAAI,cAAc,KAAK,QAAQ,OAAO;AACtD,SAAK,UAAU,IAAI,YAAY,OAAO;AAEtC,SAAK,OAAO,MAAM,+BAA+B,UAAU,GAAG;AAC9D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,YAA+C;AACxD,WAAO,KAAK,UAAU,IAAI,UAAU;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA0B;AACtC,UAAM,UAAU,KAAK,UAAU,IAAI,UAAU;AAC7C,QAAI,SAAS;AACX,cAAQ,UAAU;AAClB,WAAK,UAAU,OAAO,UAAU;AAChC,WAAK,OAAO,MAAM,+BAA+B,UAAU,GAAG;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqB;AACnB,eAAW,CAAC,YAAY,OAAO,KAAK,KAAK,UAAU,QAAQ,GAAG;AAC5D,cAAQ,UAAU;AAClB,WAAK,OAAO,MAAM,kCAAkC,UAAU,GAAG;AAAA,IACnE;AACA,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,UAAM,QAAiC,CAAC;AACxC,eAAW,CAAC,YAAY,OAAO,KAAK,KAAK,UAAU,QAAQ,GAAG;AAC5D,YAAM,UAAU,IAAI,QAAQ,SAAS;AAAA,IACvC;AACA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,gBAAgB,KAAK,UAAU;AAAA,IACjC;AAAA,EACF;AACF;;;ACpSO,IAAM,kBAAN,MAAsB;AAAA;AAAA;AAAA;AAAA,EAI3B,SAAS,QAAwC;AAC/C,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAC5B,UAAM,iBAA2B,CAAC;AAGlC,QAAI,CAAC,OAAO,MAAM;AAChB,aAAO,KAAK,yBAAyB;AAAA,IACvC,OAAO;AAEL,UAAI,CAAC,yCAAyC,KAAK,OAAO,IAAI,GAAG;AAC/D,eAAO;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,KAAK,4BAA4B;AAAA,IAC1C,OAAO;AAEL,UAAI,CAAC,kDAAkD,KAAK,OAAO,OAAO,GAAG;AAC3E,eAAO,KAAK,wDAAwD;AAAA,MACtE;AAAA,IACF;AAGA,QAAI,OAAO,cAAc;AACvB,YAAM,oBAAwC;AAAA,QAC5C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,iBAAW,OAAO,OAAO,cAAc;AACrC,YAAI,CAAC,kBAAkB,SAAS,GAAG,GAAG;AACpC,iBAAO,KAAK,uBAAuB,GAAG,EAAE;AAAA,QAC1C;AAGA,YAAI,QAAQ,YAAY;AACtB,yBAAe,KAAK,0CAA0C;AAAA,QAChE;AACA,YAAI,QAAQ,aAAa;AACvB,yBAAe,KAAK,yCAAyC;AAAA,QAC/D;AACA,YAAI,QAAQ,eAAe;AACzB,mBAAS,KAAK,iDAAiD;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,YAAY;AAC7B,UAAI,QAAQ,UAAU,OAAO,OAAO,IAAoB,MAAM,YAAY;AACxE,eAAO,KAAK,SAAS,IAAI,sBAAsB;AAAA,MACjD;AAAA,IACF;AAGA,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,UAAU,oBAAoB;AACvC,UAAI,UAAU,UAAU,OAAO,OAAO,MAAsB,MAAM,YAAY;AAC5E,eAAO,KAAK,wBAAwB,MAAM,sBAAsB;AAAA,MAClE;AAAA,IACF;AAGA,QAAI,CAAC,OAAO,gBAAgB,OAAO,aAAa,WAAW,GAAG;AAC5D,eAAS,KAAK,0CAA0C;AAAA,IAC1D;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAyB;AACxC,QAAI,CAAC,OAAO,cAAc;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,wBAA4C,CAAC,YAAY,WAAW;AAC1E,WAAO,OAAO,aAAa,KAAK,CAAC,QAAQ,sBAAsB,SAAS,GAAG,CAAC;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAmD;AAClE,QAAI,CAAC,OAAO,gBAAgB,OAAO,aAAa,WAAW,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA,UAAM,wBAA4C,CAAC,YAAY,WAAW;AAC1E,UAAM,eAAe,OAAO,aAAa,KAAK,CAAC,QAAQ,sBAAsB,SAAS,GAAG,CAAC;AAE1F,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,uBAA2C,CAAC,eAAe,eAAe;AAChF,UAAM,cAAc,OAAO,aAAa,KAAK,CAAC,QAAQ,qBAAqB,SAAS,GAAG,CAAC;AAExF,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,SAAoD;AAClE,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,QAAQ,QAAQ,OAAO,QAAQ,SAAS,UAAU;AACrD,aAAO,KAAK,mCAAmC;AAAA,IACjD;AAEA,QAAI,CAAC,QAAQ,eAAe,OAAO,QAAQ,gBAAgB,UAAU;AACnE,aAAO,KAAK,0CAA0C;AAAA,IACxD;AAEA,QAAI,CAAC,QAAQ,UAAU,OAAO,QAAQ,WAAW,YAAY;AAC3D,aAAO,KAAK,wCAAwC;AAAA,IACtD;AAEA,QAAI,QAAQ,WAAW,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACtD,aAAO,KAAK,kCAAkC;AAAA,IAChD;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAiD;AAC5D,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,KAAK,QAAQ,OAAO,KAAK,SAAS,UAAU;AAC/C,aAAO,KAAK,gCAAgC;AAAA,IAC9C;AAEA,QAAI,CAAC,KAAK,eAAe,OAAO,KAAK,gBAAgB,UAAU;AAC7D,aAAO,KAAK,uCAAuC;AAAA,IACrD;AAEA,QAAI,CAAC,KAAK,OAAO,OAAO,KAAK,QAAQ,YAAY;AAC/C,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,WAAsD;AACtE,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,UAAU,QAAQ,OAAO,UAAU,SAAS,UAAU;AACzD,aAAO,KAAK,qCAAqC;AAAA,IACnD;AAEA,QAAI,CAAC,UAAU,eAAe,OAAO,UAAU,gBAAgB,UAAU;AACvE,aAAO,KAAK,4CAA4C;AAAA,IAC1D;AAEA,QAAI,CAAC,UAAU,YAAY,OAAO,UAAU,aAAa,YAAY;AACnE,aAAO,KAAK,yCAAyC;AAAA,IACvD;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAAqD;AACpE,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,SAAS,WAAW,OAAO,SAAS,YAAY,UAAU;AAC7D,aAAO,KAAK,uCAAuC;AAAA,IACrD;AAEA,QAAI,OAAO,SAAS,aAAa,UAAU;AACzC,aAAO,KAAK,wCAAwC;AAAA,IACtD;AAEA,QAAI,CAAC,SAAS,aAAa,OAAO,SAAS,cAAc,YAAY;AACnE,aAAO,KAAK,yCAAyC;AAAA,IACvD;AAEA,QAAI,CAAC,SAAS,WAAW,OAAO,SAAS,YAAY,YAAY;AAC/D,aAAO,KAAK,uCAAuC;AAAA,IACrD;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,WAAW;AAAA,IAC3B;AAAA,EACF;AACF;;;AC1PA,SAAS,WAAW,OAAO,QAAQ,IAAI,IAAI,UAAU;AA2B9C,IAAM,uBAAN,MAA2B;AAAA,EACxB;AAAA,EACA,oBAAyC,oBAAI,IAAI;AAAA,EACjD,mBAAwC,oBAAI,IAAI;AAAA,EAChD,iBAAsC,oBAAI,IAAI;AAAA,EAEtD,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,YAAoB,SAAuB;AAC3D,UAAM,aAAa,KAAK,iBAAiB,OAAO;AAChD,QAAI,CAAC,YAAY;AACf,WAAK,OAAO,KAAK,+BAA+B,UAAU,MAAM,OAAO,EAAE;AACzE;AAAA,IACF;AAEA,SAAK,kBAAkB,IAAI,YAAY,UAAU;AACjD,SAAK,OAAO,MAAM,sBAAsB,UAAU,aAAa,UAAU,EAAE;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,YAAoB,cAA4B;AAC1D,SAAK,iBAAiB,IAAI,YAAY,YAAY;AAClD,SAAK,OAAO,MAAM,6BAA6B,UAAU,MAAM,YAAY,EAAE;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,YAAoB,SAAuB;AACnD,UAAM,aAAa,KAAK,iBAAiB,OAAO;AAChD,QAAI,YAAY;AACd,WAAK,eAAe,IAAI,YAAY,UAAU;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,YAAoB,cAA+B;AAC3D,UAAM,YAAY,KAAK,kBAAkB,IAAI,UAAU;AACvD,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,UAAU,WAAW,YAAY;AAAA,IAC1C,QAAQ;AACN,WAAK,OAAO,KAAK,8BAA8B,UAAU,MAAM,YAAY,EAAE;AAC7E,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,YAAwC;AACzD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAC5B,UAAM,kBAA4B,CAAC;AAEnC,UAAM,YAAY,KAAK,kBAAkB,IAAI,UAAU;AACvD,UAAM,WAAW,KAAK,iBAAiB,IAAI,UAAU;AACrD,UAAM,SAAS,KAAK,eAAe,IAAI,UAAU;AAGjD,QAAI,CAAC,WAAW;AACd,aAAO,KAAK,WAAW,UAAU,oBAAoB;AACrD,aAAO,EAAE,YAAY,OAAO,QAAQ,iBAAiB,SAAS;AAAA,IAChE;AAGA,QAAI,YAAY,CAAC,KAAK,UAAU,YAAY,QAAQ,GAAG;AACrD,aAAO;AAAA,QACL,WAAW,UAAU,aAAa,SAAS,iCAAiC,QAAQ;AAAA,MACtF;AAAA,IACF;AAGA,QAAI,UAAU,GAAG,QAAQ,SAAS,GAAG;AACnC,eAAS,KAAK,WAAW,UAAU,8BAA8B,SAAS,WAAM,MAAM,EAAE;AACxF,sBAAgB,KAAK,kCAAkC,UAAU,EAAE;AAAA,IACrE;AAGA,QAAI,QAAQ;AACV,YAAM,iBAAiB,SAAS,UAAU,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAC3D,YAAM,cAAc,SAAS,OAAO,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAErD,UAAI,cAAc,iBAAiB,GAAG;AACpC,iBAAS;AAAA,UACP,WAAW,UAAU,QAAQ,cAAc,cAAc;AAAA,QAC3D;AACA,wBAAgB,KAAK,iCAAiC,MAAM,EAAE;AAAA,MAChE;AAAA,IACF;AAEA,WAAO;AAAA,MACL,YAAY,OAAO,WAAW;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,YAAmC;AAChD,UAAM,YAAY,KAAK,kBAAkB,IAAI,UAAU;AACvD,UAAM,WAAW,KAAK,iBAAiB,IAAI,UAAU;AACrD,UAAM,SAAS,KAAK,eAAe,IAAI,UAAU;AAEjD,UAAM,aAAa,WAAW,KAAK,UAAU,YAAY,QAAQ,IAAI;AACrE,UAAM,kBAAkB,aAAa,SAAS,GAAG,QAAQ,SAAS,IAAI;AAEtE,WAAO;AAAA,MACL;AAAA,MACA,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB;AAAA,MACA,SAAS,aAAa;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAkC;AAChC,UAAM,aAAa,oBAAI,IAAI;AAAA,MACzB,GAAG,KAAK,kBAAkB,KAAK;AAAA,MAC/B,GAAG,KAAK,iBAAiB,KAAK;AAAA,MAC9B,GAAG,KAAK,eAAe,KAAK;AAAA,IAC9B,CAAC;AAED,WAAO,MAAM,KAAK,UAAU,EAAE,IAAI,CAAC,WAAW,KAAK,eAAe,MAAM,CAAC;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,YAA6B;AACrC,UAAM,YAAY,KAAK,kBAAkB,IAAI,UAAU;AACvD,UAAM,SAAS,KAAK,eAAe,IAAI,UAAU;AAEjD,QAAI,CAAC,aAAa,CAAC,QAAQ;AACzB,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,QAAQ,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAuC;AACrC,WAAO,KAAK,eAAe,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,yBAA0C;AACxC,WAAO,KAAK,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,aAGf;AACA,UAAM,WAAW,oBAAI,IAAoB;AACzC,UAAM,YAAsB,CAAC;AAG7B,UAAM,WAAW,oBAAI,IAAiC;AACtD,eAAW,cAAc,aAAa;AACpC,UAAI,CAAC,SAAS,IAAI,WAAW,MAAM,GAAG;AACpC,iBAAS,IAAI,WAAW,QAAQ,CAAC,CAAC;AAAA,MACpC;AACA,eAAS,IAAI,WAAW,MAAM,EAAG,KAAK,UAAU;AAAA,IAClD;AAGA,eAAW,CAAC,QAAQ,iBAAiB,KAAK,SAAS,QAAQ,GAAG;AAC5D,UAAI,kBAAkB,WAAW,GAAG;AAElC,iBAAS,IAAI,QAAQ,kBAAkB,CAAC,EAAE,OAAO;AACjD;AAAA,MACF;AAGA,YAAM,WAAW,kBAAkB,IAAI,CAAC,MAAM,EAAE,OAAO;AACvD,YAAM,aAAa,KAAK,sBAAsB,QAAQ;AAEtD,UAAI,YAAY;AACd,iBAAS,IAAI,QAAQ,UAAU;AAAA,MACjC,OAAO;AACL,kBAAU;AAAA,UACR,+BAA+B,MAAM,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,SAAS;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,eAAwC;AAEpE,UAAM,aAAuB,CAAC;AAI9B,eAAW,SAAS,eAAe;AACjC,YAAM,aAAa,KAAK,iBAAiB,KAAK;AAC9C,UAAI,cAAc,WAAW,WAAW,GAAG;AACzC,mBAAW,KAAK,UAAU;AAAA,MAC5B;AAAA,IACF;AAGA,eAAW,aAAa,YAAY;AAClC,YAAM,eAAe,cAAc,MAAM,CAAC,UAAU;AAClD,YAAI;AACF,iBAAO,UAAU,WAAW,KAAK;AAAA,QACnC,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAED,UAAI,cAAc;AAChB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAAgC;AAEvD,QAAI,MAAM,OAAO,GAAG;AAClB,aAAO;AAAA,IACT;AAGA,UAAM,UAAU,OAAO,OAAO;AAC9B,QAAI,SAAS;AACX,aAAO,QAAQ;AAAA,IACjB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAAkB,UAA0B;AAClD,UAAM,KAAK,KAAK,iBAAiB,QAAQ;AACzC,UAAM,KAAK,KAAK,iBAAiB,QAAQ;AAEzC,QAAI,CAAC,MAAM,CAAC,IAAI;AACd,aAAO;AAAA,IACT;AAEA,QAAI,GAAG,IAAI,EAAE,GAAG;AACd,aAAO;AAAA,IACT;AACA,QAAI,GAAG,IAAI,EAAE,GAAG;AACd,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAAkB,UAA2B;AACnD,UAAM,KAAK,KAAK,iBAAiB,QAAQ;AACzC,UAAM,KAAK,KAAK,iBAAiB,QAAQ;AAEzC,QAAI,CAAC,MAAM,CAAC,IAAI;AACd,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,IAAI,EAAE;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,UAAM,MAAM,KAAK,eAAe;AAChC,WAAO;AAAA,MACL,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE;AAAA,MAC5C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE;AAAA,MAC/C,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE;AAAA,MACjD,cAAc,IAAI;AAAA,MAClB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,kBAAkB,MAAM;AAC7B,SAAK,iBAAiB,MAAM;AAC5B,SAAK,eAAe,MAAM;AAAA,EAC5B;AACF;;;ALzUO,IAAM,gBAAN,MAAoB;AAAA,EACjB,UAA+B,oBAAI,IAAI;AAAA,EACvC,WAA6C,oBAAI,IAAI;AAAA,EACrD,QAAuC,oBAAI,IAAI;AAAA,EAC/C,aAAiD,oBAAI,IAAI;AAAA,EACzD,YAAiD,oBAAI,IAAI;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,KAAa;AACvC,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,YAAY,IAAI,gBAAgB;AACrC,SAAK,WAAW,IAAI,eAAe,MAAM;AACzC,SAAK,iBAAiB,IAAI,eAAe,MAAM;AAC/C,SAAK,iBAAiB,IAAI,qBAAqB,MAAM;AACrD,SAAK,qBAAqB,IAAI,yBAAyB,MAAM;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,aACA,KACA,UAA6B,CAAC,GACf;AAEf,QAAI,QAAQ,sBAAsB,OAAO;AACvC,YAAM,aAAa,KAAK,mBAAmB,QAAQ,WAAW;AAE9D,UAAI,WAAW,OAAO,SAAS,GAAG;AAChC,aAAK,OAAO,MAAM,sCAAsC;AACxD,mBAAW,OAAO,QAAQ,CAAC,QAAQ,KAAK,OAAO,MAAM,OAAO,GAAG,EAAE,CAAC;AAClE,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AAEA,UAAI,WAAW,SAAS,SAAS,GAAG;AAClC,mBAAW,SAAS,QAAQ,CAAC,SAAS,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,MAC9D;AAGA,oBAAc,WAAW;AACzB,WAAK,OAAO,MAAM,sBAAsB,YAAY,KAAK,MAAM,CAAC,EAAE;AAAA,IACpE;AAGA,eAAW,cAAc,aAAa;AACpC,UAAI;AACF,cAAM,KAAK,WAAW,YAAY,KAAK,OAAO;AAAA,MAChD,SAAS,OAAO;AACd,aAAK,OAAO;AAAA,UACV,0BAA0B,UAAU,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACpG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WACZ,YACA,KACA,UAA6B,CAAC,GACf;AAEf,QAAI;AAEJ,QAAI;AAEF,YAAM,aAAaC,MAAK,KAAK,KAAK,gBAAgB,UAAU;AAC5D,UAAIC,YAAW,UAAU,GAAG;AAC1B,uBAAe,MAAM,OAAO;AAAA,MAC9B,OAAO;AAEL,uBAAe,MAAM,OAAO;AAAA,MAC9B;AAAA,IACF,QAAQ;AACN,YAAM,IAAI,MAAM,0BAA0B,UAAU,GAAG;AAAA,IACzD;AAEA,UAAM,SAAU,aAAa,WAAW;AAExC,QAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,SAAS;AACnC,YAAM,IAAI,MAAM,mBAAmB,UAAU,4BAA4B;AAAA,IAC3E;AAGA,SAAK,eAAe,kBAAkB,OAAO,MAAM,OAAO,OAAO;AAGjE,UAAM,eAAe,KAAK,eAAe,mBAAmB,OAAO,IAAI;AACvE,QAAI,CAAC,aAAa,YAAY;AAC5B,WAAK,OAAO,MAAM,WAAW,OAAO,IAAI,uCAAuC;AAC/E,mBAAa,OAAO,QAAQ,CAAC,UAAU,KAAK,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC;AACxE,YAAM,IAAI,MAAM,WAAW,OAAO,IAAI,qBAAqB;AAAA,IAC7D;AAEA,QAAI,aAAa,SAAS,SAAS,GAAG;AACpC,mBAAa,SAAS,QAAQ,CAAC,SAAS,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,IAChE;AAGA,QAAI,QAAQ,aAAa,OAAO;AAC9B,YAAM,aAAa,KAAK,UAAU,SAAS,MAAM;AAEjD,UAAI,CAAC,WAAW,OAAO;AACrB,cAAM,IAAI;AAAA,UACR,WAAW,OAAO,IAAI;AAAA,EAAyB,WAAW,OAAO,KAAK,IAAI,CAAC;AAAA,QAC7E;AAAA,MACF;AAGA,UAAI,WAAW,SAAS,SAAS,GAAG;AAClC,mBAAW,WAAW,WAAW,UAAU;AACzC,eAAK,OAAO,KAAK,WAAW,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA,QACxD;AAAA,MACF;AAGA,UAAI,CAAC,QAAQ,qBAAqB,WAAW,eAAe,SAAS,GAAG;AACtE,aAAK,OAAO,KAAK;AAAA,8BAAiC,OAAO,IAAI,IAAI;AACjE,mBAAW,SAAS,WAAW,gBAAgB;AAC7C,eAAK,OAAO,KAAK,OAAO,KAAK,EAAE;AAAA,QACjC;AAEA,cAAM,gBAAgB,KAAK,UAAU,iBAAiB,MAAM;AAC5D,YAAI,kBAAkB,aAAa;AACjC,eAAK,OAAO;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,SAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AAGpC,QAAI,OAAO,QAAQ;AACjB,YAAM,OAAO,OAAO,GAAG;AAAA,IACzB;AAGA,QAAI,OAAO,kBAAkB;AAC3B,YAAM,WAAW,OAAO,iBAAiB;AACzC,iBAAW,OAAO,UAAU;AAC1B,aAAK,SAAS,IAAI,IAAI,MAAM,GAAG;AAC/B,aAAK,OAAO,MAAM,uBAAuB,IAAI,IAAI,kBAAkB,OAAO,IAAI,GAAG;AAAA,MACnF;AAAA,IACF;AAGA,QAAI,OAAO,eAAe;AACxB,YAAM,QAAQ,OAAO,cAAc;AACnC,iBAAW,QAAQ,OAAO;AACxB,aAAK,MAAM,IAAI,KAAK,MAAM,IAAI;AAC9B,aAAK,OAAO,MAAM,oBAAoB,KAAK,IAAI,kBAAkB,OAAO,IAAI,GAAG;AAAA,MACjF;AAAA,IACF;AAGA,QAAI,OAAO,oBAAoB;AAC7B,YAAM,aAAa,OAAO,mBAAmB;AAC7C,iBAAW,OAAO,YAAY;AAC5B,aAAK,WAAW,IAAI,IAAI,MAAM,GAAG;AACjC,aAAK,OAAO,MAAM,yBAAyB,IAAI,IAAI,kBAAkB,OAAO,IAAI,GAAG;AAAA,MACrF;AAAA,IACF;AAGA,QAAI,OAAO,mBAAmB;AAC5B,YAAM,YAAY,OAAO,kBAAkB;AAC3C,iBAAW,YAAY,WAAW;AAChC,YAAI,CAAC,KAAK,UAAU,IAAI,SAAS,OAAO,GAAG;AACzC,eAAK,UAAU,IAAI,SAAS,SAAS,CAAC,CAAC;AAAA,QACzC;AACA,aAAK,UAAU,IAAI,SAAS,OAAO,EAAG,KAAK,QAAQ;AACnD,aAAK,OAAO;AAAA,UACV,4BAA4B,SAAS,OAAO,kBAAkB,OAAO,IAAI;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAEA,SAAK,OAAO,MAAM,kBAAkB,OAAO,IAAI,MAAM,OAAO,OAAO,EAAE;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAuB;AACrB,WAAO,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAA+C;AACxD,WAAO,KAAK,SAAS,IAAI,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAqC;AACnC,WAAO,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAA4C;AAClD,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,WAA+B;AAC7B,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAiD;AAC5D,WAAO,KAAK,WAAW,IAAI,IAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAyC;AACvC,WAAO,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAiB,KAAsD;AACjF,UAAM,YAAY,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC;AAGlD,UAAM,UAAU,UAAU,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC;AAExD,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAGA,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAE9C,WAAO,QAAQ,CAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAiB,KAAmC;AAC1E,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,eAAe;AACxB,cAAM,OAAO,cAAc,SAAS,GAAG;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,SAAiB,KAAoB,QAAgC;AAC1F,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,cAAc;AACvB,cAAM,OAAO,aAAa,SAAS,KAAK,MAAuB;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,MAAc,KAAmC;AACpE,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,YAAY;AACrB,cAAM,OAAO,WAAW,MAAM,GAAG;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAc,KAAoB,QAAgC;AACpF,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,WAAW;AACpB,cAAM,OAAO,UAAU,MAAM,KAAK,MAAoB;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAe,SAAqD;AACtF,WAAO,KAAK,SAAS,OAAO,OAAO,OAAO;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAc;AAChC,WAAO,KAAK,SAAS,QAAQ,IAAI;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB;AACzB,WAAO,KAAK,SAAS,YAAY;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,YAA6B;AACpC,WAAO,KAAK,QAAQ,IAAI,UAAU;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,YAAwC;AAChD,WAAO,KAAK,QAAQ,IAAI,UAAU;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,YAAmC;AACpD,UAAM,SAAS,KAAK,QAAQ,IAAI,UAAU;AAC1C,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAGA,QAAI,OAAO,kBAAkB;AAC3B,YAAM,WAAW,OAAO,iBAAiB;AACzC,iBAAW,OAAO,UAAU;AAC1B,aAAK,SAAS,OAAO,IAAI,IAAI;AAAA,MAC/B;AAAA,IACF;AAGA,QAAI,OAAO,eAAe;AACxB,YAAM,QAAQ,OAAO,cAAc;AACnC,iBAAW,QAAQ,OAAO;AACxB,aAAK,MAAM,OAAO,KAAK,IAAI;AAAA,MAC7B;AAAA,IACF;AAGA,QAAI,OAAO,oBAAoB;AAC7B,YAAM,aAAa,OAAO,mBAAmB;AAC7C,iBAAW,OAAO,YAAY;AAC5B,aAAK,WAAW,OAAO,IAAI,IAAI;AAAA,MACjC;AAAA,IACF;AAGA,QAAI,OAAO,mBAAmB;AAC5B,YAAM,YAAY,OAAO,kBAAkB;AAC3C,iBAAW,YAAY,WAAW;AAChC,cAAM,OAAO,KAAK,UAAU,IAAI,SAAS,OAAO;AAChD,YAAI,MAAM;AACR,gBAAM,QAAQ,KAAK,QAAQ,QAAQ;AACnC,cAAI,UAAU,IAAI;AAChB,iBAAK,OAAO,OAAO,CAAC;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,SAAK,QAAQ,OAAO,UAAU;AAC9B,SAAK,OAAO,MAAM,oBAAoB,UAAU,GAAG;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,WAAO;AAAA,MACL,UAAU,KAAK,SAAS;AAAA,MACxB,cAAc,KAAK,mBAAmB,SAAS;AAAA,MAC/C,YAAY,KAAK,WAAW;AAAA,MAC5B,SAAS,KAAK,QAAQ;AAAA,MACtB,WAAW,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,QAAQ,CAAC;AAAA,MACzF,OAAO,KAAK,MAAM;AAAA,MAClB,UAAU,KAAK,eAAe,SAAS;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA0C;AACxC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAkD;AAChD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoC;AAClC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,UAAgC;AACrD,SAAK,mBAAmB,SAAS,QAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAkF;AACtF,UAAM,UAAoE,CAAC;AAE3E,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,SAAS,QAAQ,OAAO,IAAI;AACpD,YAAI,QAAQ,KAAK,SAAS;AACxB,eAAK,eAAe,UAAU,OAAO,MAAM,KAAK,OAAO;AAEvD,cAAI,KAAK,eAAe,UAAU,OAAO,IAAI,GAAG;AAC9C,oBAAQ,KAAK;AAAA,cACX,SAAS,OAAO;AAAA,cAChB,QAAQ,KAAK;AAAA,cACb,MAAM,OAAO;AAAA,YACf,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AM3eA,SAAS,SAAS;AAMX,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,UAAU,EACP,OAAO;AAAA,IACN,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,IACnC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,CAAC,EACA,SAAS;AAAA,EAEZ,KAAK,EACF,OAAO;AAAA,IACN,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACvC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,CAAC,EACA,SAAS;AAAA,EAEZ,OAAO,EACJ,OAAO;AAAA,IACN,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,CAAC,EACA,SAAS;AAAA,EAEZ,OAAO,EACJ,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,QAAQ,MAAM;AAAA,IAC/B,YAAY,EAAE,OAAO,EAAE,QAAQ,cAAc;AAAA,IAC7C,UAAU,EAAE,OAAO,EAAE,QAAQ,YAAY;AAAA,IACzC,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK;AAAA,EAC/B,CAAC,EACA,SAAS;AAAA,EAEZ,SAAS,EACN,OAAO;AAAA,IACN,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,CAAC,EACA,SAAS;AAAA,EAEZ,SAAS,EAAE,OAAO;AAAA,IAChB,SAAS,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IAChC,UAAU,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,QAAQ,IAAI;AAAA,IAC3C,MAAM,EAAE,OAAO;AAAA,IACf,aAAa,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IACpC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,OAAO,MAAM,CAAC,EAAE,QAAQ,MAAM;AAAA,IAC9D,OAAO,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AAAA,IAClC,MAAM,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,EAAE,QAAQ,KAAK;AAAA,EAChD,CAAC;AAAA,EAED,SAAS,EACN,OAAO;AAAA,IACN,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAChC,MAAM,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAC9B,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACnC,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACpC,CAAC,EACA,SAAS;AACd,CAAC;;;AC5DD,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,SAAS,QAAAC,aAAY;AACrB,SAAS,SAAS,iBAAiB;;;AC8B5B,IAAM,mBAAoC;AAAA,EAC/C,aAAa;AAAA,EACb,SAAS;AAAA,EACT,gBAAgB;AAClB;AAKO,IAAM,iBAAgC;AAAA,EAC3C,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AACZ;AAKO,IAAM,mBAAoC;AAAA,EAC/C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ;AAKO,IAAM,kBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ;AAKO,IAAM,kBAAkC;AAAA,EAC7C,SAAS,CAAC;AACZ;;;AC5CO,IAAM,uBAAN,MAA2B;AAAA;AAAA;AAAA;AAAA,EAIhC,OAAO,aAAa,UAAiC,CAAC,GAAgB;AACpE,WAAO;AAAA,MACL,OAAO;AAAA,QACL,YAAY;AAAA,MACd;AAAA,MACA,SAAS,KAAK,mBAAmB,OAAO;AAAA,MACxC,OAAO,KAAK,iBAAiB;AAAA,MAC7B,SAAS,KAAK,mBAAmB,OAAO;AAAA,MACxC,SAAS,KAAK,mBAAmB;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB,UAAiC,CAAC,GAA2B;AACrF,WAAO;AAAA,MACL,MAAM,QAAQ,QAAQ;AAAA,MACtB,MAAM,QAAQ,QAAQ;AAAA,MACtB,OAAO,QAAQ,SAAS;AAAA,MACxB,UAAU,QAAQ,YAAY;AAAA,MAC9B,gBAAgB,QAAQ,kBAAkB,iBAAiB;AAAA,MAC3D,aAAa,QAAQ,eAAe,iBAAiB;AAAA,MACrD,SAAS,QAAQ,WAAW,iBAAiB;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,WAA0D;AAChF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB,UAAiC,CAAC,GAA2B;AACrF,UAAM,eAAe,QAAQ,UAAU,kBAAkB;AAEzD,WAAO;AAAA,MACL,GAAG;AAAA;AAAA,MAEH,WAAW,QAAQ,aAAa,OAAO,aAAa,YAAY;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB,SAA4C;AACpE,WAAO;AAAA,MACL,SAAS,WAAW,gBAAgB;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,qBAAsC;AAC3C,WAAO,EAAE,GAAG,iBAAiB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAkC;AACvC,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB,UAAU,OAAwB;AAC1D,WAAO,UAAU,EAAE,GAAG,gBAAgB,IAAI,EAAE,GAAG,iBAAiB;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,oBAAoC;AACzC,WAAO,EAAE,GAAG,gBAAgB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBACL,SACA,UAAiC,CAAC,GACrB;AACb,UAAM,WAAW,KAAK,aAAa,OAAO;AAE1C,WAAO;AAAA,MACL,OAAO,QAAQ,SAAS,SAAS;AAAA,MACjC,SAAS,EAAE,GAAG,SAAS,SAAS,GAAI,QAAQ,WAAW,CAAC,EAAG;AAAA,MAC3D,OAAO,EAAE,GAAG,SAAS,OAAO,GAAI,QAAQ,SAAS,CAAC,EAAG;AAAA,MACrD,SAAS,EAAE,GAAG,SAAS,SAAS,GAAI,QAAQ,WAAW,CAAC,EAAG;AAAA,MAC3D,SAAS,EAAE,GAAG,SAAS,SAAS,GAAI,QAAQ,WAAW,CAAC,EAAG;AAAA,IAC7D;AAAA,EACF;AACF;;;AFhIO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EAER,YAAY,MAAc,QAAQ,IAAI,GAAG;AACvC,SAAK,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,YAAkD;AAC3D,UAAM,aAAa,aAAaC,MAAK,KAAK,KAAK,UAAU,IAAI,KAAK,eAAe;AAEjF,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,UAAI;AAEJ,UAAI,WAAW,SAAS,OAAO,GAAG;AAChC,oBAAY,UAAU,OAAO;AAAA,MAC/B,WAAW,WAAW,SAAS,OAAO,GAAG;AACvC,oBAAY,KAAK,MAAM,OAAO;AAAA,MAChC,OAAO;AACL,cAAM,IAAI,MAAM,8BAA8B,UAAU,EAAE;AAAA,MAC5D;AAGA,YAAM,SAAS,kBAAkB,MAAM,SAAS;AAChD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI;AAAA,QACR,8BAA8B,UAAU,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MACvG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4C;AAChD,UAAM,kBAAkBD,MAAK,KAAK,KAAK,cAAc;AAGrD,QAAI,CAACE,YAAW,eAAe,GAAG;AAChC,YAAM,cAAc,KAAK,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;AACjD,aAAO,qBAAqB,aAAa;AAAA,QACvC,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,cAAc,KAAK,MAAMD,cAAa,iBAAiB,OAAO,CAAC;AACrE,UAAM,OAAO,EAAE,GAAG,YAAY,cAAc,GAAG,YAAY,gBAAgB;AAG3E,QAAI,QAA6B;AACjC,QAAI,KAAK,OAAO;AACd,cAAQ;AAAA,IACV;AAGA,UAAM,WAAWC,YAAWF,MAAK,KAAK,KAAK,eAAe,CAAC,IAAI,OAAO;AAGtE,QAAI,iBAA0C;AAC9C,QAAIE,YAAWF,MAAK,KAAK,KAAK,gBAAgB,CAAC,GAAG;AAChD,uBAAiB;AAAA,IACnB,WAAWE,YAAWF,MAAK,KAAK,KAAK,WAAW,CAAC,GAAG;AAClD,uBAAiB;AAAA,IACnB,WAAWE,YAAWF,MAAK,KAAK,KAAK,mBAAmB,CAAC,GAAG;AAC1D,uBAAiB;AAAA,IACnB;AAGA,UAAM,SAAS,qBAAqB,aAAa;AAAA,MAC/C;AAAA,MACA,MAAM,YAAY,QAAQ;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAGD,WAAO,UAAU;AAAA,MACf,GAAG,OAAO;AAAA,MACV,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,WAAW,aAAa;AAAA,MACxB,UAAU,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,KAAK;AAAA,IACpC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAgC;AACtC,UAAM,aAAa,CAAC,qBAAqB,mBAAmB;AAE5D,eAAW,aAAa,YAAY;AAClC,YAAM,OAAOA,MAAK,KAAK,KAAK,SAAS;AACrC,UAAIE,YAAW,IAAI,GAAG;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AGvHA,OAAOC,YAAW;;;ACAlB,OAAO,WAAW;AAMX,IAAM,SAAS;AAAA,EACpB,MAAM,MAAM;AAAA,EACZ,SAAS,MAAM,IAAI,SAAS;AAAA;AAAA,EAE5B,MAAM,MAAM,IAAI,SAAS;AAAA,EACzB,KAAK,MAAM;AAAA,EACX,OAAO,MAAM,IAAI,SAAS;AAAA;AAAA,EAC1B,MAAM,MAAM,IAAI,SAAS;AAAA;AAAA,EAEzB,SAAS,MAAM,IAAI,SAAS;AAAA;AAAA;AAAA,EAE5B,MAAM,MAAM,IAAI,SAAS,EAAE;AAAA;AAAA,EAE3B,OAAO,MAAM,IAAI,SAAS;AAAA;AAAA,EAE1B,QAAQ,MAAM,IAAI,SAAS;AAAA;AAAA;AAAA,EAE3B,SAAS,MAAM,IAAI,SAAS;AAAA;AAAA,EAC5B,WAAW,MAAM,IAAI,SAAS;AAAA;AAAA;AAAA,EAE9B,QAAQ,MAAM,IAAI,SAAS;AAAA;AAAA;AAAA,EAG3B,SAAS,MAAM,IAAI,SAAS;AAAA;AAAA,EAC5B,SAAS,MAAM,IAAI,SAAS;AAAA;AAC9B;AAsBO,IAAM,UAAU;AAAA,EACrB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AACX;;;ADzDO,IAAM,gBAAN,MAAsC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACE,UAKI,CAAC,GACL;AACA,SAAK,WAAW,CAAC,QAAQ;AACzB,SAAK,YAAY,QAAQ,WAAW;AACpC,SAAK,UAAU,QAAQ,SAAS;AAChC,SAAK,UAAU,QAAQ,QAAQ;AAAA,EACjC;AAAA,EAEA,KAAK,SAAuB;AAC1B,QAAI,KAAK,SAAS;AAChB;AAAA,IACF;AACA,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,QAAQ,QAAQ,CAAC,CAAC;AACtD;AAAA,IACF;AACA,YAAQ,IAAI,KAAK,WAAW,OAAO,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO;AAAA,EACtE;AAAA,EAEA,QAAQ,SAAuB;AAC7B,QAAI,KAAK,SAAS;AAChB;AAAA,IACF;AACA,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,WAAW,QAAQ,CAAC,CAAC;AACzD;AAAA,IACF;AACA,YAAQ,IAAI,KAAK,WAAW,OAAO,QAAQ,QAAQ,OAAO,IAAI,QAAQ,SAAS,OAAO;AAAA,EACxF;AAAA,EAEA,KAAK,SAAuB;AAC1B,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,WAAW,QAAQ,CAAC,CAAC;AACzD;AAAA,IACF;AACA,YAAQ,KAAK,KAAK,WAAW,OAAO,QAAQ,QAAQ,OAAO,IAAI,QAAQ,SAAS,OAAO;AAAA,EACzF;AAAA,EAEA,MAAM,SAAiB,OAAqB;AAC1C,QAAI,KAAK,SAAS;AAChB,cAAQ;AAAA,QACN,KAAK,UAAU;AAAA,UACb,OAAO,OAAO;AAAA,UACd,OAAO;AAAA,UACP;AAAA,UACA,OAAO,OAAO;AAAA,QAChB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,YAAQ,MAAM,KAAK,WAAW,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,OAAO,OAAO;AAClF,QAAI,SAAS,KAAK,WAAW;AAC3B,cAAQ,MAAMC,OAAM,KAAK,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,SAAuB;AAC3B,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AACA,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,SAAS,QAAQ,CAAC,CAAC;AACvD;AAAA,IACF;AACA,YAAQ,IAAI,KAAK,WAAW,OAAO,MAAM,QAAQ,OAAO,IAAI,QAAQ,SAAS,OAAO;AAAA,EACtF;AAAA,EAEA,KAAK,SAAuB;AAC1B,QAAI,KAAK,SAAS;AAChB;AAAA,IACF;AACA,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,QAAQ,QAAQ,CAAC,CAAC;AACtD;AAAA,IACF;AACA,YAAQ,IAAI,KAAK,WAAW,OAAO,QAAQ,QAAQ,IAAI,IAAI,QAAQ,MAAM,OAAO;AAAA,EAClF;AAAA,EAEA,KAAK,MAAiB;AACpB,YAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,EAC3C;AACF;;;AEnGA,SAAS,aAAa;AAIf,IAAM,oBAAN,MAA8C;AAAA,EAC3C,QAAgD,oBAAI,IAAI;AAAA,EACxD;AAAA,EAER,YAAY,QAAgB;AAC1B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,aAAa,MAAc,MAAuC;AAChE,SAAK,MAAM,IAAI,MAAM,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,IAAI,SAAiB,OAAiB,CAAC,GAAG,UAAsB,CAAC,GAAwB;AAC7F,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AAEvC,QAAI;AACF,UAAI,CAAC,QAAQ,QAAQ;AACnB,aAAK,OAAO,MAAM,YAAY,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE;AAAA,MAC3D;AAEA,YAAM,SAAS,MAAM,MAAM,SAAS,MAAM;AAAA,QACxC,KAAK;AAAA,QACL;AAAA,QACA,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,IAAI;AAAA,QACtC,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,UAAI,OAAO,aAAa,GAAG;AACzB,eAAO;AAAA,UACL;AAAA,UACA,UAAU,OAAO;AAAA,UACjB,QAAQ,QAAQ,gBAAgB,OAAO,MAAM;AAAA,UAC7C,QAAQ;AAAA,QACV;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,SAAS,iCAAiC,OAAO,QAAQ;AAAA,QACzD,QAAQ,OAAO;AAAA,QACf,QAAQ;AAAA,MACV;AAAA,IACF,SAAS,OAAO;AACd,YAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAO;AAAA,QACL;AAAA,QACA,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,UAAuC;AACnD,UAAM,OAAO,KAAK,MAAM,IAAI,QAAQ;AACpC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,QACL,SAAS,SAAS,QAAQ;AAAA,QAC1B,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,WAAO,MAAM,KAAK;AAAA,EACpB;AACF;","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)
|