create-morax 1.0.15 → 2.0.0

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/core/runner.ts","../src/core/startcli.ts","../src/core/workspaceName.ts","../src/utils/isCancel.ts","../src/tasks/directories.ts","../src/tasks/workspace.ts","../src/utils/exec.ts","../src/core/react-runner.ts","../src/tasks/react.ts","../src/tasks/git.ts","../src/tasks/addreadme.ts","../src/core/endcli.ts","../src/core/next-runner.ts","../src/tasks/nextjs.ts","../src/tasks/shadcn.ts","../src/tasks/prettier.ts","../src/tasks/eslint.ts","../src/tasks/typescript.ts","../src/tasks/server.ts","../src/tasks/husky.ts","../src/core/web.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { runWorkspaceScaffolder } from './core/runner.js';\n\nasync function main() {\n const isReactOnly =\n process.argv.includes('--react') ||\n process.argv.includes('-r') ||\n process.env.npm_config_react === 'true' ||\n process.env.npm_config_r === 'true';\n const isNextOnly =\n process.argv.includes('--nextjs') ||\n process.argv.includes('--next') ||\n process.argv.includes('-n') ||\n process.env.npm_config_nextjs === 'true' ||\n process.env.npm_config_next === 'true' ||\n process.env.npm_config_n === 'true';\n await runWorkspaceScaffolder({ react: isReactOnly, next: isNextOnly });\n}\n\nmain().catch((err) => {\n console.error(pc.red('Fatal Error during execution:'), err);\n process.exit(1);\n});\n","import path from 'path';\nimport { spinner, multiselect } from '@clack/prompts';\nimport pc from 'picocolors';\n\nimport { startCli } from './startcli.js';\nimport { promptWorkspaceName } from './workspaceName.js';\nimport { makeDirectories } from '../tasks/directories.js';\nimport { runReactScaffolder } from './react-runner.js';\nimport { runNextScaffolder } from './next-runner.js';\nimport { runPrettierSetup } from '../tasks/prettier.js';\nimport { runEslintSetup } from '../tasks/eslint.js';\nimport { runTypescriptSetup } from '../tasks/typescript.js';\nimport { runServerSetup } from '../tasks/server.js';\nimport { runGitSetup } from '../tasks/git.js';\nimport { runHuskySetup } from '../tasks/husky.js';\nimport { endCli } from './endcli.js';\nimport { runCommand } from '../utils/exec.js';\nimport { setupReadme } from '../tasks/addreadme.js';\nimport addNextjs from './web.js';\nimport handleCancel from '../utils/isCancel.js';\n\nexport async function runWorkspaceScaffolder(\n options: { react?: boolean; next?: boolean } = {},\n) {\n // 1. Greet and display premium logo\n startCli();\n\n const isMonorepo = !options.react && !options.next;\n\n // 2. Prompt for Name (Optional, defaults to morax-workspace or my-app)\n const name = await promptWorkspaceName(isMonorepo);\n const projectPath = path.join(process.cwd(), name);\n\n if (options.react) {\n await runReactScaffolder(name, projectPath);\n return;\n }\n\n if (options.next) {\n await runNextScaffolder(name, projectPath);\n return;\n }\n\n // 3. Prompt and execute directories and workspace config generation\n await makeDirectories(name, projectPath);\n\n // Add the root README silently immediately after directory creation\n await setupReadme(projectPath, name);\n\n // 4. Prompt and execute Git initialization\n const gitInitialized = await runGitSetup(projectPath);\n\n // Ask which tools and features to include upfront\n const selectedApps = await askServerorFrontendInclue();\n const selectedTools = await askWhichToolToInclude(\n selectedApps.includes('server'),\n );\n\n // 5. Execute Prettier setup if selected\n if (selectedTools.includes('prettier')) {\n await runPrettierSetup(projectPath);\n }\n\n // 6. Execute Husky setup if selected and git is initialized\n if (selectedTools.includes('husky')) {\n await runHuskySetup(projectPath, gitInitialized);\n }\n\n // 7. Execute ESLint setup if selected\n if (selectedTools.includes('eslint')) {\n await runEslintSetup(projectPath);\n }\n\n // 8. Execute TypeScript setup if selected\n if (selectedTools.includes('typescript')) {\n await runTypescriptSetup(projectPath);\n }\n\n // 9. Execute Express Backend setup if selected\n if (selectedApps.includes('server')) {\n await runServerSetup(projectPath);\n }\n\n // 10. Execute Next.js/Vite Frontend setup if selected\n if (selectedApps.includes('web')) {\n await addNextjs(projectPath);\n }\n\n // 11. Run final pnpm install to resolve all workspace configurations and symlinks\n const s = spinner();\n console.log('\\n');\n s.start('Running final workspace package installation...');\n try {\n await runCommand('pnpm install', { cwd: projectPath, silent: true });\n s.stop(\n pc.green(\n '✔ Success: Workspace dependencies and symlinks configured successfully',\n ),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Warning: Final workspace installation failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n }\n console.log('\\n');\n\n // 13. Complete and show beautiful finish screen\n endCli(name, projectPath);\n}\n\nasync function askWhichToolToInclude(hasServer: boolean) {\n const options = [\n {\n value: 'prettier',\n label: 'Prettier',\n hint: 'Code formatter rules & auto-formatting script',\n },\n {\n value: 'husky',\n label: 'Husky',\n hint: 'Git pre-commit hooks setup (requires Git)',\n },\n ];\n\n if (!hasServer) {\n options.splice(\n 1,\n 0,\n {\n value: 'eslint',\n label: 'ESLint',\n hint: 'Modern Flat Config linter configurations',\n },\n {\n value: 'typescript',\n label: 'TypeScript',\n hint: 'Extendable shared TypeScript configurations',\n },\n );\n }\n\n const tools = await multiselect({\n message: hasServer\n ? 'ESLint & TypeScript are required for the Express backend. Select additional configurations/tools:'\n : 'Which configurations/linter tools would you like to set up?',\n options,\n required: false,\n });\n\n handleCancel(tools);\n\n const selectedTools = tools as string[];\n if (hasServer) {\n if (!selectedTools.includes('eslint')) selectedTools.push('eslint');\n if (!selectedTools.includes('typescript')) selectedTools.push('typescript');\n }\n\n return selectedTools;\n}\n\nasync function askServerorFrontendInclue() {\n const apps = await multiselect({\n message: 'Which backend/frontend applications would you like to set up?',\n options: [\n {\n value: 'web',\n label: 'Frontend Web App',\n hint: 'Scaffold Next.js or React (Vite) frontend in apps/web',\n },\n {\n value: 'server',\n label: 'Backend Server',\n hint: 'Scaffold Express backend in apps/server',\n },\n ],\n required: false,\n });\n\n handleCancel(apps);\n return apps as string[];\n}\n","import gradient from 'gradient-string';\nimport pc from 'picocolors';\nimport { intro } from '@clack/prompts';\nimport boxen from 'boxen';\n\nconst asciiArt = [\n '███╗ ███╗ ██████╗ ██████╗ █████╗ ██╗ ██╗',\n '████╗ ████║ ██╔═══██╗ ██╔══██╗ ██╔══██╗ ╚██╗██╔╝',\n '██╔████╔██║ ██║ ██║ ██████╔╝ ███████║ ╚███╔╝ ',\n '██║╚██╔╝██║ ██║ ██║ ██╔══██╗ ██╔══██║ ██╔██╗ ',\n '██║ ╚═╝ ██║ ╚██████╔╝ ██║ ██║ ██║ ██║ ██╔╝ ██╗',\n '╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝',\n].join('\\n');\n\nexport function startCli() {\n console.clear();\n\n // Premium fiery orange-to-yellow brand gradient\n const moraxGradient = gradient(['#FF3E00', '#FF8C00', '#FFAE19']);\n\n console.log('\\n');\n console.log(moraxGradient(asciiArt));\n console.log('\\n');\n\n intro(pc.yellow('🌌 Welcome to Morax — The Next-Gen Workspace Scaffolder'));\n\n console.log(\n boxen(\n `⚡ ${pc.bold('Morax')} automates the setup of modern ${pc.cyan('pnpm workspaces')}, linking internal shared configurations, UI packages, and framework apps concurrently.`,\n {\n padding: 1,\n margin: { top: 0, bottom: 1, left: 1, right: 1 },\n borderStyle: 'round',\n borderColor: 'yellow',\n },\n ),\n );\n}\n","import { text } from '@clack/prompts';\nimport handleCancel from '../utils/isCancel.js';\n\nexport async function promptWorkspaceName(isMonorepo = true): Promise<string> {\n const nameInput = await text({\n message: isMonorepo\n ? 'What is the name of your new monorepo workspace?'\n : 'What is the name of your new project?',\n placeholder: isMonorepo ? 'morax-workspace' : 'my-app',\n validate(value) {\n if (value && value.includes(' '))\n return isMonorepo\n ? 'Workspace name cannot contain spaces!'\n : 'Project name cannot contain spaces!';\n },\n });\n\n handleCancel(nameInput);\n\n // Fallback to defaults if left blank\n return (\n String(nameInput).trim() || (isMonorepo ? 'morax-workspace' : 'my-app')\n );\n}\n","import { isCancel, cancel } from '@clack/prompts';\nimport pc from 'picocolors';\n\nexport default function handleCancel(input: any) {\n if (isCancel(input)) {\n cancel(pc.red('✖ Morax cancelled.'));\n process.exit(0);\n }\n}\n","import { spinner } from '@clack/prompts';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport pc from 'picocolors';\nimport { generateWorkspaceConfig } from './workspace.js';\n\nexport async function createDirectories(\n directories: ('apps' | 'packages')[],\n projectPath: string,\n) {\n for (const dir of directories) {\n const dirPath = path.join(projectPath, dir);\n await fsPromises.mkdir(dirPath, { recursive: true });\n await fsPromises.writeFile(\n path.join(dirPath, '.gitkeep'),\n `# Placeholder to ensure git tracks the empty ${dir}/ folder\\n`,\n 'utf8',\n );\n }\n}\n\nexport async function makeDirectories(name: string, projectPath: string) {\n const directories: ('apps' | 'packages')[] = ['apps', 'packages'];\n\n const s = spinner();\n console.log('\\n');\n s.start('Generating workspace configs...');\n try {\n await generateWorkspaceConfig(name, directories, projectPath);\n await createDirectories(directories, projectPath);\n s.stop(pc.green('✔ Success: Generated Workspace Root & Folder Structures'));\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Workspace generation failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n console.log('\\n');\n\n return directories;\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function generateWorkspaceConfig(\n name: string,\n directories: ('apps' | 'packages')[],\n projectPath: string,\n) {\n // 1. Create target folder if it doesn't exist\n await fsPromises.mkdir(projectPath, { recursive: true });\n\n // 2. Generate pnpm-workspace.yaml based on user's selective input\n const workspaceYamlContent = [\n 'packages:',\n ...directories.map((dir) => ` - '${dir}/*'`),\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(projectPath, 'pnpm-workspace.yaml'),\n workspaceYamlContent,\n 'utf8',\n );\n\n // 3. Generate Root package.json using pnpm init\n await runCommand('pnpm init', { cwd: projectPath, silent: true });\n\n // 4. Read, parse and customize the package.json\n const packageJsonPath = path.join(projectPath, 'package.json');\n const packageJsonRaw = await fsPromises.readFile(packageJsonPath, 'utf8');\n const pkg = JSON.parse(packageJsonRaw);\n\n pkg.name = name;\n pkg.description = 'High-performance monorepo workspace generated by Morax';\n pkg.private = true;\n pkg.packageManager = 'pnpm@9.15.4';\n pkg.workspaces = directories.map((dir) => `${dir}/*`);\n pkg.scripts = {\n dev: 'pnpm --filter morax-web dev',\n };\n\n // Remove entry points since workspace root is private and has no main entry\n delete pkg.main;\n\n await fsPromises.writeFile(\n packageJsonPath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n}\n","import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport pc from 'picocolors';\n\nconst execAsync = promisify(exec);\n\nexport interface RunCommandOptions {\n cwd?: string;\n silent?: boolean;\n}\n\n/**\n * Reusable helper to execute commands and print/return their outputs\n */\nexport async function runCommand(\n command: string,\n options: RunCommandOptions = {},\n) {\n options.silent = true;\n\n if (!options.silent) {\n console.log(pc.cyan(`> ${command}`));\n }\n\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: options.cwd,\n env: { ...process.env, NODE_NO_WARNINGS: '1' },\n });\n\n if (!options.silent) {\n if (stdout && stdout.trim()) {\n console.log(stdout.trim());\n }\n if (stderr && stderr.trim()) {\n console.log(pc.yellow(stderr.trim()));\n }\n }\n\n return { stdout, stderr };\n } catch (error: any) {\n if (!options.silent) {\n if (error.stdout && error.stdout.trim()) {\n console.log(error.stdout.trim());\n }\n if (error.stderr && error.stderr.trim()) {\n console.error(pc.red(error.stderr.trim()));\n }\n }\n throw error;\n }\n}\n","import path from 'path';\nimport { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\n\nimport { setupReact } from '../tasks/react.js';\nimport { runGitSetup } from '../tasks/git.js';\nimport { setupReadme } from '../tasks/addreadme.js';\nimport { endCli } from './endcli.js';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function runReactScaffolder(name: string, projectPath: string) {\n // 1. Setup React directly at the root (non-monorepo)\n const finalProjectPath = await setupReact(projectPath, false);\n\n // 2. Add the root README inside the created project folder\n await setupReadme(finalProjectPath, path.basename(finalProjectPath));\n\n // 3. Prompt and execute Git initialization inside the created project folder\n await runGitSetup(finalProjectPath);\n\n // 4. Run final pnpm install to ensure all dependencies are installed\n const installSpinner = spinner();\n console.log('\\n');\n installSpinner.start('Running final package installation...');\n try {\n await runCommand('pnpm install', { cwd: finalProjectPath, silent: true });\n installSpinner.stop(\n pc.green('✔ Success: Dependencies configured successfully'),\n );\n } catch (error: any) {\n installSpinner.stop(pc.red('✖ Warning: Final package installation failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n }\n console.log('\\n');\n\n // 5. Complete and show beautiful finish screen\n endCli(path.basename(finalProjectPath), finalProjectPath);\n}\n","import pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { spawn } from 'child_process';\nimport { confirm, spinner, text } from '@clack/prompts';\nimport handleCancel from '../utils/isCancel.js';\nimport { runCommand } from '../utils/exec.js';\n\nfunction runInteractiveCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const fullCommand =\n args.length > 0 ? `${command} ${args.join(' ')}` : command;\n const child = spawn(fullCommand, [], {\n cwd,\n stdio: 'inherit',\n shell: true,\n env: { ...process.env, NODE_NO_WARNINGS: '1' },\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `Command \"${command} ${args.join(' ')}\" exited with code ${code}`,\n ),\n );\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n\nexport async function setupReact(projectPath: string, isMonorepo = true) {\n const appsDir = isMonorepo\n ? path.join(projectPath, 'apps')\n : path.dirname(projectPath);\n\n // 1. Print important warnings to prevent blocking\n console.log(pc.magentaBright('\\n🔷 IMPORTANT INSTRUCTIONS:'));\n console.log(\n pc.magentaBright(\n 'During the Vite interactive configuration prompts, please select:',\n ),\n );\n console.log(\n pc.magentaBright(\n ` 1. Install & Start: Choose ${pc.bold('No')} when asked \"Install with npm/pnpm and start now?\"`,\n ),\n );\n console.log(\n pc.magentaBright(\n 'This allows Morax CLI to continue automatically configuring your workspace (ESLint, Prettier, Tailwind, packages, etc.)!',\n ),\n );\n\n // 2. Run pnpm create vite@latest interactively!\n console.log(\n pc.cyan('\\nStarting interactive Vite React application setup...'),\n );\n\n // Get list of directories in appsDir before running Vite to auto-detect the chosen project name\n let beforeDirs: string[] = [];\n try {\n beforeDirs = await fsPromises.readdir(appsDir);\n } catch {}\n\n try {\n await runInteractiveCommand('pnpm', ['create', 'vite@latest'], appsDir);\n\n // Get list of directories in appsDir after running Vite\n let afterDirs: string[] = [];\n try {\n afterDirs = await fsPromises.readdir(appsDir);\n } catch {}\n\n // Find the newly created folder\n const newDirs = afterDirs.filter((d) => !beforeDirs.includes(d));\n let createdDirName = 'web'; // fallback\n if (newDirs.length > 0) {\n createdDirName = newDirs[0];\n }\n const webDir = path.join(appsDir, createdDirName);\n\n // Verify directory exists\n try {\n await fsPromises.access(webDir);\n } catch {\n throw new Error(\n `Vite React application directory \"apps/${createdDirName}\" was not found. Please ensure you complete the Vite installation.`,\n );\n }\n\n // Always configure Path Aliases & @types/node right away so import aliases are ready\n const aliasSpinner = spinner();\n aliasSpinner.start('Configuring import aliases and Node types...');\n try {\n // Inject @types/node into package.json devDependencies\n const pkgPath = path.join(webDir, 'package.json');\n try {\n const pkgRaw = await fsPromises.readFile(pkgPath, 'utf8');\n const pkg = JSON.parse(pkgRaw);\n pkg.devDependencies = pkg.devDependencies || {};\n pkg.devDependencies['@types/node'] = '^20.11.0';\n await fsPromises.writeFile(\n pkgPath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n } catch {}\n\n // tsconfig.json / tsconfig.app.json\n const tsconfigPaths = [\n path.join(webDir, 'tsconfig.json'),\n path.join(webDir, 'tsconfig.app.json'),\n ];\n for (const tsPath of tsconfigPaths) {\n try {\n let content = await fsPromises.readFile(tsPath, 'utf8');\n if (content.includes('\"compilerOptions\"')) {\n if (!content.includes('\"paths\"')) {\n content = content.replace(\n /(\"compilerOptions\"\\s*:\\s*\\{)/,\n `$1\\n \"baseUrl\": \".\",\\n \"paths\": {\\n \"@/*\": [\"./src/*\"]\\n },`,\n );\n await fsPromises.writeFile(tsPath, content, 'utf8');\n }\n } else {\n content = content.replace(\n /^(\\s*\\{)/,\n `$1\\n \"compilerOptions\": {\\n \"baseUrl\": \".\",\\n \"paths\": {\\n \"@/*\": [\"./src/*\"]\\n }\\n },`,\n );\n await fsPromises.writeFile(tsPath, content, 'utf8');\n }\n } catch {}\n }\n\n // vite.config.ts\n const viteConfigPath = path.join(webDir, 'vite.config.ts');\n try {\n let content = await fsPromises.readFile(viteConfigPath, 'utf8');\n if (!content.includes(\"import path from 'path'\")) {\n content = \"import path from 'path';\\n\" + content;\n }\n if (!content.includes('resolve:')) {\n content = content.replace(\n /(plugins:\\s*\\[[^\\]]*\\]),?/,\n `$1,\\n resolve: {\\n alias: {\\n \"@\": path.resolve(__dirname, \"./src\"),\\n },\\n }`,\n );\n }\n await fsPromises.writeFile(viteConfigPath, content, 'utf8');\n } catch {}\n\n aliasSpinner.stop(\n pc.green('✔ Success: Import aliases and Node types configured'),\n );\n } catch (err: any) {\n aliasSpinner.stop(pc.red('✖ Failed: Import alias configuration failed'));\n }\n\n console.log(\n pc.green(\n isMonorepo\n ? `\\n✔ Success: Vite React frontend configured in apps/${createdDirName}\\n`\n : `\\n✔ Success: Vite React frontend configured at root\\n`,\n ),\n );\n\n // 3. Prompt for Tailwind CSS v4 and shadcn UI setup\n const setupTailwindPrompt = await confirm({\n message: 'Do you want to install and configure Tailwind CSS v4?',\n initialValue: true,\n });\n handleCancel(setupTailwindPrompt);\n\n const setupShadcnPrompt = await confirm({\n message: `Do you want to setup shadcn UI in your Vite React website (apps/${createdDirName})?`,\n initialValue: true,\n });\n handleCancel(setupShadcnPrompt);\n\n // Determine if Tailwind needs to be installed (shadcn UI requires Tailwind)\n const needsTailwind = setupTailwindPrompt || setupShadcnPrompt;\n\n if (needsTailwind) {\n const s = spinner();\n s.start(\n 'Installing Tailwind CSS v4, Vite integration, and Node types...',\n );\n try {\n // 4. Inject dependencies directly into package.json\n const pkgPath = path.join(webDir, 'package.json');\n try {\n const pkgRaw = await fsPromises.readFile(pkgPath, 'utf8');\n const pkg = JSON.parse(pkgRaw);\n pkg.dependencies = pkg.dependencies || {};\n pkg.devDependencies = pkg.devDependencies || {};\n\n pkg.dependencies['tailwindcss'] = '^4.0.0';\n pkg.devDependencies['@tailwindcss/vite'] = '^4.0.0';\n pkg.devDependencies['@types/node'] = '^20.11.0';\n\n await fsPromises.writeFile(\n pkgPath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n } catch {}\n\n // Install packages via pnpm install\n await runCommand('pnpm install', { cwd: webDir, silent: true });\n\n s.message('Configuring Vite plugins and Tailwind CSS imports...');\n\n // 5. Configure the Vite plugin in vite.config.ts\n const viteConfigPath = path.join(webDir, 'vite.config.ts');\n try {\n let content = await fsPromises.readFile(viteConfigPath, 'utf8');\n if (!content.includes('@tailwindcss/vite')) {\n content =\n \"import tailwindcss from '@tailwindcss/vite';\\n\" + content;\n\n if (content.includes('plugins: [react()]')) {\n content = content.replace(\n 'plugins: [react()]',\n 'plugins: [react(), tailwindcss()]',\n );\n } else if (content.includes('plugins: [react(),]')) {\n content = content.replace(\n 'plugins: [react(),]',\n 'plugins: [react(), tailwindcss()]',\n );\n } else {\n // Use regex for multi-line or standard spacing\n content = content.replace(\n /(plugins:\\s*\\[\\s*react\\(\\),?\\s*)(\\])/g,\n '$1\\n tailwindcss(),\\n $2',\n );\n }\n await fsPromises.writeFile(viteConfigPath, content, 'utf8');\n }\n } catch {}\n\n // 6. Overwrite src/index.css to import Tailwind CSS v4\n const indexCssPath = path.join(webDir, 'src', 'index.css');\n try {\n await fsPromises.writeFile(\n indexCssPath,\n '@import \"tailwindcss\";\\n',\n 'utf8',\n );\n } catch {}\n\n s.stop(\n pc.green('✔ Success: Tailwind CSS v4 configured successfully\\n'),\n );\n } catch (err: any) {\n s.stop(pc.red('✖ Failed: Tailwind CSS v4 setup failed'));\n throw err;\n }\n }\n\n if (setupShadcnPrompt) {\n // 8. Prompt for preset and initialize shadcn UI\n const hasPreset = await confirm({\n message: 'Do you have a custom shadcn UI preset code?',\n initialValue: false,\n });\n handleCancel(hasPreset);\n\n let presetCode = '';\n if (hasPreset) {\n const enteredPreset = await text({\n message: 'Enter your custom shadcn UI preset code:',\n placeholder: 'e.g. 123456',\n validate: (val) => {\n if (!val || !val.trim()) return 'Preset code cannot be empty';\n return;\n },\n });\n handleCancel(enteredPreset);\n presetCode = (enteredPreset as string).trim();\n }\n\n const args = ['dlx', 'shadcn@latest', 'init'];\n if (presetCode) {\n args.push('--preset', presetCode);\n }\n args.push('--template', 'vite');\n\n console.log(\n pc.cyan('\\nStarting interactive shadcn UI initialization...'),\n );\n await runInteractiveCommand('pnpm', args, webDir);\n console.log(\n pc.green(\n isMonorepo\n ? `\\n✔ Success: shadcn UI successfully initialized in apps/${createdDirName}\\n`\n : `\\n✔ Success: shadcn UI successfully initialized at root\\n`,\n ),\n );\n }\n return webDir;\n } catch (error: any) {\n console.error(pc.red(`\\n✖ Failed: Vite React frontend setup failed`));\n console.error(pc.red(`Error details: ${error.message || error}\\n`));\n process.exit(1);\n }\n}\n","import { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function promptGit() {\n return await confirm({\n message: 'Do you want to initialize a local Git repository?',\n initialValue: true,\n });\n}\n\nexport async function gitInit(projectPath: string) {\n // 1. Initialize empty git repository\n await runCommand('git init', { cwd: projectPath, silent: true });\n\n // 2. Create high-quality standard .gitignore\n const gitignore = [\n '# Dependency directories',\n 'node_modules/',\n 'jspm_packages/',\n 'web_modules/',\n '',\n '# Build and output outputs',\n 'dist/',\n 'build/',\n '.next/',\n 'out/',\n '.turbo/',\n '',\n '# Environments',\n '.env',\n '.env.local',\n '.env.development.local',\n '.env.test.local',\n '.env.production.local',\n '',\n '# Logs',\n 'npm-debug.log*',\n 'yarn-debug.log*',\n 'yarn-error.log*',\n 'pnpm-debug.log*',\n '*.log',\n '',\n '# OS Metadata',\n '.DS_Store',\n 'Thumbs.db',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(projectPath, '.gitignore'),\n gitignore,\n 'utf8',\n );\n}\n\nexport async function runGitSetup(projectPath: string): Promise<boolean> {\n const gitPrompt = await promptGit();\n\n handleCancel(gitPrompt);\n\n let gitInitialized = false;\n if (gitPrompt) {\n const s = spinner();\n console.log('\\n');\n s.start('Initializing Git repository...');\n try {\n await gitInit(projectPath);\n s.stop(pc.green('✔ Success: Git repository initialized'));\n gitInitialized = true;\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Git initialization failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n console.log('\\n');\n }\n return gitInitialized;\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\n\nexport async function setupReadme(projectPath: string, workspaceName: string) {\n const readmePath = path.join(projectPath, 'README.md');\n\n const readmeContent = [\n `# Morax `,\n '',\n 'Welcome to your next-generation, high-performance monorepo workspace generated by **Morax**.',\n '',\n '## Workspace Structure',\n '',\n '- **`apps/`** — Frontend applications, backend servers, and user-facing services.',\n '- **`packages/`** — Shared modules, TypeScript configurations, ESLint rule sets, and common utility libraries.',\n '',\n '## Key Commands',\n '',\n 'Run the following commands from the root directory of your workspace:',\n '',\n '### Development',\n 'Start all dev servers and hot-reloading configurations concurrently:',\n '```bash',\n 'pnpm dev',\n '```',\n '',\n '### Linting',\n 'Run static analysis across all workspaces using your shared ESLint rules:',\n '```bash',\n 'pnpm lint',\n '```',\n '',\n '### Formatting',\n 'Automatically format all codebase files using Prettier:',\n '```bash',\n 'pnpm format',\n '```',\n '',\n '---',\n '',\n '*Generated with love by [Morax Scaffolder CLI](https://github.com/Elitedv/morax).*',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(readmePath, readmeContent, 'utf8');\n}\n","import pc from 'picocolors';\nimport { outro } from '@clack/prompts';\n\nexport function endCli(name: string, projectPath: string) {\n // Complete and show beautiful finish screen\n outro(pc.yellow('Morax scaffolding completed successfully!'));\n\n console.log(\n `⚡ ${pc.bold('Workspace ready:')} ${pc.yellow(name)}\\n` +\n // `Location: ${pc.cyan(projectPath)}\\n\\n` +\n `${pc.bold('To start developing:')}\\n` +\n ` 1. ${pc.cyan(`cd ${name}`)}\\n` +\n ` 2. ${pc.cyan('pnpm dev')}`,\n );\n}\n","import path from 'path';\nimport { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\n\nimport { setupNextjs } from '../tasks/nextjs.js';\nimport { runShadcnSetup } from '../tasks/shadcn.js';\nimport { runGitSetup } from '../tasks/git.js';\nimport { setupReadme } from '../tasks/addreadme.js';\nimport { endCli } from './endcli.js';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function runNextScaffolder(name: string, projectPath: string) {\n // 1. Setup Next.js directly at the root (non-monorepo)\n const finalProjectPath = await setupNextjs(projectPath, false);\n\n // 2. Setup shadcn UI (non-monorepo)\n await runShadcnSetup(finalProjectPath, false);\n\n // 3. Add the root README inside the created project folder\n await setupReadme(finalProjectPath, path.basename(finalProjectPath));\n\n // 4. Prompt and execute Git initialization inside the created project folder\n await runGitSetup(finalProjectPath);\n\n // 5. Run final pnpm install to ensure all dependencies are installed\n const installSpinner = spinner();\n console.log('\\n');\n installSpinner.start('Running final package installation...');\n try {\n await runCommand('pnpm install', { cwd: finalProjectPath, silent: true });\n installSpinner.stop(\n pc.green('✔ Success: Dependencies configured successfully'),\n );\n } catch (error: any) {\n installSpinner.stop(pc.red('✖ Warning: Final package installation failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n }\n console.log('\\n');\n\n // 6. Complete and show beautiful finish screen\n endCli(path.basename(finalProjectPath), finalProjectPath);\n}\n","import { confirm } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { spawn } from 'child_process';\n\nexport async function promptNextjs() {\n return await confirm({\n message: 'Do you want to setup a Next.js frontend in apps/web?',\n initialValue: true,\n });\n}\n\nfunction runInteractiveCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell: true,\n env: { ...process.env, NODE_NO_WARNINGS: '1' },\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `Command \"${command} ${args.join(' ')}\" exited with code ${code}`,\n ),\n );\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n\nexport async function setupNextjs(projectPath: string, isMonorepo = true) {\n const appsDir = isMonorepo\n ? path.join(projectPath, 'apps')\n : path.dirname(projectPath);\n const targetName = isMonorepo ? 'web' : path.basename(projectPath);\n const webDir = path.join(appsDir, targetName);\n\n // 1. Delete the existing directory if it contains placeholder files (.gitkeep)\n try {\n await fsPromises.rm(webDir, { recursive: true, force: true });\n } catch {}\n\n // 2. Run npx create-next-app@latest interactively!\n console.log(pc.cyan('\\nStarting interactive Next.js application setup...'));\n await runInteractiveCommand(\n 'npx',\n ['create-next-app@latest', targetName],\n appsDir,\n );\n\n return webDir;\n}\n\nexport async function runNextjsSetup(projectPath: string) {\n // Ensure the apps folder option was generated/exists\n const appsDir = path.join(projectPath, 'apps');\n try {\n await fsPromises.access(appsDir);\n } catch {\n // If the apps folder was not scaffolded, we shouldn't attempt to setup Web there\n return;\n }\n\n const webPrompt = await promptNextjs();\n\n handleCancel(webPrompt);\n\n if (webPrompt) {\n try {\n await setupNextjs(projectPath);\n console.log(\n pc.green('\\n✔ Success: Next.js frontend configured in apps/web\\n'),\n );\n } catch (error: any) {\n console.error(pc.red(`\\n✖ Failed: Next.js frontend setup failed`));\n console.error(pc.red(`Error details: ${error.message || error}\\n`));\n process.exit(1);\n }\n }\n}\n","import { confirm } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { spawn } from 'child_process';\n\nexport async function promptShadcn() {\n return await confirm({\n message:\n 'Do you want to setup shadcn UI in your Next.js website (apps/web)?',\n initialValue: true,\n });\n}\n\nfunction runInteractiveCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell: true,\n env: { ...process.env, NODE_NO_WARNINGS: '1' },\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `Command \"${command} ${args.join(' ')}\" exited with code ${code}`,\n ),\n );\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n\nexport async function setupShadcn(projectPath: string, isMonorepo = true) {\n const webDir = isMonorepo\n ? path.join(projectPath, 'apps', 'web')\n : projectPath;\n\n // Run pnpm dlx shadcn@latest init --template next interactively!\n console.log(pc.cyan('\\nStarting interactive shadcn UI initialization...'));\n await runInteractiveCommand(\n 'pnpm',\n ['dlx', 'shadcn@latest', 'init', '--template', 'next'],\n webDir,\n );\n}\n\nexport async function runShadcnSetup(projectPath: string, isMonorepo = true) {\n // Ensure the Next.js frontend actually exists\n const webDir = isMonorepo\n ? path.join(projectPath, 'apps', 'web')\n : projectPath;\n try {\n await fsPromises.access(webDir);\n } catch {\n // Next.js app was not generated, skip shadcn setup\n return;\n }\n\n const shadcnPrompt = await promptShadcn();\n\n handleCancel(shadcnPrompt);\n\n if (shadcnPrompt) {\n try {\n await setupShadcn(projectPath, isMonorepo);\n console.log(\n pc.green(\n isMonorepo\n ? '\\n✔ Success: shadcn UI successfully initialized in apps/web\\n'\n : '\\n✔ Success: shadcn UI successfully initialized at root\\n',\n ),\n );\n } catch (error: any) {\n console.error(pc.red(`\\n✖ Failed: shadcn UI setup failed`));\n console.error(pc.red(`Error details: ${error.message || error}\\n`));\n process.exit(1);\n }\n }\n}\n","import { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function promptPrettier() {\n return await confirm({\n message: 'Do you want to setup Prettier code formatting?',\n initialValue: true,\n });\n}\n\nexport async function setupPrettier(projectPath: string) {\n // 1. Install Prettier dynamically with exact version at the workspace root\n await runCommand('pnpm add -D -E prettier -w', { cwd: projectPath });\n\n // 2. Create high-quality modern .prettierrc\n const prettierrc = {\n semi: true,\n singleQuote: true,\n tabWidth: 2,\n trailingComma: 'all',\n printWidth: 100,\n };\n\n await fsPromises.writeFile(\n path.join(projectPath, '.prettierrc'),\n JSON.stringify(prettierrc, null, 2),\n 'utf8',\n );\n\n // 3. Create comprehensive .prettierignore\n const prettierignore = [\n '# Dependencies',\n 'node_modules/',\n 'jspm_packages/',\n 'web_modules/',\n '',\n '# Build and outputs',\n 'dist/',\n 'build/',\n '.next/',\n 'out/',\n '.turbo/',\n '',\n '# Configuration locks',\n 'pnpm-lock.yaml',\n '',\n '# Environment files',\n '.env',\n '.env.*',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(projectPath, '.prettierignore'),\n prettierignore,\n 'utf8',\n );\n\n // 4. Inject format script to root package.json\n const rootPackagePath = path.join(projectPath, 'package.json');\n const rootPackageContent = await fsPromises.readFile(rootPackagePath, 'utf8');\n const pkg = JSON.parse(rootPackageContent);\n\n pkg.scripts = {\n ...(pkg.scripts || {}),\n format: 'prettier --write .',\n };\n\n await fsPromises.writeFile(\n rootPackagePath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n\n // 5. Initial format execution to clean up generated files\n await runCommand('pnpm format', { cwd: projectPath });\n}\n\nexport async function runPrettierSetup(projectPath: string) {\n const prettierPrompt = await promptPrettier();\n\n handleCancel(prettierPrompt);\n\n if (prettierPrompt) {\n const s = spinner();\n console.log('\\n');\n s.start('Setting up Prettier auto-formatting...');\n try {\n await setupPrettier(projectPath);\n s.stop(pc.green('✔ Success: Prettier formatting configured'));\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Prettier setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n console.log('\\n');\n }\n}\n","import { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function setupEslint(projectPath: string) {\n const eslintDir = path.join(projectPath, 'packages', 'eslint');\n\n // 1. Create packages/eslint directory recursively\n await fsPromises.mkdir(eslintDir, { recursive: true });\n\n // 2. Initialize the package using pnpm init\n await runCommand('pnpm init', { cwd: eslintDir, silent: true });\n\n // 3. Customize the packages/eslint/package.json\n const eslintPackagePath = path.join(eslintDir, 'package.json');\n const eslintPackageRaw = await fsPromises.readFile(eslintPackagePath, 'utf8');\n const eslintPkg = JSON.parse(eslintPackageRaw);\n\n eslintPkg.name = '@config/eslint';\n eslintPkg.version = '1.0.0';\n eslintPkg.private = true;\n eslintPkg.type = 'module';\n eslintPkg.main = 'eslint.config.ts';\n eslintPkg.exports = {\n '.': './eslint.config.ts',\n };\n eslintPkg.scripts = {\n lint: 'eslint .',\n };\n\n // Remove defaults that are not needed\n delete eslintPkg.keywords;\n delete eslintPkg.author;\n delete eslintPkg.license;\n\n await fsPromises.writeFile(\n eslintPackagePath,\n JSON.stringify(eslintPkg, null, 2),\n 'utf8',\n );\n\n // 4. Run pnpm add -D dynamically to fetch and install only the latest packages\n await runCommand(\n 'pnpm add -D eslint @eslint/js @eslint/json globals typescript-eslint',\n { cwd: eslintDir },\n );\n\n // 5. Create Modern eslint.config.ts with Flat Config and @eslint/json support\n const eslintConfigContent = [\n 'import js from \"@eslint/js\";',\n 'import globals from \"globals\";',\n 'import tseslint from \"typescript-eslint\";',\n 'import eslintJson from \"@eslint/json\";',\n '',\n 'export default tseslint.config(',\n ' {',\n ' ignores: [\"**/dist/**\", \"**/node_modules/**\"],',\n ' },',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ' {',\n ' languageOptions: {',\n ' globals: {',\n ' ...globals.node,',\n ' },',\n ' },',\n ' rules: {',\n ' \"no-unused-vars\": \"off\",',\n ' \"@typescript-eslint/no-unused-vars\": [\"error\", { argsIgnorePattern: \"^_\" }],',\n ' },',\n ' },',\n ' {',\n ' files: [\"**/*.json\"],',\n ' language: \"json/json\",',\n ' ...eslintJson.configs.recommended,',\n ' }',\n ');',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(eslintDir, 'eslint.config.ts'),\n eslintConfigContent,\n 'utf8',\n );\n\n // 6. Inject lint script into root package.json\n const rootPackagePath = path.join(projectPath, 'package.json');\n const rootPackageContent = await fsPromises.readFile(rootPackagePath, 'utf8');\n const rootPkg = JSON.parse(rootPackageContent);\n\n rootPkg.scripts = {\n ...(rootPkg.scripts || {}),\n lint: 'pnpm --filter @config/eslint lint',\n };\n\n await fsPromises.writeFile(\n rootPackagePath,\n JSON.stringify(rootPkg, null, 2),\n 'utf8',\n );\n}\n\nexport async function runEslintSetup(projectPath: string) {\n // Ensure the packages folder option was generated/exists\n const packagesDir = path.join(projectPath, 'packages');\n try {\n await fsPromises.access(packagesDir);\n } catch {\n // If the packages folder was not scaffolded, we shouldn't attempt to setup ESLint there\n return;\n }\n\n const s = spinner();\n console.log('\\n');\n s.start('Setting up modular ESLint in packages/eslint...');\n try {\n await setupEslint(projectPath);\n s.stop(pc.green('✔ Success: Modular ESLint configured in packages/eslint'));\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: ESLint setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n console.log('\\n');\n}\n","import { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function setupTypescript(projectPath: string) {\n const tsDir = path.join(projectPath, 'packages', 'typescript');\n\n // 1. Create packages/typescript directory recursively\n await fsPromises.mkdir(tsDir, { recursive: true });\n\n // 2. Initialize the package using pnpm init\n await runCommand('pnpm init', { cwd: tsDir, silent: true });\n\n // 3. Customize the packages/typescript/package.json\n const tsPackagePath = path.join(tsDir, 'package.json');\n const tsPackageRaw = await fsPromises.readFile(tsPackagePath, 'utf8');\n const tsPkg = JSON.parse(tsPackageRaw);\n\n tsPkg.name = '@config/typescript';\n tsPkg.version = '1.0.0';\n tsPkg.private = true;\n tsPkg.type = 'module';\n tsPkg.exports = {\n './tsconfig.json': './tsconfig.json',\n };\n\n // Remove defaults that are not needed\n delete tsPkg.keywords;\n delete tsPkg.author;\n delete tsPkg.license;\n delete tsPkg.main;\n delete tsPkg.scripts;\n\n await fsPromises.writeFile(\n tsPackagePath,\n JSON.stringify(tsPkg, null, 2),\n 'utf8',\n );\n\n // 4. Install typescript package dynamically as devDependency\n await runCommand(\n 'cd ../.. && pnpm add -D typescript -w && cd packages/typescript',\n { cwd: tsDir, silent: true },\n );\n\n // 5. Initialize tsconfig.json using npx tsc --init\n await runCommand('npx tsc --init', { cwd: tsDir });\n}\n\nexport async function runTypescriptSetup(projectPath: string) {\n // Ensure the packages folder option was generated/exists\n const packagesDir = path.join(projectPath, 'packages');\n try {\n await fsPromises.access(packagesDir);\n } catch {\n // If the packages folder was not scaffolded, we shouldn't attempt to setup TS config there\n return;\n }\n\n const s = spinner();\n console.log('\\n');\n s.start('Setting up modular TypeScript config in packages/typescript...');\n try {\n await setupTypescript(projectPath);\n s.stop(\n pc.green(\n '✔ Success: Modular TypeScript config configured in packages/typescript',\n ),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: TypeScript config setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n console.log('\\n');\n}\n","import { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function promptServer() {\n return await confirm({\n message: 'Do you want to setup a Express backend in apps/server?',\n initialValue: true,\n });\n}\n\nexport async function setupServer(projectPath: string) {\n const serverDir = path.join(projectPath, 'apps', 'server');\n const srcDir = path.join(serverDir, 'src');\n\n // 1. Create directory structure apps/server/src recursively\n await fsPromises.mkdir(srcDir, { recursive: true });\n\n // 2. Initialize package.json using pnpm init\n await runCommand('pnpm init', { cwd: serverDir, silent: true });\n\n // 3. Customize apps/server/package.json\n const serverPackagePath = path.join(serverDir, 'package.json');\n const serverPackageRaw = await fsPromises.readFile(serverPackagePath, 'utf8');\n const serverPkg = JSON.parse(serverPackageRaw);\n\n // Check if modular ESLint package exists in workspace packages\n const eslintDir = path.join(projectPath, 'packages', 'eslint');\n let hasEslint = false;\n try {\n await fsPromises.access(eslintDir);\n hasEslint = true;\n } catch {}\n\n serverPkg.name = 'server';\n serverPkg.version = '1.0.0';\n serverPkg.private = true;\n serverPkg.type = 'module';\n serverPkg.main = 'dist/index.js';\n serverPkg.scripts = {\n dev: 'tsx watch src/index.ts',\n build: 'tsc',\n start: 'node dist/index.js',\n };\n serverPkg.devDependencies = {\n '@config/typescript': 'workspace:*',\n };\n\n if (hasEslint) {\n serverPkg.devDependencies['@config/eslint'] = 'workspace:*';\n serverPkg.scripts['lint'] = 'eslint .';\n }\n\n // Remove defaults that are not needed\n delete serverPkg.keywords;\n delete serverPkg.author;\n delete serverPkg.license;\n\n await fsPromises.writeFile(\n serverPackagePath,\n JSON.stringify(serverPkg, null, 2),\n 'utf8',\n );\n\n // 4. Create tsconfig.json extending the base shared config\n const tsconfigContent = {\n extends: '@config/typescript/tsconfig.json',\n compilerOptions: {\n rootDir: 'src',\n outDir: 'dist',\n },\n include: ['src/**/*'],\n };\n\n await fsPromises.writeFile(\n path.join(serverDir, 'tsconfig.json'),\n JSON.stringify(tsconfigContent, null, 2),\n 'utf8',\n );\n\n // If ESLint exists, write the server's eslint.config.ts extending the base config\n if (hasEslint) {\n const eslintConfigContent = [\n \"import baseConfig from '@config/eslint';\",\n '',\n 'export default [',\n ' ...baseConfig,',\n ' {',\n ' // Add server-specific overrides if necessary',\n ' },',\n '];',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(serverDir, 'eslint.config.ts'),\n eslintConfigContent,\n 'utf8',\n );\n }\n\n // 5. Install dependencies dynamically using pnpm add (fetches latest)\n await runCommand('pnpm add express cors', { cwd: serverDir, silent: false });\n await runCommand('pnpm add -D @types/express @types/cors tsx typescript', {\n cwd: serverDir,\n silent: false,\n });\n\n // 6. Create src/index.ts with premium starter code using CORS and Express\n const indexTsContent = [\n \"import express from 'express';\",\n \"import cors from 'cors';\",\n '',\n 'const app = express();',\n 'const port = process.env.PORT || 3001;',\n '',\n '// Enable CORS and parsing of JSON request bodies',\n 'app.use(cors());',\n 'app.use(express.json());',\n '',\n '// Root API health and welcome route',\n \"app.get('/api', (req, res) => {\",\n ' res.json({',\n \" message: 'Welcome to the Morax High-Performance Backend API!',\",\n ' timestamp: new Date().toISOString(),',\n \" status: 'healthy',\",\n ' });',\n '});',\n '',\n 'app.listen(port, () => {',\n ' console.log(`🚀 Server is running on http://localhost:${port}`);',\n '});',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(srcDir, 'index.ts'),\n indexTsContent,\n 'utf8',\n );\n}\n\nexport async function runServerSetup(projectPath: string) {\n // Ensure the apps folder option was generated/exists\n const appsDir = path.join(projectPath, 'apps');\n try {\n await fsPromises.access(appsDir);\n } catch {\n // If the apps folder was not scaffolded, we shouldn't attempt to setup Server there\n return;\n }\n\n const serverPrompt = await promptServer();\n\n handleCancel(serverPrompt);\n\n if (serverPrompt) {\n const s = spinner();\n console.log('\\n');\n s.start('Setting up modular Express backend in apps/server...');\n try {\n await setupServer(projectPath);\n s.stop(\n pc.green(\n '✔ Success: Modular Express backend configured in apps/server',\n ),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Express backend setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n console.log('\\n');\n }\n}\n","import { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function promptHusky() {\n return await confirm({\n message: 'Do you want to setup Husky pre-commit hooks?',\n initialValue: true,\n });\n}\n\nexport async function setupHusky(projectPath: string) {\n // 1. Install Husky dynamically with exact version at the workspace root\n await runCommand('pnpm add -D -E husky -w', { cwd: projectPath });\n\n // 2. Initialize Husky using its official init generator\n await runCommand('pnpm exec husky init', { cwd: projectPath });\n\n // 3. Update the auto-generated .husky/pre-commit file to run format and stage files\n const preCommitPath = path.join(projectPath, '.husky', 'pre-commit');\n let hookContent = '';\n try {\n hookContent = await fsPromises.readFile(preCommitPath, 'utf8');\n } catch {\n hookContent = 'pnpm test'; // Default fallback\n }\n\n // Replace default test commands with formatting checks\n hookContent = hookContent.replace('pnpm test', 'pnpm format');\n\n // Append staging of newly formatted files\n if (!hookContent.includes('git add .')) {\n hookContent = hookContent.trim() + '\\ngit add .\\n';\n }\n\n await fsPromises.writeFile(preCommitPath, hookContent, 'utf8');\n\n try {\n await fsPromises.chmod(preCommitPath, 0o755);\n } catch {}\n}\n\nexport async function runHuskySetup(\n projectPath: string,\n gitInitialized: boolean,\n) {\n if (!gitInitialized) return;\n\n const huskyPrompt = await promptHusky();\n\n handleCancel(huskyPrompt);\n\n if (huskyPrompt) {\n const s = spinner();\n console.log('\\n');\n s.start('Setting up Husky hooks...');\n try {\n await setupHusky(projectPath);\n s.stop(pc.green('✔ Success: Husky pre-commit hooks configured'));\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Husky setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n console.log('\\n');\n }\n}\n","import { select } from '@clack/prompts';\nimport handleCancel from '../utils/isCancel.js';\nimport { runShadcnSetup } from '../tasks/shadcn.js';\nimport { setupNextjs } from '../tasks/nextjs.js';\nimport { setupReact } from '../tasks/react.js';\n\nexport default async function addweb(projectPath: string) {\n const framework = await select({\n message:\n 'Which frontend website setup would you like to include in apps/web?',\n options: [\n {\n value: 'nextjs',\n label: 'Next.js',\n hint: 'The React Framework for the Web',\n },\n {\n value: 'react',\n label: 'React (Vite)',\n hint: 'Vite React Starter Template',\n },\n {\n value: 'skip',\n label: 'Skip',\n hint: 'Skip setting up a frontend website',\n },\n ],\n initialValue: 'nextjs',\n });\n\n handleCancel(framework);\n\n if (framework === 'nextjs') {\n await setupNextjs(projectPath);\n // Prompt and execute shadcn UI setup in next.js app\n await runShadcnSetup(projectPath);\n } else if (framework === 'react') {\n await setupReact(projectPath);\n }\n}\n"],"mappings":"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","names":["pc","path","spinner","pc","pc","fsPromises","path","pc","pc","path","fsPromises","pc","path","spinner","pc","pc","fsPromises","path","spinner","text","path","pc","fsPromises","spinner","text","confirm","spinner","pc","fsPromises","path","confirm","fsPromises","path","spinner","pc","fsPromises","path","pc","path","spinner","pc","path","spinner","pc","confirm","pc","fsPromises","path","spawn","runInteractiveCommand","spawn","path","fsPromises","pc","confirm","pc","fsPromises","path","spawn","confirm","runInteractiveCommand","pc","path","spinner","pc","confirm","spinner","pc","fsPromises","path","confirm","fsPromises","path","spinner","pc","spinner","pc","fsPromises","path","path","fsPromises","spinner","pc","spinner","pc","fsPromises","path","path","fsPromises","spinner","pc","confirm","spinner","pc","fsPromises","path","confirm","path","fsPromises","spinner","pc","confirm","spinner","pc","fsPromises","path","confirm","path","fsPromises","spinner","pc","path","spinner","pc","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/runner.ts","../src/core/startcli.ts","../src/core/preflight.ts","../src/utils/exec.ts","../src/core/workspaceName.ts","../src/utils/isCancel.ts","../src/core/prompts.ts","../src/modules/packages/db/index.ts","../src/modules/packages/db/drizzle.ts","../src/core/endcli.ts","../src/standalone/react-runner.ts","../src/modules/apps/web/react.ts","../src/modules/git/git.ts","../src/modules/workspace/readme.ts","../src/standalone/next-runner.ts","../src/modules/apps/web/nextjs.ts","../src/modules/apps/web/shadcn.ts","../src/modules/workspace/directories.ts","../src/modules/workspace/config.ts","../src/modules/workspace/extras.ts","../src/modules/workspace/docs.ts","../src/modules/workspace/agents.ts","../src/modules/workspace/license.ts","../src/modules/workspace/scripts.ts","../src/modules/skills/index.ts","../src/modules/workspace/env.ts","../src/modules/git/husky.ts","../src/modules/git/lefthook.ts","../src/modules/quality/biome.ts","../src/modules/quality/oxlint.ts","../src/modules/quality/prettier.ts","../src/modules/packages/typescript.ts","../src/modules/apps/server/index.ts","../src/modules/apps/server/frameworks/express/index.ts","../src/modules/apps/server/frameworks/express/package.ts","../src/modules/apps/server/frameworks/express/templates/node.ts","../src/modules/apps/server/frameworks/express/templates/bun.ts","../src/modules/apps/server/frameworks/hono/index.ts","../src/modules/apps/server/frameworks/hono/package.ts","../src/modules/apps/server/frameworks/hono/templates/node.ts","../src/modules/apps/server/frameworks/hono/templates/bun.ts","../src/modules/apps/server/prompts.ts","../src/modules/apps/server/deployment/docker/index.ts","../src/modules/apps/server/deployment/docker/express-docker.ts","../src/modules/apps/server/deployment/docker/hono-docker.ts","../src/modules/apps/server/deployment/vercel/index.ts","../src/modules/apps/server/deployment/vercel/express-vercel.ts","../src/modules/apps/server/deployment/vercel/hono-vercel.ts","../src/modules/apps/server/deployment/index.ts","../src/modules/apps/web/index.ts","../src/modules/packages/env/index.ts","../src/modules/packages/env/package.ts","../src/modules/packages/env/templates/create-env.ts","../src/modules/packages/env/templates/server.ts","../src/modules/packages/env/templates/db.ts","../src/modules/packages/env/templates/docker.ts","../src/modules/packages/env/templates/web.ts","../src/modules/packages/env/templates/auth.ts","../src/modules/packages/env/templates/index.ts","../src/modules/packages/env/templates/check.ts","../src/modules/packages/auth/index.ts","../src/modules/docker/index.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { runWorkspaceScaffolder } from './core/runner.js';\n\nasync function main() {\n const isReactOnly =\n process.argv.includes('--react') || process.argv.includes('-r');\n const isNextOnly =\n process.argv.includes('--nextjs') ||\n process.argv.includes('--next') ||\n process.argv.includes('-n');\n await runWorkspaceScaffolder({ react: isReactOnly, next: isNextOnly });\n}\n\nmain().catch((err) => {\n console.error(pc.red('Fatal Error during execution:'), err);\n process.exit(1);\n});\n","import path from 'path';\nimport { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\n\nimport { startCli } from './startcli.js';\nimport {\n runPreflightChecks,\n checkTargetDirectory,\n checkBunAvailable,\n} from './preflight.js';\nimport { promptWorkspaceName } from './workspaceName.js';\nimport {\n askLinter,\n askFormatter,\n askGitHooks,\n askRedis,\n askServerRuntime,\n} from './prompts.js';\nimport { endCli } from './endcli.js';\nimport { runCommand } from '../utils/exec.js';\n\nimport { runReactScaffolder } from '../standalone/react-runner.js';\nimport { runNextScaffolder } from '../standalone/next-runner.js';\n\nimport { makeDirectories } from '../modules/workspace/directories.js';\nimport { setupReadme } from '../modules/workspace/readme.js';\nimport { promptAndSetupExtras } from '../modules/workspace/extras.js';\nimport { promptAndInstallSkills } from '../modules/skills/index.js';\nimport { setupRootEnv } from '../modules/workspace/env.js';\nimport { runGitSetup } from '../modules/git/git.js';\nimport { runHuskySetup } from '../modules/git/husky.js';\nimport { runLefthookSetup } from '../modules/git/lefthook.js';\nimport { runBiomeSetup } from '../modules/quality/biome.js';\nimport { runOxlintSetup } from '../modules/quality/oxlint.js';\nimport { runPrettierSetup } from '../modules/quality/prettier.js';\nimport { runTypescriptSetup } from '../modules/packages/typescript.js';\nimport {\n runDatabaseSetup,\n promptDatabase,\n} from '../modules/packages/db/index.js';\nimport {\n runServerSetup,\n promptServerFramework,\n promptServerDeployment,\n setupServerDeployment,\n} from '../modules/apps/server/index.js';\nimport { addWeb } from '../modules/apps/web/index.js';\nimport { runEnvSetup, promptEnv } from '../modules/packages/env/index.js';\nimport { promptAuth, setupAuth } from '../modules/packages/auth/index.js';\nimport { setupDocker } from '../modules/docker/index.js';\nimport type { GitHookType, ServerRuntime } from '../types/index.js';\n\nexport async function runWorkspaceScaffolder(\n options: { react?: boolean; next?: boolean } = {},\n) {\n // 1. Greet and display premium logo\n startCli();\n\n // 2. Preflight checks (Enforce Node.js v22+ and check tools)\n await runPreflightChecks();\n\n const isMonorepo = !options.react && !options.next;\n\n // 3. Prompt for Name (Optional, defaults to morax-workspace or my-app)\n const name = await promptWorkspaceName(isMonorepo);\n const projectPath = path.join(process.cwd(), name);\n\n // 4. Verify target directory is clean and available\n await checkTargetDirectory(projectPath, name);\n\n if (options.react) {\n await runReactScaffolder(name, projectPath);\n return;\n }\n\n if (options.next) {\n await runNextScaffolder(name, projectPath);\n return;\n }\n\n // 5. Initialize workspace folders and pnpm-workspace.yaml\n await makeDirectories(name, projectPath);\n\n // =========================================================================\n // STEP 1: Git Repository & Git Hooks (Ask -> Setup)\n // =========================================================================\n const gitInitialized = await runGitSetup(projectPath);\n\n let gitHook: GitHookType = 'none';\n if (gitInitialized) {\n gitHook = await askGitHooks();\n if (gitHook === 'husky') {\n await runHuskySetup(projectPath, gitInitialized);\n } else if (gitHook === 'lefthook') {\n await runLefthookSetup(projectPath, gitInitialized);\n }\n }\n\n // =========================================================================\n // STEP 2: Frontend Web Application (Ask -> Setup)\n // =========================================================================\n const webFramework = await addWeb(projectPath);\n\n // =========================================================================\n // STEP 3: Code Quality & Modular TypeScript (Ask -> Setup)\n // =========================================================================\n // Dynamically recommend Oxlint for React + Vite, Biome for Next.js\n const linter = await askLinter(webFramework);\n const formatter = await askFormatter(linter);\n\n // Execute Biome setup if Biome was chosen for either linting or formatting\n if (linter === 'biome' || formatter === 'biome') {\n await runBiomeSetup(projectPath, {\n linter: linter === 'biome',\n formatter: formatter === 'biome',\n });\n }\n\n // Execute Oxlint setup if selected\n if (linter === 'oxlint') {\n await runOxlintSetup(projectPath);\n }\n\n // Execute Prettier setup if selected\n if (formatter === 'prettier') {\n await runPrettierSetup(projectPath);\n }\n\n // Execute modular TypeScript setup in packages/typescript\n await runTypescriptSetup(projectPath);\n\n // =========================================================================\n // STEP 4: Backend Server (Ask Framework, Runtime & Deployment)\n // =========================================================================\n const serverFramework = await promptServerFramework();\n let serverRuntime: ServerRuntime = 'node';\n let deployTarget = 'none';\n if (serverFramework !== 'none') {\n serverRuntime = await askServerRuntime();\n if (serverRuntime === 'bun') {\n await checkBunAvailable();\n }\n deployTarget = await promptServerDeployment(serverFramework);\n }\n\n // =========================================================================\n // STEP 5: Database & Docker Layer (Ask -> Setup)\n // =========================================================================\n const dbConfig = await promptDatabase();\n const setupRedis = await askRedis();\n\n if (dbConfig.orm !== 'none') {\n await runDatabaseSetup(projectPath, dbConfig, linter);\n }\n\n // Setup root Docker infrastructure if Postgres (Docker) or Redis is selected\n const isPostgresDocker =\n dbConfig.orm === 'drizzle' &&\n dbConfig.dialect === 'postgresql' &&\n dbConfig.postgresProvider === 'docker';\n\n if (isPostgresDocker || setupRedis) {\n await setupDocker(projectPath, {\n projectName: name,\n postgres: isPostgresDocker,\n redis: setupRedis,\n });\n }\n\n // If backend server is configured, execute server setup now with DB awareness\n if (serverFramework !== 'none') {\n await runServerSetup(\n projectPath,\n serverFramework,\n linter,\n dbConfig.orm,\n serverRuntime,\n );\n\n if (deployTarget !== 'none') {\n await setupServerDeployment({\n projectPath,\n framework: serverFramework,\n runtime: serverRuntime,\n target: deployTarget as any,\n });\n }\n }\n\n // =========================================================================\n // STEP 6: Environment & Authentication Packages (@repo/env & @repo/auth)\n // =========================================================================\n const shouldSetupEnv = await promptEnv();\n\n let shouldSetupAuth = false;\n if (dbConfig.orm === 'drizzle') {\n shouldSetupAuth = await promptAuth();\n }\n\n // Write root .env and .env.example\n await setupRootEnv(projectPath, {\n db: dbConfig,\n redis: setupRedis,\n hasServer: serverFramework !== 'none',\n hasAuth: shouldSetupAuth,\n webFramework,\n });\n\n // Setup type-safe environment package (@repo/env)\n if (shouldSetupEnv) {\n await runEnvSetup(projectPath, {\n projectPath,\n hasDb: dbConfig.orm !== 'none',\n dbDialect: dbConfig.dialect,\n postgresProvider: dbConfig.postgresProvider,\n hasDocker: isPostgresDocker || setupRedis,\n hasRedis: setupRedis,\n hasServer: serverFramework !== 'none',\n hasAuth: shouldSetupAuth,\n webFramework,\n });\n }\n\n // Setup Better Auth package (@repo/auth)\n if (shouldSetupAuth) {\n await setupAuth({\n projectPath,\n dialect: dbConfig.dialect,\n serverFramework,\n serverRuntime,\n webFramework,\n hasServer: serverFramework !== 'none',\n hasWeb: webFramework !== 'skip',\n hasEnv: shouldSetupEnv,\n });\n }\n\n // =========================================================================\n // STEP 7: Documentation, AI Agent Guidelines & License (Optional)\n // =========================================================================\n const extras = await promptAndSetupExtras(projectPath, {\n projectName: name,\n hasServer: serverFramework !== 'none',\n serverFramework: serverFramework !== 'none' ? serverFramework : undefined,\n serverRuntime: serverFramework !== 'none' ? serverRuntime : undefined,\n hasDb: dbConfig.orm !== 'none',\n orm: dbConfig.orm === 'drizzle' ? 'drizzle' : undefined,\n dbDialect: dbConfig.dialect,\n postgresProvider: dbConfig.postgresProvider,\n hasDocker: isPostgresDocker || setupRedis,\n dockerServices: {\n postgres: isPostgresDocker,\n redis: setupRedis,\n },\n hasRedis: setupRedis,\n webFramework,\n linter,\n formatter,\n hasEnv: shouldSetupEnv,\n hasAuth: shouldSetupAuth,\n });\n\n await setupReadme(projectPath, name, {\n hasDb: dbConfig.orm !== 'none',\n orm: dbConfig.orm,\n hasDocker: isPostgresDocker || setupRedis,\n hasDockerScripts: extras.hasScripts,\n hasAuth: shouldSetupAuth,\n dockerServices: {\n postgres: isPostgresDocker,\n redis: setupRedis,\n },\n });\n\n // =========================================================================\n // STEP 8: Curated AI Agent Skills (skills.sh) (Optional)\n // =========================================================================\n await promptAndInstallSkills(projectPath);\n\n // Final pnpm install to resolve all workspace packages, symlinks & dependencies\n const s = spinner();\n s.start('Running final workspace package installation...');\n try {\n await runCommand('pnpm install', { cwd: projectPath, silent: true });\n s.stop(\n pc.green(\n '✔ Success: Workspace dependencies and symlinks configured successfully',\n ),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Warning: Final workspace installation failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n }\n\n // Complete and show finish screen\n endCli(name, projectPath, {\n hasDb: dbConfig.orm !== 'none',\n orm: dbConfig.orm,\n hasDocker: isPostgresDocker || setupRedis,\n hasDockerScripts: extras.hasScripts,\n dockerServices: {\n postgres: isPostgresDocker,\n redis: setupRedis,\n },\n });\n}\n","import gradient from 'gradient-string';\nimport pc from 'picocolors';\nimport { intro } from '@clack/prompts';\nimport boxen from 'boxen';\n\nconst asciiArt = [\n '███╗ ███╗ ██████╗ ██████╗ █████╗ ██╗ ██╗',\n '████╗ ████║ ██╔═══██╗ ██╔══██╗ ██╔══██╗ ╚██╗██╔╝',\n '██╔████╔██║ ██║ ██║ ██████╔╝ ███████║ ╚███╔╝ ',\n '██║╚██╔╝██║ ██║ ██║ ██╔══██╗ ██╔══██║ ██╔██╗ ',\n '██║ ╚═╝ ██║ ╚██████╔╝ ██║ ██║ ██║ ██║ ██╔╝ ██╗',\n '╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝',\n].join('\\n');\n\nexport function startCli() {\n console.clear();\n\n // Premium fiery orange-to-yellow brand gradient\n const moraxGradient = gradient(['#FF3E00', '#FF8C00', '#FFAE19']);\n\n console.log('\\n');\n console.log(moraxGradient(asciiArt));\n console.log('\\n');\n\n intro(pc.yellow('🌌 Welcome to Morax — The Next-Gen Workspace Scaffolder'));\n\n console.log(\n boxen(\n `⚡ ${pc.bold('Morax')} automates the setup of modern ${pc.cyan('pnpm workspaces')}, linking internal shared configurations, UI packages, and framework apps concurrently.`,\n {\n padding: 1,\n margin: { top: 0, bottom: 1, left: 1, right: 1 },\n borderStyle: 'round',\n borderColor: 'yellow',\n },\n ),\n );\n}\n","import ora from 'ora';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport { runCommand } from '../utils/exec.js';\n\nexport interface PreflightResult {\n nodeVersion: string;\n pnpmVersion: string;\n bunVersion: string | null;\n dockerVersion: string | null;\n gitVersion: string;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport async function runPreflightChecks(): Promise<PreflightResult> {\n const tick = pc.cyan('✔');\n const cross = pc.red('✖');\n const warn = pc.yellow('⚠');\n\n // 1. Initial header\n const headerSpinner = ora({\n text: 'Preflight checks.',\n color: 'cyan',\n }).start();\n await sleep(120);\n headerSpinner.stopAndPersist({\n symbol: tick,\n text: 'Preflight checks.',\n });\n\n // 2. Node.js check (Strictly enforce Node >= 22)\n const nodeSpinner = ora({\n text: 'Verifying Node.js version...',\n color: 'cyan',\n }).start();\n await sleep(150);\n\n const nodeVersion = process.version;\n const majorVersion = parseInt(process.versions.node.split('.')[0], 10);\n\n if (isNaN(majorVersion) || majorVersion < 22) {\n nodeSpinner.stopAndPersist({\n symbol: cross,\n text: `Verifying Node.js version. Found ${pc.red(nodeVersion)} (v22+ required).`,\n });\n console.log(\n '\\n' +\n pc.red(`✖ Error: Node.js v22 or higher is required to run Morax.\\n`) +\n pc.cyan(\n ' • Official installer: https://nodejs.org\\n' +\n ' • Using nvm: nvm install 22 && nvm use 22\\n' +\n ' • Using fnm: fnm install 22 && fnm use 22\\n',\n ),\n );\n process.exit(1);\n }\n\n nodeSpinner.stopAndPersist({\n symbol: tick,\n text: `Verifying Node.js version. Found ${pc.cyan(nodeVersion)}.`,\n });\n\n // 3. pnpm check\n const pnpmSpinner = ora({\n text: 'Verifying pnpm installation...',\n color: 'cyan',\n }).start();\n await sleep(150);\n\n let pnpmVersion = '';\n try {\n const { stdout } = await runCommand('pnpm --version', { silent: true });\n pnpmVersion = stdout.trim();\n if (!pnpmVersion.startsWith('v')) {\n pnpmVersion = `v${pnpmVersion}`;\n }\n pnpmSpinner.stopAndPersist({\n symbol: tick,\n text: `Verifying pnpm version. Found ${pc.cyan(pnpmVersion)}.`,\n });\n } catch {\n pnpmSpinner.stopAndPersist({\n symbol: cross,\n text: 'Verifying pnpm version. Not found.',\n });\n console.log(\n '\\n' +\n pc.red(\n '✖ Error: pnpm is required to create and manage Morax workspaces.\\n',\n ) +\n pc.cyan(' • Install pnpm globally: npm install -g pnpm\\n') +\n pc.dim(' • Documentation: https://pnpm.io/installation\\n'),\n );\n process.exit(1);\n }\n\n // 4. Bun check (Optional)\n const bunSpinner = ora({\n text: 'Verifying Bun runtime...',\n color: 'cyan',\n }).start();\n await sleep(150);\n\n let bunVersion: string | null = null;\n try {\n const { stdout } = await runCommand('bun --version', { silent: true });\n bunVersion = stdout.trim();\n if (!bunVersion.startsWith('v')) {\n bunVersion = `v${bunVersion}`;\n }\n bunSpinner.stopAndPersist({\n symbol: tick,\n text: `Verifying Bun runtime. Found ${pc.cyan(bunVersion)}.`,\n });\n } catch {\n bunSpinner.stopAndPersist({\n symbol: warn,\n text: `Verifying Bun runtime. ${pc.yellow('Not found')} (optional).`,\n });\n }\n\n // 5. Docker check (Optional warning)\n const dockerSpinner = ora({\n text: 'Verifying Docker installation...',\n color: 'cyan',\n }).start();\n await sleep(150);\n\n let dockerVersion: string | null = null;\n try {\n const { stdout } = await runCommand('docker --version', { silent: true });\n const match = stdout.match(/\\d+\\.\\d+\\.\\d+/);\n dockerVersion = match ? `v${match[0]}` : stdout.trim();\n dockerSpinner.stopAndPersist({\n symbol: tick,\n text: `Verifying Docker installation. Found ${pc.cyan(dockerVersion)}.`,\n });\n } catch {\n dockerSpinner.stopAndPersist({\n symbol: warn,\n text: `Verifying Docker installation. ${pc.yellow('Not found')} (optional).`,\n });\n }\n\n // 6. Git check (Optional)\n const gitSpinner = ora({\n text: 'Verifying Git installation...',\n color: 'cyan',\n }).start();\n await sleep(150);\n\n let gitVersion = '';\n try {\n const { stdout } = await runCommand('git --version', { silent: true });\n const match = stdout.match(/\\d+\\.\\d+\\.\\d+/);\n gitVersion = match ? `v${match[0]}` : stdout.trim();\n gitSpinner.stopAndPersist({\n symbol: tick,\n text: `Verifying Git installation. Found ${pc.cyan(gitVersion)}.`,\n });\n } catch {\n gitSpinner.stopAndPersist({\n symbol: warn,\n text: `Verifying Git installation. ${pc.yellow('Not found')} (skipping Git features).`,\n });\n }\n\n console.log(''); // Clean spacing before prompts start\n\n return {\n nodeVersion,\n pnpmVersion,\n bunVersion,\n dockerVersion,\n gitVersion,\n };\n}\n\nexport async function checkTargetDirectory(\n projectPath: string,\n name: string,\n): Promise<void> {\n try {\n const files = await fsPromises.readdir(projectPath);\n if (files.length > 0) {\n console.log(\n '\\n' +\n pc.red(\n `✖ Target directory \"${name}\" already exists and contains files.`,\n ) +\n '\\n' +\n pc.cyan(\n ' Please choose a different workspace name or empty the directory.\\n',\n ),\n );\n process.exit(1);\n }\n } catch {\n // Directory does not exist yet; safe to proceed\n }\n}\n\nexport async function checkBunAvailable(): Promise<boolean> {\n try {\n await runCommand('bun --version', { silent: true });\n return true;\n } catch {\n console.log(\n '\\n' +\n pc.yellow(\n '⚠ Warning: Bun is required to run \"pnpm dev\" in apps/server.\\n',\n ) +\n pc.cyan(\n ' • Windows: powershell -c \"irm bun.sh/install.ps1 | iex\"\\n' +\n ' • macOS/Linux: curl -fsSL https://bun.sh/install | bash\\n' +\n ' • Documentation: https://bun.sh\\n',\n ),\n );\n return false;\n }\n}\n","import { exec } from 'child_process';\nimport { promisify } from 'util';\nimport pc from 'picocolors';\n\nconst execAsync = promisify(exec);\n\nexport interface RunCommandOptions {\n cwd?: string;\n silent?: boolean;\n}\n\n/**\n * Reusable helper to execute commands and print/return their outputs\n */\nexport async function runCommand(\n command: string,\n options: RunCommandOptions = {},\n) {\n options.silent = true;\n\n if (!options.silent) {\n console.log(pc.cyan(`> ${command}`));\n }\n\n try {\n const { stdout, stderr } = await execAsync(command, {\n cwd: options.cwd,\n env: { ...process.env, NODE_NO_WARNINGS: '1' },\n });\n\n if (!options.silent) {\n if (stdout && stdout.trim()) {\n console.log(stdout.trim());\n }\n if (stderr && stderr.trim()) {\n console.log(pc.yellow(stderr.trim()));\n }\n }\n\n return { stdout, stderr };\n } catch (error: any) {\n if (!options.silent) {\n if (error.stdout && error.stdout.trim()) {\n console.log(error.stdout.trim());\n }\n if (error.stderr && error.stderr.trim()) {\n console.error(pc.red(error.stderr.trim()));\n }\n }\n throw error;\n }\n}\n","import { text } from '@clack/prompts';\nimport handleCancel from '../utils/isCancel.js';\n\nexport async function promptWorkspaceName(isMonorepo = true): Promise<string> {\n const nameInput = await text({\n message: isMonorepo\n ? 'What is the name of your new monorepo workspace?'\n : 'What is the name of your new project?',\n placeholder: isMonorepo ? 'morax-workspace' : 'my-app',\n validate(value) {\n if (value && value.includes(' '))\n return isMonorepo\n ? 'Workspace name cannot contain spaces!'\n : 'Project name cannot contain spaces!';\n },\n });\n\n handleCancel(nameInput);\n\n // Fallback to defaults if left blank\n return (\n String(nameInput).trim() || (isMonorepo ? 'morax-workspace' : 'my-app')\n );\n}\n","import { isCancel, cancel } from '@clack/prompts';\nimport pc from 'picocolors';\n\nexport default function handleCancel(input: any) {\n if (isCancel(input)) {\n cancel(pc.red('✖ Morax cancelled.'));\n process.exit(0);\n }\n}\n","import { multiselect, select } from '@clack/prompts';\nimport handleCancel from '../utils/isCancel.js';\nimport { promptDatabase } from '../modules/packages/db/index.js';\nimport type {\n FormatterType,\n GitHookType,\n LinterType,\n ServerRuntime,\n WebFramework,\n WorkspaceAnswers,\n} from '../types/index.js';\n\nexport async function askApps(): Promise<('web' | 'server')[]> {\n const apps = await multiselect({\n message: 'Which applications would you like to include in apps/?',\n options: [\n {\n value: 'web',\n label: 'Frontend Apps',\n hint: 'Next.js, Vite',\n },\n {\n value: 'server',\n label: 'Backend Server',\n hint: 'Express, Hono',\n },\n ],\n required: false,\n });\n\n handleCancel(apps);\n return apps as ('web' | 'server')[];\n}\n\nexport async function askServerRuntime(): Promise<ServerRuntime> {\n const runtime = await select({\n message: 'Which runtime would you like to use for the backend server?',\n options: [\n {\n value: 'node',\n label: 'Node.js',\n hint: 'Standard Node runtime',\n },\n {\n value: 'bun',\n label: 'Bun',\n hint: 'Fast all-in-one runtime',\n },\n ],\n initialValue: 'node',\n });\n\n handleCancel(runtime);\n return runtime as ServerRuntime;\n}\n\nexport async function askLinter(\n webFramework?: WebFramework,\n): Promise<LinterType> {\n const isNext = webFramework === 'nextjs';\n const isReact = webFramework === 'react';\n\n const options = isNext\n ? [\n {\n value: 'biome',\n label: 'Biome (Recommended for Next.js)',\n hint: 'Fast Rust-based all-in-one toolchain',\n },\n {\n value: 'oxlint',\n label: 'Oxlint',\n hint: 'Fast Rust linter',\n },\n {\n value: 'none',\n label: 'None',\n hint: 'Skip',\n },\n ]\n : [\n {\n value: 'oxlint',\n label: isReact ? 'Oxlint (Recommended for React + Vite)' : 'Oxlint',\n hint: 'Fast Rust linter',\n },\n {\n value: 'biome',\n label: 'Biome',\n hint: 'Rust toolchain',\n },\n {\n value: 'none',\n label: 'None',\n hint: 'Skip',\n },\n ];\n\n const initialValue: LinterType = isNext ? 'biome' : 'oxlint';\n\n const linter = await select({\n message: 'Which linter would you like to use?',\n options,\n initialValue,\n });\n\n handleCancel(linter);\n return linter as LinterType;\n}\n\nexport async function askFormatter(\n linter?: LinterType,\n): Promise<FormatterType> {\n const initialValue: FormatterType = linter === 'biome' ? 'biome' : 'prettier';\n\n const formatter = await select({\n message: 'Which code formatter would you like to use?',\n options: [\n {\n value: 'prettier',\n label: 'Prettier',\n hint: 'Standard formatter',\n },\n {\n value: 'biome',\n label:\n linter === 'biome' ? 'Biome (Included with Biome linter)' : 'Biome',\n hint: 'Fast formatter',\n },\n {\n value: 'none',\n label: 'None',\n hint: 'Skip',\n },\n ],\n initialValue,\n });\n\n handleCancel(formatter);\n return formatter as FormatterType;\n}\n\nexport async function askGitHooks(): Promise<GitHookType> {\n const hook = await select({\n message: 'Which Git hooks manager would you like to set up?',\n options: [\n {\n value: 'lefthook',\n label: 'Lefthook',\n hint: 'Fast Go-based',\n },\n {\n value: 'husky',\n label: 'Husky',\n hint: 'Classic pre-commit',\n },\n {\n value: 'none',\n label: 'None',\n hint: 'Skip',\n },\n ],\n initialValue: 'lefthook',\n });\n\n handleCancel(hook);\n return hook as GitHookType;\n}\n\nexport async function askTypescript(): Promise<boolean> {\n const choice = await select({\n message: 'Do you want to configure shared TypeScript configurations?',\n options: [\n {\n value: 'yes',\n label: 'Yes',\n hint: '@config/typescript',\n },\n {\n value: 'no',\n label: 'No',\n hint: 'Skip',\n },\n ],\n initialValue: 'yes',\n });\n\n handleCancel(choice);\n return choice === 'yes';\n}\n\nexport async function askRedis(): Promise<boolean> {\n const choice = await select({\n message: 'Do you want to setup Redis using Docker?',\n options: [\n {\n value: 'yes',\n label: 'Yes',\n hint: 'Docker container',\n },\n {\n value: 'no',\n label: 'No',\n hint: 'Skip',\n },\n ],\n initialValue: 'no',\n });\n\n handleCancel(choice);\n return choice === 'yes';\n}\n\nexport async function promptWorkspaceOptions(): Promise<WorkspaceAnswers> {\n const selectedApps = await askApps();\n const db = await promptDatabase();\n const setupRedis = await askRedis();\n const linter = await askLinter();\n const formatter = await askFormatter();\n const gitHook = await askGitHooks();\n const includeTypescript = await askTypescript();\n\n return {\n name: '',\n projectPath: '',\n gitInitialized: false,\n selectedApps,\n db,\n setupRedis,\n linter,\n formatter,\n gitHook,\n includeTypescript,\n };\n}\n","import { select } from '@clack/prompts';\nimport handleCancel from '../../../utils/isCancel.js';\nimport { promptDrizzle, runDrizzleSetup } from './drizzle.js';\nimport type { DbDialect, DbSelection, OrmType } from '../../../types/index.js';\n\nexport type { OrmType, DbSelection };\n\nexport async function promptDatabase(): Promise<DbSelection> {\n const ormChoice = await select({\n message: 'Which ORM would you like to configure in packages/db?',\n options: [\n {\n value: 'drizzle',\n label: 'Drizzle ORM',\n hint: 'PostgreSQL & SQLite',\n },\n {\n value: 'none',\n label: 'None',\n hint: 'Skip',\n },\n ],\n initialValue: 'drizzle',\n });\n\n handleCancel(ormChoice);\n\n if (ormChoice === 'drizzle') {\n const config = await promptDrizzle();\n return {\n orm: 'drizzle',\n dialect: config.dialect,\n postgresProvider: config.postgresProvider,\n neonMode: config.neonMode,\n };\n }\n\n return { orm: 'none' };\n}\n\nexport async function runDatabaseSetup(\n projectPath: string,\n selection: DbSelection,\n linter: string = 'none',\n) {\n if (selection.orm === 'drizzle' && selection.dialect) {\n await runDrizzleSetup(\n projectPath,\n selection.dialect,\n linter,\n selection.postgresProvider,\n selection.neonMode,\n );\n }\n}\n","import { select, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../../../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../../utils/exec.js';\nimport type {\n DbDialect,\n NeonConnectionMode,\n PostgresProvider,\n} from '../../../types/index.js';\n\nexport async function promptDrizzle(): Promise<{\n dialect: DbDialect;\n postgresProvider?: PostgresProvider;\n neonMode?: NeonConnectionMode;\n}> {\n const dialectChoice = await select({\n message: 'Which database dialect would you like to use with Drizzle?',\n options: [\n {\n value: 'postgresql',\n label: 'PostgreSQL',\n hint: 'Docker / Neon',\n },\n {\n value: 'sqlite',\n label: 'SQLite',\n hint: 'LibSQL / Turso',\n },\n ],\n initialValue: 'postgresql',\n });\n\n handleCancel(dialectChoice);\n const dialect = dialectChoice as DbDialect;\n\n if (dialect === 'postgresql') {\n const providerChoice = await select({\n message: 'Which PostgreSQL setup would you like to use?',\n options: [\n {\n value: 'docker',\n label: 'Docker (Local)',\n hint: 'docker-compose.yml',\n },\n {\n value: 'neon',\n label: 'Neon (Serverless)',\n hint: 'Serverless cloud',\n },\n ],\n initialValue: 'docker',\n });\n\n handleCancel(providerChoice);\n const postgresProvider = providerChoice as PostgresProvider;\n\n let neonMode: NeonConnectionMode | undefined;\n if (postgresProvider === 'neon') {\n const modeChoice = await select({\n message: 'Which connection mode would you like to use with Neon?',\n options: [\n {\n value: 'serverless',\n label: 'Serverless HTTP',\n hint: 'neon-http (edge)',\n },\n {\n value: 'pool',\n label: 'Connection Pool',\n hint: 'WebSocket pool',\n },\n ],\n initialValue: 'serverless',\n });\n\n handleCancel(modeChoice);\n neonMode = modeChoice as NeonConnectionMode;\n }\n\n return { dialect, postgresProvider, neonMode };\n }\n\n return { dialect };\n}\n\nexport async function setupDrizzle(\n projectPath: string,\n dialect: DbDialect = 'postgresql',\n linter: string = 'none',\n postgresProvider: PostgresProvider = 'docker',\n neonMode: NeonConnectionMode = 'serverless',\n) {\n const dbDir = path.join(projectPath, 'packages', 'db');\n const srcDir = path.join(dbDir, 'src');\n const schemaDir = path.join(srcDir, 'schema');\n const seedDir = path.join(srcDir, 'seed');\n\n // 1. Create directory structure packages/db/src/{schema,seed} recursively\n await fsPromises.mkdir(schemaDir, { recursive: true });\n await fsPromises.mkdir(seedDir, { recursive: true });\n\n // 2. Initialize package.json using pnpm init\n await runCommand('pnpm init', { cwd: dbDir, silent: true });\n\n // 3. Customize packages/db/package.json\n const dbPackagePath = path.join(dbDir, 'package.json');\n const dbPackageRaw = await fsPromises.readFile(dbPackagePath, 'utf8');\n const dbPkg = JSON.parse(dbPackageRaw);\n\n const providerLabel =\n dialect === 'sqlite'\n ? 'SQLite'\n : postgresProvider === 'neon'\n ? `PostgreSQL (Neon ${neonMode === 'pool' ? 'Pool' : 'Serverless'})`\n : 'PostgreSQL (Docker)';\n\n dbPkg.name = '@repo/db';\n dbPkg.version = '1.0.0';\n dbPkg.description = `Shared Drizzle ORM database layer (${providerLabel})`;\n dbPkg.private = true;\n dbPkg.type = 'module';\n dbPkg.main = './src/index.ts';\n dbPkg.types = './src/index.ts';\n dbPkg.exports = {\n '.': {\n types: './src/index.ts',\n default: './src/index.ts',\n },\n './schema': {\n types: './src/schema/index.ts',\n default: './src/schema/index.ts',\n },\n };\n dbPkg.scripts = {\n build: 'tsc',\n 'db:generate': 'drizzle-kit generate',\n 'db:migrate': 'drizzle-kit migrate',\n 'db:push': 'drizzle-kit push',\n 'db:seed': 'tsx src/seed/seed.ts',\n 'db:studio': 'drizzle-kit studio',\n 'db:check': 'drizzle-kit check',\n };\n if (linter === 'biome') {\n dbPkg.scripts.lint = 'biome lint .';\n } else if (linter === 'oxlint') {\n dbPkg.scripts.lint = 'oxlint .';\n }\n\n dbPkg.devDependencies = {\n '@config/typescript': 'workspace:*',\n };\n\n // Remove defaults that are not needed\n delete dbPkg.keywords;\n delete dbPkg.author;\n delete dbPkg.license;\n\n await fsPromises.writeFile(\n dbPackagePath,\n JSON.stringify(dbPkg, null, 2),\n 'utf8',\n );\n\n // 4. Create tsconfig.json matching rootDir: . and node types for drizzle.config.ts\n const tsconfigContent = {\n extends: '@config/typescript/tsconfig.json',\n compilerOptions: {\n rootDir: '.',\n outDir: 'dist',\n declaration: true,\n types: ['node'],\n },\n include: ['src/**/*', 'drizzle.config.ts'],\n };\n\n await fsPromises.writeFile(\n path.join(dbDir, 'tsconfig.json'),\n JSON.stringify(tsconfigContent, null, 2),\n 'utf8',\n );\n\n // 5. Install dependencies dynamically using pnpm add (using @rc for latest Drizzle)\n if (dialect === 'sqlite') {\n await runCommand('pnpm add drizzle-orm@rc @libsql/client dotenv', {\n cwd: dbDir,\n silent: false,\n });\n } else if (postgresProvider === 'neon') {\n await runCommand(\n 'pnpm add drizzle-orm@rc @neondatabase/serverless dotenv',\n {\n cwd: dbDir,\n silent: false,\n },\n );\n } else {\n // Docker / standard PostgreSQL\n await runCommand('pnpm add drizzle-orm@rc pg dotenv @types/pg', {\n cwd: dbDir,\n silent: false,\n });\n }\n\n await runCommand(\n 'pnpm add -D drizzle-kit@rc @types/node tsx typescript@latest',\n {\n cwd: dbDir,\n silent: false,\n },\n );\n\n // 6. Generate drizzle.config.ts with package-relative .env loading\n const envVar = dialect === 'sqlite' ? 'DB_FILE_NAME' : 'DATABASE_URL';\n\n const drizzleConfigContent = [\n \"import { config } from 'dotenv';\",\n \"import { defineConfig } from 'drizzle-kit';\",\n \"import path from 'node:path';\",\n \"import { fileURLToPath } from 'node:url';\",\n '',\n 'const packageDir = path.dirname(fileURLToPath(import.meta.url));',\n \"const workspaceRoot = path.resolve(packageDir, '../..');\",\n \"config({ path: path.join(workspaceRoot, '.env') });\",\n \"config({ path: path.join(packageDir, '.env'), override: true });\",\n '',\n `if (!process.env.${envVar}) {`,\n ` throw new Error('${envVar} environment variable is required');`,\n '}',\n '',\n 'export default defineConfig({',\n \" out: './drizzle',\",\n \" schema: './src/schema/index.ts',\",\n ` dialect: '${dialect}',`,\n ' dbCredentials: {',\n ` url: process.env.${envVar}!,`,\n ' },',\n '});',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(dbDir, 'drizzle.config.ts'),\n drizzleConfigContent,\n 'utf8',\n );\n\n // 7. Generate src/schema/index.ts\n let schemaContent: string;\n if (dialect === 'sqlite') {\n schemaContent = [\n \"import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';\",\n '',\n \"export const users = sqliteTable('users', {\",\n \" id: int('id').primaryKey({ autoIncrement: true }),\",\n \" name: text('name').notNull(),\",\n \" email: text('email').notNull().unique(),\",\n \" createdAt: text('created_at')\",\n ' .$defaultFn(() => new Date().toISOString())',\n ' .notNull(),',\n \" updatedAt: text('updated_at')\",\n ' .$defaultFn(() => new Date().toISOString())',\n ' .notNull(),',\n '});',\n '',\n 'export type User = typeof users.$inferSelect;',\n 'export type NewUser = typeof users.$inferInsert;',\n '',\n ].join('\\n');\n } else {\n // Both Docker and Neon PostgreSQL use drizzle-orm/pg-core\n schemaContent = [\n \"import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core';\",\n '',\n \"export const users = pgTable('users', {\",\n \" id: uuid('id').defaultRandom().primaryKey(),\",\n \" name: text('name').notNull(),\",\n \" email: text('email').notNull().unique(),\",\n \" createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),\",\n \" updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),\",\n '});',\n '',\n 'export type User = typeof users.$inferSelect;',\n 'export type NewUser = typeof users.$inferInsert;',\n '',\n ].join('\\n');\n }\n\n await fsPromises.writeFile(\n path.join(schemaDir, 'index.ts'),\n schemaContent,\n 'utf8',\n );\n\n // 8. Generate src/client.ts with strict environment variable checks\n let clientContent: string;\n if (dialect === 'sqlite') {\n clientContent = [\n \"import { config } from 'dotenv';\",\n \"import path from 'node:path';\",\n \"import { fileURLToPath } from 'node:url';\",\n \"import { drizzle } from 'drizzle-orm/libsql';\",\n \"import { createClient } from '@libsql/client';\",\n \"import * as schema from './schema/index.js';\",\n '',\n 'const srcDir = path.dirname(fileURLToPath(import.meta.url));',\n \"const workspaceRoot = path.resolve(srcDir, '../../..');\",\n \"const packageRoot = path.resolve(srcDir, '..');\",\n \"config({ path: path.join(workspaceRoot, '.env') });\",\n \"config({ path: path.join(packageRoot, '.env'), override: true });\",\n '',\n 'if (!process.env.DB_FILE_NAME) {',\n \" throw new Error('DB_FILE_NAME environment variable is required');\",\n '}',\n '',\n 'export const client = createClient({ url: process.env.DB_FILE_NAME });',\n 'export const db = drizzle({ client, schema });',\n 'export type Database = typeof db;',\n '',\n ].join('\\n');\n } else if (postgresProvider === 'neon') {\n if (neonMode === 'pool') {\n // Neon WebSocket Pool\n clientContent = [\n \"import { config } from 'dotenv';\",\n \"import path from 'node:path';\",\n \"import { fileURLToPath } from 'node:url';\",\n \"import { drizzle } from 'drizzle-orm/neon-serverless';\",\n \"import { Pool } from '@neondatabase/serverless';\",\n \"import * as schema from './schema/index.js';\",\n '',\n 'const srcDir = path.dirname(fileURLToPath(import.meta.url));',\n \"const workspaceRoot = path.resolve(srcDir, '../../..');\",\n \"const packageRoot = path.resolve(srcDir, '..');\",\n \"config({ path: path.join(workspaceRoot, '.env') });\",\n \"config({ path: path.join(packageRoot, '.env'), override: true });\",\n '',\n 'if (!process.env.DATABASE_URL) {',\n \" throw new Error('DATABASE_URL environment variable is required');\",\n '}',\n '',\n 'export const pool = new Pool({',\n ' connectionString: process.env.DATABASE_URL,',\n '});',\n '',\n 'export const db = drizzle({ client: pool, schema } as any);',\n 'export type Database = typeof db;',\n '',\n ].join('\\n');\n } else {\n // Neon Serverless HTTP\n clientContent = [\n \"import { config } from 'dotenv';\",\n \"import path from 'node:path';\",\n \"import { fileURLToPath } from 'node:url';\",\n \"import { drizzle } from 'drizzle-orm/neon-http';\",\n \"import { neon } from '@neondatabase/serverless';\",\n \"import * as schema from './schema/index.js';\",\n '',\n 'const srcDir = path.dirname(fileURLToPath(import.meta.url));',\n \"const workspaceRoot = path.resolve(srcDir, '../../..');\",\n \"const packageRoot = path.resolve(srcDir, '..');\",\n \"config({ path: path.join(workspaceRoot, '.env') });\",\n \"config({ path: path.join(packageRoot, '.env'), override: true });\",\n '',\n 'if (!process.env.DATABASE_URL) {',\n \" throw new Error('DATABASE_URL environment variable is required');\",\n '}',\n '',\n 'export const sql = neon(process.env.DATABASE_URL);',\n 'export const db = drizzle({ client: sql, schema });',\n 'export type Database = typeof db;',\n '',\n ].join('\\n');\n }\n } else {\n // Docker / standard PostgreSQL (node-postgres Pool)\n clientContent = [\n \"import { config } from 'dotenv';\",\n \"import path from 'node:path';\",\n \"import { fileURLToPath } from 'node:url';\",\n \"import { drizzle } from 'drizzle-orm/node-postgres';\",\n \"import { Pool } from 'pg';\",\n \"import * as schema from './schema/index.js';\",\n '',\n 'const srcDir = path.dirname(fileURLToPath(import.meta.url));',\n \"const workspaceRoot = path.resolve(srcDir, '../../..');\",\n \"const packageRoot = path.resolve(srcDir, '..');\",\n \"config({ path: path.join(workspaceRoot, '.env') });\",\n \"config({ path: path.join(packageRoot, '.env'), override: true });\",\n '',\n 'if (!process.env.DATABASE_URL) {',\n \" throw new Error('DATABASE_URL environment variable is required');\",\n '}',\n '',\n 'export const pool = new Pool({',\n ' connectionString: process.env.DATABASE_URL,',\n '});',\n '',\n 'export const db = drizzle({ client: pool, schema } as any);',\n 'export type Database = typeof db;',\n '',\n ].join('\\n');\n }\n\n await fsPromises.writeFile(\n path.join(srcDir, 'client.ts'),\n clientContent,\n 'utf8',\n );\n\n // 9. Generate src/index.ts re-exporting client, schema, and drizzle-orm\n let clientExport: string;\n if (dialect === 'sqlite') {\n clientExport = \"export { db, client, type Database } from './client.js';\";\n } else if (postgresProvider === 'neon' && neonMode === 'serverless') {\n clientExport = \"export { db, sql, type Database } from './client.js';\";\n } else {\n clientExport = \"export { db, pool, type Database } from './client.js';\";\n }\n\n const indexContent = [\n clientExport,\n \"export * from './schema/index.js';\",\n \"export * from 'drizzle-orm';\",\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(srcDir, 'index.ts'),\n indexContent,\n 'utf8',\n );\n\n // 10. Generate src/seed/seed.ts and src/seed/index.ts\n let seedTeardown: string;\n let seedImports: string;\n\n if (dialect === 'sqlite') {\n seedImports = \"import { client, db } from '../client.js';\";\n seedTeardown = 'client.close();';\n } else if (postgresProvider === 'neon' && neonMode === 'serverless') {\n seedImports = \"import { db } from '../client.js';\";\n seedTeardown =\n '// Serverless HTTP is stateless, no pool connection to close';\n } else {\n seedImports = \"import { pool, db } from '../client.js';\";\n seedTeardown = 'await pool.end();';\n }\n\n const seedScriptContent = [\n seedImports,\n \"import { users } from '../schema/index.js';\",\n '',\n '/**',\n ' * Starter database seeder',\n ' */',\n 'export async function seed() {',\n \" console.log('🌱 [Seed] Starting database seeding...\\\\n');\",\n '',\n ' try {',\n \" console.log('👥 [Seed] Seeding sample user...');\",\n ' await db',\n ' .insert(users)',\n ' .values({',\n \" name: 'Demo User',\",\n \" email: 'demo@example.com',\",\n ' })',\n ' .onConflictDoNothing();',\n '',\n \" console.log('🎉 [Seed] Seeding completed successfully!\\\\n');\",\n ' } catch (error) {',\n \" console.error('❌ [Seed] Error occurred during database seeding:', error);\",\n ' process.exitCode = 1;',\n ' } finally {',\n ` ${seedTeardown}`,\n ' }',\n '}',\n '',\n '// Execute seed script if run directly',\n 'seed().catch((err) => {',\n \" console.error('Fatal seed error:', err);\",\n ' process.exit(1);',\n '});',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(seedDir, 'seed.ts'),\n seedScriptContent,\n 'utf8',\n );\n\n const seedIndexContent = [\"export { seed } from './seed.js';\", ''].join('\\n');\n await fsPromises.writeFile(\n path.join(seedDir, 'index.ts'),\n seedIndexContent,\n 'utf8',\n );\n\n // 11. Generate .gitignore\n const gitignoreContent = [\n 'node_modules/',\n 'dist/',\n '.env',\n '.env.local',\n '*.db',\n '*.db-journal',\n '',\n ].join('\\n');\n await fsPromises.writeFile(\n path.join(dbDir, '.gitignore'),\n gitignoreContent,\n 'utf8',\n );\n\n let dockerDocs = '';\n if (dialect === 'postgresql' && postgresProvider === 'docker') {\n dockerDocs = [\n '- `pnpm docker:db` — Start local PostgreSQL Docker container (run from workspace root).',\n '- `pnpm docker:down` — Stop Docker infrastructure (run from workspace root).',\n ].join('\\n');\n }\n\n const readmeContent = [\n '# @repo/db',\n '',\n `Shared database layer powered by **Drizzle ORM (${providerLabel})**.`,\n '',\n '## Available Scripts',\n '',\n dockerDocs,\n '- `pnpm db:generate` — Generate SQL migrations based on schema changes.',\n '- `pnpm db:push` — Push schema directly to the database without generating migrations.',\n '- `pnpm db:migrate` — Apply generated migrations to the database.',\n '- `pnpm db:seed` — Seed starter database records.',\n '- `pnpm db:studio` — Open Drizzle Studio visual browser for inspecting and editing data.',\n '- `pnpm db:check` — Check migration history and verify consistency.',\n '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n await fsPromises.writeFile(\n path.join(dbDir, 'README.md'),\n readmeContent,\n 'utf8',\n );\n}\n\nexport async function runDrizzleSetup(\n projectPath: string,\n dialect: DbDialect = 'postgresql',\n linter: string = 'none',\n postgresProvider: PostgresProvider = 'docker',\n neonMode: NeonConnectionMode = 'serverless',\n) {\n const packagesDir = path.join(projectPath, 'packages');\n try {\n await fsPromises.access(packagesDir);\n } catch {\n return;\n }\n\n const label =\n dialect === 'sqlite'\n ? 'SQLite'\n : postgresProvider === 'neon'\n ? `PostgreSQL - Neon ${neonMode === 'pool' ? 'Pool' : 'Serverless'}`\n : 'PostgreSQL - Docker';\n\n const s = spinner();\n s.start(`Setting up modular Drizzle ORM (${label}) in packages/db...`);\n try {\n await setupDrizzle(\n projectPath,\n dialect,\n linter,\n postgresProvider,\n neonMode,\n );\n s.stop(\n pc.green(\n `✔ Success: Modular Drizzle ORM (${label}) configured in packages/db`,\n ),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Drizzle ORM setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import pc from 'picocolors';\nimport { outro } from '@clack/prompts';\n\nexport function endCli(\n name: string,\n projectPath: string,\n options: {\n hasDb?: boolean;\n orm?: 'drizzle' | 'none';\n hasDocker?: boolean;\n hasDockerScripts?: boolean;\n dockerServices?: { postgres?: boolean; redis?: boolean };\n } = {},\n) {\n // Complete and show beautiful finish screen\n outro(pc.yellow('Morax scaffolding completed successfully!'));\n\n let instructions =\n `⚡ ${pc.bold('Workspace ready:')} ${pc.yellow(name)}\\n` +\n `${pc.bold('To start developing:')}\\n` +\n ` 1. ${pc.cyan(`cd ${name}`)}\\n` +\n ` 2. ${pc.cyan('pnpm dev')}`;\n\n if (options.hasDocker) {\n if (options.hasDockerScripts) {\n instructions +=\n `\\n\\n${pc.bold('Docker Infrastructure (Runner scripts):')}\\n` +\n ` • Start all: ${pc.cyan('pnpm docker:up')}\\n` +\n ` • Stop all: ${pc.cyan('pnpm docker:down')}`;\n if (options.dockerServices?.postgres) {\n instructions += `\\n • Start Postgres: ${pc.cyan('pnpm docker db')}`;\n }\n if (options.dockerServices?.redis) {\n instructions += `\\n • Start Redis: ${pc.cyan('pnpm docker redis')}`;\n }\n } else {\n instructions +=\n `\\n\\n${pc.bold('Docker Infrastructure:')}\\n` +\n ` • Start all: ${pc.cyan('docker compose --env-file .env -f docker/docker-compose.yml up -d')}\\n` +\n ` • Stop all: ${pc.cyan('docker compose --env-file .env -f docker/docker-compose.yml down')}`;\n if (options.dockerServices?.postgres) {\n instructions += `\\n • Start Postgres: ${pc.cyan('docker compose --env-file .env -f docker/docker-compose.yml --profile postgres up -d')}`;\n }\n if (options.dockerServices?.redis) {\n instructions += `\\n • Start Redis: ${pc.cyan('docker compose --env-file .env -f docker/docker-compose.yml --profile redis up -d')}`;\n }\n }\n }\n\n if (options.hasDb && options.orm === 'drizzle') {\n instructions +=\n `\\n\\n${pc.bold('Database commands (packages/db - Drizzle ORM):')}\\n` +\n ` • Push schema: ${pc.cyan('pnpm --filter @repo/db db:push')}\\n` +\n ` • Seed database: ${pc.cyan('pnpm --filter @repo/db db:seed')}\\n` +\n ` • Drizzle Studio: ${pc.cyan('pnpm --filter @repo/db db:studio')}\\n` +\n ` • Generate SQL: ${pc.cyan('pnpm --filter @repo/db db:generate')}`;\n }\n\n console.log(instructions);\n}\n","import path from 'path';\nimport { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\n\nimport { setupReact } from '../modules/apps/web/react.js';\nimport { runGitSetup } from '../modules/git/git.js';\nimport { setupReadme } from '../modules/workspace/readme.js';\nimport { endCli } from '../core/endcli.js';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function runReactScaffolder(name: string, projectPath: string) {\n // 1. Setup React directly at the root (non-monorepo)\n const finalProjectPath = await setupReact(projectPath, false);\n\n // 2. Add the root README inside the created project folder\n await setupReadme(finalProjectPath, path.basename(finalProjectPath));\n\n // 3. Prompt and execute Git initialization inside the created project folder\n await runGitSetup(finalProjectPath);\n\n // 4. Run final pnpm install to ensure all dependencies are installed\n const installSpinner = spinner();\n installSpinner.start('Running final package installation...');\n try {\n await runCommand('pnpm install', { cwd: finalProjectPath, silent: true });\n installSpinner.stop(\n pc.green('✔ Success: Dependencies configured successfully'),\n );\n } catch (error: any) {\n installSpinner.stop(pc.red('✖ Warning: Final package installation failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n }\n\n // 5. Complete and show beautiful finish screen\n endCli(path.basename(finalProjectPath), finalProjectPath);\n}\n","import pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { spawn } from 'child_process';\nimport { confirm, spinner, text } from '@clack/prompts';\nimport handleCancel from '../../../utils/isCancel.js';\nimport { runCommand } from '../../../utils/exec.js';\n\nfunction runInteractiveCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const fullCommand =\n args.length > 0 ? `${command} ${args.join(' ')}` : command;\n const child = spawn(fullCommand, [], {\n cwd,\n stdio: 'inherit',\n shell: true,\n env: { ...process.env, NODE_NO_WARNINGS: '1' },\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `Command \"${command} ${args.join(' ')}\" exited with code ${code}`,\n ),\n );\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n\nexport async function setupReact(projectPath: string, isMonorepo = true) {\n const appsDir = isMonorepo\n ? path.join(projectPath, 'apps')\n : path.dirname(projectPath);\n\n // 1. Print important warnings to prevent blocking\n console.log(pc.magentaBright('\\n🔷 IMPORTANT INSTRUCTIONS:'));\n console.log(\n pc.magentaBright(\n 'During the Vite interactive configuration prompts, please select:',\n ),\n );\n console.log(\n pc.magentaBright(\n ` 1. Install & Start: Choose ${pc.bold('No')} when asked \"Install with npm/pnpm and start now?\"`,\n ),\n );\n console.log(\n pc.magentaBright(\n 'This allows Morax CLI to continue automatically configuring your workspace (Oxlint, Prettier, Tailwind, packages, etc.)!',\n ),\n );\n\n // 2. Run pnpm create vite@latest interactively!\n console.log(\n pc.cyan('\\nStarting interactive Vite React application setup...'),\n );\n\n // Get list of directories in appsDir before running Vite to auto-detect the chosen project name\n let beforeDirs: string[] = [];\n try {\n beforeDirs = await fsPromises.readdir(appsDir);\n } catch {}\n\n try {\n await runInteractiveCommand('pnpm', ['create', 'vite@latest'], appsDir);\n\n // Get list of directories in appsDir after running Vite\n let afterDirs: string[] = [];\n try {\n afterDirs = await fsPromises.readdir(appsDir);\n } catch {}\n\n // Find the newly created folder\n const newDirs = afterDirs.filter((d) => !beforeDirs.includes(d));\n let createdDirName = 'web'; // fallback\n if (newDirs.length > 0) {\n createdDirName = newDirs[0];\n }\n const webDir = path.join(appsDir, createdDirName);\n\n // Verify directory exists\n try {\n await fsPromises.access(webDir);\n } catch {\n throw new Error(\n `Vite React application directory \"apps/${createdDirName}\" was not found. Please ensure you complete the Vite installation.`,\n );\n }\n\n // Ensure that in a monorepo the web package name is always \"web\"\n if (isMonorepo) {\n try {\n const pkgPath = path.join(webDir, 'package.json');\n const pkgRaw = await fsPromises.readFile(pkgPath, 'utf8');\n const pkg = JSON.parse(pkgRaw);\n pkg.name = 'web';\n await fsPromises.writeFile(\n pkgPath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n } catch {}\n }\n\n // Always configure Path Aliases & @types/node right away so import aliases are ready\n const aliasSpinner = spinner();\n aliasSpinner.start('Configuring import aliases and Node types...');\n try {\n // Install @types/node dynamically into devDependencies\n await runCommand('pnpm add -D @types/node', {\n cwd: webDir,\n silent: true,\n });\n\n // tsconfig.json / tsconfig.app.json\n const tsconfigPaths = [\n path.join(webDir, 'tsconfig.json'),\n path.join(webDir, 'tsconfig.app.json'),\n ];\n for (const tsPath of tsconfigPaths) {\n try {\n let content = await fsPromises.readFile(tsPath, 'utf8');\n if (content.includes('\"compilerOptions\"')) {\n if (!content.includes('\"paths\"')) {\n content = content.replace(\n /(\"compilerOptions\"\\s*:\\s*\\{)/,\n `$1\\n \"baseUrl\": \".\",\\n \"paths\": {\\n \"@/*\": [\"./src/*\"]\\n },`,\n );\n await fsPromises.writeFile(tsPath, content, 'utf8');\n }\n } else {\n content = content.replace(\n /^(\\s*\\{)/,\n `$1\\n \"compilerOptions\": {\\n \"baseUrl\": \".\",\\n \"paths\": {\\n \"@/*\": [\"./src/*\"]\\n }\\n },`,\n );\n await fsPromises.writeFile(tsPath, content, 'utf8');\n }\n } catch {}\n }\n\n // vite.config.ts\n const viteConfigPath = path.join(webDir, 'vite.config.ts');\n try {\n let content = await fsPromises.readFile(viteConfigPath, 'utf8');\n if (!content.includes(\"import path from 'path'\")) {\n content = \"import path from 'path';\\n\" + content;\n }\n if (!content.includes('resolve:')) {\n content = content.replace(\n /(plugins:\\s*\\[[^\\]]*\\]),?/,\n `$1,\\n resolve: {\\n alias: {\\n \"@\": path.resolve(import.meta.dirname, \"./src\"),\\n },\\n }`,\n );\n }\n await fsPromises.writeFile(viteConfigPath, content, 'utf8');\n } catch {}\n\n aliasSpinner.stop(\n pc.green('✔ Success: Import aliases and Node types configured'),\n );\n } catch (err: any) {\n aliasSpinner.stop(pc.red('✖ Failed: Import alias configuration failed'));\n }\n\n console.log(\n pc.green(\n isMonorepo\n ? `\\n✔ Success: Vite React frontend configured in apps/${createdDirName}\\n`\n : `\\n✔ Success: Vite React frontend configured at root\\n`,\n ),\n );\n\n // 3. Prompt for Tailwind CSS v4 and shadcn UI setup\n const setupTailwindPrompt = await confirm({\n message: 'Do you want to install and configure Tailwind CSS v4?',\n initialValue: true,\n });\n handleCancel(setupTailwindPrompt);\n\n const setupShadcnPrompt = await confirm({\n message: `Do you want to setup shadcn UI in your Vite React website (apps/${createdDirName})?`,\n initialValue: true,\n });\n handleCancel(setupShadcnPrompt);\n\n // Determine if Tailwind needs to be installed (shadcn UI requires Tailwind)\n const needsTailwind = setupTailwindPrompt || setupShadcnPrompt;\n\n if (needsTailwind) {\n const s = spinner();\n s.start(\n 'Installing Tailwind CSS v4, Vite integration, and Node types...',\n );\n try {\n // 4. Install Tailwind CSS v4 and Vite integration dynamically using pnpm add\n await runCommand('pnpm add tailwindcss', {\n cwd: webDir,\n silent: true,\n });\n await runCommand('pnpm add -D @tailwindcss/vite', {\n cwd: webDir,\n silent: true,\n });\n\n s.message('Configuring Vite plugins and Tailwind CSS imports...');\n\n // 5. Configure the Vite plugin in vite.config.ts\n const viteConfigPath = path.join(webDir, 'vite.config.ts');\n try {\n let content = await fsPromises.readFile(viteConfigPath, 'utf8');\n\n // Check if React Compiler is present (from Vite 7 / create-vite option)\n const hasReactCompiler =\n content.includes('reactCompilerPreset') ||\n content.includes('@rolldown/plugin-babel') ||\n content.includes('babel({');\n\n if (hasReactCompiler) {\n content = [\n \"import path from 'path';\",\n \"import tailwindcss from '@tailwindcss/vite';\",\n \"import react, { reactCompilerPreset } from '@vitejs/plugin-react';\",\n \"import babel from '@rolldown/plugin-babel';\",\n \"import { defineConfig } from 'vite';\",\n '',\n '// https://vite.dev/config/',\n 'export default defineConfig({',\n ' plugins: [',\n ' tailwindcss(),',\n ' react(),',\n ' babel({',\n ' presets: [reactCompilerPreset()],',\n ' }),',\n ' ],',\n ' resolve: {',\n ' alias: {',\n \" '@': path.resolve(import.meta.dirname, './src'),\",\n ' },',\n ' },',\n '});',\n '',\n ].join('\\n');\n await fsPromises.writeFile(viteConfigPath, content, 'utf8');\n } else if (!content.includes('@tailwindcss/vite')) {\n content =\n \"import tailwindcss from '@tailwindcss/vite';\\n\" + content;\n\n if (content.includes('plugins: [react()]')) {\n content = content.replace(\n 'plugins: [react()]',\n 'plugins: [react(), tailwindcss()]',\n );\n } else if (content.includes('plugins: [react(),]')) {\n content = content.replace(\n 'plugins: [react(),]',\n 'plugins: [react(), tailwindcss()]',\n );\n } else {\n // Use regex for multi-line or standard spacing\n content = content.replace(\n /(plugins:\\s*\\[\\s*react\\(\\),?\\s*)(\\])/g,\n '$1\\n tailwindcss(),\\n $2',\n );\n }\n await fsPromises.writeFile(viteConfigPath, content, 'utf8');\n }\n } catch {}\n\n // 6. Overwrite src/index.css to import Tailwind CSS v4\n const indexCssPath = path.join(webDir, 'src', 'index.css');\n try {\n await fsPromises.writeFile(\n indexCssPath,\n '@import \"tailwindcss\";\\n',\n 'utf8',\n );\n } catch {}\n\n s.stop(\n pc.green('✔ Success: Tailwind CSS v4 configured successfully\\n'),\n );\n } catch (err: any) {\n s.stop(pc.red('✖ Failed: Tailwind CSS v4 setup failed'));\n throw err;\n }\n }\n\n if (setupShadcnPrompt) {\n // 8. Prompt for preset and initialize shadcn UI\n const hasPreset = await confirm({\n message: 'Do you have a custom shadcn UI preset code?',\n initialValue: false,\n });\n handleCancel(hasPreset);\n\n let presetCode = '';\n if (hasPreset) {\n const enteredPreset = await text({\n message: 'Enter your custom shadcn UI preset code:',\n placeholder: 'e.g. 123456',\n validate: (val) => {\n if (!val || !val.trim()) return 'Preset code cannot be empty';\n return;\n },\n });\n handleCancel(enteredPreset);\n presetCode = (enteredPreset as string).trim();\n }\n\n const args = ['dlx', 'shadcn@latest', 'init'];\n if (presetCode) {\n args.push('--preset', presetCode);\n }\n args.push('--template', 'vite');\n\n console.log(\n pc.cyan('\\nStarting interactive shadcn UI initialization...'),\n );\n await runInteractiveCommand('pnpm', args, webDir);\n console.log(\n pc.green(\n isMonorepo\n ? `\\n✔ Success: shadcn UI successfully initialized in apps/${createdDirName}\\n`\n : `\\n✔ Success: shadcn UI successfully initialized at root\\n`,\n ),\n );\n }\n return webDir;\n } catch (error: any) {\n console.error(pc.red(`\\n✖ Failed: Vite React frontend setup failed`));\n console.error(pc.red(`Error details: ${error.message || error}\\n`));\n process.exit(1);\n }\n}\n","import { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../utils/exec.js';\n\nexport async function promptGit() {\n return await confirm({\n message: 'Do you want to initialize a local Git repository?',\n initialValue: true,\n });\n}\n\nexport async function gitInit(projectPath: string) {\n // 1. Initialize empty git repository\n await runCommand('git init', { cwd: projectPath, silent: true });\n\n // 2. Create high-quality standard .gitignore\n const gitignore = [\n '# Dependency directories',\n 'node_modules/',\n 'jspm_packages/',\n 'web_modules/',\n '',\n '# Build and output outputs',\n 'dist/',\n 'build/',\n '.next/',\n 'out/',\n '.turbo/',\n '',\n '# Environments',\n '.env',\n '.env.local',\n '.env.development.local',\n '.env.test.local',\n '.env.production.local',\n '',\n '# AI Agent Skills & Tooling',\n '.agents/',\n '.agent/',\n '',\n '# Logs',\n 'npm-debug.log*',\n 'yarn-debug.log*',\n 'yarn-error.log*',\n 'pnpm-debug.log*',\n '*.log',\n '',\n '# OS Metadata',\n '.DS_Store',\n 'Thumbs.db',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(projectPath, '.gitignore'),\n gitignore,\n 'utf8',\n );\n}\n\nexport async function runGitSetup(projectPath: string): Promise<boolean> {\n const gitPrompt = await promptGit();\n\n handleCancel(gitPrompt);\n\n let gitInitialized = false;\n if (gitPrompt) {\n const s = spinner();\n s.start('Initializing Git repository...');\n try {\n await gitInit(projectPath);\n s.stop(pc.green('✔ Success: Git repository initialized'));\n gitInitialized = true;\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Git initialization failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n }\n return gitInitialized;\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\n\nexport async function setupReadme(\n projectPath: string,\n workspaceName: string,\n options: {\n hasDb?: boolean;\n orm?: 'drizzle' | 'none';\n hasDocker?: boolean;\n hasDockerScripts?: boolean;\n hasAuth?: boolean;\n dockerServices?: { postgres?: boolean; redis?: boolean };\n } = {},\n) {\n const readmePath = path.join(projectPath, 'README.md');\n\n let dockerDocs: string[] = [];\n if (options.hasDocker) {\n if (options.hasDockerScripts) {\n dockerDocs = [\n '### Docker Infrastructure',\n 'Manage local services using the workspace helper script:',\n '```bash',\n './scripts/command.sh infra-up # Start all local docker services in background',\n './scripts/command.sh infra-down # Stop all local docker services',\n ...(options.dockerServices?.postgres\n ? [\n './scripts/command.sh postgres-up # Start PostgreSQL service only',\n './scripts/command.sh postgres-down # Stop PostgreSQL service only',\n ]\n : []),\n ...(options.dockerServices?.redis\n ? [\n './scripts/command.sh redis-up # Start Redis service only',\n './scripts/command.sh redis-down # Stop Redis service only',\n ]\n : []),\n '```',\n '',\n ];\n } else {\n dockerDocs = [\n '### Docker Infrastructure',\n 'Manage local services via Docker Compose directly:',\n '```bash',\n 'docker compose --env-file .env -f docker/docker-compose.yml up -d # Start all services',\n 'docker compose --env-file .env -f docker/docker-compose.yml down # Stop all services',\n 'docker compose --env-file .env -f docker/docker-compose.yml ps # Check status',\n 'docker compose --env-file .env -f docker/docker-compose.yml logs -f # View container logs',\n ...(options.dockerServices?.postgres\n ? [\n 'docker compose --env-file .env -f docker/docker-compose.yml --profile postgres up -d # Postgres only',\n ]\n : []),\n ...(options.dockerServices?.redis\n ? [\n 'docker compose --env-file .env -f docker/docker-compose.yml --profile redis up -d # Redis only',\n ]\n : []),\n '```',\n '',\n ];\n }\n }\n\n let dbDocs: string[] = [];\n if (options.hasDb && options.orm === 'drizzle') {\n dbDocs = [\n '### Database (Drizzle ORM)',\n 'Manage schema migrations, seeding, and visual database inspector:',\n '```bash',\n 'pnpm --filter @repo/db db:push # Push schema directly to database',\n 'pnpm --filter @repo/db db:seed # Seed starter database records',\n 'pnpm --filter @repo/db db:studio # Open Drizzle Studio visual GUI',\n 'pnpm --filter @repo/db db:generate # Generate migration SQL files',\n '```',\n '',\n ];\n }\n\n let authDocs: string[] = [];\n if (options.hasAuth) {\n authDocs = [\n '### Authentication (@repo/auth)',\n 'Better Auth server endpoints are mounted at `/api/auth/*` on your API server.',\n 'Server-side authentication instance and origins are exported from `@repo/auth`:',\n '```typescript',\n \"import { auth } from '@repo/auth';\",\n '```',\n '',\n ];\n }\n\n const readmeContent = [\n `# Morax `,\n '',\n 'Welcome to your next-generation, high-performance monorepo workspace generated by **Morax**.',\n '',\n '## Workspace Structure',\n '',\n '- **`apps/`** — Frontend applications, backend servers, and user-facing services.',\n '- **`packages/`** — Shared modules, TypeScript configurations, and common utility libraries.',\n ...(options.hasDocker\n ? [\n ' - **`docker/`** — Local container infrastructure configurations (docker-compose.yml).',\n ]\n : []),\n ...(options.hasDockerScripts\n ? [\n ' - **`scripts/`** — Cross-platform container helper scripts (docker.sh, docker.js).',\n ]\n : []),\n ...(options.hasDb\n ? [\n ` - **\\`packages/db\\`** — Shared database schemas, migrations, and Drizzle ORM client.`,\n ]\n : []),\n ...(options.hasAuth\n ? [\n ` - **\\`packages/auth\\`** — Shared Better Auth server instance and configuration.`,\n ]\n : []),\n '',\n '## Key Commands',\n '',\n 'Run the following commands from the root directory of your workspace:',\n '',\n '### Development',\n 'Start all dev servers and hot-reloading configurations concurrently:',\n '```bash',\n 'pnpm dev',\n '```',\n '',\n ...dockerDocs,\n ...dbDocs,\n ...authDocs,\n '### Linting',\n 'Run static analysis across all workspaces:',\n '```bash',\n 'pnpm lint',\n '```',\n '',\n '### Formatting',\n 'Format all codebase files according to your chosen formatter:',\n '```bash',\n 'pnpm format',\n '```',\n '',\n '---',\n '',\n '*Generated with love by [Morax Scaffolder CLI](https://github.com/Elitedv/morax).*',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(readmePath, readmeContent, 'utf8');\n}\n","import path from 'path';\nimport { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\n\nimport { setupNextjs } from '../modules/apps/web/nextjs.js';\nimport { runShadcnSetup } from '../modules/apps/web/shadcn.js';\nimport { runGitSetup } from '../modules/git/git.js';\nimport { setupReadme } from '../modules/workspace/readme.js';\nimport { endCli } from '../core/endcli.js';\nimport { runCommand } from '../utils/exec.js';\n\nexport async function runNextScaffolder(name: string, projectPath: string) {\n // 1. Setup Next.js directly at the root (non-monorepo)\n const finalProjectPath = await setupNextjs(projectPath, false);\n\n // 2. Setup shadcn UI (non-monorepo)\n await runShadcnSetup(finalProjectPath, false);\n\n // 3. Add the root README inside the created project folder\n await setupReadme(finalProjectPath, path.basename(finalProjectPath));\n\n // 4. Prompt and execute Git initialization inside the created project folder\n await runGitSetup(finalProjectPath);\n\n // 5. Run final pnpm install to ensure all dependencies are installed\n const installSpinner = spinner();\n installSpinner.start('Running final package installation...');\n try {\n await runCommand('pnpm install', { cwd: finalProjectPath, silent: true });\n installSpinner.stop(\n pc.green('✔ Success: Dependencies configured successfully'),\n );\n } catch (error: any) {\n installSpinner.stop(pc.red('✖ Warning: Final package installation failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n }\n\n // 6. Complete and show beautiful finish screen\n endCli(path.basename(finalProjectPath), finalProjectPath);\n}\n","import { confirm } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../../../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { spawn } from 'child_process';\n\nexport async function promptNextjs() {\n return await confirm({\n message: 'Do you want to setup a Next.js frontend in apps/web?',\n initialValue: true,\n });\n}\n\nfunction runInteractiveCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const fullCommand =\n args.length > 0 ? `${command} ${args.join(' ')}` : command;\n const child = spawn(fullCommand, [], {\n cwd,\n stdio: 'inherit',\n shell: true,\n env: { ...process.env, NODE_NO_WARNINGS: '1' },\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command \"${fullCommand}\" exited with code ${code}`));\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n\nexport async function setupNextjs(projectPath: string, isMonorepo = true) {\n const appsDir = isMonorepo\n ? path.join(projectPath, 'apps')\n : path.dirname(projectPath);\n const targetName = isMonorepo ? 'web' : path.basename(projectPath);\n const webDir = path.join(appsDir, targetName);\n\n // 1. Delete the existing directory if it contains placeholder files (.gitkeep)\n try {\n await fsPromises.rm(webDir, { recursive: true, force: true });\n } catch {}\n\n // 2. Run pnpm dlx create-next-app@latest interactively!\n console.log(pc.cyan('\\nStarting interactive Next.js application setup...'));\n await runInteractiveCommand(\n 'pnpm',\n ['dlx', 'create-next-app@latest', targetName],\n appsDir,\n );\n\n // Clean up any inner .git directory if created in monorepo apps/web\n if (isMonorepo) {\n try {\n await fsPromises.rm(path.join(webDir, '.git'), {\n recursive: true,\n force: true,\n });\n } catch {}\n }\n\n // 3. Rename package name to \"web\" in apps/web/package.json if monorepo\n if (isMonorepo) {\n const webPkgPath = path.join(webDir, 'package.json');\n try {\n const webPkgRaw = await fsPromises.readFile(webPkgPath, 'utf8');\n const webPkg = JSON.parse(webPkgRaw);\n webPkg.name = 'web';\n await fsPromises.writeFile(\n webPkgPath,\n JSON.stringify(webPkg, null, 2),\n 'utf8',\n );\n } catch {}\n }\n return webDir;\n}\n\nexport async function runNextjsSetup(projectPath: string, isMonorepo = true) {\n // Ensure the apps folder exists before proceeding (if monorepo)\n if (isMonorepo) {\n const appsDir = path.join(projectPath, 'apps');\n try {\n await fsPromises.access(appsDir);\n } catch {\n return;\n }\n }\n\n const nextPrompt = await promptNextjs();\n\n handleCancel(nextPrompt);\n\n if (nextPrompt) {\n try {\n await setupNextjs(projectPath, isMonorepo);\n console.log(\n pc.green(\n isMonorepo\n ? '\\n✔ Success: Next.js frontend application configured in apps/web\\n'\n : '\\n✔ Success: Next.js frontend application configured at root\\n',\n ),\n );\n } catch (error: any) {\n console.error(pc.red(`\\n✖ Failed: Next.js application setup failed`));\n console.error(pc.red(`Error details: ${error.message || error}\\n`));\n process.exit(1);\n }\n }\n}\n","import { confirm } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../../../utils/isCancel.js';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { spawn } from 'child_process';\n\nexport async function promptShadcn() {\n return await confirm({\n message:\n 'Do you want to setup shadcn UI in your Next.js website (apps/web)?',\n initialValue: true,\n });\n}\n\nfunction runInteractiveCommand(\n command: string,\n args: string[],\n cwd: string,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n stdio: 'inherit',\n shell: true,\n env: { ...process.env, NODE_NO_WARNINGS: '1' },\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `Command \"${command} ${args.join(' ')}\" exited with code ${code}`,\n ),\n );\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n\nexport async function setupShadcn(projectPath: string, isMonorepo = true) {\n const webDir = isMonorepo\n ? path.join(projectPath, 'apps', 'web')\n : projectPath;\n\n // Run pnpm dlx shadcn@latest init --template next interactively!\n console.log(pc.cyan('\\nStarting interactive shadcn UI initialization...'));\n await runInteractiveCommand(\n 'pnpm',\n ['dlx', 'shadcn@latest', 'init', '--template', 'next'],\n webDir,\n );\n}\n\nexport async function runShadcnSetup(projectPath: string, isMonorepo = true) {\n // Ensure the Next.js frontend actually exists\n const webDir = isMonorepo\n ? path.join(projectPath, 'apps', 'web')\n : projectPath;\n try {\n await fsPromises.access(webDir);\n } catch {\n // Next.js app was not generated, skip shadcn setup\n return;\n }\n\n const shadcnPrompt = await promptShadcn();\n\n handleCancel(shadcnPrompt);\n\n if (shadcnPrompt) {\n try {\n await setupShadcn(projectPath, isMonorepo);\n console.log(\n pc.green(\n isMonorepo\n ? '\\n✔ Success: shadcn UI successfully initialized in apps/web\\n'\n : '\\n✔ Success: shadcn UI successfully initialized at root\\n',\n ),\n );\n } catch (error: any) {\n console.error(pc.red(`\\n✖ Failed: shadcn UI setup failed`));\n console.error(pc.red(`Error details: ${error.message || error}\\n`));\n process.exit(1);\n }\n }\n}\n","import { spinner } from '@clack/prompts';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport pc from 'picocolors';\nimport { generateWorkspaceConfig } from './config.js';\n\nexport async function createDirectories(\n directories: ('apps' | 'packages')[],\n projectPath: string,\n) {\n for (const dir of directories) {\n const dirPath = path.join(projectPath, dir);\n await fsPromises.mkdir(dirPath, { recursive: true });\n await fsPromises.writeFile(\n path.join(dirPath, '.gitkeep'),\n `# Placeholder to ensure git tracks the empty ${dir}/ folder\\n`,\n 'utf8',\n );\n }\n}\n\nexport async function makeDirectories(name: string, projectPath: string) {\n const directories: ('apps' | 'packages')[] = ['apps', 'packages'];\n\n const s = spinner();\n s.start('Generating workspace configs...');\n try {\n await generateWorkspaceConfig(name, directories, projectPath);\n await createDirectories(directories, projectPath);\n s.stop(pc.green('✔ Success: Generated Workspace Root & Folder Structures'));\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Workspace generation failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n\n return directories;\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../utils/exec.js';\n\nexport async function generateWorkspaceConfig(\n name: string,\n directories: ('apps' | 'packages')[],\n projectPath: string,\n) {\n // 1. Create target folder if it doesn't exist\n await fsPromises.mkdir(projectPath, { recursive: true });\n\n // 2. Generate pnpm-workspace.yaml based on user's selective input\n const workspaceYamlContent = [\n 'packages:',\n ...directories.map((dir) => ` - '${dir}/*'`),\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(projectPath, 'pnpm-workspace.yaml'),\n workspaceYamlContent,\n 'utf8',\n );\n\n // 3. Generate Root package.json using pnpm init\n await runCommand('pnpm init', { cwd: projectPath, silent: true });\n\n // 4. Read, parse and customize the package.json\n const packageJsonPath = path.join(projectPath, 'package.json');\n const packageJsonRaw = await fsPromises.readFile(packageJsonPath, 'utf8');\n const pkg = JSON.parse(packageJsonRaw);\n\n pkg.name = name;\n pkg.description = 'High-performance monorepo workspace generated by Morax';\n pkg.private = true;\n\n // Dynamically detect installed pnpm version to avoid pinning stale versions\n try {\n const { stdout } = await runCommand('pnpm --version', {\n cwd: projectPath,\n silent: true,\n });\n const pnpmVersion = stdout.trim();\n pkg.packageManager = `pnpm@${pnpmVersion}`;\n } catch {\n pkg.packageManager = 'pnpm@latest';\n }\n\n pkg.workspaces = directories.map((dir) => `${dir}/*`);\n pkg.scripts = {\n dev: 'pnpm -r --parallel dev',\n };\n\n // Remove entry points since workspace root is private and has no main entry\n delete pkg.main;\n\n await fsPromises.writeFile(\n packageJsonPath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n}\n","import { multiselect, select, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../../utils/isCancel.js';\nimport { setupProjectDocs, type ProjectDocsOptions } from './docs.js';\nimport { setupAgentDocs, type AgentDocsOptions } from './agents.js';\nimport { setupLicense, type LicenseType } from './license.js';\nimport { setupDockerScripts } from './scripts.js';\n\nexport interface WorkspaceExtrasOptions\n extends ProjectDocsOptions, AgentDocsOptions {\n author?: string;\n}\n\nexport async function promptAndSetupExtras(\n projectPath: string,\n options: WorkspaceExtrasOptions,\n): Promise<{ hasScripts: boolean; choices: string[] }> {\n const extraOptions = [\n {\n value: 'docs',\n label: 'Documentation (/docs)',\n hint: 'Architecture & guides',\n },\n {\n value: 'agents',\n label: 'AI Agent Rules (CLAUDE.md & AGENTS.md)',\n hint: 'Rules for AI coding assistants',\n },\n {\n value: 'license',\n label: 'License (LICENSE)',\n hint: 'Open source license file',\n },\n ];\n\n if (options.hasDocker) {\n extraOptions.push({\n value: 'scripts',\n label: 'Docker Scripts (scripts/)',\n hint: 'Helper scripts for Docker',\n });\n }\n\n const selectedExtras = await multiselect({\n message: 'Select additional documentation & project files:',\n options: extraOptions,\n initialValues: ['docs'],\n required: false,\n });\n\n handleCancel(selectedExtras);\n const choices = selectedExtras as string[];\n const hasScripts = choices.includes('scripts');\n\n let selectedLicense: LicenseType | 'none' = 'none';\n if (choices.includes('license')) {\n const licenseChoice = await select({\n message: 'Choose an open source license:',\n options: [\n {\n value: 'MIT',\n label: 'MIT',\n hint: 'Permissive (Recommended)',\n },\n {\n value: 'Apache-2.0',\n label: 'Apache 2.0',\n hint: 'Permissive with patent grant',\n },\n {\n value: 'GPL-3.0',\n label: 'GPL v3',\n hint: 'Strong copyleft',\n },\n {\n value: 'BSD-3-Clause',\n label: 'BSD 3-Clause',\n hint: 'Permissive with attribution',\n },\n {\n value: 'Unlicense',\n label: 'Unlicense',\n hint: 'Public domain dedication',\n },\n ],\n initialValue: 'MIT',\n });\n\n handleCancel(licenseChoice);\n selectedLicense = licenseChoice as LicenseType;\n }\n\n const s = spinner();\n s.start('Generating documentation and repository files...');\n\n try {\n if (hasScripts) {\n await setupDockerScripts(projectPath, options.dockerServices);\n }\n\n if (choices.includes('docs')) {\n await setupProjectDocs(projectPath, {\n ...options,\n hasDockerScripts: hasScripts,\n });\n }\n\n if (choices.includes('agents')) {\n await setupAgentDocs(projectPath, {\n ...options,\n hasDockerScripts: hasScripts,\n });\n }\n\n if (choices.includes('license') && selectedLicense !== 'none') {\n await setupLicense(\n projectPath,\n selectedLicense,\n options.author || options.projectName,\n );\n }\n\n s.stop(\n pc.green(\n '✔ Success: Additional project documentation and files generated',\n ),\n );\n } catch {\n s.stop(\n pc.yellow('⚠ Warning: Failed to generate some extra documentation files'),\n );\n }\n\n return { hasScripts, choices };\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\n\nexport interface ProjectDocsOptions {\n projectName: string;\n hasServer: boolean;\n serverFramework?: 'express' | 'hono';\n serverRuntime?: 'node' | 'bun';\n hasDb: boolean;\n orm?: 'drizzle';\n dbDialect?: 'postgresql' | 'sqlite';\n postgresProvider?: 'docker' | 'neon';\n hasDocker?: boolean;\n hasDockerScripts?: boolean;\n dockerServices?: { postgres?: boolean; redis?: boolean };\n hasRedis?: boolean;\n webFramework?: 'nextjs' | 'react' | 'skip';\n hasEnv?: boolean;\n hasAuth?: boolean;\n}\n\nexport async function setupProjectDocs(\n projectPath: string,\n options: ProjectDocsOptions,\n) {\n const docsDir = path.join(projectPath, 'docs');\n await fsPromises.mkdir(docsDir, { recursive: true });\n\n const {\n projectName,\n hasServer,\n serverFramework,\n serverRuntime,\n hasDb,\n dbDialect,\n postgresProvider,\n hasDocker,\n hasDockerScripts,\n dockerServices,\n webFramework,\n hasEnv,\n hasAuth,\n } = options;\n\n // 1. docs/ARCHITECTURE.md\n const architectureMd = [\n `# Architecture Overview — ${projectName}`,\n '',\n 'This document outlines the high-level architecture and workspace structure of this monorepo.',\n '',\n '## Workspace Strategy',\n 'This project uses **pnpm workspaces** to orchestrate applications and shared libraries within a single repository:',\n '',\n '- **`apps/`**: Consumer applications and deployable services.',\n ...(hasServer\n ? [\n ` - **\\`server\\`**: Backend API built with ${serverFramework ?? 'Express'} (${serverRuntime ?? 'Node.js'}).`,\n ]\n : []),\n ...(webFramework && webFramework !== 'skip'\n ? [\n ` - **\\`web\\`**: Frontend user interface built with ${webFramework === 'nextjs' ? 'Next.js' : 'Vite React'}.`,\n ]\n : []),\n '- **`packages/`**: Shared internal libraries consumed across applications.',\n ...(hasDb\n ? [\n ` - **\\`@repo/db\\`**: Centralized database schemas, migrations, and Drizzle ORM client.`,\n ]\n : []),\n ...(hasEnv\n ? [\n ` - **\\`@repo/env\\`**: Type-safe environment validation schemas powered by Zod.`,\n ]\n : []),\n ...(hasAuth\n ? [\n ` - **\\`@repo/auth\\`**: Centralized Better Auth server instance and configuration.`,\n ]\n : []),\n ' - **`@config/typescript`**: Shared `tsconfig.json` base presets ensuring uniform compilation.',\n ...(hasDocker\n ? [\n '- **`docker/`**: Container configurations for local databases and caching infrastructure.',\n ]\n : []),\n ...(hasDockerScripts\n ? [\n '- **`scripts/`**: Container helper scripts (`docker.sh`, `docker.js`).',\n ]\n : []),\n '',\n '## Dependency Flow',\n '```text',\n 'apps/web ──► @repo/env',\n 'apps/server ──► @repo/db ──► @repo/env',\n '```',\n '',\n 'Internal workspace dependencies are linked using pnpm workspace protocols (`workspace:*`).',\n '',\n ].join('\\n');\n await fsPromises.writeFile(\n path.join(docsDir, 'ARCHITECTURE.md'),\n architectureMd,\n 'utf8',\n );\n\n // 2. docs/DATABASE.md (if database is configured)\n if (hasDb) {\n const dbMd = [\n `# Database Architecture (@repo/db)`,\n '',\n `The database layer uses **Drizzle ORM** with **${dbDialect === 'sqlite' ? 'SQLite (LibSQL)' : `PostgreSQL (${postgresProvider ?? 'Docker'})`}**.`,\n '',\n '## Structure',\n '```text',\n 'packages/db/',\n '├── src/',\n '│ ├── schema/ # Drizzle table schemas and type definitions',\n '│ │ └── index.ts',\n '│ ├── client.ts # Initialized Drizzle client instance',\n '│ └── index.ts # Public library exports',\n '├── drizzle/ # Generated SQL migration files',\n '└── drizzle.config.ts # Drizzle Kit configuration',\n '```',\n '',\n '## Common Commands',\n '```bash',\n 'pnpm --filter @repo/db db:push # Push schema changes directly to the database',\n 'pnpm --filter @repo/db db:generate # Generate migration SQL files in drizzle/',\n 'pnpm --filter @repo/db db:migrate # Apply migration files',\n 'pnpm --filter @repo/db db:studio # Open visual Drizzle Studio inspector',\n '```',\n '',\n '## Importing the Database Client',\n '```typescript',\n \"import { db, users } from '@repo/db';\",\n '',\n 'const allUsers = await db.select().from(users);',\n '```',\n '',\n ].join('\\n');\n await fsPromises.writeFile(path.join(docsDir, 'DATABASE.md'), dbMd, 'utf8');\n }\n\n // 3. docs/SERVER.md (if server is configured)\n if (hasServer) {\n const serverMd = [\n `# Backend Server (apps/server)`,\n '',\n `High-performance backend API built with **${serverFramework ?? 'Express'}** on the **${serverRuntime ?? 'Node.js'}** runtime.`,\n '',\n '## Standard Endpoints',\n '| Method | Route | Description |',\n '| :--- | :--- | :--- |',\n '| `GET` | `/` | Service welcome message and status verification |',\n '| `GET` | `/health` | Uptime and health check endpoint for monitoring |',\n '| `GET` | `/api/v1/user` | User endpoint (queries `@repo/db` or returns sample user) |',\n '',\n '## Running Locally',\n '```bash',\n 'pnpm --filter server dev # Start development server with hot-reload',\n 'pnpm --filter server build # Build distribution bundle',\n 'pnpm --filter server start # Run production bundle',\n '```',\n '',\n ].join('\\n');\n await fsPromises.writeFile(\n path.join(docsDir, 'SERVER.md'),\n serverMd,\n 'utf8',\n );\n }\n\n // 4. docs/ENV.md (if env package is configured)\n if (hasEnv) {\n const envMd = [\n `# Environment Validation (@repo/env)`,\n '',\n 'Type-safe environment management validated with **Zod** at runtime.',\n '',\n '## Architecture',\n 'The `@repo/env` package provides unified access with namespace safety:',\n '',\n '```typescript',\n \"import { env } from '@repo/env';\",\n '',\n '// Backend server variables',\n 'const port = env.server.PORT;',\n '',\n '// Database variables',\n 'const dbUrl = env.db.DATABASE_URL;',\n '```',\n '',\n '## Validating All Environments',\n 'Run the standalone check to verify all required variables without starting servers:',\n '```bash',\n 'pnpm --filter @repo/env check',\n '```',\n '',\n '## Adding New Environment Variables',\n '1. Add the variable to `.env` and `.env.example`.',\n '2. Update the corresponding schema in `packages/env/src/schema/*.ts`.',\n '',\n ].join('\\n');\n await fsPromises.writeFile(path.join(docsDir, 'ENV.md'), envMd, 'utf8');\n }\n\n // 5. docs/DOCKER.md (if docker is configured)\n if (hasDocker) {\n const dockerMd = [\n `# Docker Infrastructure`,\n '',\n 'Local container infrastructure managed via Docker Compose.',\n '',\n '## Configured Services',\n ...(dockerServices?.postgres\n ? [\n '- **PostgreSQL**: Accessible at `localhost:5432` with credentials from `.env`.',\n ]\n : []),\n ...(dockerServices?.redis\n ? ['- **Redis**: Accessible at `localhost:6379`.']\n : []),\n '',\n '## Commands',\n ...(hasDockerScripts\n ? [\n '```bash',\n '# Local infrastructure commands',\n './scripts/command.sh infra-up # Start all services in the background',\n './scripts/command.sh infra-down # Stop all container services',\n ...(dockerServices?.postgres\n ? [\n './scripts/command.sh postgres-up # Start PostgreSQL container only',\n './scripts/command.sh postgres-down # Stop PostgreSQL container only',\n ]\n : []),\n ...(dockerServices?.redis\n ? [\n './scripts/command.sh redis-up # Start Redis container only',\n './scripts/command.sh redis-down # Stop Redis container only',\n ]\n : []),\n '```',\n ]\n : [\n '```bash',\n '# Direct Docker Compose commands',\n 'docker compose --env-file .env -f docker/docker-compose.yml up -d # Start all services',\n 'docker compose --env-file .env -f docker/docker-compose.yml down # Stop all services',\n 'docker compose --env-file .env -f docker/docker-compose.yml ps # Check status',\n 'docker compose --env-file .env -f docker/docker-compose.yml logs -f # View logs',\n ...(dockerServices?.postgres\n ? [\n 'docker compose --env-file .env -f docker/docker-compose.yml --profile postgres up -d # Postgres only',\n ]\n : []),\n ...(dockerServices?.redis\n ? [\n 'docker compose --env-file .env -f docker/docker-compose.yml --profile redis up -d # Redis only',\n ]\n : []),\n '```',\n ]),\n '',\n 'Docker Compose automatically loads root variables using `--env-file .env`.',\n '',\n ].join('\\n');\n await fsPromises.writeFile(\n path.join(docsDir, 'DOCKER.md'),\n dockerMd,\n 'utf8',\n );\n }\n\n // 6. docs/WEB.md (if web application is configured)\n if (webFramework && webFramework !== 'skip') {\n const webMd = [\n `# Frontend Application (apps/web)`,\n '',\n `Modern frontend user interface built with **${webFramework === 'nextjs' ? 'Next.js (App Router)' : 'React (Vite)'}**.`,\n '',\n '## Styling & Components',\n '- **Tailwind CSS v4**: Theme tokens and utility classes.',\n '- **shadcn UI & Lucide Icons**: Accessible, pre-styled UI components.',\n '',\n '## Commands',\n '```bash',\n 'pnpm --filter web dev # Launch local development server',\n 'pnpm --filter web build # Build production static/SSR output',\n '```',\n '',\n ].join('\\n');\n await fsPromises.writeFile(path.join(docsDir, 'WEB.md'), webMd, 'utf8');\n }\n\n // 7. docs/AUTH.md (if Better Auth is configured)\n if (hasAuth) {\n const authMd = [\n `# Authentication Architecture (@repo/auth)`,\n '',\n 'Type-safe authentication and session management powered by **Better Auth** with **Drizzle ORM**.',\n '',\n '## Structure',\n '```text',\n 'packages/auth/',\n '├── src/',\n '│ ├── index.ts # Server auth instance: betterAuth({...})',\n '│ └── origins.ts # Allowed trusted CORS origins',\n '└── package.json',\n '```',\n '',\n '## Server Mounting',\n serverFramework === 'hono'\n ? [\n 'Better Auth is mounted on the Hono backend at `/api/auth/**`:',\n '```typescript',\n \"import { auth } from '@repo/auth';\",\n '',\n \"app.on(['POST', 'GET'], '/api/auth/**', (c) => auth.handler(c.req.raw));\",\n '```',\n ].join('\\n')\n : [\n 'Better Auth is mounted on the Express backend at `/api/auth/*`:',\n '```typescript',\n \"import { auth } from '@repo/auth';\",\n \"import { toNodeHandler } from 'better-auth/node';\",\n '',\n \"app.all('/api/auth/*', toNodeHandler(auth));\",\n '```',\n ].join('\\n'),\n '',\n '## Database Schemas',\n 'Better Auth tables are declared in `packages/db/src/schema/auth.ts` and exported via `@repo/db`:',\n '- `user`: User profiles and verification flags',\n '- `session`: Active authenticated user sessions',\n '- `account`: OAuth and credential login links',\n '- `verification`: Email verification and password reset tokens',\n '',\n ].join('\\n');\n await fsPromises.writeFile(path.join(docsDir, 'AUTH.md'), authMd, 'utf8');\n }\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\n\nexport interface AgentDocsOptions {\n projectName: string;\n hasServer: boolean;\n serverFramework?: 'express' | 'hono';\n serverRuntime?: 'node' | 'bun';\n hasDb: boolean;\n orm?: 'drizzle';\n dbDialect?: 'postgresql' | 'sqlite';\n postgresProvider?: 'docker' | 'neon';\n hasDocker?: boolean;\n hasDockerScripts?: boolean;\n dockerServices?: { postgres?: boolean; redis?: boolean };\n hasRedis?: boolean;\n webFramework?: 'nextjs' | 'react' | 'skip';\n linter?: string;\n formatter?: string;\n hasEnv?: boolean;\n hasAuth?: boolean;\n}\n\nexport function generateClaudeMd(options: AgentDocsOptions): string {\n const {\n projectName,\n hasServer,\n serverFramework,\n serverRuntime,\n hasDb,\n orm,\n dbDialect,\n postgresProvider,\n hasDocker,\n hasDockerScripts,\n dockerServices,\n webFramework,\n linter,\n formatter,\n hasEnv,\n hasAuth,\n } = options;\n\n const stack: string[] = ['- **Package Manager**: pnpm (workspaces)'];\n if (hasServer) {\n stack.push(\n `- **Backend Server**: ${serverFramework ?? 'express'} (${serverRuntime ?? 'node'}) in \\`apps/server\\``,\n );\n }\n if (webFramework && webFramework !== 'skip') {\n stack.push(\n `- **Frontend Web**: ${webFramework === 'nextjs' ? 'Next.js (App Router)' : 'React (Vite)'} in \\`apps/web\\``,\n );\n }\n if (hasDb && orm === 'drizzle') {\n stack.push(\n `- **Database & ORM**: Drizzle ORM (${dbDialect ?? 'postgresql'}${postgresProvider ? ` - ${postgresProvider}` : ''}) in \\`packages/db\\``,\n );\n }\n if (hasAuth) {\n stack.push(\n '- **Authentication**: Better Auth with Drizzle adapter in `@repo/auth`',\n );\n }\n if (hasEnv) {\n stack.push(\n '- **Environment Validation**: Type-safe `@repo/env` with Zod validation',\n );\n }\n if (hasDocker) {\n const services = [\n dockerServices?.postgres ? 'PostgreSQL' : null,\n dockerServices?.redis ? 'Redis' : null,\n ]\n .filter(Boolean)\n .join(', ');\n stack.push(\n `- **Docker Infrastructure**: Compose services (${services || 'local containers'})`,\n );\n }\n if (linter && linter !== 'none') {\n stack.push(`- **Linter**: ${linter}`);\n }\n if (formatter && formatter !== 'none') {\n stack.push(`- **Formatter**: ${formatter}`);\n }\n\n const commands: string[] = [\n '```bash',\n '# Development',\n 'pnpm dev # Start all applications concurrently',\n 'pnpm build # Build all workspace applications and packages',\n '',\n '# Code Quality',\n 'pnpm lint # Run linter across all workspaces',\n 'pnpm format # Format codebase files',\n ];\n\n if (hasEnv) {\n commands.push(\n 'pnpm --filter @repo/env check # Validate all environment variables',\n );\n }\n\n if (hasDocker) {\n if (hasDockerScripts) {\n commands.push(\n '',\n '# Docker Infrastructure (Runner script)',\n './scripts/command.sh infra-up # Start Docker infrastructure services',\n './scripts/command.sh infra-down # Stop Docker infrastructure services',\n );\n } else {\n commands.push(\n '',\n '# Docker Infrastructure',\n 'docker compose --env-file .env -f docker/docker-compose.yml up -d # Start Docker services',\n 'docker compose --env-file .env -f docker/docker-compose.yml down # Stop Docker services',\n );\n }\n }\n\n if (hasDb) {\n commands.push(\n '',\n '# Database (Drizzle ORM)',\n 'pnpm --filter @repo/db db:push # Push schema directly to database',\n 'pnpm --filter @repo/db db:studio # Launch visual Drizzle Studio GUI',\n 'pnpm --filter @repo/db db:generate # Generate migration SQL files',\n );\n }\n\n commands.push('```');\n\n return [\n `# CLAUDE.md — Agent & Assistant Guide for ${projectName}`,\n '',\n 'This file provides guidelines and architectural context for Claude Code and AI assistants working in this repository.',\n '',\n '## Technology Stack',\n ...stack,\n '',\n '## Workspace Structure',\n '```text',\n `${projectName}/`,\n '├── apps/',\n ...(hasServer ? ['│ ├── server/ # Backend API service'] : []),\n ...(webFramework && webFramework !== 'skip'\n ? ['│ └── web/ # Frontend application']\n : []),\n '├── packages/',\n ...(hasDb\n ? [\n '│ ├── db/ # Drizzle ORM client, schemas & migrations',\n ]\n : []),\n ...(hasAuth\n ? [\n '│ ├── auth/ # Shared Better Auth server configuration (@repo/auth)',\n ]\n : []),\n ...(hasEnv\n ? [\n '│ ├── env/ # Type-safe environment schemas (@repo/env)',\n ]\n : []),\n '│ └── typescript/ # Shared TypeScript configs (@config/typescript)',\n ...(hasDocker\n ? ['├── docker/ # docker-compose.yml configuration']\n : []),\n ...(hasDockerScripts\n ? ['├── scripts/ # Helper scripts (docker.sh, docker.js)']\n : []),\n '├── .env # Monorepo single source of truth for secrets',\n '└── package.json # Root workspace orchestrator',\n '```',\n '',\n '## Key Commands',\n ...commands,\n '',\n '## Core Architecture & Conventions',\n '1. **Type-Safe Environment Variables**:',\n ...(hasEnv\n ? [\n ' - Never read `process.env` directly in server or database code.',\n ' - Use `@repo/env` namespace accessors: `env.server.PORT`, `env.db.DATABASE_URL`, `env.docker.*`.',\n \" - In frontend React/Vite, use `import { env } from '@repo/env/web'` or static `import.meta.env.*`.\",\n ]\n : [' - All infrastructure credentials live in the root `.env` file.']),\n ...(hasDb\n ? [\n '2. **Database & Schema Rules**:',\n ' - All Drizzle schemas are defined in `packages/db/src/schema/`.',\n ' - Export tables and inferred types (`User`, `NewUser`) from `schema/index.ts`.',\n ' - Run `pnpm --filter @repo/db db:push` during prototyping or `db:generate` for migration files.',\n ]\n : []),\n ...(hasServer\n ? [\n '3. **Backend API Endpoints**:',\n ' - Root welcome/health: `GET /`',\n ' - Healthcheck: `GET /health`',\n ' - User resource: `GET /api/v1/user`',\n ]\n : []),\n '4. **TypeScript & Imports**:',\n ' - Strict mode is enforced across all packages.',\n ' - Monorepo packages use workspace dependencies (e.g. `@repo/db: \"workspace:*\"`).',\n '',\n ].join('\\n');\n}\n\nexport function generateAgentsMd(options: AgentDocsOptions): string {\n const { projectName } = options;\n\n return [\n `# AGENTS.md — Universal AI Agent Guidelines for ${projectName}`,\n '',\n 'This document defines behavior rules, code conventions, and system architecture for AI agents (Cursor, Antigravity, Windsurf, Copilot, Codex) modifying this repository.',\n '',\n '## Project Overview',\n `This repository is a modern high-performance monorepo workspace scaffolded by Morax CLI.`,\n '',\n '## Agent Behavioral Rules',\n '- **Preserve Monorepo Isolation**: Keep dependencies localized to their appropriate `apps/` or `packages/` workspace.',\n '- **Never Break TypeScript Builds**: Run `pnpm lint` and ensure type-checking passes before proposing file modifications.',\n '- **Preserve Documentation & Comments**: Retain existing docstrings, explanatory comments, and configuration flags.',\n '- **Environment Variables**: Add new required variables to `.env.example` whenever adding a new environment variable.',\n '',\n '## Working with Workspaces',\n '- Execute workspace-targeted commands using `pnpm --filter <workspace-name> <command>`.',\n '- For all workspace-wide builds, run `pnpm build` from the monorepo root.',\n '- To add a package to a specific workspace: `pnpm --filter <workspace-name> add <package>`.',\n '',\n 'For specific stack details and commands, refer to [`CLAUDE.md`](./CLAUDE.md) and [`README.md`](./README.md).',\n '',\n ].join('\\n');\n}\n\nexport async function setupAgentDocs(\n projectPath: string,\n options: AgentDocsOptions,\n) {\n const claudeContent = generateClaudeMd(options);\n const agentsContent = generateAgentsMd(options);\n\n await fsPromises.writeFile(\n path.join(projectPath, 'CLAUDE.md'),\n claudeContent,\n 'utf8',\n );\n await fsPromises.writeFile(\n path.join(projectPath, 'AGENTS.md'),\n agentsContent,\n 'utf8',\n );\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\n\nexport type LicenseType =\n | 'MIT'\n | 'Apache-2.0'\n | 'GPL-3.0'\n | 'BSD-3-Clause'\n | 'Unlicense';\n\nexport function getLicenseText(\n licenseType: LicenseType,\n year: number,\n author: string,\n): string {\n switch (licenseType) {\n case 'MIT':\n return `MIT License\n\nCopyright (c) ${year} ${author}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n`;\n\n case 'Apache-2.0':\n return ` Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n Copyright ${year} ${author}\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n`;\n\n case 'BSD-3-Clause':\n return `BSD 3-Clause License\n\nCopyright (c) ${year}, ${author}\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n`;\n\n case 'GPL-3.0':\n return `GNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright (C) ${year} ${author}\n\nEveryone is permitted to copy and distribute verbatim copies\nof this license document, but changing it is not allowed.\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see <https://www.gnu.org/licenses/>.\n`;\n\n case 'Unlicense':\n return `This is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or\ndistribute this software, either in source code form or as a compiled\nbinary, for any purpose, commercial or non-commercial, and by any\nmeans.\n\nIn jurisdictions that recognize copyright laws, the author or authors\nof this software dedicate any and all copyright interest in the\nsoftware to the public domain. We make this dedication for the benefit\nof the public at large and to the detriment of our heirs and\nsuccessors. We intend this dedication to be an overt act of\nrelinquishment in perpetuity of all present and future rights to this\nsoftware under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <https://unlicense.org>\n`;\n }\n}\n\nexport async function setupLicense(\n projectPath: string,\n licenseType: LicenseType,\n author: string,\n) {\n const year = new Date().getFullYear();\n const licenseContent = getLicenseText(licenseType, year, author);\n await fsPromises.writeFile(\n path.join(projectPath, 'LICENSE'),\n licenseContent,\n 'utf8',\n );\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\n\nexport interface DockerScriptsOptions {\n postgres?: boolean;\n redis?: boolean;\n}\n\nexport async function setupDockerScripts(\n projectPath: string,\n options: DockerScriptsOptions = {},\n) {\n const scriptsDir = path.join(projectPath, 'scripts');\n await fsPromises.mkdir(scriptsDir, { recursive: true });\n\n const hasPostgres = !!options.postgres;\n const hasRedis = !!options.redis;\n\n const validActions = ['infra-up', 'infra-down'];\n if (hasPostgres) {\n validActions.push('postgres-up', 'postgres-down');\n }\n if (hasRedis) {\n validActions.push('redis-up', 'redis-down');\n }\n\n const shellLines = [\n '#!/usr/bin/env bash',\n 'set -euo pipefail',\n '',\n 'COMPOSE=\"docker compose -f docker/docker-compose.yml\"',\n '',\n 'case \"${1:-}\" in',\n ' infra-up)',\n ' $COMPOSE --profile infra up -d',\n ' ;;',\n ' infra-down)',\n ' $COMPOSE --profile infra down',\n ' ;;',\n ];\n\n if (hasPostgres) {\n shellLines.push(\n ' postgres-up)',\n ' $COMPOSE --profile postgres up -d',\n ' ;;',\n ' postgres-down)',\n ' $COMPOSE --profile postgres down',\n ' ;;',\n );\n }\n\n if (hasRedis) {\n shellLines.push(\n ' redis-up)',\n ' $COMPOSE --profile redis up -d',\n ' ;;',\n ' redis-down)',\n ' $COMPOSE --profile redis down',\n ' ;;',\n );\n }\n\n shellLines.push(\n ' *)',\n ` echo \"Usage: $0 {${validActions.join('|')}}\"`,\n ' exit 1',\n ' ;;',\n 'esac',\n '',\n );\n\n await fsPromises.writeFile(\n path.join(scriptsDir, 'command.sh'),\n shellLines.join('\\n'),\n { encoding: 'utf8', mode: 0o755 },\n );\n}\n","import { multiselect, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport handleCancel from '../../utils/isCancel.js';\nimport { runCommand } from '../../utils/exec.js';\n\nexport interface CuratedSkill {\n id: string;\n name: string;\n repo: string;\n description: string;\n hint: string;\n}\n\nexport const CURATED_SKILLS: CuratedSkill[] = [\n {\n id: 'modular-nextjs-dynamic',\n name: 'Modular Next.js (Dynamic)',\n repo: 'AshutoshDM1/skills',\n description: 'Dynamic modular architecture for Next.js webapps',\n hint: 'SaaS, dashboards & portals',\n },\n {\n id: 'modular-nextjs-lean',\n name: 'Modular Next.js (Lean)',\n repo: 'AshutoshDM1/skills',\n description: 'Lean modular architecture for Next.js landing pages',\n hint: 'Landing pages & marketing sites',\n },\n];\n\nexport async function promptSkills(): Promise<string[]> {\n const result = await multiselect({\n message: 'Install curated AI Agent Skills (skills.sh)?',\n options: CURATED_SKILLS.map((skill) => ({\n value: skill.id,\n label: skill.name,\n hint: skill.hint,\n })),\n initialValues: [],\n required: false,\n });\n\n handleCancel(result);\n return result as string[];\n}\n\nexport async function installSkills(\n projectPath: string,\n selectedSkillIds: string[],\n) {\n if (selectedSkillIds.length === 0) {\n return;\n }\n\n const s = spinner();\n\n for (const skillId of selectedSkillIds) {\n const skill = CURATED_SKILLS.find((item) => item.id === skillId);\n if (!skill) continue;\n\n s.start(`Installing skill: ${pc.cyan(skill.name)} via skills.sh...`);\n try {\n const command = `pnpm dlx skills add ${skill.repo} --skill ${skill.id} -y`;\n await runCommand(command, { cwd: projectPath, silent: true });\n s.stop(pc.green(`✔ Installed ${skill.name} successfully`));\n } catch (error: any) {\n s.stop(\n pc.yellow(\n `⚠ Warning: Failed to install ${skill.name} (${error.message || 'skills CLI error'})`,\n ),\n );\n }\n }\n\n // 1. Remove unwanted .claude folder created by skills.sh CLI\n const claudeDir = path.join(projectPath, '.claude');\n try {\n await fsPromises.rm(claudeDir, { recursive: true, force: true });\n } catch {}\n\n // 2. Ensure .agents/ is present in root .gitignore\n const gitignorePath = path.join(projectPath, '.gitignore');\n try {\n let gitignoreContent = '';\n try {\n gitignoreContent = await fsPromises.readFile(gitignorePath, 'utf8');\n } catch {\n gitignoreContent = '';\n }\n\n if (!gitignoreContent.includes('.agents')) {\n const entry = gitignoreContent\n ? '\\n# AI Agent Skills & Tooling\\n.agents/\\n.agent/\\n'\n : '# AI Agent Skills & Tooling\\n.agents/\\n.agent/\\n';\n await fsPromises.appendFile(gitignorePath, entry, 'utf8');\n }\n } catch {}\n}\n\nexport async function promptAndInstallSkills(projectPath: string) {\n const selectedSkills = await promptSkills();\n if (selectedSkills.length > 0) {\n await installSkills(projectPath, selectedSkills);\n }\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport type { DbSelection, WebFramework } from '../../types/options.js';\n\nexport interface RootEnvOptions {\n db?: DbSelection;\n redis?: boolean;\n hasServer?: boolean;\n hasAuth?: boolean;\n webFramework?: WebFramework;\n}\n\nexport async function setupRootEnv(\n projectPath: string,\n options: RootEnvOptions = {},\n) {\n const envLines: string[] = [\n '# ==============================================================================',\n '# Workspace Environment Variables (.env)',\n '# Single source of truth for Docker Compose, shared packages, server, and web',\n '# ==============================================================================',\n '',\n ];\n\n const { db, redis, hasServer, hasAuth, webFramework } = options;\n\n // 1. Backend Server Variables\n if (hasServer) {\n envLines.push('# Server', 'PORT=3001', '');\n }\n\n // 2. Database Variables\n if (db && db.orm === 'drizzle') {\n if (db.dialect === 'sqlite') {\n envLines.push('# SQLite Database', 'DB_FILE_NAME=file:local.db', '');\n } else if (db.postgresProvider === 'neon') {\n envLines.push(\n '# Neon PostgreSQL Database',\n 'DATABASE_URL=postgresql://username:password@ep-sample.us-east-2.aws.neon.tech/neondb?sslmode=require',\n '',\n );\n } else {\n // Docker / Local PostgreSQL\n envLines.push(\n '# PostgreSQL Database',\n 'POSTGRES_USER=morax',\n 'POSTGRES_PASSWORD=morax',\n 'POSTGRES_DB=morax_db',\n 'POSTGRES_PORT=5432',\n 'DATABASE_URL=postgresql://morax:morax@127.0.0.1:5432/morax_db',\n '',\n );\n }\n }\n\n // 3. Redis Variables\n if (redis) {\n envLines.push('# Redis', 'REDIS_PORT=6379', '');\n }\n\n // 4. Better Auth Variables\n if (hasAuth) {\n envLines.push(\n '# Better Auth',\n 'BETTER_AUTH_SECRET=secret-morax-auth-key-change-in-production',\n 'BETTER_AUTH_URL=http://localhost:3001',\n 'NEXT_PUBLIC_BETTER_AUTH_URL=http://localhost:3001',\n '',\n '# CORS & Trusted Origins (JSON array or comma-separated URLs)',\n 'CORS_ORIGIN=http://localhost:5173',\n 'CLIENT_URL=[\"http://localhost:5173\", \"http://localhost:3000\"]',\n '',\n '# Social Providers',\n 'GOOGLE_CLIENT_ID=google-client-id',\n 'GOOGLE_CLIENT_SECRET=google-client-secret',\n '# GITHUB_CLIENT_ID=',\n '# GITHUB_CLIENT_SECRET=',\n '',\n '# Cookie domain for cross-subdomain cookies (Optional)',\n '# COOKIE_DOMAIN=.localhost',\n '',\n );\n }\n\n // 4. Frontend Web Variables\n if (webFramework && webFramework !== 'skip') {\n if (webFramework === 'nextjs') {\n envLines.push(\n '# Next.js Frontend',\n 'NEXT_PUBLIC_API_URL=http://localhost:3001',\n '',\n );\n } else {\n envLines.push(\n '# Vite React Frontend',\n 'VITE_API_URL=http://localhost:3001',\n '',\n );\n }\n }\n\n const envContent = envLines.join('\\n');\n await fsPromises.writeFile(\n path.join(projectPath, '.env'),\n envContent,\n 'utf8',\n );\n await fsPromises.writeFile(\n path.join(projectPath, '.env.example'),\n envContent,\n 'utf8',\n );\n}\n","import { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../utils/exec.js';\n\nexport async function promptHusky() {\n return await confirm({\n message: 'Do you want to setup Husky pre-commit hooks?',\n initialValue: true,\n });\n}\n\nexport async function setupHusky(projectPath: string) {\n // 1. Install Husky dynamically with exact version at the workspace root\n await runCommand('pnpm add -D -E husky -w', { cwd: projectPath });\n\n // 2. Initialize Husky using its official init generator\n await runCommand('pnpm exec husky init', { cwd: projectPath });\n\n // 3. Update the auto-generated .husky/pre-commit file to run format and stage files\n const preCommitPath = path.join(projectPath, '.husky', 'pre-commit');\n let hookContent = '';\n try {\n hookContent = await fsPromises.readFile(preCommitPath, 'utf8');\n } catch {\n hookContent = 'pnpm test'; // Default fallback\n }\n\n // Replace default test commands with formatting checks\n hookContent = hookContent.replace('pnpm test', 'pnpm format');\n\n // Append staging of newly formatted files\n if (!hookContent.includes('git add .')) {\n hookContent = hookContent.trim() + '\\ngit add .\\n';\n }\n\n await fsPromises.writeFile(preCommitPath, hookContent, 'utf8');\n\n try {\n await fsPromises.chmod(preCommitPath, 0o755);\n } catch {}\n}\n\nexport async function runHuskySetup(\n projectPath: string,\n gitInitialized: boolean,\n) {\n if (!gitInitialized) return;\n\n const s = spinner();\n s.start('Setting up Husky hooks...');\n try {\n await setupHusky(projectPath);\n s.stop(pc.green('✔ Success: Husky pre-commit hooks configured'));\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Husky setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../utils/exec.js';\n\nexport async function setupLefthook(\n projectPath: string,\n hasFormatter: boolean,\n hasLinter: boolean,\n) {\n // 1. Install lefthook dynamically at workspace root\n await runCommand('pnpm add -D lefthook -w', {\n cwd: projectPath,\n silent: true,\n });\n\n // 2. Configure lefthook.yml dynamically\n const commands: string[] = [];\n\n if (hasFormatter) {\n commands.push(' format:');\n commands.push(\n ' glob: \"*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc,css}\"',\n );\n commands.push(' run: pnpm format && git add {staged_files}');\n }\n\n if (hasLinter) {\n commands.push(' lint:');\n commands.push(' glob: \"*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx}\"');\n commands.push(' run: pnpm lint');\n }\n\n if (commands.length === 0) {\n // Fallback if neither was selected\n commands.push(' check:');\n commands.push(' run: git status');\n }\n\n const lefthookConfig = [\n 'pre-commit:',\n ' parallel: false',\n ' commands:',\n ...commands,\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(projectPath, 'lefthook.yml'),\n lefthookConfig,\n 'utf8',\n );\n\n // 3. Inject prepare script in root package.json\n const rootPackagePath = path.join(projectPath, 'package.json');\n const rootPackageRaw = await fsPromises.readFile(rootPackagePath, 'utf8');\n const rootPkg = JSON.parse(rootPackageRaw);\n rootPkg.scripts = rootPkg.scripts || {};\n rootPkg.scripts.prepare = 'lefthook install';\n\n await fsPromises.writeFile(\n rootPackagePath,\n JSON.stringify(rootPkg, null, 2),\n 'utf8',\n );\n\n // 4. Initialize lefthook\n await runCommand('pnpm exec lefthook install', {\n cwd: projectPath,\n silent: true,\n });\n}\n\nexport async function runLefthookSetup(\n projectPath: string,\n gitInitialized: boolean,\n hasFormatter: boolean = true,\n hasLinter: boolean = true,\n) {\n if (!gitInitialized) return;\n\n const s = spinner();\n s.start('Configuring modern Lefthook Git hooks...');\n try {\n await setupLefthook(projectPath, hasFormatter, hasLinter);\n s.stop(pc.green('✔ Success: Lefthook Git hooks configured'));\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Lefthook setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../utils/exec.js';\n\nexport interface BiomeOptions {\n linter: boolean;\n formatter: boolean;\n}\n\nexport async function setupBiome(projectPath: string, options: BiomeOptions) {\n // 1. Install @biomejs/biome dynamically at the workspace root\n await runCommand('pnpm add -D -E @biomejs/biome -w', {\n cwd: projectPath,\n silent: true,\n });\n\n // 2. Author modern Biome 2.x biome.json with selected capabilities enabled/disabled\n const biomeConfig = {\n $schema: 'https://biomejs.dev/schemas/2.5.15/schema.json',\n vcs: {\n enabled: true,\n clientKind: 'git',\n useIgnoreFile: true,\n },\n files: {\n ignoreUnknown: false,\n includes: ['**'],\n },\n formatter: {\n enabled: options.formatter,\n indentStyle: 'space',\n lineWidth: 100,\n },\n linter: {\n enabled: options.linter,\n rules: {\n preset: 'recommended',\n },\n },\n };\n\n await fsPromises.writeFile(\n path.join(projectPath, 'biome.json'),\n JSON.stringify(biomeConfig, null, 2),\n 'utf8',\n );\n\n // Run biome migrate --write to auto-align schema with the exact installed version\n try {\n await runCommand('pnpm exec biome migrate --write', {\n cwd: projectPath,\n silent: true,\n });\n } catch {}\n\n // 3. Inject root scripts into package.json\n const rootPackagePath = path.join(projectPath, 'package.json');\n const rootPackageRaw = await fsPromises.readFile(rootPackagePath, 'utf8');\n const rootPkg = JSON.parse(rootPackageRaw);\n rootPkg.scripts = rootPkg.scripts || {};\n\n if (options.linter) {\n rootPkg.scripts.lint = 'biome lint .';\n }\n if (options.formatter) {\n rootPkg.scripts.format = 'biome format --write .';\n rootPkg.scripts['format:check'] = 'biome format .';\n }\n if (options.linter && options.formatter) {\n rootPkg.scripts.check = 'biome check --write .';\n }\n\n await fsPromises.writeFile(\n rootPackagePath,\n JSON.stringify(rootPkg, null, 2),\n 'utf8',\n );\n}\n\nexport async function runBiomeSetup(\n projectPath: string,\n options: BiomeOptions,\n) {\n const s = spinner();\n\n const actionText =\n options.linter && options.formatter\n ? 'linter & formatter'\n : options.linter\n ? 'linter'\n : 'formatter';\n\n s.start(`Configuring ultra-fast Biome ${actionText}...`);\n try {\n await setupBiome(projectPath, options);\n s.stop(pc.green(`✔ Success: Biome ${actionText} configured successfully`));\n } catch (error: any) {\n s.stop(pc.red(`✖ Failed: Biome setup failed`));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../utils/exec.js';\n\nexport async function setupOxlint(projectPath: string) {\n // 1. Install oxlint dynamically at the workspace root\n await runCommand('pnpm add -D -E oxlint -w', {\n cwd: projectPath,\n silent: true,\n });\n\n // 2. Generate a standard, modern .oxlintrc.json configuration file\n const oxlintConfig = {\n $schema: './node_modules/oxlint/configuration_schema.json',\n plugins: ['typescript', 'react', 'unicorn'],\n categories: {\n correctness: 'warn',\n },\n rules: {\n 'no-unused-vars': 'error',\n 'no-debugger': 'error',\n },\n };\n\n await fsPromises.writeFile(\n path.join(projectPath, '.oxlintrc.json'),\n JSON.stringify(oxlintConfig, null, 2),\n 'utf8',\n );\n\n // 3. Inject lint script into root package.json\n const rootPackagePath = path.join(projectPath, 'package.json');\n const rootPackageContent = await fsPromises.readFile(rootPackagePath, 'utf8');\n const rootPkg = JSON.parse(rootPackageContent);\n\n rootPkg.scripts = {\n ...(rootPkg.scripts || {}),\n lint: 'oxlint .',\n };\n\n await fsPromises.writeFile(\n rootPackagePath,\n JSON.stringify(rootPkg, null, 2),\n 'utf8',\n );\n}\n\nexport async function runOxlintSetup(projectPath: string) {\n const s = spinner();\n s.start('Configuring ultra-fast Oxlint linter...');\n try {\n await setupOxlint(projectPath);\n s.stop(\n pc.green('✔ Success: Oxlint configured with latest TypeScript support'),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Oxlint setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../utils/exec.js';\n\nexport async function promptPrettier() {\n return await confirm({\n message: 'Do you want to setup Prettier code formatting in root?',\n initialValue: true,\n });\n}\n\nexport async function setupPrettier(projectPath: string) {\n // 1. Install prettier dynamically with exact version at the workspace root\n await runCommand('pnpm add -D -E prettier -w', { cwd: projectPath });\n\n // 2. Generate standard .prettierrc JSON config\n const prettierConfig = {\n semi: true,\n singleQuote: true,\n trailingComma: 'all',\n tabWidth: 2,\n printWidth: 80,\n };\n\n await fsPromises.writeFile(\n path.join(projectPath, '.prettierrc'),\n JSON.stringify(prettierConfig, null, 2),\n 'utf8',\n );\n\n // 3. Generate standard .prettierignore\n const prettierIgnore = [\n 'node_modules/',\n 'dist/',\n 'build/',\n '.next/',\n 'pnpm-lock.yaml',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(projectPath, '.prettierignore'),\n prettierIgnore,\n 'utf8',\n );\n\n // 4. Inject format scripts into root package.json\n const rootPackagePath = path.join(projectPath, 'package.json');\n const rootPackageRaw = await fsPromises.readFile(rootPackagePath, 'utf8');\n const pkg = JSON.parse(rootPackageRaw);\n\n pkg.scripts = {\n ...(pkg.scripts || {}),\n format: 'prettier --write .',\n };\n\n await fsPromises.writeFile(\n rootPackagePath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n\n // 5. Initial format execution to clean up generated files\n await runCommand('pnpm format', { cwd: projectPath });\n}\n\nexport async function runPrettierSetup(projectPath: string) {\n const s = spinner();\n s.start('Setting up Prettier auto-formatting...');\n try {\n await setupPrettier(projectPath);\n s.stop(pc.green('✔ Success: Prettier formatting configured'));\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Prettier setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../utils/exec.js';\n\nexport async function setupTypescript(projectPath: string) {\n const tsDir = path.join(projectPath, 'packages', 'typescript');\n\n // 1. Create directory structure packages/typescript recursively\n await fsPromises.mkdir(tsDir, { recursive: true });\n\n // 2. Initialize package.json using pnpm init\n await runCommand('pnpm init', { cwd: tsDir, silent: true });\n\n // 3. Customize packages/typescript/package.json\n const tsPackagePath = path.join(tsDir, 'package.json');\n const tsPackageRaw = await fsPromises.readFile(tsPackagePath, 'utf8');\n const tsPkg = JSON.parse(tsPackageRaw);\n\n tsPkg.name = '@config/typescript';\n tsPkg.version = '1.0.0';\n tsPkg.private = true;\n tsPkg.files = ['tsconfig.json'];\n\n // Remove defaults that are not needed\n delete tsPkg.main;\n delete tsPkg.scripts;\n delete tsPkg.keywords;\n delete tsPkg.author;\n delete tsPkg.license;\n\n await fsPromises.writeFile(\n tsPackagePath,\n JSON.stringify(tsPkg, null, 2),\n 'utf8',\n );\n\n // 4. Create standard tsconfig.json base config\n const tsconfigContent = {\n $schema: 'https://json.schemastore.org/tsconfig',\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n lib: ['ES2022'],\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n isolatedModules: true,\n },\n };\n\n await fsPromises.writeFile(\n path.join(tsDir, 'tsconfig.json'),\n JSON.stringify(tsconfigContent, null, 2),\n 'utf8',\n );\n}\n\nexport async function runTypescriptSetup(projectPath: string) {\n // Ensure the packages folder option was generated/exists\n const packagesDir = path.join(projectPath, 'packages');\n try {\n await fsPromises.access(packagesDir);\n } catch {\n // If the packages folder was not scaffolded, we shouldn't attempt to setup TS config there\n return;\n }\n\n const s = spinner();\n s.start('Setting up modular TypeScript config in packages/typescript...');\n try {\n await setupTypescript(projectPath);\n s.stop(\n pc.green(\n '✔ Success: Modular TypeScript config configured in packages/typescript',\n ),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: TypeScript config setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport type {\n ServerFramework,\n ServerRuntime,\n ServerSetupOptions,\n} from './types.js';\nimport { setupExpress } from './frameworks/express/index.js';\nimport { setupHono } from './frameworks/hono/index.js';\n\nexport * from './types.js';\nexport * from './prompts.js';\nexport * from './deployment/index.js';\n\nexport async function runServerSetup(\n projectPath: string,\n framework: 'express' | 'hono',\n linter: string = 'none',\n orm: 'drizzle' | 'none' = 'none',\n runtime: ServerRuntime = 'node',\n) {\n // Ensure the apps folder exists\n const appsDir = path.join(projectPath, 'apps');\n try {\n await fsPromises.access(appsDir);\n } catch {\n return;\n }\n\n const frameworkLabel = framework === 'express' ? 'Express' : 'Hono';\n const runtimeLabel = runtime === 'bun' ? 'Bun' : 'Node.js';\n\n const s = spinner();\n s.start(\n `Setting up modular ${frameworkLabel} backend (${runtimeLabel}) in apps/server...`,\n );\n\n try {\n const options: ServerSetupOptions = {\n projectPath,\n framework,\n runtime,\n linter: linter as any,\n orm,\n };\n\n if (framework === 'express') {\n await setupExpress(options);\n } else {\n await setupHono(options);\n }\n\n s.stop(\n pc.green(\n `✔ Success: Modular ${frameworkLabel} backend (${runtimeLabel}) configured in apps/server`,\n ),\n );\n } catch (error: any) {\n s.stop(pc.red(`✖ Failed: ${frameworkLabel} backend setup failed`));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../../../../utils/exec.js';\nimport type { ServerSetupOptions } from '../../types.js';\nimport {\n getExpressDependencies,\n getExpressDevDependencies,\n getExpressScripts,\n} from './package.js';\nimport { renderExpressNodeTemplate } from './templates/node.js';\nimport { renderExpressBunTemplate } from './templates/bun.js';\n\nexport async function setupExpress(options: ServerSetupOptions) {\n const { projectPath, runtime, linter, orm } = options;\n const serverDir = path.join(projectPath, 'apps', 'server');\n const srcDir = path.join(serverDir, 'src');\n const hasDb = orm !== 'none';\n\n // 1. Create directory structure apps/server/src recursively\n await fsPromises.mkdir(srcDir, { recursive: true });\n\n // 2. Initialize package.json using pnpm init\n await runCommand('pnpm init', { cwd: serverDir, silent: true });\n\n // 3. Customize apps/server/package.json\n const serverPackagePath = path.join(serverDir, 'package.json');\n const serverPackageRaw = await fsPromises.readFile(serverPackagePath, 'utf8');\n const serverPkg = JSON.parse(serverPackageRaw);\n\n serverPkg.name = 'server';\n serverPkg.version = '1.0.0';\n serverPkg.private = true;\n serverPkg.type = 'module';\n serverPkg.main = 'dist/index.js';\n serverPkg.scripts = getExpressScripts(runtime, linter);\n\n serverPkg.devDependencies = {\n '@config/typescript': 'workspace:*',\n };\n\n if (hasDb) {\n serverPkg.dependencies = {\n ...(serverPkg.dependencies || {}),\n '@repo/db': 'workspace:*',\n };\n }\n\n delete serverPkg.keywords;\n delete serverPkg.author;\n delete serverPkg.license;\n\n await fsPromises.writeFile(\n serverPackagePath,\n JSON.stringify(serverPkg, null, 2),\n 'utf8',\n );\n\n // 4. Create tsconfig.json extending the base shared config\n const tsconfigContent = {\n extends: '@config/typescript/tsconfig.json',\n compilerOptions: {\n rootDir: 'src',\n outDir: 'dist',\n },\n include: ['src/**/*'],\n };\n\n await fsPromises.writeFile(\n path.join(serverDir, 'tsconfig.json'),\n JSON.stringify(tsconfigContent, null, 2),\n 'utf8',\n );\n\n // 5. Create tsdown.config.ts for fast, modern Rolldown-powered builds\n const tsdownConfigContent = [\n \"import { defineConfig } from 'tsdown';\",\n '',\n 'export default defineConfig({',\n \" entry: ['./src/index.ts'],\",\n \" format: 'esm',\",\n \" platform: 'node',\",\n ' clean: true,',\n '});',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(serverDir, 'tsdown.config.ts'),\n tsdownConfigContent,\n 'utf8',\n );\n\n // 6. Install dependencies dynamically using pnpm add\n const deps = getExpressDependencies();\n await runCommand(`pnpm add ${deps.join(' ')}`, {\n cwd: serverDir,\n silent: false,\n });\n\n const devDeps = getExpressDevDependencies(runtime);\n await runCommand(`pnpm add -D ${devDeps.join(' ')}`, {\n cwd: serverDir,\n silent: false,\n });\n\n // 7. Create src/index.ts with starter code\n const indexTsContent =\n runtime === 'bun'\n ? renderExpressBunTemplate(hasDb)\n : renderExpressNodeTemplate(hasDb);\n\n await fsPromises.writeFile(\n path.join(srcDir, 'index.ts'),\n indexTsContent,\n 'utf8',\n );\n}\n","import type { ServerRuntime } from '../../types.js';\n\nexport function getExpressDependencies(): string[] {\n return ['express', 'cors'];\n}\n\nexport function getExpressDevDependencies(runtime: ServerRuntime): string[] {\n const common = [\n '@types/express',\n '@types/cors',\n 'tsdown',\n 'typescript@latest',\n ];\n if (runtime === 'bun') {\n return [...common, '@types/bun'];\n }\n return [...common, '@types/node', 'tsx'];\n}\n\nexport function getExpressScripts(runtime: ServerRuntime, linter?: string) {\n const scripts: Record<string, string> = {\n dev:\n runtime === 'bun'\n ? 'cd ../.. && bun --watch apps/server/src/index.ts'\n : 'tsx watch src/index.ts',\n build: 'tsdown',\n start: runtime === 'bun' ? 'bun dist/index.js' : 'node dist/index.js',\n check: 'tsc --noEmit',\n };\n\n if (linter === 'biome') {\n scripts.lint = 'biome lint .';\n } else if (linter === 'oxlint') {\n scripts.lint = 'oxlint .';\n }\n\n return scripts;\n}\n","export function renderExpressNodeTemplate(hasDb: boolean): string {\n const dbImport = hasDb ? [\"import { db, users } from '@repo/db';\"] : [];\n const userRoute = hasDb\n ? [\n '// Example endpoint querying shared database package (Drizzle ORM)',\n \"app.get('/api/v1/user', async (req, res) => {\",\n ' try {',\n ' const allUsers = await db.select().from(users);',\n ' res.json({ users: allUsers });',\n ' } catch (error: any) {',\n ' res.status(500).json({ error: error.message });',\n ' }',\n '});',\n ]\n : [\n '// Example user endpoint',\n \"app.get('/api/v1/user', (req, res) => {\",\n ' res.json({',\n \" user: { id: '1', name: 'Demo User', email: 'demo@morax.dev' },\",\n ' });',\n '});',\n ];\n\n return [\n \"import express from 'express';\",\n \"import cors from 'cors';\",\n ...dbImport,\n '',\n 'const app = express();',\n 'if (!process.env.PORT) {',\n \" throw new Error('PORT environment variable is required');\",\n '}',\n 'const port = Number(process.env.PORT);',\n '',\n '// Enable CORS and parsing of JSON request bodies',\n 'app.use(cors());',\n 'app.use(express.json());',\n '',\n '// Root route',\n \"app.get('/', (req, res) => {\",\n ' res.json({',\n \" message: 'Welcome to the Morax Express API (Node.js)!',\",\n \" status: 'healthy',\",\n ' });',\n '});',\n '',\n '// Health check route',\n \"app.get('/health', (req, res) => {\",\n ' res.json({',\n \" status: 'ok',\",\n ' timestamp: new Date().toISOString(),',\n ' });',\n '});',\n '',\n ...userRoute,\n '',\n \"if (process.env.NODE_ENV !== 'production' || !process.env.VERCEL) {\",\n ' app.listen(port, () => {',\n ' console.log(`🚀 Express server running on http://localhost:${port}`);',\n ' });',\n '}',\n '',\n 'export default app;',\n '',\n ].join('\\n');\n}\n","export function renderExpressBunTemplate(hasDb: boolean): string {\n const dbImport = hasDb ? [\"import { db, users } from '@repo/db';\"] : [];\n const userRoute = hasDb\n ? [\n '// Example endpoint querying shared database package (Drizzle ORM)',\n \"app.get('/api/v1/user', async (req, res) => {\",\n ' try {',\n ' const allUsers = await db.select().from(users);',\n ' res.json({ users: allUsers });',\n ' } catch (error: any) {',\n ' res.status(500).json({ error: error.message });',\n ' }',\n '});',\n ]\n : [\n '// Example user endpoint',\n \"app.get('/api/v1/user', (req, res) => {\",\n ' res.json({',\n \" user: { id: '1', name: 'Demo User', email: 'demo@morax.dev' },\",\n ' });',\n '});',\n ];\n\n return [\n \"import express from 'express';\",\n \"import cors from 'cors';\",\n ...dbImport,\n '',\n 'const app = express();',\n 'if (!process.env.PORT) {',\n \" throw new Error('PORT environment variable is required');\",\n '}',\n 'const port = Number(process.env.PORT);',\n '',\n '// Enable CORS and parsing of JSON request bodies',\n 'app.use(cors());',\n 'app.use(express.json());',\n '',\n '// Root route',\n \"app.get('/', (req, res) => {\",\n ' res.json({',\n \" message: 'Welcome to the Morax Express API (Bun)!',\",\n \" status: 'healthy',\",\n ' });',\n '});',\n '',\n '// Health check route',\n \"app.get('/health', (req, res) => {\",\n ' res.json({',\n \" status: 'ok',\",\n ' timestamp: new Date().toISOString(),',\n ' });',\n '});',\n '',\n ...userRoute,\n '',\n \"if (process.env.NODE_ENV !== 'production' || !process.env.VERCEL) {\",\n ' app.listen(port, () => {',\n ' console.log(`🚀 Express server running on http://localhost:${port}`);',\n ' });',\n '}',\n '',\n 'export default app;',\n '',\n ].join('\\n');\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../../../../utils/exec.js';\nimport type { ServerSetupOptions } from '../../types.js';\nimport {\n getHonoDependencies,\n getHonoDevDependencies,\n getHonoScripts,\n} from './package.js';\nimport { renderHonoNodeTemplate } from './templates/node.js';\nimport { renderHonoBunTemplate } from './templates/bun.js';\n\nexport async function setupHono(options: ServerSetupOptions) {\n const { projectPath, runtime, linter, orm } = options;\n const serverDir = path.join(projectPath, 'apps', 'server');\n const srcDir = path.join(serverDir, 'src');\n const hasDb = orm !== 'none';\n\n // 1. Create directory structure apps/server/src recursively\n await fsPromises.mkdir(srcDir, { recursive: true });\n\n // 2. Initialize package.json using pnpm init\n await runCommand('pnpm init', { cwd: serverDir, silent: true });\n\n // 3. Customize apps/server/package.json\n const serverPackagePath = path.join(serverDir, 'package.json');\n const serverPackageRaw = await fsPromises.readFile(serverPackagePath, 'utf8');\n const serverPkg = JSON.parse(serverPackageRaw);\n\n serverPkg.name = 'server';\n serverPkg.version = '1.0.0';\n serverPkg.private = true;\n serverPkg.type = 'module';\n serverPkg.main = 'dist/index.js';\n serverPkg.scripts = getHonoScripts(runtime, linter);\n\n serverPkg.devDependencies = {\n '@config/typescript': 'workspace:*',\n };\n\n if (hasDb) {\n serverPkg.dependencies = {\n ...(serverPkg.dependencies || {}),\n '@repo/db': 'workspace:*',\n };\n }\n\n delete serverPkg.keywords;\n delete serverPkg.author;\n delete serverPkg.license;\n\n await fsPromises.writeFile(\n serverPackagePath,\n JSON.stringify(serverPkg, null, 2),\n 'utf8',\n );\n\n // 4. Create tsconfig.json extending the base shared config\n const tsconfigContent = {\n extends: '@config/typescript/tsconfig.json',\n compilerOptions: {\n rootDir: 'src',\n outDir: 'dist',\n },\n include: ['src/**/*'],\n };\n\n await fsPromises.writeFile(\n path.join(serverDir, 'tsconfig.json'),\n JSON.stringify(tsconfigContent, null, 2),\n 'utf8',\n );\n\n // 5. Create tsdown.config.ts\n const tsdownConfigContent = [\n \"import { defineConfig } from 'tsdown';\",\n '',\n 'export default defineConfig({',\n \" entry: ['./src/index.ts'],\",\n \" format: 'esm',\",\n \" platform: 'node',\",\n ' clean: true,',\n '});',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(serverDir, 'tsdown.config.ts'),\n tsdownConfigContent,\n 'utf8',\n );\n\n // 6. Install dependencies dynamically using pnpm add\n const deps = getHonoDependencies(runtime);\n await runCommand(`pnpm add ${deps.join(' ')}`, {\n cwd: serverDir,\n silent: false,\n });\n\n const devDeps = getHonoDevDependencies(runtime);\n await runCommand(`pnpm add -D ${devDeps.join(' ')}`, {\n cwd: serverDir,\n silent: false,\n });\n\n // 7. Create src/index.ts with starter code\n const indexTsContent =\n runtime === 'bun'\n ? renderHonoBunTemplate(hasDb)\n : renderHonoNodeTemplate(hasDb);\n\n await fsPromises.writeFile(\n path.join(srcDir, 'index.ts'),\n indexTsContent,\n 'utf8',\n );\n}\n","import type { ServerRuntime } from '../../types.js';\n\nexport function getHonoDependencies(runtime: ServerRuntime): string[] {\n if (runtime === 'bun') {\n return ['hono'];\n }\n return ['hono', '@hono/node-server'];\n}\n\nexport function getHonoDevDependencies(runtime: ServerRuntime): string[] {\n const common = ['tsdown', 'typescript@latest'];\n if (runtime === 'bun') {\n return [...common, '@types/bun'];\n }\n return [...common, '@types/node', 'tsx'];\n}\n\nexport function getHonoScripts(runtime: ServerRuntime, linter?: string) {\n const scripts: Record<string, string> = {\n dev:\n runtime === 'bun'\n ? 'cd ../.. && bun --watch apps/server/src/index.ts'\n : 'tsx watch src/index.ts',\n build: 'tsdown',\n start: runtime === 'bun' ? 'bun dist/index.js' : 'node dist/index.js',\n check: 'tsc --noEmit',\n };\n\n if (linter === 'biome') {\n scripts.lint = 'biome lint .';\n } else if (linter === 'oxlint') {\n scripts.lint = 'oxlint .';\n }\n\n return scripts;\n}\n","export function renderHonoNodeTemplate(hasDb: boolean): string {\n const dbImport = hasDb ? [\"import { db, users } from '@repo/db';\"] : [];\n const userRoute = hasDb\n ? [\n '// Example endpoint querying shared database package (Drizzle ORM)',\n \"app.get('/api/v1/user', async (c) => {\",\n ' try {',\n ' const allUsers = await db.select().from(users);',\n ' return c.json({ users: allUsers });',\n ' } catch (error: any) {',\n ' return c.json({ error: error.message }, 500);',\n ' }',\n '});',\n ]\n : [\n '// Example user endpoint',\n \"app.get('/api/v1/user', (c) => {\",\n ' return c.json({',\n \" user: { id: '1', name: 'Demo User', email: 'demo@morax.dev' },\",\n ' });',\n '});',\n ];\n\n return [\n \"import { Hono } from 'hono';\",\n \"import { serve } from '@hono/node-server';\",\n \"import { getRequestListener } from '@hono/node-server';\",\n \"import { cors } from 'hono/cors';\",\n ...dbImport,\n '',\n 'const app = new Hono();',\n 'if (!process.env.PORT) {',\n \" throw new Error('PORT environment variable is required');\",\n '}',\n 'const port = Number(process.env.PORT);',\n '',\n '// Enable CORS middleware',\n \"app.use('*', cors());\",\n '',\n '// Root route',\n \"app.get('/', (c) => {\",\n ' return c.json({',\n \" message: 'Welcome to the Morax Hono API (Node.js)!',\",\n \" status: 'healthy',\",\n ' });',\n '});',\n '',\n '// Health check route',\n \"app.get('/health', (c) => {\",\n ' return c.json({',\n \" status: 'ok',\",\n ' timestamp: new Date().toISOString(),',\n ' });',\n '});',\n '',\n ...userRoute,\n '',\n \"if (process.env.NODE_ENV !== 'production' || !process.env.VERCEL) {\",\n ' serve(',\n ' {',\n ' fetch: app.fetch,',\n ' port,',\n ' },',\n ' (info) => {',\n ' console.log(`🚀 Hono server running on http://localhost:${info.port}`);',\n ' },',\n ' );',\n '}',\n '',\n 'export { app };',\n 'export default getRequestListener(app.fetch);',\n '',\n ].join('\\n');\n}\n","export function renderHonoBunTemplate(hasDb: boolean): string {\n const dbImport = hasDb ? [\"import { db, users } from '@repo/db';\"] : [];\n const userRoute = hasDb\n ? [\n '// Example endpoint querying shared database package (Drizzle ORM)',\n \"app.get('/api/v1/user', async (c) => {\",\n ' try {',\n ' const allUsers = await db.select().from(users);',\n ' return c.json({ users: allUsers });',\n ' } catch (error: any) {',\n ' return c.json({ error: error.message }, 500);',\n ' }',\n '});',\n ]\n : [\n '// Example user endpoint',\n \"app.get('/api/v1/user', (c) => {\",\n ' return c.json({',\n \" user: { id: '1', name: 'Demo User', email: 'demo@morax.dev' },\",\n ' });',\n '});',\n ];\n\n return [\n \"import { Hono } from 'hono';\",\n \"import { cors } from 'hono/cors';\",\n ...dbImport,\n '',\n 'const app = new Hono();',\n 'if (!process.env.PORT) {',\n \" throw new Error('PORT environment variable is required');\",\n '}',\n 'const port = Number(process.env.PORT);',\n '',\n '// Enable CORS middleware',\n \"app.use('*', cors());\",\n '',\n '// Root route',\n \"app.get('/', (c) => {\",\n ' return c.json({',\n \" message: 'Welcome to the Morax Hono API (Bun)!',\",\n \" status: 'healthy',\",\n ' });',\n '});',\n '',\n '// Health check route',\n \"app.get('/health', (c) => {\",\n ' return c.json({',\n \" status: 'ok',\",\n ' timestamp: new Date().toISOString(),',\n ' });',\n '});',\n '',\n ...userRoute,\n '',\n 'console.log(`🚀 Hono server (Bun) running on http://localhost:${port}`);',\n '',\n 'export { app };',\n 'export default {',\n ' port,',\n ' fetch: app.fetch,',\n '};',\n '',\n ].join('\\n');\n}\n","import { select } from '@clack/prompts';\nimport handleCancel from '../../../utils/isCancel.js';\nimport type { ServerFramework, ServerDeploymentTarget } from './types.js';\n\nexport async function promptServerFramework(): Promise<ServerFramework> {\n const framework = await select({\n message: 'Which backend framework would you like to setup in apps/server?',\n options: [\n {\n value: 'express',\n label: 'Express',\n hint: 'Minimalist & flexible',\n },\n {\n value: 'hono',\n label: 'Hono',\n hint: 'Web-standards & fast',\n },\n {\n value: 'none',\n label: 'None',\n hint: 'Skip',\n },\n ],\n initialValue: 'express',\n });\n\n handleCancel(framework);\n return framework as ServerFramework;\n}\n\nexport async function promptServerDeployment(\n framework: 'express' | 'hono',\n): Promise<ServerDeploymentTarget> {\n const frameworkLabel = framework === 'express' ? 'Express' : 'Hono';\n const target = await select({\n message: `Which deployment configuration would you like to set up for ${frameworkLabel} backend?`,\n options: [\n {\n value: 'docker',\n label: 'Docker',\n hint: 'Dockerfile',\n },\n {\n value: 'vercel',\n label: 'Vercel',\n hint: 'Serverless',\n },\n {\n value: 'none',\n label: 'None',\n hint: 'Skip',\n },\n ],\n initialValue: 'docker',\n });\n\n handleCancel(target);\n return target as ServerDeploymentTarget;\n}\n","import path from 'path';\nimport { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport type { DeploymentOptions } from '../../types.js';\nimport { setupExpressDocker } from './express-docker.js';\nimport { setupHonoDocker } from './hono-docker.js';\n\nexport async function setupDockerDeployment(options: DeploymentOptions) {\n const { projectPath, framework, runtime } = options;\n const serverDir = path.join(projectPath, 'apps', 'server');\n const frameworkLabel = framework === 'express' ? 'Express' : 'Hono';\n const runtimeLabel = runtime === 'bun' ? 'Bun' : 'Node.js';\n\n const s = spinner();\n s.start(\n `Configuring Docker deployment for ${frameworkLabel} (${runtimeLabel}) in apps/server...`,\n );\n\n try {\n if (framework === 'express') {\n await setupExpressDocker(serverDir, runtime);\n } else {\n await setupHonoDocker(serverDir, runtime);\n }\n\n s.stop(\n pc.green(\n `✔ Success: Dockerfile and .dockerignore configured for ${frameworkLabel} (${runtimeLabel}) in apps/server`,\n ),\n );\n } catch (error: any) {\n s.stop(pc.red(`✖ Failed: Docker configuration failed: ${error.message}`));\n throw error;\n }\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport type { ServerRuntime } from '../../types.js';\n\nexport function getExpressDockerfile(runtime: ServerRuntime): string {\n if (runtime === 'bun') {\n return [\n '# Production Dockerfile for Express (Bun runtime)',\n 'FROM oven/bun:1-alpine',\n '',\n 'WORKDIR /app',\n '',\n '# Copy root monorepo manifests',\n 'COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./',\n 'COPY apps/server/package.json ./apps/server/',\n 'COPY packages/ ./packages/',\n '',\n '# Install dependencies',\n 'RUN bun install || (npm install -g pnpm && pnpm install)',\n '',\n '# Copy server source code',\n 'COPY apps/server/ ./apps/server/',\n '',\n 'WORKDIR /app/apps/server',\n '',\n '# Build bundle with tsdown',\n 'ENV SKIP_ENV_VALIDATION=true',\n 'RUN bun run build || npx tsdown',\n '',\n 'EXPOSE 3001',\n '',\n 'CMD [\"bun\", \"dist/index.js\"]',\n '',\n ].join('\\n');\n }\n\n return [\n '# Production Dockerfile for Express (Node.js runtime)',\n 'FROM node:22-alpine',\n '',\n '# Install pnpm for monorepo resolution',\n 'RUN npm install -g pnpm',\n '',\n 'WORKDIR /app',\n '',\n '# Copy root monorepo manifests',\n 'COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./',\n 'COPY apps/server/package.json ./apps/server/',\n 'COPY packages/ ./packages/',\n '',\n '# Install dependencies',\n 'RUN pnpm install --frozen-lockfile || pnpm install',\n '',\n '# Copy server source code',\n 'COPY apps/server/ ./apps/server/',\n '',\n 'WORKDIR /app/apps/server',\n '',\n '# Build bundle with tsdown',\n 'ENV SKIP_ENV_VALIDATION=true',\n 'RUN pnpm build',\n '',\n 'EXPOSE 3001',\n '',\n 'CMD [\"node\", \"dist/index.js\"]',\n '',\n ].join('\\n');\n}\n\nexport async function setupExpressDocker(\n serverDir: string,\n runtime: ServerRuntime,\n) {\n const dockerfileContent = getExpressDockerfile(runtime);\n await fsPromises.writeFile(\n path.join(serverDir, 'Dockerfile'),\n dockerfileContent,\n 'utf8',\n );\n\n const dockerignoreContent = [\n 'node_modules',\n 'dist',\n '.env',\n '.env.local',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(serverDir, '.dockerignore'),\n dockerignoreContent,\n 'utf8',\n );\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport type { ServerRuntime } from '../../types.js';\n\nexport function getHonoDockerfile(runtime: ServerRuntime): string {\n if (runtime === 'bun') {\n return [\n '# Production Dockerfile for Hono (Bun runtime)',\n 'FROM oven/bun:1-alpine',\n '',\n 'WORKDIR /app',\n '',\n '# Copy root monorepo manifests',\n 'COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./',\n 'COPY apps/server/package.json ./apps/server/',\n 'COPY packages/ ./packages/',\n '',\n '# Install dependencies',\n 'RUN bun install || (npm install -g pnpm && pnpm install)',\n '',\n '# Copy server source code',\n 'COPY apps/server/ ./apps/server/',\n '',\n 'WORKDIR /app/apps/server',\n '',\n '# Build bundle with tsdown',\n 'ENV SKIP_ENV_VALIDATION=true',\n 'RUN bun run build || npx tsdown',\n '',\n 'EXPOSE 3001',\n '',\n 'CMD [\"bun\", \"dist/index.js\"]',\n '',\n ].join('\\n');\n }\n\n return [\n '# Production Dockerfile for Hono (Node.js runtime)',\n 'FROM node:22-alpine',\n '',\n '# Install pnpm for monorepo resolution',\n 'RUN npm install -g pnpm',\n '',\n 'WORKDIR /app',\n '',\n '# Copy root monorepo manifests',\n 'COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./',\n 'COPY apps/server/package.json ./apps/server/',\n 'COPY packages/ ./packages/',\n '',\n '# Install dependencies',\n 'RUN pnpm install --frozen-lockfile || pnpm install',\n '',\n '# Copy server source code',\n 'COPY apps/server/ ./apps/server/',\n '',\n 'WORKDIR /app/apps/server',\n '',\n '# Build bundle with tsdown',\n 'ENV SKIP_ENV_VALIDATION=true',\n 'RUN pnpm build',\n '',\n 'EXPOSE 3001',\n '',\n 'CMD [\"node\", \"dist/index.js\"]',\n '',\n ].join('\\n');\n}\n\nexport async function setupHonoDocker(\n serverDir: string,\n runtime: ServerRuntime,\n) {\n const dockerfileContent = getHonoDockerfile(runtime);\n await fsPromises.writeFile(\n path.join(serverDir, 'Dockerfile'),\n dockerfileContent,\n 'utf8',\n );\n\n const dockerignoreContent = [\n 'node_modules',\n 'dist',\n '.env',\n '.env.local',\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(serverDir, '.dockerignore'),\n dockerignoreContent,\n 'utf8',\n );\n}\n","import path from 'path';\nimport { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport type { DeploymentOptions } from '../../types.js';\nimport { setupExpressVercel } from './express-vercel.js';\nimport { setupHonoVercel } from './hono-vercel.js';\n\nexport async function setupVercelDeployment(options: DeploymentOptions) {\n const { projectPath, framework, runtime } = options;\n const serverDir = path.join(projectPath, 'apps', 'server');\n const frameworkLabel = framework === 'express' ? 'Express' : 'Hono';\n\n const s = spinner();\n s.start(\n `Configuring Vercel deployment for ${frameworkLabel} backend in apps/server...`,\n );\n\n try {\n if (framework === 'express') {\n await setupExpressVercel(serverDir, runtime);\n } else {\n await setupHonoVercel(serverDir, runtime);\n }\n\n s.stop(\n pc.green(\n `✔ Success: vercel.json configured for ${frameworkLabel} in apps/server`,\n ),\n );\n } catch (error: any) {\n s.stop(pc.red(`✖ Failed: Vercel configuration failed: ${error.message}`));\n throw error;\n }\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport type { ServerRuntime } from '../../types.js';\n\nexport async function setupExpressVercel(\n serverDir: string,\n _runtime: ServerRuntime,\n) {\n const vercelConfig = {\n version: 2,\n builds: [\n {\n src: 'src/index.ts',\n use: '@vercel/node',\n },\n ],\n routes: [\n {\n src: '/(.*)',\n dest: 'src/index.ts',\n },\n ],\n };\n\n await fsPromises.writeFile(\n path.join(serverDir, 'vercel.json'),\n JSON.stringify(vercelConfig, null, 2),\n 'utf8',\n );\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport { runCommand } from '../../../../../utils/exec.js';\nimport type { ServerRuntime } from '../../types.js';\n\nexport async function setupHonoVercel(\n serverDir: string,\n runtime: ServerRuntime,\n) {\n const vercelConfig = {\n version: 2,\n builds: [\n {\n src: 'src/index.ts',\n use: '@vercel/node',\n },\n ],\n routes: [\n {\n src: '/(.*)',\n dest: 'src/index.ts',\n },\n ],\n };\n\n await fsPromises.writeFile(\n path.join(serverDir, 'vercel.json'),\n JSON.stringify(vercelConfig, null, 2),\n 'utf8',\n );\n\n // If Hono was initialized with Bun, ensure @hono/node-server adapter is available for Vercel's Node environment\n if (runtime === 'bun') {\n await runCommand('pnpm add @hono/node-server', {\n cwd: serverDir,\n silent: true,\n });\n\n const indexTsPath = path.join(serverDir, 'src', 'index.ts');\n try {\n let content = await fsPromises.readFile(indexTsPath, 'utf8');\n if (!content.includes('@hono/node-server')) {\n content =\n \"import { getRequestListener } from '@hono/node-server';\\n\" + content;\n }\n if (content.includes('export default {')) {\n content = content.replace(\n /export default\\s*\\{[\\s\\S]*?\\};/,\n 'export default process.env.VERCEL\\n ? getRequestListener(app.fetch)\\n : {\\n port,\\n fetch: app.fetch,\\n };',\n );\n }\n await fsPromises.writeFile(indexTsPath, content, 'utf8');\n } catch {\n // Ignore if file structure differs\n }\n }\n}\n","import type { DeploymentOptions } from '../types.js';\nimport { setupDockerDeployment } from './docker/index.js';\nimport { setupVercelDeployment } from './vercel/index.js';\n\nexport async function setupServerDeployment(options: DeploymentOptions) {\n if (options.target === 'docker') {\n await setupDockerDeployment(options);\n } else if (options.target === 'vercel') {\n await setupVercelDeployment(options);\n }\n}\n\nexport * from './docker/index.js';\nexport * from './vercel/index.js';\n","import { select } from '@clack/prompts';\nimport handleCancel from '../../../utils/isCancel.js';\nimport { runShadcnSetup } from './shadcn.js';\nimport { setupNextjs } from './nextjs.js';\nimport { setupReact } from './react.js';\nimport type { WebFramework } from '../../../types/options.js';\n\nexport async function addWeb(projectPath: string) {\n const framework = await select({\n message:\n 'Which frontend website setup would you like to include in apps/web?',\n options: [\n {\n value: 'nextjs',\n label: 'Next.js',\n hint: 'App Router',\n },\n {\n value: 'react',\n label: 'React (Vite)',\n hint: 'Vite',\n },\n {\n value: 'skip',\n label: 'None',\n hint: 'Skip',\n },\n ],\n initialValue: 'nextjs',\n });\n\n handleCancel(framework);\n\n if (framework === 'nextjs') {\n await setupNextjs(projectPath);\n // Prompt and execute shadcn UI setup in next.js app\n await runShadcnSetup(projectPath);\n } else if (framework === 'react') {\n await setupReact(projectPath);\n }\n\n return framework as WebFramework;\n}\n\nexport { setupNextjs } from './nextjs.js';\nexport { setupReact } from './react.js';\nexport { runShadcnSetup, setupShadcn, promptShadcn } from './shadcn.js';\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../../../utils/isCancel.js';\nimport type { EnvSetupOptions } from './types.js';\nimport { getEnvPackageJson } from './package.js';\nimport { renderCreateEnvTemplate } from './templates/create-env.js';\nimport { renderServerEnvTemplate } from './templates/server.js';\nimport { renderDbEnvTemplate } from './templates/db.js';\nimport { renderDockerEnvTemplate } from './templates/docker.js';\nimport { renderWebEnvTemplate } from './templates/web.js';\nimport { renderAuthEnvTemplate } from './templates/auth.js';\nimport { renderIndexEnvTemplate } from './templates/index.js';\nimport { renderCheckEnvTemplate } from './templates/check.js';\n\nexport * from './types.js';\n\nexport async function promptEnv(): Promise<boolean> {\n const result = await confirm({\n message: 'Do you want to setup type-safe environment package (@repo/env)?',\n initialValue: true,\n });\n handleCancel(result);\n return result as boolean;\n}\n\nexport async function addDependencyToPackage(\n pkgJsonPath: string,\n depName: string,\n depVersion: string,\n) {\n try {\n const raw = await fsPromises.readFile(pkgJsonPath, 'utf8');\n const pkg = JSON.parse(raw);\n pkg.dependencies = {\n ...(pkg.dependencies || {}),\n [depName]: depVersion,\n };\n await fsPromises.writeFile(\n pkgJsonPath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n } catch {\n // If package.json does not exist or fails, skip silently\n }\n}\n\nasync function updateDbForEnv(projectPath: string, dialect?: string) {\n const dbDir = path.join(projectPath, 'packages', 'db');\n const clientFile = path.join(dbDir, 'src', 'client.ts');\n const drizzleConfigFile = path.join(dbDir, 'drizzle.config.ts');\n\n // 1. Update src/client.ts to use env.db\n try {\n const content = await fsPromises.readFile(clientFile, 'utf8');\n let newContent = '';\n\n if (content.includes('drizzle-orm/libsql')) {\n newContent = [\n \"import { drizzle } from 'drizzle-orm/libsql';\",\n \"import { createClient } from '@libsql/client';\",\n \"import { env } from '@repo/env';\",\n \"import * as schema from './schema/index.js';\",\n '',\n 'export const client = createClient({ url: env.db.DB_FILE_NAME });',\n 'export const db = drizzle({ client, schema });',\n 'export type Database = typeof db;',\n '',\n ].join('\\n');\n } else if (content.includes('drizzle-orm/neon-serverless')) {\n newContent = [\n \"import { drizzle } from 'drizzle-orm/neon-serverless';\",\n \"import { Pool } from '@neondatabase/serverless';\",\n \"import { env } from '@repo/env';\",\n \"import * as schema from './schema/index.js';\",\n '',\n 'export const pool = new Pool({',\n ' connectionString: env.db.DATABASE_URL,',\n '});',\n '',\n 'export const db = drizzle({ client: pool, schema } as any);',\n 'export type Database = typeof db;',\n '',\n ].join('\\n');\n } else if (content.includes('drizzle-orm/neon-http')) {\n newContent = [\n \"import { drizzle } from 'drizzle-orm/neon-http';\",\n \"import { neon } from '@neondatabase/serverless';\",\n \"import { env } from '@repo/env';\",\n \"import * as schema from './schema/index.js';\",\n '',\n 'export const sql = neon(env.db.DATABASE_URL);',\n 'export const db = drizzle({ client: sql, schema });',\n 'export type Database = typeof db;',\n '',\n ].join('\\n');\n } else if (content.includes('drizzle-orm/node-postgres')) {\n newContent = [\n \"import { drizzle } from 'drizzle-orm/node-postgres';\",\n \"import { Pool } from 'pg';\",\n \"import { env } from '@repo/env';\",\n \"import * as schema from './schema/index.js';\",\n '',\n 'export const pool = new Pool({',\n ' connectionString: env.db.DATABASE_URL,',\n '});',\n '',\n 'export const db = drizzle({ client: pool, schema } as any);',\n 'export type Database = typeof db;',\n '',\n ].join('\\n');\n }\n\n if (newContent) {\n await fsPromises.writeFile(clientFile, newContent, 'utf8');\n }\n } catch {\n // If client.ts is not present, skip\n }\n\n // 2. Update drizzle.config.ts to use env.db\n try {\n const isSqlite = dialect === 'sqlite';\n const envVar = isSqlite ? 'DB_FILE_NAME' : 'DATABASE_URL';\n const dbDialect = dialect || 'postgresql';\n const newDrizzleConfig = [\n \"import { defineConfig } from 'drizzle-kit';\",\n \"import { env } from '@repo/env';\",\n '',\n 'export default defineConfig({',\n \" out: './drizzle',\",\n \" schema: './src/schema/index.ts',\",\n ` dialect: '${dbDialect}',`,\n ' dbCredentials: {',\n ` url: env.db.${envVar},`,\n ' },',\n '});',\n '',\n ].join('\\n');\n await fsPromises.writeFile(drizzleConfigFile, newDrizzleConfig, 'utf8');\n } catch {\n // If drizzle.config.ts is not present, skip\n }\n}\n\nasync function updateServerEntryForEnv(projectPath: string) {\n const indexFile = path.join(projectPath, 'apps', 'server', 'src', 'index.ts');\n try {\n let content = await fsPromises.readFile(indexFile, 'utf8');\n\n if (!content.includes('@repo/env')) {\n content = \"import { env } from '@repo/env';\\n\" + content;\n }\n\n // Replace process.env.PORT throw check with env.server.PORT\n content = content.replace(\n /if \\(!process\\.env\\.PORT\\) \\{[\\s\\S]*?const port = Number\\(process\\.env\\.PORT\\);/,\n 'const port = env.server.PORT;',\n );\n\n // Replace app.use(cors()) with origin from env.server\n content = content.replace(\n /app\\.use\\(cors\\(\\)\\);/,\n 'app.use(cors({ origin: env.server.CORS_ORIGIN }));',\n );\n content = content.replace(\n /app\\.use\\('\\*', cors\\(\\)\\);/,\n \"app.use('*', cors({ origin: env.server.CORS_ORIGIN }));\",\n );\n\n await fsPromises.writeFile(indexFile, content, 'utf8');\n } catch {\n // If apps/server entry is not present, skip\n }\n}\n\nexport async function setupEnvPackage(options: EnvSetupOptions) {\n const {\n projectPath,\n hasDb,\n dbDialect,\n hasServer,\n hasDocker,\n hasAuth,\n webFramework,\n } = options;\n const hasWebEnv = webFramework !== 'skip' || Boolean(hasAuth);\n const envDir = path.join(projectPath, 'packages', 'env');\n const srcDir = path.join(envDir, 'src');\n const schemaDir = path.join(srcDir, 'schema');\n\n // 1. Create directories\n await fsPromises.mkdir(schemaDir, { recursive: true });\n\n // 2. Write package.json\n const pkgContent = getEnvPackageJson(options);\n await fsPromises.writeFile(\n path.join(envDir, 'package.json'),\n JSON.stringify(pkgContent, null, 2),\n 'utf8',\n );\n\n // 3. Write tsconfig.json\n const tsconfig = {\n extends: '@config/typescript/tsconfig.json',\n compilerOptions: {\n rootDir: 'src',\n outDir: 'dist',\n },\n include: ['src/**/*'],\n };\n await fsPromises.writeFile(\n path.join(envDir, 'tsconfig.json'),\n JSON.stringify(tsconfig, null, 2),\n 'utf8',\n );\n\n // 4. Generate src/create-env.ts internal helper\n const createEnvCode = renderCreateEnvTemplate();\n await fsPromises.writeFile(\n path.join(srcDir, 'create-env.ts'),\n createEnvCode,\n 'utf8',\n );\n\n // 5. Generate src/schema/db.ts if db is present\n if (hasDb) {\n const dbCode = renderDbEnvTemplate(options);\n await fsPromises.writeFile(path.join(schemaDir, 'db.ts'), dbCode, 'utf8');\n }\n\n // 6. Generate src/schema/docker.ts if docker is configured\n if (hasDocker) {\n const dockerCode = renderDockerEnvTemplate(options);\n await fsPromises.writeFile(\n path.join(schemaDir, 'docker.ts'),\n dockerCode,\n 'utf8',\n );\n }\n\n // 7. Generate src/schema/server.ts if backend is present\n if (hasServer || hasDb) {\n const serverCode = renderServerEnvTemplate(options);\n await fsPromises.writeFile(\n path.join(schemaDir, 'server.ts'),\n serverCode,\n 'utf8',\n );\n }\n\n // 8. Generate src/schema/auth.ts if auth is present\n if (hasAuth) {\n const authCode = renderAuthEnvTemplate(options);\n await fsPromises.writeFile(\n path.join(schemaDir, 'auth.ts'),\n authCode,\n 'utf8',\n );\n }\n\n // 9. Generate src/schema/web.ts if frontend web is present OR if auth is selected\n if (hasWebEnv) {\n const webCode = renderWebEnvTemplate(options);\n await fsPromises.writeFile(path.join(schemaDir, 'web.ts'), webCode, 'utf8');\n }\n\n // 10. Generate src/check.ts standalone CLI validation runner\n const checkCode = renderCheckEnvTemplate(options);\n await fsPromises.writeFile(path.join(srcDir, 'check.ts'), checkCode, 'utf8');\n\n // 11. Generate src/index.ts\n const indexCode = renderIndexEnvTemplate(options);\n await fsPromises.writeFile(path.join(srcDir, 'index.ts'), indexCode, 'utf8');\n\n // 12. Wire @repo/env into packages/db, apps/server, packages/auth, and apps/web\n if (hasDb) {\n await addDependencyToPackage(\n path.join(projectPath, 'packages', 'db', 'package.json'),\n '@repo/env',\n 'workspace:*',\n );\n await updateDbForEnv(projectPath, dbDialect);\n }\n\n if (hasServer) {\n await addDependencyToPackage(\n path.join(projectPath, 'apps', 'server', 'package.json'),\n '@repo/env',\n 'workspace:*',\n );\n await updateServerEntryForEnv(projectPath);\n }\n\n if (hasAuth) {\n await addDependencyToPackage(\n path.join(projectPath, 'packages', 'auth', 'package.json'),\n '@repo/env',\n 'workspace:*',\n );\n }\n\n if (webFramework !== 'skip') {\n const appsDir = path.join(projectPath, 'apps');\n try {\n const entries = await fsPromises.readdir(appsDir, {\n withFileTypes: true,\n });\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name !== 'server') {\n await addDependencyToPackage(\n path.join(appsDir, entry.name, 'package.json'),\n '@repo/env',\n 'workspace:*',\n );\n }\n }\n } catch {}\n }\n}\n\nexport async function runEnvSetup(\n projectPath: string,\n options: EnvSetupOptions,\n) {\n const s = spinner();\n s.start('Configuring type-safe environment package in packages/env...');\n try {\n await setupEnvPackage(options);\n s.stop(\n pc.green(\n '✔ Success: Type-safe environment package (@repo/env) configured in packages/env',\n ),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Environment package setup failed'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n process.exit(1);\n }\n}\n","import type { EnvSetupOptions } from './types.js';\n\nexport function getEnvPackageJson(_options?: EnvSetupOptions) {\n return {\n name: '@repo/env',\n version: '1.0.0',\n private: true,\n type: 'module',\n main: './src/index.ts',\n types: './src/index.ts',\n exports: {\n '.': {\n types: './src/index.ts',\n default: './src/index.ts',\n },\n },\n scripts: {\n check: 'tsx src/check.ts',\n },\n dependencies: {\n zod: '^3.24.2',\n dotenv: '^16.4.7',\n },\n devDependencies: {\n '@config/typescript': 'workspace:*',\n '@types/node': '^22.13.0',\n tsx: '^4.19.3',\n typescript: '^5.7.0',\n },\n };\n}\n","export function renderCreateEnvTemplate(): string {\n return [\n \"import { z } from 'zod';\",\n \"import { config } from 'dotenv';\",\n \"import path from 'node:path';\",\n \"import { fileURLToPath } from 'node:url';\",\n '',\n '// Resolve monorepo workspace directory',\n 'const srcDir = path.dirname(fileURLToPath(import.meta.url));',\n \"const workspaceRoot = path.resolve(srcDir, '../../..');\",\n '',\n '// Load environment variables from monorepo root .env',\n \"config({ path: path.join(workspaceRoot, '.env') });\",\n '',\n 'function formatZodErrors(errors: z.ZodError): string {',\n ' return errors.issues',\n \" .map((issue) => ` ✖ [${issue.path.join('.')}]: ${issue.message}`)\",\n \" .join('\\\\n');\",\n '}',\n '',\n 'export function createEnv<T extends z.ZodRawShape | z.ZodObject<any>>(',\n ' name: string,',\n ' schemaOrShape: T,',\n ') {',\n ' const schema =',\n ' schemaOrShape instanceof z.ZodObject',\n ' ? schemaOrShape',\n ' : z.object(schemaOrShape as z.ZodRawShape);',\n '',\n \" const isSkip = process.env.SKIP_ENV_VALIDATION === 'true';\",\n ' const parsed = schema.safeParse(process.env);',\n '',\n ' if (!parsed.success && !isSkip) {',\n ' console.error(',\n ' `\\\\n🚨 [${name} Environment Error] Invalid or missing environment variables:\\\\n${formatZodErrors(parsed.error)}\\\\n`,',\n ' );',\n ' throw new Error(`${name} environment variable validation failed.`);',\n ' }',\n '',\n ' const env = (isSkip ? ({} as z.infer<typeof schema>) : parsed.data)!;',\n ' return { env, schema };',\n '}',\n '',\n ].join('\\n');\n}\n","import type { EnvSetupOptions } from '../types.js';\n\nexport function renderServerEnvTemplate(options: EnvSetupOptions): string {\n const { hasRedis, hasServer, hasDocker } = options;\n\n const serverFields: string[] = [\n \" NODE_ENV: z.enum(['development', 'test', 'production']).default('development'),\",\n ];\n\n if (hasServer) {\n serverFields.push(\n ' PORT: z.coerce.number({',\n \" required_error: 'PORT is required. Please declare PORT in root .env',\",\n \" invalid_type_error: 'PORT must be a valid number',\",\n ' }),',\n ' CORS_ORIGIN: z.string({',\n \" required_error: 'CORS_ORIGIN is required. Please declare CORS_ORIGIN in root .env',\",\n \" }).default('http://localhost:5173'),\",\n );\n }\n\n if (hasRedis) {\n serverFields.push(\n ' REDIS_PORT: z.coerce.number().default(6379),',\n ' REDIS_URL: z.string().optional(),',\n );\n }\n\n const dockerImport = hasDocker\n ? [\n '// Run Docker infrastructure validation whenever server environment is loaded',\n \"import './docker.js';\",\n '',\n ]\n : [];\n\n return [\n \"import { z } from 'zod';\",\n \"import { createEnv } from '../create-env.js';\",\n ...dockerImport,\n '// Strict server schema',\n 'export const serverSchema = z.object({',\n serverFields.join('\\n'),\n '});',\n '',\n \"export const { env: server } = createEnv('Server', serverSchema);\",\n 'export const env = server;',\n 'export type ServerEnv = z.infer<typeof serverSchema>;',\n '',\n ].join('\\n');\n}\n","import type { EnvSetupOptions } from '../types.js';\n\nexport function renderDbEnvTemplate(options: EnvSetupOptions): string {\n const { dbDialect, hasDocker, postgresProvider } = options;\n\n const schemaFields: string[] = [];\n\n if (dbDialect === 'sqlite') {\n schemaFields.push(\n ' DB_FILE_NAME: z.string({',\n \" required_error: 'DB_FILE_NAME is required. Please declare DB_FILE_NAME in root .env',\",\n \" }).min(1, 'DB_FILE_NAME cannot be empty'),\",\n );\n } else {\n schemaFields.push(\n ' DATABASE_URL: z.string({',\n \" required_error: 'DATABASE_URL is required. Please declare DATABASE_URL in root .env',\",\n \" }).min(1, 'DATABASE_URL cannot be empty'),\",\n );\n }\n\n const isPostgresDocker =\n hasDocker &&\n dbDialect === 'postgresql' &&\n (!postgresProvider || postgresProvider === 'docker');\n\n const dockerImport = isPostgresDocker\n ? [\n '// Run Docker infrastructure validation whenever database environment is loaded',\n \"import './docker.js';\",\n '',\n ]\n : [];\n\n return [\n \"import { z } from 'zod';\",\n \"import { createEnv } from '../create-env.js';\",\n ...dockerImport,\n '// Strict database environment schema',\n \"export const { env: db, schema: dbSchema } = createEnv('Database', {\",\n schemaFields.join('\\n'),\n '});',\n '',\n 'export const env = db;',\n 'export type DbEnv = z.infer<typeof dbSchema>;',\n '',\n ].join('\\n');\n}\n","import type { EnvSetupOptions } from '../types.js';\n\nexport function renderDockerEnvTemplate(options: EnvSetupOptions): string {\n const { hasDb, dbDialect, postgresProvider, hasRedis } = options;\n\n const isPostgresDocker =\n hasDb &&\n dbDialect === 'postgresql' &&\n (!postgresProvider || postgresProvider === 'docker');\n\n const schemaFields: string[] = [];\n\n if (isPostgresDocker) {\n schemaFields.push(\n ' POSTGRES_USER: z.string({',\n \" required_error: 'POSTGRES_USER is required for Docker PostgreSQL. Please declare POSTGRES_USER in root .env',\",\n \" }).min(1, 'POSTGRES_USER cannot be empty'),\",\n ' POSTGRES_PASSWORD: z.string({',\n \" required_error: 'POSTGRES_PASSWORD is required for Docker PostgreSQL. Please declare POSTGRES_PASSWORD in root .env',\",\n \" }).min(1, 'POSTGRES_PASSWORD cannot be empty'),\",\n ' POSTGRES_DB: z.string({',\n \" required_error: 'POSTGRES_DB is required for Docker PostgreSQL. Please declare POSTGRES_DB in root .env',\",\n \" }).min(1, 'POSTGRES_DB cannot be empty'),\",\n ' POSTGRES_PORT: z.coerce.number({',\n \" required_error: 'POSTGRES_PORT is required for Docker PostgreSQL. Please declare POSTGRES_PORT in root .env',\",\n \" invalid_type_error: 'POSTGRES_PORT must be a valid number',\",\n ' }).default(5432),',\n );\n }\n\n if (hasRedis) {\n schemaFields.push(\n ' REDIS_PORT: z.coerce.number({',\n \" required_error: 'REDIS_PORT is required for Redis. Please declare REDIS_PORT in root .env',\",\n \" invalid_type_error: 'REDIS_PORT must be a valid number',\",\n ' }).default(6379),',\n );\n }\n\n if (schemaFields.length === 0) {\n schemaFields.push(\" DOCKER_ENV: z.string().default('development'),\");\n }\n\n return [\n \"import { z } from 'zod';\",\n \"import { createEnv } from '../create-env.js';\",\n '',\n '// Strict Docker infrastructure schema',\n \"export const { env: docker, schema: dockerSchema } = createEnv('Docker Infrastructure', {\",\n schemaFields.join('\\n'),\n '});',\n '',\n 'export const env = docker;',\n 'export type DockerEnv = z.infer<typeof dockerSchema>;',\n '',\n ].join('\\n');\n}\n","import type { EnvSetupOptions } from '../types.js';\n\nexport function renderWebEnvTemplate(options: EnvSetupOptions): string {\n const isNext = options.webFramework === 'nextjs';\n const isReact = options.webFramework === 'react';\n const hasAuth = Boolean(options.hasAuth);\n\n const fields: string[] = [];\n\n if (isNext) {\n fields.push(\n \" NEXT_PUBLIC_API_URL: z.string().url().default('http://localhost:3001'),\",\n );\n if (hasAuth) {\n fields.push(\n \" NEXT_PUBLIC_BETTER_AUTH_URL: z.string().url().default('http://localhost:3001'),\",\n );\n }\n fields.push(' WEB_PORT: z.coerce.number().default(3000),');\n } else if (isReact) {\n fields.push(\n \" VITE_BACKEND_URL: z.string().url().default('http://localhost:3001'),\",\n );\n if (hasAuth) {\n fields.push(\n \" NEXT_PUBLIC_BETTER_AUTH_URL: z.string().url().default('http://localhost:3001'),\",\n );\n }\n fields.push(' WEB_PORT: z.coerce.number().default(5173),');\n } else {\n // webFramework === 'skip' but web env requested (e.g. auth is configured)\n fields.push(\n \" VITE_BACKEND_URL: z.string().url().default('http://localhost:3001'),\",\n );\n fields.push(\n \" NEXT_PUBLIC_BETTER_AUTH_URL: z.string().url().default('http://localhost:3001'),\",\n );\n fields.push(' WEB_PORT: z.coerce.number().default(3000),');\n }\n\n return [\n \"import { z } from 'zod';\",\n \"import { createEnv } from '../create-env.js';\",\n '',\n '// Web environment schema (frontend web apps)',\n 'export const webSchema = z.object({',\n ...fields,\n '});',\n '',\n \"export const { env: web, schema: webZodSchema } = createEnv('Web', webSchema);\",\n 'export const env = web;',\n 'export type WebEnv = z.infer<typeof webSchema>;',\n '',\n ].join('\\n');\n}\n","import type { EnvSetupOptions } from '../types.js';\n\nexport function renderAuthEnvTemplate(options: EnvSetupOptions): string {\n return [\n \"import { z } from 'zod';\",\n \"import { createEnv } from '../create-env.js';\",\n '',\n '// Strict Better Auth environment schema',\n 'export const authSchema = z.object({',\n ' BETTER_AUTH_SECRET: z.string({',\n \" required_error: 'BETTER_AUTH_SECRET is required. Please declare BETTER_AUTH_SECRET in root .env',\",\n ' }),',\n \" BETTER_AUTH_URL: z.string().url().default('http://localhost:3001'),\",\n ' CLIENT_URL: z.string().default(\\'[\"http://localhost:5173\", \"http://localhost:3000\"]\\'),',\n ' COOKIE_DOMAIN: z.string().optional(),',\n ' GOOGLE_CLIENT_ID: z.string({',\n \" required_error: 'GOOGLE_CLIENT_ID is required. Please declare GOOGLE_CLIENT_ID in root .env',\",\n \" }).default('google-client-id'),\",\n ' GOOGLE_CLIENT_SECRET: z.string({',\n \" required_error: 'GOOGLE_CLIENT_SECRET is required. Please declare GOOGLE_CLIENT_SECRET in root .env',\",\n \" }).default('google-client-secret'),\",\n ' GITHUB_CLIENT_ID: z.string().optional(),',\n ' GITHUB_CLIENT_SECRET: z.string().optional(),',\n '});',\n '',\n \"export const { env: auth, schema: authZodSchema } = createEnv('Auth', authSchema);\",\n 'export const env = auth;',\n 'export type AuthEnv = z.infer<typeof authSchema>;',\n '',\n ].join('\\n');\n}\n","import type { EnvSetupOptions } from '../types.js';\n\nexport function renderIndexEnvTemplate(options: EnvSetupOptions): string {\n const { hasServer, hasDb, hasDocker, hasAuth, webFramework } = options;\n const hasWebEnv = webFramework !== 'skip' || Boolean(hasAuth);\n\n const imports: string[] = [];\n const envProperties: string[] = [];\n\n if (hasServer) {\n imports.push(\"import { server } from './schema/server.js';\");\n envProperties.push(' server,');\n }\n\n if (hasDb) {\n imports.push(\"import { db } from './schema/db.js';\");\n envProperties.push(' db,');\n }\n\n if (hasDocker) {\n imports.push(\"import { docker } from './schema/docker.js';\");\n envProperties.push(' docker,');\n }\n\n if (hasAuth) {\n imports.push(\"import { auth } from './schema/auth.js';\");\n envProperties.push(' auth,');\n }\n\n if (hasWebEnv) {\n imports.push(\"import { web } from './schema/web.js';\");\n envProperties.push(' web,');\n }\n\n return [...imports, '', 'export const env = {', ...envProperties, '};', '']\n .filter(Boolean)\n .join('\\n');\n}\n","import type { EnvSetupOptions } from '../types.js';\n\nexport function renderCheckEnvTemplate(options: EnvSetupOptions): string {\n const { hasServer, hasDb, hasDocker, hasAuth, webFramework } = options;\n const hasWebEnv = webFramework !== 'skip' || Boolean(hasAuth);\n const imports: string[] = [];\n\n if (hasDocker) {\n imports.push(\"import './schema/docker.js';\");\n }\n if (hasDb) {\n imports.push(\"import './schema/db.js';\");\n }\n if (hasServer) {\n imports.push(\"import './schema/server.js';\");\n }\n if (hasAuth) {\n imports.push(\"import './schema/auth.js';\");\n }\n if (hasWebEnv) {\n imports.push(\"import './schema/web.js';\");\n }\n\n return [\n '// Standalone CLI checker to validate all environment variables at once',\n '// Useful for pre-commit hooks, Docker build validation, and CI/CD pipelines',\n ...imports,\n '',\n \"console.log('✔ All environment variables validated successfully!');\",\n '',\n ].join('\\n');\n}\n","import fsPromises from 'fs/promises';\nimport path from 'path';\nimport { confirm, spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport handleCancel from '../../../utils/isCancel.js';\nimport type {\n DbDialect,\n ServerFramework,\n ServerRuntime,\n WebFramework,\n} from '../../../types/options.js';\n\nexport interface AuthSetupOptions {\n projectPath: string;\n dialect?: DbDialect;\n serverFramework: ServerFramework;\n serverRuntime: ServerRuntime;\n webFramework: WebFramework;\n hasServer: boolean;\n hasWeb: boolean;\n hasEnv: boolean;\n}\n\nexport async function promptAuth(): Promise<boolean> {\n const result = await confirm({\n message: 'Configure authentication (Better Auth)?',\n initialValue: true,\n });\n\n handleCancel(result);\n return result as boolean;\n}\n\nexport async function setupAuth(options: AuthSetupOptions) {\n const { projectPath, dialect, serverFramework, hasServer, hasEnv } = options;\n\n const s = spinner();\n s.start('Configuring shared Better Auth package (@repo/auth)...');\n\n try {\n const authDir = path.join(projectPath, 'packages', 'auth');\n const authSrcDir = path.join(authDir, 'src');\n await fsPromises.mkdir(authSrcDir, { recursive: true });\n\n const authLibDir = path.join(authSrcDir, 'lib');\n await fsPromises.mkdir(authLibDir, { recursive: true });\n\n // 1. packages/auth/package.json\n const authPkg = {\n name: '@repo/auth',\n version: '1.0.0',\n description: 'Shared Better Auth server configurations',\n private: true,\n type: 'module',\n main: './src/index.ts',\n types: './src/index.ts',\n exports: {\n '.': {\n types: './src/index.ts',\n default: './src/index.ts',\n },\n './lib/auth': {\n types: './src/lib/auth.ts',\n default: './src/lib/auth.ts',\n },\n './lib/origins': {\n types: './src/lib/origins.ts',\n default: './src/lib/origins.ts',\n },\n },\n scripts: {\n build: 'tsc',\n },\n dependencies: {\n '@repo/db': 'workspace:*',\n 'better-auth': '^1.1.21',\n ...(hasEnv ? { '@repo/env': 'workspace:*' } : {}),\n },\n devDependencies: {\n '@config/typescript': 'workspace:*',\n typescript: '^5.7.3',\n },\n };\n\n await fsPromises.writeFile(\n path.join(authDir, 'package.json'),\n JSON.stringify(authPkg, null, 2),\n 'utf8',\n );\n\n // 2. packages/auth/tsconfig.json\n const tsconfig = {\n extends: '@config/typescript/tsconfig.json',\n compilerOptions: {\n rootDir: 'src',\n outDir: 'dist',\n },\n include: ['src/**/*'],\n };\n\n await fsPromises.writeFile(\n path.join(authDir, 'tsconfig.json'),\n JSON.stringify(tsconfig, null, 2),\n 'utf8',\n );\n\n // 3. packages/auth/src/lib/origins.ts\n const rawClientUrlExpr = hasEnv\n ? 'env.auth.CLIENT_URL'\n : 'process.env.CLIENT_URL || \\'[\"http://localhost:5173\", \"http://localhost:3000\"]\\'';\n const authUrlExpr = hasEnv\n ? 'env.auth.BETTER_AUTH_URL'\n : \"process.env.BETTER_AUTH_URL || 'http://localhost:3001'\";\n const isProdExpr = hasEnv\n ? \"env.server.NODE_ENV === 'production'\"\n : \"process.env.NODE_ENV === 'production'\";\n\n const originsLibLines: string[] = [];\n if (hasEnv) {\n originsLibLines.push(\"import { env } from '@repo/env';\", '');\n }\n originsLibLines.push(\n '/**',\n ' * Parse client URLs from environment variable (supports JSON array or comma-separated list)',\n ' */',\n 'function parseClientUrls(clientUrlInput: string): string[] {',\n ' try {',\n ' const trimmed = clientUrlInput.trim();',\n \" if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\",\n ' const parsed = JSON.parse(trimmed);',\n ' if (Array.isArray(parsed)) {',\n ' return parsed.map((url) => String(url).trim()).filter(Boolean);',\n ' }',\n ' }',\n ' return trimmed',\n \" .split(',')\",\n ' .map((url) => url.trim())',\n ' .filter(Boolean);',\n ' } catch {',\n ' return [clientUrlInput.trim()];',\n ' }',\n '}',\n '',\n `const clientUrls = parseClientUrls(${rawClientUrlExpr});`,\n '',\n '/**',\n ' * Allowed trusted origins for CORS and Better Auth callbacks',\n ' */',\n `export const origins = Array.from(new Set([...clientUrls, ${authUrlExpr}]));`,\n 'export const trustedOrigins = origins;',\n '',\n `export const isProduction = ${isProdExpr};`,\n '',\n );\n\n await fsPromises.writeFile(\n path.join(authLibDir, 'origins.ts'),\n originsLibLines.join('\\n'),\n 'utf8',\n );\n\n // 4. packages/auth/src/lib/auth.ts\n const isSqlite = dialect === 'sqlite';\n const secretExpr = hasEnv\n ? 'env.auth.BETTER_AUTH_SECRET'\n : \"process.env.BETTER_AUTH_SECRET || 'secret-morax-auth-key-change-in-production'\";\n const baseUrlExpr = hasEnv\n ? 'env.auth.BETTER_AUTH_URL'\n : \"process.env.BETTER_AUTH_URL || 'http://localhost:3001'\";\n const cookieDomainExpr = hasEnv\n ? 'env.auth.COOKIE_DOMAIN'\n : 'process.env.COOKIE_DOMAIN';\n const googleIdExpr = hasEnv\n ? 'env.auth.GOOGLE_CLIENT_ID'\n : \"process.env.GOOGLE_CLIENT_ID || 'google-client-id'\";\n const googleSecretExpr = hasEnv\n ? 'env.auth.GOOGLE_CLIENT_SECRET'\n : \"process.env.GOOGLE_CLIENT_SECRET || 'google-client-secret'\";\n\n const authLibLines: string[] = [\n '/* eslint-disable @typescript-eslint/no-explicit-any */',\n \"import { betterAuth } from 'better-auth';\",\n \"import { drizzleAdapter } from 'better-auth/adapters/drizzle';\",\n \"import { db, user, session, account, verification } from '@repo/db';\",\n ];\n if (hasEnv) {\n authLibLines.push(\"import { env } from '@repo/env';\");\n }\n authLibLines.push(\n \"import { isProduction, origins } from './origins.js';\",\n '',\n 'export const auth = betterAuth({',\n ` secret: ${secretExpr},`,\n ` baseURL: ${baseUrlExpr},`,\n ' trustedOrigins: origins,',\n ' advanced: {',\n ' useSecureCookies: isProduction,',\n ' crossSubDomainCookies: {',\n ` enabled: isProduction && Boolean(${cookieDomainExpr}),`,\n ` domain: ${cookieDomainExpr} || undefined,`,\n ' },',\n ' },',\n ' session: {',\n ' cookieCache: {',\n ' enabled: true,',\n ' maxAge: 60 * 60, // 1 hour',\n ' },',\n ' },',\n ' database: drizzleAdapter(db, {',\n ` provider: '${isSqlite ? 'sqlite' : 'pg'}',`,\n ' schema: {',\n ' user,',\n ' session,',\n ' account,',\n ' verification,',\n ' },',\n ' }),',\n ' emailAndPassword: {',\n ' enabled: true,',\n ' },',\n ' socialProviders: {',\n ' google: {',\n ` clientId: ${googleIdExpr},`,\n ` clientSecret: ${googleSecretExpr},`,\n ' },',\n ' },',\n ' onError: (error: any) => {',\n \" console.error('Better Auth Error:', error.message);\",\n ' return {',\n \" status: 'error',\",\n ' message: error.message,',\n ' redirect: origins[0],',\n ' };',\n ' },',\n '});',\n '',\n 'export type Auth = typeof auth;',\n '',\n );\n\n await fsPromises.writeFile(\n path.join(authLibDir, 'auth.ts'),\n authLibLines.join('\\n'),\n 'utf8',\n );\n\n // 5. packages/auth/src/origins.ts (re-export wrapper for backwards compatibility)\n const originsReexport = [\n '/**',\n ' * Re-export origins and trustedOrigins from lib/origins.js for backwards compatibility',\n ' */',\n \"export { origins, trustedOrigins, isProduction } from './lib/origins.js';\",\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(authSrcDir, 'origins.ts'),\n originsReexport,\n 'utf8',\n );\n\n // 6. packages/auth/src/index.ts\n const authIndexContent = [\n '/**',\n ' * Centralized Better Auth Server Exports',\n ' * Configured in src/lib/auth.ts and src/lib/origins.ts',\n ' */',\n \"export { auth, type Auth } from './lib/auth.js';\",\n \"export { origins, trustedOrigins, isProduction } from './lib/origins.js';\",\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(authSrcDir, 'index.ts'),\n authIndexContent,\n 'utf8',\n );\n\n // 7. Generate packages/db/src/schema/auth.ts (Drizzle schema)\n const dbDir = path.join(projectPath, 'packages', 'db');\n const schemaDir = path.join(dbDir, 'src', 'schema');\n await fsPromises.mkdir(schemaDir, { recursive: true });\n\n let authSchemaContent: string;\n if (isSqlite) {\n authSchemaContent = [\n \"import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\",\n '',\n \"export const user = sqliteTable('user', {\",\n \" id: text('id').primaryKey(),\",\n \" name: text('name').notNull(),\",\n \" email: text('email').notNull().unique(),\",\n \" emailVerified: integer('email_verified', { mode: 'boolean' }).default(false).notNull(),\",\n \" image: text('image'),\",\n \" createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),\",\n \" updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(),\",\n '});',\n '',\n \"export const session = sqliteTable('session', {\",\n \" id: text('id').primaryKey(),\",\n \" expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull(),\",\n \" token: text('token').notNull().unique(),\",\n \" createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),\",\n \" updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(),\",\n \" ipAddress: text('ip_address'),\",\n \" userAgent: text('user_agent'),\",\n \" userId: text('user_id')\",\n ' .notNull()',\n \" .references(() => user.id, { onDelete: 'cascade' }),\",\n '});',\n '',\n \"export const account = sqliteTable('account', {\",\n \" id: text('id').primaryKey(),\",\n \" accountId: text('account_id').notNull(),\",\n \" providerId: text('provider_id').notNull(),\",\n \" userId: text('user_id')\",\n ' .notNull()',\n \" .references(() => user.id, { onDelete: 'cascade' }),\",\n \" accessToken: text('access_token'),\",\n \" refreshToken: text('refresh_token'),\",\n \" idToken: text('id_token'),\",\n \" accessTokenExpiresAt: integer('access_token_expires_at', { mode: 'timestamp' }),\",\n \" refreshTokenExpiresAt: integer('refreshToken_expires_at', { mode: 'timestamp' }),\",\n \" scope: text('scope'),\",\n \" password: text('password'),\",\n \" createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),\",\n \" updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(),\",\n '});',\n '',\n \"export const verification = sqliteTable('verification', {\",\n \" id: text('id').primaryKey(),\",\n \" identifier: text('identifier').notNull(),\",\n \" value: text('value').notNull(),\",\n \" expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull(),\",\n \" createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),\",\n \" updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(),\",\n '});',\n '',\n 'export type User = typeof user.$inferSelect;',\n 'export type Session = typeof session.$inferSelect;',\n 'export type Account = typeof account.$inferSelect;',\n 'export type Verification = typeof verification.$inferSelect;',\n '',\n ].join('\\n');\n } else {\n authSchemaContent = [\n \"import { pgTable, text, timestamp, boolean } from 'drizzle-orm/pg-core';\",\n '',\n \"export const user = pgTable('user', {\",\n \" id: text('id').primaryKey(),\",\n \" name: text('name').notNull(),\",\n \" email: text('email').notNull().unique(),\",\n \" emailVerified: boolean('email_verified').default(false).notNull(),\",\n \" image: text('image'),\",\n \" createdAt: timestamp('created_at').defaultNow().notNull(),\",\n \" updatedAt: timestamp('updated_at').defaultNow().notNull(),\",\n '});',\n '',\n \"export const session = pgTable('session', {\",\n \" id: text('id').primaryKey(),\",\n \" expiresAt: timestamp('expires_at').notNull(),\",\n \" token: text('token').notNull().unique(),\",\n \" createdAt: timestamp('created_at').defaultNow().notNull(),\",\n \" updatedAt: timestamp('updated_at').defaultNow().notNull(),\",\n \" ipAddress: text('ip_address'),\",\n \" userAgent: text('user_agent'),\",\n \" userId: text('user_id')\",\n ' .notNull()',\n \" .references(() => user.id, { onDelete: 'cascade' }),\",\n '});',\n '',\n \"export const account = pgTable('account', {\",\n \" id: text('id').primaryKey(),\",\n \" accountId: text('account_id').notNull(),\",\n \" providerId: text('provider_id').notNull(),\",\n \" userId: text('user_id')\",\n ' .notNull()',\n \" .references(() => user.id, { onDelete: 'cascade' }),\",\n \" accessToken: text('access_token'),\",\n \" refreshToken: text('refresh_token'),\",\n \" idToken: text('id_token'),\",\n \" accessTokenExpiresAt: timestamp('access_token_expires_at'),\",\n \" refreshTokenExpiresAt: timestamp('refresh_token_expires_at'),\",\n \" scope: text('scope'),\",\n \" password: text('password'),\",\n \" createdAt: timestamp('created_at').defaultNow().notNull(),\",\n \" updatedAt: timestamp('updated_at').defaultNow().notNull(),\",\n '});',\n '',\n \"export const verification = pgTable('verification', {\",\n \" id: text('id').primaryKey(),\",\n \" identifier: text('identifier').notNull(),\",\n \" value: text('value').notNull(),\",\n \" expiresAt: timestamp('expires_at').notNull(),\",\n \" createdAt: timestamp('created_at').defaultNow().notNull(),\",\n \" updatedAt: timestamp('updated_at').defaultNow().notNull(),\",\n '});',\n '',\n 'export type User = typeof user.$inferSelect;',\n 'export type Session = typeof session.$inferSelect;',\n 'export type Account = typeof account.$inferSelect;',\n 'export type Verification = typeof verification.$inferSelect;',\n '',\n ].join('\\n');\n }\n\n await fsPromises.writeFile(\n path.join(schemaDir, 'auth.ts'),\n authSchemaContent,\n 'utf8',\n );\n\n // 7. Update packages/db/src/schema/index.ts to re-export auth schemas\n const schemaIndexPath = path.join(schemaDir, 'index.ts');\n try {\n const existing = await fsPromises.readFile(schemaIndexPath, 'utf8');\n if (\n !existing.includes(\"from './auth.js'\") &&\n !existing.includes(\"from './auth'\")\n ) {\n const updated = `${existing}\\nexport * from './auth.js';\\n`;\n await fsPromises.writeFile(schemaIndexPath, updated, 'utf8');\n }\n } catch {}\n\n // 8. Mount Better Auth in apps/server (if server exists)\n if (hasServer && serverFramework !== 'none') {\n const serverDir = path.join(projectPath, 'apps', 'server');\n const serverPkgPath = path.join(serverDir, 'package.json');\n\n try {\n const rawPkg = await fsPromises.readFile(serverPkgPath, 'utf8');\n const pkg = JSON.parse(rawPkg);\n pkg.dependencies = pkg.dependencies || {};\n pkg.dependencies['@repo/auth'] = 'workspace:*';\n if (serverFramework === 'express') {\n pkg.dependencies['better-auth'] = '^1.1.21';\n }\n await fsPromises.writeFile(\n serverPkgPath,\n JSON.stringify(pkg, null, 2),\n 'utf8',\n );\n } catch {}\n\n // Update apps/server/src/index.ts to mount auth routes\n const serverIndexPath = path.join(serverDir, 'src', 'index.ts');\n try {\n let content = await fsPromises.readFile(serverIndexPath, 'utf8');\n\n if (serverFramework === 'express') {\n if (!content.includes('@repo/auth')) {\n content = content.replace(\n \"import express from 'express';\",\n \"import express from 'express';\\nimport { auth, trustedOrigins } from '@repo/auth';\\nimport { toNodeHandler } from 'better-auth/node';\",\n );\n // Replace basic cors with credentials-enabled cors\n content = content.replace(\n 'app.use(cors());',\n 'app.use(\\n cors({\\n origin: trustedOrigins,\\n credentials: true,\\n }),\\n);',\n );\n // Mount auth handler right before app.use(express.json());\n content = content.replace(\n 'app.use(express.json());',\n \"// Mount Better Auth endpoints (/api/auth/*)\\napp.all('/api/auth/*', toNodeHandler(auth));\\n\\napp.use(express.json());\",\n );\n await fsPromises.writeFile(serverIndexPath, content, 'utf8');\n }\n } else if (serverFramework === 'hono') {\n if (!content.includes('@repo/auth')) {\n content = content.replace(\n \"import { Hono } from 'hono';\",\n \"import { Hono } from 'hono';\\nimport { auth, trustedOrigins } from '@repo/auth';\",\n );\n // Replace basic cors with credentials-enabled cors\n content = content.replace(\n \"app.use('*', cors());\",\n \"app.use(\\n '*',\\n cors({\\n origin: (origin) => (trustedOrigins.includes(origin) ? origin : trustedOrigins[0]),\\n credentials: true,\\n }),\\n);\",\n );\n // Mount auth handler after cors\n content = content.replace(\n 'const app = new Hono();',\n \"const app = new Hono();\\n\\n// Mount Better Auth API handler\\napp.on(['POST', 'GET'], '/api/auth/**', (c) => {\\n return auth.handler(c.req.raw);\\n});\",\n );\n await fsPromises.writeFile(serverIndexPath, content, 'utf8');\n }\n }\n } catch {}\n }\n\n // 8. Update root .env and .env.example\n const envLinesToAdd = [\n '# Better Auth',\n 'BETTER_AUTH_SECRET=secret-morax-auth-key-change-in-production',\n 'BETTER_AUTH_URL=http://localhost:3001',\n 'NEXT_PUBLIC_BETTER_AUTH_URL=http://localhost:3001',\n '',\n ].join('\\n');\n\n for (const envFileName of ['.env', '.env.example']) {\n const envFilePath = path.join(projectPath, envFileName);\n try {\n const raw = await fsPromises.readFile(envFilePath, 'utf8');\n if (!raw.includes('BETTER_AUTH_SECRET')) {\n await fsPromises.appendFile(\n envFilePath,\n `\\n${envLinesToAdd}`,\n 'utf8',\n );\n }\n } catch {}\n }\n s.stop(\n pc.green(\n '✔ Success: Better Auth configured in packages/auth & packages/db',\n ),\n );\n } catch (error: any) {\n s.stop(pc.red('✖ Failed: Better Auth setup encountered an error'));\n console.error(pc.red(`\\nError details: ${error.message || error}`));\n }\n}\n","import { spinner } from '@clack/prompts';\nimport pc from 'picocolors';\nimport fsPromises from 'fs/promises';\nimport path from 'path';\n\nexport interface DockerSetupOptions {\n projectName: string;\n postgres?: boolean;\n redis?: boolean;\n}\n\nexport async function setupDocker(\n projectPath: string,\n options: DockerSetupOptions,\n) {\n if (!options.postgres && !options.redis) {\n return;\n }\n\n const s = spinner();\n s.start('Configuring root Docker infrastructure in docker/...');\n\n try {\n const dockerDir = path.join(projectPath, 'docker');\n await fsPromises.mkdir(dockerDir, { recursive: true });\n\n const safeName = options.projectName.replace(/[^a-zA-Z0-9_-]/g, '_');\n const services: string[] = [];\n const volumes: string[] = [];\n\n if (options.postgres) {\n services.push(\n [\n ' postgres:',\n ' image: postgres:17-alpine',\n ` container_name: ${safeName}_postgres`,\n ' restart: unless-stopped',\n ' profiles:',\n ' - postgres',\n ' - infra',\n ' env_file:',\n ' - ../.env',\n ' ports:',\n \" - '${POSTGRES_PORT:?POSTGRES_PORT is required}:5432'\",\n ' volumes:',\n ' - postgres_data:/var/lib/postgresql/data',\n ' healthcheck:',\n \" test: ['CMD-SHELL', 'pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB']\",\n ' interval: 5s',\n ' timeout: 5s',\n ' retries: 5',\n ].join('\\n'),\n );\n volumes.push(' postgres_data:');\n }\n\n if (options.redis) {\n services.push(\n [\n ' redis:',\n ' image: redis:7-alpine',\n ` container_name: ${safeName}_redis`,\n ' restart: unless-stopped',\n ' profiles:',\n ' - redis',\n ' - infra',\n ' env_file:',\n ' - ../.env',\n ' ports:',\n \" - '${REDIS_PORT:?REDIS_PORT is required}:6379'\",\n ' volumes:',\n ' - redis_data:/data',\n ' healthcheck:',\n \" test: ['CMD', 'redis-cli', 'ping']\",\n ' interval: 5s',\n ' timeout: 5s',\n ' retries: 5',\n ].join('\\n'),\n );\n volumes.push(' redis_data:');\n }\n\n const composeContent = [\n 'services:',\n services.join('\\n\\n'),\n '',\n 'volumes:',\n volumes.join('\\n'),\n '',\n ].join('\\n');\n\n await fsPromises.writeFile(\n path.join(dockerDir, 'docker-compose.yml'),\n composeContent,\n 'utf8',\n );\n\n const configuredList = [\n options.postgres ? 'PostgreSQL' : null,\n options.redis ? 'Redis' : null,\n ]\n .filter(Boolean)\n .join(', ');\n\n s.stop(\n pc.green(\n `✔ Success: Docker infrastructure configured in docker/ (${configuredList})`,\n ),\n );\n } catch (err: any) {\n s.stop(pc.red('✖ Failed: Docker configuration failed'));\n console.error(pc.red(`\\nError details: ${err.message || err}`));\n }\n}\n"],"mappings":"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","names":["pc","path","spinner","pc","pc","pc","pc","pc","select","select","pc","fsPromises","fsPromises","pc","select","select","select","pc","path","spinner","pc","pc","fsPromises","path","spinner","text","path","pc","fsPromises","spinner","text","confirm","spinner","pc","fsPromises","path","confirm","fsPromises","path","spinner","pc","fsPromises","path","path","spinner","pc","path","spinner","pc","confirm","pc","fsPromises","path","spawn","runInteractiveCommand","spawn","path","fsPromises","pc","confirm","pc","fsPromises","path","spawn","confirm","runInteractiveCommand","pc","path","spinner","pc","spinner","fsPromises","path","pc","fsPromises","path","fsPromises","path","path","fsPromises","spinner","pc","multiselect","select","spinner","pc","fsPromises","path","fsPromises","path","fsPromises","path","fsPromises","path","multiselect","select","spinner","pc","multiselect","spinner","pc","fsPromises","path","multiselect","spinner","pc","path","fsPromises","fsPromises","path","confirm","spinner","pc","fsPromises","path","path","fsPromises","spinner","pc","spinner","pc","fsPromises","path","fsPromises","path","spinner","pc","spinner","pc","fsPromises","path","fsPromises","path","spinner","pc","spinner","pc","fsPromises","path","fsPromises","path","spinner","pc","confirm","spinner","pc","fsPromises","path","fsPromises","path","spinner","pc","spinner","pc","fsPromises","path","path","fsPromises","spinner","pc","fsPromises","path","spinner","pc","fsPromises","path","path","fsPromises","fsPromises","path","path","fsPromises","select","select","path","spinner","pc","fsPromises","path","fsPromises","path","path","spinner","pc","path","spinner","pc","fsPromises","path","fsPromises","path","fsPromises","path","path","spinner","pc","path","fsPromises","spinner","pc","select","select","fsPromises","path","confirm","spinner","pc","confirm","fsPromises","path","spinner","pc","fsPromises","path","confirm","spinner","pc","confirm","spinner","path","fsPromises","pc","spinner","pc","fsPromises","path","path","spinner","pc","pc"]}