larats 1.0.2 β†’ 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/detector.ts","../src/scanner.ts","../src/generator/markdown.ts","../src/generator/scaffolder.ts","../src/templates/laravel.ts","../src/templates/typescript.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { parseArgs } from 'node:util';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { detectProjectType, type ProjectInfo } from './detector.js';\nimport { scanProject } from './scanner.js';\nimport { generateArchitectureMarkdown } from './generator/markdown.js';\nimport { scaffoldModule, validateModuleName, type ScaffoldResult } from './generator/scaffolder.js';\nimport { getNaming } from './templates/laravel.js';\n\ndeclare const __VERSION__: string | undefined;\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '1.0.1';\n\nfunction showHelp() {\n console.log(`\n${pc.bold(pc.cyan('LaraTS CLI'))} ${pc.gray(`v${VERSION}`)}\n${pc.gray('Smart Architecture Visualizer & Contextual Module Scaffolder')}\n\n${pc.bold('USAGE:')}\n ${pc.cyan('$')} npx larats [command] [options]\n ${pc.cyan('$')} larats [command] [options]\n\n${pc.bold('COMMANDS:')}\n ${pc.green('scan')} Scan repository & generate ARCHITECTURE.md\n ${pc.green('scaffold')}, ${pc.green('make')} [name] Scaffold a new module or feature with clean boilerplate\n ${pc.green('info')} Show detected project type & architectural flavor\n ${pc.green('help')} Display this help message\n\n${pc.bold('OPTIONS:')}\n ${pc.yellow('-o, --output')} <file> Output markdown path for scan (default: ARCHITECTURE.md)\n ${pc.yellow('-m, --modular')} Enforce modular directory structure\n ${pc.yellow('-s, --standard')} Enforce standard/layered directory structure\n ${pc.yellow('--dry-run')} Simulate generation without writing files\n ${pc.yellow('-f, --force')} Overwrite files if they already exist\n ${pc.yellow('-v, --version')} Display CLI version\n ${pc.yellow('-h, --help')} Display this help message\n\n${pc.bold('EXAMPLES:')}\n ${pc.cyan('$')} larats\n ${pc.cyan('$')} larats scan\n ${pc.cyan('$')} larats scan --output docs/ARCHITECTURE.md\n ${pc.cyan('$')} larats scaffold Payment\n ${pc.cyan('$')} larats make Order --modular\n`);\n}\n\n/**\n * Handle cancellation gracefully\n */\nfunction handleCancel(): never {\n p.cancel(pc.yellow('Operation cancelled. See you next time! πŸ‘‹'));\n process.exit(0);\n}\n\n/**\n * Execute scan workflow\n */\nasync function runScan(\n projectInfo: ProjectInfo,\n outputPath: string = 'ARCHITECTURE.md',\n options: { force?: boolean; dryRun?: boolean } = {}\n) {\n const spinner = p.spinner();\n spinner.start('Scanning codebase structure & components (strict ignore list active)...');\n\n try {\n const destination = path.resolve(projectInfo.rootPath, outputPath);\n\n // Defense: Ensure output path is inside project root\n const rel = path.relative(projectInfo.rootPath, destination);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n spinner.stop(pc.red('Scan failed'));\n p.log.error(`Refusing to write output: \"${outputPath}\" resolves outside project root directory.`);\n process.exitCode = 1;\n return;\n }\n\n // Defense: Refuse to overwrite files that are not generated by LaraTS unless --force\n if (fs.existsSync(destination) && !options.force) {\n const existingContent = fs.readFileSync(destination, 'utf-8');\n const isLaraTsFile =\n existingContent.includes('Auto-generated by **[LaraTS CLI]') ||\n existingContent.includes('Auto-generated by **[ArchMind CLI]') ||\n existingContent.includes('LaraTS CLI') ||\n existingContent.includes('<!-- larats-generated -->');\n\n if (!isLaraTsFile) {\n spinner.stop(pc.red('Scan refused'));\n p.log.error(\n `Destination file \"${outputPath}\" already exists and does not appear to be generated by LaraTS.\\n` +\n `To protect user files from accidental overwrites, use --force to overwrite.`\n );\n process.exitCode = 1;\n return;\n }\n }\n\n const scanResult = await scanProject(projectInfo);\n const nonZeroLayers = Object.values(scanResult.components).filter((c) => c.count > 0).length;\n const totalComponents = Object.values(scanResult.components).reduce((sum, c) => sum + c.count, 0);\n\n if (options.dryRun) {\n spinner.stop(pc.green(`Scan completed in ${scanResult.scanDurationMs}ms (dry run)`));\n p.note(\n `${pc.bold('Scanned Files:')} ${scanResult.totalFilesScanned}\\n` +\n `${pc.bold('Total Components:')} ${totalComponents} across ${nonZeroLayers} active architectural layers\\n` +\n `${pc.bold('Modules Detected:')} ${scanResult.modules.length > 0 ? scanResult.modules.join(', ') : 'None (monolithic structure)'}\\n` +\n `${pc.bold('Simulated Output:')} Would write ARCHITECTURE.md to ${pc.cyan(outputPath)} (dry run: no files written)`,\n pc.green('Architecture Map (Dry Run) πŸ—ΊοΈ')\n );\n p.outro(pc.cyan('Dry run completed: no files written.'));\n return;\n }\n\n spinner.stop(pc.green(`Scan completed in ${scanResult.scanDurationMs}ms`));\n\n const markdown = generateArchitectureMarkdown(scanResult);\n\n // Ensure output directory exists if custom path\n const parentDir = path.dirname(destination);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(destination, markdown, 'utf-8');\n\n // Display summary\n p.note(\n `${pc.bold('Scanned Files:')} ${scanResult.totalFilesScanned}\\n` +\n `${pc.bold('Total Components:')} ${totalComponents} across ${nonZeroLayers} active architectural layers\\n` +\n `${pc.bold('Modules Detected:')} ${scanResult.modules.length > 0 ? scanResult.modules.join(', ') : 'None (monolithic structure)'}\\n` +\n `${pc.bold('Documentation:')} Saved to ${pc.cyan(path.relative(projectInfo.rootPath, destination) || outputPath)}`,\n pc.green('Architecture Map Generated! πŸ—ΊοΈ')\n );\n\n p.outro(pc.cyan(`Open ${outputPath} to view your project structure & Mermaid diagram!`));\n } catch (err: any) {\n spinner.stop(pc.red('Scan failed'));\n p.log.error(err.message || String(err));\n process.exitCode = 1;\n }\n}\n\n/**\n * Execute scaffold workflow\n */\nasync function runScaffold(\n projectInfo: ProjectInfo,\n moduleNameArg?: string,\n cliOptions: { modular?: boolean; standard?: boolean; force?: boolean; dryRun?: boolean } = {}\n) {\n // Warn if project type unknown or non-standard framework\n if (projectInfo.type === 'unknown') {\n p.log.warn(pc.yellow('Warning: Project type is unknown (neither Laravel nor TypeScript detected). Scaffolding standard TypeScript/Express components.'));\n } else if (\n projectInfo.type === 'typescript' &&\n projectInfo.typescript?.framework &&\n !['express', 'node-vanilla', 'unknown'].includes(projectInfo.typescript.framework)\n ) {\n p.log.warn(\n pc.yellow(`Warning: Project detected as \"${projectInfo.typescript.framework}\". LaraTS generates standard Express-compatible TypeScript boilerplate.`)\n );\n }\n\n let moduleName = moduleNameArg;\n\n if (moduleName) {\n const errorMsg = validateModuleName(moduleName);\n if (errorMsg) {\n p.log.error(pc.red(`Invalid module name: ${errorMsg}`));\n process.exitCode = 1;\n return;\n }\n } else {\n // Non-TTY check: cannot prompt\n if (!process.stdin.isTTY) {\n p.log.error(pc.red('Error: Module name is required in non-interactive (non-TTY) mode. Example: `larats scaffold Payment`'));\n process.exitCode = 1;\n return;\n }\n\n const input = await p.text({\n message: 'What is the name of the new module or feature?',\n placeholder: 'e.g. Payment, Order, UserProfile',\n validate(val) {\n return validateModuleName(val) || undefined;\n },\n });\n\n if (p.isCancel(input)) handleCancel();\n moduleName = input.trim();\n }\n\n // Component selection based on project type\n let selectedComponents: string[] = [];\n\n if (projectInfo.type === 'laravel') {\n if (!process.stdin.isTTY) {\n selectedComponents = ['model', 'controller', 'service', 'request', 'migration'];\n } else {\n const componentsPrompt = await p.multiselect({\n message: `Select components to scaffold for ${pc.cyan(moduleName)}:`,\n options: [\n { value: 'model', label: 'Eloquent Model', hint: 'Includes table name, fillables, and casts' },\n { value: 'controller', label: 'Resourceful Controller', hint: 'Includes standard CRUD methods & DI service' },\n { value: 'service', label: 'Service Class', hint: 'Encapsulated business logic operations' },\n { value: 'action', label: 'Single Action Class', hint: 'Invokable single-responsibility class' },\n { value: 'request', label: 'Form Request', hint: 'Request validation rules & authorization' },\n { value: 'migration', label: 'Database Migration', hint: 'Schema definition with timestamps' },\n ],\n initialValues: ['model', 'controller', 'service', 'request', 'migration'],\n required: true,\n });\n\n if (p.isCancel(componentsPrompt)) handleCancel();\n selectedComponents = componentsPrompt as string[];\n }\n\n // Component dependencies: controller depends on service\n if (selectedComponents.includes('controller') && !selectedComponents.includes('service')) {\n p.log.warn(pc.yellow('Notice: Controller requires Service class. Auto-adding \"service\" to scaffolded components.'));\n selectedComponents.push('service');\n }\n } else {\n // TypeScript or fallback\n if (!process.stdin.isTTY) {\n selectedComponents = ['controller', 'service', 'repository', 'route', 'dto'];\n } else {\n const componentsPrompt = await p.multiselect({\n message: `Select components to scaffold for ${pc.cyan(moduleName)}:`,\n options: [\n { value: 'controller', label: 'Controller', hint: 'Express request handlers & response orchestration' },\n { value: 'service', label: 'Service', hint: 'Application logic & repository coordination' },\n { value: 'repository', label: 'Repository', hint: 'Data persistence abstraction & queries' },\n { value: 'route', label: 'Router & Routes', hint: 'Express router mapping endpoints to controller' },\n { value: 'dto', label: 'DTOs & Interfaces', hint: 'Typed interfaces for entities and payloads' },\n ],\n initialValues: ['controller', 'service', 'repository', 'route', 'dto'],\n required: true,\n });\n\n if (p.isCancel(componentsPrompt)) handleCancel();\n selectedComponents = componentsPrompt as string[];\n }\n\n // Dependencies: route -> controller -> service -> repository\n if (selectedComponents.includes('route') && !selectedComponents.includes('controller')) {\n p.log.warn(pc.yellow('Notice: Route requires Controller. Auto-adding \"controller\" to scaffolded components.'));\n selectedComponents.push('controller');\n }\n if (selectedComponents.includes('controller') && !selectedComponents.includes('service')) {\n p.log.warn(pc.yellow('Notice: Controller requires Service. Auto-adding \"service\" to scaffolded components.'));\n selectedComponents.push('service');\n }\n if (selectedComponents.includes('service') && !selectedComponents.includes('repository')) {\n p.log.warn(pc.yellow('Notice: Service requires Repository. Auto-adding \"repository\" to scaffolded components.'));\n selectedComponents.push('repository');\n }\n }\n\n // Determine modular vs standard structure\n let isModular = true;\n if (cliOptions.modular) {\n isModular = true;\n } else if (cliOptions.standard) {\n isModular = false;\n } else if (!process.stdin.isTTY) {\n isModular = projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true;\n } else {\n const defaultModular = projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true;\n\n const structurePrompt = await p.select({\n message: 'Choose folder architecture structure:',\n options: projectInfo.type === 'laravel'\n ? [\n {\n value: 'modular',\n label: 'Modular Domain Structure',\n hint: `app/Modules/${moduleName}/[Models, Controllers, Services]`,\n },\n {\n value: 'standard',\n label: 'Standard Laravel Structure',\n hint: `app/Models, app/Http/Controllers, app/Services`,\n },\n ]\n : [\n {\n value: 'modular',\n label: 'Modular Feature Structure',\n hint: `src/modules/${moduleName.toLowerCase()}/...`,\n },\n {\n value: 'standard',\n label: 'Layered Folder Structure',\n hint: `src/controllers, src/services, src/routes...`,\n },\n ],\n initialValue: defaultModular ? 'modular' : 'standard',\n });\n\n if (p.isCancel(structurePrompt)) handleCancel();\n isModular = structurePrompt === 'modular';\n }\n\n const spinner = p.spinner();\n spinner.start(`Generating boilerplate files for ${pc.cyan(moduleName)}...`);\n\n const result: ScaffoldResult = await scaffoldModule(projectInfo, {\n moduleName,\n components: selectedComponents,\n isModular,\n dryRun: cliOptions.dryRun,\n forceOverwrite: cliOptions.force,\n });\n\n spinner.stop('Generation finished!');\n\n if (result.errorCount > 0) {\n process.exitCode = 1;\n }\n\n // Report files status\n const fileLines = result.files.map((f) => {\n if (f.status === 'created') {\n if (cliOptions.dryRun) {\n return ` ${pc.blue('β„Ή')} ${f.relativeFilePath} ${pc.gray('(would create)')}`;\n }\n return ` ${pc.green('βœ”')} ${f.relativeFilePath} ${pc.gray('(created)')}`;\n } else if (f.status === 'skipped') {\n return ` ${pc.yellow('⚠')} ${f.relativeFilePath} ${pc.yellow(`(skipped - ${f.reason})`)}`;\n } else {\n return ` ${pc.red('βœ–')} ${f.relativeFilePath} ${pc.red(`(error - ${f.reason})`)}`;\n }\n });\n\n if (cliOptions.dryRun) {\n p.note(\n fileLines.join('\\n') +\n `\\n\\n${pc.bold('Dry run summary:')} ${pc.cyan(`${result.createdCount} would be created`)}, ${pc.yellow(`${result.skippedCount} skipped`)}, ${pc.red(`${result.errorCount} errors`)}`,\n pc.cyan(`Dry run: Scaffolding ${moduleName}`)\n );\n p.outro(pc.cyan('Dry run: no files written.'));\n return;\n }\n\n p.note(\n fileLines.join('\\n') +\n `\\n\\n${pc.bold('Summary:')} ${pc.green(`${result.createdCount} created`)}, ${pc.yellow(`${result.skippedCount} skipped`)}, ${pc.red(`${result.errorCount} errors`)}`,\n pc.cyan(`Module Scaffolding: ${moduleName}`)\n );\n\n if (result.skippedCount > 0 && !cliOptions.force) {\n p.log.warn(pc.yellow('Anti-Overwrite Protection prevented modifying existing files. Use --force to overwrite if intended.'));\n }\n\n // Next steps guidance\n const names = getNaming(moduleName);\n if (result.createdCount > 0) {\n if (projectInfo.type === 'laravel') {\n p.note(\n `1. Run database migration:\\n ${pc.cyan('php artisan migrate')}\\n` +\n `2. Register routes in routes/api.php or routes/web.php:\\n ${pc.cyan(`Route::apiResource('${names.kebab}', \\\\${isModular ? `App\\\\Modules\\\\${names.pascal}\\\\Controllers\\\\` : 'App\\\\Http\\\\Controllers\\\\'}${names.pascal}Controller::class);`)}`,\n 'πŸš€ Next Steps'\n );\n } else {\n p.note(\n `1. Mount routes into Express app:\\n ${pc.cyan(`import { ${names.camel}Routes } from './${isModular ? `modules/${names.kebab}` : `routes/${names.kebab}.routes.js`}';\\n app.use('/api/${names.kebab}', ${names.camel}Routes);`)}`,\n 'πŸš€ Next Steps'\n );\n }\n }\n\n p.outro(pc.green(`✨ Successfully scaffolded ${moduleName} module!`));\n}\n\n/**\n * Display quick project info\n */\nfunction showProjectInfo(projectInfo: ProjectInfo) {\n let details = `${pc.bold('Project Name:')} ${projectInfo.name}\\n` +\n `${pc.bold('Project Type:')} ${projectInfo.type.toUpperCase()}\\n` +\n `${pc.bold('Flavor / Stack:')} ${projectInfo.summary}\\n` +\n `${pc.bold('Working Path:')} ${projectInfo.rootPath}`;\n\n if (projectInfo.type === 'laravel' && projectInfo.laravel) {\n details += `\\n${pc.bold('Filament Admin:')} ${projectInfo.laravel.hasFilament ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Livewire:')} ${projectInfo.laravel.hasLivewire ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Inertia.js:')} ${projectInfo.laravel.hasInertia ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Modular App:')} ${projectInfo.laravel.isModular ? pc.green('Yes') : 'No'}`;\n } else if (projectInfo.type === 'typescript' && projectInfo.typescript) {\n details += `\\n${pc.bold('Framework:')} ${projectInfo.typescript.framework}` +\n `\\n${pc.bold('Prisma ORM:')} ${projectInfo.typescript.hasPrisma ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Monorepo:')} ${projectInfo.typescript.isMonorepo ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Modular Src:')} ${projectInfo.typescript.isModular ? pc.green('Yes') : 'No'}`;\n }\n\n p.note(details, pc.cyan('Detected Project Architecture'));\n}\n\n/**\n * CLI Main Entrypoint\n */\nasync function main() {\n let parsed;\n try {\n parsed = parseArgs({\n args: process.argv.slice(2),\n options: {\n output: { type: 'string', short: 'o' },\n modular: { type: 'boolean', short: 'm' },\n standard: { type: 'boolean', short: 's' },\n force: { type: 'boolean', short: 'f' },\n 'dry-run': { type: 'boolean' },\n version: { type: 'boolean', short: 'v' },\n help: { type: 'boolean', short: 'h' },\n },\n allowPositionals: true,\n strict: true,\n });\n } catch (err: any) {\n console.error(pc.red(`Error: ${err.message}`));\n showHelp();\n process.exitCode = 1;\n return;\n }\n\n // Flags check\n if (parsed.values.help || parsed.positionals[0] === 'help') {\n showHelp();\n return;\n }\n\n if (parsed.values.version || parsed.positionals[0] === 'version') {\n console.log(`larats v${VERSION}`);\n return;\n }\n\n const command = parsed.positionals[0];\n const VALID_COMMANDS = new Set(['scan', 'scaffold', 'make', 'info', 'help']);\n if (command && !VALID_COMMANDS.has(command)) {\n console.error(pc.red(`Error: Unknown command \"${command}\".`));\n showHelp();\n process.exitCode = 1;\n return;\n }\n\n const outputPath = parsed.values.output || 'ARCHITECTURE.md';\n const isModularFlag = parsed.values.modular;\n const isStandardFlag = parsed.values.standard;\n const isForceFlag = parsed.values.force;\n const isDryRunFlag = parsed.values['dry-run'];\n\n // Auto-detect project type in current working directory\n const projectInfo = await detectProjectType(process.cwd());\n\n // Non-interactive command routing\n if (command === 'scan') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Scanning Architecture`);\n p.log.info(`Detected: ${pc.green(projectInfo.summary)}`);\n await runScan(projectInfo, outputPath, {\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n return;\n }\n\n if (command === 'scaffold' || command === 'make') {\n const moduleName = parsed.positionals[1];\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Module Scaffolder`);\n p.log.info(`Target Project: ${pc.green(projectInfo.summary)}`);\n await runScaffold(projectInfo, moduleName, {\n modular: isModularFlag,\n standard: isStandardFlag,\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n return;\n }\n\n if (command === 'info') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)}`);\n showProjectInfo(projectInfo);\n p.outro(pc.cyan('Done.'));\n return;\n }\n\n // No command supplied: check for non-TTY\n if (!process.stdin.isTTY) {\n showHelp();\n return;\n }\n\n // Interactive Menu Mode\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.bold('Smart Architecture Visualizer & Scaffolder')} ${pc.gray(`v${VERSION}`)}`);\n\n p.log.info(`Working Directory: ${pc.gray(process.cwd())}`);\n p.log.info(`Detected Architecture: ${pc.bold(pc.green(projectInfo.summary))}`);\n\n const action = await p.select({\n message: 'What would you like to do?',\n options: [\n {\n value: 'scan',\n label: 'πŸ” Scan Architecture & Generate ARCHITECTURE.md',\n hint: 'Creates component stats, directory tree & Mermaid flowchart',\n },\n {\n value: 'scaffold',\n label: 'πŸ—οΈ Scaffold New Feature / Module',\n hint: 'Interactively generate boilerplate components with safety checks',\n },\n {\n value: 'info',\n label: 'πŸ“Š Inspect Detected Architecture Details',\n hint: 'View detected frameworks, ORMs, and configurations',\n },\n {\n value: 'exit',\n label: 'πŸšͺ Exit',\n },\n ],\n });\n\n if (p.isCancel(action) || action === 'exit') {\n handleCancel();\n }\n\n if (action === 'scan') {\n await runScan(projectInfo, outputPath, {\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n } else if (action === 'scaffold') {\n await runScaffold(projectInfo, undefined, {\n modular: isModularFlag,\n standard: isStandardFlag,\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n } else if (action === 'info') {\n showProjectInfo(projectInfo);\n p.outro(pc.cyan('Done!'));\n }\n}\n\nmain().catch((err) => {\n p.log.error(pc.red(`Fatal error: ${err.message || String(err)}`));\n process.exit(1);\n});\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type ProjectType = 'laravel' | 'typescript' | 'unknown';\n\nexport interface LaravelDetails {\n version?: string;\n hasFilament: boolean;\n hasLivewire: boolean;\n hasInertia: boolean;\n hasSanctum: boolean;\n isModular: boolean;\n modulesDir?: string;\n}\n\nexport interface TypeScriptDetails {\n framework: 'express' | 'nest' | 'fastify' | 'hono' | 'react' | 'next' | 'vue' | 'node-vanilla' | 'unknown';\n hasPrisma: boolean;\n hasTypeORM: boolean;\n hasDrizzle: boolean;\n isMonorepo: boolean;\n isModular: boolean;\n srcDir: string;\n}\n\nexport interface ProjectInfo {\n type: ProjectType;\n name: string;\n rootPath: string;\n laravel?: LaravelDetails;\n typescript?: TypeScriptDetails;\n summary: string;\n}\n\n/**\n * Safely parse a JSON file without throwing errors.\n */\nfunction readJsonSafe<T = any>(filePath: string): T | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const content = fs.readFileSync(filePath, 'utf-8').replace(/^\\uFEFF/, '');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect the project type and architectural characteristics of the target directory.\n */\nexport async function detectProjectType(targetDir: string = process.cwd()): Promise<ProjectInfo> {\n const resolvedDir = path.resolve(targetDir);\n const dirName = path.basename(resolvedDir);\n\n const hasArtisan = fs.existsSync(path.join(resolvedDir, 'artisan'));\n const composerPath = path.join(resolvedDir, 'composer.json');\n const hasComposer = fs.existsSync(composerPath);\n\n const tsconfigPath = path.join(resolvedDir, 'tsconfig.json');\n const hasTsConfig = fs.existsSync(tsconfigPath);\n const packageJsonPath = path.join(resolvedDir, 'package.json');\n const hasPackageJson = fs.existsSync(packageJsonPath);\n\n // 1. Check for Laravel Project\n if (hasArtisan && hasComposer) {\n const composerData = readJsonSafe<{\n name?: string;\n require?: Record<string, string>;\n 'require-dev'?: Record<string, string>;\n }>(composerPath);\n\n const allDeps = {\n ...(composerData?.require || {}),\n ...(composerData?.['require-dev'] || {}),\n };\n\n const hasFilament = Object.keys(allDeps).some((dep) => dep.startsWith('filament/'));\n const hasLivewire = 'livewire/livewire' in allDeps;\n const hasInertia = 'inertiajs/inertia-laravel' in allDeps;\n const hasSanctum = 'laravel/sanctum' in allDeps;\n\n const rawVersion = allDeps['laravel/framework'] || '';\n const versionMatch = rawVersion.match(/\\d+(?:\\.\\d+)*/);\n const cleanVersion = versionMatch ? versionMatch[0] : '';\n\n // Check for modular architecture\n const appModulesDir = path.join(resolvedDir, 'app', 'Modules');\n const rootModulesDir = path.join(resolvedDir, 'modules');\n const rootModulesCapDir = path.join(resolvedDir, 'Modules');\n const isModular =\n fs.existsSync(appModulesDir) ||\n fs.existsSync(rootModulesDir) ||\n fs.existsSync(rootModulesCapDir);\n const modulesDir = fs.existsSync(appModulesDir)\n ? 'app/Modules'\n : fs.existsSync(rootModulesDir)\n ? 'modules'\n : fs.existsSync(rootModulesCapDir)\n ? 'Modules'\n : undefined;\n\n const extras: string[] = [];\n if (hasFilament) extras.push('Filament');\n if (hasLivewire) extras.push('Livewire');\n if (hasInertia) extras.push('Inertia');\n if (isModular) extras.push('Modular Architecture');\n\n const summary = `Laravel ${cleanVersion || ''}${extras.length > 0 ? ` (${extras.join(', ')})` : ''}`.trim();\n\n return {\n type: 'laravel',\n name: composerData?.name?.split('/')[1] || dirName,\n rootPath: resolvedDir,\n laravel: {\n version: cleanVersion || undefined,\n hasFilament,\n hasLivewire,\n hasInertia,\n hasSanctum,\n isModular,\n modulesDir,\n },\n summary,\n };\n }\n\n // 2. Check for TypeScript Project\n if (hasTsConfig && hasPackageJson) {\n const pkg = readJsonSafe<{\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: any;\n }>(packageJsonPath);\n\n const allDeps = {\n ...(pkg?.dependencies || {}),\n ...(pkg?.devDependencies || {}),\n };\n\n let framework: TypeScriptDetails['framework'] = 'unknown';\n if ('@nestjs/core' in allDeps) framework = 'nest';\n else if ('next' in allDeps) framework = 'next';\n else if ('express' in allDeps) framework = 'express';\n else if ('fastify' in allDeps) framework = 'fastify';\n else if ('hono' in allDeps) framework = 'hono';\n else if ('react' in allDeps) framework = 'react';\n else if ('vue' in allDeps) framework = 'vue';\n else framework = 'node-vanilla';\n\n const hasPrisma = 'prisma' in allDeps || '@prisma/client' in allDeps || fs.existsSync(path.join(resolvedDir, 'prisma'));\n const hasTypeORM = 'typeorm' in allDeps;\n const hasDrizzle = 'drizzle-orm' in allDeps;\n\n const isMonorepo =\n Boolean(pkg?.workspaces) ||\n fs.existsSync(path.join(resolvedDir, 'pnpm-workspace.yaml')) ||\n fs.existsSync(path.join(resolvedDir, 'turbo.json')) ||\n fs.existsSync(path.join(resolvedDir, 'lerna.json'));\n\n const hasSrc = fs.existsSync(path.join(resolvedDir, 'src'));\n const srcDir = hasSrc ? 'src' : '.';\n const isModular =\n fs.existsSync(path.join(resolvedDir, srcDir, 'modules')) ||\n fs.existsSync(path.join(resolvedDir, 'modules'));\n\n const extras: string[] = [framework !== 'node-vanilla' ? framework : 'TypeScript'];\n if (hasPrisma) extras.push('Prisma');\n if (hasTypeORM) extras.push('TypeORM');\n if (hasDrizzle) extras.push('Drizzle');\n if (isMonorepo) extras.push('Monorepo');\n if (isModular) extras.push('Modular');\n\n const summary = `TypeScript (${extras.join(', ')})`;\n\n return {\n type: 'typescript',\n name: pkg?.name || dirName,\n rootPath: resolvedDir,\n typescript: {\n framework,\n hasPrisma,\n hasTypeORM,\n hasDrizzle,\n isMonorepo,\n isModular,\n srcDir,\n },\n summary,\n };\n }\n\n // 3. Fallback / Unknown Project\n let fallbackName = dirName;\n if (hasPackageJson) {\n const pkg = readJsonSafe<{ name?: string }>(packageJsonPath);\n if (pkg?.name) fallbackName = pkg.name;\n }\n\n return {\n type: 'unknown',\n name: fallbackName,\n rootPath: resolvedDir,\n summary: 'Generic / Unknown Project',\n };\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport fg from 'fast-glob';\nimport type { ProjectInfo } from './detector.js';\n\nexport const SAFE_IGNORE_LIST = [\n // Dependencies & package management\n '**/node_modules/**',\n '**/vendor/**',\n '**/.pnpm/**',\n '**/.yarn/**',\n // Version control\n '**/.git/**',\n '**/.svn/**',\n '**/.hg/**',\n // Storage, cache & build outputs (scoped to root to preserve src/build/)\n '**/storage/**',\n '**/dist/**',\n 'build/**',\n 'out/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/.turbo/**',\n '**/.cache/**',\n '**/coverage/**',\n '**/.temp/**',\n 'tmp/**',\n // IDEs & OS files\n '**/.idea/**',\n '**/.vscode/**',\n '**/.DS_Store',\n '**/Thumbs.db',\n // Secrets, private keys & cloud credentials\n '**/.env*',\n '**/*.pem',\n '**/*.key',\n '**/*.pfx',\n '**/*.p12',\n '**/*.jks',\n '**/*.keystore',\n '**/*.cert',\n '**/*.crt',\n '**/*.secret',\n '**/secrets/**',\n '**/.aws/**',\n '**/.ssh/**',\n '**/credentials*.json',\n '**/*service-account*.json',\n '**/id_rsa*',\n '**/id_ed25519*',\n '**/id_ecdsa*',\n '**/*.pub',\n // Logs & Lock files\n '**/*.log',\n '**/*.lock',\n '**/package-lock.json',\n '**/yarn.lock',\n '**/pnpm-lock.yaml',\n '**/composer.lock',\n];\n\nexport interface ComponentGroup {\n name: string;\n count: number;\n files: string[];\n description: string;\n}\n\nexport interface ScanResult {\n projectInfo: ProjectInfo;\n totalFilesScanned: number;\n components: Record<string, ComponentGroup>;\n modules: string[];\n directoryTree: string;\n scanDurationMs: number;\n}\n\nexport function localeIndependentCompare(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * Build a clean ASCII directory tree representation from a list of relative file paths.\n */\nexport function buildCleanDirectoryTree(files: string[], maxDepth: number = 3): string {\n interface TreeNode {\n name: string;\n isDir: boolean;\n children: Map<string, TreeNode>;\n }\n\n const root: TreeNode = { name: '', isDir: true, children: new Map() };\n\n // Populate tree\n for (const file of files) {\n const parts = file.split(/[/\\\\]/);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i === parts.length - 1;\n\n if (!current.children.has(part)) {\n current.children.set(part, {\n name: part,\n isDir: !isLast,\n children: new Map(),\n });\n }\n current = current.children.get(part)!;\n }\n }\n\n const lines: string[] = [];\n\n function renderNode(node: TreeNode, prefix: string, currentDepth: number) {\n if (currentDepth > maxDepth) return;\n\n const entries = Array.from(node.children.values()).sort((a, b) => {\n // Directories first, then files\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return localeIndependentCompare(a.name, b.name);\n });\n\n // If at maxDepth and has children, show summary\n if (currentDepth === maxDepth && entries.length > 0) {\n lines.push(`${prefix}└── ... (${entries.length} items hidden)`);\n return;\n }\n\n // Limit files shown per directory if too many\n const maxEntriesPerDir = 8;\n const displayedEntries = entries.slice(0, maxEntriesPerDir);\n const hiddenCount = entries.length - displayedEntries.length;\n\n displayedEntries.forEach((child, index) => {\n const isLast = index === displayedEntries.length - 1 && hiddenCount === 0;\n const pointer = isLast ? '└── ' : 'β”œβ”€β”€ ';\n const displayName = child.isDir ? `${child.name}/` : child.name;\n\n lines.push(`${prefix}${pointer}${displayName}`);\n\n if (child.isDir) {\n const nextPrefix = prefix + (isLast ? ' ' : 'β”‚ ');\n renderNode(child, nextPrefix, currentDepth + 1);\n }\n });\n\n if (hiddenCount > 0) {\n lines.push(`${prefix}└── ... (${hiddenCount} more files/folders)`);\n }\n }\n\n // Render children of root\n const topLevel = Array.from(root.children.values()).sort((a, b) => {\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return localeIndependentCompare(a.name, b.name);\n });\n\n topLevel.forEach((child, index) => {\n const isLast = index === topLevel.length - 1;\n const pointer = isLast ? '└── ' : 'β”œβ”€β”€ ';\n const displayName = child.isDir ? `${child.name}/` : child.name;\n\n lines.push(`${pointer}${displayName}`);\n if (child.isDir) {\n const nextPrefix = isLast ? ' ' : 'β”‚ ';\n renderNode(child, nextPrefix, 1);\n }\n });\n\n return lines.join('\\n');\n}\n\n/**\n * Scan project safely using fast-glob and categorize architectural components.\n */\nexport async function scanProject(projectInfo: ProjectInfo): Promise<ScanResult> {\n const startTime = Date.now();\n const root = projectInfo.rootPath;\n\n // Avoid scanning system root drive or home directory directly\n const resolvedRoot = path.resolve(root);\n const parsedRoot = path.parse(resolvedRoot);\n if (parsedRoot.root === resolvedRoot || (typeof os.homedir === 'function' && resolvedRoot === os.homedir())) {\n throw new Error(`Refusing to scan system drive or home directory root directly: \"${resolvedRoot}\".`);\n }\n\n // Scan all relevant files in repo while respecting SAFE_IGNORE_LIST\n const allFiles = await fg('**/*', {\n cwd: root,\n ignore: SAFE_IGNORE_LIST,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n });\n\n const MAX_FILES_CAP = 10000;\n let normalizedFiles = allFiles.map((f) => f.replace(/\\\\/g, '/'));\n if (normalizedFiles.length > MAX_FILES_CAP) {\n console.warn(`[WARN] Large codebase detected (${normalizedFiles.length} files). Capping scan analysis to first ${MAX_FILES_CAP} files.`);\n normalizedFiles = normalizedFiles.slice(0, MAX_FILES_CAP);\n }\n const components: Record<string, ComponentGroup> = {};\n const modulesSet = new Set<string>();\n\n if (projectInfo.type === 'laravel') {\n // 1. Models - match Models/ anywhere under app or modules dirs, exclude non-model files\n const models = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Models\\/.*\\.php$/i.test(f)\n );\n components['Models'] = {\n name: 'Eloquent Models',\n count: models.length,\n files: models,\n description: 'Database entity mappings and business logic models',\n };\n\n // 2. Controllers\n const controllers = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Controllers\\/.*\\.php$/i.test(f)\n );\n components['Controllers'] = {\n name: 'HTTP Controllers',\n count: controllers.length,\n files: controllers,\n description: 'Request handling and response orchestration',\n };\n\n // 3. Services\n const services = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Services\\/.*\\.php$/i.test(f)\n );\n components['Services'] = {\n name: 'Service Classes',\n count: services.length,\n files: services,\n description: 'Encapsulated business logic and external integrations',\n };\n\n // 4. Actions\n const actions = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Actions\\/.*\\.php$/i.test(f)\n );\n components['Actions'] = {\n name: 'Action Classes',\n count: actions.length,\n files: actions,\n description: 'Single-responsibility invokable operations',\n };\n\n // 5. Form Requests\n const requests = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?(?:Http\\/)?Requests\\/.*\\.php$/i.test(f)\n );\n components['Form Requests'] = {\n name: 'Form Requests',\n count: requests.length,\n files: requests,\n description: 'Input validation and authorization rules',\n };\n\n // 6. Filament Resources\n const filament = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Filament\\/.*\\.php$/i.test(f)\n );\n if (filament.length > 0 || projectInfo.laravel?.hasFilament) {\n components['Filament Resources'] = {\n name: 'Filament Admin Resources',\n count: filament.length,\n files: filament,\n description: 'Admin panel CRUD pages, widgets, and schemas',\n };\n }\n\n // 7. Routes\n const routes = normalizedFiles.filter((f) =>\n /^(?:routes\\/.*\\.php|(?:app\\/Modules|modules|Modules)\\/.*\\/routes?.*\\.php)$/i.test(f)\n );\n components['Routes'] = {\n name: 'Routing Definitions',\n count: routes.length,\n files: routes,\n description: 'Web, API, and console endpoint routes',\n };\n\n // 8. Database Migrations\n const migrations = normalizedFiles.filter((f) =>\n /(?:^database\\/migrations\\/.*\\.php$|\\/migrations\\/.*\\.php$)/i.test(f)\n );\n components['Migrations'] = {\n name: 'Database Migrations',\n count: migrations.length,\n files: migrations,\n description: 'Schema version control and table definitions',\n };\n\n // Detect Laravel Modules - must require a trailing slash after module name so loose files are excluded\n const modDirPattern = projectInfo.laravel?.modulesDir\n ? `(?:${projectInfo.laravel.modulesDir}|app/Modules|modules|Modules)`\n : '(?:app/Modules|modules|Modules)';\n const modRegex = new RegExp(`^${modDirPattern}/([^/]+)/`, 'i');\n\n for (const f of normalizedFiles) {\n const match = f.match(modRegex);\n if (match && match[1]) {\n modulesSet.add(match[1]);\n }\n }\n } else if (projectInfo.type === 'typescript') {\n const srcDir = projectInfo.typescript?.srcDir ?? 'src';\n // Support custom srcDir as well as monorepo packages (apps/*/src, packages/*/src)\n const tsPrefix = `(?:${srcDir}|(?:apps|packages)/[^/]+/(?:${srcDir}|src))`;\n\n // 1. Controllers (files in controllers/ or matching .controller.(ts|js))\n const controllers = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:controllers/.*\\\\.(?:ts|js|mts|cts)|.*[./]controller\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Controllers'] = {\n name: 'Controllers',\n count: controllers.length,\n files: controllers,\n description: 'HTTP request handlers and response dispatchers',\n };\n\n // 2. Services (files in services/ or matching .service.(ts|js))\n const services = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:services/.*\\\\.(?:ts|js|mts|cts)|.*[./]service\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Services'] = {\n name: 'Services',\n count: services.length,\n files: services,\n description: 'Core domain logic and application workflows',\n };\n\n // 3. Repositories (files in repositories/ or matching .repository.(ts|js))\n const repositories = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:repositories/.*\\\\.(?:ts|js|mts|cts)|.*[./]repository\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Repositories'] = {\n name: 'Repositories',\n count: repositories.length,\n files: repositories,\n description: 'Data access abstraction and database queries',\n };\n\n // 4. Routes (files in routes/ or matching .routes.(ts|js))\n const routes = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:routes/.*\\\\.(?:ts|js|mts|cts)|.*[./]routes?\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Routes'] = {\n name: 'Routes',\n count: routes.length,\n files: routes,\n description: 'API endpoint mappings and router handlers',\n };\n\n // 5. DTOs & Validation Schemas\n const dtos = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:(?:dtos|schemas)/.*\\\\.(?:ts|js|mts|cts)|.*[./](?:dto|schema)\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['DTOs & Schemas'] = {\n name: 'DTOs & Schemas',\n count: dtos.length,\n files: dtos,\n description: 'Data transfer objects and request validation schemas',\n };\n\n // 6. Models / Prisma / Entities\n const models = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n (new RegExp(`^${tsPrefix}/(?:.*/)?(?:(?:models|entities)/.*\\\\.(?:ts|js|mts|cts)|.*[./](?:model|entity)\\\\.(?:ts|js|mts|cts))$`, 'i').test(f) ||\n /(?:^|\\/)prisma\\/schema\\.prisma$/i.test(f))\n );\n components['Models & Entities'] = {\n name: 'Models & Entities',\n count: models.length,\n files: models,\n description: 'Database schema definitions and entity declarations',\n };\n\n // 7. Frontend Components (if React/Vue/Next/Vite)\n const componentsFiles = normalizedFiles.filter((f) =>\n new RegExp(`^${tsPrefix}/(?:components|ui)/.*\\\\.(?:tsx|jsx|vue|svelte|ts|js)$`, 'i').test(f)\n );\n if (componentsFiles.length > 0) {\n components['UI Components'] = {\n name: 'UI Components',\n count: componentsFiles.length,\n files: componentsFiles,\n description: 'Reusable user interface views and components',\n };\n }\n\n // Detect TypeScript Modules (requiring trailing slash after module name)\n const moduleRegex = new RegExp(`^(?:${tsPrefix}/modules|modules)/([^/]+)/`, 'i');\n for (const mf of normalizedFiles) {\n const match = mf.match(moduleRegex);\n if (match && match[1]) {\n modulesSet.add(match[1]);\n }\n }\n\n // If no classic web layers are found (e.g. CLI tool, utility library), populate Source and Test files\n const totalWebLayers = Object.values(components).reduce((acc, c) => acc + c.count, 0);\n if (totalWebLayers === 0) {\n const srcFiles = normalizedFiles.filter((f) =>\n new RegExp(`^${tsPrefix}/`, 'i').test(f)\n );\n const testFiles = normalizedFiles.filter((f) =>\n /(?:^|[._-])(?:test|spec)\\.[a-z]+$|(?:^|\\/)__tests__\\//i.test(f)\n );\n\n components['Source Files'] = {\n name: 'Source Files',\n count: srcFiles.length,\n files: srcFiles,\n description: 'Main application source code',\n };\n\n components['Test Files'] = {\n name: 'Test Files',\n count: testFiles.length,\n files: testFiles,\n description: 'Automated test suites and specifications',\n };\n }\n } else {\n // Generic project component classification\n const srcFiles = normalizedFiles.filter((f) => /^src\\//i.test(f));\n const testFiles = normalizedFiles.filter((f) =>\n /(?:^|[._-])(?:test|spec)\\.[a-z]+$|(?:^|\\/)__tests__\\//i.test(f)\n );\n\n components['Source Files'] = {\n name: 'Source Files',\n count: srcFiles.length,\n files: srcFiles,\n description: 'Main application source code',\n };\n\n components['Test Files'] = {\n name: 'Test Files',\n count: testFiles.length,\n files: testFiles,\n description: 'Automated test suites and specifications',\n };\n }\n\n // Generate clean directory tree\n const directoryTree = buildCleanDirectoryTree(normalizedFiles, 3);\n const scanDurationMs = Date.now() - startTime;\n\n return {\n projectInfo,\n totalFilesScanned: normalizedFiles.length,\n components,\n modules: Array.from(modulesSet).sort(localeIndependentCompare),\n directoryTree,\n scanDurationMs,\n };\n}\n","import type { ScanResult } from '../scanner.js';\nimport { SAFE_IGNORE_LIST } from '../scanner.js';\n\n/**\n * Escape pipe and newline characters in Markdown table cells.\n */\nexport function mdCell(str: string): string {\n if (!str) return '-';\n const cleaned = str.replace(/\\|/g, '\\\\|').replace(/[\\r\\n]+/g, ' ').trim();\n return cleaned || '-';\n}\n\n/**\n * Format markdown code fence handling nested backticks safely.\n */\nexport function fence(body: string, lang: string = ''): string {\n const matches = body.match(/`+/g);\n let maxBackticks = 2;\n if (matches) {\n for (const match of matches) {\n if (match.length > maxBackticks) maxBackticks = match.length;\n }\n }\n const f = '`'.repeat(maxBackticks + 1);\n return `${f}${lang ? lang : ''}\\n${body}\\n${f}`;\n}\n\n/**\n * Escape text for safe rendering in Mermaid diagram node labels and sanitize characters.\n */\nexport function mermaidLabel(str: string, maxLen: number = 40): string {\n if (!str) return '';\n let cleaned = str\n .replace(/\"/g, \"'\")\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/`/g, \"'\")\n .replace(/[\\r\\n]+/g, ' ')\n .trim();\n if (cleaned.length > maxLen) {\n cleaned = cleaned.slice(0, maxLen - 3) + '...';\n }\n return cleaned;\n}\n\n/**\n * Render feature modules subgraph for Mermaid diagrams.\n */\nfunction renderModulesSubgraph(modules: string[]): string {\n if (modules.length === 0) return '';\n let output = `\\n subgraph ModulesLayer [\"πŸ“¦ Detected Modules (${modules.length})\"]\\n`;\n modules.slice(0, 6).forEach((mod, idx) => {\n output += ` Mod_${idx}[\"${mermaidLabel(mod)} Module\"]:::service\\n`;\n });\n if (modules.length > 6) {\n output += ` Mod_More[\"...and ${modules.length - 6} more modules\"]:::service\\n`;\n }\n output += ` end\\n`;\n return output;\n}\n\n/**\n * Generate a dynamic Mermaid.js diagram representing only the components and layers\n * that actually exist in the scanned codebase.\n */\nexport function generateMermaidDiagram(scanResult: ScanResult): string {\n const { projectInfo, components, modules } = scanResult;\n\n if (projectInfo.type === 'laravel') {\n const hasFilament = projectInfo.laravel?.hasFilament || (components['Filament Resources']?.count ?? 0) > 0;\n const hasActions = (components['Actions']?.count ?? 0) > 0;\n const hasServices = (components['Services']?.count ?? 0) > 0;\n const hasRequests = (components['Form Requests']?.count ?? 0) > 0;\n const hasModels = (components['Models']?.count ?? 0) > 0;\n const hasMigrations = (components['Migrations']?.count ?? 0) > 0;\n\n let diagram = `flowchart TD\n %% Styling Definitions\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef routing fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n classDef controller fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef service fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#7E22CE;\n classDef data fill:#FEE2E2,stroke:#DC2626,stroke-width:2px,color:#B91C1C;\n classDef db fill:#F1F5F9,stroke:#475569,stroke-width:2px,color:#334155;\n\n subgraph EntryLayer [\"1. Client & Entrypoints\"]\n Client[\"Client / Browser / API Consumer\"]:::client\n Routes[\"HTTP Routes\"]:::routing\n end\n`;\n\n if (hasRequests) {\n diagram += `\n subgraph RequestLayer [\"2. Request Pipeline & Validation\"]\n Middleware[\"Middleware Pipeline<br/>(Auth, CSRF, Rate Limiting)\"]:::routing\n FormRequests[\"Form Requests<br/>(Validation & Authorization)\"]:::routing\n end\n`;\n }\n\n diagram += `\n subgraph HttpLayer [\"3. Controllers & Presentation\"]\n Controllers[\"HTTP Controllers\"]:::controller\n`;\n if (hasFilament) {\n diagram += ` Filament[\"Filament Admin Resources\"]:::controller\\n`;\n }\n diagram += ` end\\n`;\n\n if (hasServices || hasActions) {\n diagram += `\n subgraph DomainLayer [\"4. Domain & Business Logic\"]\n`;\n if (hasServices) {\n diagram += ` Services[\"Service Classes\"]:::service\\n`;\n }\n if (hasActions) {\n diagram += ` Actions[\"Action Classes\"]:::service\\n`;\n }\n diagram += ` end\\n`;\n }\n\n diagram += `\n subgraph DataLayer [\"5. Data Persistence & Storage\"]\n`;\n if (hasModels) {\n diagram += ` Models[\"Eloquent Models\"]:::data\\n`;\n }\n diagram += ` Database[(\"Database<br/>(MySQL / Postgres / SQLite)\")]:::db\\n`;\n if (hasMigrations) {\n diagram += ` Migrations[\"Database Migrations\"]:::data\\n`;\n }\n diagram += ` end\\n\\n`;\n\n // Connect nodes dynamically\n diagram += ` Client --> Routes\\n`;\n\n if (hasRequests) {\n diagram += ` Routes --> Middleware\\n`;\n diagram += ` Middleware --> FormRequests\\n`;\n diagram += ` FormRequests --> Controllers\\n`;\n } else {\n diagram += ` Routes --> Controllers\\n`;\n }\n\n if (hasServices && hasActions) {\n diagram += ` Controllers --> Services\\n`;\n diagram += ` Controllers --> Actions\\n`;\n if (hasModels) {\n diagram += ` Services --> Models\\n`;\n diagram += ` Actions --> Models\\n`;\n } else {\n diagram += ` Services --> Database\\n`;\n diagram += ` Actions --> Database\\n`;\n }\n } else if (hasServices) {\n diagram += ` Controllers --> Services\\n`;\n if (hasModels) {\n diagram += ` Services --> Models\\n`;\n } else {\n diagram += ` Services --> Database\\n`;\n }\n } else if (hasActions) {\n diagram += ` Controllers --> Actions\\n`;\n if (hasModels) {\n diagram += ` Actions --> Models\\n`;\n } else {\n diagram += ` Actions --> Database\\n`;\n }\n } else {\n if (hasModels) {\n diagram += ` Controllers --> Models\\n`;\n } else {\n diagram += ` Controllers --> Database\\n`;\n }\n }\n\n if (hasFilament) {\n if (hasModels) {\n diagram += ` Client --> Filament\\n Filament --> Models\\n`;\n } else {\n diagram += ` Client --> Filament\\n Filament --> Database\\n`;\n }\n }\n\n if (hasModels) {\n diagram += ` Models --> Database\\n`;\n }\n if (hasMigrations) {\n diagram += ` Migrations -.-> Database\\n`;\n }\n\n if (modules.length > 0) {\n diagram += renderModulesSubgraph(modules);\n }\n\n return diagram;\n }\n\n if (projectInfo.type === 'typescript') {\n const rawFw = projectInfo.typescript?.framework || 'express';\n const fwDisplay =\n rawFw !== 'unknown' && rawFw !== 'node-vanilla'\n ? `${rawFw.charAt(0).toUpperCase() + rawFw.slice(1)} Router`\n : 'API Endpoints & Handlers';\n\n const orm = projectInfo.typescript?.hasPrisma ? 'Prisma' : projectInfo.typescript?.hasTypeORM ? 'TypeORM' : projectInfo.typescript?.hasDrizzle ? 'Drizzle' : null;\n\n const hasControllers = (components['Controllers']?.count ?? 0) > 0;\n const hasServices = (components['Services']?.count ?? 0) > 0;\n const hasRepositories = (components['Repositories']?.count ?? 0) > 0;\n const hasDtos = (components['DTOs & Schemas']?.count ?? 0) > 0;\n const hasUi = (components['UI Components']?.count ?? 0) > 0;\n const hasModels = (components['Models & Entities']?.count ?? 0) > 0;\n const hasAnyLayer = hasControllers || hasServices || hasRepositories || hasDtos || hasUi || hasModels;\n\n if (hasAnyLayer) {\n let diagram = `flowchart TD\n %% Styling Definitions\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef routing fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n classDef controller fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef service fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#7E22CE;\n classDef data fill:#FEE2E2,stroke:#DC2626,stroke-width:2px,color:#B91C1C;\n classDef db fill:#F1F5F9,stroke:#475569,stroke-width:2px,color:#334155;\n\n subgraph EntryLayer [\"1. Client & API Gateway\"]\n Client[\"Frontend / API Client\"]:::client\n Router[\"Router & Endpoints<br/>(${fwDisplay})\"]:::routing\n end\n`;\n\n if (hasUi) {\n diagram += `\n subgraph UiLayer [\"Frontend Presentation\"]\n UiComponents[\"UI Components<br/>(src/components)\"]:::controller\n end\n`;\n }\n\n if (hasDtos) {\n diagram += `\n subgraph ValidationLayer [\"2. Validation & Schemas\"]\n DTOs[\"DTOs & Schemas<br/>(Input Validation)\"]:::routing\n end\n`;\n }\n\n if (hasControllers) {\n diagram += `\n subgraph ControllerLayer [\"3. Controllers\"]\n Controllers[\"Controllers<br/>(Request Handling)\"]:::controller\n end\n`;\n }\n\n if (hasServices) {\n diagram += `\n subgraph ServiceLayer [\"4. Application Services\"]\n Services[\"Domain Services<br/>(Business Logic)\"]:::service\n end\n`;\n }\n\n diagram += `\n subgraph PersistenceLayer [\"5. Data Layer & Storage\"]\n`;\n if (hasRepositories) {\n diagram += ` Repositories[\"Repositories / Data Access<br/>(${orm || 'Data Layer'})\"]:::data\\n`;\n } else if (hasModels) {\n diagram += ` Entities[\"Models & Entities<br/>(${orm || 'ORM'})\"]:::data\\n`;\n }\n diagram += ` Database[(\"Database / Storage\")]:::db\\n`;\n diagram += ` end\\n\\n`;\n\n // Dynamic Connections\n diagram += ` Client --> Router\\n`;\n if (hasUi) {\n diagram += ` Client --> UiComponents\\n`;\n diagram += ` UiComponents --> Router\\n`;\n }\n\n let previousNode = 'Router';\n if (hasDtos) {\n diagram += ` ${previousNode} --> DTOs\\n`;\n previousNode = 'DTOs';\n }\n\n if (hasControllers) {\n diagram += ` ${previousNode} --> Controllers\\n`;\n previousNode = 'Controllers';\n }\n\n if (hasServices) {\n diagram += ` ${previousNode} --> Services\\n`;\n previousNode = 'Services';\n }\n\n if (hasRepositories) {\n diagram += ` ${previousNode} --> Repositories\\n`;\n diagram += ` Repositories --> Database\\n`;\n } else if (hasModels) {\n diagram += ` ${previousNode} --> Entities\\n`;\n diagram += ` Entities --> Database\\n`;\n } else {\n diagram += ` ${previousNode} --> Database\\n`;\n }\n\n if (modules.length > 0) {\n diagram += renderModulesSubgraph(modules);\n }\n\n return diagram;\n }\n }\n\n // Generic / CLI projects\n const hasEntry = (components['Source Files']?.files || []).some((f) =>\n /(?:^|\\/)(?:index|cli|main|bin)\\.[a-z]+$/i.test(f)\n );\n const hasSource = (components['Source Files']?.count ?? 0) > 0;\n const hasTests = (components['Test Files']?.count ?? 0) > 0;\n\n let diagram = `flowchart TD\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef core fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef test fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n\n subgraph App [\"CLI & Application Architecture\"]\n`;\n if (hasEntry) {\n diagram += ` Entry[\"Entrypoint CLI (bin/)\"]:::client\\n`;\n }\n if (hasSource) {\n diagram += ` Source[\"Core Modules & Generators (src/)\"]:::core\\n`;\n }\n if (hasTests) {\n diagram += ` Tests[\"Automated Test Suites (tests/)\"]:::test\\n`;\n }\n if (!hasEntry && !hasSource && !hasTests) {\n diagram += ` Source[\"Source Files\"]:::core\\n`;\n }\n diagram += ` end\\n\\n`;\n\n if (hasEntry && hasSource) {\n diagram += ` Entry --> Source\\n`;\n }\n if (hasTests && hasSource) {\n diagram += ` Tests -.-> Source\\n`;\n }\n\n return diagram;\n}\n\n/**\n * Generate full ARCHITECTURE.md markdown content.\n */\nexport function generateArchitectureMarkdown(scanResult: ScanResult): string {\n const { projectInfo, totalFilesScanned, components, modules, directoryTree } = scanResult;\n\n const mermaid = generateMermaidDiagram(scanResult);\n\n // Component statistics rows\n const componentRows = Object.entries(components)\n .map(([, comp]) => {\n const sampleFiles = comp.files.slice(0, 3).map((f) => `\\`${f}\\``).join(', ');\n const moreSuffix = comp.files.length > 3 ? ` *(+${comp.files.length - 3} more)*` : '';\n return `| **${mdCell(comp.name)}** | \\`${comp.count}\\` | ${mdCell(comp.description)} | ${sampleFiles ? mdCell(sampleFiles + moreSuffix) : '-'} |`;\n })\n .join('\\n');\n\n // Modules section if present\n let modulesSection = '';\n if (modules.length > 0) {\n modulesSection = `\n## πŸ“¦ Detected Modules & Domains (${modules.length})\n\nThis project organizes features into modular domains:\n\n${modules.map((m) => `- **\\`${m}\\`**`).join('\\n')}\n`;\n }\n\n // Security notice generated from SAFE_IGNORE_LIST\n const sampleIgnores = SAFE_IGNORE_LIST.slice(0, 8).map((p) => `\\`${p}\\``).join(', ');\n const securityNotice = `## πŸ”’ Security & Privacy Notice\n\nThis architectural map was produced with strict privacy guarantees:\n- **Zero Network Transmission:** Executed locally without telemetry, tracking, or outbound communication.\n- **Safe Exclusion Filter:** Automatically ignores sensitive files and secret patterns (${sampleIgnores}, etc.) including \\`node_modules\\`, \\`vendor\\`, \\`.env*\\`, private keys, secrets, credentials, cloud configs, and cache folders.\n- **Manifest & Structure Only:** Safely reads standard manifest dependencies (\\`package.json\\` / \\`composer.json\\`) to determine framework types, and relative file paths to categorize components. Never reads private configurations or file contents.\n\n*Generated with ❀️ by LaraTS CLI.*`;\n\n return `# πŸ›οΈ Architecture Overview: ${projectInfo.name}\n\n> Auto-generated by **[LaraTS CLI](https://github.com/SidiqFatuh187/Larats)**. \n> **100% Local & Safe:** Generated entirely in offline mode via local filesystem manifest & structure analysis. Zero data transmitted.\n\n---\n\n## πŸ“Œ Project Summary\n\n| Attribute | Details |\n| :--- | :--- |\n| **Project Name** | \\`${projectInfo.name}\\` |\n| **Project Type** | **${projectInfo.type.toUpperCase()}** |\n| **Detected Stack** | \\`${projectInfo.summary}\\` |\n| **Scanned Files** | \\`${totalFilesScanned}\\` files indexed (safe ignore filter applied) |\n\n---\n\n## πŸ“Š Architectural Components Statistics\n\n| Component Layer | Count | Description | Sample Files |\n| :--- | :---: | :--- | :--- |\n${componentRows || '| *No architectural components identified* | `0` | - | - |'}\n${modulesSection}\n---\n\n## πŸ—ΊοΈ Visual Architecture Flowchart\n\nVisual representation of the project layers and request lifecycle rendered with [Mermaid.js](https://mermaid.js.org/):\n\n${fence(mermaid, 'mermaid')}\n\n---\n\n## 🌲 Directory Structure Tree\n\nClean, high-level directory tree showing key folders (ignoring build artifacts, vendor files, and sensitive keys):\n\n${fence(directoryTree || '(Empty directory structure)', 'text')}\n\n---\n\n${securityNotice}\n`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ProjectInfo } from '../detector.js';\nimport {\n getNaming,\n laravelModelTemplate,\n laravelControllerTemplate,\n laravelServiceTemplate,\n laravelActionTemplate,\n laravelRequestTemplate,\n laravelMigrationTemplate,\n} from '../templates/laravel.js';\nimport {\n tsControllerTemplate,\n tsServiceTemplate,\n tsRepositoryTemplate,\n tsRoutesTemplate,\n tsDtoTemplate,\n} from '../templates/typescript.js';\n\nexport interface ScaffoldOptions {\n moduleName: string;\n components: string[];\n isModular?: boolean;\n dryRun?: boolean;\n forceOverwrite?: boolean;\n}\n\nexport interface ScaffoldFileResult {\n filePath: string;\n relativeFilePath: string;\n status: 'created' | 'skipped' | 'error';\n reason?: string;\n}\n\nexport interface ScaffoldResult {\n moduleName: string;\n targetDir: string;\n files: ScaffoldFileResult[];\n createdCount: number;\n skippedCount: number;\n errorCount: number;\n dryRun?: boolean;\n}\n\nconst RESERVED_NAMES = new Set([\n 'model',\n 'controller',\n 'service',\n 'action',\n 'request',\n 'migration',\n 'repository',\n 'route',\n 'dto',\n 'object',\n 'class',\n 'interface',\n 'module',\n 'app',\n 'base',\n]);\n\n/**\n * Validate a user-provided module or feature name.\n * Returns an error string if invalid, or null if valid.\n */\nexport function validateModuleName(name: string): string | null {\n if (!name || !name.trim()) {\n return 'Module name cannot be empty.';\n }\n const trimmed = name.trim();\n if (!/^[a-zA-Z]/.test(trimmed)) {\n return 'Module name must start with an alphabetical letter.';\n }\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(trimmed)) {\n return 'Module name may only contain alphanumeric characters, hyphens, and underscores.';\n }\n if (RESERVED_NAMES.has(trimmed.toLowerCase())) {\n return `\"${trimmed}\" is a reserved framework name and cannot be used as a module name.`;\n }\n return null;\n}\n\n/**\n * Format timestamp for Laravel migration file name (e.g. 2026_10_24_114000)\n */\nfunction getMigrationTimestamp(): string {\n const now = new Date();\n const YYYY = now.getFullYear();\n const MM = String(now.getMonth() + 1).padStart(2, '0');\n const DD = String(now.getDate()).padStart(2, '0');\n const hh = String(now.getHours()).padStart(2, '0');\n const mm = String(now.getMinutes()).padStart(2, '0');\n const ss = String(now.getSeconds()).padStart(2, '0');\n return `${YYYY}_${MM}_${DD}_${hh}${mm}${ss}`;\n}\n\n/**\n * Scaffold components for Laravel or TypeScript projects safely without overwriting existing code.\n */\nexport async function scaffoldModule(\n projectInfo: ProjectInfo,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n const root = projectInfo.rootPath;\n const names = getNaming(options.moduleName);\n const filesToGenerate: {\n relativePath: string;\n content: string;\n isBarrel?: boolean;\n barrelExports?: string[];\n }[] = [];\n const results: ScaffoldFileResult[] = [];\n let createdCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n\n const isModular =\n options.isModular ??\n (projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true);\n\n if (projectInfo.type === 'laravel') {\n const selected = new Set(options.components);\n\n const addMigrationIfRequested = () => {\n const migrationsDir = path.join(root, 'database', 'migrations');\n let existingMigration: string | null = null;\n if (fs.existsSync(migrationsDir)) {\n const files = fs.readdirSync(migrationsDir);\n const match = files.find((f) => f.endsWith(`_create_${names.pluralSnake}_table.php`));\n if (match) {\n existingMigration = match;\n }\n }\n\n if (existingMigration && !options.forceOverwrite) {\n results.push({\n filePath: path.join(migrationsDir, existingMigration),\n relativeFilePath: `database/migrations/${existingMigration}`,\n status: 'skipped',\n reason: 'Migration for table already exists (overwrite protected)',\n });\n skippedCount++;\n } else {\n const timestamp = existingMigration ? existingMigration.split('_create_')[0] : getMigrationTimestamp();\n filesToGenerate.push({\n relativePath: `database/migrations/${timestamp}_create_${names.pluralSnake}_table.php`,\n content: laravelMigrationTemplate(names),\n });\n }\n };\n\n if (isModular) {\n const baseDir = `app/Modules/${names.pascal}`;\n const baseNamespace = `App\\\\Modules\\\\${names.pascal}`;\n\n if (selected.has('model')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Models/${names.pascal}.php`,\n content: laravelModelTemplate(names, `${baseNamespace}\\\\Models`, projectInfo.laravel?.version),\n });\n }\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Controllers/${names.pascal}Controller.php`,\n content: laravelControllerTemplate(names, {\n namespace: `${baseNamespace}\\\\Controllers`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n serviceNamespace: `${baseNamespace}\\\\Services`,\n requestNamespace: `${baseNamespace}\\\\Requests`,\n }),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Services/${names.pascal}Service.php`,\n content: laravelServiceTemplate(names, {\n namespace: `${baseNamespace}\\\\Services`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n }),\n });\n }\n if (selected.has('action')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Actions/Create${names.pascal}Action.php`,\n content: laravelActionTemplate(names, {\n namespace: `${baseNamespace}\\\\Actions`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n }),\n });\n }\n if (selected.has('request')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Requests/${names.pascal}Request.php`,\n content: laravelRequestTemplate(names, `${baseNamespace}\\\\Requests`),\n });\n }\n if (selected.has('migration')) {\n addMigrationIfRequested();\n }\n } else {\n // Standard Laravel Structure\n if (selected.has('model')) {\n filesToGenerate.push({\n relativePath: `app/Models/${names.pascal}.php`,\n content: laravelModelTemplate(names, 'App\\\\Models', projectInfo.laravel?.version),\n });\n }\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `app/Http/Controllers/${names.pascal}Controller.php`,\n content: laravelControllerTemplate(names),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `app/Services/${names.pascal}Service.php`,\n content: laravelServiceTemplate(names),\n });\n }\n if (selected.has('action')) {\n filesToGenerate.push({\n relativePath: `app/Actions/Create${names.pascal}Action.php`,\n content: laravelActionTemplate(names),\n });\n }\n if (selected.has('request')) {\n filesToGenerate.push({\n relativePath: `app/Http/Requests/${names.pascal}Request.php`,\n content: laravelRequestTemplate(names),\n });\n }\n if (selected.has('migration')) {\n addMigrationIfRequested();\n }\n }\n } else {\n // TypeScript (or fallback)\n const selected = new Set(options.components);\n const srcDir = projectInfo.typescript?.srcDir || 'src';\n\n if (isModular) {\n const moduleFolder = `${srcDir}/modules/${names.kebab}`;\n\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.controller.ts`,\n content: tsControllerTemplate(names, true),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.service.ts`,\n content: tsServiceTemplate(names, true),\n });\n }\n if (selected.has('repository')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.repository.ts`,\n content: tsRepositoryTemplate(names, true),\n });\n }\n if (selected.has('route')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.routes.ts`,\n content: tsRoutesTemplate(names, true),\n });\n }\n if (selected.has('dto')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.dto.ts`,\n content: tsDtoTemplate(names),\n });\n }\n\n // Add barrel index.ts export if multiple components generated in module\n if (filesToGenerate.length > 1) {\n const exports: string[] = [];\n if (selected.has('controller')) exports.push(`export * from './${names.kebab}.controller.js';`);\n if (selected.has('service')) exports.push(`export * from './${names.kebab}.service.js';`);\n if (selected.has('repository')) exports.push(`export * from './${names.kebab}.repository.js';`);\n if (selected.has('route')) exports.push(`export * from './${names.kebab}.routes.js';`);\n if (selected.has('dto')) exports.push(`export * from './${names.kebab}.dto.js';`);\n\n if (exports.length > 0) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/index.ts`,\n content: `${exports.join('\\n')}\\n`,\n isBarrel: true,\n barrelExports: exports,\n });\n }\n }\n } else {\n // Layered structure\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/controllers/${names.kebab}.controller.ts`,\n content: tsControllerTemplate(names, false),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/services/${names.kebab}.service.ts`,\n content: tsServiceTemplate(names, false),\n });\n }\n if (selected.has('repository')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/repositories/${names.kebab}.repository.ts`,\n content: tsRepositoryTemplate(names, false),\n });\n }\n if (selected.has('route')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/routes/${names.kebab}.routes.ts`,\n content: tsRoutesTemplate(names, false),\n });\n }\n if (selected.has('dto')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/dtos/${names.kebab}.dto.ts`,\n content: tsDtoTemplate(names),\n });\n }\n }\n }\n\n // Execute file writing with strict Anti-Overwrite Protection\n\n for (const item of filesToGenerate) {\n const fullPath = path.resolve(root, item.relativePath);\n\n // Defense in depth: path traversal check\n const rel = path.relative(root, fullPath);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: 'Path traversal attempt detected outside project root',\n });\n errorCount++;\n continue;\n }\n\n if (options.dryRun) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n reason: 'Dry run simulated',\n });\n createdCount++;\n continue;\n }\n\n // Handle TS barrel index.ts appending if file already exists\n if (item.isBarrel && item.barrelExports && fs.existsSync(fullPath)) {\n try {\n const existingContent = fs.readFileSync(fullPath, 'utf-8');\n const missingExports = item.barrelExports.filter(\n (line) => !existingContent.includes(line)\n );\n\n if (missingExports.length > 0) {\n const newContent = existingContent.endsWith('\\n')\n ? existingContent + missingExports.join('\\n') + '\\n'\n : existingContent + '\\n' + missingExports.join('\\n') + '\\n';\n fs.writeFileSync(fullPath, newContent, 'utf-8');\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n reason: 'Appended exports to existing barrel index',\n });\n createdCount++;\n } else {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'skipped',\n reason: 'File already exists and contains all module exports',\n });\n skippedCount++;\n }\n continue;\n } catch (err: any) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: err.message || String(err),\n });\n errorCount++;\n continue;\n }\n }\n\n try {\n // Ensure directory exists\n const parentDir = path.dirname(fullPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(fullPath, item.content, {\n flag: options.forceOverwrite ? 'w' : 'wx',\n encoding: 'utf-8',\n });\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n });\n createdCount++;\n } catch (err: any) {\n if (err.code === 'EEXIST') {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'skipped',\n reason: 'File already exists (overwrite protected)',\n });\n skippedCount++;\n } else {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: err.message || String(err),\n });\n errorCount++;\n }\n }\n }\n\n return {\n moduleName: names.pascal,\n targetDir: root,\n files: results,\n createdCount,\n skippedCount,\n errorCount,\n dryRun: Boolean(options.dryRun),\n };\n}\n\n","export interface NamingVariations {\n pascal: string; // e.g. PaymentOrder\n camel: string; // e.g. paymentOrder\n kebab: string; // e.g. payment-order\n snake: string; // e.g. payment_order\n pluralSnake: string;// e.g. payment_orders\n pluralPascal: string;// e.g. PaymentOrders\n}\n\nfunction pluralize(word: string): string {\n const lower = word.toLowerCase();\n // If already ends in s and not ss (e.g. payments, orders, users)\n if (lower.endsWith('s') && !lower.endsWith('ss')) {\n return word;\n }\n // consonant + y -> ies (e.g., category -> categories, company -> companies)\n if (/[bcdfghjklmnpqrstvwxyz]y$/i.test(word)) {\n return word.slice(0, -1) + (word.endsWith('Y') ? 'IES' : 'ies');\n }\n // s, x, z, ch, sh -> es (box -> boxes, church -> churches, dish -> dishes, pass -> passes)\n if (/(?:s|x|z|ch|sh)$/i.test(word)) {\n return word + (word === word.toUpperCase() ? 'ES' : 'es');\n }\n return word + (word === word.toUpperCase() ? 'S' : 's');\n}\n\nexport function getNaming(input: string): NamingVariations {\n // Clean string and split on camelCase/PascalCase boundaries and separators\n const words = input\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .filter(Boolean);\n\n if (words.length === 0) {\n words.push('sample', 'module');\n }\n\n const pascal = words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n\n const camel = pascal.charAt(0).toLowerCase() + pascal.slice(1);\n\n const snake = words.map((w) => w.toLowerCase()).join('_');\n\n const kebab = words.map((w) => w.toLowerCase()).join('-');\n\n // Pluralization\n const pluralWords = [...words];\n const lastIdx = pluralWords.length - 1;\n pluralWords[lastIdx] = pluralize(pluralWords[lastIdx]);\n\n const pluralSnake = pluralWords.map((w) => w.toLowerCase()).join('_');\n const pluralPascal = pluralWords\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n\n return { pascal, camel, kebab, snake, pluralSnake, pluralPascal };\n}\n\nexport function laravelModelTemplate(\n names: NamingVariations,\n namespace: string = 'App\\\\Models',\n laravelVersion?: string\n): string {\n const major = laravelVersion ? parseInt(laravelVersion.split('.')[0], 10) : 11;\n const isLaravel10OrOlder = major > 0 && major < 11;\n\n const castsBlock = isLaravel10OrOlder\n ? ` /**\n * The attributes that should be cast.\n *\n * @var array<string, string>\n */\n protected $casts = [\n 'metadata' => 'array',\n 'created_at' => 'datetime',\n 'updated_at' => 'datetime',\n ];`\n : ` /**\n * Get the attributes that should be cast.\n *\n * @return array<string, string>\n */\n protected function casts(): array\n {\n return [\n 'metadata' => 'array',\n 'created_at' => 'datetime',\n 'updated_at' => 'datetime',\n ];\n }`;\n\n return `<?php\n\nnamespace ${namespace};\n\nuse Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory;\nuse Illuminate\\\\Database\\\\Eloquent\\\\Model;\n\nclass ${names.pascal} extends Model\n{\n use HasFactory;\n\n /**\n * The table associated with the model.\n *\n * @var string\n */\n protected $table = '${names.pluralSnake}';\n\n /**\n * The attributes that are mass assignable.\n *\n * @var list<string>\n */\n protected $fillable = [\n 'name',\n 'status',\n 'metadata',\n ];\n\n${castsBlock}\n}\n`;\n}\n\nexport function laravelControllerTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n serviceNamespace?: string;\n requestNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Http\\\\Controllers';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n const serviceNamespace = options.serviceNamespace || 'App\\\\Services';\n const requestNamespace = options.requestNamespace || 'App\\\\Http\\\\Requests';\n\n const baseControllerImport =\n namespace !== 'App\\\\Http\\\\Controllers' ? 'use App\\\\Http\\\\Controllers\\\\Controller;\\n' : '';\n\n return `<?php\n\nnamespace ${namespace};\n\n${baseControllerImport}use ${modelNamespace}\\\\${names.pascal};\nuse ${serviceNamespace}\\\\${names.pascal}Service;\nuse ${requestNamespace}\\\\${names.pascal}Request;\nuse Illuminate\\\\Http\\\\JsonResponse;\nuse Illuminate\\\\Http\\\\Request;\n\nclass ${names.pascal}Controller extends Controller\n{\n public function __construct(\n protected ${names.pascal}Service $${names.camel}Service\n ) {}\n\n /**\n * Display a listing of ${names.pascal} resources.\n */\n public function index(Request $request): JsonResponse\n {\n $items = $this->${names.camel}Service->getAll($request->all());\n\n return response()->json([\n 'status' => 'success',\n 'data' => $items,\n ]);\n }\n\n /**\n * Display the specified ${names.pascal} resource.\n */\n public function show(int $id): JsonResponse\n {\n $item = $this->${names.camel}Service->getById($id);\n\n return response()->json([\n 'status' => 'success',\n 'data' => $item,\n ]);\n }\n\n /**\n * Store a newly created ${names.pascal} in storage.\n */\n public function store(${names.pascal}Request $request): JsonResponse\n {\n $item = $this->${names.camel}Service->create($request->validated());\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} created successfully.',\n 'data' => $item,\n ], 201);\n }\n\n /**\n * Update the specified ${names.pascal} in storage.\n */\n public function update(${names.pascal}Request $request, int $id): JsonResponse\n {\n $item = $this->${names.camel}Service->update($id, $request->validated());\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} updated successfully.',\n 'data' => $item,\n ]);\n }\n\n /**\n * Remove the specified ${names.pascal} from storage.\n */\n public function destroy(int $id): JsonResponse\n {\n $this->${names.camel}Service->delete($id);\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} deleted successfully.',\n ]);\n }\n}\n`;\n}\n\nexport function laravelServiceTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Services';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\nuse Illuminate\\\\Database\\\\Eloquent\\\\Collection;\n\nclass ${names.pascal}Service\n{\n /**\n * Retrieve all ${names.pluralPascal}.\n */\n public function getAll(array $filters = []): Collection\n {\n return ${names.pascal}::query()\n ->latest()\n ->get();\n }\n\n /**\n * Find ${names.pascal} by primary key.\n */\n public function getById(int $id): ${names.pascal}\n {\n return ${names.pascal}::findOrFail($id);\n }\n\n /**\n * Create a new ${names.pascal}.\n */\n public function create(array $data): ${names.pascal}\n {\n return ${names.pascal}::create($data);\n }\n\n /**\n * Update an existing ${names.pascal}.\n */\n public function update(int $id, array $data): ${names.pascal}\n {\n $item = $this->getById($id);\n $item->update($data);\n\n return $item;\n }\n\n /**\n * Delete a ${names.pascal}.\n */\n public function delete(int $id): bool\n {\n $item = $this->getById($id);\n\n return (bool) $item->delete();\n }\n}\n`;\n}\n\nexport function laravelActionTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Actions';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\n\nclass Create${names.pascal}Action\n{\n /**\n * Execute the ${names.pascal} creation workflow.\n */\n public function execute(array $data): ${names.pascal}\n {\n return ${names.pascal}::create($data);\n }\n}\n`;\n}\n\nexport function laravelRequestTemplate(names: NamingVariations, namespace: string = 'App\\\\Http\\\\Requests'): string {\n return `<?php\n\nnamespace ${namespace};\n\nuse Illuminate\\\\Foundation\\\\Http\\\\FormRequest;\n\nclass ${names.pascal}Request extends FormRequest\n{\n /**\n * Determine if the user is authorized to make this request.\n */\n public function authorize(): bool\n {\n return true;\n }\n\n /**\n * Get the validation rules that apply to the request.\n *\n * @return array<string, list<string>>\n */\n public function rules(): array\n {\n return [\n 'name' => ['required', 'string', 'max:255'],\n 'status' => ['nullable', 'string', 'in:draft,active,archived'],\n 'metadata' => ['nullable', 'array'],\n ];\n }\n\n /**\n * Get custom error messages for validation rules.\n *\n * @return array<string, string>\n */\n public function messages(): array\n {\n return [\n 'name.required' => 'The ${names.camel} name field is required.',\n ];\n }\n}\n`;\n}\n\nexport function laravelMigrationTemplate(names: NamingVariations): string {\n return `<?php\n\nuse Illuminate\\\\Database\\\\Migrations\\\\Migration;\nuse Illuminate\\\\Database\\\\Schema\\\\Blueprint;\nuse Illuminate\\\\Support\\\\Facades\\\\Schema;\n\nreturn new class extends Migration\n{\n /**\n * Run the migrations.\n */\n public function up(): void\n {\n Schema::create('${names.pluralSnake}', function (Blueprint $table) {\n $table->id();\n $table->string('name');\n $table->string('status')->default('draft');\n $table->json('metadata')->nullable();\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n public function down(): void\n {\n Schema::dropIfExists('${names.pluralSnake}');\n }\n};\n`;\n}\n","import type { NamingVariations } from './laravel.js';\n\nexport function tsControllerTemplate(names: NamingVariations, isModular: boolean = true): string {\n const serviceImport = isModular ? `./${names.kebab}.service.js` : `../services/${names.kebab}.service.js`;\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import type { Request, Response, NextFunction } from 'express';\nimport { ${names.pascal}Service } from '${serviceImport}';\nimport type { Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport class ${names.pascal}Controller {\n constructor(private readonly ${names.camel}Service: ${names.pascal}Service = new ${names.pascal}Service()) {}\n\n /**\n * GET /api/${names.kebab}\n */\n getAll = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const items = await this.${names.camel}Service.findAll(req.query);\n res.status(200).json({ status: 'success', data: items });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * GET /api/${names.kebab}/:id\n */\n getById = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const item = await this.${names.camel}Service.findById(id);\n if (!item) {\n res.status(404).json({ status: 'fail', message: '${names.pascal} not found' });\n return;\n }\n res.status(200).json({ status: 'success', data: item });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n\n /**\n * POST /api/${names.kebab}\n */\n create = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const payload: Create${names.pascal}Dto = req.body;\n const created = await this.${names.camel}Service.create(payload);\n res.status(201).json({ status: 'success', data: created });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * PUT /api/${names.kebab}/:id\n */\n update = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const payload: Update${names.pascal}Dto = req.body;\n const updated = await this.${names.camel}Service.update(id, payload);\n res.status(200).json({ status: 'success', data: updated });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n\n /**\n * DELETE /api/${names.kebab}/:id\n */\n delete = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const deleted = await this.${names.camel}Service.delete(id);\n if (!deleted) {\n res.status(404).json({ status: 'fail', message: '${names.pascal} not found' });\n return;\n }\n res.status(200).json({ status: 'success', message: '${names.pascal} deleted successfully' });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n}\n`;\n}\n\nexport function tsServiceTemplate(names: NamingVariations, isModular: boolean = true): string {\n const repoImport = isModular ? `./${names.kebab}.repository.js` : `../repositories/${names.kebab}.repository.js`;\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import { ${names.pascal}Repository } from '${repoImport}';\nimport type { ${names.pascal}Entity, Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport class ${names.pascal}Service {\n constructor(private readonly ${names.camel}Repository: ${names.pascal}Repository = new ${names.pascal}Repository()) {}\n\n async findAll(query: Record<string, any> = {}): Promise<${names.pascal}Entity[]> {\n return this.${names.camel}Repository.findAll(query);\n }\n\n async findById(id: string): Promise<${names.pascal}Entity | null> {\n return this.${names.camel}Repository.findById(id);\n }\n\n async create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity> {\n return this.${names.camel}Repository.create(data);\n }\n\n async update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity> {\n return this.${names.camel}Repository.update(id, data);\n }\n\n async delete(id: string): Promise<boolean> {\n return this.${names.camel}Repository.delete(id);\n }\n}\n`;\n}\n\nexport function tsRepositoryTemplate(names: NamingVariations, isModular: boolean = true): string {\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import { randomUUID } from 'node:crypto';\nimport { NotFoundError, type ${names.pascal}Entity, type Create${names.pascal}Dto, type Update${names.pascal}Dto } from '${dtoImport}';\n\nexport interface I${names.pascal}Repository {\n findAll(query?: Record<string, any>): Promise<${names.pascal}Entity[]>;\n findById(id: string): Promise<${names.pascal}Entity | null>;\n create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity>;\n update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity>;\n delete(id: string): Promise<boolean>;\n}\n\nexport class ${names.pascal}Repository implements I${names.pascal}Repository {\n // In-memory store fallback. Replace with Prisma / TypeORM / Drizzle client calls.\n private storage: Map<string, ${names.pascal}Entity> = new Map();\n\n async findAll(_query?: Record<string, any>): Promise<${names.pascal}Entity[]> {\n return Array.from(this.storage.values());\n }\n\n async findById(id: string): Promise<${names.pascal}Entity | null> {\n return this.storage.get(id) || null;\n }\n\n async create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity> {\n const id = randomUUID();\n const newRecord: ${names.pascal}Entity = {\n id,\n ...data,\n status: data.status || 'draft',\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.storage.set(id, newRecord);\n return newRecord;\n }\n\n async update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity> {\n const existing = await this.findById(id);\n if (!existing) {\n throw new NotFoundError(\\`${names.pascal} with id \\${id} not found\\`);\n }\n const updated: ${names.pascal}Entity = {\n ...existing,\n ...data,\n updatedAt: new Date(),\n };\n this.storage.set(id, updated);\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n return this.storage.delete(id);\n }\n}\n`;\n}\n\nexport function tsRoutesTemplate(names: NamingVariations, isModular: boolean = true): string {\n const controllerImport = isModular ? `./${names.kebab}.controller.js` : `../controllers/${names.kebab}.controller.js`;\n\n return `import { Router } from 'express';\nimport { ${names.pascal}Controller } from '${controllerImport}';\n\nconst router = Router();\nconst controller = new ${names.pascal}Controller();\n\n/**\n * Route declarations for ${names.pascal}\n */\nrouter.get('/', controller.getAll);\nrouter.get('/:id', controller.getById);\nrouter.post('/', controller.create);\nrouter.put('/:id', controller.update);\nrouter.delete('/:id', controller.delete);\n\nexport const ${names.camel}Routes = router;\nexport default router;\n`;\n}\n\nexport function tsDtoTemplate(names: NamingVariations): string {\n return `export class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NotFoundError';\n }\n}\n\nexport interface ${names.pascal}Entity {\n id: string;\n name: string;\n status: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Create${names.pascal}Dto {\n name: string;\n status?: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface Update${names.pascal}Dto {\n name?: string;\n status?: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n}\n`;\n}\n\n"],"mappings":"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","names":["fs","path","path","diagram","p","fs","path","path","fs","spinner","path","fs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/detector.ts","../src/scanner.ts","../src/generator/markdown.ts","../src/generator/ai-context.ts","../src/utils/clipboard.ts","../src/generator/scaffolder.ts","../src/templates/laravel.ts","../src/templates/typescript.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { exec } from 'node:child_process';\nimport { parseArgs } from 'node:util';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { detectProjectType, type ProjectInfo } from './detector.js';\nimport { scanProject } from './scanner.js';\nimport {\n generateArchitectureMarkdown,\n generateArchitectureHtml,\n renderTerminalFlow,\n} from './generator/markdown.js';\nimport { generateAiContext, mergeAiRules } from './generator/ai-context.js';\nimport { copyToClipboard } from './utils/clipboard.js';\nimport { scaffoldModule, validateModuleName, type ScaffoldResult } from './generator/scaffolder.js';\nimport { getNaming } from './templates/laravel.js';\n\ndeclare const __VERSION__: string | undefined;\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '1.1.1';\n\nfunction showHelp() {\n console.log(`\n${pc.bold(pc.cyan('LaraTS CLI'))} ${pc.gray(`v${VERSION}`)}\n${pc.gray('Smart Architecture Visualizer & Contextual Module Scaffolder')}\n\n${pc.bold('USAGE:')}\n ${pc.cyan('$')} npx larats [command] [options]\n ${pc.cyan('$')} larats [command] [options]\n\n${pc.bold('COMMANDS:')}\n ${pc.green('scan')} Scan repository & generate ARCHITECTURE.md\n ${pc.green('view')}, ${pc.green('preview')} Open interactive architecture diagram in local browser\n ${pc.green('ai')} Export architecture context prompt for AI (Cursor, Claude, Copilot)\n ${pc.green('scaffold')}, ${pc.green('make')} [name] Scaffold a new module or feature with clean boilerplate\n ${pc.green('info')} Show detected project type & architectural flavor\n ${pc.green('help')} Display this help message\n\n${pc.bold('OPTIONS:')}\n ${pc.yellow('-o, --output')} <file> Output path for scan (default: ARCHITECTURE.md)\n ${pc.yellow('--view')} Open local browser viewer immediately after scanning\n ${pc.yellow('--copy')} Copy AI architecture context prompt to clipboard\n ${pc.yellow('--cursor')} Inject architecture rules into .cursorrules\n ${pc.yellow('--claude')} Inject architecture rules into CLAUDE.md\n ${pc.yellow('-t, --tree')} Print directory tree in terminal\n ${pc.yellow('--html')} Also export standalone ARCHITECTURE.html\n ${pc.yellow('-m, --modular')} Enforce modular directory structure\n ${pc.yellow('-s, --standard')} Enforce standard/layered directory structure\n ${pc.yellow('--dry-run')} Simulate generation without writing files\n ${pc.yellow('-f, --force')} Overwrite files if they already exist\n ${pc.yellow('-v, --version')} Display CLI version\n ${pc.yellow('-h, --help')} Display this help message\n${pc.bold('EXAMPLES:')}\n ${pc.cyan('$')} larats\n ${pc.cyan('$')} larats scan\n ${pc.cyan('$')} larats scan --output docs/ARCHITECTURE.md\n ${pc.cyan('$')} larats scaffold Payment\n ${pc.cyan('$')} larats make Order --modular\n`);\n}\n\n/**\n * Handle cancellation gracefully\n */\nfunction handleCancel(): never {\n p.cancel(pc.yellow('Operation cancelled. See you next time! πŸ‘‹'));\n process.exit(0);\n}\n\nexport interface UserStats {\n runs?: number;\n hasPromptedStar?: boolean;\n}\n\n/**\n * Track usage and politely prompt user to star repo once on 3rd or 4th run\n */\nexport async function checkAndPromptStar(customStatsPath?: string, forceAnswer?: boolean): Promise<void> {\n try {\n const configDir = path.join(os.homedir(), '.larats');\n const statsFile = customStatsPath || path.join(configDir, 'stats.json');\n\n if (!fs.existsSync(path.dirname(statsFile))) {\n fs.mkdirSync(path.dirname(statsFile), { recursive: true });\n }\n\n let stats: UserStats = {};\n if (fs.existsSync(statsFile)) {\n stats = JSON.parse(fs.readFileSync(statsFile, 'utf-8'));\n }\n\n const runs = (stats.runs || 0) + 1;\n stats.runs = runs;\n\n if (runs >= 3 && !stats.hasPromptedStar) {\n stats.hasPromptedStar = true;\n const repoUrl = 'https://github.com/SidiqFatuh187/larats-cli';\n\n if (process.stdin.isTTY || typeof forceAnswer === 'boolean') {\n const shouldStar = typeof forceAnswer === 'boolean'\n ? forceAnswer\n : await p.confirm({\n message: '⭐ Enjoying LaraTS? Would you like to support the project with a star on GitHub?',\n initialValue: true,\n });\n\n if (shouldStar && !p.isCancel(shouldStar)) {\n openViewer(repoUrl);\n p.log.success(pc.green('Thank you so much for your support! ⭐ Opening GitHub repository in your browser...'));\n } else {\n p.log.message(pc.gray('No problem, enjoy building with LaraTS! πŸ‘'));\n }\n } else {\n console.log(\n `\\n${pc.yellow('⭐ Enjoying LaraTS?')} If you find this CLI useful, please consider giving it a star on GitHub:\\n` +\n ` ${pc.bold(pc.cyan('πŸ‘‰ ' + repoUrl))}\\n`\n );\n }\n }\n\n fs.writeFileSync(statsFile, JSON.stringify(stats, null, 2), 'utf-8');\n } catch {\n // Fail-safe: Never crash CLI on file permission errors\n }\n}\n\n/**\n * Open architecture HTML in the default browser without blocking the terminal\n */\nfunction openViewer(destination: string): void {\n const startCmd =\n process.platform === 'win32'\n ? `start \"\" \"${destination}\"`\n : process.platform === 'darwin'\n ? `open \"${destination}\"`\n : `xdg-open \"${destination}\"`;\n\n try {\n exec(startCmd, (err) => {\n if (err) {\n p.log.warn(`Could not open browser automatically. Please open ${pc.cyan(destination)} manually.`);\n }\n });\n } catch {\n p.log.warn(`Could not open browser automatically. Please open ${pc.cyan(destination)} manually.`);\n }\n}\n\n\n/**\n * Execute AI architecture rules export workflow\n */\nasync function runAi(\n projectInfo: ProjectInfo,\n options: { copy?: boolean; cursor?: boolean; claude?: boolean } = {}\n) {\n const spinner = p.spinner();\n spinner.start('Scanning codebase & formulating AI architecture context...');\n\n try {\n const scanResult = await scanProject(projectInfo);\n spinner.stop(pc.green(`Architecture context ready (${scanResult.scanDurationMs}ms)`));\n\n const aiContext = generateAiContext(scanResult);\n let handled = false;\n\n if (options.cursor) {\n const cursorPath = path.resolve(projectInfo.rootPath, '.cursorrules');\n const existing = fs.existsSync(cursorPath) ? fs.readFileSync(cursorPath, 'utf-8') : '';\n const updated = mergeAiRules(existing, aiContext);\n fs.writeFileSync(cursorPath, updated, 'utf-8');\n p.log.success(pc.green(`βœ” Architecture rules injected into ${pc.bold('.cursorrules')}`));\n handled = true;\n }\n\n if (options.claude) {\n const claudePath = path.resolve(projectInfo.rootPath, 'CLAUDE.md');\n const existing = fs.existsSync(claudePath) ? fs.readFileSync(claudePath, 'utf-8') : '';\n const updated = mergeAiRules(existing, aiContext);\n fs.writeFileSync(claudePath, updated, 'utf-8');\n p.log.success(pc.green(`βœ” Architecture rules injected into ${pc.bold('CLAUDE.md')}`));\n handled = true;\n }\n\n if (options.copy) {\n const copied = await copyToClipboard(aiContext);\n if (copied) {\n p.log.success(pc.green('βœ” Architecture context copied to clipboard! Ready to paste into ChatGPT or Claude.'));\n } else {\n p.log.warn('Could not access system clipboard. Printing prompt to console instead.');\n console.log(`\\n${aiContext}\\n`);\n }\n handled = true;\n }\n\n if (!handled) {\n console.log(`\\n${pc.bold(pc.cyan('--- AI Codebase Architecture Prompt ---'))}\\n${aiContext}\\n${pc.bold(pc.cyan('---------------------------------------'))}\\n`);\n p.note(\n `Tip: Run with ${pc.yellow('--copy')} to copy directly to clipboard,\\n` +\n `or ${pc.yellow('--cursor')} / ${pc.yellow('--claude')} to inject into rules files automatically!`,\n pc.green('Prompt Ready for AI πŸ€–')\n );\n }\n\n p.outro(pc.cyan('Done!'));\n } catch (err: unknown) {\n spinner.stop(pc.red('Failed to generate AI context'));\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n/**\n * Execute scan workflow\n */\nasync function runScan(\n projectInfo: ProjectInfo,\n outputPath: string = 'ARCHITECTURE.md',\n options: { force?: boolean; dryRun?: boolean; view?: boolean; tree?: boolean; html?: boolean } = {}\n) {\n const spinner = p.spinner();\n spinner.start('Scanning codebase structure & components (strict ignore list active)...');\n\n try {\n const destination = path.resolve(projectInfo.rootPath, outputPath);\n\n // Defense: Ensure output path is inside project root\n const rel = path.relative(projectInfo.rootPath, destination);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n spinner.stop(pc.red('Scan failed'));\n p.log.error(`Refusing to write output: \"${outputPath}\" resolves outside project root directory.`);\n process.exitCode = 1;\n return;\n }\n\n // Defense: Refuse to overwrite files that are not generated by LaraTS unless --force\n if (fs.existsSync(destination) && !options.force) {\n const existingContent = fs.readFileSync(destination, 'utf-8');\n const isLaraTsFile =\n existingContent.includes('Auto-generated by **[LaraTS CLI]') ||\n existingContent.includes('Auto-generated by **[ArchMind CLI]') ||\n existingContent.includes('LaraTS CLI') ||\n existingContent.includes('<!-- larats-generated -->');\n\n if (!isLaraTsFile) {\n spinner.stop(pc.red('Scan refused'));\n p.log.error(\n `Destination file \"${outputPath}\" already exists and does not appear to be generated by LaraTS.\\n` +\n `To protect user files from accidental overwrites, use --force to overwrite.`\n );\n process.exitCode = 1;\n return;\n }\n }\n\n const scanResult = await scanProject(projectInfo);\n const nonZeroLayers = Object.values(scanResult.components).filter((c) => c.count > 0).length;\n const totalComponents = Object.values(scanResult.components).reduce((sum, c) => sum + c.count, 0);\n\n const terminalFlow = renderTerminalFlow(scanResult);\n\n if (options.dryRun) {\n spinner.stop(pc.green(`Scan completed in ${scanResult.scanDurationMs}ms (dry run)`));\n p.note(\n `${pc.bold('Architecture Flow:')}\\n ${pc.cyan(terminalFlow)}\\n\\n` +\n `${pc.bold('Scanned Files:')} ${scanResult.totalFilesScanned}\\n` +\n `${pc.bold('Total Components:')} ${totalComponents} across ${nonZeroLayers} active architectural layers\\n` +\n `${pc.bold('Modules Detected:')} ${scanResult.modules.length > 0 ? scanResult.modules.join(', ') : 'None (monolithic structure)'}\\n` +\n `${pc.bold('Simulated Output:')} Would write ARCHITECTURE.md to ${pc.cyan(outputPath)} (dry run: no files written)`,\n pc.green('Architecture Map (Dry Run) πŸ—ΊοΈ')\n );\n if (options.tree) {\n console.log(`\\n${pc.bold('Directory Tree:')}\\n${scanResult.directoryTree}\\n`);\n }\n p.outro(pc.cyan('Dry run completed: no files written.'));\n return;\n }\n\n spinner.stop(pc.green(`Scan completed in ${scanResult.scanDurationMs}ms`));\n\n const markdown = generateArchitectureMarkdown(scanResult);\n\n // Ensure output directory exists if custom path\n const parentDir = path.dirname(destination);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(destination, markdown, 'utf-8');\n\n const shouldWriteHtml = options.html || options.view;\n if (shouldWriteHtml) {\n const htmlDestination = destination.replace(/\\.md$/i, '') + '.html';\n fs.writeFileSync(htmlDestination, generateArchitectureHtml(scanResult), 'utf-8');\n p.log.success(`HTML architecture saved to ${pc.cyan(path.relative(projectInfo.rootPath, htmlDestination) || htmlDestination)}`);\n if (options.view) {\n openViewer(htmlDestination);\n p.log.info(pc.green('🌐 Opened interactive architecture diagram in your browser!'));\n }\n }\n\n if (options.tree) {\n console.log(`\\n${pc.bold('Directory Tree:')}\\n${scanResult.directoryTree}\\n`);\n }\n\n // Display summary\n p.note(\n `${pc.bold('Architecture Flow:')}\\n ${pc.cyan(terminalFlow)}\\n\\n` +\n `${pc.bold('Scanned Files:')} ${scanResult.totalFilesScanned}\\n` +\n `${pc.bold('Total Components:')} ${totalComponents} across ${nonZeroLayers} active architectural layers\\n` +\n `${pc.bold('Modules Detected:')} ${scanResult.modules.length > 0 ? scanResult.modules.join(', ') : 'None (monolithic structure)'}\\n` +\n `${pc.bold('Documentation:')} Saved to ${pc.cyan(path.relative(projectInfo.rootPath, destination) || outputPath)}\\n\\n` +\n `${pc.bold('πŸ’‘ How to view diagram:')}\\n` +\n ` β€’ On GitHub: Push ${outputPath} (Mermaid renders automatically)\\n` +\n ` β€’ In VS Code: Press ${pc.yellow('Ctrl+Shift+V')} for Markdown Preview\\n` +\n ` β€’ In Browser: Run ${pc.cyan('npx larats view')} for instant local web preview`,\n pc.green('Architecture Map Generated! πŸ—ΊοΈ')\n );\n\n p.outro(pc.cyan(`Done! Open ${outputPath} or run \"npx larats view\" to inspect architecture!`));\n } catch (err: any) {\n spinner.stop(pc.red('Scan failed'));\n p.log.error(err.message || String(err));\n process.exitCode = 1;\n }\n}\n\n/**\n * Execute scaffold workflow\n */\nasync function runScaffold(\n projectInfo: ProjectInfo,\n moduleNameArg?: string,\n cliOptions: { modular?: boolean; standard?: boolean; force?: boolean; dryRun?: boolean } = {}\n) {\n // Warn if project type unknown or non-standard framework\n if (projectInfo.type === 'unknown') {\n p.log.warn(pc.yellow('Warning: Project type is unknown (neither Laravel nor TypeScript detected). Scaffolding standard TypeScript/Express components.'));\n } else if (\n projectInfo.type === 'typescript' &&\n projectInfo.typescript?.framework &&\n !['express', 'node-vanilla', 'unknown'].includes(projectInfo.typescript.framework)\n ) {\n p.log.warn(\n pc.yellow(`Warning: Project detected as \"${projectInfo.typescript.framework}\". LaraTS generates standard Express-compatible TypeScript boilerplate.`)\n );\n }\n\n let moduleName = moduleNameArg;\n\n if (moduleName) {\n const errorMsg = validateModuleName(moduleName);\n if (errorMsg) {\n p.log.error(pc.red(`Invalid module name: ${errorMsg}`));\n process.exitCode = 1;\n return;\n }\n } else {\n // Non-TTY check: cannot prompt\n if (!process.stdin.isTTY) {\n p.log.error(pc.red('Error: Module name is required in non-interactive (non-TTY) mode. Example: `larats scaffold Payment`'));\n process.exitCode = 1;\n return;\n }\n\n const input = await p.text({\n message: 'What is the name of the new module or feature?',\n placeholder: 'e.g. Payment, Order, UserProfile',\n validate(val) {\n return validateModuleName(val) || undefined;\n },\n });\n\n if (p.isCancel(input)) handleCancel();\n moduleName = input.trim();\n }\n\n // Component selection based on project type\n let selectedComponents: string[] = [];\n\n if (projectInfo.type === 'laravel') {\n if (!process.stdin.isTTY) {\n selectedComponents = ['model', 'controller', 'service', 'request', 'migration'];\n } else {\n const componentsPrompt = await p.multiselect({\n message: `Select components to scaffold for ${pc.cyan(moduleName)}:`,\n options: [\n { value: 'model', label: 'Eloquent Model', hint: 'Includes table name, fillables, and casts' },\n { value: 'controller', label: 'Resourceful Controller', hint: 'Includes standard CRUD methods & DI service' },\n { value: 'service', label: 'Service Class', hint: 'Encapsulated business logic operations' },\n { value: 'action', label: 'Single Action Class', hint: 'Invokable single-responsibility class' },\n { value: 'request', label: 'Form Request', hint: 'Request validation rules & authorization' },\n { value: 'migration', label: 'Database Migration', hint: 'Schema definition with timestamps' },\n ],\n initialValues: ['model', 'controller', 'service', 'request', 'migration'],\n required: true,\n });\n\n if (p.isCancel(componentsPrompt)) handleCancel();\n selectedComponents = componentsPrompt as string[];\n }\n\n // Component dependencies: controller depends on service\n if (selectedComponents.includes('controller') && !selectedComponents.includes('service')) {\n p.log.warn(pc.yellow('Notice: Controller requires Service class. Auto-adding \"service\" to scaffolded components.'));\n selectedComponents.push('service');\n }\n } else {\n // TypeScript or fallback\n if (!process.stdin.isTTY) {\n selectedComponents = ['controller', 'service', 'repository', 'route', 'dto'];\n } else {\n const componentsPrompt = await p.multiselect({\n message: `Select components to scaffold for ${pc.cyan(moduleName)}:`,\n options: [\n { value: 'controller', label: 'Controller', hint: 'Express request handlers & response orchestration' },\n { value: 'service', label: 'Service', hint: 'Application logic & repository coordination' },\n { value: 'repository', label: 'Repository', hint: 'Data persistence abstraction & queries' },\n { value: 'route', label: 'Router & Routes', hint: 'Express router mapping endpoints to controller' },\n { value: 'dto', label: 'DTOs & Interfaces', hint: 'Typed interfaces for entities and payloads' },\n ],\n initialValues: ['controller', 'service', 'repository', 'route', 'dto'],\n required: true,\n });\n\n if (p.isCancel(componentsPrompt)) handleCancel();\n selectedComponents = componentsPrompt as string[];\n }\n\n // Dependencies: route -> controller -> service -> repository\n if (selectedComponents.includes('route') && !selectedComponents.includes('controller')) {\n p.log.warn(pc.yellow('Notice: Route requires Controller. Auto-adding \"controller\" to scaffolded components.'));\n selectedComponents.push('controller');\n }\n if (selectedComponents.includes('controller') && !selectedComponents.includes('service')) {\n p.log.warn(pc.yellow('Notice: Controller requires Service. Auto-adding \"service\" to scaffolded components.'));\n selectedComponents.push('service');\n }\n if (selectedComponents.includes('service') && !selectedComponents.includes('repository')) {\n p.log.warn(pc.yellow('Notice: Service requires Repository. Auto-adding \"repository\" to scaffolded components.'));\n selectedComponents.push('repository');\n }\n }\n\n // Determine modular vs standard structure\n let isModular = true;\n if (cliOptions.modular) {\n isModular = true;\n } else if (cliOptions.standard) {\n isModular = false;\n } else if (!process.stdin.isTTY) {\n isModular = projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true;\n } else {\n const defaultModular = projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true;\n\n const structurePrompt = await p.select({\n message: 'Choose folder architecture structure:',\n options: projectInfo.type === 'laravel'\n ? [\n {\n value: 'modular',\n label: 'Modular Domain Structure',\n hint: `app/Modules/${moduleName}/[Models, Controllers, Services]`,\n },\n {\n value: 'standard',\n label: 'Standard Laravel Structure',\n hint: `app/Models, app/Http/Controllers, app/Services`,\n },\n ]\n : [\n {\n value: 'modular',\n label: 'Modular Feature Structure',\n hint: `src/modules/${moduleName.toLowerCase()}/...`,\n },\n {\n value: 'standard',\n label: 'Layered Folder Structure',\n hint: `src/controllers, src/services, src/routes...`,\n },\n ],\n initialValue: defaultModular ? 'modular' : 'standard',\n });\n\n if (p.isCancel(structurePrompt)) handleCancel();\n isModular = structurePrompt === 'modular';\n }\n\n const spinner = p.spinner();\n spinner.start(`Generating boilerplate files for ${pc.cyan(moduleName)}...`);\n\n const result: ScaffoldResult = await scaffoldModule(projectInfo, {\n moduleName,\n components: selectedComponents,\n isModular,\n dryRun: cliOptions.dryRun,\n forceOverwrite: cliOptions.force,\n });\n\n spinner.stop('Generation finished!');\n\n if (result.errorCount > 0) {\n process.exitCode = 1;\n }\n\n // Report files status\n const fileLines = result.files.map((f) => {\n if (f.status === 'created') {\n if (cliOptions.dryRun) {\n return ` ${pc.blue('β„Ή')} ${f.relativeFilePath} ${pc.gray('(would create)')}`;\n }\n return ` ${pc.green('βœ”')} ${f.relativeFilePath} ${pc.gray('(created)')}`;\n } else if (f.status === 'skipped') {\n return ` ${pc.yellow('⚠')} ${f.relativeFilePath} ${pc.yellow(`(skipped - ${f.reason})`)}`;\n } else {\n return ` ${pc.red('βœ–')} ${f.relativeFilePath} ${pc.red(`(error - ${f.reason})`)}`;\n }\n });\n\n if (cliOptions.dryRun) {\n p.note(\n fileLines.join('\\n') +\n `\\n\\n${pc.bold('Dry run summary:')} ${pc.cyan(`${result.createdCount} would be created`)}, ${pc.yellow(`${result.skippedCount} skipped`)}, ${pc.red(`${result.errorCount} errors`)}`,\n pc.cyan(`Dry run: Scaffolding ${moduleName}`)\n );\n p.outro(pc.cyan('Dry run: no files written.'));\n return;\n }\n\n p.note(\n fileLines.join('\\n') +\n `\\n\\n${pc.bold('Summary:')} ${pc.green(`${result.createdCount} created`)}, ${pc.yellow(`${result.skippedCount} skipped`)}, ${pc.red(`${result.errorCount} errors`)}`,\n pc.cyan(`Module Scaffolding: ${moduleName}`)\n );\n\n if (result.skippedCount > 0 && !cliOptions.force) {\n p.log.warn(pc.yellow('Anti-Overwrite Protection prevented modifying existing files. Use --force to overwrite if intended.'));\n }\n\n // Next steps guidance\n const names = getNaming(moduleName);\n if (result.createdCount > 0) {\n if (projectInfo.type === 'laravel') {\n p.note(\n `1. Run database migration:\\n ${pc.cyan('php artisan migrate')}\\n` +\n `2. Register routes in routes/api.php or routes/web.php:\\n ${pc.cyan(`Route::apiResource('${names.kebab}', \\\\${isModular ? `App\\\\Modules\\\\${names.pascal}\\\\Controllers\\\\` : 'App\\\\Http\\\\Controllers\\\\'}${names.pascal}Controller::class);`)}`,\n 'πŸš€ Next Steps'\n );\n } else {\n p.note(\n `1. Mount routes into Express app:\\n ${pc.cyan(`import { ${names.camel}Routes } from './${isModular ? `modules/${names.kebab}` : `routes/${names.kebab}.routes.js`}';\\n app.use('/api/${names.kebab}', ${names.camel}Routes);`)}`,\n 'πŸš€ Next Steps'\n );\n }\n }\n\n p.outro(pc.green(`✨ Successfully scaffolded ${moduleName} module!`));\n}\n\n/**\n * Display quick project info\n */\nfunction showProjectInfo(projectInfo: ProjectInfo) {\n let details = `${pc.bold('Project Name:')} ${projectInfo.name}\\n` +\n `${pc.bold('Project Type:')} ${projectInfo.type.toUpperCase()}\\n` +\n `${pc.bold('Flavor / Stack:')} ${projectInfo.summary}\\n` +\n `${pc.bold('Working Path:')} ${projectInfo.rootPath}`;\n\n if (projectInfo.type === 'laravel' && projectInfo.laravel) {\n details += `\\n${pc.bold('Filament Admin:')} ${projectInfo.laravel.hasFilament ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Livewire:')} ${projectInfo.laravel.hasLivewire ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Inertia.js:')} ${projectInfo.laravel.hasInertia ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Modular App:')} ${projectInfo.laravel.isModular ? pc.green('Yes') : 'No'}`;\n } else if (projectInfo.type === 'typescript' && projectInfo.typescript) {\n details += `\\n${pc.bold('Framework:')} ${projectInfo.typescript.framework}` +\n `\\n${pc.bold('Prisma ORM:')} ${projectInfo.typescript.hasPrisma ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Monorepo:')} ${projectInfo.typescript.isMonorepo ? pc.green('Yes') : 'No'}` +\n `\\n${pc.bold('Modular Src:')} ${projectInfo.typescript.isModular ? pc.green('Yes') : 'No'}`;\n }\n\n p.note(details, pc.cyan('Detected Project Architecture'));\n}\n\n/**\n * CLI Main Entrypoint\n */\nasync function main() {\n let parsed;\n try {\n parsed = parseArgs({\n args: process.argv.slice(2),\n options: {\n output: { type: 'string', short: 'o' },\n modular: { type: 'boolean', short: 'm' },\n standard: { type: 'boolean', short: 's' },\n force: { type: 'boolean', short: 'f' },\n 'dry-run': { type: 'boolean' },\n view: { type: 'boolean' },\n tree: { type: 'boolean', short: 't' },\n html: { type: 'boolean' },\n version: { type: 'boolean', short: 'v' },\n copy: { type: 'boolean' },\n cursor: { type: 'boolean' },\n claude: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n },\n allowPositionals: true,\n strict: true,\n });\n } catch (err: unknown) {\n console.error(pc.red(`Error: ${err instanceof Error ? err.message : String(err)}`));\n showHelp();\n process.exitCode = 1;\n return;\n }\n\n // Flags check\n if (parsed.values.help || parsed.positionals[0] === 'help') {\n showHelp();\n return;\n }\n\n if (parsed.values.version || parsed.positionals[0] === 'version') {\n console.log(`larats v${VERSION}`);\n return;\n }\n\n const command = parsed.positionals[0];\n const VALID_COMMANDS: Record<string, true> = {\n scan: true,\n view: true,\n preview: true,\n scaffold: true,\n make: true,\n info: true,\n ai: true,\n help: true,\n };\n if (command && !VALID_COMMANDS[command]) {\n console.error(pc.red(`Error: Unknown command \"${command}\".`));\n showHelp();\n process.exitCode = 1;\n return;\n }\n\n const outputPath = parsed.values.output || 'ARCHITECTURE.md';\n const isModularFlag = parsed.values.modular;\n const isStandardFlag = parsed.values.standard;\n const isForceFlag = parsed.values.force;\n const isDryRunFlag = parsed.values['dry-run'];\n const isViewFlag = parsed.values.view;\n const isTreeFlag = parsed.values.tree;\n const isHtmlFlag = parsed.values.html;\n\n // Auto-detect project type in current working directory\n const projectInfo = await detectProjectType(process.cwd());\n\n // Non-interactive command routing\n if (command === 'scan') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Scanning Architecture`);\n p.log.info(`Detected: ${pc.green(projectInfo.summary)}`);\n await runScan(projectInfo, outputPath, {\n force: isForceFlag,\n dryRun: isDryRunFlag,\n view: isViewFlag,\n tree: isTreeFlag,\n html: isHtmlFlag,\n });\n await checkAndPromptStar();\n return;\n }\n\n if (command === 'view' || command === 'preview') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Architecture Viewer`);\n p.log.info(`Target: ${pc.green(projectInfo.summary)}`);\n const spinner = p.spinner();\n spinner.start('Scanning repository & generating architecture map...');\n const scanResult = await scanProject(projectInfo);\n spinner.stop(pc.green(`Scanned ${scanResult.totalFilesScanned} files in ${scanResult.scanDurationMs}ms`));\n\n const htmlDestination = path.resolve(projectInfo.rootPath, 'ARCHITECTURE.html');\n fs.writeFileSync(htmlDestination, generateArchitectureHtml(scanResult), 'utf-8');\n openViewer(htmlDestination);\n\n p.note(\n `${pc.bold('File:')} ${pc.cyan('ARCHITECTURE.html')}\\n` +\n `Interactive Mermaid.js flowchart & component breakdown loaded in your browser.\\n` +\n `Double-click ${pc.cyan('ARCHITECTURE.html')} anytime to view offline!`,\n pc.green('Opened in Browser! 🌐')\n );\n p.outro(pc.cyan('Done!'));\n await checkAndPromptStar();\n return;\n }\n\n if (command === 'ai') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - AI Architecture Context`);\n p.log.info(`Target: ${pc.green(projectInfo.summary)}`);\n await runAi(projectInfo, {\n copy: parsed.values.copy as boolean | undefined,\n cursor: parsed.values.cursor as boolean | undefined,\n claude: parsed.values.claude as boolean | undefined,\n });\n await checkAndPromptStar();\n return;\n }\n\n if (command === 'scaffold' || command === 'make') {\n const moduleName = parsed.positionals[1];\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)} - Module Scaffolder`);\n p.log.info(`Target Project: ${pc.green(projectInfo.summary)}`);\n await runScaffold(projectInfo, moduleName, {\n modular: isModularFlag,\n standard: isStandardFlag,\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n await checkAndPromptStar();\n return;\n }\n\n if (command === 'info') {\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.gray(`v${VERSION}`)}`);\n showProjectInfo(projectInfo);\n p.outro(pc.cyan('Done.'));\n await checkAndPromptStar();\n return;\n }\n\n // No command supplied: check for non-TTY\n if (!process.stdin.isTTY) {\n showHelp();\n return;\n }\n\n // Interactive Menu Mode\n p.intro(`${pc.bgCyan(pc.black(' LaraTS '))} ${pc.bold('Smart Architecture Visualizer & Scaffolder')} ${pc.gray(`v${VERSION}`)}`);\n\n p.log.info(`Working Directory: ${pc.gray(process.cwd())}`);\n p.log.info(`Detected Architecture: ${pc.bold(pc.green(projectInfo.summary))}`);\n\n const action = await p.select({\n message: 'What would you like to do?',\n options: [\n {\n value: 'scan',\n label: 'πŸ” Scan Architecture & Generate ARCHITECTURE.md',\n hint: 'Creates component stats, directory tree & Mermaid flowchart',\n },\n {\n value: 'ai',\n label: 'πŸ€– Export Architecture Context for AI (Cursor, Claude, Copilot)',\n hint: 'Generate architecture rules for AI coding agents',\n },\n {\n value: 'view',\n label: '🌐 Open Interactive Architecture Viewer in Browser',\n hint: 'Spawns local browser tab with Mermaid flowchart & stats',\n },\n {\n value: 'scaffold',\n label: 'πŸ—οΈ Scaffold New Feature / Module',\n hint: 'Interactively generate boilerplate components with safety checks',\n },\n {\n value: 'info',\n label: 'πŸ“Š Inspect Detected Architecture Details',\n hint: 'View detected frameworks, ORMs, and configurations',\n },\n {\n value: 'exit',\n label: 'πŸšͺ Exit',\n },\n ],\n });\n\n if (p.isCancel(action) || action === 'exit') {\n handleCancel();\n }\n\n if (action === 'scan') {\n await runScan(projectInfo, outputPath, {\n force: isForceFlag,\n dryRun: isDryRunFlag,\n view: isViewFlag,\n tree: isTreeFlag,\n html: isHtmlFlag,\n });\n } else if (action === 'ai') {\n const aiTarget = await p.select({\n message: 'How would you like to export the AI architecture context?',\n options: [\n { value: 'copy', label: 'πŸ“‹ Copy directly to Clipboard', hint: 'Ready to paste into ChatGPT or Claude web' },\n { value: 'cursor', label: 'πŸ–±οΈ Save into .cursorrules', hint: 'Inject rules for Cursor AI' },\n { value: 'claude', label: '🧠 Save into CLAUDE.md', hint: 'Inject rules for Claude Code' },\n { value: 'print', label: 'πŸ–₯️ Display prompt in terminal', hint: 'View formatted markdown text' },\n ],\n });\n\n if (p.isCancel(aiTarget)) {\n handleCancel();\n }\n\n await runAi(projectInfo, {\n copy: aiTarget === 'copy',\n cursor: aiTarget === 'cursor',\n claude: aiTarget === 'claude',\n });\n } else if (action === 'view') {\n const spinner = p.spinner();\n spinner.start('Scanning repository & generating architecture map...');\n const scanResult = await scanProject(projectInfo);\n spinner.stop(pc.green(`Scanned in ${scanResult.scanDurationMs}ms`));\n const htmlDestination = path.resolve(projectInfo.rootPath, 'ARCHITECTURE.html');\n fs.writeFileSync(htmlDestination, generateArchitectureHtml(scanResult), 'utf-8');\n openViewer(htmlDestination);\n p.outro(pc.green('🌐 Opened interactive architecture diagram in your browser!'));\n } else if (action === 'scaffold') {\n await runScaffold(projectInfo, undefined, {\n modular: isModularFlag,\n standard: isStandardFlag,\n force: isForceFlag,\n dryRun: isDryRunFlag,\n });\n } else if (action === 'info') {\n showProjectInfo(projectInfo);\n p.outro(pc.cyan('Done!'));\n }\n await checkAndPromptStar();\n}\n\nmain().catch((err) => {\n p.log.error(pc.red(`Fatal error: ${err.message || String(err)}`));\n process.exit(1);\n});\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type ProjectType = 'laravel' | 'typescript' | 'unknown';\n\nexport interface LaravelDetails {\n version?: string;\n hasFilament: boolean;\n hasLivewire: boolean;\n hasInertia: boolean;\n hasSanctum: boolean;\n isModular: boolean;\n modulesDir?: string;\n}\n\nexport interface TypeScriptDetails {\n framework: 'express' | 'nest' | 'fastify' | 'hono' | 'react' | 'next' | 'vue' | 'node-vanilla' | 'unknown';\n hasPrisma: boolean;\n hasTypeORM: boolean;\n hasDrizzle: boolean;\n isMonorepo: boolean;\n isModular: boolean;\n srcDir: string;\n isTypeScript?: boolean;\n}\n\nexport interface ProjectInfo {\n type: ProjectType;\n name: string;\n rootPath: string;\n laravel?: LaravelDetails;\n typescript?: TypeScriptDetails;\n summary: string;\n}\n\n/**\n * Safely parse a JSON file without throwing errors.\n */\nfunction readJsonSafe<T = unknown>(filePath: string): T | null {\n try {\n if (!fs.existsSync(filePath)) return null;\n const content = fs.readFileSync(filePath, 'utf-8').replace(/^\\uFEFF/, '');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect the project type and architectural characteristics of the target directory.\n */\nexport async function detectProjectType(targetDir: string = process.cwd()): Promise<ProjectInfo> {\n const resolvedDir = path.resolve(targetDir);\n const dirName = path.basename(resolvedDir);\n\n const hasArtisan = fs.existsSync(path.join(resolvedDir, 'artisan'));\n const composerPath = path.join(resolvedDir, 'composer.json');\n const hasComposer = fs.existsSync(composerPath);\n\n const tsconfigPath = path.join(resolvedDir, 'tsconfig.json');\n const hasTsConfig = fs.existsSync(tsconfigPath);\n const packageJsonPath = path.join(resolvedDir, 'package.json');\n const hasPackageJson = fs.existsSync(packageJsonPath);\n\n // 1. Check for Laravel Project\n if (hasArtisan && hasComposer) {\n const composerData = readJsonSafe<{\n name?: string;\n require?: Record<string, string>;\n 'require-dev'?: Record<string, string>;\n }>(composerPath);\n\n const allDeps = {\n ...(composerData?.require || {}),\n ...(composerData?.['require-dev'] || {}),\n };\n\n const hasFilament = Object.keys(allDeps).some((dep) => dep.startsWith('filament/'));\n const hasLivewire = 'livewire/livewire' in allDeps;\n const hasInertia = 'inertiajs/inertia-laravel' in allDeps;\n const hasSanctum = 'laravel/sanctum' in allDeps;\n\n const rawVersion = allDeps['laravel/framework'] || '';\n const versionMatch = rawVersion.match(/\\d+(?:\\.\\d+)*/);\n const cleanVersion = versionMatch ? versionMatch[0] : '';\n\n // Check for modular architecture\n const appModulesDir = path.join(resolvedDir, 'app', 'Modules');\n const rootModulesDir = path.join(resolvedDir, 'modules');\n const rootModulesCapDir = path.join(resolvedDir, 'Modules');\n const isModular =\n fs.existsSync(appModulesDir) ||\n fs.existsSync(rootModulesDir) ||\n fs.existsSync(rootModulesCapDir);\n const modulesDir = fs.existsSync(appModulesDir)\n ? 'app/Modules'\n : fs.existsSync(rootModulesDir)\n ? 'modules'\n : fs.existsSync(rootModulesCapDir)\n ? 'Modules'\n : undefined;\n\n const extras: string[] = [];\n if (hasFilament) extras.push('Filament');\n if (hasLivewire) extras.push('Livewire');\n if (hasInertia) extras.push('Inertia');\n if (isModular) extras.push('Modular Architecture');\n\n const summary = `Laravel ${cleanVersion || ''}${extras.length > 0 ? ` (${extras.join(', ')})` : ''}`.trim();\n\n return {\n type: 'laravel',\n name: composerData?.name?.split('/')[1] || dirName,\n rootPath: resolvedDir,\n laravel: {\n version: cleanVersion || undefined,\n hasFilament,\n hasLivewire,\n hasInertia,\n hasSanctum,\n isModular,\n modulesDir,\n },\n summary,\n };\n }\n\n // 2. Check for TypeScript or JavaScript (Node.js) Project\n if (hasPackageJson) {\n const pkg = readJsonSafe<{\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: unknown;\n }>(packageJsonPath);\n\n const allDeps = {\n ...(pkg?.dependencies || {}),\n ...(pkg?.devDependencies || {}),\n };\n\n let framework: TypeScriptDetails['framework'] = 'unknown';\n if ('@nestjs/core' in allDeps) framework = 'nest';\n else if ('next' in allDeps) framework = 'next';\n else if ('express' in allDeps) framework = 'express';\n else if ('fastify' in allDeps) framework = 'fastify';\n else if ('hono' in allDeps) framework = 'hono';\n else if ('react' in allDeps) framework = 'react';\n else if ('vue' in allDeps) framework = 'vue';\n else framework = 'node-vanilla';\n\n const hasPrisma = 'prisma' in allDeps || '@prisma/client' in allDeps || fs.existsSync(path.join(resolvedDir, 'prisma'));\n const hasTypeORM = 'typeorm' in allDeps;\n const hasDrizzle = 'drizzle-orm' in allDeps;\n\n const isMonorepo =\n Boolean(pkg?.workspaces) ||\n fs.existsSync(path.join(resolvedDir, 'pnpm-workspace.yaml')) ||\n fs.existsSync(path.join(resolvedDir, 'turbo.json')) ||\n fs.existsSync(path.join(resolvedDir, 'lerna.json'));\n\n const hasSrc = fs.existsSync(path.join(resolvedDir, 'src'));\n const srcDir = hasSrc ? 'src' : '.';\n const isModular =\n fs.existsSync(path.join(resolvedDir, srcDir, 'modules')) ||\n fs.existsSync(path.join(resolvedDir, 'modules'));\n\n const isTypeScript = hasTsConfig || 'typescript' in allDeps;\n const stackLabel = isTypeScript ? 'TypeScript' : 'JavaScript / Node.js';\n\n const extras: string[] = [framework !== 'node-vanilla' ? framework : stackLabel];\n if (hasPrisma) extras.push('Prisma');\n if (hasTypeORM) extras.push('TypeORM');\n if (hasDrizzle) extras.push('Drizzle');\n if (isMonorepo) extras.push('Monorepo');\n if (isModular) extras.push('Modular');\n\n const summary = isTypeScript\n ? `TypeScript (${extras.join(', ')})`\n : `JavaScript / Node.js (${extras.join(', ')})`;\n\n return {\n type: 'typescript',\n name: pkg?.name || dirName,\n rootPath: resolvedDir,\n typescript: {\n framework,\n hasPrisma,\n hasTypeORM,\n hasDrizzle,\n isMonorepo,\n isModular,\n srcDir,\n isTypeScript,\n },\n summary,\n };\n }\n\n // 3. Fallback / Unknown Project\n let fallbackName = dirName;\n if (hasPackageJson) {\n const pkg = readJsonSafe<{ name?: string }>(packageJsonPath);\n if (pkg?.name) fallbackName = pkg.name;\n }\n\n return {\n type: 'unknown',\n name: fallbackName,\n rootPath: resolvedDir,\n summary: 'Generic / Unknown Project',\n };\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport fg from 'fast-glob';\nimport type { ProjectInfo } from './detector.js';\n\nexport const SAFE_IGNORE_LIST = [\n // Dependencies & package management\n '**/node_modules/**',\n '**/vendor/**',\n '**/.pnpm/**',\n '**/.yarn/**',\n // Version control\n '**/.git/**',\n '**/.svn/**',\n '**/.hg/**',\n // Storage, cache & build outputs (scoped to root to preserve src/build/)\n '**/storage/**',\n '**/dist/**',\n 'build/**',\n 'out/**',\n '**/.next/**',\n '**/.nuxt/**',\n '**/.turbo/**',\n '**/.cache/**',\n '**/coverage/**',\n '**/.temp/**',\n 'tmp/**',\n // IDEs & OS files\n '**/.idea/**',\n '**/.vscode/**',\n '**/.DS_Store',\n '**/Thumbs.db',\n // Secrets, private keys & cloud credentials\n '**/.env*',\n '**/*.pem',\n '**/*.key',\n '**/*.pfx',\n '**/*.p12',\n '**/*.jks',\n '**/*.keystore',\n '**/*.cert',\n '**/*.crt',\n '**/*.secret',\n '**/secrets/**',\n '**/.aws/**',\n '**/.ssh/**',\n '**/credentials*.json',\n '**/*service-account*.json',\n '**/id_rsa*',\n '**/id_ed25519*',\n '**/id_ecdsa*',\n '**/*.pub',\n // Logs & Lock files\n '**/*.log',\n '**/*.lock',\n '**/package-lock.json',\n '**/yarn.lock',\n '**/pnpm-lock.yaml',\n '**/composer.lock',\n];\n\nexport interface ComponentGroup {\n name: string;\n count: number;\n files: string[];\n description: string;\n}\n\nexport interface ScanResult {\n projectInfo: ProjectInfo;\n totalFilesScanned: number;\n components: Record<string, ComponentGroup>;\n modules: string[];\n directoryTree: string;\n scanDurationMs: number;\n}\n\nexport function localeIndependentCompare(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * Build a clean ASCII directory tree representation from a list of relative file paths.\n */\nexport function buildCleanDirectoryTree(files: string[], maxDepth: number = 3): string {\n interface TreeNode {\n name: string;\n isDir: boolean;\n children: Map<string, TreeNode>;\n }\n\n const root: TreeNode = { name: '', isDir: true, children: new Map() };\n\n // Populate tree\n for (const file of files) {\n const parts = file.split(/[/\\\\]/);\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i === parts.length - 1;\n\n if (!current.children.has(part)) {\n current.children.set(part, {\n name: part,\n isDir: !isLast,\n children: new Map(),\n });\n }\n current = current.children.get(part)!;\n }\n }\n\n const lines: string[] = [];\n\n function renderNode(node: TreeNode, prefix: string, currentDepth: number) {\n if (currentDepth > maxDepth) return;\n\n const entries = Array.from(node.children.values()).sort((a, b) => {\n // Directories first, then files\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return localeIndependentCompare(a.name, b.name);\n });\n\n // If at maxDepth and has children, show summary\n if (currentDepth === maxDepth && entries.length > 0) {\n lines.push(`${prefix}└── ... (${entries.length} items hidden)`);\n return;\n }\n\n // Limit files shown per directory if too many\n const maxEntriesPerDir = 8;\n const displayedEntries = entries.slice(0, maxEntriesPerDir);\n const hiddenCount = entries.length - displayedEntries.length;\n\n displayedEntries.forEach((child, index) => {\n const isLast = index === displayedEntries.length - 1 && hiddenCount === 0;\n const pointer = isLast ? '└── ' : 'β”œβ”€β”€ ';\n const displayName = child.isDir ? `${child.name}/` : child.name;\n\n lines.push(`${prefix}${pointer}${displayName}`);\n\n if (child.isDir) {\n const nextPrefix = prefix + (isLast ? ' ' : 'β”‚ ');\n renderNode(child, nextPrefix, currentDepth + 1);\n }\n });\n\n if (hiddenCount > 0) {\n lines.push(`${prefix}└── ... (${hiddenCount} more files/folders)`);\n }\n }\n\n // Render children of root\n const topLevel = Array.from(root.children.values()).sort((a, b) => {\n if (a.isDir !== b.isDir) return a.isDir ? -1 : 1;\n return localeIndependentCompare(a.name, b.name);\n });\n\n topLevel.forEach((child, index) => {\n const isLast = index === topLevel.length - 1;\n const pointer = isLast ? '└── ' : 'β”œβ”€β”€ ';\n const displayName = child.isDir ? `${child.name}/` : child.name;\n\n lines.push(`${pointer}${displayName}`);\n if (child.isDir) {\n const nextPrefix = isLast ? ' ' : 'β”‚ ';\n renderNode(child, nextPrefix, 1);\n }\n });\n\n return lines.join('\\n');\n}\n\n/**\n * Scan project safely using fast-glob and categorize architectural components.\n */\nexport async function scanProject(projectInfo: ProjectInfo): Promise<ScanResult> {\n const startTime = Date.now();\n const root = projectInfo.rootPath;\n\n // Avoid scanning system root drive or home directory directly\n const resolvedRoot = path.resolve(root);\n const parsedRoot = path.parse(resolvedRoot);\n if (parsedRoot.root === resolvedRoot || (typeof os.homedir === 'function' && resolvedRoot === os.homedir())) {\n throw new Error(`Refusing to scan system drive or home directory root directly: \"${resolvedRoot}\".`);\n }\n\n // Scan all relevant files in repo while respecting SAFE_IGNORE_LIST\n const allFiles = await fg('**/*', {\n cwd: root,\n ignore: SAFE_IGNORE_LIST,\n dot: false,\n onlyFiles: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n });\n\n const MAX_FILES_CAP = 10000;\n let normalizedFiles = allFiles.map((f) => f.replace(/\\\\/g, '/'));\n if (normalizedFiles.length > MAX_FILES_CAP) {\n console.warn(`[WARN] Large codebase detected (${normalizedFiles.length} files). Capping scan analysis to first ${MAX_FILES_CAP} files.`);\n normalizedFiles = normalizedFiles.slice(0, MAX_FILES_CAP);\n }\n const components: Record<string, ComponentGroup> = {};\n const modulesSet = new Set<string>();\n\n if (projectInfo.type === 'laravel') {\n // 1. Models - match Models/ anywhere under app or modules dirs, exclude non-model files\n const models = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Models\\/.*\\.php$/i.test(f)\n );\n components['Models'] = {\n name: 'Eloquent Models',\n count: models.length,\n files: models,\n description: 'Database entity mappings and business logic models',\n };\n\n // 2. Controllers\n const controllers = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Controllers\\/.*\\.php$/i.test(f)\n );\n components['Controllers'] = {\n name: 'HTTP Controllers',\n count: controllers.length,\n files: controllers,\n description: 'Request handling and response orchestration',\n };\n\n // 3. Services\n const services = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Services\\/.*\\.php$/i.test(f)\n );\n components['Services'] = {\n name: 'Service Classes',\n count: services.length,\n files: services,\n description: 'Encapsulated business logic and external integrations',\n };\n\n // 4. Actions\n const actions = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Actions\\/.*\\.php$/i.test(f)\n );\n components['Actions'] = {\n name: 'Action Classes',\n count: actions.length,\n files: actions,\n description: 'Single-responsibility invokable operations',\n };\n\n // 5. Form Requests\n const requests = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?(?:Http\\/)?Requests\\/.*\\.php$/i.test(f)\n );\n components['Form Requests'] = {\n name: 'Form Requests',\n count: requests.length,\n files: requests,\n description: 'Input validation and authorization rules',\n };\n\n // 6. Filament Resources\n const filament = normalizedFiles.filter((f) =>\n /^(?:app|modules|Modules)\\/(?:.*\\/)?Filament\\/.*\\.php$/i.test(f)\n );\n if (filament.length > 0 || projectInfo.laravel?.hasFilament) {\n components['Filament Resources'] = {\n name: 'Filament Admin Resources',\n count: filament.length,\n files: filament,\n description: 'Admin panel CRUD pages, widgets, and schemas',\n };\n }\n\n // 7. Routes\n const routes = normalizedFiles.filter((f) =>\n /^(?:routes\\/.*\\.php|(?:app\\/Modules|modules|Modules)\\/.*\\/routes?.*\\.php)$/i.test(f)\n );\n components['Routes'] = {\n name: 'Routing Definitions',\n count: routes.length,\n files: routes,\n description: 'Web, API, and console endpoint routes',\n };\n\n // 8. Database Migrations\n const migrations = normalizedFiles.filter((f) =>\n /(?:^database\\/migrations\\/.*\\.php$|\\/migrations\\/.*\\.php$)/i.test(f)\n );\n components['Migrations'] = {\n name: 'Database Migrations',\n count: migrations.length,\n files: migrations,\n description: 'Schema version control and table definitions',\n };\n\n // Detect Laravel Modules - must require a trailing slash after module name so loose files are excluded\n const modDirPattern = projectInfo.laravel?.modulesDir\n ? `(?:${projectInfo.laravel.modulesDir}|app/Modules|modules|Modules)`\n : '(?:app/Modules|modules|Modules)';\n const modRegex = new RegExp(`^${modDirPattern}/([^/]+)/`, 'i');\n\n for (const f of normalizedFiles) {\n const match = f.match(modRegex);\n if (match && match[1]) {\n modulesSet.add(match[1]);\n }\n }\n } else if (projectInfo.type === 'typescript') {\n const srcDir = projectInfo.typescript?.srcDir ?? 'src';\n // Support custom srcDir as well as monorepo packages (apps/*/src, packages/*/src)\n const tsPrefix = `(?:${srcDir}|(?:apps|packages)/[^/]+/(?:${srcDir}|src))`;\n\n // 1. Controllers (files in controllers/ or matching .controller.(ts|js))\n const controllers = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:controllers/.*\\\\.(?:ts|js|mts|cts)|.*[./]controller\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Controllers'] = {\n name: 'Controllers',\n count: controllers.length,\n files: controllers,\n description: 'HTTP request handlers and response dispatchers',\n };\n\n // 2. Services (files in services/ or matching .service.(ts|js))\n const services = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:services/.*\\\\.(?:ts|js|mts|cts)|.*[./]service\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Services'] = {\n name: 'Services',\n count: services.length,\n files: services,\n description: 'Core domain logic and application workflows',\n };\n\n // 3. Repositories (files in repositories/ or matching .repository.(ts|js))\n const repositories = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:repositories/.*\\\\.(?:ts|js|mts|cts)|.*[./]repository\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Repositories'] = {\n name: 'Repositories',\n count: repositories.length,\n files: repositories,\n description: 'Data access abstraction and database queries',\n };\n\n // 4. Routes (files in routes/ or matching .routes.(ts|js))\n const routes = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:routes/.*\\\\.(?:ts|js|mts|cts)|.*[./]routes?\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['Routes'] = {\n name: 'Routes',\n count: routes.length,\n files: routes,\n description: 'API endpoint mappings and router handlers',\n };\n\n // 5. DTOs & Validation Schemas\n const dtos = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n new RegExp(`^${tsPrefix}/(?:.*/)?(?:(?:dtos|schemas)/.*\\\\.(?:ts|js|mts|cts)|.*[./](?:dto|schema)\\\\.(?:ts|js|mts|cts))$`, 'i').test(f)\n );\n components['DTOs & Schemas'] = {\n name: 'DTOs & Schemas',\n count: dtos.length,\n files: dtos,\n description: 'Data transfer objects and request validation schemas',\n };\n\n // 6. Models / Prisma / Entities\n const models = normalizedFiles.filter((f) =>\n !f.endsWith('.d.ts') &&\n (new RegExp(`^${tsPrefix}/(?:.*/)?(?:(?:models|entities)/.*\\\\.(?:ts|js|mts|cts)|.*[./](?:model|entity)\\\\.(?:ts|js|mts|cts))$`, 'i').test(f) ||\n /(?:^|\\/)prisma\\/schema\\.prisma$/i.test(f))\n );\n components['Models & Entities'] = {\n name: 'Models & Entities',\n count: models.length,\n files: models,\n description: 'Database schema definitions and entity declarations',\n };\n\n // 7. Frontend Components (if React/Vue/Next/Vite)\n const componentsFiles = normalizedFiles.filter((f) =>\n new RegExp(`^${tsPrefix}/(?:components|ui)/.*\\\\.(?:tsx|jsx|vue|svelte|ts|js)$`, 'i').test(f)\n );\n if (componentsFiles.length > 0) {\n components['UI Components'] = {\n name: 'UI Components',\n count: componentsFiles.length,\n files: componentsFiles,\n description: 'Reusable user interface views and components',\n };\n }\n\n // Detect TypeScript Modules (requiring trailing slash after module name)\n const moduleRegex = new RegExp(`^(?:${tsPrefix}/modules|modules)/([^/]+)/`, 'i');\n for (const mf of normalizedFiles) {\n const match = mf.match(moduleRegex);\n if (match && match[1]) {\n modulesSet.add(match[1]);\n }\n }\n\n // If no classic web layers are found (e.g. CLI tool, utility library), populate Source and Test files\n const totalWebLayers = Object.values(components).reduce((acc, c) => acc + c.count, 0);\n if (totalWebLayers === 0) {\n const srcFiles = normalizedFiles.filter((f) =>\n new RegExp(`^${tsPrefix}/`, 'i').test(f)\n );\n const testFiles = normalizedFiles.filter((f) =>\n /(?:^|[._-])(?:test|spec)\\.[a-z]+$|(?:^|\\/)__tests__\\//i.test(f)\n );\n\n components['Source Files'] = {\n name: 'Source Files',\n count: srcFiles.length,\n files: srcFiles,\n description: 'Main application source code',\n };\n\n components['Test Files'] = {\n name: 'Test Files',\n count: testFiles.length,\n files: testFiles,\n description: 'Automated test suites and specifications',\n };\n }\n } else {\n // Generic project component classification\n const srcFiles = normalizedFiles.filter((f) => /^src\\//i.test(f));\n const testFiles = normalizedFiles.filter((f) =>\n /(?:^|[._-])(?:test|spec)\\.[a-z]+$|(?:^|\\/)__tests__\\//i.test(f)\n );\n\n components['Source Files'] = {\n name: 'Source Files',\n count: srcFiles.length,\n files: srcFiles,\n description: 'Main application source code',\n };\n\n components['Test Files'] = {\n name: 'Test Files',\n count: testFiles.length,\n files: testFiles,\n description: 'Automated test suites and specifications',\n };\n }\n\n // Generate clean directory tree\n const directoryTree = buildCleanDirectoryTree(normalizedFiles, 3);\n const scanDurationMs = Date.now() - startTime;\n\n return {\n projectInfo,\n totalFilesScanned: normalizedFiles.length,\n components,\n modules: Array.from(modulesSet).sort(localeIndependentCompare),\n directoryTree,\n scanDurationMs,\n };\n}\n","import type { ScanResult } from '../scanner.js';\nimport { SAFE_IGNORE_LIST } from '../scanner.js';\n\n/**\n * Escape pipe and newline characters in Markdown table cells.\n */\nexport function mdCell(str: string): string {\n if (!str) return '-';\n const cleaned = str.replace(/\\|/g, '\\\\|').replace(/[\\r\\n]+/g, ' ').trim();\n return cleaned || '-';\n}\n\n/**\n * Format markdown code fence handling nested backticks safely.\n */\nexport function fence(body: string, lang: string = ''): string {\n const matches = body.match(/`+/g);\n let maxBackticks = 2;\n if (matches) {\n for (const match of matches) {\n if (match.length > maxBackticks) maxBackticks = match.length;\n }\n }\n const f = '`'.repeat(maxBackticks + 1);\n return `${f}${lang ? lang : ''}\\n${body}\\n${f}`;\n}\n\n/**\n * Escape text for safe rendering in Mermaid diagram node labels and sanitize characters.\n */\nexport function mermaidLabel(str: string, maxLen: number = 40): string {\n if (!str) return '';\n let cleaned = str\n .replace(/\"/g, \"'\")\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/`/g, \"'\")\n .replace(/[\\[\\]\\(\\)\\{\\}]/g, '')\n .replace(/[\\r\\n]+/g, ' ')\n .trim();\n if (cleaned.length > maxLen) {\n cleaned = cleaned.slice(0, maxLen - 3) + '...';\n }\n return cleaned;\n}\n\n/**\n * Render feature modules subgraph for Mermaid diagrams.\n */\nfunction renderModulesSubgraph(modules: string[]): string {\n if (modules.length === 0) return '';\n let output = `\\n subgraph ModulesLayer [\"πŸ“¦ Detected Modules (${modules.length})\"]\\n`;\n modules.slice(0, 6).forEach((mod, idx) => {\n output += ` Mod_${idx}[\"${mermaidLabel(mod)} Module\"]:::service\\n`;\n });\n if (modules.length > 6) {\n output += ` Mod_More[\"...and ${modules.length - 6} more modules\"]:::service\\n`;\n }\n output += ` end\\n`;\n return output;\n}\n\n/**\n * Generate a dynamic Mermaid.js diagram representing only the components and layers\n * that actually exist in the scanned codebase.\n */\nexport function generateMermaidDiagram(scanResult: ScanResult): string {\n const { projectInfo, components, modules } = scanResult;\n\n if (projectInfo.type === 'laravel') {\n const hasFilament = projectInfo.laravel?.hasFilament || (components['Filament Resources']?.count ?? 0) > 0;\n const hasActions = (components['Actions']?.count ?? 0) > 0;\n const hasServices = (components['Services']?.count ?? 0) > 0;\n const hasRequests = (components['Form Requests']?.count ?? 0) > 0;\n const hasModels = (components['Models']?.count ?? 0) > 0;\n const hasMigrations = (components['Migrations']?.count ?? 0) > 0;\n\n let diagram = `flowchart TD\n %% Styling Definitions\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef routing fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n classDef controller fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef service fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#7E22CE;\n classDef data fill:#FEE2E2,stroke:#DC2626,stroke-width:2px,color:#B91C1C;\n classDef db fill:#F1F5F9,stroke:#475569,stroke-width:2px,color:#334155;\n\n subgraph EntryLayer [\"1. Client & Entrypoints\"]\n Client[\"Client / Browser / API Consumer\"]:::client\n Routes[\"HTTP Routes\"]:::routing\n end\n`;\n\n if (hasRequests) {\n diagram += `\n subgraph RequestLayer [\"2. Request Pipeline & Validation\"]\n Middleware[\"Middleware Pipeline<br/>(Auth, CSRF, Rate Limiting)\"]:::routing\n FormRequests[\"Form Requests<br/>(Validation & Authorization)\"]:::routing\n end\n`;\n }\n\n diagram += `\n subgraph HttpLayer [\"3. Controllers & Presentation\"]\n Controllers[\"HTTP Controllers\"]:::controller\n`;\n if (hasFilament) {\n diagram += ` Filament[\"Filament Admin Resources\"]:::controller\\n`;\n }\n diagram += ` end\\n`;\n\n if (hasServices || hasActions) {\n diagram += `\n subgraph DomainLayer [\"4. Domain & Business Logic\"]\n`;\n if (hasServices) {\n diagram += ` Services[\"Service Classes\"]:::service\\n`;\n }\n if (hasActions) {\n diagram += ` Actions[\"Action Classes\"]:::service\\n`;\n }\n diagram += ` end\\n`;\n }\n\n diagram += `\n subgraph DataLayer [\"5. Data Persistence & Storage\"]\n`;\n if (hasModels) {\n diagram += ` Models[\"Eloquent Models\"]:::data\\n`;\n }\n diagram += ` Database[(\"Database<br/>(MySQL / Postgres / SQLite)\")]:::db\\n`;\n if (hasMigrations) {\n diagram += ` Migrations[\"Database Migrations\"]:::data\\n`;\n }\n diagram += ` end\\n\\n`;\n\n // Connect nodes dynamically\n diagram += ` Client --> Routes\\n`;\n\n if (hasRequests) {\n diagram += ` Routes --> Middleware\\n`;\n diagram += ` Middleware --> FormRequests\\n`;\n diagram += ` FormRequests --> Controllers\\n`;\n } else {\n diagram += ` Routes --> Controllers\\n`;\n }\n\n if (hasServices && hasActions) {\n diagram += ` Controllers --> Services\\n`;\n diagram += ` Controllers --> Actions\\n`;\n if (hasModels) {\n diagram += ` Services --> Models\\n`;\n diagram += ` Actions --> Models\\n`;\n } else {\n diagram += ` Services --> Database\\n`;\n diagram += ` Actions --> Database\\n`;\n }\n } else if (hasServices) {\n diagram += ` Controllers --> Services\\n`;\n if (hasModels) {\n diagram += ` Services --> Models\\n`;\n } else {\n diagram += ` Services --> Database\\n`;\n }\n } else if (hasActions) {\n diagram += ` Controllers --> Actions\\n`;\n if (hasModels) {\n diagram += ` Actions --> Models\\n`;\n } else {\n diagram += ` Actions --> Database\\n`;\n }\n } else {\n if (hasModels) {\n diagram += ` Controllers --> Models\\n`;\n } else {\n diagram += ` Controllers --> Database\\n`;\n }\n }\n\n if (hasFilament) {\n if (hasModels) {\n diagram += ` Client --> Filament\\n Filament --> Models\\n`;\n } else {\n diagram += ` Client --> Filament\\n Filament --> Database\\n`;\n }\n }\n\n if (hasModels) {\n diagram += ` Models --> Database\\n`;\n }\n if (hasMigrations) {\n diagram += ` Migrations -.-> Database\\n`;\n }\n\n if (modules.length > 0) {\n diagram += renderModulesSubgraph(modules);\n }\n\n return diagram;\n }\n\n if (projectInfo.type === 'typescript') {\n const rawFw = projectInfo.typescript?.framework || 'express';\n const fwDisplay =\n rawFw !== 'unknown' && rawFw !== 'node-vanilla'\n ? `${rawFw.charAt(0).toUpperCase() + rawFw.slice(1)} Router`\n : 'API Endpoints & Handlers';\n\n const orm = projectInfo.typescript?.hasPrisma ? 'Prisma' : projectInfo.typescript?.hasTypeORM ? 'TypeORM' : projectInfo.typescript?.hasDrizzle ? 'Drizzle' : null;\n\n const hasControllers = (components['Controllers']?.count ?? 0) > 0;\n const hasServices = (components['Services']?.count ?? 0) > 0;\n const hasRepositories = (components['Repositories']?.count ?? 0) > 0;\n const hasDtos = (components['DTOs & Schemas']?.count ?? 0) > 0;\n const hasUi = (components['UI Components']?.count ?? 0) > 0;\n const hasModels = (components['Models & Entities']?.count ?? 0) > 0;\n const hasAnyLayer = hasControllers || hasServices || hasRepositories || hasDtos || hasUi || hasModels;\n\n if (hasAnyLayer) {\n let diagram = `flowchart TD\n %% Styling Definitions\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef routing fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n classDef controller fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef service fill:#F3E8FF,stroke:#9333EA,stroke-width:2px,color:#7E22CE;\n classDef data fill:#FEE2E2,stroke:#DC2626,stroke-width:2px,color:#B91C1C;\n classDef db fill:#F1F5F9,stroke:#475569,stroke-width:2px,color:#334155;\n\n subgraph EntryLayer [\"1. Client & API Gateway\"]\n Client[\"Frontend / API Client\"]:::client\n Router[\"Router & Endpoints<br/>(${fwDisplay})\"]:::routing\n end\n`;\n\n if (hasUi) {\n diagram += `\n subgraph UiLayer [\"Frontend Presentation\"]\n UiComponents[\"UI Components<br/>(src/components)\"]:::controller\n end\n`;\n }\n\n if (hasDtos) {\n diagram += `\n subgraph ValidationLayer [\"2. Validation & Schemas\"]\n DTOs[\"DTOs & Schemas<br/>(Input Validation)\"]:::routing\n end\n`;\n }\n\n if (hasControllers) {\n diagram += `\n subgraph ControllerLayer [\"3. Controllers\"]\n Controllers[\"Controllers<br/>(Request Handling)\"]:::controller\n end\n`;\n }\n\n if (hasServices) {\n diagram += `\n subgraph ServiceLayer [\"4. Application Services\"]\n Services[\"Domain Services<br/>(Business Logic)\"]:::service\n end\n`;\n }\n\n diagram += `\n subgraph PersistenceLayer [\"5. Data Layer & Storage\"]\n`;\n if (hasRepositories) {\n diagram += ` Repositories[\"Repositories / Data Access<br/>(${orm || 'Data Layer'})\"]:::data\\n`;\n } else if (hasModels) {\n diagram += ` Entities[\"Models & Entities<br/>(${orm || 'ORM'})\"]:::data\\n`;\n }\n diagram += ` Database[(\"Database / Storage\")]:::db\\n`;\n diagram += ` end\\n\\n`;\n\n // Dynamic Connections\n diagram += ` Client --> Router\\n`;\n if (hasUi) {\n diagram += ` Client --> UiComponents\\n`;\n diagram += ` UiComponents --> Router\\n`;\n }\n\n let previousNode = 'Router';\n if (hasDtos) {\n diagram += ` ${previousNode} --> DTOs\\n`;\n previousNode = 'DTOs';\n }\n\n if (hasControllers) {\n diagram += ` ${previousNode} --> Controllers\\n`;\n previousNode = 'Controllers';\n }\n\n if (hasServices) {\n diagram += ` ${previousNode} --> Services\\n`;\n previousNode = 'Services';\n }\n\n if (hasRepositories) {\n diagram += ` ${previousNode} --> Repositories\\n`;\n diagram += ` Repositories --> Database\\n`;\n } else if (hasModels) {\n diagram += ` ${previousNode} --> Entities\\n`;\n diagram += ` Entities --> Database\\n`;\n } else {\n diagram += ` ${previousNode} --> Database\\n`;\n }\n\n if (modules.length > 0) {\n diagram += renderModulesSubgraph(modules);\n }\n\n return diagram;\n }\n }\n\n // Generic / CLI projects\n const hasEntry = (components['Source Files']?.files || []).some((f) =>\n /(?:^|\\/)(?:index|cli|main|bin)\\.[a-z]+$/i.test(f)\n );\n const hasSource = (components['Source Files']?.count ?? 0) > 0;\n const hasTests = (components['Test Files']?.count ?? 0) > 0;\n\n let diagram = `flowchart TD\n classDef client fill:#E0F2FE,stroke:#0284C7,stroke-width:2px,color:#0369A1;\n classDef core fill:#DCFCE7,stroke:#16A34A,stroke-width:2px,color:#15803D;\n classDef test fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#B45309;\n\n subgraph App [\"CLI & Application Architecture\"]\n`;\n if (hasEntry) {\n diagram += ` Entry[\"Entrypoint CLI (bin/)\"]:::client\\n`;\n }\n if (hasSource) {\n diagram += ` Source[\"Core Modules & Generators (src/)\"]:::core\\n`;\n }\n if (hasTests) {\n diagram += ` Tests[\"Automated Test Suites (tests/)\"]:::test\\n`;\n }\n if (!hasEntry && !hasSource && !hasTests) {\n diagram += ` Source[\"Source Files\"]:::core\\n`;\n }\n diagram += ` end\\n\\n`;\n\n if (hasEntry && hasSource) {\n diagram += ` Entry --> Source\\n`;\n }\n if (hasTests && hasSource) {\n diagram += ` Tests -.-> Source\\n`;\n }\n\n return diagram;\n}\n\n/**\n * Generate full ARCHITECTURE.md markdown content.\n */\nexport function generateArchitectureMarkdown(scanResult: ScanResult): string {\n const { projectInfo, totalFilesScanned, components, modules, directoryTree } = scanResult;\n\n const mermaid = generateMermaidDiagram(scanResult);\n\n // Component statistics rows\n const componentRows = Object.entries(components)\n .map(([, comp]) => {\n const sampleFiles = comp.files.slice(0, 3).map((f) => `\\`${f}\\``).join(', ');\n const moreSuffix = comp.files.length > 3 ? ` *(+${comp.files.length - 3} more)*` : '';\n return `| **${mdCell(comp.name)}** | \\`${comp.count}\\` | ${mdCell(comp.description)} | ${sampleFiles ? mdCell(sampleFiles + moreSuffix) : '-'} |`;\n })\n .join('\\n');\n\n // Modules section if present\n let modulesSection = '';\n if (modules.length > 0) {\n modulesSection = `\n## πŸ“¦ Detected Modules & Domains (${modules.length})\n\nThis project organizes features into modular domains:\n\n${modules.map((m) => `- **\\`${m}\\`**`).join('\\n')}\n`;\n }\n\n // Security notice generated from SAFE_IGNORE_LIST\n const sampleIgnores = SAFE_IGNORE_LIST.slice(0, 8).map((p) => `\\`${p}\\``).join(', ');\n const securityNotice = `## πŸ”’ Security & Privacy Notice\n\nThis architectural map was produced with strict privacy guarantees:\n- **Zero Network Transmission:** Executed locally without telemetry, tracking, or outbound communication.\n- **Safe Exclusion Filter:** Automatically ignores sensitive files and secret patterns (${sampleIgnores}, etc.) including \\`node_modules\\`, \\`vendor\\`, \\`.env*\\`, private keys, secrets, credentials, cloud configs, and cache folders.\n- **Manifest & Structure Only:** Safely reads standard manifest dependencies (\\`package.json\\` / \\`composer.json\\`) to determine framework types, and relative file paths to categorize components. Never reads private configurations or file contents.\n\n*Generated with ❀️ by LaraTS CLI.*`;\n\n return `# πŸ›οΈ Architecture Overview: ${projectInfo.name}\n\n> Auto-generated by **[LaraTS CLI](https://github.com/SidiqFatuh187/Larats)**. \n> **100% Local & Safe:** Generated entirely in offline mode via local filesystem manifest & structure analysis. Zero data transmitted.\n\n---\n\n## πŸ“Œ Project Summary\n\n| Attribute | Details |\n| :--- | :--- |\n| **Project Name** | \\`${projectInfo.name}\\` |\n| **Project Type** | **${projectInfo.type.toUpperCase()}** |\n| **Detected Stack** | \\`${projectInfo.summary}\\` |\n| **Scanned Files** | \\`${totalFilesScanned}\\` files indexed (safe ignore filter applied) |\n\n---\n\n## πŸ“Š Architectural Components Statistics\n\n| Component Layer | Count | Description | Sample Files |\n| :--- | :---: | :--- | :--- |\n${componentRows || '| *No architectural components identified* | `0` | - | - |'}\n${modulesSection}\n---\n\n## πŸ—ΊοΈ Visual Architecture Flowchart\n\nVisual representation of the project layers and request lifecycle rendered with [Mermaid.js](https://mermaid.js.org/):\n\n${fence(mermaid, 'mermaid')}\n\n---\n\n## 🌲 Directory Structure Tree\n\nClean, high-level directory tree showing key folders (ignoring build artifacts, vendor files, and sensitive keys):\n\n${fence(directoryTree || '(Empty directory structure)', 'text')}\n\n---\n\n${securityNotice}\n`;\n}\n\n/**\n * Render a concise, clean ASCII architecture request pipeline for terminal output.\n */\nexport function renderTerminalFlow(scanResult: ScanResult): string {\n const { projectInfo, components } = scanResult;\n const steps: string[] = [];\n\n if (projectInfo.type === 'laravel') {\n steps.push('Client');\n const routes = components['Routes']?.count ?? 0;\n if (routes > 0) steps.push(`Routes [${routes}]`);\n const requests = components['Form Requests']?.count ?? 0;\n if (requests > 0) steps.push(`Requests [${requests}]`);\n const controllers = components['Controllers']?.count ?? 0;\n if (controllers > 0) steps.push(`Controllers [${controllers}]`);\n const services = (components['Services']?.count ?? 0) + (components['Actions']?.count ?? 0);\n if (services > 0) steps.push(`Services [${services}]`);\n const models = components['Models']?.count ?? 0;\n if (models > 0) steps.push(`Models [${models}]`);\n steps.push('Database');\n } else if (projectInfo.type === 'typescript') {\n const hasAnyLayer = ['Controllers', 'Services', 'Repositories', 'Routes', 'DTOs & Schemas', 'Models & Entities', 'UI Components']\n .some((k) => (components[k]?.count ?? 0) > 0);\n\n if (hasAnyLayer) {\n steps.push('Client');\n const ui = components['UI Components']?.count ?? 0;\n if (ui > 0) steps.push(`UI [${ui}]`);\n const routes = components['Routes']?.count ?? 0;\n if (routes > 0) steps.push(`Router [${routes}]`);\n const dtos = components['DTOs & Schemas']?.count ?? 0;\n if (dtos > 0) steps.push(`DTOs [${dtos}]`);\n const controllers = components['Controllers']?.count ?? 0;\n if (controllers > 0) steps.push(`Controllers [${controllers}]`);\n const services = components['Services']?.count ?? 0;\n if (services > 0) steps.push(`Services [${services}]`);\n const data = (components['Repositories']?.count ?? 0) + (components['Models & Entities']?.count ?? 0);\n if (data > 0) steps.push(`Data Layer [${data}]`);\n steps.push('Database');\n } else {\n const src = components['Source Files']?.count ?? 0;\n const tests = components['Test Files']?.count ?? 0;\n steps.push('CLI / Entrypoint');\n if (src > 0) steps.push(`Source Modules [${src}]`);\n if (tests > 0) steps.push(`Test Suites [${tests}]`);\n }\n } else {\n const src = components['Source Files']?.count ?? 0;\n const tests = components['Test Files']?.count ?? 0;\n steps.push('Project Root');\n if (src > 0) steps.push(`Source [${src}]`);\n if (tests > 0) steps.push(`Tests [${tests}]`);\n }\n\n return steps.join(' ──> ');\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * Generate standalone interactive HTML architecture viewer with Mermaid.js.\n */\nexport function generateArchitectureHtml(scanResult: ScanResult): string {\n const { projectInfo, totalFilesScanned, components, modules, directoryTree } = scanResult;\n const mermaid = generateMermaidDiagram(scanResult);\n\n const componentRowsHtml = Object.entries(components)\n .map(([, comp]) => {\n const samples = comp.files.slice(0, 3).map((f) => `<code>${escapeHtml(f)}</code>`).join(', ');\n const more = comp.files.length > 3 ? ` <span class=\"muted\">(+${comp.files.length - 3} more)</span>` : '';\n return `<tr>\n <td><strong>${escapeHtml(comp.name)}</strong></td>\n <td><span class=\"badge\">${comp.count}</span></td>\n <td>${escapeHtml(comp.description)}</td>\n <td>${samples ? samples + more : '-'}</td>\n </tr>`;\n })\n .join('\\n');\n\n const modulesHtml = modules.length > 0\n ? `<div class=\"card\">\n <h2>πŸ“¦ Detected Modules & Domains (${modules.length})</h2>\n <div class=\"modules-grid\">\n ${modules.map((m) => `<div class=\"module-item\"><code>${escapeHtml(m)}</code></div>`).join('\\n')}\n </div>\n </div>`\n : '';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>LaraTS Architecture: ${escapeHtml(projectInfo.name)}</title>\n <style>\n :root {\n --bg: #0f172a;\n --card-bg: #1e293b;\n --text: #f8fafc;\n --muted: #94a3b8;\n --border: #334155;\n --primary: #38bdf8;\n --accent: #818cf8;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n background: var(--bg);\n color: var(--text);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n line-height: 1.5;\n padding: 2rem 1rem;\n }\n .container { max-width: 1080px; margin: 0 auto; }\n header { margin-bottom: 2rem; border-bottom: 1px solid var(--border); padding-bottom: 1.5rem; }\n .header-top { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 1rem; }\n h1 { font-size: 1.8rem; font-weight: 700; color: #fff; }\n .pill { background: #0284c7; color: #fff; padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 0.85rem; font-weight: 600; }\n .subtitle { color: var(--muted); margin-top: 0.5rem; font-size: 0.95rem; }\n .card { background: var(--card-bg); border: 1px solid var(--border); border-radius: 8px; padding: 1.5rem; margin-bottom: 2rem; }\n h2 { font-size: 1.25rem; font-weight: 600; margin-bottom: 1rem; color: #e2e8f0; }\n table { width: 100%; border-collapse: collapse; margin-top: 0.5rem; font-size: 0.9rem; }\n th, td { text-align: left; padding: 0.75rem 1rem; border-bottom: 1px solid var(--border); }\n th { color: var(--muted); font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; }\n .badge { background: #334155; padding: 0.2rem 0.6rem; border-radius: 4px; font-weight: 600; font-size: 0.85rem; }\n code { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; background: #090d16; padding: 0.15rem 0.4rem; border-radius: 4px; font-size: 0.85rem; color: #38bdf8; }\n pre { background: #090d16; padding: 1rem; border-radius: 6px; overflow-x: auto; font-size: 0.85rem; border: 1px solid var(--border); line-height: 1.4; }\n .mermaid-box { display: flex; justify-content: center; background: #090d16; border-radius: 8px; padding: 2rem 1rem; overflow-x: auto; border: 1px solid var(--border); }\n .modules-grid { display: flex; flex-wrap: wrap; gap: 0.5rem; }\n .module-item { background: #090d16; border: 1px solid var(--border); border-radius: 6px; padding: 0.5rem 1rem; }\n .muted { color: var(--muted); font-size: 0.85rem; }\n footer { text-align: center; color: var(--muted); font-size: 0.85rem; margin-top: 3rem; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <div class=\"header-top\">\n <div>\n <h1>πŸ›οΈ Architecture Overview: ${escapeHtml(projectInfo.name)}</h1>\n <p class=\"subtitle\">Stack: <strong>${escapeHtml(projectInfo.summary)}</strong> &bull; Total Files: <strong>${totalFilesScanned}</strong></p>\n </div>\n <span class=\"pill\">LaraTS Architecture Map</span>\n </div>\n </header>\n\n <div class=\"card\">\n <h2>πŸ—ΊοΈ Interactive Architecture Flowchart</h2>\n <div class=\"mermaid-box\">\n <pre class=\"mermaid\">${mermaid}</pre>\n </div>\n </div>\n\n <div class=\"card\">\n <h2>πŸ“Š Architectural Component Statistics</h2>\n <table>\n <thead>\n <tr>\n <th>Component Layer</th>\n <th>Files</th>\n <th>Description</th>\n <th>Sample Files</th>\n </tr>\n </thead>\n <tbody>\n ${componentRowsHtml || '<tr><td colspan=\"4\">No architectural components detected</td></tr>'}\n </tbody>\n </table>\n </div>\n\n ${modulesHtml}\n\n <div class=\"card\">\n <h2>🌲 Directory Structure Tree</h2>\n <pre><code>${escapeHtml(directoryTree || '(Empty directory)')}</code></pre>\n </div>\n\n <footer>\n Generated locally &amp; offline with ❀️ by <strong>LaraTS CLI</strong>\n </footer>\n </div>\n\n <script src=\"https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js\"></script>\n <script>\n if (typeof mermaid !== 'undefined') {\n mermaid.initialize({\n startOnLoad: true,\n theme: 'dark',\n flowchart: { curve: 'basis' }\n });\n }\n </script>\n</body>\n</html>`;\n}\n","import type { ScanResult } from '../scanner.js';\n\nexport const AI_RULES_START_TAG = '<!-- larats-rules:start -->';\nexport const AI_RULES_END_TAG = '<!-- larats-rules:end -->';\n\n/**\n * Generate a token-efficient, high-signal architecture context prompt for AI agents (Cursor, Claude, Copilot, ChatGPT).\n */\nexport function generateAiContext(scanResult: ScanResult): string {\n const { projectInfo, components, modules } = scanResult;\n\n const lines: string[] = [];\n\n lines.push('# Codebase Architecture Rules');\n lines.push(`> Project: ${projectInfo.name} | Stack: ${projectInfo.summary}`);\n lines.push('');\n\n lines.push('## Architectural Boundaries & Principles');\n lines.push('- Maintain strict separation of concerns across active architectural layers.');\n lines.push('- Keep Controllers thin: handle HTTP requests, invoke Services, and return responses.');\n lines.push('- Encapsulate all business rules, calculations, and mutations inside Services/Actions.');\n lines.push('- Isolate data storage and queries to Repositories or Model entities.');\n lines.push('- Validate all incoming user inputs with dedicated DTOs or Form Requests before reaching domain logic.');\n lines.push('');\n\n lines.push('## Project Structure & Layer Conventions');\n\n if (projectInfo.type === 'laravel') {\n const isModular = Boolean(projectInfo.laravel?.isModular);\n const modDir = projectInfo.laravel?.modulesDir || 'app/Modules';\n\n if (isModular) {\n lines.push(`- **Architecture Style**: Modular Domain Architecture`);\n lines.push(`- **Module Root**: \\`${modDir}/<FeatureName>/\\``);\n lines.push(`- **Controllers**: \\`${modDir}/<FeatureName>/Controllers/\\` (HTTP handlers)`);\n lines.push(`- **Services / Actions**: \\`${modDir}/<FeatureName>/Services/\\` or \\`Actions/\\` (Business logic)`);\n lines.push(`- **Models**: \\`${modDir}/<FeatureName>/Models/\\` (Eloquent entities)`);\n lines.push(`- **Validation**: \\`${modDir}/<FeatureName>/Requests/\\` (FormRequest classes)`);\n lines.push(`- **Routes**: \\`${modDir}/<FeatureName>/routes.php\\` or root \\`routes/\\``);\n } else {\n lines.push(`- **Architecture Style**: Standard Laravel Layered Architecture`);\n lines.push(`- **Controllers**: \\`app/Http/Controllers/\\``);\n lines.push(`- **Services / Actions**: \\`app/Services/\\` or \\`app/Actions/\\``);\n lines.push(`- **Models**: \\`app/Models/\\``);\n lines.push(`- **Validation**: \\`app/Http/Requests/\\``);\n lines.push(`- **Routes**: \\`routes/web.php\\`, \\`routes/api.php\\``);\n lines.push(`- **Migrations**: \\`database/migrations/\\``);\n }\n\n if (projectInfo.laravel?.hasFilament) {\n lines.push(`- **Admin Panel**: Filament Resources live in \\`app/Filament/Resources/\\``);\n }\n } else if (projectInfo.type === 'typescript') {\n const isModular = Boolean(projectInfo.typescript?.isModular);\n const srcDir = projectInfo.typescript?.srcDir || 'src';\n const orm = projectInfo.typescript?.hasPrisma ? 'Prisma' : projectInfo.typescript?.hasTypeORM ? 'TypeORM' : projectInfo.typescript?.hasDrizzle ? 'Drizzle' : null;\n\n if (isModular) {\n lines.push(`- **Architecture Style**: Feature Module Architecture`);\n lines.push(`- **Module Root**: \\`${srcDir}/modules/<feature>/\\``);\n lines.push(`- **Controllers**: \\`${srcDir}/modules/<feature>/<feature>.controller.ts\\``);\n lines.push(`- **Services**: \\`${srcDir}/modules/<feature>/<feature>.service.ts\\``);\n lines.push(`- **Repositories**: \\`${srcDir}/modules/<feature>/<feature>.repository.ts\\``);\n lines.push(`- **DTOs / Schemas**: \\`${srcDir}/modules/<feature>/<feature>.dto.ts\\``);\n lines.push(`- **Routes**: \\`${srcDir}/modules/<feature>/<feature>.routes.ts\\``);\n lines.push(`- **Module Index**: \\`${srcDir}/modules/<feature>/index.ts\\` (barrel export)`);\n } else {\n lines.push(`- **Architecture Style**: Layered Architecture`);\n lines.push(`- **Controllers**: \\`${srcDir}/controllers/\\``);\n lines.push(`- **Services**: \\`${srcDir}/services/\\``);\n lines.push(`- **Repositories / Data**: \\`${srcDir}/repositories/\\``);\n lines.push(`- **DTOs / Schemas**: \\`${srcDir}/dtos/\\` or \\`${srcDir}/schemas/\\``);\n lines.push(`- **Routes**: \\`${srcDir}/routes/\\``);\n }\n\n if (orm) {\n lines.push(`- **Database ORM**: ${orm} is used for data persistence.`);\n }\n } else {\n lines.push(`- **Source Code**: \\`src/\\``);\n lines.push(`- **Automated Tests**: \\`tests/\\``);\n }\n\n if (modules.length > 0) {\n lines.push('');\n lines.push(`## Active Feature Modules (${modules.length})`);\n lines.push(`Existing domains: ${modules.map((m) => `\\`${m}\\``).join(', ')}`);\n lines.push('When creating new features, follow this established domain partition.');\n }\n\n lines.push('');\n lines.push('## AI Coding Guardrails');\n lines.push('1. NEVER place raw queries or database transactions inside Controller files.');\n lines.push('2. When implementing a new feature, always create cohesive layers: Route -> Controller -> Service -> Repository/Model.');\n lines.push('3. Keep naming conventions consistent with existing files in the repository.');\n lines.push('4. Write automated unit/feature tests for new domain services.');\n\n return lines.join('\\n');\n}\n\n/**\n * Safely merge AI architecture rules into an existing config file (.cursorrules, CLAUDE.md)\n * without destroying existing user instructions.\n */\nexport function mergeAiRules(existingContent: string, newRules: string): string {\n const block = `${AI_RULES_START_TAG}\\n${newRules}\\n${AI_RULES_END_TAG}`;\n\n if (!existingContent || existingContent.trim() === '') {\n return block + '\\n';\n }\n\n const regex = new RegExp(`${AI_RULES_START_TAG}[\\\\s\\\\S]*?${AI_RULES_END_TAG}`, 'm');\n if (regex.test(existingContent)) {\n return existingContent.replace(regex, block);\n }\n\n return existingContent.trimEnd() + '\\n\\n' + block + '\\n';\n}\n","import { spawn } from 'node:child_process';\n\n/**\n * Copy text to system clipboard using native platform utilities (zero dependencies).\n * Returns true if successful, false if clipboard utility is unavailable.\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n const platform = process.platform;\n\n let command: string;\n let args: string[] = [];\n\n if (platform === 'win32') {\n command = 'clip';\n } else if (platform === 'darwin') {\n command = 'pbcopy';\n } else {\n command = process.env.WAYLAND_DISPLAY ? 'wl-copy' : 'xclip';\n if (command === 'xclip') {\n args = ['-selection', 'clipboard'];\n }\n }\n\n return new Promise<boolean>((resolve) => {\n try {\n const child = spawn(command, args, { stdio: ['pipe', 'ignore', 'ignore'] });\n\n child.on('error', () => {\n resolve(false);\n });\n\n child.on('close', (code) => {\n resolve(code === 0);\n });\n\n child.stdin.write(text);\n child.stdin.end();\n } catch {\n resolve(false);\n }\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { ProjectInfo } from '../detector.js';\nimport {\n getNaming,\n laravelModelTemplate,\n laravelControllerTemplate,\n laravelServiceTemplate,\n laravelActionTemplate,\n laravelRequestTemplate,\n laravelMigrationTemplate,\n} from '../templates/laravel.js';\nimport {\n tsControllerTemplate,\n tsServiceTemplate,\n tsRepositoryTemplate,\n tsRoutesTemplate,\n tsDtoTemplate,\n} from '../templates/typescript.js';\n\nexport interface ScaffoldOptions {\n moduleName: string;\n components: string[];\n isModular?: boolean;\n dryRun?: boolean;\n forceOverwrite?: boolean;\n}\n\nexport interface ScaffoldFileResult {\n filePath: string;\n relativeFilePath: string;\n status: 'created' | 'skipped' | 'error';\n reason?: string;\n}\n\nexport interface ScaffoldResult {\n moduleName: string;\n targetDir: string;\n files: ScaffoldFileResult[];\n createdCount: number;\n skippedCount: number;\n errorCount: number;\n dryRun?: boolean;\n}\n\nconst RESERVED_NAMES = new Set([\n 'model',\n 'controller',\n 'service',\n 'action',\n 'request',\n 'migration',\n 'repository',\n 'route',\n 'dto',\n 'object',\n 'class',\n 'interface',\n 'module',\n 'app',\n 'base',\n]);\n\n/**\n * Validate a user-provided module or feature name.\n * Returns an error string if invalid, or null if valid.\n */\nexport function validateModuleName(name: string): string | null {\n if (!name || !name.trim()) {\n return 'Module name cannot be empty.';\n }\n const trimmed = name.trim();\n if (!/^[a-zA-Z]/.test(trimmed)) {\n return 'Module name must start with an alphabetical letter.';\n }\n if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(trimmed)) {\n return 'Module name may only contain alphanumeric characters, hyphens, and underscores.';\n }\n if (RESERVED_NAMES.has(trimmed.toLowerCase())) {\n return `\"${trimmed}\" is a reserved framework name and cannot be used as a module name.`;\n }\n return null;\n}\n\n/**\n * Format timestamp for Laravel migration file name (e.g. 2026_10_24_114000)\n */\nfunction getMigrationTimestamp(): string {\n const now = new Date();\n const YYYY = now.getFullYear();\n const MM = String(now.getMonth() + 1).padStart(2, '0');\n const DD = String(now.getDate()).padStart(2, '0');\n const hh = String(now.getHours()).padStart(2, '0');\n const mm = String(now.getMinutes()).padStart(2, '0');\n const ss = String(now.getSeconds()).padStart(2, '0');\n return `${YYYY}_${MM}_${DD}_${hh}${mm}${ss}`;\n}\n\n/**\n * Scaffold components for Laravel or TypeScript projects safely without overwriting existing code.\n */\nexport async function scaffoldModule(\n projectInfo: ProjectInfo,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n const root = projectInfo.rootPath;\n const names = getNaming(options.moduleName);\n const filesToGenerate: {\n relativePath: string;\n content: string;\n isBarrel?: boolean;\n barrelExports?: string[];\n }[] = [];\n const results: ScaffoldFileResult[] = [];\n let createdCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n\n const isModular =\n options.isModular ??\n (projectInfo.type === 'laravel'\n ? Boolean(projectInfo.laravel?.isModular)\n : projectInfo.type === 'typescript'\n ? Boolean(projectInfo.typescript?.isModular)\n : true);\n\n if (projectInfo.type === 'laravel') {\n const selected = new Set(options.components);\n\n const addMigrationIfRequested = () => {\n const migrationsDir = path.join(root, 'database', 'migrations');\n let existingMigration: string | null = null;\n if (fs.existsSync(migrationsDir)) {\n const files = fs.readdirSync(migrationsDir);\n const match = files.find((f) => f.endsWith(`_create_${names.pluralSnake}_table.php`));\n if (match) {\n existingMigration = match;\n }\n }\n\n if (existingMigration && !options.forceOverwrite) {\n results.push({\n filePath: path.join(migrationsDir, existingMigration),\n relativeFilePath: `database/migrations/${existingMigration}`,\n status: 'skipped',\n reason: 'Migration for table already exists (overwrite protected)',\n });\n skippedCount++;\n } else {\n const timestamp = existingMigration ? existingMigration.split('_create_')[0] : getMigrationTimestamp();\n filesToGenerate.push({\n relativePath: `database/migrations/${timestamp}_create_${names.pluralSnake}_table.php`,\n content: laravelMigrationTemplate(names),\n });\n }\n };\n\n if (isModular) {\n const baseDir = `app/Modules/${names.pascal}`;\n const baseNamespace = `App\\\\Modules\\\\${names.pascal}`;\n\n if (selected.has('model')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Models/${names.pascal}.php`,\n content: laravelModelTemplate(names, `${baseNamespace}\\\\Models`, projectInfo.laravel?.version),\n });\n }\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Controllers/${names.pascal}Controller.php`,\n content: laravelControllerTemplate(names, {\n namespace: `${baseNamespace}\\\\Controllers`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n serviceNamespace: `${baseNamespace}\\\\Services`,\n requestNamespace: `${baseNamespace}\\\\Requests`,\n }),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Services/${names.pascal}Service.php`,\n content: laravelServiceTemplate(names, {\n namespace: `${baseNamespace}\\\\Services`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n }),\n });\n }\n if (selected.has('action')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Actions/Create${names.pascal}Action.php`,\n content: laravelActionTemplate(names, {\n namespace: `${baseNamespace}\\\\Actions`,\n modelNamespace: `${baseNamespace}\\\\Models`,\n }),\n });\n }\n if (selected.has('request')) {\n filesToGenerate.push({\n relativePath: `${baseDir}/Requests/${names.pascal}Request.php`,\n content: laravelRequestTemplate(names, `${baseNamespace}\\\\Requests`),\n });\n }\n if (selected.has('migration')) {\n addMigrationIfRequested();\n }\n } else {\n // Standard Laravel Structure\n if (selected.has('model')) {\n filesToGenerate.push({\n relativePath: `app/Models/${names.pascal}.php`,\n content: laravelModelTemplate(names, 'App\\\\Models', projectInfo.laravel?.version),\n });\n }\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `app/Http/Controllers/${names.pascal}Controller.php`,\n content: laravelControllerTemplate(names),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `app/Services/${names.pascal}Service.php`,\n content: laravelServiceTemplate(names),\n });\n }\n if (selected.has('action')) {\n filesToGenerate.push({\n relativePath: `app/Actions/Create${names.pascal}Action.php`,\n content: laravelActionTemplate(names),\n });\n }\n if (selected.has('request')) {\n filesToGenerate.push({\n relativePath: `app/Http/Requests/${names.pascal}Request.php`,\n content: laravelRequestTemplate(names),\n });\n }\n if (selected.has('migration')) {\n addMigrationIfRequested();\n }\n }\n } else {\n // TypeScript (or fallback)\n const selected = new Set(options.components);\n const srcDir = projectInfo.typescript?.srcDir || 'src';\n\n if (isModular) {\n const moduleFolder = `${srcDir}/modules/${names.kebab}`;\n\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.controller.ts`,\n content: tsControllerTemplate(names, true),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.service.ts`,\n content: tsServiceTemplate(names, true),\n });\n }\n if (selected.has('repository')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.repository.ts`,\n content: tsRepositoryTemplate(names, true),\n });\n }\n if (selected.has('route')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.routes.ts`,\n content: tsRoutesTemplate(names, true),\n });\n }\n if (selected.has('dto')) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/${names.kebab}.dto.ts`,\n content: tsDtoTemplate(names),\n });\n }\n\n // Add barrel index.ts export if multiple components generated in module\n if (filesToGenerate.length > 1) {\n const exports: string[] = [];\n if (selected.has('controller')) exports.push(`export * from './${names.kebab}.controller.js';`);\n if (selected.has('service')) exports.push(`export * from './${names.kebab}.service.js';`);\n if (selected.has('repository')) exports.push(`export * from './${names.kebab}.repository.js';`);\n if (selected.has('route')) exports.push(`export * from './${names.kebab}.routes.js';`);\n if (selected.has('dto')) exports.push(`export * from './${names.kebab}.dto.js';`);\n\n if (exports.length > 0) {\n filesToGenerate.push({\n relativePath: `${moduleFolder}/index.ts`,\n content: `${exports.join('\\n')}\\n`,\n isBarrel: true,\n barrelExports: exports,\n });\n }\n }\n } else {\n // Layered structure\n if (selected.has('controller')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/controllers/${names.kebab}.controller.ts`,\n content: tsControllerTemplate(names, false),\n });\n }\n if (selected.has('service')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/services/${names.kebab}.service.ts`,\n content: tsServiceTemplate(names, false),\n });\n }\n if (selected.has('repository')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/repositories/${names.kebab}.repository.ts`,\n content: tsRepositoryTemplate(names, false),\n });\n }\n if (selected.has('route')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/routes/${names.kebab}.routes.ts`,\n content: tsRoutesTemplate(names, false),\n });\n }\n if (selected.has('dto')) {\n filesToGenerate.push({\n relativePath: `${srcDir}/dtos/${names.kebab}.dto.ts`,\n content: tsDtoTemplate(names),\n });\n }\n }\n }\n\n // Execute file writing with strict Anti-Overwrite Protection\n\n for (const item of filesToGenerate) {\n const fullPath = path.resolve(root, item.relativePath);\n\n // Defense in depth: path traversal check\n const rel = path.relative(root, fullPath);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: 'Path traversal attempt detected outside project root',\n });\n errorCount++;\n continue;\n }\n\n if (options.dryRun) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n reason: 'Dry run simulated',\n });\n createdCount++;\n continue;\n }\n\n // Handle TS barrel index.ts appending if file already exists\n if (item.isBarrel && item.barrelExports && fs.existsSync(fullPath)) {\n try {\n const existingContent = fs.readFileSync(fullPath, 'utf-8');\n const missingExports = item.barrelExports.filter(\n (line) => !existingContent.includes(line)\n );\n\n if (missingExports.length > 0) {\n const newContent = existingContent.endsWith('\\n')\n ? existingContent + missingExports.join('\\n') + '\\n'\n : existingContent + '\\n' + missingExports.join('\\n') + '\\n';\n fs.writeFileSync(fullPath, newContent, 'utf-8');\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n reason: 'Appended exports to existing barrel index',\n });\n createdCount++;\n } else {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'skipped',\n reason: 'File already exists and contains all module exports',\n });\n skippedCount++;\n }\n continue;\n } catch (err: any) {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: err.message || String(err),\n });\n errorCount++;\n continue;\n }\n }\n\n try {\n // Ensure directory exists\n const parentDir = path.dirname(fullPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(fullPath, item.content, {\n flag: options.forceOverwrite ? 'w' : 'wx',\n encoding: 'utf-8',\n });\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'created',\n });\n createdCount++;\n } catch (err: any) {\n if (err.code === 'EEXIST') {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'skipped',\n reason: 'File already exists (overwrite protected)',\n });\n skippedCount++;\n } else {\n results.push({\n filePath: fullPath,\n relativeFilePath: item.relativePath,\n status: 'error',\n reason: err.message || String(err),\n });\n errorCount++;\n }\n }\n }\n\n return {\n moduleName: names.pascal,\n targetDir: root,\n files: results,\n createdCount,\n skippedCount,\n errorCount,\n dryRun: Boolean(options.dryRun),\n };\n}\n\n","export interface NamingVariations {\n pascal: string; // e.g. PaymentOrder\n camel: string; // e.g. paymentOrder\n kebab: string; // e.g. payment-order\n snake: string; // e.g. payment_order\n pluralSnake: string;// e.g. payment_orders\n pluralPascal: string;// e.g. PaymentOrders\n}\n\nfunction pluralize(word: string): string {\n const lower = word.toLowerCase();\n // If already ends in s and not ss (e.g. payments, orders, users)\n if (lower.endsWith('s') && !lower.endsWith('ss')) {\n return word;\n }\n // consonant + y -> ies (e.g., category -> categories, company -> companies)\n if (/[bcdfghjklmnpqrstvwxyz]y$/i.test(word)) {\n return word.slice(0, -1) + (word.endsWith('Y') ? 'IES' : 'ies');\n }\n // s, x, z, ch, sh -> es (box -> boxes, church -> churches, dish -> dishes, pass -> passes)\n if (/(?:s|x|z|ch|sh)$/i.test(word)) {\n return word + (word === word.toUpperCase() ? 'ES' : 'es');\n }\n return word + (word === word.toUpperCase() ? 'S' : 's');\n}\n\nexport function getNaming(input: string): NamingVariations {\n // Clean string and split on camelCase/PascalCase boundaries and separators\n const words = input\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[^a-zA-Z0-9]/g, ' ')\n .split(/\\s+/)\n .filter(Boolean);\n\n if (words.length === 0) {\n words.push('sample', 'module');\n }\n\n const pascal = words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n\n const camel = pascal.charAt(0).toLowerCase() + pascal.slice(1);\n\n const snake = words.map((w) => w.toLowerCase()).join('_');\n\n const kebab = words.map((w) => w.toLowerCase()).join('-');\n\n // Pluralization\n const pluralWords = [...words];\n const lastIdx = pluralWords.length - 1;\n pluralWords[lastIdx] = pluralize(pluralWords[lastIdx]);\n\n const pluralSnake = pluralWords.map((w) => w.toLowerCase()).join('_');\n const pluralPascal = pluralWords\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('');\n\n return { pascal, camel, kebab, snake, pluralSnake, pluralPascal };\n}\n\nexport function laravelModelTemplate(\n names: NamingVariations,\n namespace: string = 'App\\\\Models',\n laravelVersion?: string\n): string {\n const major = laravelVersion ? parseInt(laravelVersion.split('.')[0], 10) : 11;\n const isLaravel10OrOlder = major > 0 && major < 11;\n\n const castsBlock = isLaravel10OrOlder\n ? ` /**\n * The attributes that should be cast.\n *\n * @var array<string, string>\n */\n protected $casts = [\n 'metadata' => 'array',\n 'created_at' => 'datetime',\n 'updated_at' => 'datetime',\n ];`\n : ` /**\n * Get the attributes that should be cast.\n *\n * @return array<string, string>\n */\n protected function casts(): array\n {\n return [\n 'metadata' => 'array',\n 'created_at' => 'datetime',\n 'updated_at' => 'datetime',\n ];\n }`;\n\n return `<?php\n\nnamespace ${namespace};\n\nuse Illuminate\\\\Database\\\\Eloquent\\\\Factories\\\\HasFactory;\nuse Illuminate\\\\Database\\\\Eloquent\\\\Model;\n\nclass ${names.pascal} extends Model\n{\n use HasFactory;\n\n /**\n * The table associated with the model.\n *\n * @var string\n */\n protected $table = '${names.pluralSnake}';\n\n /**\n * The attributes that are mass assignable.\n *\n * @var list<string>\n */\n protected $fillable = [\n 'name',\n 'status',\n 'metadata',\n ];\n\n${castsBlock}\n}\n`;\n}\n\nexport function laravelControllerTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n serviceNamespace?: string;\n requestNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Http\\\\Controllers';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n const serviceNamespace = options.serviceNamespace || 'App\\\\Services';\n const requestNamespace = options.requestNamespace || 'App\\\\Http\\\\Requests';\n\n const baseControllerImport =\n namespace !== 'App\\\\Http\\\\Controllers' ? 'use App\\\\Http\\\\Controllers\\\\Controller;\\n' : '';\n\n return `<?php\n\nnamespace ${namespace};\n\n${baseControllerImport}use ${modelNamespace}\\\\${names.pascal};\nuse ${serviceNamespace}\\\\${names.pascal}Service;\nuse ${requestNamespace}\\\\${names.pascal}Request;\nuse Illuminate\\\\Http\\\\JsonResponse;\nuse Illuminate\\\\Http\\\\Request;\n\nclass ${names.pascal}Controller extends Controller\n{\n public function __construct(\n protected ${names.pascal}Service $${names.camel}Service\n ) {}\n\n /**\n * Display a listing of ${names.pascal} resources.\n */\n public function index(Request $request): JsonResponse\n {\n $items = $this->${names.camel}Service->getAll($request->all());\n\n return response()->json([\n 'status' => 'success',\n 'data' => $items,\n ]);\n }\n\n /**\n * Display the specified ${names.pascal} resource.\n */\n public function show(int $id): JsonResponse\n {\n $item = $this->${names.camel}Service->getById($id);\n\n return response()->json([\n 'status' => 'success',\n 'data' => $item,\n ]);\n }\n\n /**\n * Store a newly created ${names.pascal} in storage.\n */\n public function store(${names.pascal}Request $request): JsonResponse\n {\n $item = $this->${names.camel}Service->create($request->validated());\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} created successfully.',\n 'data' => $item,\n ], 201);\n }\n\n /**\n * Update the specified ${names.pascal} in storage.\n */\n public function update(${names.pascal}Request $request, int $id): JsonResponse\n {\n $item = $this->${names.camel}Service->update($id, $request->validated());\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} updated successfully.',\n 'data' => $item,\n ]);\n }\n\n /**\n * Remove the specified ${names.pascal} from storage.\n */\n public function destroy(int $id): JsonResponse\n {\n $this->${names.camel}Service->delete($id);\n\n return response()->json([\n 'status' => 'success',\n 'message' => '${names.pascal} deleted successfully.',\n ]);\n }\n}\n`;\n}\n\nexport function laravelServiceTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Services';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\nuse Illuminate\\\\Database\\\\Eloquent\\\\Collection;\n\nclass ${names.pascal}Service\n{\n /**\n * Retrieve all ${names.pluralPascal}.\n */\n public function getAll(array $filters = []): Collection\n {\n return ${names.pascal}::query()\n ->latest()\n ->get();\n }\n\n /**\n * Find ${names.pascal} by primary key.\n */\n public function getById(int $id): ${names.pascal}\n {\n return ${names.pascal}::findOrFail($id);\n }\n\n /**\n * Create a new ${names.pascal}.\n */\n public function create(array $data): ${names.pascal}\n {\n return ${names.pascal}::create($data);\n }\n\n /**\n * Update an existing ${names.pascal}.\n */\n public function update(int $id, array $data): ${names.pascal}\n {\n $item = $this->getById($id);\n $item->update($data);\n\n return $item;\n }\n\n /**\n * Delete a ${names.pascal}.\n */\n public function delete(int $id): bool\n {\n $item = $this->getById($id);\n\n return (bool) $item->delete();\n }\n}\n`;\n}\n\nexport function laravelActionTemplate(\n names: NamingVariations,\n options: {\n namespace?: string;\n modelNamespace?: string;\n } = {}\n): string {\n const namespace = options.namespace || 'App\\\\Actions';\n const modelNamespace = options.modelNamespace || 'App\\\\Models';\n\n return `<?php\n\nnamespace ${namespace};\n\nuse ${modelNamespace}\\\\${names.pascal};\n\nclass Create${names.pascal}Action\n{\n /**\n * Execute the ${names.pascal} creation workflow.\n */\n public function execute(array $data): ${names.pascal}\n {\n return ${names.pascal}::create($data);\n }\n}\n`;\n}\n\nexport function laravelRequestTemplate(names: NamingVariations, namespace: string = 'App\\\\Http\\\\Requests'): string {\n return `<?php\n\nnamespace ${namespace};\n\nuse Illuminate\\\\Foundation\\\\Http\\\\FormRequest;\n\nclass ${names.pascal}Request extends FormRequest\n{\n /**\n * Determine if the user is authorized to make this request.\n */\n public function authorize(): bool\n {\n return true;\n }\n\n /**\n * Get the validation rules that apply to the request.\n *\n * @return array<string, list<string>>\n */\n public function rules(): array\n {\n return [\n 'name' => ['required', 'string', 'max:255'],\n 'status' => ['nullable', 'string', 'in:draft,active,archived'],\n 'metadata' => ['nullable', 'array'],\n ];\n }\n\n /**\n * Get custom error messages for validation rules.\n *\n * @return array<string, string>\n */\n public function messages(): array\n {\n return [\n 'name.required' => 'The ${names.camel} name field is required.',\n ];\n }\n}\n`;\n}\n\nexport function laravelMigrationTemplate(names: NamingVariations): string {\n return `<?php\n\nuse Illuminate\\\\Database\\\\Migrations\\\\Migration;\nuse Illuminate\\\\Database\\\\Schema\\\\Blueprint;\nuse Illuminate\\\\Support\\\\Facades\\\\Schema;\n\nreturn new class extends Migration\n{\n /**\n * Run the migrations.\n */\n public function up(): void\n {\n Schema::create('${names.pluralSnake}', function (Blueprint $table) {\n $table->id();\n $table->string('name');\n $table->string('status')->default('draft');\n $table->json('metadata')->nullable();\n $table->timestamps();\n });\n }\n\n /**\n * Reverse the migrations.\n */\n public function down(): void\n {\n Schema::dropIfExists('${names.pluralSnake}');\n }\n};\n`;\n}\n","import type { NamingVariations } from './laravel.js';\n\nexport function tsControllerTemplate(names: NamingVariations, isModular: boolean = true): string {\n const serviceImport = isModular ? `./${names.kebab}.service.js` : `../services/${names.kebab}.service.js`;\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import type { Request, Response, NextFunction } from 'express';\nimport { ${names.pascal}Service } from '${serviceImport}';\nimport type { Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport class ${names.pascal}Controller {\n constructor(private readonly ${names.camel}Service: ${names.pascal}Service = new ${names.pascal}Service()) {}\n\n /**\n * GET /api/${names.kebab}\n */\n getAll = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const items = await this.${names.camel}Service.findAll(req.query);\n res.status(200).json({ status: 'success', data: items });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * GET /api/${names.kebab}/:id\n */\n getById = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const item = await this.${names.camel}Service.findById(id);\n if (!item) {\n res.status(404).json({ status: 'fail', message: '${names.pascal} not found' });\n return;\n }\n res.status(200).json({ status: 'success', data: item });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n\n /**\n * POST /api/${names.kebab}\n */\n create = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const payload: Create${names.pascal}Dto = req.body;\n const created = await this.${names.camel}Service.create(payload);\n res.status(201).json({ status: 'success', data: created });\n } catch (error) {\n next(error);\n }\n };\n\n /**\n * PUT /api/${names.kebab}/:id\n */\n update = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const payload: Update${names.pascal}Dto = req.body;\n const updated = await this.${names.camel}Service.update(id, payload);\n res.status(200).json({ status: 'success', data: updated });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n\n /**\n * DELETE /api/${names.kebab}/:id\n */\n delete = async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n const { id } = req.params;\n const deleted = await this.${names.camel}Service.delete(id);\n if (!deleted) {\n res.status(404).json({ status: 'fail', message: '${names.pascal} not found' });\n return;\n }\n res.status(200).json({ status: 'success', message: '${names.pascal} deleted successfully' });\n } catch (error: any) {\n if (error?.name === 'NotFoundError') {\n res.status(404).json({ status: 'fail', message: error.message });\n return;\n }\n next(error);\n }\n };\n}\n`;\n}\n\nexport function tsServiceTemplate(names: NamingVariations, isModular: boolean = true): string {\n const repoImport = isModular ? `./${names.kebab}.repository.js` : `../repositories/${names.kebab}.repository.js`;\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import { ${names.pascal}Repository } from '${repoImport}';\nimport type { ${names.pascal}Entity, Create${names.pascal}Dto, Update${names.pascal}Dto } from '${dtoImport}';\n\nexport class ${names.pascal}Service {\n constructor(private readonly ${names.camel}Repository: ${names.pascal}Repository = new ${names.pascal}Repository()) {}\n\n async findAll(query: Record<string, any> = {}): Promise<${names.pascal}Entity[]> {\n return this.${names.camel}Repository.findAll(query);\n }\n\n async findById(id: string): Promise<${names.pascal}Entity | null> {\n return this.${names.camel}Repository.findById(id);\n }\n\n async create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity> {\n return this.${names.camel}Repository.create(data);\n }\n\n async update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity> {\n return this.${names.camel}Repository.update(id, data);\n }\n\n async delete(id: string): Promise<boolean> {\n return this.${names.camel}Repository.delete(id);\n }\n}\n`;\n}\n\nexport function tsRepositoryTemplate(names: NamingVariations, isModular: boolean = true): string {\n const dtoImport = isModular ? `./${names.kebab}.dto.js` : `../dtos/${names.kebab}.dto.js`;\n\n return `import { randomUUID } from 'node:crypto';\nimport { NotFoundError, type ${names.pascal}Entity, type Create${names.pascal}Dto, type Update${names.pascal}Dto } from '${dtoImport}';\n\nexport interface I${names.pascal}Repository {\n findAll(query?: Record<string, any>): Promise<${names.pascal}Entity[]>;\n findById(id: string): Promise<${names.pascal}Entity | null>;\n create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity>;\n update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity>;\n delete(id: string): Promise<boolean>;\n}\n\nexport class ${names.pascal}Repository implements I${names.pascal}Repository {\n // In-memory store fallback. Replace with Prisma / TypeORM / Drizzle client calls.\n private storage: Map<string, ${names.pascal}Entity> = new Map();\n\n async findAll(_query?: Record<string, any>): Promise<${names.pascal}Entity[]> {\n return Array.from(this.storage.values());\n }\n\n async findById(id: string): Promise<${names.pascal}Entity | null> {\n return this.storage.get(id) || null;\n }\n\n async create(data: Create${names.pascal}Dto): Promise<${names.pascal}Entity> {\n const id = randomUUID();\n const newRecord: ${names.pascal}Entity = {\n id,\n ...data,\n status: data.status || 'draft',\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.storage.set(id, newRecord);\n return newRecord;\n }\n\n async update(id: string, data: Update${names.pascal}Dto): Promise<${names.pascal}Entity> {\n const existing = await this.findById(id);\n if (!existing) {\n throw new NotFoundError(\\`${names.pascal} with id \\${id} not found\\`);\n }\n const updated: ${names.pascal}Entity = {\n ...existing,\n ...data,\n updatedAt: new Date(),\n };\n this.storage.set(id, updated);\n return updated;\n }\n\n async delete(id: string): Promise<boolean> {\n return this.storage.delete(id);\n }\n}\n`;\n}\n\nexport function tsRoutesTemplate(names: NamingVariations, isModular: boolean = true): string {\n const controllerImport = isModular ? `./${names.kebab}.controller.js` : `../controllers/${names.kebab}.controller.js`;\n\n return `import { Router } from 'express';\nimport { ${names.pascal}Controller } from '${controllerImport}';\n\nconst router = Router();\nconst controller = new ${names.pascal}Controller();\n\n/**\n * Route declarations for ${names.pascal}\n */\nrouter.get('/', controller.getAll);\nrouter.get('/:id', controller.getById);\nrouter.post('/', controller.create);\nrouter.put('/:id', controller.update);\nrouter.delete('/:id', controller.delete);\n\nexport const ${names.camel}Routes = router;\nexport default router;\n`;\n}\n\nexport function tsDtoTemplate(names: NamingVariations): string {\n return `export class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NotFoundError';\n }\n}\n\nexport interface ${names.pascal}Entity {\n id: string;\n name: string;\n status: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Create${names.pascal}Dto {\n name: string;\n status?: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface Update${names.pascal}Dto {\n name?: string;\n status?: 'draft' | 'active' | 'archived';\n description?: string;\n metadata?: Record<string, unknown>;\n}\n`;\n}\n\n"],"mappings":"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","names":["fs","path","os","path","diagram","p","text","fs","path","path","fs","path","os","fs","spinner"]}