@famgia/omnify-cli 0.0.166 → 0.0.167

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -2308,7 +2308,7 @@ async function runReset(options) {
2308
2308
  if (existsSync9(pkgGenerated) && !paths.some((p) => p.path === pkgGenerated)) {
2309
2309
  paths.push({ name: `${pkgName} Legacy Generated`, path: pkgGenerated, type: "dir" });
2310
2310
  }
2311
- const pkgMigrations = join2(pkgBase, pkgOutput.migrationsPath ?? "database/migrations");
2311
+ const pkgMigrations = join2(pkgBase, pkgOutput.migrationsPath ?? "database/migrations/omnify");
2312
2312
  if (existsSync9(pkgMigrations) && !paths.some((p) => p.path === pkgMigrations)) {
2313
2313
  paths.push({
2314
2314
  name: `${pkgName} migrations`,
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/output/logger.ts","../src/config/alias-config.ts","../src/commands/validate.ts","../src/config/loader.ts","../src/config/discovery.ts","../src/commands/diff.ts","../src/operations/diff.ts","../src/commands/generate.ts","../src/guides/index.ts","../src/commands/reset.ts","../src/commands/create-project.ts","../src/commands/deploy.ts","../src/commands/verify.ts"],"sourcesContent":["/**\n * @famgia/omnify-cli - CLI Runner\n * This file contains the actual CLI execution logic.\n * Import this file to run the CLI (has side effects).\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n registerInitCommand,\n registerValidateCommand,\n registerDiffCommand,\n registerGenerateCommand,\n registerResetCommand,\n registerCreateProjectCommand,\n registerDeployCommand,\n registerVerifyCommand,\n runInit,\n} from './commands/index.js';\nimport { logger } from './output/logger.js';\n\n/**\n * CLI version (from package.json)\n */\nconst VERSION = '0.0.5';\n\n/**\n * Main CLI program.\n */\nconst program = new Command();\n\nprogram\n .name('omnify')\n .description('Schema-first database migrations for Laravel and TypeScript')\n .version(VERSION);\n\n// Register commands\nregisterInitCommand(program);\nregisterValidateCommand(program);\nregisterDiffCommand(program);\nregisterGenerateCommand(program);\nregisterResetCommand(program);\nregisterCreateProjectCommand(program);\nregisterDeployCommand(program);\nregisterVerifyCommand(program);\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else {\n logger.error(error.message);\n process.exit(1);\n }\n});\n\nprocess.on('unhandledRejection', (reason) => {\n if (reason instanceof OmnifyError) {\n logger.formatError(reason);\n process.exit(logger.getExitCode(reason));\n } else if (reason instanceof Error) {\n logger.error(reason.message);\n } else {\n logger.error(String(reason));\n }\n process.exit(1);\n});\n\n// Check if we should auto-run init\nconst args = process.argv.slice(2);\nconst firstArg = args[0];\nconst hasCommand = firstArg !== undefined && !firstArg.startsWith('-');\nconst configPath = resolve(process.cwd(), 'omnify.config.ts');\nconst hasConfig = existsSync(configPath);\n\nif (!hasCommand && !hasConfig) {\n // No command specified and no config exists → run init\n runInit({}).catch((error) => {\n if (error instanceof Error) {\n if (error.message.includes('User force closed')) {\n logger.newline();\n logger.info('Setup cancelled.');\n process.exit(0);\n }\n logger.error(error.message);\n }\n process.exit(1);\n });\n} else {\n // Parse CLI arguments normally\n program.parse();\n}\n","/**\n * @famgia/omnify-cli - Init Command\n *\n * Initializes a new omnify project with interactive configuration.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { select, confirm, input } from '@inquirer/prompts';\nimport { logger } from '../output/logger.js';\nimport { configureOmnifyAlias } from '../config/alias-config.js';\n\n/**\n * Migration tool options.\n */\ntype MigrationTool = 'laravel' | 'prisma' | 'drizzle' | 'none';\n\n/**\n * Project configuration from prompts.\n */\ninterface ProjectConfig {\n database: 'mysql' | 'postgres' | 'sqlite';\n migrationTool: MigrationTool;\n generateTypes: boolean;\n migrationsPath: string;\n typesPath: string;\n schemasDir: string;\n}\n\n/**\n * Example schema file content.\n */\nconst EXAMPLE_SCHEMA = `# Example User schema\n# See https://github.com/famgia/omnify for documentation\n\nname: User\ndisplayName: User Account\nkind: object\n\nproperties:\n email:\n type: Email\n unique: true\n displayName: Email Address\n\n name:\n type: String\n displayName: Full Name\n\n bio:\n type: Text\n nullable: true\n displayName: Biography\n\noptions:\n timestamps: true\n softDelete: true\n`;\n\n/**\n * Generates config file content based on project configuration.\n */\nfunction generateConfig(config: ProjectConfig): string {\n const imports: string[] = [`import { defineConfig } from '@famgia/omnify';`];\n const plugins: string[] = [];\n\n // Add Laravel plugin\n if (config.migrationTool === 'laravel') {\n imports.push(`import laravel from '@famgia/omnify-laravel/plugin';`);\n plugins.push(` laravel({\n migrationsPath: '${config.migrationsPath}',\n typesPath: '${config.typesPath}',\n singleFile: true,\n generateMigrations: true,\n generateTypes: ${config.generateTypes},\n }),`);\n }\n\n // Prisma plugin (coming soon)\n if (config.migrationTool === 'prisma') {\n plugins.push(` // Prisma plugin coming soon!\n // prisma({ schemaPath: 'prisma/schema.prisma' }),`);\n }\n\n // Drizzle plugin (coming soon)\n if (config.migrationTool === 'drizzle') {\n plugins.push(` // Drizzle plugin coming soon!\n // drizzle({ schemaPath: 'src/db/schema.ts' }),`);\n }\n\n // TypeScript-only (no migration tool)\n if (config.migrationTool === 'none' && config.generateTypes) {\n imports.push(`import laravel from '@famgia/omnify-laravel/plugin';`);\n plugins.push(` laravel({\n typesPath: '${config.typesPath}',\n generateMigrations: false,\n generateTypes: true,\n }),`);\n }\n\n // Database URL examples\n const dbUrlExamples: Record<string, string> = {\n mysql: 'mysql://root:password@localhost:3306/omnify_dev',\n postgres: 'postgres://postgres:password@localhost:5432/omnify_dev',\n sqlite: 'sqlite://./omnify_dev.db',\n };\n\n return `${imports.join('\\n')}\n\nexport default defineConfig({\n // Schema files location\n schemasDir: '${config.schemasDir}',\n\n // Lock file for tracking schema changes\n lockFilePath: './omnify.lock',\n\n // Database configuration\n database: {\n driver: '${config.database}',\n // REQUIRED: Set your development database URL\n // devUrl: '${dbUrlExamples[config.database]}',\n },\n\n // Generator plugins\n plugins: [\n${plugins.join('\\n\\n')}\n ],\n});\n`;\n}\n\n/**\n * Init command options.\n */\ninterface InitOptions {\n force?: boolean;\n yes?: boolean;\n}\n\n/**\n * Runs the init command with interactive prompts.\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n logger.header('Omnify Project Setup');\n logger.newline();\n\n // Check if config already exists\n const configPath = resolve(cwd, 'omnify.config.ts');\n if (existsSync(configPath) && !options.force) {\n logger.warn('omnify.config.ts already exists. Use --force to overwrite.');\n return;\n }\n\n let config: ProjectConfig;\n\n if (options.yes) {\n // Use defaults (Laravel)\n config = {\n database: 'mysql',\n migrationTool: 'laravel',\n generateTypes: true,\n migrationsPath: 'database/migrations',\n typesPath: 'resources/js/types',\n schemasDir: './schemas',\n };\n logger.info('Using default configuration...');\n } else {\n // Interactive prompts\n logger.info('Answer a few questions to configure your project:\\n');\n\n // 1. Database selection\n const database = await select({\n message: 'Which database?',\n choices: [\n { name: 'MySQL / MariaDB', value: 'mysql' as const },\n { name: 'PostgreSQL', value: 'postgres' as const },\n { name: 'SQLite', value: 'sqlite' as const },\n ],\n default: 'mysql',\n });\n\n // 2. Migration tool selection\n const migrationTool = await select({\n message: 'Which migration tool?',\n choices: [\n { name: 'Laravel (PHP)', value: 'laravel' as const },\n { name: 'Prisma (coming soon)', value: 'prisma' as const, disabled: true },\n { name: 'Drizzle (coming soon)', value: 'drizzle' as const, disabled: true },\n { name: 'None (types only)', value: 'none' as const },\n ],\n default: 'laravel',\n });\n\n // 3. TypeScript types\n const generateTypes = await confirm({\n message: 'Generate TypeScript types?',\n default: true,\n });\n\n // Default paths based on migration tool\n const defaultPaths: Record<MigrationTool, { migrations: string; types: string }> = {\n laravel: { migrations: 'database/migrations', types: 'resources/js/types' },\n prisma: { migrations: 'prisma/migrations', types: 'src/types' },\n drizzle: { migrations: 'drizzle', types: 'src/types' },\n none: { migrations: '', types: 'types' },\n };\n\n const defaults = defaultPaths[migrationTool];\n let migrationsPath = defaults.migrations;\n let typesPath = defaults.types;\n\n if (migrationTool !== 'none') {\n migrationsPath = await input({\n message: 'Migrations output path:',\n default: defaults.migrations,\n });\n }\n\n if (generateTypes) {\n typesPath = await input({\n message: 'TypeScript types path:',\n default: defaults.types,\n });\n }\n\n // Schemas directory\n const schemasDir = await input({\n message: 'Schemas directory:',\n default: './schemas',\n });\n\n config = {\n database,\n migrationTool,\n generateTypes,\n migrationsPath,\n typesPath,\n schemasDir,\n };\n }\n\n logger.newline();\n logger.step('Creating project files...');\n\n // Create schemas directory\n const schemasDir = resolve(cwd, config.schemasDir);\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.debug(`Created ${config.schemasDir}/ directory`);\n }\n\n // Create example schema\n const examplePath = resolve(schemasDir, 'User.yaml');\n if (!existsSync(examplePath) || options.force) {\n writeFileSync(examplePath, EXAMPLE_SCHEMA);\n logger.debug('Created example schema: User.yaml');\n }\n\n // Create config file\n const configContent = generateConfig(config);\n writeFileSync(configPath, configContent);\n logger.debug('Created omnify.config.ts');\n\n // Auto-configure @omnify alias in vite.config and tsconfig.json\n if (config.generateTypes) {\n logger.step('Configuring @omnify path alias...');\n const aliasResult = configureOmnifyAlias(cwd, 'omnify', false);\n if (!aliasResult.viteUpdated && !aliasResult.tsconfigUpdated) {\n if (!aliasResult.viteSkipped) {\n logger.info('Note: vite.config not found - you may need to configure @omnify alias manually');\n }\n if (!aliasResult.tsconfigSkipped) {\n logger.info('Note: tsconfig.json not found - you may need to configure @omnify/* path manually');\n }\n }\n }\n\n logger.newline();\n logger.success('Project initialized!');\n logger.newline();\n\n // Summary\n const toolName =\n config.migrationTool === 'laravel'\n ? 'Laravel'\n : config.migrationTool === 'prisma'\n ? 'Prisma'\n : config.migrationTool === 'drizzle'\n ? 'Drizzle'\n : 'None';\n\n logger.info('Configuration:');\n logger.list([\n `Database: ${config.database}`,\n `Migration tool: ${toolName}`,\n `TypeScript types: ${config.generateTypes ? 'Yes' : 'No'}`,\n ]);\n\n logger.newline();\n logger.info('Files created:');\n logger.list(['omnify.config.ts', `${config.schemasDir}/User.yaml`]);\n\n logger.newline();\n logger.info('Next steps:');\n logger.newline();\n\n logger.step('1. Set database URL in omnify.config.ts');\n logger.newline();\n\n logger.step('2. Define schemas in ' + config.schemasDir + '/');\n logger.newline();\n\n logger.step('3. Generate:');\n logger.info(' npx omnify validate');\n logger.info(' npx omnify generate');\n logger.newline();\n}\n\n/**\n * Registers the init command.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize a new omnify project')\n .option('-f, --force', 'Overwrite existing files')\n .option('-y, --yes', 'Use default configuration (skip prompts)')\n .action(async (options: InitOptions) => {\n try {\n await runInit(options);\n } catch (error) {\n if (error instanceof Error) {\n // Handle Ctrl+C gracefully\n if (error.message.includes('User force closed')) {\n logger.newline();\n logger.info('Setup cancelled.');\n process.exit(0);\n }\n logger.error(error.message);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Logger\n *\n * CLI output and logging utilities.\n */\n\nimport pc from 'picocolors';\nimport { OmnifyError, formatError, getExitCode } from '@famgia/omnify-core';\n\n/**\n * Logger options.\n */\nexport interface LoggerOptions {\n /** Enable verbose logging */\n verbose?: boolean;\n /** Suppress all output except errors */\n quiet?: boolean;\n}\n\n/**\n * CLI Logger for formatted output.\n */\nexport class Logger {\n private _verbose: boolean;\n private _quiet: boolean;\n private _startTime: number;\n\n constructor(options: LoggerOptions = {}) {\n this._verbose = options.verbose ?? false;\n this._quiet = options.quiet ?? false;\n this._startTime = Date.now();\n }\n\n /**\n * Enable or disable verbose mode.\n */\n setVerbose(verbose: boolean): void {\n this._verbose = verbose;\n }\n\n /**\n * Enable or disable quiet mode.\n */\n setQuiet(quiet: boolean): void {\n this._quiet = quiet;\n }\n\n /**\n * Log an info message.\n */\n info(message: string): void {\n if (!this._quiet) {\n console.log(message);\n }\n }\n\n /**\n * Log a success message.\n */\n success(message: string): void {\n if (!this._quiet) {\n console.log(pc.green('✓') + ' ' + message);\n }\n }\n\n /**\n * Log a warning message.\n */\n warn(message: string): void {\n if (!this._quiet) {\n console.log(pc.yellow('⚠') + ' ' + pc.yellow(message));\n }\n }\n\n /**\n * Log an error message.\n */\n error(message: string): void {\n console.error(pc.red('✗') + ' ' + pc.red(message));\n }\n\n /**\n * Log a debug message (only in verbose mode).\n */\n debug(message: string): void {\n if (this._verbose && !this._quiet) {\n console.log(pc.dim(' ' + message));\n }\n }\n\n /**\n * Log a step message.\n */\n step(message: string): void {\n if (!this._quiet) {\n console.log(pc.cyan('→') + ' ' + message);\n }\n }\n\n /**\n * Log a header.\n */\n header(message: string): void {\n if (!this._quiet) {\n console.log();\n console.log(pc.bold(message));\n console.log();\n }\n }\n\n /**\n * Log a list item.\n */\n list(items: string[]): void {\n if (!this._quiet) {\n for (const item of items) {\n console.log(' • ' + item);\n }\n }\n }\n\n /**\n * Log a timing message.\n */\n timing(message: string): void {\n if (this._verbose && !this._quiet) {\n const elapsed = Date.now() - this._startTime;\n console.log(pc.dim(` [${elapsed}ms] ${message}`));\n }\n }\n\n /**\n * Log an empty line.\n */\n newline(): void {\n if (!this._quiet) {\n console.log();\n }\n }\n\n /**\n * Format and log an OmnifyError.\n */\n formatError(error: OmnifyError): void {\n const formatted = formatError(error, { color: true });\n console.error(formatted);\n }\n\n /**\n * Get exit code for an error.\n */\n getExitCode(error: OmnifyError): number {\n return getExitCode(error);\n }\n}\n\n/**\n * Global logger instance.\n */\nexport const logger = new Logger();\n","/**\n * @famgia/omnify-cli - Alias Configuration Utilities\n *\n * Auto-configures @omnify alias in vite.config.ts and tsconfig.json\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { logger } from '../output/logger.js';\n\n/**\n * Result of alias configuration\n */\nexport interface AliasConfigResult {\n viteUpdated: boolean;\n tsconfigUpdated: boolean;\n viteSkipped: boolean;\n tsconfigSkipped: boolean;\n errors: string[];\n}\n\n/**\n * Check if vite.config.ts already has @omnify alias configured\n */\nfunction hasViteOmnifyAlias(content: string): boolean {\n // Check for various patterns of @omnify alias\n return (\n content.includes(\"'@omnify'\") ||\n content.includes('\"@omnify\"') ||\n content.includes('@omnify:') ||\n content.includes(\"'@omnify/\")\n );\n}\n\n/**\n * Check if vite.config.ts already has @omnify-base alias configured\n */\nfunction hasViteOmnifyBaseAlias(content: string): boolean {\n return (\n content.includes(\"'@omnify-base'\") ||\n content.includes('\"@omnify-base\"') ||\n content.includes('@omnify-base/')\n );\n}\n\n/**\n * Check if tsconfig.json already has @omnify path configured\n */\nfunction hasTsconfigOmnifyPath(content: string): boolean {\n return (\n content.includes('\"@omnify/*\"') ||\n content.includes(\"'@omnify/*'\") ||\n content.includes('\"@omnify/\"')\n );\n}\n\n/**\n * Update vite.config.ts to add @omnify alias\n *\n * @param rootDir - Project root directory\n * @param omnifyPath - Path to omnify folder (default: 'omnify')\n * @returns true if updated, false if skipped or failed\n */\nexport function updateViteConfig(\n rootDir: string,\n omnifyPath: string = 'omnify'\n): { updated: boolean; skipped: boolean; error?: string } {\n const configPaths = [\n resolve(rootDir, 'vite.config.ts'),\n resolve(rootDir, 'vite.config.js'),\n resolve(rootDir, 'vite.config.mts'),\n resolve(rootDir, 'vite.config.mjs'),\n ];\n\n // Find existing vite config\n const configPath = configPaths.find((p) => existsSync(p));\n\n if (!configPath) {\n return { updated: false, skipped: true };\n }\n\n try {\n let content = readFileSync(configPath, 'utf-8');\n\n // Check if already configured\n if (hasViteOmnifyAlias(content)) {\n return { updated: false, skipped: true };\n }\n\n // Check if there's an existing alias section\n const aliasPatterns = [\n // Pattern 1: resolve: { alias: { ... } }\n /resolve\\s*:\\s*\\{[^}]*alias\\s*:\\s*\\{/,\n // Pattern 2: alias: { ... } directly in defineConfig\n /alias\\s*:\\s*\\{/,\n ];\n\n let updated = false;\n\n for (const pattern of aliasPatterns) {\n const match = content.match(pattern);\n if (match) {\n // Insert @omnify alias after opening brace of alias object\n const insertPoint = match.index! + match[0].length;\n const aliasLine = `\\n '@omnify': path.resolve(__dirname, '${omnifyPath}'),`;\n content = content.slice(0, insertPoint) + aliasLine + content.slice(insertPoint);\n updated = true;\n break;\n }\n }\n\n // If no alias section found, try to add one in resolve section\n if (!updated) {\n const resolvePattern = /resolve\\s*:\\s*\\{/;\n const resolveMatch = content.match(resolvePattern);\n\n if (resolveMatch) {\n const insertPoint = resolveMatch.index! + resolveMatch[0].length;\n const aliasSection = `\n alias: {\n '@omnify': path.resolve(__dirname, '${omnifyPath}'),\n },`;\n content = content.slice(0, insertPoint) + aliasSection + content.slice(insertPoint);\n updated = true;\n }\n }\n\n // If still not updated, try to add resolve section to defineConfig\n if (!updated) {\n // Look for defineConfig({\n const defineConfigPattern = /defineConfig\\s*\\(\\s*\\{/;\n const defineConfigMatch = content.match(defineConfigPattern);\n\n if (defineConfigMatch) {\n const insertPoint = defineConfigMatch.index! + defineConfigMatch[0].length;\n const resolveSection = `\n resolve: {\n alias: {\n '@omnify': path.resolve(__dirname, '${omnifyPath}'),\n },\n },`;\n content = content.slice(0, insertPoint) + resolveSection + content.slice(insertPoint);\n\n // Add path import if not present\n if (!content.includes(\"import path from\") && !content.includes(\"import * as path\")) {\n content = `import path from 'path';\\n` + content;\n }\n updated = true;\n }\n }\n\n if (updated) {\n // Ensure path import exists\n if (!content.includes(\"import path from\") && !content.includes(\"import * as path\") && !content.includes(\"require('path')\")) {\n // Add at the top after other imports\n const importMatch = content.match(/^(import .+;\\n)+/m);\n if (importMatch) {\n const insertPoint = importMatch.index! + importMatch[0].length;\n content = content.slice(0, insertPoint) + \"import path from 'path';\\n\" + content.slice(insertPoint);\n } else {\n content = \"import path from 'path';\\n\" + content;\n }\n }\n\n writeFileSync(configPath, content);\n return { updated: true, skipped: false };\n }\n\n return {\n updated: false,\n skipped: false,\n error: 'Could not find suitable location to add alias. Please add manually.',\n };\n } catch (error) {\n return {\n updated: false,\n skipped: false,\n error: `Failed to update vite.config: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Update tsconfig.json to add @omnify path\n *\n * @param rootDir - Project root directory\n * @param omnifyPath - Path to omnify folder (default: 'omnify')\n * @returns true if updated, false if skipped or failed\n */\nexport function updateTsconfig(\n rootDir: string,\n omnifyPath: string = 'omnify'\n): { updated: boolean; skipped: boolean; error?: string } {\n const configPath = resolve(rootDir, 'tsconfig.json');\n\n if (!existsSync(configPath)) {\n return { updated: false, skipped: true };\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n\n // Check if already configured\n if (hasTsconfigOmnifyPath(content)) {\n return { updated: false, skipped: true };\n }\n\n // Parse JSON (with comment removal for safety)\n const jsonContent = content\n .replace(/\\/\\/.*$/gm, '') // Remove single-line comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, ''); // Remove multi-line comments\n\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(jsonContent);\n } catch {\n return {\n updated: false,\n skipped: false,\n error: 'Could not parse tsconfig.json as JSON',\n };\n }\n\n // Ensure compilerOptions exists\n if (!config.compilerOptions) {\n config.compilerOptions = {};\n }\n\n const compilerOptions = config.compilerOptions as Record<string, unknown>;\n\n // Ensure paths exists\n if (!compilerOptions.paths) {\n compilerOptions.paths = {};\n }\n\n const paths = compilerOptions.paths as Record<string, string[]>;\n\n // Add @omnify path\n paths['@omnify/*'] = [`./${omnifyPath}/*`];\n\n // Write back with proper formatting\n // We need to preserve the original formatting as much as possible\n // Simple approach: use 2-space indent\n const newContent = JSON.stringify(config, null, 2);\n\n writeFileSync(configPath, newContent + '\\n');\n return { updated: true, skipped: false };\n } catch (error) {\n return {\n updated: false,\n skipped: false,\n error: `Failed to update tsconfig.json: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Configure @omnify alias in both vite.config and tsconfig.json\n *\n * @param rootDir - Project root directory\n * @param omnifyPath - Path to omnify folder (default: 'omnify')\n * @param silent - Don't log messages (for use in generate command)\n */\nexport function configureOmnifyAlias(\n rootDir: string,\n omnifyPath: string = 'omnify',\n silent: boolean = false\n): AliasConfigResult {\n const result: AliasConfigResult = {\n viteUpdated: false,\n tsconfigUpdated: false,\n viteSkipped: false,\n tsconfigSkipped: false,\n errors: [],\n };\n\n // Update vite.config\n const viteResult = updateViteConfig(rootDir, omnifyPath);\n result.viteUpdated = viteResult.updated;\n result.viteSkipped = viteResult.skipped;\n if (viteResult.error) {\n result.errors.push(viteResult.error);\n }\n\n // Update tsconfig.json\n const tsconfigResult = updateTsconfig(rootDir, omnifyPath);\n result.tsconfigUpdated = tsconfigResult.updated;\n result.tsconfigSkipped = tsconfigResult.skipped;\n if (tsconfigResult.error) {\n result.errors.push(tsconfigResult.error);\n }\n\n // Log results\n if (!silent) {\n if (result.viteUpdated) {\n logger.success('Updated vite.config - Added @omnify alias');\n }\n if (result.tsconfigUpdated) {\n logger.success('Updated tsconfig.json - Added @omnify/* path');\n }\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n logger.warn(error);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Add @omnify-base alias to vite.config for plugin enum imports.\n * This is needed because plugin enums are stored in node_modules/@omnify-base\n */\nexport function addPluginEnumAlias(rootDir: string): { updated: boolean; error?: string } {\n const configPaths = [\n resolve(rootDir, 'vite.config.ts'),\n resolve(rootDir, 'vite.config.js'),\n resolve(rootDir, 'vite.config.mts'),\n resolve(rootDir, 'vite.config.mjs'),\n ];\n\n const configPath = configPaths.find((p) => existsSync(p));\n if (!configPath) {\n return { updated: false };\n }\n\n try {\n let content = readFileSync(configPath, 'utf-8');\n\n // Check if already configured\n if (hasViteOmnifyBaseAlias(content)) {\n return { updated: false };\n }\n\n // Find the line with @omnify alias that ends with ), and add new alias after it\n // Match pattern: '@omnify': ... ), (handles single and multi-line definitions)\n const lines = content.split('\\n');\n let insertIndex = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Look for line containing @omnify alias\n if ((line.includes(\"'@omnify'\") || line.includes('\"@omnify\"')) && line.includes(':')) {\n // Find the line where this alias definition ends (with ),)\n for (let j = i; j < lines.length; j++) {\n if (lines[j].includes('),') || (lines[j].trim().endsWith(',') && lines[j].includes(')'))) {\n insertIndex = j + 1;\n break;\n }\n }\n break;\n }\n }\n\n if (insertIndex > 0) {\n const indent = ' '; // Match typical Vite config indentation\n const aliasLine = `${indent}'@omnify-base': path.resolve(__dirname, 'node_modules/@omnify-base'),`;\n lines.splice(insertIndex, 0, aliasLine);\n content = lines.join('\\n');\n writeFileSync(configPath, content);\n return { updated: true };\n }\n\n return { updated: false, error: 'Could not find @omnify alias to add @omnify-base after' };\n } catch (error) {\n return {\n updated: false,\n error: `Failed to add plugin enum alias: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Add @omnify-base path to tsconfig.json for plugin enum imports.\n */\nexport function addPluginEnumTsconfigPath(rootDir: string): { updated: boolean; error?: string } {\n const configPath = resolve(rootDir, 'tsconfig.json');\n if (!existsSync(configPath)) {\n return { updated: false };\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n\n // Check if already has @omnify-base path\n if (content.includes('@omnify-base')) {\n return { updated: false };\n }\n\n // Parse JSON with comments\n const jsonContent = content.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/g, '');\n const config = JSON.parse(jsonContent);\n\n if (!config.compilerOptions) {\n config.compilerOptions = {};\n }\n if (!config.compilerOptions.paths) {\n config.compilerOptions.paths = {};\n }\n\n config.compilerOptions.paths['@omnify-base/*'] = ['./node_modules/@omnify-base/*'];\n\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n return { updated: true };\n } catch (error) {\n return {\n updated: false,\n error: `Failed to add plugin enum tsconfig path: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n","/**\n * @famgia/omnify-cli - Validate Command\n *\n * Validates schema files for syntax and semantic errors.\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, mergePartialSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Validate command options.\n */\ninterface ValidateOptions {\n verbose?: boolean;\n}\n\n/**\n * Runs the validate command.\n */\nexport async function runValidate(options: ValidateOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Validating Schemas');\n\n // Load configuration\n logger.debug('Loading configuration...');\n logger.timing('Config load start');\n const { config, configPath } = await loadConfig();\n logger.timing('Config loaded');\n\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config (checks schema directory exists)\n validateConfig(config, rootDir);\n\n // Load schemas from main directory\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n logger.timing('Schema load start');\n\n let schemas = await loadSchemas(schemaPath);\n logger.debug(`Found ${Object.keys(schemas).length} schema(s) in main directory`);\n\n // Load additional schemas from config\n const additionalPaths = config.additionalSchemaPaths ?? [];\n let hasPackageSchemas = false;\n\n if (additionalPaths.length > 0) {\n logger.step(`Loading schemas from ${additionalPaths.length} additional path(s)`);\n for (const entry of additionalPaths) {\n const absolutePath = resolve(rootDir, entry.path);\n logger.debug(` Checking: ${entry.path} → ${absolutePath}`);\n\n if (existsSync(absolutePath)) {\n const packageSchemas = await loadSchemas(absolutePath, { skipPartialResolution: true });\n const count = Object.keys(packageSchemas).filter(k => !k.startsWith('__partial__')).length;\n const partialCount = Object.keys(packageSchemas).filter(k => k.startsWith('__partial__')).length;\n const nsInfo = entry.namespace ? ` [${entry.namespace}]` : '';\n logger.info(` • ${entry.path}${nsInfo}: ${count} schema(s)${partialCount > 0 ? ` + ${partialCount} partial(s)` : ''}`);\n schemas = { ...packageSchemas, ...schemas };\n hasPackageSchemas = true;\n } else {\n logger.warn(` • ${entry.path}: directory not found (skipped)`);\n }\n }\n }\n\n // Resolve partial schemas from packages\n if (hasPackageSchemas) {\n schemas = mergePartialSchemas(schemas);\n }\n\n logger.timing('Schemas loaded');\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Total: ${schemaCount} schema(s)`);\n\n // Validate schemas\n logger.step('Validating schemas...');\n logger.timing('Validation start');\n\n const result = validateSchemas(schemas);\n logger.timing('Validation complete');\n\n if (result.valid) {\n logger.success(`All ${schemaCount} schema(s) are valid`);\n } else {\n logger.error(`Found ${result.errors.length} validation error(s)`);\n logger.newline();\n\n for (const error of result.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n logger.newline();\n }\n\n process.exit(2);\n }\n}\n\n/**\n * Registers the validate command.\n */\nexport function registerValidateCommand(program: Command): void {\n program\n .command('validate')\n .description('Validate schema files')\n .option('-v, --verbose', 'Show detailed output')\n .action(async (options: ValidateOptions) => {\n try {\n await runValidate(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Configuration Loader\n *\n * Loads and resolves omnify.config.ts configuration.\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { createJiti } from 'jiti';\nimport type { OmnifyConfig, ResolvedOmnifyConfig, OmnifyPlugin, ConfigLoadResult, DiscoveryConfig } from './types.js';\nimport { configError, configNotFoundError } from '@famgia/omnify-core';\nimport { discoverPackages } from './discovery.js';\n\n/**\n * Configuration file names to search for (in order of priority).\n */\nconst CONFIG_FILES = [\n 'omnify.config.ts',\n 'omnify.config.js',\n 'omnify.config.mjs',\n 'omnify.config.cjs',\n];\n\n/**\n * Finds configuration file in directory.\n */\nexport function findConfigFile(startDir: string): string | null {\n const cwd = resolve(startDir);\n\n for (const filename of CONFIG_FILES) {\n const configPath = resolve(cwd, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n return null;\n}\n\n/**\n * Loads configuration from file using jiti.\n */\nasync function loadConfigFile(configPath: string): Promise<OmnifyConfig> {\n const jiti = createJiti(configPath, {\n interopDefault: true,\n moduleCache: false,\n });\n\n try {\n const module = await jiti.import(configPath);\n const config = module as OmnifyConfig;\n\n // Handle default export\n if ('default' in config) {\n return (config as { default: OmnifyConfig }).default;\n }\n\n return config;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw configError(\n `Failed to load config file: ${message}. Check your omnify.config.ts for syntax errors.`,\n 'E002'\n );\n }\n}\n\n/**\n * Resolves plugins from configuration.\n * Handles both string (npm package) and object plugins.\n */\nasync function resolvePlugins(\n plugins: readonly (string | OmnifyPlugin)[] | undefined,\n configPath: string | null\n): Promise<OmnifyPlugin[]> {\n if (!plugins || plugins.length === 0) {\n return [];\n }\n\n const resolved: OmnifyPlugin[] = [];\n const configDir = configPath ? dirname(configPath) : process.cwd();\n\n for (const plugin of plugins) {\n if (typeof plugin === 'string') {\n // Load plugin from npm package\n const jiti = createJiti(configDir, {\n interopDefault: true,\n moduleCache: false,\n });\n\n try {\n const module = await jiti.import(plugin);\n const loadedPlugin = (module as { default?: OmnifyPlugin }).default ?? module;\n resolved.push(loadedPlugin as OmnifyPlugin);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw configError(\n `Failed to load plugin '${plugin}': ${message}. Ensure the plugin is installed: npm install ${plugin}`,\n 'E301'\n );\n }\n } else {\n // Direct plugin object\n resolved.push(plugin);\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolves configuration with defaults.\n */\nexport async function resolveConfig(\n userConfig: OmnifyConfig,\n configPath: string | null\n): Promise<ResolvedOmnifyConfig> {\n const plugins = await resolvePlugins(userConfig.plugins, configPath);\n const projectRoot = configPath ? dirname(configPath) : process.cwd();\n\n // Build discovery config with defaults\n const discovery: DiscoveryConfig = {\n enabled: userConfig.discovery?.enabled ?? true,\n exclude: userConfig.discovery?.exclude,\n };\n\n // Discover packages and merge with explicit additionalSchemaPaths\n const allSchemaPaths = discoverPackages(\n projectRoot,\n discovery,\n userConfig.additionalSchemaPaths\n );\n\n // Build database config, only including defined optional properties\n const databaseConfig = {\n driver: userConfig.database.driver,\n enableFieldComments: userConfig.database.enableFieldComments ?? false,\n };\n // Only add devUrl if defined\n const database = userConfig.database.devUrl !== undefined\n ? { ...databaseConfig, devUrl: userConfig.database.devUrl }\n : databaseConfig;\n\n // Build laravel output config\n const laravelConfig = {\n migrationsPath: userConfig.output?.laravel?.migrationsPath ?? 'database/migrations',\n };\n // Only add optional properties if they are defined\n const laravel = buildLaravelConfig(laravelConfig, userConfig.output?.laravel);\n\n // Build typescript output config\n const tsConfig = userConfig.output?.typescript;\n const typescript = {\n path: tsConfig?.path ?? 'types',\n schemasDir: tsConfig?.schemasDir ?? 'schemas',\n enumDir: tsConfig?.enumDir ?? 'enum',\n singleFile: tsConfig?.singleFile ?? true,\n generateEnums: tsConfig?.generateEnums ?? true,\n generateRelationships: tsConfig?.generateRelationships ?? true,\n };\n\n const result: ResolvedOmnifyConfig = {\n schemasDir: userConfig.schemasDir ?? './schemas',\n database: database as ResolvedOmnifyConfig['database'],\n output: {\n laravel,\n typescript,\n } as ResolvedOmnifyConfig['output'],\n plugins,\n verbose: userConfig.verbose ?? false,\n lockFilePath: userConfig.lockFilePath ?? '.omnify.lock',\n discovery,\n ...(userConfig.locale && { locale: userConfig.locale }),\n ...(allSchemaPaths.length > 0 && { additionalSchemaPaths: allSchemaPaths }),\n };\n\n return result;\n}\n\n/**\n * Builds Laravel config with only defined optional properties.\n */\nfunction buildLaravelConfig(\n base: { migrationsPath: string },\n userLaravel?: Readonly<{\n migrationsPath?: string;\n modelsPath?: string;\n baseModelsPath?: string;\n providersPath?: string;\n modelsNamespace?: string;\n factoriesPath?: string;\n enumsPath?: string;\n enumsNamespace?: string;\n }>\n): ResolvedOmnifyConfig['output']['laravel'] {\n const config: ResolvedOmnifyConfig['output']['laravel'] = { ...base };\n\n if (userLaravel?.modelsPath !== undefined) {\n (config as { modelsPath: string }).modelsPath = userLaravel.modelsPath;\n }\n if (userLaravel?.baseModelsPath !== undefined) {\n (config as { baseModelsPath: string }).baseModelsPath = userLaravel.baseModelsPath;\n }\n if (userLaravel?.providersPath !== undefined) {\n (config as { providersPath: string }).providersPath = userLaravel.providersPath;\n }\n if (userLaravel?.modelsNamespace !== undefined) {\n (config as { modelsNamespace: string }).modelsNamespace = userLaravel.modelsNamespace;\n }\n if (userLaravel?.factoriesPath !== undefined) {\n (config as { factoriesPath: string }).factoriesPath = userLaravel.factoriesPath;\n }\n if (userLaravel?.enumsPath !== undefined) {\n (config as { enumsPath: string }).enumsPath = userLaravel.enumsPath;\n }\n if (userLaravel?.enumsNamespace !== undefined) {\n (config as { enumsNamespace: string }).enumsNamespace = userLaravel.enumsNamespace;\n }\n\n return config;\n}\n\n/**\n * Validates required configuration.\n */\nexport function validateConfig(config: ResolvedOmnifyConfig, rootDir: string): void {\n // Validate schema directory exists\n const schemaPath = resolve(rootDir, config.schemasDir);\n if (!existsSync(schemaPath)) {\n throw configError(\n `Schema directory not found: ${schemaPath}. Create the '${config.schemasDir}' directory or update schemasDir in config.`,\n 'E002'\n );\n }\n}\n\n/**\n * Validates that devUrl is configured (required for diff/generate operations).\n */\nexport function requireDevUrl(config: ResolvedOmnifyConfig): void {\n if (!config.database.devUrl) {\n throw configError(\n `database.devUrl is required for diff and generate operations. Add devUrl to your database config, e.g., \"mysql://root@localhost:3306/omnify_dev\"`,\n 'E003'\n );\n }\n}\n\n/**\n * Loads configuration from file or returns defaults.\n */\nexport async function loadConfig(startDir: string = process.cwd()): Promise<ConfigLoadResult> {\n const cwd = resolve(startDir);\n const configPath = findConfigFile(cwd);\n\n if (configPath) {\n const userConfig = await loadConfigFile(configPath);\n const config = await resolveConfig(userConfig, configPath);\n\n return {\n config,\n configPath,\n };\n }\n\n // No config file found - require config file\n throw configNotFoundError(resolve(cwd, 'omnify.config.ts'));\n}\n\n/**\n * Helper function for type-safe configuration.\n * Used in omnify.config.ts files.\n */\nexport function defineConfig(config: OmnifyConfig): OmnifyConfig {\n return config;\n}\n","/**\n * Package Auto-Discovery Module\n *\n * Reads `.omnify-packages.json` manifest generated by Composer plugin\n * and merges discovered packages with explicit additionalSchemaPaths.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type {\n OmnifyPackagesManifest,\n OmnifyPackageConfig,\n AdditionalSchemaPath,\n DiscoveryConfig,\n} from './types.js';\nimport { logger } from '../output/logger.js';\n\n/** Default manifest filename */\nconst MANIFEST_FILENAME = '.omnify-packages.json';\n\n/** Current manifest version */\nconst MANIFEST_VERSION = 1;\n\n/**\n * Load package manifest from project root.\n *\n * @param projectRoot - Project root directory\n * @returns Parsed manifest or null if not found\n */\nexport function loadPackageManifest(projectRoot: string): OmnifyPackagesManifest | null {\n const manifestPath = resolve(projectRoot, MANIFEST_FILENAME);\n\n if (!existsSync(manifestPath)) {\n logger.debug(`Package manifest not found: ${manifestPath}`);\n return null;\n }\n\n try {\n const content = readFileSync(manifestPath, 'utf-8');\n const manifest = JSON.parse(content) as OmnifyPackagesManifest;\n\n // Validate version\n if (manifest.version !== MANIFEST_VERSION) {\n logger.warn(\n `Package manifest version mismatch: expected ${MANIFEST_VERSION}, got ${manifest.version}. ` +\n 'Run `composer dump-autoload` to regenerate.'\n );\n }\n\n return manifest;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(`Failed to read package manifest: ${message}`);\n return null;\n }\n}\n\n/**\n * Convert package config from manifest to AdditionalSchemaPath.\n *\n * @param packageName - Package name (e.g., 'vendor/package')\n * @param config - Package configuration from manifest\n * @returns AdditionalSchemaPath entry\n */\nfunction packageConfigToSchemaPath(\n packageName: string,\n config: OmnifyPackageConfig\n): AdditionalSchemaPath {\n const result: AdditionalSchemaPath = {\n path: config.schemas,\n namespace: config.namespace,\n };\n\n // Convert package options to output config\n if (config.options) {\n const opts = config.options;\n const basePath = config.schemas.replace(/\\/database\\/schemas\\/?$/, '');\n\n const laravelOutput: Record<string, unknown> = {\n base: basePath,\n };\n\n if (opts.modelNamespace) {\n laravelOutput.modelsNamespace = opts.modelNamespace;\n }\n if (opts.migrationsPath) {\n laravelOutput.migrationsPath = opts.migrationsPath.replace(basePath + '/', '');\n }\n if (opts.factoriesPath) {\n laravelOutput.factoriesPath = opts.factoriesPath.replace(basePath + '/', '');\n }\n if (opts.generateServiceProvider !== undefined) {\n laravelOutput.generateServiceProvider = opts.generateServiceProvider;\n }\n if (opts.generateMigrations !== undefined) {\n laravelOutput.generateMigrations = opts.generateMigrations;\n }\n if (opts.generateModels !== undefined) {\n laravelOutput.generateModels = opts.generateModels;\n }\n\n (result as { output?: unknown }).output = { laravel: laravelOutput };\n }\n\n return result;\n}\n\n/**\n * Discover packages from manifest and merge with explicit paths.\n *\n * @param projectRoot - Project root directory\n * @param discoveryConfig - Discovery configuration\n * @param explicitPaths - Explicit additionalSchemaPaths from config\n * @returns Merged array of schema paths (discovered + explicit)\n */\nexport function discoverPackages(\n projectRoot: string,\n discoveryConfig: DiscoveryConfig,\n explicitPaths?: readonly AdditionalSchemaPath[]\n): AdditionalSchemaPath[] {\n const result: AdditionalSchemaPath[] = [];\n const excludeSet = new Set(discoveryConfig.exclude ?? []);\n\n // Load auto-discovered packages\n if (discoveryConfig.enabled !== false) {\n const manifest = loadPackageManifest(projectRoot);\n\n if (manifest) {\n // Sort by priority (lower = first)\n const sortedPackages = Object.entries(manifest.packages).sort(\n ([, a], [, b]) => (a.priority ?? 100) - (b.priority ?? 100)\n );\n\n for (const [packageName, config] of sortedPackages) {\n // Skip excluded packages\n if (excludeSet.has(packageName)) {\n logger.debug(`Skipping excluded package: ${packageName}`);\n continue;\n }\n\n // Skip if schema path doesn't exist\n const schemasPath = resolve(projectRoot, config.schemas);\n if (!existsSync(schemasPath)) {\n logger.debug(`Package schemas not found, skipping: ${schemasPath}`);\n continue;\n }\n\n result.push(packageConfigToSchemaPath(packageName, config));\n logger.debug(`Discovered package: ${packageName} (${config.namespace ?? 'no namespace'})`);\n }\n\n if (result.length > 0) {\n logger.info(`Auto-discovered ${result.length} package(s) from ${MANIFEST_FILENAME}`);\n }\n }\n }\n\n // Append explicit paths (they take precedence / can override)\n if (explicitPaths?.length) {\n result.push(...explicitPaths);\n }\n\n return result;\n}\n\n/**\n * Get the manifest file path for a project.\n */\nexport function getManifestPath(projectRoot: string): string {\n return resolve(projectRoot, MANIFEST_FILENAME);\n}\n","/**\n * @famgia/omnify-cli - Diff Command\n *\n * Shows pending schema changes without generating migrations.\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, mergePartialSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { loadConfig, validateConfig, requireDevUrl } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { runDiffOperation } from '../operations/diff.js';\nimport pc from 'picocolors';\n\n/**\n * Diff command options.\n */\ninterface DiffOptions {\n verbose?: boolean;\n check?: boolean;\n}\n\n/**\n * Runs the diff command.\n */\nexport async function runDiff(options: DiffOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Checking for Schema Changes');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config and require devUrl for diff\n validateConfig(config, rootDir);\n requireDevUrl(config);\n\n // Load schemas from main directory\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n\n let schemas = await loadSchemas(schemaPath);\n logger.debug(`Found ${Object.keys(schemas).length} schema(s) in main directory`);\n\n // Load additional schemas from config\n const additionalPaths = config.additionalSchemaPaths ?? [];\n let hasPackageSchemas = false;\n\n if (additionalPaths.length > 0) {\n logger.step(`Loading schemas from ${additionalPaths.length} additional path(s)`);\n for (const entry of additionalPaths) {\n const absolutePath = resolve(rootDir, entry.path);\n logger.debug(` Checking: ${entry.path} → ${absolutePath}`);\n\n if (existsSync(absolutePath)) {\n const packageSchemas = await loadSchemas(absolutePath, { skipPartialResolution: true });\n const count = Object.keys(packageSchemas).filter(k => !k.startsWith('__partial__')).length;\n const partialCount = Object.keys(packageSchemas).filter(k => k.startsWith('__partial__')).length;\n const nsInfo = entry.namespace ? ` [${entry.namespace}]` : '';\n logger.info(` • ${entry.path}${nsInfo}: ${count} schema(s)${partialCount > 0 ? ` + ${partialCount} partial(s)` : ''}`);\n schemas = { ...packageSchemas, ...schemas };\n hasPackageSchemas = true;\n } else {\n logger.warn(` • ${entry.path}: directory not found (skipped)`);\n }\n }\n }\n\n // Resolve partial schemas from packages\n if (hasPackageSchemas) {\n schemas = mergePartialSchemas(schemas);\n }\n\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Total: ${schemaCount} schema(s)`);\n\n // Validate schemas first\n logger.step('Validating schemas...');\n const validationResult = validateSchemas(schemas);\n\n if (!validationResult.valid) {\n logger.error('Schema validation failed. Fix errors before running diff.');\n for (const error of validationResult.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n }\n process.exit(2);\n }\n\n // Run diff operation\n logger.step('Running Atlas diff...');\n const lockPath = resolve(rootDir, config.lockFilePath);\n\n const diffResult = await runDiffOperation({\n schemas,\n devUrl: config.database.devUrl!,\n lockFilePath: lockPath,\n driver: config.database.driver,\n workDir: rootDir,\n });\n\n if (!diffResult.hasChanges) {\n logger.success('No changes detected');\n return;\n }\n\n // Show changes preview\n logger.newline();\n console.log(pc.bold('Changes detected:'));\n console.log();\n console.log(diffResult.formattedPreview);\n\n if (diffResult.hasDestructiveChanges) {\n logger.newline();\n logger.warn('This preview contains destructive changes. Review carefully.');\n }\n\n // Check mode: exit with code 1 if changes exist\n if (options.check) {\n logger.newline();\n logger.info('Changes detected (--check mode)');\n process.exit(1);\n }\n\n logger.newline();\n logger.info('Run \"omnify generate\" to create migrations');\n}\n\n/**\n * Registers the diff command.\n */\nexport function registerDiffCommand(program: Command): void {\n program\n .command('diff')\n .description('Show pending schema changes')\n .option('-v, --verbose', 'Show detailed output')\n .option('--check', 'Exit with code 1 if changes exist (for CI)')\n .action(async (options: DiffOptions) => {\n try {\n await runDiff(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Diff Operations\n *\n * High-level diff operations combining atlas-adapter functions.\n */\n\nimport type { SchemaCollection, DatabaseDriver } from '@famgia/omnify-types';\nimport {\n generatePreview,\n formatPreview,\n type ChangePreview,\n} from '@famgia/omnify-atlas';\n\n/**\n * Options for running diff.\n */\nexport interface RunDiffOptions {\n schemas: SchemaCollection;\n devUrl: string;\n lockFilePath: string;\n driver: DatabaseDriver;\n workDir: string;\n}\n\n/**\n * Result of diff operation.\n */\nexport interface DiffOperationResult {\n hasChanges: boolean;\n hasDestructiveChanges: boolean;\n preview: ChangePreview;\n formattedPreview: string;\n sql: string;\n}\n\n/**\n * Runs a full diff operation.\n */\nexport async function runDiffOperation(options: RunDiffOptions): Promise<DiffOperationResult> {\n const { schemas, devUrl, driver, workDir } = options;\n\n // Generate preview using atlas-adapter\n const preview = await generatePreview(schemas, {\n driver,\n devUrl,\n workDir,\n }, {\n warnDestructive: true,\n showSql: true,\n });\n\n // Format preview for display\n const formattedPreview = formatPreview(preview, 'text');\n\n return {\n hasChanges: preview.hasChanges,\n hasDestructiveChanges: preview.hasDestructiveChanges,\n preview,\n formattedPreview,\n sql: preview.sql,\n };\n}\n\n/**\n * Re-export for convenience.\n */\nexport { formatPreview };\n","/**\n * @famgia/omnify-cli - Generate Command\n *\n * Generates Laravel migrations and TypeScript types from schemas.\n * Supports both direct generation and plugin-based generation.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs';\nimport { resolve, dirname, relative } from 'node:path';\nimport type { Command } from 'commander';\nimport {\n loadSchemas,\n mergePartialSchemas,\n validateSchemas,\n OmnifyError,\n PluginManager,\n createVersionStore,\n type VersionSchemaSnapshot,\n type VersionPropertySnapshot,\n type VersionChange,\n} from '@famgia/omnify-core';\nimport type { LoadedSchema } from '@famgia/omnify-types';\nimport {\n writeLockFile,\n readLockFile,\n updateLockFile,\n buildSchemaSnapshots,\n compareSchemasDeep,\n isLockFileV2,\n validateMigrations,\n getMigrationsToRegenerate,\n VERSION_CHAIN_FILE,\n readVersionChain,\n checkBulkLockViolation,\n type SchemaChange,\n type MigrationValidation,\n} from '@famgia/omnify-atlas';\nimport {\n generateMigrations,\n generateMigrationsFromChanges,\n generateModels,\n getModelPath,\n generateFactories,\n getFactoryPath,\n} from '@famgia/omnify-laravel';\nimport { generateTypeScript, generateAIGuides as generateTypescriptAIGuides, shouldGenerateAIGuides as shouldGenerateTypescriptAIGuides } from '@famgia/omnify-typescript';\nimport type {\n OmnifyPlugin,\n SchemaCollection,\n GeneratorOutput,\n} from '@famgia/omnify-types';\nimport type { ResolvedOmnifyConfig } from '../config/types.js';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { configureOmnifyAlias, addPluginEnumAlias, addPluginEnumTsconfigPath } from '../config/alias-config.js';\nimport { logger } from '../output/logger.js';\nimport { generateAIGuides } from '../guides/index.js';\n\n/**\n * Generate command options.\n */\ninterface GenerateOptions {\n verbose?: boolean;\n migrationsOnly?: boolean;\n typesOnly?: boolean;\n force?: boolean;\n /** CI mode: check if migrations are in sync without generating */\n check?: boolean;\n /** Show stale migration warnings */\n warnStale?: boolean;\n}\n\n\n/**\n * Checks if plugins have generators configured.\n */\nfunction hasPluginGenerators(plugins: readonly OmnifyPlugin[]): boolean {\n return plugins.some((p) => p.generators && p.generators.length > 0);\n}\n\n/**\n * Scans a directory for existing migration files and returns tables that already have CREATE migrations.\n */\nfunction getExistingMigrationTables(migrationsDir: string): Set<string> {\n const existingTables = new Set<string>();\n\n if (!existsSync(migrationsDir)) {\n return existingTables;\n }\n\n try {\n const files = readdirSync(migrationsDir);\n // Match pattern: YYYY_MM_DD_HHMMSS_create_<table>_table.php\n const createMigrationPattern = /^\\d{4}_\\d{2}_\\d{2}_\\d{6}_create_(.+)_table\\.php$/;\n\n for (const file of files) {\n const match = file.match(createMigrationPattern);\n if (match) {\n existingTables.add(match[1]); // table name\n }\n }\n } catch {\n // Ignore errors reading directory\n }\n\n return existingTables;\n}\n\n/**\n * Logs detailed schema change information.\n */\nfunction logSchemaChange(change: SchemaChange, verbose: boolean): void {\n logger.debug(` ${change.changeType}: ${change.schemaName}`);\n\n if (!verbose || change.changeType !== 'modified') {\n return;\n }\n\n // Log column changes\n if (change.columnChanges) {\n for (const col of change.columnChanges) {\n if (col.changeType === 'added') {\n logger.debug(` + column: ${col.column} (${col.currentDef?.type})`);\n } else if (col.changeType === 'removed') {\n logger.debug(` - column: ${col.column}`);\n } else if (col.changeType === 'modified' && col.modifications) {\n logger.debug(` ~ column: ${col.column} [${col.modifications.join(', ')}]`);\n } else if (col.changeType === 'renamed' && col.previousColumn) {\n const mods = col.modifications?.length ? ` [${col.modifications.join(', ')}]` : '';\n logger.debug(` → column: ${col.previousColumn} → ${col.column}${mods}`);\n }\n }\n }\n\n // Log index changes\n if (change.indexChanges) {\n for (const idx of change.indexChanges) {\n const type = idx.index.unique ? 'unique' : 'index';\n if (idx.changeType === 'added') {\n logger.debug(` + ${type}: (${idx.index.columns.join(', ')})`);\n } else {\n logger.debug(` - ${type}: (${idx.index.columns.join(', ')})`);\n }\n }\n }\n\n // Log option changes\n if (change.optionChanges) {\n if (change.optionChanges.timestamps) {\n const { from, to } = change.optionChanges.timestamps;\n logger.debug(` ~ timestamps: ${from} → ${to}`);\n }\n if (change.optionChanges.softDelete) {\n const { from, to } = change.optionChanges.softDelete;\n logger.debug(` ~ softDelete: ${from} → ${to}`);\n }\n if (change.optionChanges.idType) {\n const { from, to } = change.optionChanges.idType;\n logger.debug(` ~ idType: ${from} → ${to}`);\n }\n }\n}\n\n/**\n * Convert property to version snapshot format.\n */\nfunction propertyToVersionSnapshot(prop: Record<string, unknown>): VersionPropertySnapshot {\n return {\n type: prop.type as string,\n ...(prop.displayName !== undefined && { displayName: prop.displayName as string }),\n ...(prop.description !== undefined && { description: prop.description as string }),\n ...(prop.nullable !== undefined && { nullable: prop.nullable as boolean }),\n ...(prop.unique !== undefined && { unique: prop.unique as boolean }),\n ...(prop.default !== undefined && { default: prop.default }),\n ...(prop.length !== undefined && { length: prop.length as number }),\n ...(prop.unsigned !== undefined && { unsigned: prop.unsigned as boolean }),\n ...(prop.precision !== undefined && { precision: prop.precision as number }),\n ...(prop.scale !== undefined && { scale: prop.scale as number }),\n ...(prop.enum !== undefined && { enum: prop.enum as readonly string[] }),\n ...(prop.relation !== undefined && { relation: prop.relation as string }),\n ...(prop.target !== undefined && { target: prop.target as string }),\n ...(prop.targets !== undefined && { targets: prop.targets as readonly string[] }),\n ...(prop.morphName !== undefined && { morphName: prop.morphName as string }),\n ...(prop.onDelete !== undefined && { onDelete: prop.onDelete as string }),\n ...(prop.onUpdate !== undefined && { onUpdate: prop.onUpdate as string }),\n ...(prop.mappedBy !== undefined && { mappedBy: prop.mappedBy as string }),\n ...(prop.inversedBy !== undefined && { inversedBy: prop.inversedBy as string }),\n ...(prop.joinTable !== undefined && { joinTable: prop.joinTable as string }),\n ...(prop.owning !== undefined && { owning: prop.owning as boolean }),\n // Laravel-specific properties\n ...(prop.hidden !== undefined && { hidden: prop.hidden as boolean }),\n ...(prop.fillable !== undefined && { fillable: prop.fillable as boolean }),\n // Per-field overrides for compound types\n ...(prop.fields !== undefined && { fields: prop.fields as Record<string, { nullable?: boolean; hidden?: boolean; fillable?: boolean }> }),\n };\n}\n\n/**\n * Convert schemas to version snapshot format.\n */\nfunction schemasToVersionSnapshot(\n schemas: SchemaCollection\n): Record<string, VersionSchemaSnapshot> {\n const snapshot: Record<string, VersionSchemaSnapshot> = {};\n\n for (const [name, schema] of Object.entries(schemas)) {\n const properties: Record<string, VersionPropertySnapshot> = {};\n if (schema.properties) {\n for (const [propName, prop] of Object.entries(schema.properties)) {\n properties[propName] = propertyToVersionSnapshot(prop as unknown as Record<string, unknown>);\n }\n }\n\n const opts = schema.options;\n snapshot[name] = {\n name: schema.name,\n kind: (schema.kind ?? 'object') as 'object' | 'enum',\n ...(Object.keys(properties).length > 0 && { properties }),\n ...(schema.values && { values: schema.values }),\n ...(opts && {\n options: {\n ...(opts.id !== undefined && { id: opts.id }),\n ...(opts.idType !== undefined && { idType: opts.idType }),\n ...(opts.timestamps !== undefined && { timestamps: opts.timestamps }),\n ...(opts.softDelete !== undefined && { softDelete: opts.softDelete }),\n ...(opts.tableName !== undefined && { tableName: opts.tableName }),\n ...(opts.translations !== undefined && { translations: opts.translations }),\n ...(opts.authenticatable !== undefined && { authenticatable: opts.authenticatable }),\n },\n }),\n };\n }\n\n return snapshot;\n}\n\n/**\n * Convert SchemaChange to VersionChange format.\n */\nfunction schemaChangeToVersionChange(change: SchemaChange): VersionChange[] {\n const changes: VersionChange[] = [];\n\n if (change.changeType === 'added') {\n changes.push({ action: 'schema_added', schema: change.schemaName });\n } else if (change.changeType === 'removed') {\n changes.push({ action: 'schema_removed', schema: change.schemaName });\n } else if (change.changeType === 'modified') {\n // Add property-level changes\n if (change.columnChanges) {\n for (const col of change.columnChanges) {\n if (col.changeType === 'added') {\n changes.push({\n action: 'property_added',\n schema: change.schemaName,\n property: col.column,\n to: col.currentDef,\n });\n } else if (col.changeType === 'removed') {\n changes.push({\n action: 'property_removed',\n schema: change.schemaName,\n property: col.column,\n from: col.previousDef,\n });\n } else if (col.changeType === 'modified') {\n changes.push({\n action: 'property_modified',\n schema: change.schemaName,\n property: col.column,\n from: col.previousDef,\n to: col.currentDef,\n });\n } else if (col.changeType === 'renamed') {\n changes.push({\n action: 'property_renamed',\n schema: change.schemaName,\n property: col.column,\n from: col.previousColumn,\n to: col.column,\n });\n }\n }\n }\n\n // Add option changes\n if (change.optionChanges) {\n changes.push({\n action: 'option_changed',\n schema: change.schemaName,\n from: change.optionChanges,\n to: change.optionChanges,\n });\n }\n\n // Add index changes\n if (change.indexChanges) {\n for (const idx of change.indexChanges) {\n if (idx.changeType === 'added') {\n changes.push({\n action: 'index_added',\n schema: change.schemaName,\n to: idx.index,\n });\n } else {\n changes.push({\n action: 'index_removed',\n schema: change.schemaName,\n from: idx.index,\n });\n }\n }\n }\n }\n\n return changes;\n}\n\n/**\n * Writes generator outputs to disk.\n */\nfunction writeGeneratorOutputs(\n outputs: readonly GeneratorOutput[],\n rootDir: string\n): { migrations: number; types: number; models: number; factories: number; other: number } {\n const counts = { migrations: 0, types: 0, models: 0, factories: 0, other: 0 };\n\n for (const output of outputs) {\n const filePath = resolve(rootDir, output.path);\n const dir = dirname(filePath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n logger.debug(`Created directory: ${dir}`);\n }\n\n // Skip writing if file exists and skipIfExists is true\n if (output.skipIfExists && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${output.path}`);\n continue;\n }\n\n writeFileSync(filePath, output.content);\n logger.debug(`Created: ${output.path}`);\n\n if (output.type === 'migration') counts.migrations++;\n else if (output.type === 'type') counts.types++;\n else if (output.type === 'model') counts.models++;\n else if (output.type === 'factory') counts.factories++;\n else counts.other++;\n }\n\n return counts;\n}\n\n/**\n * Runs generation using the plugin system.\n */\nasync function runPluginGeneration(\n plugins: readonly OmnifyPlugin[],\n schemas: SchemaCollection,\n rootDir: string,\n verbose: boolean,\n changes?: readonly SchemaChange[]\n): Promise<{ migrations: number; types: number; models: number; factories: number; other: number }> {\n const pluginManager = new PluginManager({\n cwd: rootDir,\n verbose,\n logger: {\n debug: (msg) => logger.debug(msg),\n info: (msg) => logger.info(msg),\n warn: (msg) => logger.warn(msg),\n error: (msg) => logger.error(msg),\n },\n });\n\n // Register plugins\n for (const plugin of plugins) {\n await pluginManager.register(plugin);\n }\n\n // Run generators with schema changes\n const result = await pluginManager.runGenerators(schemas, changes);\n\n if (!result.success) {\n for (const error of result.errors) {\n logger.error(`Generator ${error.generatorName} failed: ${error.message}`);\n }\n throw new Error('Generator execution failed');\n }\n\n // Write outputs\n return writeGeneratorOutputs(result.outputs, rootDir);\n}\n\n/**\n * Runs generation using direct function calls (legacy mode).\n */\nfunction runDirectGeneration(\n schemas: SchemaCollection,\n config: ResolvedOmnifyConfig,\n rootDir: string,\n options: GenerateOptions,\n changes: readonly SchemaChange[]\n): { migrations: number; types: number; models: number; factories: number } {\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n let modelsGenerated = 0;\n let factoriesGenerated = 0;\n\n // Extract custom types from plugins for generators\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypesMap.set(typeDef.name, typeDef);\n }\n }\n }\n\n // Extract plugin enums for TypeScript generation\n const pluginEnumsMap = new Map<string, import('@famgia/omnify-types').PluginEnumDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.enums) {\n for (const enumDef of plugin.enums) {\n pluginEnumsMap.set(enumDef.name, enumDef);\n }\n }\n }\n\n // Generate Laravel migrations\n if (!options.typesOnly && config.output.laravel) {\n logger.step('Generating Laravel migrations...');\n\n const migrationsDir = resolve(rootDir, config.output.laravel.migrationsPath);\n if (!existsSync(migrationsDir)) {\n mkdirSync(migrationsDir, { recursive: true });\n logger.debug(`Created directory: ${migrationsDir}`);\n }\n\n // Separate added schemas from modified/removed\n const addedSchemaNames = new Set(\n changes.filter((c) => c.changeType === 'added').map((c) => c.schemaName)\n );\n const alterChanges = changes.filter(\n (c) => c.changeType === 'modified' || c.changeType === 'removed'\n );\n\n // Get existing migration tables to avoid duplicates\n const existingTables = getExistingMigrationTables(migrationsDir);\n\n // Generate CREATE migrations only for added schemas\n if (addedSchemaNames.size > 0) {\n const addedSchemas = Object.fromEntries(\n Object.entries(schemas).filter(([name]) => addedSchemaNames.has(name))\n ) as SchemaCollection;\n\n const createMigrations = generateMigrations(addedSchemas, { customTypes: customTypesMap });\n for (const migration of createMigrations) {\n const tableName = migration.tables[0];\n // Skip if table already has a create migration\n if (existingTables.has(tableName)) {\n logger.debug(`Skipped CREATE for ${tableName} (already exists)`);\n continue;\n }\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n }\n\n // Generate ALTER/DROP migrations for modified/removed schemas\n if (alterChanges.length > 0) {\n const alterMigrations = generateMigrationsFromChanges(alterChanges);\n for (const migration of alterMigrations) {\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n }\n\n logger.success(`Generated ${migrationsGenerated} migration(s)`);\n }\n\n // Generate Laravel models\n if (!options.typesOnly && config.output.laravel?.modelsPath) {\n logger.step('Generating Laravel models...');\n\n const modelsPath = config.output.laravel.modelsPath;\n const baseModelsPath = config.output.laravel.baseModelsPath ?? `${modelsPath}/OmnifyBase`;\n\n // Ensure directories exist\n const modelsDir = resolve(rootDir, modelsPath);\n const baseModelsDir = resolve(rootDir, baseModelsPath);\n if (!existsSync(modelsDir)) {\n mkdirSync(modelsDir, { recursive: true });\n }\n if (!existsSync(baseModelsDir)) {\n mkdirSync(baseModelsDir, { recursive: true });\n }\n\n const providersPath = config.output.laravel.providersPath ?? 'app/Providers';\n\n const models = generateModels(schemas, {\n modelPath: modelsPath,\n baseModelPath: baseModelsPath,\n providersPath: providersPath,\n customTypes: customTypesMap,\n });\n\n for (const model of models) {\n const filePath = resolve(rootDir, getModelPath(model));\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n\n // Skip user models if they exist (don't overwrite customizations)\n // Always overwrite base models (overwrite: true)\n if (!model.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${getModelPath(model)}`);\n continue;\n }\n\n writeFileSync(filePath, model.content);\n logger.debug(`Created: ${getModelPath(model)}`);\n modelsGenerated++;\n }\n\n logger.success(`Generated ${modelsGenerated} model(s)`);\n }\n\n // Generate Laravel factories\n if (!options.typesOnly && config.output.laravel?.factoriesPath) {\n logger.step('Generating Laravel factories...');\n\n const factoriesPath = config.output.laravel.factoriesPath;\n const factoriesDir = resolve(rootDir, factoriesPath);\n if (!existsSync(factoriesDir)) {\n mkdirSync(factoriesDir, { recursive: true });\n }\n\n const factories = generateFactories(schemas, {\n factoryPath: factoriesPath,\n });\n\n for (const factory of factories) {\n const filePath = resolve(rootDir, getFactoryPath(factory));\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n\n // Skip user factories if they exist (don't overwrite customizations)\n if (!factory.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${getFactoryPath(factory)}`);\n continue;\n }\n\n writeFileSync(filePath, factory.content);\n logger.debug(`Created: ${getFactoryPath(factory)}`);\n factoriesGenerated++;\n }\n\n logger.success(`Generated ${factoriesGenerated} factory(ies)`);\n }\n\n // Generate TypeScript types\n if (!options.migrationsOnly && config.output.typescript) {\n logger.step('Generating TypeScript types...');\n\n const tsConfig = config.output.typescript as {\n path: string;\n schemasDir?: string;\n enumDir?: string;\n generateRules?: boolean;\n validationTemplates?: Record<string, Record<string, string>>;\n };\n\n // Resolve paths: basePath + subdirectories\n const basePath = resolve(rootDir, tsConfig.path);\n const schemasDir = resolve(basePath, tsConfig.schemasDir ?? 'schemas');\n const enumDir = resolve(basePath, tsConfig.enumDir ?? 'enum');\n\n // Generated files go to node_modules/@omnify-base (auto-generated)\n const omnifyBaseDir = resolve(rootDir, 'node_modules/@omnify-base');\n const pluginEnumDir = resolve(omnifyBaseDir, 'enum');\n const baseSchemasDir = resolve(omnifyBaseDir, 'schemas');\n\n // Calculate enum import prefix (relative path from schemas to enum)\n const enumImportPrefix = relative(schemasDir, enumDir).replace(/\\\\/g, '/');\n\n // Create directories\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.debug(`Created directory: ${schemasDir}`);\n }\n if (!existsSync(enumDir)) {\n mkdirSync(enumDir, { recursive: true });\n logger.debug(`Created directory: ${enumDir}`);\n }\n if (!existsSync(pluginEnumDir)) {\n mkdirSync(pluginEnumDir, { recursive: true });\n logger.debug(`Created directory: ${pluginEnumDir}`);\n }\n if (!existsSync(baseSchemasDir)) {\n mkdirSync(baseSchemasDir, { recursive: true });\n logger.debug(`Created directory: ${baseSchemasDir}`);\n }\n\n // Create package.json for @omnify-base package\n const omnifyPkgJson = resolve(omnifyBaseDir, 'package.json');\n if (!existsSync(omnifyPkgJson)) {\n writeFileSync(omnifyPkgJson, JSON.stringify({\n name: '@omnify-base',\n version: '0.0.0',\n private: true,\n exports: {\n './enum/*': './enum/*.js',\n './schemas/*': './schemas/*.js',\n },\n }, null, 2));\n }\n\n // Enable multiLocale if locale config has multiple locales\n const isMultiLocale = config.locale && config.locale.locales && config.locale.locales.length > 1;\n const typeFiles = generateTypeScript(schemas, {\n customTypes: customTypesMap,\n pluginEnums: pluginEnumsMap,\n localeConfig: config.locale,\n multiLocale: isMultiLocale,\n generateRules: tsConfig.generateRules ?? true,\n validationTemplates: tsConfig.validationTemplates,\n enumImportPrefix,\n pluginEnumImportPrefix: '@omnify-base/enum',\n baseImportPrefix: '@omnify-base/schemas',\n schemaEnumImportPrefix: '@omnify/enum', // Absolute path for node_modules base files\n });\n\n for (const file of typeFiles) {\n // Determine output directory based on file category\n let outputDir: string;\n let outputFilePath = file.filePath;\n\n if (file.category === 'plugin-enum') {\n outputDir = pluginEnumDir;\n } else if (file.category === 'base') {\n // Base files go to node_modules/@omnify-base/schemas/\n outputDir = baseSchemasDir;\n // Remove 'base/' prefix from filePath since we're already in schemas/\n outputFilePath = file.filePath.replace(/^base\\//, '');\n } else if (file.category === 'enum') {\n outputDir = enumDir;\n } else {\n outputDir = schemasDir;\n }\n const filePath = resolve(outputDir, outputFilePath);\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n // Skip if file exists and shouldn't be overwritten\n if (!file.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${file.filePath}`);\n continue;\n }\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.filePath}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n\n // Auto-configure @omnify alias (silent mode - only log if changes made)\n const aliasResult = configureOmnifyAlias(rootDir, tsConfig.path, true);\n if (aliasResult.viteUpdated) {\n logger.success('Auto-configured @omnify alias in vite.config');\n }\n if (aliasResult.tsconfigUpdated) {\n logger.success('Auto-configured @omnify/* path in tsconfig.json');\n }\n\n // Configure @omnify-base alias (always needed for base schemas, enums, common, i18n)\n const pluginAliasResult = addPluginEnumAlias(rootDir);\n if (pluginAliasResult.updated) {\n logger.success('Auto-configured @omnify-base alias in vite.config');\n }\n const pluginPathResult = addPluginEnumTsconfigPath(rootDir);\n if (pluginPathResult.updated) {\n logger.success('Auto-configured @omnify-base/* path in tsconfig.json');\n }\n }\n\n return { migrations: migrationsGenerated, types: typesGenerated, models: modelsGenerated, factories: factoriesGenerated };\n}\n\n/**\n * Runs the generate command.\n */\nexport async function runGenerate(options: GenerateOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Generating Outputs');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config (devUrl not required for generate)\n validateConfig(config, rootDir);\n\n // Load schemas from main directory\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n\n let schemas = await loadSchemas(schemaPath);\n logger.debug(`Found ${Object.keys(schemas).length} schema(s) in main directory`);\n\n // Load additional schemas from config (additionalSchemaPaths)\n // Includes auto-discovered packages from .omnify-packages.json\n const additionalPaths = config.additionalSchemaPaths ?? [];\n let hasPackageSchemas = false;\n\n if (additionalPaths.length > 0) {\n logger.step(`Loading schemas from ${additionalPaths.length} additional path(s)`);\n for (const entry of additionalPaths) {\n // Resolve relative path from rootDir\n const absolutePath = resolve(rootDir, entry.path);\n logger.debug(` Checking: ${entry.path} → ${absolutePath}`);\n\n if (existsSync(absolutePath)) {\n // Load package schemas with skipPartialResolution to defer resolution\n // This allows partials to target schemas from main directory\n let packageSchemas = await loadSchemas(absolutePath, { skipPartialResolution: true });\n\n // パッケージ出力設定がある場合、各スキーマにpackageOutputを付与\n if (entry.output) {\n const schemasWithOutput: Record<string, LoadedSchema> = {};\n for (const [name, schema] of Object.entries(packageSchemas)) {\n schemasWithOutput[name] = {\n ...schema,\n packageOutput: entry.output,\n };\n }\n packageSchemas = schemasWithOutput;\n }\n\n const count = Object.keys(packageSchemas).filter(k => !k.startsWith('__partial__')).length;\n const partialCount = Object.keys(packageSchemas).filter(k => k.startsWith('__partial__')).length;\n const nsInfo = entry.namespace ? ` [${entry.namespace}]` : '';\n const outputInfo = entry.output?.laravel ? ` → ${entry.output.laravel.base}` : '';\n logger.info(` • ${entry.path}${nsInfo}: ${count} schema(s)${partialCount > 0 ? ` + ${partialCount} partial(s)` : ''}${outputInfo}`);\n // Merge schemas (package schemas won't override main schemas)\n schemas = { ...packageSchemas, ...schemas };\n hasPackageSchemas = true;\n } else {\n logger.warn(` • ${entry.path}: directory not found (skipped)`);\n logger.debug(` Resolved path: ${absolutePath}`);\n }\n }\n }\n\n // Resolve partial schemas from packages now that all schemas are merged\n if (hasPackageSchemas) {\n schemas = mergePartialSchemas(schemas);\n }\n\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Total: ${schemaCount} schema(s)`);\n\n // Extract custom type names from plugins for validation\n const customTypeNames: string[] = [];\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypeNames.push(typeDef.name);\n }\n }\n }\n\n // Validate schemas first\n logger.step('Validating schemas...');\n const validationResult = validateSchemas(schemas, {\n customTypes: customTypeNames,\n });\n\n if (!validationResult.valid) {\n logger.error('Schema validation failed. Fix errors before generating.');\n for (const error of validationResult.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n }\n process.exit(2);\n }\n\n // Check for changes by comparing lock file with current schemas\n logger.step('Checking for changes...');\n const lockPath = resolve(rootDir, config.lockFilePath);\n\n const existingLock = await readLockFile(lockPath);\n const currentSnapshots = await buildSchemaSnapshots(schemas);\n\n // Use v2 format for deep diff\n const v2Lock = existingLock && isLockFileV2(existingLock) ? existingLock : null;\n const comparison = compareSchemasDeep(currentSnapshots, v2Lock);\n\n // Check version chain for locked schemas (blockchain-like protection)\n const chainFilePath = resolve(rootDir, VERSION_CHAIN_FILE);\n const versionChain = await readVersionChain(chainFilePath);\n\n if (versionChain && comparison.hasChanges) {\n // Build list of schemas being removed or modified\n const schemaActions: { name: string; action: 'delete' | 'modify' }[] = [];\n\n for (const change of comparison.changes) {\n if (change.changeType === 'removed') {\n schemaActions.push({ name: change.schemaName, action: 'delete' });\n } else if (change.changeType === 'modified') {\n schemaActions.push({ name: change.schemaName, action: 'modify' });\n }\n }\n\n if (schemaActions.length > 0) {\n const lockCheck = checkBulkLockViolation(versionChain, schemaActions);\n\n if (!lockCheck.allowed) {\n logger.newline();\n logger.error('🔒 VERSION LOCK VIOLATION DETECTED');\n logger.error('');\n logger.error('The following schemas are locked in production:');\n for (const name of lockCheck.affectedSchemas) {\n logger.error(` • ${name}`);\n }\n logger.error('');\n logger.error(`Locked in version(s): ${lockCheck.lockedInVersions.join(', ')}`);\n logger.error('');\n logger.error('These schemas CANNOT be modified or deleted.');\n logger.error('This is enforced by the blockchain-like version chain.');\n logger.newline();\n\n throw new OmnifyError(\n lockCheck.reason ?? 'Schema modification blocked by version lock',\n 'E407',\n undefined,\n 'Restore the original schema files or create new schemas instead of modifying locked ones.'\n );\n }\n }\n }\n\n // Validate existing migrations (check for missing/modified files)\n if (existingLock && config.output.laravel?.migrationsPath) {\n const migrationsDir = resolve(rootDir, config.output.laravel.migrationsPath);\n const migrationValidation = await validateMigrations(existingLock, migrationsDir);\n\n // Report validation results\n if (!migrationValidation.valid) {\n logger.newline();\n logger.warn('Migration file issues detected:');\n\n if (migrationValidation.missingFiles.length > 0) {\n logger.error(` Missing files (${migrationValidation.missingFiles.length}):`);\n for (const file of migrationValidation.missingFiles) {\n logger.error(` - ${file}`);\n }\n }\n\n if (migrationValidation.modifiedFiles.length > 0) {\n logger.warn(` Modified files (${migrationValidation.modifiedFiles.length}):`);\n for (const file of migrationValidation.modifiedFiles) {\n logger.warn(` - ${file} (checksum mismatch)`);\n }\n }\n\n logger.newline();\n }\n\n // Report stale migrations if --warn-stale is enabled\n if ((options.warnStale ?? true) && migrationValidation.staleFiles.length > 0) {\n logger.newline();\n logger.warn('⚠️ Stale migrations detected (old timestamp, not in lock file):');\n for (const file of migrationValidation.staleFiles) {\n logger.warn(` - ${file}`);\n }\n logger.warn(' These may be from merged branches. Review before running migrate.');\n logger.newline();\n }\n\n // Check mode: exit with status based on validation\n if (options.check) {\n logger.newline();\n logger.step('CI Check Mode Results:');\n logger.info(` Schemas: ${schemaCount}`);\n logger.info(` Tracked migrations: ${migrationValidation.totalTracked}`);\n logger.info(` Migrations on disk: ${migrationValidation.totalOnDisk}`);\n logger.info(` Schema changes: ${comparison.changes.length}`);\n\n const hasIssues = !migrationValidation.valid || comparison.hasChanges;\n\n if (hasIssues) {\n logger.newline();\n if (comparison.hasChanges) {\n logger.error('❌ Schema changes detected - run \"npx omnify generate\" to update migrations');\n }\n if (migrationValidation.missingFiles.length > 0) {\n logger.error('❌ Missing migration files - regenerate or restore from git');\n }\n if (migrationValidation.modifiedFiles.length > 0) {\n logger.warn('⚠️ Modified migration files - may cause inconsistencies');\n }\n process.exit(1);\n } else {\n logger.success('✅ All migrations in sync');\n return;\n }\n }\n\n // Regenerate missing CREATE migration files\n if (migrationValidation.missingFiles.length > 0 && config.output.laravel) {\n const toRegenerate = getMigrationsToRegenerate(existingLock, migrationValidation.missingFiles);\n\n if (toRegenerate.length > 0) {\n const createMigrations = toRegenerate.filter(m => m.type === 'create');\n const alterMigrations = toRegenerate.filter(m => m.type === 'alter' || m.type === 'drop');\n\n if (createMigrations.length > 0) {\n logger.info(`Regenerating ${createMigrations.length} missing CREATE migration(s) with original timestamps...`);\n const migrationsDir = resolve(rootDir, config.output.laravel.migrationsPath);\n\n // Extract custom types for generation\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const [typeName, typeDef] of Object.entries(plugin.types)) {\n customTypesMap.set(typeName, typeDef);\n }\n }\n }\n\n for (const migData of createMigrations) {\n // Find schema(s) for this migration\n const migrationSchemas = Object.fromEntries(\n Object.entries(schemas).filter(([name]) => migData.schemas.includes(name))\n ) as SchemaCollection;\n\n if (Object.keys(migrationSchemas).length === 0) {\n logger.warn(` Cannot regenerate ${migData.fileName}: schema not found`);\n continue;\n }\n\n // Regenerate with original timestamp\n const regenerated = generateMigrations(migrationSchemas, {\n timestamp: migData.timestamp,\n customTypes: customTypesMap,\n });\n\n for (const mig of regenerated) {\n // Use the original filename to maintain consistency\n const filePath = resolve(migrationsDir, migData.fileName);\n writeFileSync(filePath, mig.content);\n logger.success(` Regenerated: ${migData.fileName}`);\n }\n }\n }\n\n if (alterMigrations.length > 0) {\n logger.warn(`Cannot regenerate ${alterMigrations.length} ALTER/DROP migration(s) - original change data not available.`);\n logger.warn(' Please restore these files from git or reset migrations with: npx omnify reset');\n for (const m of alterMigrations) {\n logger.warn(` - ${m.fileName}`);\n }\n }\n }\n }\n }\n\n // Only skip if no changes AND no outputs to regenerate\n // Models/TypeScript with overwrite: true should always be regenerated\n const skipMigrations = !comparison.hasChanges && !options.force;\n const pluginsHaveGenerators = config.plugins.some(p => p.generators && p.generators.length > 0);\n const hasTypescriptOutput = !!config.output.typescript;\n\n if (skipMigrations && !config.output.laravel?.modelsPath && !pluginsHaveGenerators && !hasTypescriptOutput) {\n logger.success('No changes to generate');\n return;\n }\n\n if (comparison.hasChanges) {\n logger.debug(`Detected ${comparison.changes.length} change(s)`);\n for (const change of comparison.changes) {\n logSchemaChange(change, options.verbose ?? false);\n }\n }\n\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n let modelsGenerated = 0;\n let factoriesGenerated = 0;\n\n // Check if plugins have generators\n const usePlugins = hasPluginGenerators(config.plugins);\n\n // Extract custom types from plugins for generators\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypesMap.set(typeDef.name, typeDef);\n }\n }\n }\n\n // Extract plugin enums for TypeScript generation\n const pluginEnumsMap = new Map<string, import('@famgia/omnify-types').PluginEnumDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.enums) {\n for (const enumDef of plugin.enums) {\n pluginEnumsMap.set(enumDef.name, enumDef);\n }\n }\n }\n\n if (usePlugins) {\n // Use plugin system for generation\n logger.step('Running plugin generators...');\n const counts = await runPluginGeneration(\n config.plugins,\n schemas,\n rootDir,\n options.verbose ?? false,\n comparison.changes\n );\n migrationsGenerated = counts.migrations;\n typesGenerated = counts.types;\n\n if (counts.migrations > 0) {\n logger.success(`Generated ${counts.migrations} migration(s)`);\n }\n if (counts.types > 0) {\n logger.success(`Generated ${counts.types} TypeScript file(s)`);\n }\n if (counts.models > 0) {\n logger.success(`Generated ${counts.models} model(s)`);\n }\n if (counts.factories > 0) {\n logger.success(`Generated ${counts.factories} factory(ies)`);\n }\n if (counts.other > 0) {\n logger.success(`Generated ${counts.other} other file(s)`);\n }\n\n // Generate TypeScript from output.typescript config (even when using plugins)\n if (!options.migrationsOnly && config.output.typescript && typesGenerated === 0) {\n logger.step('Generating TypeScript types...');\n\n const tsConfig2 = config.output.typescript as {\n path: string;\n schemasDir?: string;\n enumDir?: string;\n generateRules?: boolean;\n validationTemplates?: Record<string, Record<string, string>>;\n };\n\n // Resolve paths: basePath + subdirectories\n const basePath2 = resolve(rootDir, tsConfig2.path);\n const schemasDir2 = resolve(basePath2, tsConfig2.schemasDir ?? 'schemas');\n const enumDir2 = resolve(basePath2, tsConfig2.enumDir ?? 'enum');\n\n // Generated files go to node_modules/@omnify-base (auto-generated)\n const omnifyBaseDir2 = resolve(rootDir, 'node_modules/@omnify-base');\n const pluginEnumDir2 = resolve(omnifyBaseDir2, 'enum');\n const baseSchemasDir2 = resolve(omnifyBaseDir2, 'schemas');\n\n // Calculate enum import prefix (relative path from schemas to enum)\n const enumImportPrefix2 = relative(schemasDir2, enumDir2).replace(/\\\\/g, '/');\n\n // Create directories\n if (!existsSync(schemasDir2)) {\n mkdirSync(schemasDir2, { recursive: true });\n logger.debug(`Created directory: ${schemasDir2}`);\n }\n if (!existsSync(enumDir2)) {\n mkdirSync(enumDir2, { recursive: true });\n logger.debug(`Created directory: ${enumDir2}`);\n }\n if (!existsSync(pluginEnumDir2)) {\n mkdirSync(pluginEnumDir2, { recursive: true });\n logger.debug(`Created directory: ${pluginEnumDir2}`);\n }\n if (!existsSync(baseSchemasDir2)) {\n mkdirSync(baseSchemasDir2, { recursive: true });\n logger.debug(`Created directory: ${baseSchemasDir2}`);\n }\n\n // Create package.json for @omnify-base package\n const omnifyPkgJson2 = resolve(omnifyBaseDir2, 'package.json');\n if (!existsSync(omnifyPkgJson2)) {\n writeFileSync(omnifyPkgJson2, JSON.stringify({\n name: '@omnify-base',\n version: '0.0.0',\n private: true,\n exports: {\n './enum/*': './enum/*.js',\n './schemas/*': './schemas/*.js',\n },\n }, null, 2));\n }\n\n // Enable multiLocale if locale config has multiple locales\n const isMultiLocale = config.locale && config.locale.locales && config.locale.locales.length > 1;\n const typeFiles = generateTypeScript(schemas, {\n customTypes: customTypesMap,\n pluginEnums: pluginEnumsMap,\n localeConfig: config.locale,\n multiLocale: isMultiLocale,\n generateRules: tsConfig2.generateRules ?? true,\n validationTemplates: tsConfig2.validationTemplates,\n enumImportPrefix: enumImportPrefix2,\n pluginEnumImportPrefix: '@omnify-base/enum',\n baseImportPrefix: '@omnify-base/schemas',\n schemaEnumImportPrefix: '@omnify/enum', // Absolute path for node_modules base files\n });\n\n for (const file of typeFiles) {\n // Determine output directory based on file category\n let outputDir2: string;\n let outputFilePath2 = file.filePath;\n\n if (file.category === 'plugin-enum') {\n outputDir2 = pluginEnumDir2;\n } else if (file.category === 'base') {\n // Base files go to node_modules/@omnify-base/schemas/\n outputDir2 = baseSchemasDir2;\n // Remove 'base/' prefix from filePath since we're already in schemas/\n outputFilePath2 = file.filePath.replace(/^base\\//, '');\n } else if (file.category === 'enum') {\n outputDir2 = enumDir2;\n } else {\n outputDir2 = schemasDir2;\n }\n const filePath = resolve(outputDir2, outputFilePath2);\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n // Skip if file exists and shouldn't be overwritten\n if (!file.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${file.filePath}`);\n continue;\n }\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.filePath}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n\n // Auto-configure @omnify alias (silent mode - only log if changes made)\n const aliasResult = configureOmnifyAlias(rootDir, tsConfig2.path, true);\n if (aliasResult.viteUpdated) {\n logger.success('Auto-configured @omnify alias in vite.config');\n }\n if (aliasResult.tsconfigUpdated) {\n logger.success('Auto-configured @omnify/* path in tsconfig.json');\n }\n\n // Configure @omnify-base alias (always needed for base schemas, enums, common, i18n)\n const pluginAliasResult = addPluginEnumAlias(rootDir);\n if (pluginAliasResult.updated) {\n logger.success('Auto-configured @omnify-base alias in vite.config');\n }\n const pluginPathResult = addPluginEnumTsconfigPath(rootDir);\n if (pluginPathResult.updated) {\n logger.success('Auto-configured @omnify-base/* path in tsconfig.json');\n }\n\n // Generate TypeScript AI guides if needed\n if (shouldGenerateTypescriptAIGuides(rootDir)) {\n const tsAIResult = generateTypescriptAIGuides(rootDir, {\n typescriptPath: tsConfig2.path,\n });\n const tsClaudeTotal = tsAIResult.claudeGuides + tsAIResult.claudeChecklists;\n if (tsClaudeTotal > 0 || tsAIResult.cursorRules > 0) {\n logger.debug(`Generated ${tsClaudeTotal} React Claude files, ${tsAIResult.cursorRules} Cursor rules`);\n }\n }\n }\n } else {\n // Use direct generation (legacy mode)\n const counts = runDirectGeneration(schemas, config, rootDir, options, comparison.changes);\n migrationsGenerated = counts.migrations;\n typesGenerated = counts.types;\n modelsGenerated = counts.models;\n factoriesGenerated = counts.factories;\n }\n\n // Update lock file (v2 with snapshots)\n logger.step('Updating lock file...');\n const newLockFile = updateLockFile(existingLock, currentSnapshots, config.database.driver);\n await writeLockFile(lockPath, newLockFile);\n logger.debug(`Updated: ${config.lockFilePath}`);\n\n // Save version history only when there are actual schema changes\n if (comparison.hasChanges) {\n logger.step('Saving version history...');\n const versionStore = createVersionStore({ baseDir: rootDir, maxVersions: 100 });\n const versionSnapshot = schemasToVersionSnapshot(schemas);\n const versionChanges: VersionChange[] = comparison.changes.flatMap(schemaChangeToVersionChange);\n\n // Get migration file name for version description\n const migrationFileName = migrationsGenerated > 0\n ? `${migrationsGenerated} migration(s)`\n : undefined;\n\n try {\n const newVersion = await versionStore.createVersion(\n versionSnapshot,\n versionChanges,\n {\n driver: config.database.driver,\n ...(migrationFileName !== undefined && { migration: migrationFileName }),\n description: `Generated ${comparison.changes.length} change(s)`,\n }\n );\n logger.debug(`Created version ${newVersion.version}`);\n } catch (versionError) {\n // Version history is optional, log but don't fail\n logger.debug(`Could not save version history: ${(versionError as Error).message}`);\n }\n }\n\n // Generate AI guides\n try {\n const guidesWritten = generateAIGuides(rootDir, config.plugins);\n if (guidesWritten > 0) {\n logger.debug(`Updated ${guidesWritten} AI guide file(s)`);\n }\n } catch (guideError) {\n // AI guides are optional, log but don't fail\n logger.debug(`Could not generate AI guides: ${(guideError as Error).message}`);\n }\n\n logger.newline();\n logger.success('Generation complete!');\n\n if (migrationsGenerated > 0 && config.output.laravel) {\n logger.info(` Migrations: ${config.output.laravel.migrationsPath}/`);\n }\n if (modelsGenerated > 0 && config.output.laravel?.modelsPath) {\n logger.info(` Models: ${config.output.laravel.modelsPath}/`);\n }\n if (typesGenerated > 0 && config.output.typescript) {\n logger.info(` Types: ${config.output.typescript.path}/`);\n }\n}\n\n/**\n * Registers the generate command.\n */\nexport function registerGenerateCommand(program: Command): void {\n program\n .command('generate')\n .description('Generate Laravel migrations and TypeScript types')\n .option('-v, --verbose', 'Show detailed output')\n .option('--migrations-only', 'Only generate migrations')\n .option('--types-only', 'Only generate TypeScript types')\n .option('-f, --force', 'Generate even if no changes detected')\n .option('--check', 'CI mode: check if migrations are in sync without generating (exits with code 1 if out of sync)')\n .option('--no-warn-stale', 'Disable stale migration warnings')\n .action(async (options: GenerateOptions) => {\n try {\n await runGenerate(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - AI Guide Generator\n *\n * Generates base Omnify documentation (CLAUDE.md + core guides).\n * Plugin-specific guides are generated by respective plugins.\n */\n\nimport { existsSync, writeFileSync, mkdirSync, readdirSync, readFileSync, copyFileSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { OmnifyPlugin } from '@famgia/omnify-types';\n\n/**\n * CLAUDE.md content for project root\n * Uses Claude Code's official memory format with @imports\n */\nconst CLAUDE_MD = `# Omnify Project\n\nThis project uses **Omnify** for schema-driven code generation.\n\n## Quick Reference\n\n- **Schema Guide**: @.claude/omnify/guides/omnify/schema-guide.md\n- **Config Guide**: @.claude/omnify/guides/omnify/config-guide.md\n\n## Commands\n\n\\`\\`\\`bash\nnpx omnify generate # Generate code from schemas\nnpx omnify validate # Validate schemas\nphp artisan migrate # Run database migrations\n\\`\\`\\`\n\n## Critical Rules\n\n### ⛔ DO NOT EDIT Auto-Generated Files\n- \\`database/migrations/omnify/**\\` - Regenerated on \\`npx omnify generate\\`\n- \\`app/Models/OmnifyBase/**\\` - Base models (extend, don't edit)\n- \\`app/Http/Requests/OmnifyBase/**\\` - Base requests\n- \\`app/Http/Resources/OmnifyBase/**\\` - Base resources\n\n### ✅ Schema-First Workflow\n1. Edit YAML schema in \\`schemas/\\`\n2. Run \\`npx omnify generate\\`\n3. Run \\`php artisan migrate\\`\n\n**NEVER use \\`php artisan make:migration\\`** - Always use schemas!\n\n## Documentation Structure\n\n\\`\\`\\`\n.claude/\n├── CLAUDE.md # This file (root pointer)\n├── rules/ # Claude Code rules (path-specific)\n│ └── omnify/*.md\n└── omnify/ # Detailed guides\n ├── guides/\n │ ├── omnify/ # Schema & config docs\n │ ├── laravel/ # Laravel patterns\n │ └── react/ # React patterns\n ├── workflows/ # Step-by-step workflows\n └── agents/ # AI agent prompts\n\\`\\`\\`\n\n## Individual Preferences\n\nAdd your personal preferences in \\`CLAUDE.local.md\\` (gitignored).\n`;\n\n/**\n * Copies core Omnify guides (schema-guide, config-guide) to .claude/omnify/guides/omnify/\n */\nfunction copyOmnifyGuides(rootDir: string): number {\n let filesWritten = 0;\n\n // Find @famgia/omnify package stubs directory\n const omnifyPkgPaths = [\n resolve(rootDir, 'node_modules', '@famgia', 'omnify', 'stubs', 'ai-guides', 'omnify'),\n resolve(rootDir, 'node_modules', '.pnpm', '@famgia+omnify@*', 'node_modules', '@famgia', 'omnify', 'stubs', 'ai-guides', 'omnify'),\n ];\n\n // Also check if we're in monorepo (packages/omnify/stubs)\n let stubsDir: string | null = null;\n for (const pkgPath of omnifyPkgPaths) {\n // Handle glob-like path for pnpm\n if (pkgPath.includes('*')) {\n const parentDir = dirname(dirname(pkgPath));\n if (existsSync(parentDir)) {\n const entries = readdirSync(parentDir);\n for (const entry of entries) {\n if (entry.startsWith('@famgia+omnify@')) {\n const testPath = join(parentDir, entry, 'node_modules', '@famgia', 'omnify', 'stubs', 'ai-guides', 'omnify');\n if (existsSync(testPath)) {\n stubsDir = testPath;\n break;\n }\n }\n }\n }\n } else if (existsSync(pkgPath)) {\n stubsDir = pkgPath;\n break;\n }\n }\n\n if (!stubsDir) {\n // Fallback: check via require.resolve\n try {\n const omnifyPath = dirname(require.resolve('@famgia/omnify/package.json', { paths: [rootDir] }));\n const testPath = join(omnifyPath, 'stubs', 'ai-guides', 'omnify');\n if (existsSync(testPath)) {\n stubsDir = testPath;\n }\n } catch {\n // Package not found\n }\n }\n\n if (!stubsDir) {\n return 0; // No stubs found\n }\n\n // Destination: .claude/omnify/guides/omnify/\n const destDir = resolve(rootDir, '.claude', 'omnify', 'guides', 'omnify');\n mkdirSync(destDir, { recursive: true });\n\n // Copy all .stub files\n const files = readdirSync(stubsDir).filter(f => f.endsWith('.stub'));\n for (const file of files) {\n const srcPath = join(stubsDir, file);\n const destPath = join(destDir, file.replace('.stub', ''));\n\n const content = readFileSync(srcPath, 'utf8');\n writeFileSync(destPath, content);\n filesWritten++;\n }\n\n return filesWritten;\n}\n\n/**\n * Generates CLAUDE.md pointer file and copies core Omnify guides.\n * Plugin-specific guides are generated by respective plugins.\n *\n * Note: Always overwrites files to ensure:\n * 1. Deleted files are restored\n * 2. Updated content from omnify packages is synced\n */\nexport function generateAIGuides(\n rootDir: string,\n _plugins: readonly OmnifyPlugin[]\n): number {\n let filesWritten = 0;\n\n // Always write CLAUDE.md (overwrite to sync updates)\n const claudeMdPath = resolve(rootDir, 'CLAUDE.md');\n writeFileSync(claudeMdPath, CLAUDE_MD);\n filesWritten++;\n\n // Copy core Omnify guides (schema-guide.md, config-guide.md)\n filesWritten += copyOmnifyGuides(rootDir);\n\n return filesWritten;\n}\n","/**\n * @famgia/omnify-cli - Reset Command\n *\n * Cleans up generated files: OmnifyBase models, migrations, and lock files.\n */\n\nimport { existsSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport type { Command } from 'commander';\nimport { loadConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Reset command options.\n */\ninterface ResetOptions {\n verbose?: boolean;\n yes?: boolean;\n}\n\n/**\n * Prompts user for confirmation.\n */\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\n/**\n * Recursively counts files in a directory.\n */\nfunction countFiles(dir: string): number {\n if (!existsSync(dir)) return 0;\n\n let count = 0;\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n count += countFiles(fullPath);\n } else {\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Recursively deletes a directory.\n */\nfunction deleteDir(dir: string, verbose: boolean): number {\n if (!existsSync(dir)) return 0;\n\n const count = countFiles(dir);\n rmSync(dir, { recursive: true, force: true });\n\n if (verbose) {\n logger.debug(`Deleted: ${dir}`);\n }\n\n return count;\n}\n\n/**\n * Deletes files matching a pattern in a directory.\n */\nfunction deleteFilesInDir(dir: string, pattern: RegExp, verbose: boolean): number {\n if (!existsSync(dir)) return 0;\n\n let count = 0;\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isFile() && pattern.test(entry)) {\n rmSync(fullPath);\n if (verbose) {\n logger.debug(`Deleted: ${fullPath}`);\n }\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Runs the reset command.\n */\nexport async function runReset(options: ResetOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Reset Omnify Generated Files');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Determine paths to clean\n const paths: { name: string; path: string; type: 'dir' | 'file' | 'files'; pattern?: RegExp }[] = [];\n\n // Common OmnifyBase locations (check both with and without backend prefix)\n // Also check legacy 'Generated' paths for cleanup\n const omnifyBasePaths = [\n { name: 'OmnifyBase models', paths: ['app/Models/OmnifyBase', 'backend/app/Models/OmnifyBase'] },\n { name: 'OmnifyBase requests', paths: ['app/Http/Requests/OmnifyBase', 'backend/app/Http/Requests/OmnifyBase'] },\n { name: 'OmnifyBase resources', paths: ['app/Http/Resources/OmnifyBase', 'backend/app/Http/Resources/OmnifyBase'] },\n ];\n\n // Legacy 'Generated' paths (for cleanup of old installations)\n const legacyGeneratedPaths = [\n { name: 'Legacy Generated models', paths: ['app/Models/Generated', 'backend/app/Models/Generated'] },\n { name: 'Legacy Generated requests', paths: ['app/Http/Requests/Generated', 'backend/app/Http/Requests/Generated'] },\n { name: 'Legacy Generated resources', paths: ['app/Http/Resources/Generated', 'backend/app/Http/Resources/Generated'] },\n ];\n\n for (const { name, paths: relPaths } of omnifyBasePaths) {\n for (const relPath of relPaths) {\n const omnifyBasePath = resolve(rootDir, relPath);\n if (existsSync(omnifyBasePath)) {\n paths.push({ name, path: omnifyBasePath, type: 'dir' });\n break; // Only add the first match for each type\n }\n }\n }\n\n // Clean up legacy Generated paths\n for (const { name, paths: relPaths } of legacyGeneratedPaths) {\n for (const relPath of relPaths) {\n const legacyPath = resolve(rootDir, relPath);\n if (existsSync(legacyPath)) {\n paths.push({ name, path: legacyPath, type: 'dir' });\n break;\n }\n }\n }\n\n // Common migration locations\n const migrationPaths = [\n 'database/migrations/omnify',\n 'backend/database/migrations/omnify',\n ];\n\n for (const relPath of migrationPaths) {\n const migrationsPath = resolve(rootDir, relPath);\n if (existsSync(migrationsPath)) {\n paths.push({\n name: 'Omnify migrations',\n path: migrationsPath,\n type: 'files',\n pattern: /\\.php$/,\n });\n break; // Only add the first match\n }\n }\n\n // Also check config.output.laravel if available\n const laravelConfig = config.output.laravel;\n if (laravelConfig?.modelsPath) {\n const modelsPath = resolve(rootDir, laravelConfig.modelsPath);\n const omnifyBasePath = join(modelsPath, 'OmnifyBase');\n if (existsSync(omnifyBasePath) && !paths.some(p => p.path === omnifyBasePath)) {\n paths.push({ name: 'OmnifyBase models', path: omnifyBasePath, type: 'dir' });\n }\n }\n\n if (laravelConfig?.migrationsPath) {\n const migrationsPath = resolve(rootDir, laravelConfig.migrationsPath);\n if (existsSync(migrationsPath) && !paths.some(p => p.path === migrationsPath)) {\n paths.push({\n name: 'Omnify migrations',\n path: migrationsPath,\n type: 'files',\n pattern: /\\.php$/,\n });\n }\n }\n\n // Clean up package directories from additionalSchemaPaths\n if (config.additionalSchemaPaths) {\n for (const additionalPath of config.additionalSchemaPaths) {\n const pkgOutput = additionalPath.output?.laravel;\n if (pkgOutput?.base) {\n const pkgBase = resolve(rootDir, pkgOutput.base);\n const pkgName = additionalPath.namespace ?? 'Package';\n\n // OmnifyBase models in package\n const pkgOmnifyBase = join(pkgBase, pkgOutput.baseModelsPath ?? 'src/Models/OmnifyBase');\n if (existsSync(pkgOmnifyBase) && !paths.some(p => p.path === pkgOmnifyBase)) {\n paths.push({ name: `${pkgName} OmnifyBase`, path: pkgOmnifyBase, type: 'dir' });\n }\n\n // Legacy Generated models in package\n const pkgGenerated = join(pkgBase, 'src/Models/Generated');\n if (existsSync(pkgGenerated) && !paths.some(p => p.path === pkgGenerated)) {\n paths.push({ name: `${pkgName} Legacy Generated`, path: pkgGenerated, type: 'dir' });\n }\n\n // Package migrations\n const pkgMigrations = join(pkgBase, pkgOutput.migrationsPath ?? 'database/migrations');\n if (existsSync(pkgMigrations) && !paths.some(p => p.path === pkgMigrations)) {\n paths.push({\n name: `${pkgName} migrations`,\n path: pkgMigrations,\n type: 'dir',\n });\n }\n\n // Package providers\n const pkgProviders = join(pkgBase, pkgOutput.providersPath ?? 'src/Providers');\n if (existsSync(pkgProviders) && !paths.some(p => p.path === pkgProviders)) {\n paths.push({ name: `${pkgName} Providers`, path: pkgProviders, type: 'dir' });\n }\n\n // Package factories\n const pkgFactories = join(pkgBase, pkgOutput.factoriesPath ?? 'database/factories');\n if (existsSync(pkgFactories) && !paths.some(p => p.path === pkgFactories)) {\n paths.push({ name: `${pkgName} Factories`, path: pkgFactories, type: 'dir' });\n }\n }\n }\n }\n\n // TypeScript types - only delete auto-generated subdirectories, not user-editable files\n // Structure: models/base/* (auto), models/enum/* (auto), models/rules/* (auto)\n // Keep: models/*.ts (user-editable)\n const typescriptPath = config.output.typescript?.path;\n const tsBasePath = typescriptPath ? resolve(rootDir, typescriptPath) : null;\n\n // Check common TypeScript locations if not in config\n const commonTsPaths = [\n 'resources/ts/omnify',\n 'resources/ts/omnify/schemas',\n 'resources/ts/types/models',\n 'frontend/src/types/model',\n 'frontend/src/types/models',\n 'src/types/models',\n ];\n\n let foundTsPath = tsBasePath;\n if (!foundTsPath || !existsSync(foundTsPath)) {\n for (const relPath of commonTsPaths) {\n const tsPath = resolve(rootDir, relPath);\n if (existsSync(tsPath)) {\n foundTsPath = tsPath;\n break;\n }\n }\n }\n\n if (foundTsPath && existsSync(foundTsPath)) {\n // Delete auto-generated subdirectories\n // Note: 'components' is excluded - it may contain custom user components\n const autoGeneratedDirs = ['base', 'enum', 'rules', 'hooks', 'lib'];\n for (const subDir of autoGeneratedDirs) {\n const subPath = join(foundTsPath, subDir);\n if (existsSync(subPath)) {\n paths.push({ name: `TypeScript ${subDir}`, path: subPath, type: 'dir' });\n }\n }\n // Delete auto-generated files at root level\n const autoGeneratedFiles = ['common.ts', 'index.ts', 'i18n.ts'];\n for (const fileName of autoGeneratedFiles) {\n const filePath = join(foundTsPath, fileName);\n if (existsSync(filePath)) {\n paths.push({ name: `TypeScript ${fileName}`, path: filePath, type: 'file' });\n }\n }\n }\n\n // Lock files\n const lockFilePath = resolve(rootDir, config.lockFilePath);\n if (existsSync(lockFilePath)) {\n paths.push({ name: 'Lock file', path: lockFilePath, type: 'file' });\n }\n\n // Version history directory (.omnify-versions)\n const versionsDir = resolve(rootDir, '.omnify-versions');\n if (existsSync(versionsDir)) {\n paths.push({ name: 'Version history', path: versionsDir, type: 'dir' });\n }\n\n // Also check for versions inside .omnify directory (but NOT schemas!)\n const omnifyVersionsDir = resolve(rootDir, '.omnify/versions');\n if (existsSync(omnifyVersionsDir)) {\n paths.push({ name: 'Version history (.omnify/versions)', path: omnifyVersionsDir, type: 'dir' });\n }\n\n // Logs directory\n const logsDir = resolve(rootDir, '.omnify/logs');\n if (existsSync(logsDir)) {\n paths.push({ name: 'Logs', path: logsDir, type: 'dir' });\n }\n\n // Check if anything to clean\n if (paths.length === 0) {\n logger.info('Nothing to clean. No generated files found.');\n return;\n }\n\n // Show what will be deleted\n logger.newline();\n logger.warn('The following will be deleted:');\n logger.newline();\n\n for (const item of paths) {\n if (item.type === 'dir') {\n const count = countFiles(item.path);\n logger.info(` • ${item.name}: ${item.path} (${count} files)`);\n } else if (item.type === 'files' && item.pattern) {\n const count = readdirSync(item.path).filter((f) => item.pattern!.test(f)).length;\n logger.info(` • ${item.name}: ${item.path} (${count} files)`);\n } else {\n logger.info(` • ${item.name}: ${item.path}`);\n }\n }\n\n logger.newline();\n\n // Ask for confirmation\n if (!options.yes) {\n const confirmed = await confirm('Are you sure you want to delete these files?');\n if (!confirmed) {\n logger.info('Reset cancelled.');\n return;\n }\n }\n\n logger.newline();\n logger.step('Deleting files...');\n\n // Delete files\n let totalDeleted = 0;\n\n for (const item of paths) {\n if (item.type === 'dir') {\n const count = deleteDir(item.path, options.verbose ?? false);\n totalDeleted += count;\n logger.info(` ✓ Deleted ${item.name} (${count} files)`);\n } else if (item.type === 'files' && item.pattern) {\n const count = deleteFilesInDir(item.path, item.pattern, options.verbose ?? false);\n totalDeleted += count;\n logger.info(` ✓ Deleted ${item.name} (${count} files)`);\n } else {\n rmSync(item.path, { force: true });\n if (options.verbose) {\n logger.debug(`Deleted: ${item.path}`);\n }\n totalDeleted++;\n logger.info(` ✓ Deleted ${item.name}`);\n }\n }\n\n logger.newline();\n logger.success(`Reset complete! Deleted ${totalDeleted} file(s).`);\n logger.newline();\n logger.info('Run `omnify generate` to regenerate files.');\n}\n\n/**\n * Registers the reset command.\n */\nexport function registerResetCommand(program: Command): void {\n program\n .command('reset')\n .description('Delete all generated files (OmnifyBase, migrations, locks)')\n .option('-v, --verbose', 'Show detailed output')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options: ResetOptions) => {\n try {\n await runReset(options);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Create Laravel Project Command\n *\n * Creates a new Laravel project from the boilerplate template.\n */\n\nimport { execSync, spawn } from 'node:child_process';\nimport { existsSync, rmSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { logger } from '../output/logger.js';\n\n/**\n * Default boilerplate repository URL\n */\nconst BOILERPLATE_REPO = 'https://github.com/omnifyjp/omnify-laravel-boilerplate.git';\n\n/**\n * Check if we're running on Windows\n */\nconst IS_WINDOWS = process.platform === 'win32';\n\n/**\n * Check if git is installed\n */\nfunction checkGit(): boolean {\n try {\n execSync('git --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Docker is installed\n */\nfunction checkDockerInstalled(): boolean {\n try {\n execSync('docker --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Docker daemon is running\n */\nfunction checkDockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore', timeout: 10000 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Show Docker installation instructions based on OS\n */\nfunction showDockerInstallInstructions(): void {\n logger.newline();\n logger.error('Docker is not installed.');\n logger.newline();\n logger.info('Please install Docker:');\n\n if (IS_WINDOWS) {\n logger.info(' 1. Download Docker Desktop from: https://www.docker.com/products/docker-desktop/');\n logger.info(' 2. Run the installer and follow the instructions');\n logger.info(' 3. Make sure WSL 2 is enabled (Docker Desktop will guide you)');\n logger.info(' 4. Restart your computer if prompted');\n logger.info(' 5. Start Docker Desktop');\n } else if (process.platform === 'darwin') {\n logger.info(' 1. Download Docker Desktop from: https://www.docker.com/products/docker-desktop/');\n logger.info(' 2. Or install via Homebrew: brew install --cask docker');\n logger.info(' 3. Start Docker Desktop from Applications');\n } else {\n logger.info(' 1. Install Docker: https://docs.docker.com/engine/install/');\n logger.info(' 2. Install Docker Compose: https://docs.docker.com/compose/install/');\n logger.info(' 3. Start Docker service: sudo systemctl start docker');\n }\n\n logger.newline();\n logger.info('After installing, run the command again.');\n}\n\n/**\n * Show Docker not running instructions based on OS\n */\nfunction showDockerNotRunningInstructions(): void {\n logger.newline();\n logger.error('Docker daemon is not running.');\n logger.newline();\n logger.info('Please start Docker:');\n\n if (IS_WINDOWS) {\n logger.info(' 1. Open Docker Desktop from the Start menu');\n logger.info(' 2. Wait for Docker to fully start (whale icon in system tray becomes steady)');\n logger.info(' 3. If Docker fails to start, try:');\n logger.info(' - Restart your computer');\n logger.info(' - Make sure WSL 2 is properly installed');\n logger.info(' - Check Windows Features: \"Virtual Machine Platform\" and \"WSL\" are enabled');\n } else if (process.platform === 'darwin') {\n logger.info(' 1. Open Docker Desktop from Applications');\n logger.info(' 2. Wait for Docker to fully start (whale icon in menu bar becomes steady)');\n logger.info(' 3. Or start from terminal: open -a Docker');\n } else {\n logger.info(' 1. Start Docker service: sudo systemctl start docker');\n logger.info(' 2. Or: sudo service docker start');\n logger.info(' 3. Check status: docker info');\n }\n\n logger.newline();\n logger.info('After Docker is running, run the command again.');\n}\n\n/**\n * Check Docker prerequisites and provide helpful messages\n * Returns true if Docker is ready, false otherwise\n */\nfunction checkDockerPrerequisites(): boolean {\n if (!checkDockerInstalled()) {\n showDockerInstallInstructions();\n return false;\n }\n\n if (!checkDockerRunning()) {\n showDockerNotRunningInstructions();\n return false;\n }\n\n return true;\n}\n\n/**\n * Entries to remove from .gitignore for consumer projects\n * These are ignored in boilerplate but should be tracked in real projects\n */\nconst GITIGNORE_ENTRIES_TO_REMOVE = [\n // Auto-generated projects (consumers need to track these)\n '# Auto-generated projects',\n 'backend/',\n 'frontend/',\n // Lock files (consumers should track their lock state)\n '# Lock files',\n '.omnify.lock',\n '.omnify/versions/',\n '.omnify/current.lock',\n // Omnify auto-generated docs (consumers should track these)\n '# Omnify auto-generated docs',\n '.cursor/rules/omnify.md',\n '.claude/omnify/',\n];\n\n/**\n * Clean up .gitignore for consumer project\n * Removes entries that should be tracked in consumer projects\n */\nfunction cleanupGitignore(targetDir: string): void {\n const gitignorePath = resolve(targetDir, '.gitignore');\n if (!existsSync(gitignorePath)) return;\n\n const content = readFileSync(gitignorePath, 'utf-8');\n const lines = content.split('\\n');\n\n // Remove entries that consumers should track\n const cleanedLines = lines.filter((line) => {\n const trimmed = line.trim();\n return !GITIGNORE_ENTRIES_TO_REMOVE.includes(trimmed);\n });\n\n // Remove leading empty lines\n while (cleanedLines.length > 0 && cleanedLines[0].trim() === '') {\n cleanedLines.shift();\n }\n\n writeFileSync(gitignorePath, cleanedLines.join('\\n'));\n}\n\n/**\n * Clone the boilerplate repository\n */\nfunction cloneRepo(repo: string, targetDir: string): void {\n logger.step(`Cloning boilerplate from ${repo}...`);\n execSync(`git clone --depth 1 ${repo} \"${targetDir}\"`, { stdio: 'inherit' });\n\n // Remove .git directory to start fresh\n const gitDir = resolve(targetDir, '.git');\n if (existsSync(gitDir)) {\n rmSync(gitDir, { recursive: true, force: true });\n }\n\n // Clean up .gitignore for consumer\n cleanupGitignore(targetDir);\n\n // Initialize new git repository\n execSync('git init', { cwd: targetDir, stdio: 'ignore' });\n logger.success('Repository cloned successfully');\n}\n\n/**\n * Run a command and wait for completion\n */\nfunction runCommand(command: string, targetDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, [], {\n cwd: targetDir,\n shell: true,\n stdio: 'inherit',\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\n/**\n * Run setup script\n */\nasync function runSetup(targetDir: string): Promise<void> {\n // Step 0: Check Docker prerequisites\n logger.step('Checking Docker...');\n if (!checkDockerPrerequisites()) {\n logger.newline();\n logger.info('You can skip setup and run it later:');\n logger.info(' npx @famgia/omnify create-laravel-project <project-name> --skip-setup');\n logger.newline();\n throw new Error('Docker is not available. Please start Docker and try again.');\n }\n logger.success('Docker is running');\n\n // Step 1: Install dependencies\n logger.step('Installing dependencies...');\n await runCommand('pnpm install', targetDir);\n logger.success('Dependencies installed');\n\n // Step 2: Run setup script (boilerplate's setup script auto-detects platform)\n logger.step('Running setup...');\n const setupScript = 'pnpm run setup';\n\n try {\n await runCommand(setupScript, targetDir);\n } catch (error) {\n // Provide helpful error message for Docker-related failures\n logger.newline();\n logger.error('Setup failed. This might be a Docker issue.');\n logger.newline();\n logger.info('Troubleshooting steps:');\n logger.info(' 1. Make sure Docker Desktop is fully started');\n logger.info(' 2. Check Docker status: docker info');\n logger.info(' 3. Check container logs: docker-compose logs');\n\n if (IS_WINDOWS) {\n logger.info(' 4. On Windows, ensure WSL 2 is working: wsl --status');\n logger.info(' 5. Try restarting Docker Desktop');\n }\n\n logger.newline();\n logger.info('To retry setup manually:');\n logger.info(` cd ${targetDir}`);\n logger.info(' pnpm run setup');\n logger.newline();\n\n throw error;\n }\n}\n\n/**\n * Run the create-laravel-project command\n */\nexport async function runCreateProject(\n projectName: string,\n options: { repo?: string; skipSetup?: boolean }\n): Promise<void> {\n const targetDir = resolve(process.cwd(), projectName);\n const repo = options.repo ?? BOILERPLATE_REPO;\n\n // Check if git is available\n if (!checkGit()) {\n logger.error('Git is not installed. Please install git first.');\n process.exit(1);\n }\n\n // Check if target directory already exists\n if (existsSync(targetDir)) {\n logger.error(`Directory \"${projectName}\" already exists.`);\n process.exit(1);\n }\n\n logger.newline();\n logger.info(`Creating new Laravel project: ${projectName}`);\n logger.newline();\n\n let cloneSucceeded = false;\n\n try {\n // Clone the repository\n cloneRepo(repo, targetDir);\n cloneSucceeded = true;\n\n // Run setup if not skipped\n if (!options.skipSetup) {\n process.chdir(targetDir);\n await runSetup(targetDir);\n }\n\n logger.newline();\n logger.success('Project created successfully!');\n logger.newline();\n logger.info('Next steps:');\n logger.info(` cd ${projectName}`);\n if (options.skipSetup) {\n logger.info(' pnpm run setup');\n }\n logger.info(' pnpm run dev');\n logger.newline();\n } catch (error) {\n // Only clean up if clone failed (not if setup failed)\n // This allows users to fix Docker and retry setup manually\n if (!cloneSucceeded && existsSync(targetDir)) {\n rmSync(targetDir, { recursive: true, force: true });\n } else if (cloneSucceeded) {\n logger.newline();\n logger.info('Project files have been kept. You can retry setup after fixing the issue:');\n logger.info(` cd ${projectName}`);\n logger.info(' pnpm run setup');\n logger.newline();\n }\n throw error;\n }\n}\n\n/**\n * Register the create-laravel-project command\n */\nexport function registerCreateProjectCommand(program: Command): void {\n program\n .command('create-laravel-project <project-name>')\n .description('Create a new Laravel project from boilerplate')\n .option('-r, --repo <url>', 'Custom boilerplate repository URL', BOILERPLATE_REPO)\n .option('--skip-setup', 'Skip running the setup script')\n .action(async (projectName: string, options: { repo?: string; skipSetup?: boolean }) => {\n try {\n await runCreateProject(projectName, options);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Deploy Command\n *\n * Locks schema version for production deployment using blockchain-like chain.\n * 一度ロックされたスキーマは変更・削除不可能になる\n */\n\nimport { existsSync, readdirSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, OmnifyError } from '@famgia/omnify-core';\nimport {\n VERSION_CHAIN_FILE,\n readVersionChain,\n deployVersion,\n getChainSummary,\n verifyChain,\n type DeployOptions,\n} from '@famgia/omnify-atlas';\nimport type { ResolvedOmnifyConfig } from '../config/types.js';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Deploy command options.\n */\ninterface DeployCommandOptions {\n verbose?: boolean;\n version?: string;\n environment?: string;\n comment?: string;\n yes?: boolean;\n deployedBy?: string;\n dryRun?: boolean;\n}\n\n/**\n * Interactive confirmation prompt.\n * CI環境では--yesフラグを使用\n */\nasync function confirmDeploy(\n schemaCount: number,\n environment: string,\n version: string\n): Promise<boolean> {\n const { createInterface } = await import('node:readline');\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n logger.newline();\n logger.warn('⚠️ WARNING: This action is IRREVERSIBLE!');\n logger.warn('');\n logger.warn(` Environment: ${environment}`);\n logger.warn(` Version: ${version}`);\n logger.warn(` Schemas: ${schemaCount} file(s)`);\n logger.warn('');\n logger.warn(' Once locked, these schema files CANNOT be:');\n logger.warn(' • Deleted');\n logger.warn(' • Modified (content hash is recorded)');\n logger.warn('');\n logger.warn(' This creates an immutable blockchain-like record.');\n logger.newline();\n\n rl.question(' Type \"LOCK\" to confirm: ', (answer) => {\n rl.close();\n resolve(answer.trim().toUpperCase() === 'LOCK');\n });\n });\n}\n\n/**\n * Collects schema files from directory.\n */\nasync function collectSchemaFiles(\n schemasDir: string\n): Promise<{ name: string; relativePath: string; filePath: string }[]> {\n const files: { name: string; relativePath: string; filePath: string }[] = [];\n\n const schemas = await loadSchemas(schemasDir);\n\n for (const [name, schema] of Object.entries(schemas)) {\n files.push({\n name,\n relativePath: schema.relativePath,\n filePath: schema.filePath,\n });\n }\n\n return files;\n}\n\n/**\n * Runs the deploy command.\n */\nexport async function runDeploy(options: DeployCommandOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Deploy Version Lock');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config\n validateConfig(config, rootDir);\n\n // Resolve paths\n const schemasDir = resolve(rootDir, config.schemasDir);\n const chainFilePath = resolve(rootDir, VERSION_CHAIN_FILE);\n\n // Check if schemas directory exists\n if (!existsSync(schemasDir)) {\n throw new OmnifyError(\n `Schemas directory not found: ${schemasDir}`,\n 'E003',\n undefined,\n 'Make sure the schemasDir in omnify.config.ts is correct.'\n );\n }\n\n // Collect schema files\n logger.step('Collecting schema files...');\n const schemaFiles = await collectSchemaFiles(schemasDir);\n\n if (schemaFiles.length === 0) {\n throw new OmnifyError(\n 'No schema files found',\n 'E003',\n undefined,\n 'Create schema files in your schemas directory before deploying.'\n );\n }\n\n logger.info(`Found ${schemaFiles.length} schema file(s)`);\n\n // Load existing chain\n const existingChain = await readVersionChain(chainFilePath);\n if (existingChain) {\n const summary = getChainSummary(existingChain);\n logger.debug(`Existing chain: ${summary.blockCount} block(s), ${summary.schemaCount} schema(s)`);\n\n // Verify chain integrity before adding new block\n logger.step('Verifying chain integrity...');\n const verification = await verifyChain(existingChain, schemasDir);\n\n if (!verification.valid) {\n logger.error('Chain integrity verification failed!');\n\n if (verification.corruptedBlocks.length > 0) {\n logger.error('');\n logger.error('Corrupted blocks:');\n for (const block of verification.corruptedBlocks) {\n logger.error(` • ${block.version}: ${block.reason}`);\n }\n }\n\n if (verification.tamperedSchemas.length > 0) {\n logger.error('');\n logger.error('Tampered schemas (modified since lock):');\n for (const schema of verification.tamperedSchemas) {\n logger.error(` • ${schema.schemaName} (locked in ${schema.lockedInVersion})`);\n }\n }\n\n if (verification.deletedLockedSchemas.length > 0) {\n logger.error('');\n logger.error('Deleted locked schemas:');\n for (const schema of verification.deletedLockedSchemas) {\n logger.error(` • ${schema.schemaName} (locked in ${schema.lockedInVersion})`);\n }\n }\n\n throw new OmnifyError(\n 'Cannot deploy: chain integrity compromised',\n 'E406',\n undefined,\n 'Restore deleted/modified files to match the locked state, or contact support.'\n );\n }\n\n logger.success('Chain integrity verified ✓');\n } else {\n logger.info('Creating new version chain (first deployment)');\n }\n\n // Determine version and environment\n const environment = options.environment ?? 'production';\n const version = options.version ?? generateVersionFromTimestamp();\n\n // Dry run mode\n if (options.dryRun) {\n logger.newline();\n logger.info('DRY RUN - No changes will be made');\n logger.info('');\n logger.info(`Would create block:`);\n logger.info(` Version: ${version}`);\n logger.info(` Environment: ${environment}`);\n logger.info(` Schemas: ${schemaFiles.length} file(s)`);\n logger.info('');\n for (const file of schemaFiles) {\n logger.info(` • ${file.name} (${file.relativePath})`);\n }\n return;\n }\n\n // Confirmation prompt (unless --yes is provided)\n if (!options.yes) {\n const confirmed = await confirmDeploy(schemaFiles.length, environment, version);\n if (!confirmed) {\n logger.newline();\n logger.info('Deployment cancelled.');\n return;\n }\n }\n\n // Deploy\n logger.step('Creating version lock...');\n\n const deployOptions: DeployOptions = {\n version,\n environment,\n deployedBy: options.deployedBy ?? process.env.USER ?? 'unknown',\n comment: options.comment,\n skipConfirmation: true,\n };\n\n const result = await deployVersion(chainFilePath, schemasDir, schemaFiles, deployOptions);\n\n if (!result.success) {\n throw new OmnifyError(\n result.error ?? 'Deployment failed',\n 'E408'\n );\n }\n\n // Success output\n logger.newline();\n logger.success('🔒 Version locked successfully!');\n logger.newline();\n\n if (result.block) {\n logger.info(` Version: ${result.block.version}`);\n logger.info(` Block Hash: ${result.block.blockHash.substring(0, 16)}...`);\n logger.info(` Locked At: ${result.block.lockedAt}`);\n logger.info(` Environment: ${result.block.environment}`);\n logger.info(` Schemas: ${result.block.schemas.length} file(s)`);\n }\n\n if (result.addedSchemas.length > 0) {\n logger.newline();\n logger.info(' New schemas locked:');\n for (const name of result.addedSchemas) {\n logger.info(` + ${name}`);\n }\n }\n\n if (result.warnings.length > 0) {\n logger.newline();\n logger.warn(' Warnings:');\n for (const warning of result.warnings) {\n logger.warn(` ⚠ ${warning}`);\n }\n }\n\n logger.newline();\n logger.info(` Chain file: ${VERSION_CHAIN_FILE}`);\n logger.info(' This file should be committed to version control.');\n}\n\n/**\n * Generates a version string from current timestamp.\n */\nfunction generateVersionFromTimestamp(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n const hour = String(now.getHours()).padStart(2, '0');\n const minute = String(now.getMinutes()).padStart(2, '0');\n const second = String(now.getSeconds()).padStart(2, '0');\n return `v${year}.${month}.${day}-${hour}${minute}${second}`;\n}\n\n/**\n * Registers the deploy command.\n */\nexport function registerDeployCommand(program: Command): void {\n program\n .command('deploy')\n .description('Lock schema version for production (blockchain-like immutable record)')\n .option('-v, --verbose', 'Show detailed output')\n .option('--version <version>', 'Version name (e.g., v1.0.0, default: auto-generated)')\n .option('-e, --environment <env>', 'Deployment environment (default: production)', 'production')\n .option('-c, --comment <comment>', 'Deployment comment')\n .option('-y, --yes', 'Skip confirmation prompt (for CI/CD)')\n .option('--deployed-by <name>', 'Deployer name (default: $USER)')\n .option('--dry-run', 'Show what would be locked without making changes')\n .action(async (options: DeployCommandOptions) => {\n try {\n await runDeploy(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Verify Command\n *\n * Verifies version chain integrity and schema file states.\n * ブロックチェーンの整合性とスキーマファイルの状態を検証\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n VERSION_CHAIN_FILE,\n readVersionChain,\n verifyChain,\n getChainSummary,\n getLockedSchemas,\n} from '@famgia/omnify-atlas';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Verify command options.\n */\ninterface VerifyCommandOptions {\n verbose?: boolean;\n showAll?: boolean;\n json?: boolean;\n}\n\n/**\n * Runs the verify command.\n */\nexport async function runVerify(options: VerifyCommandOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n if (!options.json) {\n logger.header('Verify Version Chain');\n }\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config\n validateConfig(config, rootDir);\n\n // Resolve paths\n const schemasDir = resolve(rootDir, config.schemasDir);\n const chainFilePath = resolve(rootDir, VERSION_CHAIN_FILE);\n\n // Check if chain file exists\n if (!existsSync(chainFilePath)) {\n if (options.json) {\n console.log(JSON.stringify({\n valid: true,\n message: 'No version chain exists yet',\n blockCount: 0,\n schemaCount: 0,\n }, null, 2));\n return;\n }\n\n logger.info('No version chain exists yet.');\n logger.info('Run \"npx omnify deploy\" to create the first version lock.');\n return;\n }\n\n // Load chain\n const chain = await readVersionChain(chainFilePath);\n if (!chain) {\n throw new OmnifyError(\n 'Failed to read version chain file',\n 'E406',\n undefined,\n `Check if ${VERSION_CHAIN_FILE} is valid JSON.`\n );\n }\n\n // Get chain summary\n const summary = getChainSummary(chain);\n\n if (!options.json) {\n logger.step('Chain Summary');\n logger.info(` Blocks: ${summary.blockCount}`);\n logger.info(` Schemas: ${summary.schemaCount}`);\n logger.info(` First Lock: ${summary.firstVersion ?? 'N/A'}`);\n logger.info(` Latest Lock: ${summary.latestVersion ?? 'N/A'}`);\n logger.info(` Environments: ${summary.environments.join(', ') || 'N/A'}`);\n logger.newline();\n }\n\n // Verify chain integrity\n if (!options.json) {\n logger.step('Verifying chain integrity...');\n }\n\n const verification = await verifyChain(chain, schemasDir);\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify({\n valid: verification.valid,\n blockCount: verification.blockCount,\n verifiedBlocks: verification.verifiedBlocks,\n corruptedBlocks: verification.corruptedBlocks,\n tamperedSchemas: verification.tamperedSchemas,\n deletedLockedSchemas: verification.deletedLockedSchemas,\n summary,\n }, null, 2));\n\n if (!verification.valid) {\n process.exit(1);\n }\n return;\n }\n\n // Detailed output\n if (verification.valid) {\n logger.success('✓ Chain integrity verified');\n logger.success(`✓ All ${verification.blockCount} block(s) valid`);\n logger.success('✓ No tampered or deleted locked schemas');\n logger.newline();\n\n // Show locked schemas if --show-all\n if (options.showAll) {\n const lockedSchemas = getLockedSchemas(chain);\n logger.step('Locked Schemas');\n for (const [name, info] of lockedSchemas) {\n logger.info(` • ${name}`);\n logger.debug(` Path: ${info.relativePath}`);\n logger.debug(` Hash: ${info.hash.substring(0, 16)}...`);\n logger.debug(` Version: ${info.version}`);\n }\n }\n } else {\n logger.error('✗ Chain integrity verification FAILED');\n logger.newline();\n\n let exitCode = 0;\n\n // Corrupted blocks\n if (verification.corruptedBlocks.length > 0) {\n logger.error('Corrupted Blocks:');\n for (const block of verification.corruptedBlocks) {\n logger.error(` ✗ ${block.version}`);\n logger.error(` Reason: ${block.reason}`);\n logger.error(` Expected: ${block.expectedHash.substring(0, 16)}...`);\n logger.error(` Actual: ${block.actualHash.substring(0, 16)}...`);\n }\n logger.newline();\n exitCode = 1;\n }\n\n // Tampered schemas\n if (verification.tamperedSchemas.length > 0) {\n logger.error('Tampered Schemas (modified since lock):');\n for (const schema of verification.tamperedSchemas) {\n logger.error(` ✗ ${schema.schemaName}`);\n logger.error(` File: ${schema.filePath}`);\n logger.error(` Locked in: ${schema.lockedInVersion}`);\n logger.error(` Locked: ${schema.lockedHash.substring(0, 16)}...`);\n logger.error(` Current: ${schema.currentHash.substring(0, 16)}...`);\n }\n logger.newline();\n exitCode = 1;\n }\n\n // Deleted locked schemas\n if (verification.deletedLockedSchemas.length > 0) {\n logger.error('Deleted Locked Schemas:');\n for (const schema of verification.deletedLockedSchemas) {\n logger.error(` ✗ ${schema.schemaName}`);\n logger.error(` File: ${schema.filePath}`);\n logger.error(` Locked in: ${schema.lockedInVersion}`);\n logger.error(` Hash: ${schema.lockedHash.substring(0, 16)}...`);\n }\n logger.newline();\n exitCode = 1;\n }\n\n // Help text\n logger.newline();\n logger.warn('How to fix:');\n logger.warn(' 1. Restore deleted files from git or backup');\n logger.warn(' 2. Revert modified files to their locked state');\n logger.warn(' 3. Do NOT modify the .omnify.chain file');\n logger.newline();\n\n process.exit(exitCode);\n }\n}\n\n/**\n * Registers the verify command.\n */\nexport function registerVerifyCommand(program: Command): void {\n program\n .command('verify')\n .description('Verify version chain integrity and schema states')\n .option('-v, --verbose', 'Show detailed output')\n .option('-a, --show-all', 'Show all locked schemas')\n .option('--json', 'Output result as JSON')\n .action(async (options: VerifyCommandOptions) => {\n try {\n await runVerify(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n if (options.json) {\n console.log(JSON.stringify({\n valid: false,\n error: error.message,\n }, null, 2));\n } else {\n logger.formatError(error);\n }\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n if (options.json) {\n console.log(JSON.stringify({\n valid: false,\n error: error.message,\n }, null, 2));\n } else {\n logger.error(error.message);\n }\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["existsSync","resolve","OmnifyError","existsSync","writeFileSync","resolve","configPath","configPath","resolve","existsSync","schemasDir","writeFileSync","program","existsSync","resolve","dirname","OmnifyError","existsSync","resolve","dirname","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","configPath","existsSync","dirname","configPath","dirname","resolve","existsSync","OmnifyError","program","existsSync","resolve","dirname","loadSchemas","mergePartialSchemas","validateSchemas","OmnifyError","pc","configPath","dirname","resolve","loadSchemas","existsSync","mergePartialSchemas","validateSchemas","OmnifyError","program","existsSync","mkdirSync","writeFileSync","readdirSync","resolve","dirname","loadSchemas","mergePartialSchemas","validateSchemas","OmnifyError","existsSync","writeFileSync","mkdirSync","readFileSync","resolve","dirname","resolve","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","existsSync","readdirSync","resolve","dirname","mkdirSync","writeFileSync","configPath","loadSchemas","mergePartialSchemas","validateSchemas","OmnifyError","migrationsDir","customTypesMap","program","existsSync","readdirSync","resolve","dirname","join","confirm","resolve","existsSync","readdirSync","join","configPath","dirname","program","existsSync","rmSync","readFileSync","writeFileSync","resolve","resolve","existsSync","readFileSync","writeFileSync","rmSync","program","existsSync","resolve","dirname","loadSchemas","OmnifyError","VERSION_CHAIN_FILE","readVersionChain","createInterface","resolve","loadSchemas","configPath","dirname","VERSION_CHAIN_FILE","existsSync","OmnifyError","readVersionChain","program","existsSync","resolve","dirname","OmnifyError","VERSION_CHAIN_FILE","readVersionChain","verifyChain","getChainSummary","configPath","dirname","resolve","VERSION_CHAIN_FILE","existsSync","readVersionChain","OmnifyError","getChainSummary","verifyChain","program","OmnifyError","resolve","existsSync"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/output/logger.ts","../src/config/alias-config.ts","../src/commands/validate.ts","../src/config/loader.ts","../src/config/discovery.ts","../src/commands/diff.ts","../src/operations/diff.ts","../src/commands/generate.ts","../src/guides/index.ts","../src/commands/reset.ts","../src/commands/create-project.ts","../src/commands/deploy.ts","../src/commands/verify.ts"],"sourcesContent":["/**\n * @famgia/omnify-cli - CLI Runner\n * This file contains the actual CLI execution logic.\n * Import this file to run the CLI (has side effects).\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n registerInitCommand,\n registerValidateCommand,\n registerDiffCommand,\n registerGenerateCommand,\n registerResetCommand,\n registerCreateProjectCommand,\n registerDeployCommand,\n registerVerifyCommand,\n runInit,\n} from './commands/index.js';\nimport { logger } from './output/logger.js';\n\n/**\n * CLI version (from package.json)\n */\nconst VERSION = '0.0.5';\n\n/**\n * Main CLI program.\n */\nconst program = new Command();\n\nprogram\n .name('omnify')\n .description('Schema-first database migrations for Laravel and TypeScript')\n .version(VERSION);\n\n// Register commands\nregisterInitCommand(program);\nregisterValidateCommand(program);\nregisterDiffCommand(program);\nregisterGenerateCommand(program);\nregisterResetCommand(program);\nregisterCreateProjectCommand(program);\nregisterDeployCommand(program);\nregisterVerifyCommand(program);\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else {\n logger.error(error.message);\n process.exit(1);\n }\n});\n\nprocess.on('unhandledRejection', (reason) => {\n if (reason instanceof OmnifyError) {\n logger.formatError(reason);\n process.exit(logger.getExitCode(reason));\n } else if (reason instanceof Error) {\n logger.error(reason.message);\n } else {\n logger.error(String(reason));\n }\n process.exit(1);\n});\n\n// Check if we should auto-run init\nconst args = process.argv.slice(2);\nconst firstArg = args[0];\nconst hasCommand = firstArg !== undefined && !firstArg.startsWith('-');\nconst configPath = resolve(process.cwd(), 'omnify.config.ts');\nconst hasConfig = existsSync(configPath);\n\nif (!hasCommand && !hasConfig) {\n // No command specified and no config exists → run init\n runInit({}).catch((error) => {\n if (error instanceof Error) {\n if (error.message.includes('User force closed')) {\n logger.newline();\n logger.info('Setup cancelled.');\n process.exit(0);\n }\n logger.error(error.message);\n }\n process.exit(1);\n });\n} else {\n // Parse CLI arguments normally\n program.parse();\n}\n","/**\n * @famgia/omnify-cli - Init Command\n *\n * Initializes a new omnify project with interactive configuration.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { select, confirm, input } from '@inquirer/prompts';\nimport { logger } from '../output/logger.js';\nimport { configureOmnifyAlias } from '../config/alias-config.js';\n\n/**\n * Migration tool options.\n */\ntype MigrationTool = 'laravel' | 'prisma' | 'drizzle' | 'none';\n\n/**\n * Project configuration from prompts.\n */\ninterface ProjectConfig {\n database: 'mysql' | 'postgres' | 'sqlite';\n migrationTool: MigrationTool;\n generateTypes: boolean;\n migrationsPath: string;\n typesPath: string;\n schemasDir: string;\n}\n\n/**\n * Example schema file content.\n */\nconst EXAMPLE_SCHEMA = `# Example User schema\n# See https://github.com/famgia/omnify for documentation\n\nname: User\ndisplayName: User Account\nkind: object\n\nproperties:\n email:\n type: Email\n unique: true\n displayName: Email Address\n\n name:\n type: String\n displayName: Full Name\n\n bio:\n type: Text\n nullable: true\n displayName: Biography\n\noptions:\n timestamps: true\n softDelete: true\n`;\n\n/**\n * Generates config file content based on project configuration.\n */\nfunction generateConfig(config: ProjectConfig): string {\n const imports: string[] = [`import { defineConfig } from '@famgia/omnify';`];\n const plugins: string[] = [];\n\n // Add Laravel plugin\n if (config.migrationTool === 'laravel') {\n imports.push(`import laravel from '@famgia/omnify-laravel/plugin';`);\n plugins.push(` laravel({\n migrationsPath: '${config.migrationsPath}',\n typesPath: '${config.typesPath}',\n singleFile: true,\n generateMigrations: true,\n generateTypes: ${config.generateTypes},\n }),`);\n }\n\n // Prisma plugin (coming soon)\n if (config.migrationTool === 'prisma') {\n plugins.push(` // Prisma plugin coming soon!\n // prisma({ schemaPath: 'prisma/schema.prisma' }),`);\n }\n\n // Drizzle plugin (coming soon)\n if (config.migrationTool === 'drizzle') {\n plugins.push(` // Drizzle plugin coming soon!\n // drizzle({ schemaPath: 'src/db/schema.ts' }),`);\n }\n\n // TypeScript-only (no migration tool)\n if (config.migrationTool === 'none' && config.generateTypes) {\n imports.push(`import laravel from '@famgia/omnify-laravel/plugin';`);\n plugins.push(` laravel({\n typesPath: '${config.typesPath}',\n generateMigrations: false,\n generateTypes: true,\n }),`);\n }\n\n // Database URL examples\n const dbUrlExamples: Record<string, string> = {\n mysql: 'mysql://root:password@localhost:3306/omnify_dev',\n postgres: 'postgres://postgres:password@localhost:5432/omnify_dev',\n sqlite: 'sqlite://./omnify_dev.db',\n };\n\n return `${imports.join('\\n')}\n\nexport default defineConfig({\n // Schema files location\n schemasDir: '${config.schemasDir}',\n\n // Lock file for tracking schema changes\n lockFilePath: './omnify.lock',\n\n // Database configuration\n database: {\n driver: '${config.database}',\n // REQUIRED: Set your development database URL\n // devUrl: '${dbUrlExamples[config.database]}',\n },\n\n // Generator plugins\n plugins: [\n${plugins.join('\\n\\n')}\n ],\n});\n`;\n}\n\n/**\n * Init command options.\n */\ninterface InitOptions {\n force?: boolean;\n yes?: boolean;\n}\n\n/**\n * Runs the init command with interactive prompts.\n */\nexport async function runInit(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n\n logger.header('Omnify Project Setup');\n logger.newline();\n\n // Check if config already exists\n const configPath = resolve(cwd, 'omnify.config.ts');\n if (existsSync(configPath) && !options.force) {\n logger.warn('omnify.config.ts already exists. Use --force to overwrite.');\n return;\n }\n\n let config: ProjectConfig;\n\n if (options.yes) {\n // Use defaults (Laravel)\n config = {\n database: 'mysql',\n migrationTool: 'laravel',\n generateTypes: true,\n migrationsPath: 'database/migrations',\n typesPath: 'resources/js/types',\n schemasDir: './schemas',\n };\n logger.info('Using default configuration...');\n } else {\n // Interactive prompts\n logger.info('Answer a few questions to configure your project:\\n');\n\n // 1. Database selection\n const database = await select({\n message: 'Which database?',\n choices: [\n { name: 'MySQL / MariaDB', value: 'mysql' as const },\n { name: 'PostgreSQL', value: 'postgres' as const },\n { name: 'SQLite', value: 'sqlite' as const },\n ],\n default: 'mysql',\n });\n\n // 2. Migration tool selection\n const migrationTool = await select({\n message: 'Which migration tool?',\n choices: [\n { name: 'Laravel (PHP)', value: 'laravel' as const },\n { name: 'Prisma (coming soon)', value: 'prisma' as const, disabled: true },\n { name: 'Drizzle (coming soon)', value: 'drizzle' as const, disabled: true },\n { name: 'None (types only)', value: 'none' as const },\n ],\n default: 'laravel',\n });\n\n // 3. TypeScript types\n const generateTypes = await confirm({\n message: 'Generate TypeScript types?',\n default: true,\n });\n\n // Default paths based on migration tool\n const defaultPaths: Record<MigrationTool, { migrations: string; types: string }> = {\n laravel: { migrations: 'database/migrations', types: 'resources/js/types' },\n prisma: { migrations: 'prisma/migrations', types: 'src/types' },\n drizzle: { migrations: 'drizzle', types: 'src/types' },\n none: { migrations: '', types: 'types' },\n };\n\n const defaults = defaultPaths[migrationTool];\n let migrationsPath = defaults.migrations;\n let typesPath = defaults.types;\n\n if (migrationTool !== 'none') {\n migrationsPath = await input({\n message: 'Migrations output path:',\n default: defaults.migrations,\n });\n }\n\n if (generateTypes) {\n typesPath = await input({\n message: 'TypeScript types path:',\n default: defaults.types,\n });\n }\n\n // Schemas directory\n const schemasDir = await input({\n message: 'Schemas directory:',\n default: './schemas',\n });\n\n config = {\n database,\n migrationTool,\n generateTypes,\n migrationsPath,\n typesPath,\n schemasDir,\n };\n }\n\n logger.newline();\n logger.step('Creating project files...');\n\n // Create schemas directory\n const schemasDir = resolve(cwd, config.schemasDir);\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.debug(`Created ${config.schemasDir}/ directory`);\n }\n\n // Create example schema\n const examplePath = resolve(schemasDir, 'User.yaml');\n if (!existsSync(examplePath) || options.force) {\n writeFileSync(examplePath, EXAMPLE_SCHEMA);\n logger.debug('Created example schema: User.yaml');\n }\n\n // Create config file\n const configContent = generateConfig(config);\n writeFileSync(configPath, configContent);\n logger.debug('Created omnify.config.ts');\n\n // Auto-configure @omnify alias in vite.config and tsconfig.json\n if (config.generateTypes) {\n logger.step('Configuring @omnify path alias...');\n const aliasResult = configureOmnifyAlias(cwd, 'omnify', false);\n if (!aliasResult.viteUpdated && !aliasResult.tsconfigUpdated) {\n if (!aliasResult.viteSkipped) {\n logger.info('Note: vite.config not found - you may need to configure @omnify alias manually');\n }\n if (!aliasResult.tsconfigSkipped) {\n logger.info('Note: tsconfig.json not found - you may need to configure @omnify/* path manually');\n }\n }\n }\n\n logger.newline();\n logger.success('Project initialized!');\n logger.newline();\n\n // Summary\n const toolName =\n config.migrationTool === 'laravel'\n ? 'Laravel'\n : config.migrationTool === 'prisma'\n ? 'Prisma'\n : config.migrationTool === 'drizzle'\n ? 'Drizzle'\n : 'None';\n\n logger.info('Configuration:');\n logger.list([\n `Database: ${config.database}`,\n `Migration tool: ${toolName}`,\n `TypeScript types: ${config.generateTypes ? 'Yes' : 'No'}`,\n ]);\n\n logger.newline();\n logger.info('Files created:');\n logger.list(['omnify.config.ts', `${config.schemasDir}/User.yaml`]);\n\n logger.newline();\n logger.info('Next steps:');\n logger.newline();\n\n logger.step('1. Set database URL in omnify.config.ts');\n logger.newline();\n\n logger.step('2. Define schemas in ' + config.schemasDir + '/');\n logger.newline();\n\n logger.step('3. Generate:');\n logger.info(' npx omnify validate');\n logger.info(' npx omnify generate');\n logger.newline();\n}\n\n/**\n * Registers the init command.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command('init')\n .description('Initialize a new omnify project')\n .option('-f, --force', 'Overwrite existing files')\n .option('-y, --yes', 'Use default configuration (skip prompts)')\n .action(async (options: InitOptions) => {\n try {\n await runInit(options);\n } catch (error) {\n if (error instanceof Error) {\n // Handle Ctrl+C gracefully\n if (error.message.includes('User force closed')) {\n logger.newline();\n logger.info('Setup cancelled.');\n process.exit(0);\n }\n logger.error(error.message);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Logger\n *\n * CLI output and logging utilities.\n */\n\nimport pc from 'picocolors';\nimport { OmnifyError, formatError, getExitCode } from '@famgia/omnify-core';\n\n/**\n * Logger options.\n */\nexport interface LoggerOptions {\n /** Enable verbose logging */\n verbose?: boolean;\n /** Suppress all output except errors */\n quiet?: boolean;\n}\n\n/**\n * CLI Logger for formatted output.\n */\nexport class Logger {\n private _verbose: boolean;\n private _quiet: boolean;\n private _startTime: number;\n\n constructor(options: LoggerOptions = {}) {\n this._verbose = options.verbose ?? false;\n this._quiet = options.quiet ?? false;\n this._startTime = Date.now();\n }\n\n /**\n * Enable or disable verbose mode.\n */\n setVerbose(verbose: boolean): void {\n this._verbose = verbose;\n }\n\n /**\n * Enable or disable quiet mode.\n */\n setQuiet(quiet: boolean): void {\n this._quiet = quiet;\n }\n\n /**\n * Log an info message.\n */\n info(message: string): void {\n if (!this._quiet) {\n console.log(message);\n }\n }\n\n /**\n * Log a success message.\n */\n success(message: string): void {\n if (!this._quiet) {\n console.log(pc.green('✓') + ' ' + message);\n }\n }\n\n /**\n * Log a warning message.\n */\n warn(message: string): void {\n if (!this._quiet) {\n console.log(pc.yellow('⚠') + ' ' + pc.yellow(message));\n }\n }\n\n /**\n * Log an error message.\n */\n error(message: string): void {\n console.error(pc.red('✗') + ' ' + pc.red(message));\n }\n\n /**\n * Log a debug message (only in verbose mode).\n */\n debug(message: string): void {\n if (this._verbose && !this._quiet) {\n console.log(pc.dim(' ' + message));\n }\n }\n\n /**\n * Log a step message.\n */\n step(message: string): void {\n if (!this._quiet) {\n console.log(pc.cyan('→') + ' ' + message);\n }\n }\n\n /**\n * Log a header.\n */\n header(message: string): void {\n if (!this._quiet) {\n console.log();\n console.log(pc.bold(message));\n console.log();\n }\n }\n\n /**\n * Log a list item.\n */\n list(items: string[]): void {\n if (!this._quiet) {\n for (const item of items) {\n console.log(' • ' + item);\n }\n }\n }\n\n /**\n * Log a timing message.\n */\n timing(message: string): void {\n if (this._verbose && !this._quiet) {\n const elapsed = Date.now() - this._startTime;\n console.log(pc.dim(` [${elapsed}ms] ${message}`));\n }\n }\n\n /**\n * Log an empty line.\n */\n newline(): void {\n if (!this._quiet) {\n console.log();\n }\n }\n\n /**\n * Format and log an OmnifyError.\n */\n formatError(error: OmnifyError): void {\n const formatted = formatError(error, { color: true });\n console.error(formatted);\n }\n\n /**\n * Get exit code for an error.\n */\n getExitCode(error: OmnifyError): number {\n return getExitCode(error);\n }\n}\n\n/**\n * Global logger instance.\n */\nexport const logger = new Logger();\n","/**\n * @famgia/omnify-cli - Alias Configuration Utilities\n *\n * Auto-configures @omnify alias in vite.config.ts and tsconfig.json\n */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { logger } from '../output/logger.js';\n\n/**\n * Result of alias configuration\n */\nexport interface AliasConfigResult {\n viteUpdated: boolean;\n tsconfigUpdated: boolean;\n viteSkipped: boolean;\n tsconfigSkipped: boolean;\n errors: string[];\n}\n\n/**\n * Check if vite.config.ts already has @omnify alias configured\n */\nfunction hasViteOmnifyAlias(content: string): boolean {\n // Check for various patterns of @omnify alias\n return (\n content.includes(\"'@omnify'\") ||\n content.includes('\"@omnify\"') ||\n content.includes('@omnify:') ||\n content.includes(\"'@omnify/\")\n );\n}\n\n/**\n * Check if vite.config.ts already has @omnify-base alias configured\n */\nfunction hasViteOmnifyBaseAlias(content: string): boolean {\n return (\n content.includes(\"'@omnify-base'\") ||\n content.includes('\"@omnify-base\"') ||\n content.includes('@omnify-base/')\n );\n}\n\n/**\n * Check if tsconfig.json already has @omnify path configured\n */\nfunction hasTsconfigOmnifyPath(content: string): boolean {\n return (\n content.includes('\"@omnify/*\"') ||\n content.includes(\"'@omnify/*'\") ||\n content.includes('\"@omnify/\"')\n );\n}\n\n/**\n * Update vite.config.ts to add @omnify alias\n *\n * @param rootDir - Project root directory\n * @param omnifyPath - Path to omnify folder (default: 'omnify')\n * @returns true if updated, false if skipped or failed\n */\nexport function updateViteConfig(\n rootDir: string,\n omnifyPath: string = 'omnify'\n): { updated: boolean; skipped: boolean; error?: string } {\n const configPaths = [\n resolve(rootDir, 'vite.config.ts'),\n resolve(rootDir, 'vite.config.js'),\n resolve(rootDir, 'vite.config.mts'),\n resolve(rootDir, 'vite.config.mjs'),\n ];\n\n // Find existing vite config\n const configPath = configPaths.find((p) => existsSync(p));\n\n if (!configPath) {\n return { updated: false, skipped: true };\n }\n\n try {\n let content = readFileSync(configPath, 'utf-8');\n\n // Check if already configured\n if (hasViteOmnifyAlias(content)) {\n return { updated: false, skipped: true };\n }\n\n // Check if there's an existing alias section\n const aliasPatterns = [\n // Pattern 1: resolve: { alias: { ... } }\n /resolve\\s*:\\s*\\{[^}]*alias\\s*:\\s*\\{/,\n // Pattern 2: alias: { ... } directly in defineConfig\n /alias\\s*:\\s*\\{/,\n ];\n\n let updated = false;\n\n for (const pattern of aliasPatterns) {\n const match = content.match(pattern);\n if (match) {\n // Insert @omnify alias after opening brace of alias object\n const insertPoint = match.index! + match[0].length;\n const aliasLine = `\\n '@omnify': path.resolve(__dirname, '${omnifyPath}'),`;\n content = content.slice(0, insertPoint) + aliasLine + content.slice(insertPoint);\n updated = true;\n break;\n }\n }\n\n // If no alias section found, try to add one in resolve section\n if (!updated) {\n const resolvePattern = /resolve\\s*:\\s*\\{/;\n const resolveMatch = content.match(resolvePattern);\n\n if (resolveMatch) {\n const insertPoint = resolveMatch.index! + resolveMatch[0].length;\n const aliasSection = `\n alias: {\n '@omnify': path.resolve(__dirname, '${omnifyPath}'),\n },`;\n content = content.slice(0, insertPoint) + aliasSection + content.slice(insertPoint);\n updated = true;\n }\n }\n\n // If still not updated, try to add resolve section to defineConfig\n if (!updated) {\n // Look for defineConfig({\n const defineConfigPattern = /defineConfig\\s*\\(\\s*\\{/;\n const defineConfigMatch = content.match(defineConfigPattern);\n\n if (defineConfigMatch) {\n const insertPoint = defineConfigMatch.index! + defineConfigMatch[0].length;\n const resolveSection = `\n resolve: {\n alias: {\n '@omnify': path.resolve(__dirname, '${omnifyPath}'),\n },\n },`;\n content = content.slice(0, insertPoint) + resolveSection + content.slice(insertPoint);\n\n // Add path import if not present\n if (!content.includes(\"import path from\") && !content.includes(\"import * as path\")) {\n content = `import path from 'path';\\n` + content;\n }\n updated = true;\n }\n }\n\n if (updated) {\n // Ensure path import exists\n if (!content.includes(\"import path from\") && !content.includes(\"import * as path\") && !content.includes(\"require('path')\")) {\n // Add at the top after other imports\n const importMatch = content.match(/^(import .+;\\n)+/m);\n if (importMatch) {\n const insertPoint = importMatch.index! + importMatch[0].length;\n content = content.slice(0, insertPoint) + \"import path from 'path';\\n\" + content.slice(insertPoint);\n } else {\n content = \"import path from 'path';\\n\" + content;\n }\n }\n\n writeFileSync(configPath, content);\n return { updated: true, skipped: false };\n }\n\n return {\n updated: false,\n skipped: false,\n error: 'Could not find suitable location to add alias. Please add manually.',\n };\n } catch (error) {\n return {\n updated: false,\n skipped: false,\n error: `Failed to update vite.config: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Update tsconfig.json to add @omnify path\n *\n * @param rootDir - Project root directory\n * @param omnifyPath - Path to omnify folder (default: 'omnify')\n * @returns true if updated, false if skipped or failed\n */\nexport function updateTsconfig(\n rootDir: string,\n omnifyPath: string = 'omnify'\n): { updated: boolean; skipped: boolean; error?: string } {\n const configPath = resolve(rootDir, 'tsconfig.json');\n\n if (!existsSync(configPath)) {\n return { updated: false, skipped: true };\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n\n // Check if already configured\n if (hasTsconfigOmnifyPath(content)) {\n return { updated: false, skipped: true };\n }\n\n // Parse JSON (with comment removal for safety)\n const jsonContent = content\n .replace(/\\/\\/.*$/gm, '') // Remove single-line comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, ''); // Remove multi-line comments\n\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(jsonContent);\n } catch {\n return {\n updated: false,\n skipped: false,\n error: 'Could not parse tsconfig.json as JSON',\n };\n }\n\n // Ensure compilerOptions exists\n if (!config.compilerOptions) {\n config.compilerOptions = {};\n }\n\n const compilerOptions = config.compilerOptions as Record<string, unknown>;\n\n // Ensure paths exists\n if (!compilerOptions.paths) {\n compilerOptions.paths = {};\n }\n\n const paths = compilerOptions.paths as Record<string, string[]>;\n\n // Add @omnify path\n paths['@omnify/*'] = [`./${omnifyPath}/*`];\n\n // Write back with proper formatting\n // We need to preserve the original formatting as much as possible\n // Simple approach: use 2-space indent\n const newContent = JSON.stringify(config, null, 2);\n\n writeFileSync(configPath, newContent + '\\n');\n return { updated: true, skipped: false };\n } catch (error) {\n return {\n updated: false,\n skipped: false,\n error: `Failed to update tsconfig.json: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Configure @omnify alias in both vite.config and tsconfig.json\n *\n * @param rootDir - Project root directory\n * @param omnifyPath - Path to omnify folder (default: 'omnify')\n * @param silent - Don't log messages (for use in generate command)\n */\nexport function configureOmnifyAlias(\n rootDir: string,\n omnifyPath: string = 'omnify',\n silent: boolean = false\n): AliasConfigResult {\n const result: AliasConfigResult = {\n viteUpdated: false,\n tsconfigUpdated: false,\n viteSkipped: false,\n tsconfigSkipped: false,\n errors: [],\n };\n\n // Update vite.config\n const viteResult = updateViteConfig(rootDir, omnifyPath);\n result.viteUpdated = viteResult.updated;\n result.viteSkipped = viteResult.skipped;\n if (viteResult.error) {\n result.errors.push(viteResult.error);\n }\n\n // Update tsconfig.json\n const tsconfigResult = updateTsconfig(rootDir, omnifyPath);\n result.tsconfigUpdated = tsconfigResult.updated;\n result.tsconfigSkipped = tsconfigResult.skipped;\n if (tsconfigResult.error) {\n result.errors.push(tsconfigResult.error);\n }\n\n // Log results\n if (!silent) {\n if (result.viteUpdated) {\n logger.success('Updated vite.config - Added @omnify alias');\n }\n if (result.tsconfigUpdated) {\n logger.success('Updated tsconfig.json - Added @omnify/* path');\n }\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n logger.warn(error);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Add @omnify-base alias to vite.config for plugin enum imports.\n * This is needed because plugin enums are stored in node_modules/@omnify-base\n */\nexport function addPluginEnumAlias(rootDir: string): { updated: boolean; error?: string } {\n const configPaths = [\n resolve(rootDir, 'vite.config.ts'),\n resolve(rootDir, 'vite.config.js'),\n resolve(rootDir, 'vite.config.mts'),\n resolve(rootDir, 'vite.config.mjs'),\n ];\n\n const configPath = configPaths.find((p) => existsSync(p));\n if (!configPath) {\n return { updated: false };\n }\n\n try {\n let content = readFileSync(configPath, 'utf-8');\n\n // Check if already configured\n if (hasViteOmnifyBaseAlias(content)) {\n return { updated: false };\n }\n\n // Find the line with @omnify alias that ends with ), and add new alias after it\n // Match pattern: '@omnify': ... ), (handles single and multi-line definitions)\n const lines = content.split('\\n');\n let insertIndex = -1;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Look for line containing @omnify alias\n if ((line.includes(\"'@omnify'\") || line.includes('\"@omnify\"')) && line.includes(':')) {\n // Find the line where this alias definition ends (with ),)\n for (let j = i; j < lines.length; j++) {\n if (lines[j].includes('),') || (lines[j].trim().endsWith(',') && lines[j].includes(')'))) {\n insertIndex = j + 1;\n break;\n }\n }\n break;\n }\n }\n\n if (insertIndex > 0) {\n const indent = ' '; // Match typical Vite config indentation\n const aliasLine = `${indent}'@omnify-base': path.resolve(__dirname, 'node_modules/@omnify-base'),`;\n lines.splice(insertIndex, 0, aliasLine);\n content = lines.join('\\n');\n writeFileSync(configPath, content);\n return { updated: true };\n }\n\n return { updated: false, error: 'Could not find @omnify alias to add @omnify-base after' };\n } catch (error) {\n return {\n updated: false,\n error: `Failed to add plugin enum alias: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Add @omnify-base path to tsconfig.json for plugin enum imports.\n */\nexport function addPluginEnumTsconfigPath(rootDir: string): { updated: boolean; error?: string } {\n const configPath = resolve(rootDir, 'tsconfig.json');\n if (!existsSync(configPath)) {\n return { updated: false };\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n\n // Check if already has @omnify-base path\n if (content.includes('@omnify-base')) {\n return { updated: false };\n }\n\n // Parse JSON with comments\n const jsonContent = content.replace(/\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*/g, '');\n const config = JSON.parse(jsonContent);\n\n if (!config.compilerOptions) {\n config.compilerOptions = {};\n }\n if (!config.compilerOptions.paths) {\n config.compilerOptions.paths = {};\n }\n\n config.compilerOptions.paths['@omnify-base/*'] = ['./node_modules/@omnify-base/*'];\n\n writeFileSync(configPath, JSON.stringify(config, null, 2));\n return { updated: true };\n } catch (error) {\n return {\n updated: false,\n error: `Failed to add plugin enum tsconfig path: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n","/**\n * @famgia/omnify-cli - Validate Command\n *\n * Validates schema files for syntax and semantic errors.\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, mergePartialSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Validate command options.\n */\ninterface ValidateOptions {\n verbose?: boolean;\n}\n\n/**\n * Runs the validate command.\n */\nexport async function runValidate(options: ValidateOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Validating Schemas');\n\n // Load configuration\n logger.debug('Loading configuration...');\n logger.timing('Config load start');\n const { config, configPath } = await loadConfig();\n logger.timing('Config loaded');\n\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config (checks schema directory exists)\n validateConfig(config, rootDir);\n\n // Load schemas from main directory\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n logger.timing('Schema load start');\n\n let schemas = await loadSchemas(schemaPath);\n logger.debug(`Found ${Object.keys(schemas).length} schema(s) in main directory`);\n\n // Load additional schemas from config\n const additionalPaths = config.additionalSchemaPaths ?? [];\n let hasPackageSchemas = false;\n\n if (additionalPaths.length > 0) {\n logger.step(`Loading schemas from ${additionalPaths.length} additional path(s)`);\n for (const entry of additionalPaths) {\n const absolutePath = resolve(rootDir, entry.path);\n logger.debug(` Checking: ${entry.path} → ${absolutePath}`);\n\n if (existsSync(absolutePath)) {\n const packageSchemas = await loadSchemas(absolutePath, { skipPartialResolution: true });\n const count = Object.keys(packageSchemas).filter(k => !k.startsWith('__partial__')).length;\n const partialCount = Object.keys(packageSchemas).filter(k => k.startsWith('__partial__')).length;\n const nsInfo = entry.namespace ? ` [${entry.namespace}]` : '';\n logger.info(` • ${entry.path}${nsInfo}: ${count} schema(s)${partialCount > 0 ? ` + ${partialCount} partial(s)` : ''}`);\n schemas = { ...packageSchemas, ...schemas };\n hasPackageSchemas = true;\n } else {\n logger.warn(` • ${entry.path}: directory not found (skipped)`);\n }\n }\n }\n\n // Resolve partial schemas from packages\n if (hasPackageSchemas) {\n schemas = mergePartialSchemas(schemas);\n }\n\n logger.timing('Schemas loaded');\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Total: ${schemaCount} schema(s)`);\n\n // Validate schemas\n logger.step('Validating schemas...');\n logger.timing('Validation start');\n\n const result = validateSchemas(schemas);\n logger.timing('Validation complete');\n\n if (result.valid) {\n logger.success(`All ${schemaCount} schema(s) are valid`);\n } else {\n logger.error(`Found ${result.errors.length} validation error(s)`);\n logger.newline();\n\n for (const error of result.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n logger.newline();\n }\n\n process.exit(2);\n }\n}\n\n/**\n * Registers the validate command.\n */\nexport function registerValidateCommand(program: Command): void {\n program\n .command('validate')\n .description('Validate schema files')\n .option('-v, --verbose', 'Show detailed output')\n .action(async (options: ValidateOptions) => {\n try {\n await runValidate(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Configuration Loader\n *\n * Loads and resolves omnify.config.ts configuration.\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { createJiti } from 'jiti';\nimport type { OmnifyConfig, ResolvedOmnifyConfig, OmnifyPlugin, ConfigLoadResult, DiscoveryConfig } from './types.js';\nimport { configError, configNotFoundError } from '@famgia/omnify-core';\nimport { discoverPackages } from './discovery.js';\n\n/**\n * Configuration file names to search for (in order of priority).\n */\nconst CONFIG_FILES = [\n 'omnify.config.ts',\n 'omnify.config.js',\n 'omnify.config.mjs',\n 'omnify.config.cjs',\n];\n\n/**\n * Finds configuration file in directory.\n */\nexport function findConfigFile(startDir: string): string | null {\n const cwd = resolve(startDir);\n\n for (const filename of CONFIG_FILES) {\n const configPath = resolve(cwd, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n\n return null;\n}\n\n/**\n * Loads configuration from file using jiti.\n */\nasync function loadConfigFile(configPath: string): Promise<OmnifyConfig> {\n const jiti = createJiti(configPath, {\n interopDefault: true,\n moduleCache: false,\n });\n\n try {\n const module = await jiti.import(configPath);\n const config = module as OmnifyConfig;\n\n // Handle default export\n if ('default' in config) {\n return (config as { default: OmnifyConfig }).default;\n }\n\n return config;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw configError(\n `Failed to load config file: ${message}. Check your omnify.config.ts for syntax errors.`,\n 'E002'\n );\n }\n}\n\n/**\n * Resolves plugins from configuration.\n * Handles both string (npm package) and object plugins.\n */\nasync function resolvePlugins(\n plugins: readonly (string | OmnifyPlugin)[] | undefined,\n configPath: string | null\n): Promise<OmnifyPlugin[]> {\n if (!plugins || plugins.length === 0) {\n return [];\n }\n\n const resolved: OmnifyPlugin[] = [];\n const configDir = configPath ? dirname(configPath) : process.cwd();\n\n for (const plugin of plugins) {\n if (typeof plugin === 'string') {\n // Load plugin from npm package\n const jiti = createJiti(configDir, {\n interopDefault: true,\n moduleCache: false,\n });\n\n try {\n const module = await jiti.import(plugin);\n const loadedPlugin = (module as { default?: OmnifyPlugin }).default ?? module;\n resolved.push(loadedPlugin as OmnifyPlugin);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw configError(\n `Failed to load plugin '${plugin}': ${message}. Ensure the plugin is installed: npm install ${plugin}`,\n 'E301'\n );\n }\n } else {\n // Direct plugin object\n resolved.push(plugin);\n }\n }\n\n return resolved;\n}\n\n/**\n * Resolves configuration with defaults.\n */\nexport async function resolveConfig(\n userConfig: OmnifyConfig,\n configPath: string | null\n): Promise<ResolvedOmnifyConfig> {\n const plugins = await resolvePlugins(userConfig.plugins, configPath);\n const projectRoot = configPath ? dirname(configPath) : process.cwd();\n\n // Build discovery config with defaults\n const discovery: DiscoveryConfig = {\n enabled: userConfig.discovery?.enabled ?? true,\n exclude: userConfig.discovery?.exclude,\n };\n\n // Discover packages and merge with explicit additionalSchemaPaths\n const allSchemaPaths = discoverPackages(\n projectRoot,\n discovery,\n userConfig.additionalSchemaPaths\n );\n\n // Build database config, only including defined optional properties\n const databaseConfig = {\n driver: userConfig.database.driver,\n enableFieldComments: userConfig.database.enableFieldComments ?? false,\n };\n // Only add devUrl if defined\n const database = userConfig.database.devUrl !== undefined\n ? { ...databaseConfig, devUrl: userConfig.database.devUrl }\n : databaseConfig;\n\n // Build laravel output config\n const laravelConfig = {\n migrationsPath: userConfig.output?.laravel?.migrationsPath ?? 'database/migrations',\n };\n // Only add optional properties if they are defined\n const laravel = buildLaravelConfig(laravelConfig, userConfig.output?.laravel);\n\n // Build typescript output config\n const tsConfig = userConfig.output?.typescript;\n const typescript = {\n path: tsConfig?.path ?? 'types',\n schemasDir: tsConfig?.schemasDir ?? 'schemas',\n enumDir: tsConfig?.enumDir ?? 'enum',\n singleFile: tsConfig?.singleFile ?? true,\n generateEnums: tsConfig?.generateEnums ?? true,\n generateRelationships: tsConfig?.generateRelationships ?? true,\n };\n\n const result: ResolvedOmnifyConfig = {\n schemasDir: userConfig.schemasDir ?? './schemas',\n database: database as ResolvedOmnifyConfig['database'],\n output: {\n laravel,\n typescript,\n } as ResolvedOmnifyConfig['output'],\n plugins,\n verbose: userConfig.verbose ?? false,\n lockFilePath: userConfig.lockFilePath ?? '.omnify.lock',\n discovery,\n ...(userConfig.locale && { locale: userConfig.locale }),\n ...(allSchemaPaths.length > 0 && { additionalSchemaPaths: allSchemaPaths }),\n };\n\n return result;\n}\n\n/**\n * Builds Laravel config with only defined optional properties.\n */\nfunction buildLaravelConfig(\n base: { migrationsPath: string },\n userLaravel?: Readonly<{\n migrationsPath?: string;\n modelsPath?: string;\n baseModelsPath?: string;\n providersPath?: string;\n modelsNamespace?: string;\n factoriesPath?: string;\n enumsPath?: string;\n enumsNamespace?: string;\n }>\n): ResolvedOmnifyConfig['output']['laravel'] {\n const config: ResolvedOmnifyConfig['output']['laravel'] = { ...base };\n\n if (userLaravel?.modelsPath !== undefined) {\n (config as { modelsPath: string }).modelsPath = userLaravel.modelsPath;\n }\n if (userLaravel?.baseModelsPath !== undefined) {\n (config as { baseModelsPath: string }).baseModelsPath = userLaravel.baseModelsPath;\n }\n if (userLaravel?.providersPath !== undefined) {\n (config as { providersPath: string }).providersPath = userLaravel.providersPath;\n }\n if (userLaravel?.modelsNamespace !== undefined) {\n (config as { modelsNamespace: string }).modelsNamespace = userLaravel.modelsNamespace;\n }\n if (userLaravel?.factoriesPath !== undefined) {\n (config as { factoriesPath: string }).factoriesPath = userLaravel.factoriesPath;\n }\n if (userLaravel?.enumsPath !== undefined) {\n (config as { enumsPath: string }).enumsPath = userLaravel.enumsPath;\n }\n if (userLaravel?.enumsNamespace !== undefined) {\n (config as { enumsNamespace: string }).enumsNamespace = userLaravel.enumsNamespace;\n }\n\n return config;\n}\n\n/**\n * Validates required configuration.\n */\nexport function validateConfig(config: ResolvedOmnifyConfig, rootDir: string): void {\n // Validate schema directory exists\n const schemaPath = resolve(rootDir, config.schemasDir);\n if (!existsSync(schemaPath)) {\n throw configError(\n `Schema directory not found: ${schemaPath}. Create the '${config.schemasDir}' directory or update schemasDir in config.`,\n 'E002'\n );\n }\n}\n\n/**\n * Validates that devUrl is configured (required for diff/generate operations).\n */\nexport function requireDevUrl(config: ResolvedOmnifyConfig): void {\n if (!config.database.devUrl) {\n throw configError(\n `database.devUrl is required for diff and generate operations. Add devUrl to your database config, e.g., \"mysql://root@localhost:3306/omnify_dev\"`,\n 'E003'\n );\n }\n}\n\n/**\n * Loads configuration from file or returns defaults.\n */\nexport async function loadConfig(startDir: string = process.cwd()): Promise<ConfigLoadResult> {\n const cwd = resolve(startDir);\n const configPath = findConfigFile(cwd);\n\n if (configPath) {\n const userConfig = await loadConfigFile(configPath);\n const config = await resolveConfig(userConfig, configPath);\n\n return {\n config,\n configPath,\n };\n }\n\n // No config file found - require config file\n throw configNotFoundError(resolve(cwd, 'omnify.config.ts'));\n}\n\n/**\n * Helper function for type-safe configuration.\n * Used in omnify.config.ts files.\n */\nexport function defineConfig(config: OmnifyConfig): OmnifyConfig {\n return config;\n}\n","/**\n * Package Auto-Discovery Module\n *\n * Reads `.omnify-packages.json` manifest generated by Composer plugin\n * and merges discovered packages with explicit additionalSchemaPaths.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type {\n OmnifyPackagesManifest,\n OmnifyPackageConfig,\n AdditionalSchemaPath,\n DiscoveryConfig,\n} from './types.js';\nimport { logger } from '../output/logger.js';\n\n/** Default manifest filename */\nconst MANIFEST_FILENAME = '.omnify-packages.json';\n\n/** Current manifest version */\nconst MANIFEST_VERSION = 1;\n\n/**\n * Load package manifest from project root.\n *\n * @param projectRoot - Project root directory\n * @returns Parsed manifest or null if not found\n */\nexport function loadPackageManifest(projectRoot: string): OmnifyPackagesManifest | null {\n const manifestPath = resolve(projectRoot, MANIFEST_FILENAME);\n\n if (!existsSync(manifestPath)) {\n logger.debug(`Package manifest not found: ${manifestPath}`);\n return null;\n }\n\n try {\n const content = readFileSync(manifestPath, 'utf-8');\n const manifest = JSON.parse(content) as OmnifyPackagesManifest;\n\n // Validate version\n if (manifest.version !== MANIFEST_VERSION) {\n logger.warn(\n `Package manifest version mismatch: expected ${MANIFEST_VERSION}, got ${manifest.version}. ` +\n 'Run `composer dump-autoload` to regenerate.'\n );\n }\n\n return manifest;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(`Failed to read package manifest: ${message}`);\n return null;\n }\n}\n\n/**\n * Convert package config from manifest to AdditionalSchemaPath.\n *\n * @param packageName - Package name (e.g., 'vendor/package')\n * @param config - Package configuration from manifest\n * @returns AdditionalSchemaPath entry\n */\nfunction packageConfigToSchemaPath(\n packageName: string,\n config: OmnifyPackageConfig\n): AdditionalSchemaPath {\n const result: AdditionalSchemaPath = {\n path: config.schemas,\n namespace: config.namespace,\n };\n\n // Convert package options to output config\n if (config.options) {\n const opts = config.options;\n const basePath = config.schemas.replace(/\\/database\\/schemas\\/?$/, '');\n\n const laravelOutput: Record<string, unknown> = {\n base: basePath,\n };\n\n if (opts.modelNamespace) {\n laravelOutput.modelsNamespace = opts.modelNamespace;\n }\n if (opts.migrationsPath) {\n laravelOutput.migrationsPath = opts.migrationsPath.replace(basePath + '/', '');\n }\n if (opts.factoriesPath) {\n laravelOutput.factoriesPath = opts.factoriesPath.replace(basePath + '/', '');\n }\n if (opts.generateServiceProvider !== undefined) {\n laravelOutput.generateServiceProvider = opts.generateServiceProvider;\n }\n if (opts.generateMigrations !== undefined) {\n laravelOutput.generateMigrations = opts.generateMigrations;\n }\n if (opts.generateModels !== undefined) {\n laravelOutput.generateModels = opts.generateModels;\n }\n\n (result as { output?: unknown }).output = { laravel: laravelOutput };\n }\n\n return result;\n}\n\n/**\n * Discover packages from manifest and merge with explicit paths.\n *\n * @param projectRoot - Project root directory\n * @param discoveryConfig - Discovery configuration\n * @param explicitPaths - Explicit additionalSchemaPaths from config\n * @returns Merged array of schema paths (discovered + explicit)\n */\nexport function discoverPackages(\n projectRoot: string,\n discoveryConfig: DiscoveryConfig,\n explicitPaths?: readonly AdditionalSchemaPath[]\n): AdditionalSchemaPath[] {\n const result: AdditionalSchemaPath[] = [];\n const excludeSet = new Set(discoveryConfig.exclude ?? []);\n\n // Load auto-discovered packages\n if (discoveryConfig.enabled !== false) {\n const manifest = loadPackageManifest(projectRoot);\n\n if (manifest) {\n // Sort by priority (lower = first)\n const sortedPackages = Object.entries(manifest.packages).sort(\n ([, a], [, b]) => (a.priority ?? 100) - (b.priority ?? 100)\n );\n\n for (const [packageName, config] of sortedPackages) {\n // Skip excluded packages\n if (excludeSet.has(packageName)) {\n logger.debug(`Skipping excluded package: ${packageName}`);\n continue;\n }\n\n // Skip if schema path doesn't exist\n const schemasPath = resolve(projectRoot, config.schemas);\n if (!existsSync(schemasPath)) {\n logger.debug(`Package schemas not found, skipping: ${schemasPath}`);\n continue;\n }\n\n result.push(packageConfigToSchemaPath(packageName, config));\n logger.debug(`Discovered package: ${packageName} (${config.namespace ?? 'no namespace'})`);\n }\n\n if (result.length > 0) {\n logger.info(`Auto-discovered ${result.length} package(s) from ${MANIFEST_FILENAME}`);\n }\n }\n }\n\n // Append explicit paths (they take precedence / can override)\n if (explicitPaths?.length) {\n result.push(...explicitPaths);\n }\n\n return result;\n}\n\n/**\n * Get the manifest file path for a project.\n */\nexport function getManifestPath(projectRoot: string): string {\n return resolve(projectRoot, MANIFEST_FILENAME);\n}\n","/**\n * @famgia/omnify-cli - Diff Command\n *\n * Shows pending schema changes without generating migrations.\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, mergePartialSchemas, validateSchemas, OmnifyError } from '@famgia/omnify-core';\nimport { loadConfig, validateConfig, requireDevUrl } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\nimport { runDiffOperation } from '../operations/diff.js';\nimport pc from 'picocolors';\n\n/**\n * Diff command options.\n */\ninterface DiffOptions {\n verbose?: boolean;\n check?: boolean;\n}\n\n/**\n * Runs the diff command.\n */\nexport async function runDiff(options: DiffOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Checking for Schema Changes');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config and require devUrl for diff\n validateConfig(config, rootDir);\n requireDevUrl(config);\n\n // Load schemas from main directory\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n\n let schemas = await loadSchemas(schemaPath);\n logger.debug(`Found ${Object.keys(schemas).length} schema(s) in main directory`);\n\n // Load additional schemas from config\n const additionalPaths = config.additionalSchemaPaths ?? [];\n let hasPackageSchemas = false;\n\n if (additionalPaths.length > 0) {\n logger.step(`Loading schemas from ${additionalPaths.length} additional path(s)`);\n for (const entry of additionalPaths) {\n const absolutePath = resolve(rootDir, entry.path);\n logger.debug(` Checking: ${entry.path} → ${absolutePath}`);\n\n if (existsSync(absolutePath)) {\n const packageSchemas = await loadSchemas(absolutePath, { skipPartialResolution: true });\n const count = Object.keys(packageSchemas).filter(k => !k.startsWith('__partial__')).length;\n const partialCount = Object.keys(packageSchemas).filter(k => k.startsWith('__partial__')).length;\n const nsInfo = entry.namespace ? ` [${entry.namespace}]` : '';\n logger.info(` • ${entry.path}${nsInfo}: ${count} schema(s)${partialCount > 0 ? ` + ${partialCount} partial(s)` : ''}`);\n schemas = { ...packageSchemas, ...schemas };\n hasPackageSchemas = true;\n } else {\n logger.warn(` • ${entry.path}: directory not found (skipped)`);\n }\n }\n }\n\n // Resolve partial schemas from packages\n if (hasPackageSchemas) {\n schemas = mergePartialSchemas(schemas);\n }\n\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Total: ${schemaCount} schema(s)`);\n\n // Validate schemas first\n logger.step('Validating schemas...');\n const validationResult = validateSchemas(schemas);\n\n if (!validationResult.valid) {\n logger.error('Schema validation failed. Fix errors before running diff.');\n for (const error of validationResult.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n }\n process.exit(2);\n }\n\n // Run diff operation\n logger.step('Running Atlas diff...');\n const lockPath = resolve(rootDir, config.lockFilePath);\n\n const diffResult = await runDiffOperation({\n schemas,\n devUrl: config.database.devUrl!,\n lockFilePath: lockPath,\n driver: config.database.driver,\n workDir: rootDir,\n });\n\n if (!diffResult.hasChanges) {\n logger.success('No changes detected');\n return;\n }\n\n // Show changes preview\n logger.newline();\n console.log(pc.bold('Changes detected:'));\n console.log();\n console.log(diffResult.formattedPreview);\n\n if (diffResult.hasDestructiveChanges) {\n logger.newline();\n logger.warn('This preview contains destructive changes. Review carefully.');\n }\n\n // Check mode: exit with code 1 if changes exist\n if (options.check) {\n logger.newline();\n logger.info('Changes detected (--check mode)');\n process.exit(1);\n }\n\n logger.newline();\n logger.info('Run \"omnify generate\" to create migrations');\n}\n\n/**\n * Registers the diff command.\n */\nexport function registerDiffCommand(program: Command): void {\n program\n .command('diff')\n .description('Show pending schema changes')\n .option('-v, --verbose', 'Show detailed output')\n .option('--check', 'Exit with code 1 if changes exist (for CI)')\n .action(async (options: DiffOptions) => {\n try {\n await runDiff(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Diff Operations\n *\n * High-level diff operations combining atlas-adapter functions.\n */\n\nimport type { SchemaCollection, DatabaseDriver } from '@famgia/omnify-types';\nimport {\n generatePreview,\n formatPreview,\n type ChangePreview,\n} from '@famgia/omnify-atlas';\n\n/**\n * Options for running diff.\n */\nexport interface RunDiffOptions {\n schemas: SchemaCollection;\n devUrl: string;\n lockFilePath: string;\n driver: DatabaseDriver;\n workDir: string;\n}\n\n/**\n * Result of diff operation.\n */\nexport interface DiffOperationResult {\n hasChanges: boolean;\n hasDestructiveChanges: boolean;\n preview: ChangePreview;\n formattedPreview: string;\n sql: string;\n}\n\n/**\n * Runs a full diff operation.\n */\nexport async function runDiffOperation(options: RunDiffOptions): Promise<DiffOperationResult> {\n const { schemas, devUrl, driver, workDir } = options;\n\n // Generate preview using atlas-adapter\n const preview = await generatePreview(schemas, {\n driver,\n devUrl,\n workDir,\n }, {\n warnDestructive: true,\n showSql: true,\n });\n\n // Format preview for display\n const formattedPreview = formatPreview(preview, 'text');\n\n return {\n hasChanges: preview.hasChanges,\n hasDestructiveChanges: preview.hasDestructiveChanges,\n preview,\n formattedPreview,\n sql: preview.sql,\n };\n}\n\n/**\n * Re-export for convenience.\n */\nexport { formatPreview };\n","/**\n * @famgia/omnify-cli - Generate Command\n *\n * Generates Laravel migrations and TypeScript types from schemas.\n * Supports both direct generation and plugin-based generation.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, readdirSync } from 'node:fs';\nimport { resolve, dirname, relative } from 'node:path';\nimport type { Command } from 'commander';\nimport {\n loadSchemas,\n mergePartialSchemas,\n validateSchemas,\n OmnifyError,\n PluginManager,\n createVersionStore,\n type VersionSchemaSnapshot,\n type VersionPropertySnapshot,\n type VersionChange,\n} from '@famgia/omnify-core';\nimport type { LoadedSchema } from '@famgia/omnify-types';\nimport {\n writeLockFile,\n readLockFile,\n updateLockFile,\n buildSchemaSnapshots,\n compareSchemasDeep,\n isLockFileV2,\n validateMigrations,\n getMigrationsToRegenerate,\n VERSION_CHAIN_FILE,\n readVersionChain,\n checkBulkLockViolation,\n type SchemaChange,\n type MigrationValidation,\n} from '@famgia/omnify-atlas';\nimport {\n generateMigrations,\n generateMigrationsFromChanges,\n generateModels,\n getModelPath,\n generateFactories,\n getFactoryPath,\n} from '@famgia/omnify-laravel';\nimport { generateTypeScript, generateAIGuides as generateTypescriptAIGuides, shouldGenerateAIGuides as shouldGenerateTypescriptAIGuides } from '@famgia/omnify-typescript';\nimport type {\n OmnifyPlugin,\n SchemaCollection,\n GeneratorOutput,\n} from '@famgia/omnify-types';\nimport type { ResolvedOmnifyConfig } from '../config/types.js';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { configureOmnifyAlias, addPluginEnumAlias, addPluginEnumTsconfigPath } from '../config/alias-config.js';\nimport { logger } from '../output/logger.js';\nimport { generateAIGuides } from '../guides/index.js';\n\n/**\n * Generate command options.\n */\ninterface GenerateOptions {\n verbose?: boolean;\n migrationsOnly?: boolean;\n typesOnly?: boolean;\n force?: boolean;\n /** CI mode: check if migrations are in sync without generating */\n check?: boolean;\n /** Show stale migration warnings */\n warnStale?: boolean;\n}\n\n\n/**\n * Checks if plugins have generators configured.\n */\nfunction hasPluginGenerators(plugins: readonly OmnifyPlugin[]): boolean {\n return plugins.some((p) => p.generators && p.generators.length > 0);\n}\n\n/**\n * Scans a directory for existing migration files and returns tables that already have CREATE migrations.\n */\nfunction getExistingMigrationTables(migrationsDir: string): Set<string> {\n const existingTables = new Set<string>();\n\n if (!existsSync(migrationsDir)) {\n return existingTables;\n }\n\n try {\n const files = readdirSync(migrationsDir);\n // Match pattern: YYYY_MM_DD_HHMMSS_create_<table>_table.php\n const createMigrationPattern = /^\\d{4}_\\d{2}_\\d{2}_\\d{6}_create_(.+)_table\\.php$/;\n\n for (const file of files) {\n const match = file.match(createMigrationPattern);\n if (match) {\n existingTables.add(match[1]); // table name\n }\n }\n } catch {\n // Ignore errors reading directory\n }\n\n return existingTables;\n}\n\n/**\n * Logs detailed schema change information.\n */\nfunction logSchemaChange(change: SchemaChange, verbose: boolean): void {\n logger.debug(` ${change.changeType}: ${change.schemaName}`);\n\n if (!verbose || change.changeType !== 'modified') {\n return;\n }\n\n // Log column changes\n if (change.columnChanges) {\n for (const col of change.columnChanges) {\n if (col.changeType === 'added') {\n logger.debug(` + column: ${col.column} (${col.currentDef?.type})`);\n } else if (col.changeType === 'removed') {\n logger.debug(` - column: ${col.column}`);\n } else if (col.changeType === 'modified' && col.modifications) {\n logger.debug(` ~ column: ${col.column} [${col.modifications.join(', ')}]`);\n } else if (col.changeType === 'renamed' && col.previousColumn) {\n const mods = col.modifications?.length ? ` [${col.modifications.join(', ')}]` : '';\n logger.debug(` → column: ${col.previousColumn} → ${col.column}${mods}`);\n }\n }\n }\n\n // Log index changes\n if (change.indexChanges) {\n for (const idx of change.indexChanges) {\n const type = idx.index.unique ? 'unique' : 'index';\n if (idx.changeType === 'added') {\n logger.debug(` + ${type}: (${idx.index.columns.join(', ')})`);\n } else {\n logger.debug(` - ${type}: (${idx.index.columns.join(', ')})`);\n }\n }\n }\n\n // Log option changes\n if (change.optionChanges) {\n if (change.optionChanges.timestamps) {\n const { from, to } = change.optionChanges.timestamps;\n logger.debug(` ~ timestamps: ${from} → ${to}`);\n }\n if (change.optionChanges.softDelete) {\n const { from, to } = change.optionChanges.softDelete;\n logger.debug(` ~ softDelete: ${from} → ${to}`);\n }\n if (change.optionChanges.idType) {\n const { from, to } = change.optionChanges.idType;\n logger.debug(` ~ idType: ${from} → ${to}`);\n }\n }\n}\n\n/**\n * Convert property to version snapshot format.\n */\nfunction propertyToVersionSnapshot(prop: Record<string, unknown>): VersionPropertySnapshot {\n return {\n type: prop.type as string,\n ...(prop.displayName !== undefined && { displayName: prop.displayName as string }),\n ...(prop.description !== undefined && { description: prop.description as string }),\n ...(prop.nullable !== undefined && { nullable: prop.nullable as boolean }),\n ...(prop.unique !== undefined && { unique: prop.unique as boolean }),\n ...(prop.default !== undefined && { default: prop.default }),\n ...(prop.length !== undefined && { length: prop.length as number }),\n ...(prop.unsigned !== undefined && { unsigned: prop.unsigned as boolean }),\n ...(prop.precision !== undefined && { precision: prop.precision as number }),\n ...(prop.scale !== undefined && { scale: prop.scale as number }),\n ...(prop.enum !== undefined && { enum: prop.enum as readonly string[] }),\n ...(prop.relation !== undefined && { relation: prop.relation as string }),\n ...(prop.target !== undefined && { target: prop.target as string }),\n ...(prop.targets !== undefined && { targets: prop.targets as readonly string[] }),\n ...(prop.morphName !== undefined && { morphName: prop.morphName as string }),\n ...(prop.onDelete !== undefined && { onDelete: prop.onDelete as string }),\n ...(prop.onUpdate !== undefined && { onUpdate: prop.onUpdate as string }),\n ...(prop.mappedBy !== undefined && { mappedBy: prop.mappedBy as string }),\n ...(prop.inversedBy !== undefined && { inversedBy: prop.inversedBy as string }),\n ...(prop.joinTable !== undefined && { joinTable: prop.joinTable as string }),\n ...(prop.owning !== undefined && { owning: prop.owning as boolean }),\n // Laravel-specific properties\n ...(prop.hidden !== undefined && { hidden: prop.hidden as boolean }),\n ...(prop.fillable !== undefined && { fillable: prop.fillable as boolean }),\n // Per-field overrides for compound types\n ...(prop.fields !== undefined && { fields: prop.fields as Record<string, { nullable?: boolean; hidden?: boolean; fillable?: boolean }> }),\n };\n}\n\n/**\n * Convert schemas to version snapshot format.\n */\nfunction schemasToVersionSnapshot(\n schemas: SchemaCollection\n): Record<string, VersionSchemaSnapshot> {\n const snapshot: Record<string, VersionSchemaSnapshot> = {};\n\n for (const [name, schema] of Object.entries(schemas)) {\n const properties: Record<string, VersionPropertySnapshot> = {};\n if (schema.properties) {\n for (const [propName, prop] of Object.entries(schema.properties)) {\n properties[propName] = propertyToVersionSnapshot(prop as unknown as Record<string, unknown>);\n }\n }\n\n const opts = schema.options;\n snapshot[name] = {\n name: schema.name,\n kind: (schema.kind ?? 'object') as 'object' | 'enum',\n ...(Object.keys(properties).length > 0 && { properties }),\n ...(schema.values && { values: schema.values }),\n ...(opts && {\n options: {\n ...(opts.id !== undefined && { id: opts.id }),\n ...(opts.idType !== undefined && { idType: opts.idType }),\n ...(opts.timestamps !== undefined && { timestamps: opts.timestamps }),\n ...(opts.softDelete !== undefined && { softDelete: opts.softDelete }),\n ...(opts.tableName !== undefined && { tableName: opts.tableName }),\n ...(opts.translations !== undefined && { translations: opts.translations }),\n ...(opts.authenticatable !== undefined && { authenticatable: opts.authenticatable }),\n },\n }),\n };\n }\n\n return snapshot;\n}\n\n/**\n * Convert SchemaChange to VersionChange format.\n */\nfunction schemaChangeToVersionChange(change: SchemaChange): VersionChange[] {\n const changes: VersionChange[] = [];\n\n if (change.changeType === 'added') {\n changes.push({ action: 'schema_added', schema: change.schemaName });\n } else if (change.changeType === 'removed') {\n changes.push({ action: 'schema_removed', schema: change.schemaName });\n } else if (change.changeType === 'modified') {\n // Add property-level changes\n if (change.columnChanges) {\n for (const col of change.columnChanges) {\n if (col.changeType === 'added') {\n changes.push({\n action: 'property_added',\n schema: change.schemaName,\n property: col.column,\n to: col.currentDef,\n });\n } else if (col.changeType === 'removed') {\n changes.push({\n action: 'property_removed',\n schema: change.schemaName,\n property: col.column,\n from: col.previousDef,\n });\n } else if (col.changeType === 'modified') {\n changes.push({\n action: 'property_modified',\n schema: change.schemaName,\n property: col.column,\n from: col.previousDef,\n to: col.currentDef,\n });\n } else if (col.changeType === 'renamed') {\n changes.push({\n action: 'property_renamed',\n schema: change.schemaName,\n property: col.column,\n from: col.previousColumn,\n to: col.column,\n });\n }\n }\n }\n\n // Add option changes\n if (change.optionChanges) {\n changes.push({\n action: 'option_changed',\n schema: change.schemaName,\n from: change.optionChanges,\n to: change.optionChanges,\n });\n }\n\n // Add index changes\n if (change.indexChanges) {\n for (const idx of change.indexChanges) {\n if (idx.changeType === 'added') {\n changes.push({\n action: 'index_added',\n schema: change.schemaName,\n to: idx.index,\n });\n } else {\n changes.push({\n action: 'index_removed',\n schema: change.schemaName,\n from: idx.index,\n });\n }\n }\n }\n }\n\n return changes;\n}\n\n/**\n * Writes generator outputs to disk.\n */\nfunction writeGeneratorOutputs(\n outputs: readonly GeneratorOutput[],\n rootDir: string\n): { migrations: number; types: number; models: number; factories: number; other: number } {\n const counts = { migrations: 0, types: 0, models: 0, factories: 0, other: 0 };\n\n for (const output of outputs) {\n const filePath = resolve(rootDir, output.path);\n const dir = dirname(filePath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n logger.debug(`Created directory: ${dir}`);\n }\n\n // Skip writing if file exists and skipIfExists is true\n if (output.skipIfExists && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${output.path}`);\n continue;\n }\n\n writeFileSync(filePath, output.content);\n logger.debug(`Created: ${output.path}`);\n\n if (output.type === 'migration') counts.migrations++;\n else if (output.type === 'type') counts.types++;\n else if (output.type === 'model') counts.models++;\n else if (output.type === 'factory') counts.factories++;\n else counts.other++;\n }\n\n return counts;\n}\n\n/**\n * Runs generation using the plugin system.\n */\nasync function runPluginGeneration(\n plugins: readonly OmnifyPlugin[],\n schemas: SchemaCollection,\n rootDir: string,\n verbose: boolean,\n changes?: readonly SchemaChange[]\n): Promise<{ migrations: number; types: number; models: number; factories: number; other: number }> {\n const pluginManager = new PluginManager({\n cwd: rootDir,\n verbose,\n logger: {\n debug: (msg) => logger.debug(msg),\n info: (msg) => logger.info(msg),\n warn: (msg) => logger.warn(msg),\n error: (msg) => logger.error(msg),\n },\n });\n\n // Register plugins\n for (const plugin of plugins) {\n await pluginManager.register(plugin);\n }\n\n // Run generators with schema changes\n const result = await pluginManager.runGenerators(schemas, changes);\n\n if (!result.success) {\n for (const error of result.errors) {\n logger.error(`Generator ${error.generatorName} failed: ${error.message}`);\n }\n throw new Error('Generator execution failed');\n }\n\n // Write outputs\n return writeGeneratorOutputs(result.outputs, rootDir);\n}\n\n/**\n * Runs generation using direct function calls (legacy mode).\n */\nfunction runDirectGeneration(\n schemas: SchemaCollection,\n config: ResolvedOmnifyConfig,\n rootDir: string,\n options: GenerateOptions,\n changes: readonly SchemaChange[]\n): { migrations: number; types: number; models: number; factories: number } {\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n let modelsGenerated = 0;\n let factoriesGenerated = 0;\n\n // Extract custom types from plugins for generators\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypesMap.set(typeDef.name, typeDef);\n }\n }\n }\n\n // Extract plugin enums for TypeScript generation\n const pluginEnumsMap = new Map<string, import('@famgia/omnify-types').PluginEnumDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.enums) {\n for (const enumDef of plugin.enums) {\n pluginEnumsMap.set(enumDef.name, enumDef);\n }\n }\n }\n\n // Generate Laravel migrations\n if (!options.typesOnly && config.output.laravel) {\n logger.step('Generating Laravel migrations...');\n\n const migrationsDir = resolve(rootDir, config.output.laravel.migrationsPath);\n if (!existsSync(migrationsDir)) {\n mkdirSync(migrationsDir, { recursive: true });\n logger.debug(`Created directory: ${migrationsDir}`);\n }\n\n // Separate added schemas from modified/removed\n const addedSchemaNames = new Set(\n changes.filter((c) => c.changeType === 'added').map((c) => c.schemaName)\n );\n const alterChanges = changes.filter(\n (c) => c.changeType === 'modified' || c.changeType === 'removed'\n );\n\n // Get existing migration tables to avoid duplicates\n const existingTables = getExistingMigrationTables(migrationsDir);\n\n // Generate CREATE migrations only for added schemas\n if (addedSchemaNames.size > 0) {\n const addedSchemas = Object.fromEntries(\n Object.entries(schemas).filter(([name]) => addedSchemaNames.has(name))\n ) as SchemaCollection;\n\n const createMigrations = generateMigrations(addedSchemas, { customTypes: customTypesMap });\n for (const migration of createMigrations) {\n const tableName = migration.tables[0];\n // Skip if table already has a create migration\n if (existingTables.has(tableName)) {\n logger.debug(`Skipped CREATE for ${tableName} (already exists)`);\n continue;\n }\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n }\n\n // Generate ALTER/DROP migrations for modified/removed schemas\n if (alterChanges.length > 0) {\n const alterMigrations = generateMigrationsFromChanges(alterChanges);\n for (const migration of alterMigrations) {\n const filePath = resolve(migrationsDir, migration.fileName);\n writeFileSync(filePath, migration.content);\n logger.debug(`Created: ${migration.fileName}`);\n migrationsGenerated++;\n }\n }\n\n logger.success(`Generated ${migrationsGenerated} migration(s)`);\n }\n\n // Generate Laravel models\n if (!options.typesOnly && config.output.laravel?.modelsPath) {\n logger.step('Generating Laravel models...');\n\n const modelsPath = config.output.laravel.modelsPath;\n const baseModelsPath = config.output.laravel.baseModelsPath ?? `${modelsPath}/OmnifyBase`;\n\n // Ensure directories exist\n const modelsDir = resolve(rootDir, modelsPath);\n const baseModelsDir = resolve(rootDir, baseModelsPath);\n if (!existsSync(modelsDir)) {\n mkdirSync(modelsDir, { recursive: true });\n }\n if (!existsSync(baseModelsDir)) {\n mkdirSync(baseModelsDir, { recursive: true });\n }\n\n const providersPath = config.output.laravel.providersPath ?? 'app/Providers';\n\n const models = generateModels(schemas, {\n modelPath: modelsPath,\n baseModelPath: baseModelsPath,\n providersPath: providersPath,\n customTypes: customTypesMap,\n });\n\n for (const model of models) {\n const filePath = resolve(rootDir, getModelPath(model));\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n\n // Skip user models if they exist (don't overwrite customizations)\n // Always overwrite base models (overwrite: true)\n if (!model.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${getModelPath(model)}`);\n continue;\n }\n\n writeFileSync(filePath, model.content);\n logger.debug(`Created: ${getModelPath(model)}`);\n modelsGenerated++;\n }\n\n logger.success(`Generated ${modelsGenerated} model(s)`);\n }\n\n // Generate Laravel factories\n if (!options.typesOnly && config.output.laravel?.factoriesPath) {\n logger.step('Generating Laravel factories...');\n\n const factoriesPath = config.output.laravel.factoriesPath;\n const factoriesDir = resolve(rootDir, factoriesPath);\n if (!existsSync(factoriesDir)) {\n mkdirSync(factoriesDir, { recursive: true });\n }\n\n const factories = generateFactories(schemas, {\n factoryPath: factoriesPath,\n });\n\n for (const factory of factories) {\n const filePath = resolve(rootDir, getFactoryPath(factory));\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n\n // Skip user factories if they exist (don't overwrite customizations)\n if (!factory.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${getFactoryPath(factory)}`);\n continue;\n }\n\n writeFileSync(filePath, factory.content);\n logger.debug(`Created: ${getFactoryPath(factory)}`);\n factoriesGenerated++;\n }\n\n logger.success(`Generated ${factoriesGenerated} factory(ies)`);\n }\n\n // Generate TypeScript types\n if (!options.migrationsOnly && config.output.typescript) {\n logger.step('Generating TypeScript types...');\n\n const tsConfig = config.output.typescript as {\n path: string;\n schemasDir?: string;\n enumDir?: string;\n generateRules?: boolean;\n validationTemplates?: Record<string, Record<string, string>>;\n };\n\n // Resolve paths: basePath + subdirectories\n const basePath = resolve(rootDir, tsConfig.path);\n const schemasDir = resolve(basePath, tsConfig.schemasDir ?? 'schemas');\n const enumDir = resolve(basePath, tsConfig.enumDir ?? 'enum');\n\n // Generated files go to node_modules/@omnify-base (auto-generated)\n const omnifyBaseDir = resolve(rootDir, 'node_modules/@omnify-base');\n const pluginEnumDir = resolve(omnifyBaseDir, 'enum');\n const baseSchemasDir = resolve(omnifyBaseDir, 'schemas');\n\n // Calculate enum import prefix (relative path from schemas to enum)\n const enumImportPrefix = relative(schemasDir, enumDir).replace(/\\\\/g, '/');\n\n // Create directories\n if (!existsSync(schemasDir)) {\n mkdirSync(schemasDir, { recursive: true });\n logger.debug(`Created directory: ${schemasDir}`);\n }\n if (!existsSync(enumDir)) {\n mkdirSync(enumDir, { recursive: true });\n logger.debug(`Created directory: ${enumDir}`);\n }\n if (!existsSync(pluginEnumDir)) {\n mkdirSync(pluginEnumDir, { recursive: true });\n logger.debug(`Created directory: ${pluginEnumDir}`);\n }\n if (!existsSync(baseSchemasDir)) {\n mkdirSync(baseSchemasDir, { recursive: true });\n logger.debug(`Created directory: ${baseSchemasDir}`);\n }\n\n // Create package.json for @omnify-base package\n const omnifyPkgJson = resolve(omnifyBaseDir, 'package.json');\n if (!existsSync(omnifyPkgJson)) {\n writeFileSync(omnifyPkgJson, JSON.stringify({\n name: '@omnify-base',\n version: '0.0.0',\n private: true,\n exports: {\n './enum/*': './enum/*.js',\n './schemas/*': './schemas/*.js',\n },\n }, null, 2));\n }\n\n // Enable multiLocale if locale config has multiple locales\n const isMultiLocale = config.locale && config.locale.locales && config.locale.locales.length > 1;\n const typeFiles = generateTypeScript(schemas, {\n customTypes: customTypesMap,\n pluginEnums: pluginEnumsMap,\n localeConfig: config.locale,\n multiLocale: isMultiLocale,\n generateRules: tsConfig.generateRules ?? true,\n validationTemplates: tsConfig.validationTemplates,\n enumImportPrefix,\n pluginEnumImportPrefix: '@omnify-base/enum',\n baseImportPrefix: '@omnify-base/schemas',\n schemaEnumImportPrefix: '@omnify/enum', // Absolute path for node_modules base files\n });\n\n for (const file of typeFiles) {\n // Determine output directory based on file category\n let outputDir: string;\n let outputFilePath = file.filePath;\n\n if (file.category === 'plugin-enum') {\n outputDir = pluginEnumDir;\n } else if (file.category === 'base') {\n // Base files go to node_modules/@omnify-base/schemas/\n outputDir = baseSchemasDir;\n // Remove 'base/' prefix from filePath since we're already in schemas/\n outputFilePath = file.filePath.replace(/^base\\//, '');\n } else if (file.category === 'enum') {\n outputDir = enumDir;\n } else {\n outputDir = schemasDir;\n }\n const filePath = resolve(outputDir, outputFilePath);\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n // Skip if file exists and shouldn't be overwritten\n if (!file.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${file.filePath}`);\n continue;\n }\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.filePath}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n\n // Auto-configure @omnify alias (silent mode - only log if changes made)\n const aliasResult = configureOmnifyAlias(rootDir, tsConfig.path, true);\n if (aliasResult.viteUpdated) {\n logger.success('Auto-configured @omnify alias in vite.config');\n }\n if (aliasResult.tsconfigUpdated) {\n logger.success('Auto-configured @omnify/* path in tsconfig.json');\n }\n\n // Configure @omnify-base alias (always needed for base schemas, enums, common, i18n)\n const pluginAliasResult = addPluginEnumAlias(rootDir);\n if (pluginAliasResult.updated) {\n logger.success('Auto-configured @omnify-base alias in vite.config');\n }\n const pluginPathResult = addPluginEnumTsconfigPath(rootDir);\n if (pluginPathResult.updated) {\n logger.success('Auto-configured @omnify-base/* path in tsconfig.json');\n }\n }\n\n return { migrations: migrationsGenerated, types: typesGenerated, models: modelsGenerated, factories: factoriesGenerated };\n}\n\n/**\n * Runs the generate command.\n */\nexport async function runGenerate(options: GenerateOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Generating Outputs');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config (devUrl not required for generate)\n validateConfig(config, rootDir);\n\n // Load schemas from main directory\n const schemaPath = resolve(rootDir, config.schemasDir);\n logger.step(`Loading schemas from ${schemaPath}`);\n\n let schemas = await loadSchemas(schemaPath);\n logger.debug(`Found ${Object.keys(schemas).length} schema(s) in main directory`);\n\n // Load additional schemas from config (additionalSchemaPaths)\n // Includes auto-discovered packages from .omnify-packages.json\n const additionalPaths = config.additionalSchemaPaths ?? [];\n let hasPackageSchemas = false;\n\n if (additionalPaths.length > 0) {\n logger.step(`Loading schemas from ${additionalPaths.length} additional path(s)`);\n for (const entry of additionalPaths) {\n // Resolve relative path from rootDir\n const absolutePath = resolve(rootDir, entry.path);\n logger.debug(` Checking: ${entry.path} → ${absolutePath}`);\n\n if (existsSync(absolutePath)) {\n // Load package schemas with skipPartialResolution to defer resolution\n // This allows partials to target schemas from main directory\n let packageSchemas = await loadSchemas(absolutePath, { skipPartialResolution: true });\n\n // パッケージ出力設定がある場合、各スキーマにpackageOutputを付与\n if (entry.output) {\n const schemasWithOutput: Record<string, LoadedSchema> = {};\n for (const [name, schema] of Object.entries(packageSchemas)) {\n schemasWithOutput[name] = {\n ...schema,\n packageOutput: entry.output,\n };\n }\n packageSchemas = schemasWithOutput;\n }\n\n const count = Object.keys(packageSchemas).filter(k => !k.startsWith('__partial__')).length;\n const partialCount = Object.keys(packageSchemas).filter(k => k.startsWith('__partial__')).length;\n const nsInfo = entry.namespace ? ` [${entry.namespace}]` : '';\n const outputInfo = entry.output?.laravel ? ` → ${entry.output.laravel.base}` : '';\n logger.info(` • ${entry.path}${nsInfo}: ${count} schema(s)${partialCount > 0 ? ` + ${partialCount} partial(s)` : ''}${outputInfo}`);\n // Merge schemas (package schemas won't override main schemas)\n schemas = { ...packageSchemas, ...schemas };\n hasPackageSchemas = true;\n } else {\n logger.warn(` • ${entry.path}: directory not found (skipped)`);\n logger.debug(` Resolved path: ${absolutePath}`);\n }\n }\n }\n\n // Resolve partial schemas from packages now that all schemas are merged\n if (hasPackageSchemas) {\n schemas = mergePartialSchemas(schemas);\n }\n\n const schemaCount = Object.keys(schemas).length;\n\n if (schemaCount === 0) {\n logger.warn('No schema files found');\n return;\n }\n\n logger.debug(`Total: ${schemaCount} schema(s)`);\n\n // Extract custom type names from plugins for validation\n const customTypeNames: string[] = [];\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypeNames.push(typeDef.name);\n }\n }\n }\n\n // Validate schemas first\n logger.step('Validating schemas...');\n const validationResult = validateSchemas(schemas, {\n customTypes: customTypeNames,\n });\n\n if (!validationResult.valid) {\n logger.error('Schema validation failed. Fix errors before generating.');\n for (const error of validationResult.errors) {\n const omnifyError = OmnifyError.fromInfo(error);\n logger.formatError(omnifyError);\n }\n process.exit(2);\n }\n\n // Check for changes by comparing lock file with current schemas\n logger.step('Checking for changes...');\n const lockPath = resolve(rootDir, config.lockFilePath);\n\n const existingLock = await readLockFile(lockPath);\n const currentSnapshots = await buildSchemaSnapshots(schemas);\n\n // Use v2 format for deep diff\n const v2Lock = existingLock && isLockFileV2(existingLock) ? existingLock : null;\n const comparison = compareSchemasDeep(currentSnapshots, v2Lock);\n\n // Check version chain for locked schemas (blockchain-like protection)\n const chainFilePath = resolve(rootDir, VERSION_CHAIN_FILE);\n const versionChain = await readVersionChain(chainFilePath);\n\n if (versionChain && comparison.hasChanges) {\n // Build list of schemas being removed or modified\n const schemaActions: { name: string; action: 'delete' | 'modify' }[] = [];\n\n for (const change of comparison.changes) {\n if (change.changeType === 'removed') {\n schemaActions.push({ name: change.schemaName, action: 'delete' });\n } else if (change.changeType === 'modified') {\n schemaActions.push({ name: change.schemaName, action: 'modify' });\n }\n }\n\n if (schemaActions.length > 0) {\n const lockCheck = checkBulkLockViolation(versionChain, schemaActions);\n\n if (!lockCheck.allowed) {\n logger.newline();\n logger.error('🔒 VERSION LOCK VIOLATION DETECTED');\n logger.error('');\n logger.error('The following schemas are locked in production:');\n for (const name of lockCheck.affectedSchemas) {\n logger.error(` • ${name}`);\n }\n logger.error('');\n logger.error(`Locked in version(s): ${lockCheck.lockedInVersions.join(', ')}`);\n logger.error('');\n logger.error('These schemas CANNOT be modified or deleted.');\n logger.error('This is enforced by the blockchain-like version chain.');\n logger.newline();\n\n throw new OmnifyError(\n lockCheck.reason ?? 'Schema modification blocked by version lock',\n 'E407',\n undefined,\n 'Restore the original schema files or create new schemas instead of modifying locked ones.'\n );\n }\n }\n }\n\n // Validate existing migrations (check for missing/modified files)\n if (existingLock && config.output.laravel?.migrationsPath) {\n const migrationsDir = resolve(rootDir, config.output.laravel.migrationsPath);\n const migrationValidation = await validateMigrations(existingLock, migrationsDir);\n\n // Report validation results\n if (!migrationValidation.valid) {\n logger.newline();\n logger.warn('Migration file issues detected:');\n\n if (migrationValidation.missingFiles.length > 0) {\n logger.error(` Missing files (${migrationValidation.missingFiles.length}):`);\n for (const file of migrationValidation.missingFiles) {\n logger.error(` - ${file}`);\n }\n }\n\n if (migrationValidation.modifiedFiles.length > 0) {\n logger.warn(` Modified files (${migrationValidation.modifiedFiles.length}):`);\n for (const file of migrationValidation.modifiedFiles) {\n logger.warn(` - ${file} (checksum mismatch)`);\n }\n }\n\n logger.newline();\n }\n\n // Report stale migrations if --warn-stale is enabled\n if ((options.warnStale ?? true) && migrationValidation.staleFiles.length > 0) {\n logger.newline();\n logger.warn('⚠️ Stale migrations detected (old timestamp, not in lock file):');\n for (const file of migrationValidation.staleFiles) {\n logger.warn(` - ${file}`);\n }\n logger.warn(' These may be from merged branches. Review before running migrate.');\n logger.newline();\n }\n\n // Check mode: exit with status based on validation\n if (options.check) {\n logger.newline();\n logger.step('CI Check Mode Results:');\n logger.info(` Schemas: ${schemaCount}`);\n logger.info(` Tracked migrations: ${migrationValidation.totalTracked}`);\n logger.info(` Migrations on disk: ${migrationValidation.totalOnDisk}`);\n logger.info(` Schema changes: ${comparison.changes.length}`);\n\n const hasIssues = !migrationValidation.valid || comparison.hasChanges;\n\n if (hasIssues) {\n logger.newline();\n if (comparison.hasChanges) {\n logger.error('❌ Schema changes detected - run \"npx omnify generate\" to update migrations');\n }\n if (migrationValidation.missingFiles.length > 0) {\n logger.error('❌ Missing migration files - regenerate or restore from git');\n }\n if (migrationValidation.modifiedFiles.length > 0) {\n logger.warn('⚠️ Modified migration files - may cause inconsistencies');\n }\n process.exit(1);\n } else {\n logger.success('✅ All migrations in sync');\n return;\n }\n }\n\n // Regenerate missing CREATE migration files\n if (migrationValidation.missingFiles.length > 0 && config.output.laravel) {\n const toRegenerate = getMigrationsToRegenerate(existingLock, migrationValidation.missingFiles);\n\n if (toRegenerate.length > 0) {\n const createMigrations = toRegenerate.filter(m => m.type === 'create');\n const alterMigrations = toRegenerate.filter(m => m.type === 'alter' || m.type === 'drop');\n\n if (createMigrations.length > 0) {\n logger.info(`Regenerating ${createMigrations.length} missing CREATE migration(s) with original timestamps...`);\n const migrationsDir = resolve(rootDir, config.output.laravel.migrationsPath);\n\n // Extract custom types for generation\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const [typeName, typeDef] of Object.entries(plugin.types)) {\n customTypesMap.set(typeName, typeDef);\n }\n }\n }\n\n for (const migData of createMigrations) {\n // Find schema(s) for this migration\n const migrationSchemas = Object.fromEntries(\n Object.entries(schemas).filter(([name]) => migData.schemas.includes(name))\n ) as SchemaCollection;\n\n if (Object.keys(migrationSchemas).length === 0) {\n logger.warn(` Cannot regenerate ${migData.fileName}: schema not found`);\n continue;\n }\n\n // Regenerate with original timestamp\n const regenerated = generateMigrations(migrationSchemas, {\n timestamp: migData.timestamp,\n customTypes: customTypesMap,\n });\n\n for (const mig of regenerated) {\n // Use the original filename to maintain consistency\n const filePath = resolve(migrationsDir, migData.fileName);\n writeFileSync(filePath, mig.content);\n logger.success(` Regenerated: ${migData.fileName}`);\n }\n }\n }\n\n if (alterMigrations.length > 0) {\n logger.warn(`Cannot regenerate ${alterMigrations.length} ALTER/DROP migration(s) - original change data not available.`);\n logger.warn(' Please restore these files from git or reset migrations with: npx omnify reset');\n for (const m of alterMigrations) {\n logger.warn(` - ${m.fileName}`);\n }\n }\n }\n }\n }\n\n // Only skip if no changes AND no outputs to regenerate\n // Models/TypeScript with overwrite: true should always be regenerated\n const skipMigrations = !comparison.hasChanges && !options.force;\n const pluginsHaveGenerators = config.plugins.some(p => p.generators && p.generators.length > 0);\n const hasTypescriptOutput = !!config.output.typescript;\n\n if (skipMigrations && !config.output.laravel?.modelsPath && !pluginsHaveGenerators && !hasTypescriptOutput) {\n logger.success('No changes to generate');\n return;\n }\n\n if (comparison.hasChanges) {\n logger.debug(`Detected ${comparison.changes.length} change(s)`);\n for (const change of comparison.changes) {\n logSchemaChange(change, options.verbose ?? false);\n }\n }\n\n let migrationsGenerated = 0;\n let typesGenerated = 0;\n let modelsGenerated = 0;\n let factoriesGenerated = 0;\n\n // Check if plugins have generators\n const usePlugins = hasPluginGenerators(config.plugins);\n\n // Extract custom types from plugins for generators\n const customTypesMap = new Map<string, import('@famgia/omnify-types').CustomTypeDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.types) {\n for (const typeDef of plugin.types) {\n customTypesMap.set(typeDef.name, typeDef);\n }\n }\n }\n\n // Extract plugin enums for TypeScript generation\n const pluginEnumsMap = new Map<string, import('@famgia/omnify-types').PluginEnumDefinition>();\n for (const plugin of config.plugins) {\n if (plugin.enums) {\n for (const enumDef of plugin.enums) {\n pluginEnumsMap.set(enumDef.name, enumDef);\n }\n }\n }\n\n if (usePlugins) {\n // Use plugin system for generation\n logger.step('Running plugin generators...');\n const counts = await runPluginGeneration(\n config.plugins,\n schemas,\n rootDir,\n options.verbose ?? false,\n comparison.changes\n );\n migrationsGenerated = counts.migrations;\n typesGenerated = counts.types;\n\n if (counts.migrations > 0) {\n logger.success(`Generated ${counts.migrations} migration(s)`);\n }\n if (counts.types > 0) {\n logger.success(`Generated ${counts.types} TypeScript file(s)`);\n }\n if (counts.models > 0) {\n logger.success(`Generated ${counts.models} model(s)`);\n }\n if (counts.factories > 0) {\n logger.success(`Generated ${counts.factories} factory(ies)`);\n }\n if (counts.other > 0) {\n logger.success(`Generated ${counts.other} other file(s)`);\n }\n\n // Generate TypeScript from output.typescript config (even when using plugins)\n if (!options.migrationsOnly && config.output.typescript && typesGenerated === 0) {\n logger.step('Generating TypeScript types...');\n\n const tsConfig2 = config.output.typescript as {\n path: string;\n schemasDir?: string;\n enumDir?: string;\n generateRules?: boolean;\n validationTemplates?: Record<string, Record<string, string>>;\n };\n\n // Resolve paths: basePath + subdirectories\n const basePath2 = resolve(rootDir, tsConfig2.path);\n const schemasDir2 = resolve(basePath2, tsConfig2.schemasDir ?? 'schemas');\n const enumDir2 = resolve(basePath2, tsConfig2.enumDir ?? 'enum');\n\n // Generated files go to node_modules/@omnify-base (auto-generated)\n const omnifyBaseDir2 = resolve(rootDir, 'node_modules/@omnify-base');\n const pluginEnumDir2 = resolve(omnifyBaseDir2, 'enum');\n const baseSchemasDir2 = resolve(omnifyBaseDir2, 'schemas');\n\n // Calculate enum import prefix (relative path from schemas to enum)\n const enumImportPrefix2 = relative(schemasDir2, enumDir2).replace(/\\\\/g, '/');\n\n // Create directories\n if (!existsSync(schemasDir2)) {\n mkdirSync(schemasDir2, { recursive: true });\n logger.debug(`Created directory: ${schemasDir2}`);\n }\n if (!existsSync(enumDir2)) {\n mkdirSync(enumDir2, { recursive: true });\n logger.debug(`Created directory: ${enumDir2}`);\n }\n if (!existsSync(pluginEnumDir2)) {\n mkdirSync(pluginEnumDir2, { recursive: true });\n logger.debug(`Created directory: ${pluginEnumDir2}`);\n }\n if (!existsSync(baseSchemasDir2)) {\n mkdirSync(baseSchemasDir2, { recursive: true });\n logger.debug(`Created directory: ${baseSchemasDir2}`);\n }\n\n // Create package.json for @omnify-base package\n const omnifyPkgJson2 = resolve(omnifyBaseDir2, 'package.json');\n if (!existsSync(omnifyPkgJson2)) {\n writeFileSync(omnifyPkgJson2, JSON.stringify({\n name: '@omnify-base',\n version: '0.0.0',\n private: true,\n exports: {\n './enum/*': './enum/*.js',\n './schemas/*': './schemas/*.js',\n },\n }, null, 2));\n }\n\n // Enable multiLocale if locale config has multiple locales\n const isMultiLocale = config.locale && config.locale.locales && config.locale.locales.length > 1;\n const typeFiles = generateTypeScript(schemas, {\n customTypes: customTypesMap,\n pluginEnums: pluginEnumsMap,\n localeConfig: config.locale,\n multiLocale: isMultiLocale,\n generateRules: tsConfig2.generateRules ?? true,\n validationTemplates: tsConfig2.validationTemplates,\n enumImportPrefix: enumImportPrefix2,\n pluginEnumImportPrefix: '@omnify-base/enum',\n baseImportPrefix: '@omnify-base/schemas',\n schemaEnumImportPrefix: '@omnify/enum', // Absolute path for node_modules base files\n });\n\n for (const file of typeFiles) {\n // Determine output directory based on file category\n let outputDir2: string;\n let outputFilePath2 = file.filePath;\n\n if (file.category === 'plugin-enum') {\n outputDir2 = pluginEnumDir2;\n } else if (file.category === 'base') {\n // Base files go to node_modules/@omnify-base/schemas/\n outputDir2 = baseSchemasDir2;\n // Remove 'base/' prefix from filePath since we're already in schemas/\n outputFilePath2 = file.filePath.replace(/^base\\//, '');\n } else if (file.category === 'enum') {\n outputDir2 = enumDir2;\n } else {\n outputDir2 = schemasDir2;\n }\n const filePath = resolve(outputDir2, outputFilePath2);\n const fileDir = dirname(filePath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n // Skip if file exists and shouldn't be overwritten\n if (!file.overwrite && existsSync(filePath)) {\n logger.debug(`Skipped (exists): ${file.filePath}`);\n continue;\n }\n writeFileSync(filePath, file.content);\n logger.debug(`Created: ${file.filePath}`);\n typesGenerated++;\n }\n\n logger.success(`Generated ${typesGenerated} TypeScript file(s)`);\n\n // Auto-configure @omnify alias (silent mode - only log if changes made)\n const aliasResult = configureOmnifyAlias(rootDir, tsConfig2.path, true);\n if (aliasResult.viteUpdated) {\n logger.success('Auto-configured @omnify alias in vite.config');\n }\n if (aliasResult.tsconfigUpdated) {\n logger.success('Auto-configured @omnify/* path in tsconfig.json');\n }\n\n // Configure @omnify-base alias (always needed for base schemas, enums, common, i18n)\n const pluginAliasResult = addPluginEnumAlias(rootDir);\n if (pluginAliasResult.updated) {\n logger.success('Auto-configured @omnify-base alias in vite.config');\n }\n const pluginPathResult = addPluginEnumTsconfigPath(rootDir);\n if (pluginPathResult.updated) {\n logger.success('Auto-configured @omnify-base/* path in tsconfig.json');\n }\n\n // Generate TypeScript AI guides if needed\n if (shouldGenerateTypescriptAIGuides(rootDir)) {\n const tsAIResult = generateTypescriptAIGuides(rootDir, {\n typescriptPath: tsConfig2.path,\n });\n const tsClaudeTotal = tsAIResult.claudeGuides + tsAIResult.claudeChecklists;\n if (tsClaudeTotal > 0 || tsAIResult.cursorRules > 0) {\n logger.debug(`Generated ${tsClaudeTotal} React Claude files, ${tsAIResult.cursorRules} Cursor rules`);\n }\n }\n }\n } else {\n // Use direct generation (legacy mode)\n const counts = runDirectGeneration(schemas, config, rootDir, options, comparison.changes);\n migrationsGenerated = counts.migrations;\n typesGenerated = counts.types;\n modelsGenerated = counts.models;\n factoriesGenerated = counts.factories;\n }\n\n // Update lock file (v2 with snapshots)\n logger.step('Updating lock file...');\n const newLockFile = updateLockFile(existingLock, currentSnapshots, config.database.driver);\n await writeLockFile(lockPath, newLockFile);\n logger.debug(`Updated: ${config.lockFilePath}`);\n\n // Save version history only when there are actual schema changes\n if (comparison.hasChanges) {\n logger.step('Saving version history...');\n const versionStore = createVersionStore({ baseDir: rootDir, maxVersions: 100 });\n const versionSnapshot = schemasToVersionSnapshot(schemas);\n const versionChanges: VersionChange[] = comparison.changes.flatMap(schemaChangeToVersionChange);\n\n // Get migration file name for version description\n const migrationFileName = migrationsGenerated > 0\n ? `${migrationsGenerated} migration(s)`\n : undefined;\n\n try {\n const newVersion = await versionStore.createVersion(\n versionSnapshot,\n versionChanges,\n {\n driver: config.database.driver,\n ...(migrationFileName !== undefined && { migration: migrationFileName }),\n description: `Generated ${comparison.changes.length} change(s)`,\n }\n );\n logger.debug(`Created version ${newVersion.version}`);\n } catch (versionError) {\n // Version history is optional, log but don't fail\n logger.debug(`Could not save version history: ${(versionError as Error).message}`);\n }\n }\n\n // Generate AI guides\n try {\n const guidesWritten = generateAIGuides(rootDir, config.plugins);\n if (guidesWritten > 0) {\n logger.debug(`Updated ${guidesWritten} AI guide file(s)`);\n }\n } catch (guideError) {\n // AI guides are optional, log but don't fail\n logger.debug(`Could not generate AI guides: ${(guideError as Error).message}`);\n }\n\n logger.newline();\n logger.success('Generation complete!');\n\n if (migrationsGenerated > 0 && config.output.laravel) {\n logger.info(` Migrations: ${config.output.laravel.migrationsPath}/`);\n }\n if (modelsGenerated > 0 && config.output.laravel?.modelsPath) {\n logger.info(` Models: ${config.output.laravel.modelsPath}/`);\n }\n if (typesGenerated > 0 && config.output.typescript) {\n logger.info(` Types: ${config.output.typescript.path}/`);\n }\n}\n\n/**\n * Registers the generate command.\n */\nexport function registerGenerateCommand(program: Command): void {\n program\n .command('generate')\n .description('Generate Laravel migrations and TypeScript types')\n .option('-v, --verbose', 'Show detailed output')\n .option('--migrations-only', 'Only generate migrations')\n .option('--types-only', 'Only generate TypeScript types')\n .option('-f, --force', 'Generate even if no changes detected')\n .option('--check', 'CI mode: check if migrations are in sync without generating (exits with code 1 if out of sync)')\n .option('--no-warn-stale', 'Disable stale migration warnings')\n .action(async (options: GenerateOptions) => {\n try {\n await runGenerate(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - AI Guide Generator\n *\n * Generates base Omnify documentation (CLAUDE.md + core guides).\n * Plugin-specific guides are generated by respective plugins.\n */\n\nimport { existsSync, writeFileSync, mkdirSync, readdirSync, readFileSync, copyFileSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { OmnifyPlugin } from '@famgia/omnify-types';\n\n/**\n * CLAUDE.md content for project root\n * Uses Claude Code's official memory format with @imports\n */\nconst CLAUDE_MD = `# Omnify Project\n\nThis project uses **Omnify** for schema-driven code generation.\n\n## Quick Reference\n\n- **Schema Guide**: @.claude/omnify/guides/omnify/schema-guide.md\n- **Config Guide**: @.claude/omnify/guides/omnify/config-guide.md\n\n## Commands\n\n\\`\\`\\`bash\nnpx omnify generate # Generate code from schemas\nnpx omnify validate # Validate schemas\nphp artisan migrate # Run database migrations\n\\`\\`\\`\n\n## Critical Rules\n\n### ⛔ DO NOT EDIT Auto-Generated Files\n- \\`database/migrations/omnify/**\\` - Regenerated on \\`npx omnify generate\\`\n- \\`app/Models/OmnifyBase/**\\` - Base models (extend, don't edit)\n- \\`app/Http/Requests/OmnifyBase/**\\` - Base requests\n- \\`app/Http/Resources/OmnifyBase/**\\` - Base resources\n\n### ✅ Schema-First Workflow\n1. Edit YAML schema in \\`schemas/\\`\n2. Run \\`npx omnify generate\\`\n3. Run \\`php artisan migrate\\`\n\n**NEVER use \\`php artisan make:migration\\`** - Always use schemas!\n\n## Documentation Structure\n\n\\`\\`\\`\n.claude/\n├── CLAUDE.md # This file (root pointer)\n├── rules/ # Claude Code rules (path-specific)\n│ └── omnify/*.md\n└── omnify/ # Detailed guides\n ├── guides/\n │ ├── omnify/ # Schema & config docs\n │ ├── laravel/ # Laravel patterns\n │ └── react/ # React patterns\n ├── workflows/ # Step-by-step workflows\n └── agents/ # AI agent prompts\n\\`\\`\\`\n\n## Individual Preferences\n\nAdd your personal preferences in \\`CLAUDE.local.md\\` (gitignored).\n`;\n\n/**\n * Copies core Omnify guides (schema-guide, config-guide) to .claude/omnify/guides/omnify/\n */\nfunction copyOmnifyGuides(rootDir: string): number {\n let filesWritten = 0;\n\n // Find @famgia/omnify package stubs directory\n const omnifyPkgPaths = [\n resolve(rootDir, 'node_modules', '@famgia', 'omnify', 'stubs', 'ai-guides', 'omnify'),\n resolve(rootDir, 'node_modules', '.pnpm', '@famgia+omnify@*', 'node_modules', '@famgia', 'omnify', 'stubs', 'ai-guides', 'omnify'),\n ];\n\n // Also check if we're in monorepo (packages/omnify/stubs)\n let stubsDir: string | null = null;\n for (const pkgPath of omnifyPkgPaths) {\n // Handle glob-like path for pnpm\n if (pkgPath.includes('*')) {\n const parentDir = dirname(dirname(pkgPath));\n if (existsSync(parentDir)) {\n const entries = readdirSync(parentDir);\n for (const entry of entries) {\n if (entry.startsWith('@famgia+omnify@')) {\n const testPath = join(parentDir, entry, 'node_modules', '@famgia', 'omnify', 'stubs', 'ai-guides', 'omnify');\n if (existsSync(testPath)) {\n stubsDir = testPath;\n break;\n }\n }\n }\n }\n } else if (existsSync(pkgPath)) {\n stubsDir = pkgPath;\n break;\n }\n }\n\n if (!stubsDir) {\n // Fallback: check via require.resolve\n try {\n const omnifyPath = dirname(require.resolve('@famgia/omnify/package.json', { paths: [rootDir] }));\n const testPath = join(omnifyPath, 'stubs', 'ai-guides', 'omnify');\n if (existsSync(testPath)) {\n stubsDir = testPath;\n }\n } catch {\n // Package not found\n }\n }\n\n if (!stubsDir) {\n return 0; // No stubs found\n }\n\n // Destination: .claude/omnify/guides/omnify/\n const destDir = resolve(rootDir, '.claude', 'omnify', 'guides', 'omnify');\n mkdirSync(destDir, { recursive: true });\n\n // Copy all .stub files\n const files = readdirSync(stubsDir).filter(f => f.endsWith('.stub'));\n for (const file of files) {\n const srcPath = join(stubsDir, file);\n const destPath = join(destDir, file.replace('.stub', ''));\n\n const content = readFileSync(srcPath, 'utf8');\n writeFileSync(destPath, content);\n filesWritten++;\n }\n\n return filesWritten;\n}\n\n/**\n * Generates CLAUDE.md pointer file and copies core Omnify guides.\n * Plugin-specific guides are generated by respective plugins.\n *\n * Note: Always overwrites files to ensure:\n * 1. Deleted files are restored\n * 2. Updated content from omnify packages is synced\n */\nexport function generateAIGuides(\n rootDir: string,\n _plugins: readonly OmnifyPlugin[]\n): number {\n let filesWritten = 0;\n\n // Always write CLAUDE.md (overwrite to sync updates)\n const claudeMdPath = resolve(rootDir, 'CLAUDE.md');\n writeFileSync(claudeMdPath, CLAUDE_MD);\n filesWritten++;\n\n // Copy core Omnify guides (schema-guide.md, config-guide.md)\n filesWritten += copyOmnifyGuides(rootDir);\n\n return filesWritten;\n}\n","/**\n * @famgia/omnify-cli - Reset Command\n *\n * Cleans up generated files: OmnifyBase models, migrations, and lock files.\n */\n\nimport { existsSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport type { Command } from 'commander';\nimport { loadConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Reset command options.\n */\ninterface ResetOptions {\n verbose?: boolean;\n yes?: boolean;\n}\n\n/**\n * Prompts user for confirmation.\n */\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\n/**\n * Recursively counts files in a directory.\n */\nfunction countFiles(dir: string): number {\n if (!existsSync(dir)) return 0;\n\n let count = 0;\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n count += countFiles(fullPath);\n } else {\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Recursively deletes a directory.\n */\nfunction deleteDir(dir: string, verbose: boolean): number {\n if (!existsSync(dir)) return 0;\n\n const count = countFiles(dir);\n rmSync(dir, { recursive: true, force: true });\n\n if (verbose) {\n logger.debug(`Deleted: ${dir}`);\n }\n\n return count;\n}\n\n/**\n * Deletes files matching a pattern in a directory.\n */\nfunction deleteFilesInDir(dir: string, pattern: RegExp, verbose: boolean): number {\n if (!existsSync(dir)) return 0;\n\n let count = 0;\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isFile() && pattern.test(entry)) {\n rmSync(fullPath);\n if (verbose) {\n logger.debug(`Deleted: ${fullPath}`);\n }\n count++;\n }\n }\n\n return count;\n}\n\n/**\n * Runs the reset command.\n */\nexport async function runReset(options: ResetOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Reset Omnify Generated Files');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Determine paths to clean\n const paths: { name: string; path: string; type: 'dir' | 'file' | 'files'; pattern?: RegExp }[] = [];\n\n // Common OmnifyBase locations (check both with and without backend prefix)\n // Also check legacy 'Generated' paths for cleanup\n const omnifyBasePaths = [\n { name: 'OmnifyBase models', paths: ['app/Models/OmnifyBase', 'backend/app/Models/OmnifyBase'] },\n { name: 'OmnifyBase requests', paths: ['app/Http/Requests/OmnifyBase', 'backend/app/Http/Requests/OmnifyBase'] },\n { name: 'OmnifyBase resources', paths: ['app/Http/Resources/OmnifyBase', 'backend/app/Http/Resources/OmnifyBase'] },\n ];\n\n // Legacy 'Generated' paths (for cleanup of old installations)\n const legacyGeneratedPaths = [\n { name: 'Legacy Generated models', paths: ['app/Models/Generated', 'backend/app/Models/Generated'] },\n { name: 'Legacy Generated requests', paths: ['app/Http/Requests/Generated', 'backend/app/Http/Requests/Generated'] },\n { name: 'Legacy Generated resources', paths: ['app/Http/Resources/Generated', 'backend/app/Http/Resources/Generated'] },\n ];\n\n for (const { name, paths: relPaths } of omnifyBasePaths) {\n for (const relPath of relPaths) {\n const omnifyBasePath = resolve(rootDir, relPath);\n if (existsSync(omnifyBasePath)) {\n paths.push({ name, path: omnifyBasePath, type: 'dir' });\n break; // Only add the first match for each type\n }\n }\n }\n\n // Clean up legacy Generated paths\n for (const { name, paths: relPaths } of legacyGeneratedPaths) {\n for (const relPath of relPaths) {\n const legacyPath = resolve(rootDir, relPath);\n if (existsSync(legacyPath)) {\n paths.push({ name, path: legacyPath, type: 'dir' });\n break;\n }\n }\n }\n\n // Common migration locations\n const migrationPaths = [\n 'database/migrations/omnify',\n 'backend/database/migrations/omnify',\n ];\n\n for (const relPath of migrationPaths) {\n const migrationsPath = resolve(rootDir, relPath);\n if (existsSync(migrationsPath)) {\n paths.push({\n name: 'Omnify migrations',\n path: migrationsPath,\n type: 'files',\n pattern: /\\.php$/,\n });\n break; // Only add the first match\n }\n }\n\n // Also check config.output.laravel if available\n const laravelConfig = config.output.laravel;\n if (laravelConfig?.modelsPath) {\n const modelsPath = resolve(rootDir, laravelConfig.modelsPath);\n const omnifyBasePath = join(modelsPath, 'OmnifyBase');\n if (existsSync(omnifyBasePath) && !paths.some(p => p.path === omnifyBasePath)) {\n paths.push({ name: 'OmnifyBase models', path: omnifyBasePath, type: 'dir' });\n }\n }\n\n if (laravelConfig?.migrationsPath) {\n const migrationsPath = resolve(rootDir, laravelConfig.migrationsPath);\n if (existsSync(migrationsPath) && !paths.some(p => p.path === migrationsPath)) {\n paths.push({\n name: 'Omnify migrations',\n path: migrationsPath,\n type: 'files',\n pattern: /\\.php$/,\n });\n }\n }\n\n // Clean up package directories from additionalSchemaPaths\n if (config.additionalSchemaPaths) {\n for (const additionalPath of config.additionalSchemaPaths) {\n const pkgOutput = additionalPath.output?.laravel;\n if (pkgOutput?.base) {\n const pkgBase = resolve(rootDir, pkgOutput.base);\n const pkgName = additionalPath.namespace ?? 'Package';\n\n // OmnifyBase models in package\n const pkgOmnifyBase = join(pkgBase, pkgOutput.baseModelsPath ?? 'src/Models/OmnifyBase');\n if (existsSync(pkgOmnifyBase) && !paths.some(p => p.path === pkgOmnifyBase)) {\n paths.push({ name: `${pkgName} OmnifyBase`, path: pkgOmnifyBase, type: 'dir' });\n }\n\n // Legacy Generated models in package\n const pkgGenerated = join(pkgBase, 'src/Models/Generated');\n if (existsSync(pkgGenerated) && !paths.some(p => p.path === pkgGenerated)) {\n paths.push({ name: `${pkgName} Legacy Generated`, path: pkgGenerated, type: 'dir' });\n }\n\n // Package migrations - IMPORTANT: Only delete omnify subdirectory, never the entire migrations folder!\n const pkgMigrations = join(pkgBase, pkgOutput.migrationsPath ?? 'database/migrations/omnify');\n if (existsSync(pkgMigrations) && !paths.some(p => p.path === pkgMigrations)) {\n paths.push({\n name: `${pkgName} migrations`,\n path: pkgMigrations,\n type: 'dir',\n });\n }\n\n // Package providers\n const pkgProviders = join(pkgBase, pkgOutput.providersPath ?? 'src/Providers');\n if (existsSync(pkgProviders) && !paths.some(p => p.path === pkgProviders)) {\n paths.push({ name: `${pkgName} Providers`, path: pkgProviders, type: 'dir' });\n }\n\n // Package factories\n const pkgFactories = join(pkgBase, pkgOutput.factoriesPath ?? 'database/factories');\n if (existsSync(pkgFactories) && !paths.some(p => p.path === pkgFactories)) {\n paths.push({ name: `${pkgName} Factories`, path: pkgFactories, type: 'dir' });\n }\n }\n }\n }\n\n // TypeScript types - only delete auto-generated subdirectories, not user-editable files\n // Structure: models/base/* (auto), models/enum/* (auto), models/rules/* (auto)\n // Keep: models/*.ts (user-editable)\n const typescriptPath = config.output.typescript?.path;\n const tsBasePath = typescriptPath ? resolve(rootDir, typescriptPath) : null;\n\n // Check common TypeScript locations if not in config\n const commonTsPaths = [\n 'resources/ts/omnify',\n 'resources/ts/omnify/schemas',\n 'resources/ts/types/models',\n 'frontend/src/types/model',\n 'frontend/src/types/models',\n 'src/types/models',\n ];\n\n let foundTsPath = tsBasePath;\n if (!foundTsPath || !existsSync(foundTsPath)) {\n for (const relPath of commonTsPaths) {\n const tsPath = resolve(rootDir, relPath);\n if (existsSync(tsPath)) {\n foundTsPath = tsPath;\n break;\n }\n }\n }\n\n if (foundTsPath && existsSync(foundTsPath)) {\n // Delete auto-generated subdirectories\n // Note: 'components' is excluded - it may contain custom user components\n const autoGeneratedDirs = ['base', 'enum', 'rules', 'hooks', 'lib'];\n for (const subDir of autoGeneratedDirs) {\n const subPath = join(foundTsPath, subDir);\n if (existsSync(subPath)) {\n paths.push({ name: `TypeScript ${subDir}`, path: subPath, type: 'dir' });\n }\n }\n // Delete auto-generated files at root level\n const autoGeneratedFiles = ['common.ts', 'index.ts', 'i18n.ts'];\n for (const fileName of autoGeneratedFiles) {\n const filePath = join(foundTsPath, fileName);\n if (existsSync(filePath)) {\n paths.push({ name: `TypeScript ${fileName}`, path: filePath, type: 'file' });\n }\n }\n }\n\n // Lock files\n const lockFilePath = resolve(rootDir, config.lockFilePath);\n if (existsSync(lockFilePath)) {\n paths.push({ name: 'Lock file', path: lockFilePath, type: 'file' });\n }\n\n // Version history directory (.omnify-versions)\n const versionsDir = resolve(rootDir, '.omnify-versions');\n if (existsSync(versionsDir)) {\n paths.push({ name: 'Version history', path: versionsDir, type: 'dir' });\n }\n\n // Also check for versions inside .omnify directory (but NOT schemas!)\n const omnifyVersionsDir = resolve(rootDir, '.omnify/versions');\n if (existsSync(omnifyVersionsDir)) {\n paths.push({ name: 'Version history (.omnify/versions)', path: omnifyVersionsDir, type: 'dir' });\n }\n\n // Logs directory\n const logsDir = resolve(rootDir, '.omnify/logs');\n if (existsSync(logsDir)) {\n paths.push({ name: 'Logs', path: logsDir, type: 'dir' });\n }\n\n // Check if anything to clean\n if (paths.length === 0) {\n logger.info('Nothing to clean. No generated files found.');\n return;\n }\n\n // Show what will be deleted\n logger.newline();\n logger.warn('The following will be deleted:');\n logger.newline();\n\n for (const item of paths) {\n if (item.type === 'dir') {\n const count = countFiles(item.path);\n logger.info(` • ${item.name}: ${item.path} (${count} files)`);\n } else if (item.type === 'files' && item.pattern) {\n const count = readdirSync(item.path).filter((f) => item.pattern!.test(f)).length;\n logger.info(` • ${item.name}: ${item.path} (${count} files)`);\n } else {\n logger.info(` • ${item.name}: ${item.path}`);\n }\n }\n\n logger.newline();\n\n // Ask for confirmation\n if (!options.yes) {\n const confirmed = await confirm('Are you sure you want to delete these files?');\n if (!confirmed) {\n logger.info('Reset cancelled.');\n return;\n }\n }\n\n logger.newline();\n logger.step('Deleting files...');\n\n // Delete files\n let totalDeleted = 0;\n\n for (const item of paths) {\n if (item.type === 'dir') {\n const count = deleteDir(item.path, options.verbose ?? false);\n totalDeleted += count;\n logger.info(` ✓ Deleted ${item.name} (${count} files)`);\n } else if (item.type === 'files' && item.pattern) {\n const count = deleteFilesInDir(item.path, item.pattern, options.verbose ?? false);\n totalDeleted += count;\n logger.info(` ✓ Deleted ${item.name} (${count} files)`);\n } else {\n rmSync(item.path, { force: true });\n if (options.verbose) {\n logger.debug(`Deleted: ${item.path}`);\n }\n totalDeleted++;\n logger.info(` ✓ Deleted ${item.name}`);\n }\n }\n\n logger.newline();\n logger.success(`Reset complete! Deleted ${totalDeleted} file(s).`);\n logger.newline();\n logger.info('Run `omnify generate` to regenerate files.');\n}\n\n/**\n * Registers the reset command.\n */\nexport function registerResetCommand(program: Command): void {\n program\n .command('reset')\n .description('Delete all generated files (OmnifyBase, migrations, locks)')\n .option('-v, --verbose', 'Show detailed output')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options: ResetOptions) => {\n try {\n await runReset(options);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Create Laravel Project Command\n *\n * Creates a new Laravel project from the boilerplate template.\n */\n\nimport { execSync, spawn } from 'node:child_process';\nimport { existsSync, rmSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Command } from 'commander';\nimport { logger } from '../output/logger.js';\n\n/**\n * Default boilerplate repository URL\n */\nconst BOILERPLATE_REPO = 'https://github.com/omnifyjp/omnify-laravel-boilerplate.git';\n\n/**\n * Check if we're running on Windows\n */\nconst IS_WINDOWS = process.platform === 'win32';\n\n/**\n * Check if git is installed\n */\nfunction checkGit(): boolean {\n try {\n execSync('git --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Docker is installed\n */\nfunction checkDockerInstalled(): boolean {\n try {\n execSync('docker --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Docker daemon is running\n */\nfunction checkDockerRunning(): boolean {\n try {\n execSync('docker info', { stdio: 'ignore', timeout: 10000 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Show Docker installation instructions based on OS\n */\nfunction showDockerInstallInstructions(): void {\n logger.newline();\n logger.error('Docker is not installed.');\n logger.newline();\n logger.info('Please install Docker:');\n\n if (IS_WINDOWS) {\n logger.info(' 1. Download Docker Desktop from: https://www.docker.com/products/docker-desktop/');\n logger.info(' 2. Run the installer and follow the instructions');\n logger.info(' 3. Make sure WSL 2 is enabled (Docker Desktop will guide you)');\n logger.info(' 4. Restart your computer if prompted');\n logger.info(' 5. Start Docker Desktop');\n } else if (process.platform === 'darwin') {\n logger.info(' 1. Download Docker Desktop from: https://www.docker.com/products/docker-desktop/');\n logger.info(' 2. Or install via Homebrew: brew install --cask docker');\n logger.info(' 3. Start Docker Desktop from Applications');\n } else {\n logger.info(' 1. Install Docker: https://docs.docker.com/engine/install/');\n logger.info(' 2. Install Docker Compose: https://docs.docker.com/compose/install/');\n logger.info(' 3. Start Docker service: sudo systemctl start docker');\n }\n\n logger.newline();\n logger.info('After installing, run the command again.');\n}\n\n/**\n * Show Docker not running instructions based on OS\n */\nfunction showDockerNotRunningInstructions(): void {\n logger.newline();\n logger.error('Docker daemon is not running.');\n logger.newline();\n logger.info('Please start Docker:');\n\n if (IS_WINDOWS) {\n logger.info(' 1. Open Docker Desktop from the Start menu');\n logger.info(' 2. Wait for Docker to fully start (whale icon in system tray becomes steady)');\n logger.info(' 3. If Docker fails to start, try:');\n logger.info(' - Restart your computer');\n logger.info(' - Make sure WSL 2 is properly installed');\n logger.info(' - Check Windows Features: \"Virtual Machine Platform\" and \"WSL\" are enabled');\n } else if (process.platform === 'darwin') {\n logger.info(' 1. Open Docker Desktop from Applications');\n logger.info(' 2. Wait for Docker to fully start (whale icon in menu bar becomes steady)');\n logger.info(' 3. Or start from terminal: open -a Docker');\n } else {\n logger.info(' 1. Start Docker service: sudo systemctl start docker');\n logger.info(' 2. Or: sudo service docker start');\n logger.info(' 3. Check status: docker info');\n }\n\n logger.newline();\n logger.info('After Docker is running, run the command again.');\n}\n\n/**\n * Check Docker prerequisites and provide helpful messages\n * Returns true if Docker is ready, false otherwise\n */\nfunction checkDockerPrerequisites(): boolean {\n if (!checkDockerInstalled()) {\n showDockerInstallInstructions();\n return false;\n }\n\n if (!checkDockerRunning()) {\n showDockerNotRunningInstructions();\n return false;\n }\n\n return true;\n}\n\n/**\n * Entries to remove from .gitignore for consumer projects\n * These are ignored in boilerplate but should be tracked in real projects\n */\nconst GITIGNORE_ENTRIES_TO_REMOVE = [\n // Auto-generated projects (consumers need to track these)\n '# Auto-generated projects',\n 'backend/',\n 'frontend/',\n // Lock files (consumers should track their lock state)\n '# Lock files',\n '.omnify.lock',\n '.omnify/versions/',\n '.omnify/current.lock',\n // Omnify auto-generated docs (consumers should track these)\n '# Omnify auto-generated docs',\n '.cursor/rules/omnify.md',\n '.claude/omnify/',\n];\n\n/**\n * Clean up .gitignore for consumer project\n * Removes entries that should be tracked in consumer projects\n */\nfunction cleanupGitignore(targetDir: string): void {\n const gitignorePath = resolve(targetDir, '.gitignore');\n if (!existsSync(gitignorePath)) return;\n\n const content = readFileSync(gitignorePath, 'utf-8');\n const lines = content.split('\\n');\n\n // Remove entries that consumers should track\n const cleanedLines = lines.filter((line) => {\n const trimmed = line.trim();\n return !GITIGNORE_ENTRIES_TO_REMOVE.includes(trimmed);\n });\n\n // Remove leading empty lines\n while (cleanedLines.length > 0 && cleanedLines[0].trim() === '') {\n cleanedLines.shift();\n }\n\n writeFileSync(gitignorePath, cleanedLines.join('\\n'));\n}\n\n/**\n * Clone the boilerplate repository\n */\nfunction cloneRepo(repo: string, targetDir: string): void {\n logger.step(`Cloning boilerplate from ${repo}...`);\n execSync(`git clone --depth 1 ${repo} \"${targetDir}\"`, { stdio: 'inherit' });\n\n // Remove .git directory to start fresh\n const gitDir = resolve(targetDir, '.git');\n if (existsSync(gitDir)) {\n rmSync(gitDir, { recursive: true, force: true });\n }\n\n // Clean up .gitignore for consumer\n cleanupGitignore(targetDir);\n\n // Initialize new git repository\n execSync('git init', { cwd: targetDir, stdio: 'ignore' });\n logger.success('Repository cloned successfully');\n}\n\n/**\n * Run a command and wait for completion\n */\nfunction runCommand(command: string, targetDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, [], {\n cwd: targetDir,\n shell: true,\n stdio: 'inherit',\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on('error', (error) => {\n reject(error);\n });\n });\n}\n\n/**\n * Run setup script\n */\nasync function runSetup(targetDir: string): Promise<void> {\n // Step 0: Check Docker prerequisites\n logger.step('Checking Docker...');\n if (!checkDockerPrerequisites()) {\n logger.newline();\n logger.info('You can skip setup and run it later:');\n logger.info(' npx @famgia/omnify create-laravel-project <project-name> --skip-setup');\n logger.newline();\n throw new Error('Docker is not available. Please start Docker and try again.');\n }\n logger.success('Docker is running');\n\n // Step 1: Install dependencies\n logger.step('Installing dependencies...');\n await runCommand('pnpm install', targetDir);\n logger.success('Dependencies installed');\n\n // Step 2: Run setup script (boilerplate's setup script auto-detects platform)\n logger.step('Running setup...');\n const setupScript = 'pnpm run setup';\n\n try {\n await runCommand(setupScript, targetDir);\n } catch (error) {\n // Provide helpful error message for Docker-related failures\n logger.newline();\n logger.error('Setup failed. This might be a Docker issue.');\n logger.newline();\n logger.info('Troubleshooting steps:');\n logger.info(' 1. Make sure Docker Desktop is fully started');\n logger.info(' 2. Check Docker status: docker info');\n logger.info(' 3. Check container logs: docker-compose logs');\n\n if (IS_WINDOWS) {\n logger.info(' 4. On Windows, ensure WSL 2 is working: wsl --status');\n logger.info(' 5. Try restarting Docker Desktop');\n }\n\n logger.newline();\n logger.info('To retry setup manually:');\n logger.info(` cd ${targetDir}`);\n logger.info(' pnpm run setup');\n logger.newline();\n\n throw error;\n }\n}\n\n/**\n * Run the create-laravel-project command\n */\nexport async function runCreateProject(\n projectName: string,\n options: { repo?: string; skipSetup?: boolean }\n): Promise<void> {\n const targetDir = resolve(process.cwd(), projectName);\n const repo = options.repo ?? BOILERPLATE_REPO;\n\n // Check if git is available\n if (!checkGit()) {\n logger.error('Git is not installed. Please install git first.');\n process.exit(1);\n }\n\n // Check if target directory already exists\n if (existsSync(targetDir)) {\n logger.error(`Directory \"${projectName}\" already exists.`);\n process.exit(1);\n }\n\n logger.newline();\n logger.info(`Creating new Laravel project: ${projectName}`);\n logger.newline();\n\n let cloneSucceeded = false;\n\n try {\n // Clone the repository\n cloneRepo(repo, targetDir);\n cloneSucceeded = true;\n\n // Run setup if not skipped\n if (!options.skipSetup) {\n process.chdir(targetDir);\n await runSetup(targetDir);\n }\n\n logger.newline();\n logger.success('Project created successfully!');\n logger.newline();\n logger.info('Next steps:');\n logger.info(` cd ${projectName}`);\n if (options.skipSetup) {\n logger.info(' pnpm run setup');\n }\n logger.info(' pnpm run dev');\n logger.newline();\n } catch (error) {\n // Only clean up if clone failed (not if setup failed)\n // This allows users to fix Docker and retry setup manually\n if (!cloneSucceeded && existsSync(targetDir)) {\n rmSync(targetDir, { recursive: true, force: true });\n } else if (cloneSucceeded) {\n logger.newline();\n logger.info('Project files have been kept. You can retry setup after fixing the issue:');\n logger.info(` cd ${projectName}`);\n logger.info(' pnpm run setup');\n logger.newline();\n }\n throw error;\n }\n}\n\n/**\n * Register the create-laravel-project command\n */\nexport function registerCreateProjectCommand(program: Command): void {\n program\n .command('create-laravel-project <project-name>')\n .description('Create a new Laravel project from boilerplate')\n .option('-r, --repo <url>', 'Custom boilerplate repository URL', BOILERPLATE_REPO)\n .option('--skip-setup', 'Skip running the setup script')\n .action(async (projectName: string, options: { repo?: string; skipSetup?: boolean }) => {\n try {\n await runCreateProject(projectName, options);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Deploy Command\n *\n * Locks schema version for production deployment using blockchain-like chain.\n * 一度ロックされたスキーマは変更・削除不可能になる\n */\n\nimport { existsSync, readdirSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { loadSchemas, OmnifyError } from '@famgia/omnify-core';\nimport {\n VERSION_CHAIN_FILE,\n readVersionChain,\n deployVersion,\n getChainSummary,\n verifyChain,\n type DeployOptions,\n} from '@famgia/omnify-atlas';\nimport type { ResolvedOmnifyConfig } from '../config/types.js';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Deploy command options.\n */\ninterface DeployCommandOptions {\n verbose?: boolean;\n version?: string;\n environment?: string;\n comment?: string;\n yes?: boolean;\n deployedBy?: string;\n dryRun?: boolean;\n}\n\n/**\n * Interactive confirmation prompt.\n * CI環境では--yesフラグを使用\n */\nasync function confirmDeploy(\n schemaCount: number,\n environment: string,\n version: string\n): Promise<boolean> {\n const { createInterface } = await import('node:readline');\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n logger.newline();\n logger.warn('⚠️ WARNING: This action is IRREVERSIBLE!');\n logger.warn('');\n logger.warn(` Environment: ${environment}`);\n logger.warn(` Version: ${version}`);\n logger.warn(` Schemas: ${schemaCount} file(s)`);\n logger.warn('');\n logger.warn(' Once locked, these schema files CANNOT be:');\n logger.warn(' • Deleted');\n logger.warn(' • Modified (content hash is recorded)');\n logger.warn('');\n logger.warn(' This creates an immutable blockchain-like record.');\n logger.newline();\n\n rl.question(' Type \"LOCK\" to confirm: ', (answer) => {\n rl.close();\n resolve(answer.trim().toUpperCase() === 'LOCK');\n });\n });\n}\n\n/**\n * Collects schema files from directory.\n */\nasync function collectSchemaFiles(\n schemasDir: string\n): Promise<{ name: string; relativePath: string; filePath: string }[]> {\n const files: { name: string; relativePath: string; filePath: string }[] = [];\n\n const schemas = await loadSchemas(schemasDir);\n\n for (const [name, schema] of Object.entries(schemas)) {\n files.push({\n name,\n relativePath: schema.relativePath,\n filePath: schema.filePath,\n });\n }\n\n return files;\n}\n\n/**\n * Runs the deploy command.\n */\nexport async function runDeploy(options: DeployCommandOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n logger.header('Deploy Version Lock');\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config\n validateConfig(config, rootDir);\n\n // Resolve paths\n const schemasDir = resolve(rootDir, config.schemasDir);\n const chainFilePath = resolve(rootDir, VERSION_CHAIN_FILE);\n\n // Check if schemas directory exists\n if (!existsSync(schemasDir)) {\n throw new OmnifyError(\n `Schemas directory not found: ${schemasDir}`,\n 'E003',\n undefined,\n 'Make sure the schemasDir in omnify.config.ts is correct.'\n );\n }\n\n // Collect schema files\n logger.step('Collecting schema files...');\n const schemaFiles = await collectSchemaFiles(schemasDir);\n\n if (schemaFiles.length === 0) {\n throw new OmnifyError(\n 'No schema files found',\n 'E003',\n undefined,\n 'Create schema files in your schemas directory before deploying.'\n );\n }\n\n logger.info(`Found ${schemaFiles.length} schema file(s)`);\n\n // Load existing chain\n const existingChain = await readVersionChain(chainFilePath);\n if (existingChain) {\n const summary = getChainSummary(existingChain);\n logger.debug(`Existing chain: ${summary.blockCount} block(s), ${summary.schemaCount} schema(s)`);\n\n // Verify chain integrity before adding new block\n logger.step('Verifying chain integrity...');\n const verification = await verifyChain(existingChain, schemasDir);\n\n if (!verification.valid) {\n logger.error('Chain integrity verification failed!');\n\n if (verification.corruptedBlocks.length > 0) {\n logger.error('');\n logger.error('Corrupted blocks:');\n for (const block of verification.corruptedBlocks) {\n logger.error(` • ${block.version}: ${block.reason}`);\n }\n }\n\n if (verification.tamperedSchemas.length > 0) {\n logger.error('');\n logger.error('Tampered schemas (modified since lock):');\n for (const schema of verification.tamperedSchemas) {\n logger.error(` • ${schema.schemaName} (locked in ${schema.lockedInVersion})`);\n }\n }\n\n if (verification.deletedLockedSchemas.length > 0) {\n logger.error('');\n logger.error('Deleted locked schemas:');\n for (const schema of verification.deletedLockedSchemas) {\n logger.error(` • ${schema.schemaName} (locked in ${schema.lockedInVersion})`);\n }\n }\n\n throw new OmnifyError(\n 'Cannot deploy: chain integrity compromised',\n 'E406',\n undefined,\n 'Restore deleted/modified files to match the locked state, or contact support.'\n );\n }\n\n logger.success('Chain integrity verified ✓');\n } else {\n logger.info('Creating new version chain (first deployment)');\n }\n\n // Determine version and environment\n const environment = options.environment ?? 'production';\n const version = options.version ?? generateVersionFromTimestamp();\n\n // Dry run mode\n if (options.dryRun) {\n logger.newline();\n logger.info('DRY RUN - No changes will be made');\n logger.info('');\n logger.info(`Would create block:`);\n logger.info(` Version: ${version}`);\n logger.info(` Environment: ${environment}`);\n logger.info(` Schemas: ${schemaFiles.length} file(s)`);\n logger.info('');\n for (const file of schemaFiles) {\n logger.info(` • ${file.name} (${file.relativePath})`);\n }\n return;\n }\n\n // Confirmation prompt (unless --yes is provided)\n if (!options.yes) {\n const confirmed = await confirmDeploy(schemaFiles.length, environment, version);\n if (!confirmed) {\n logger.newline();\n logger.info('Deployment cancelled.');\n return;\n }\n }\n\n // Deploy\n logger.step('Creating version lock...');\n\n const deployOptions: DeployOptions = {\n version,\n environment,\n deployedBy: options.deployedBy ?? process.env.USER ?? 'unknown',\n comment: options.comment,\n skipConfirmation: true,\n };\n\n const result = await deployVersion(chainFilePath, schemasDir, schemaFiles, deployOptions);\n\n if (!result.success) {\n throw new OmnifyError(\n result.error ?? 'Deployment failed',\n 'E408'\n );\n }\n\n // Success output\n logger.newline();\n logger.success('🔒 Version locked successfully!');\n logger.newline();\n\n if (result.block) {\n logger.info(` Version: ${result.block.version}`);\n logger.info(` Block Hash: ${result.block.blockHash.substring(0, 16)}...`);\n logger.info(` Locked At: ${result.block.lockedAt}`);\n logger.info(` Environment: ${result.block.environment}`);\n logger.info(` Schemas: ${result.block.schemas.length} file(s)`);\n }\n\n if (result.addedSchemas.length > 0) {\n logger.newline();\n logger.info(' New schemas locked:');\n for (const name of result.addedSchemas) {\n logger.info(` + ${name}`);\n }\n }\n\n if (result.warnings.length > 0) {\n logger.newline();\n logger.warn(' Warnings:');\n for (const warning of result.warnings) {\n logger.warn(` ⚠ ${warning}`);\n }\n }\n\n logger.newline();\n logger.info(` Chain file: ${VERSION_CHAIN_FILE}`);\n logger.info(' This file should be committed to version control.');\n}\n\n/**\n * Generates a version string from current timestamp.\n */\nfunction generateVersionFromTimestamp(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n const hour = String(now.getHours()).padStart(2, '0');\n const minute = String(now.getMinutes()).padStart(2, '0');\n const second = String(now.getSeconds()).padStart(2, '0');\n return `v${year}.${month}.${day}-${hour}${minute}${second}`;\n}\n\n/**\n * Registers the deploy command.\n */\nexport function registerDeployCommand(program: Command): void {\n program\n .command('deploy')\n .description('Lock schema version for production (blockchain-like immutable record)')\n .option('-v, --verbose', 'Show detailed output')\n .option('--version <version>', 'Version name (e.g., v1.0.0, default: auto-generated)')\n .option('-e, --environment <env>', 'Deployment environment (default: production)', 'production')\n .option('-c, --comment <comment>', 'Deployment comment')\n .option('-y, --yes', 'Skip confirmation prompt (for CI/CD)')\n .option('--deployed-by <name>', 'Deployer name (default: $USER)')\n .option('--dry-run', 'Show what would be locked without making changes')\n .action(async (options: DeployCommandOptions) => {\n try {\n await runDeploy(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n logger.formatError(error);\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n logger.error(error.message);\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n","/**\n * @famgia/omnify-cli - Verify Command\n *\n * Verifies version chain integrity and schema file states.\n * ブロックチェーンの整合性とスキーマファイルの状態を検証\n */\n\nimport { existsSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { Command } from 'commander';\nimport { OmnifyError } from '@famgia/omnify-core';\nimport {\n VERSION_CHAIN_FILE,\n readVersionChain,\n verifyChain,\n getChainSummary,\n getLockedSchemas,\n} from '@famgia/omnify-atlas';\nimport { loadConfig, validateConfig } from '../config/loader.js';\nimport { logger } from '../output/logger.js';\n\n/**\n * Verify command options.\n */\ninterface VerifyCommandOptions {\n verbose?: boolean;\n showAll?: boolean;\n json?: boolean;\n}\n\n/**\n * Runs the verify command.\n */\nexport async function runVerify(options: VerifyCommandOptions): Promise<void> {\n logger.setVerbose(options.verbose ?? false);\n\n if (!options.json) {\n logger.header('Verify Version Chain');\n }\n\n // Load configuration\n logger.debug('Loading configuration...');\n const { config, configPath } = await loadConfig();\n const rootDir = configPath ? dirname(configPath) : process.cwd();\n\n // Validate config\n validateConfig(config, rootDir);\n\n // Resolve paths\n const schemasDir = resolve(rootDir, config.schemasDir);\n const chainFilePath = resolve(rootDir, VERSION_CHAIN_FILE);\n\n // Check if chain file exists\n if (!existsSync(chainFilePath)) {\n if (options.json) {\n console.log(JSON.stringify({\n valid: true,\n message: 'No version chain exists yet',\n blockCount: 0,\n schemaCount: 0,\n }, null, 2));\n return;\n }\n\n logger.info('No version chain exists yet.');\n logger.info('Run \"npx omnify deploy\" to create the first version lock.');\n return;\n }\n\n // Load chain\n const chain = await readVersionChain(chainFilePath);\n if (!chain) {\n throw new OmnifyError(\n 'Failed to read version chain file',\n 'E406',\n undefined,\n `Check if ${VERSION_CHAIN_FILE} is valid JSON.`\n );\n }\n\n // Get chain summary\n const summary = getChainSummary(chain);\n\n if (!options.json) {\n logger.step('Chain Summary');\n logger.info(` Blocks: ${summary.blockCount}`);\n logger.info(` Schemas: ${summary.schemaCount}`);\n logger.info(` First Lock: ${summary.firstVersion ?? 'N/A'}`);\n logger.info(` Latest Lock: ${summary.latestVersion ?? 'N/A'}`);\n logger.info(` Environments: ${summary.environments.join(', ') || 'N/A'}`);\n logger.newline();\n }\n\n // Verify chain integrity\n if (!options.json) {\n logger.step('Verifying chain integrity...');\n }\n\n const verification = await verifyChain(chain, schemasDir);\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify({\n valid: verification.valid,\n blockCount: verification.blockCount,\n verifiedBlocks: verification.verifiedBlocks,\n corruptedBlocks: verification.corruptedBlocks,\n tamperedSchemas: verification.tamperedSchemas,\n deletedLockedSchemas: verification.deletedLockedSchemas,\n summary,\n }, null, 2));\n\n if (!verification.valid) {\n process.exit(1);\n }\n return;\n }\n\n // Detailed output\n if (verification.valid) {\n logger.success('✓ Chain integrity verified');\n logger.success(`✓ All ${verification.blockCount} block(s) valid`);\n logger.success('✓ No tampered or deleted locked schemas');\n logger.newline();\n\n // Show locked schemas if --show-all\n if (options.showAll) {\n const lockedSchemas = getLockedSchemas(chain);\n logger.step('Locked Schemas');\n for (const [name, info] of lockedSchemas) {\n logger.info(` • ${name}`);\n logger.debug(` Path: ${info.relativePath}`);\n logger.debug(` Hash: ${info.hash.substring(0, 16)}...`);\n logger.debug(` Version: ${info.version}`);\n }\n }\n } else {\n logger.error('✗ Chain integrity verification FAILED');\n logger.newline();\n\n let exitCode = 0;\n\n // Corrupted blocks\n if (verification.corruptedBlocks.length > 0) {\n logger.error('Corrupted Blocks:');\n for (const block of verification.corruptedBlocks) {\n logger.error(` ✗ ${block.version}`);\n logger.error(` Reason: ${block.reason}`);\n logger.error(` Expected: ${block.expectedHash.substring(0, 16)}...`);\n logger.error(` Actual: ${block.actualHash.substring(0, 16)}...`);\n }\n logger.newline();\n exitCode = 1;\n }\n\n // Tampered schemas\n if (verification.tamperedSchemas.length > 0) {\n logger.error('Tampered Schemas (modified since lock):');\n for (const schema of verification.tamperedSchemas) {\n logger.error(` ✗ ${schema.schemaName}`);\n logger.error(` File: ${schema.filePath}`);\n logger.error(` Locked in: ${schema.lockedInVersion}`);\n logger.error(` Locked: ${schema.lockedHash.substring(0, 16)}...`);\n logger.error(` Current: ${schema.currentHash.substring(0, 16)}...`);\n }\n logger.newline();\n exitCode = 1;\n }\n\n // Deleted locked schemas\n if (verification.deletedLockedSchemas.length > 0) {\n logger.error('Deleted Locked Schemas:');\n for (const schema of verification.deletedLockedSchemas) {\n logger.error(` ✗ ${schema.schemaName}`);\n logger.error(` File: ${schema.filePath}`);\n logger.error(` Locked in: ${schema.lockedInVersion}`);\n logger.error(` Hash: ${schema.lockedHash.substring(0, 16)}...`);\n }\n logger.newline();\n exitCode = 1;\n }\n\n // Help text\n logger.newline();\n logger.warn('How to fix:');\n logger.warn(' 1. Restore deleted files from git or backup');\n logger.warn(' 2. Revert modified files to their locked state');\n logger.warn(' 3. Do NOT modify the .omnify.chain file');\n logger.newline();\n\n process.exit(exitCode);\n }\n}\n\n/**\n * Registers the verify command.\n */\nexport function registerVerifyCommand(program: Command): void {\n program\n .command('verify')\n .description('Verify version chain integrity and schema states')\n .option('-v, --verbose', 'Show detailed output')\n .option('-a, --show-all', 'Show all locked schemas')\n .option('--json', 'Output result as JSON')\n .action(async (options: VerifyCommandOptions) => {\n try {\n await runVerify(options);\n } catch (error) {\n if (error instanceof OmnifyError) {\n if (options.json) {\n console.log(JSON.stringify({\n valid: false,\n error: error.message,\n }, null, 2));\n } else {\n logger.formatError(error);\n }\n process.exit(logger.getExitCode(error));\n } else if (error instanceof Error) {\n if (options.json) {\n console.log(JSON.stringify({\n valid: false,\n error: error.message,\n }, null, 2));\n } else {\n logger.error(error.message);\n }\n process.exit(1);\n }\n process.exit(1);\n }\n });\n}\n"],"mappings":"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","names":["existsSync","resolve","OmnifyError","existsSync","writeFileSync","resolve","configPath","configPath","resolve","existsSync","schemasDir","writeFileSync","program","existsSync","resolve","dirname","OmnifyError","existsSync","resolve","dirname","existsSync","readFileSync","resolve","resolve","existsSync","readFileSync","resolve","configPath","existsSync","dirname","configPath","dirname","resolve","existsSync","OmnifyError","program","existsSync","resolve","dirname","loadSchemas","mergePartialSchemas","validateSchemas","OmnifyError","pc","configPath","dirname","resolve","loadSchemas","existsSync","mergePartialSchemas","validateSchemas","OmnifyError","program","existsSync","mkdirSync","writeFileSync","readdirSync","resolve","dirname","loadSchemas","mergePartialSchemas","validateSchemas","OmnifyError","existsSync","writeFileSync","mkdirSync","readFileSync","resolve","dirname","resolve","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","existsSync","readdirSync","resolve","dirname","mkdirSync","writeFileSync","configPath","loadSchemas","mergePartialSchemas","validateSchemas","OmnifyError","migrationsDir","customTypesMap","program","existsSync","readdirSync","resolve","dirname","join","confirm","resolve","existsSync","readdirSync","join","configPath","dirname","program","existsSync","rmSync","readFileSync","writeFileSync","resolve","resolve","existsSync","readFileSync","writeFileSync","rmSync","program","existsSync","resolve","dirname","loadSchemas","OmnifyError","VERSION_CHAIN_FILE","readVersionChain","createInterface","resolve","loadSchemas","configPath","dirname","VERSION_CHAIN_FILE","existsSync","OmnifyError","readVersionChain","program","existsSync","resolve","dirname","OmnifyError","VERSION_CHAIN_FILE","readVersionChain","verifyChain","getChainSummary","configPath","dirname","resolve","VERSION_CHAIN_FILE","existsSync","readVersionChain","OmnifyError","getChainSummary","verifyChain","program","OmnifyError","resolve","existsSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@famgia/omnify-cli",
3
- "version": "0.0.166",
3
+ "version": "0.0.167",
4
4
  "description": "CLI interface for omnify-schema",
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,11 +28,11 @@
28
28
  "commander": "^14.0.2",
29
29
  "jiti": "^2.6.1",
30
30
  "picocolors": "^1.1.1",
31
- "@famgia/omnify-atlas": "0.0.152",
32
- "@famgia/omnify-laravel": "0.0.168",
33
- "@famgia/omnify-typescript": "0.0.149",
34
- "@famgia/omnify-types": "0.0.156",
35
- "@famgia/omnify-core": "0.0.158"
31
+ "@famgia/omnify-atlas": "0.0.153",
32
+ "@famgia/omnify-core": "0.0.159",
33
+ "@famgia/omnify-laravel": "0.0.169",
34
+ "@famgia/omnify-types": "0.0.157",
35
+ "@famgia/omnify-typescript": "0.0.150"
36
36
  },
37
37
  "scripts": {
38
38
  "build": "tsup",