@revealui/cli 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -361,6 +361,7 @@ function validateNodeVersion() {
361
361
 
362
362
  // src/commands/create.ts
363
363
  import crypto from "crypto";
364
+ import { existsSync } from "fs";
364
365
  import fs5 from "fs/promises";
365
366
  import path5 from "path";
366
367
  import { fileURLToPath } from "url";
@@ -702,7 +703,7 @@ async function isGitInstalled() {
702
703
  var logger5 = createLogger5({ prefix: "Create" });
703
704
  var __filename2 = fileURLToPath(import.meta.url);
704
705
  var __dirname2 = path5.dirname(__filename2);
705
- var TEMPLATES_DIR = path5.resolve(__dirname2, "../../templates");
706
+ var TEMPLATES_DIR = existsSync(path5.resolve(__dirname2, "../../templates")) ? path5.resolve(__dirname2, "../../templates") : path5.resolve(__dirname2, "../templates");
706
707
  function buildEnvLocal(cfg) {
707
708
  const lines = [
708
709
  "# Generated by @revealui/cli \u2014 fill in the remaining placeholders before running `pnpm dev`",
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/create-flow.ts","../src/prompts/database.ts","../src/validators/credentials.ts","../src/prompts/devenv.ts","../src/prompts/payments.ts","../src/prompts/project.ts","../src/prompts/storage.ts","../src/validators/node-version.ts","../src/commands/create.ts","../src/generators/devbox.ts","../src/generators/devcontainer.ts","../src/generators/readme.ts","../src/installers/dependencies.ts","../src/utils/git.ts","../src/commands/db.ts","../src/utils/command.ts","../src/utils/db.ts","../src/utils/workspace.ts","../src/commands/dev.ts","../src/runtime/doctor.ts","../src/utils/dev-config.ts","../src/commands/doctor.ts","../src/commands/shell.ts"],"sourcesContent":["/**\n * CLI definition using Commander.js\n */\n\nimport { createLogger } from '@revealui/setup/utils';\nimport { Command } from 'commander';\nimport { runCreateFlow } from './commands/create-flow.js';\nimport {\n runDbCleanupCommand,\n runDbInitCommand,\n runDbMigrateCommand,\n runDbResetCommand,\n runDbStartCommand,\n runDbStatusCommand,\n runDbStopCommand,\n} from './commands/db.js';\nimport {\n type DevProfileName,\n runDevDownCommand,\n runDevProfileSetCommand,\n runDevProfileShowCommand,\n runDevStatusCommand,\n runDevUpCommand,\n} from './commands/dev.js';\nimport { runDoctorCommand } from './commands/doctor.js';\n\nconst logger = createLogger({ prefix: 'CLI' });\n\nexport interface CliOptions {\n template?: string;\n skipGit?: boolean;\n skipInstall?: boolean;\n yes?: boolean;\n}\n\nfunction configureCreateCommand(command: Command, legacyName?: string): Command {\n command\n .description('Create a new RevealUI project')\n .argument('[project-name]', 'Name of the project')\n .option('-t, --template <name>', 'Template to use (basic-blog, e-commerce, portfolio)')\n .option('--skip-git', 'Skip git initialization', false)\n .option('--skip-install', 'Skip dependency installation', false)\n .option('-y, --yes', 'Skip all prompts and use defaults', false)\n .action(async (projectName: string | undefined, options: CliOptions) => {\n logger.header(legacyName ? 'Create RevealUI Project' : 'RevealUI Create');\n await runCreateFlow(projectName, options);\n });\n\n return command;\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n program.name('revealui').description('RevealUI operational CLI').version('0.2.0');\n\n configureCreateCommand(program.command('create'), undefined);\n\n program\n .command('doctor')\n .description('Check RevealUI workspace and developer environment health')\n .option('--json', 'Output machine-readable JSON', false)\n .option('--fix', 'Apply safe automatic fixes when possible', false)\n .option('--strict', 'Exit nonzero when checks fail', false)\n .action(async (options: { json?: boolean; fix?: boolean; strict?: boolean }) => {\n await runDoctorCommand(options);\n });\n\n const db = program.command('db').description('Manage the local RevealUI database');\n\n db.command('init')\n .description('Initialize the local PostgreSQL data directory')\n .option('--force', 'Delete and recreate the local data directory', false)\n .action(async (options: { force?: boolean }) => {\n await runDbInitCommand(options);\n });\n\n db.command('start')\n .description('Start the local PostgreSQL server')\n .action(async () => {\n await runDbStartCommand();\n });\n\n db.command('stop')\n .description('Stop the local PostgreSQL server')\n .action(async () => {\n await runDbStopCommand();\n });\n\n db.command('status')\n .description('Show local PostgreSQL status')\n .action(async () => {\n await runDbStatusCommand();\n });\n\n db.command('reset')\n .description('Reset the local PostgreSQL data directory')\n .option('--force', 'Confirm the destructive reset', false)\n .action(async (options: { force?: boolean }) => {\n await runDbResetCommand(options);\n });\n\n db.command('migrate')\n .description('Run Drizzle migrations using the local RevealUI database environment')\n .action(async () => {\n await runDbMigrateCommand();\n });\n\n db.command('cleanup')\n .description(\n 'Delete expired sessions, rate-limit rows, password-reset tokens, magic links, and publish due scheduled pages. Uses DATABASE_URL / POSTGRES_URL from the environment.',\n )\n .option('--dry-run', 'Count stale rows without deleting them', false)\n .option(\n '--tables <names>',\n 'Comma-separated subset: sessions,rateLimits,passwordResetTokens,magicLinks,scheduledPages',\n )\n .action(async (options: { dryRun?: boolean; tables?: string }) => {\n await runDbCleanupCommand(options);\n });\n\n const dev = program\n .command('dev')\n .description('Prepare and manage the RevealUI development workspace');\n\n dev\n .command('up')\n .description(\n 'Ensure the local dev environment is ready, migrate the DB, optionally validate MCP, and start a dev script',\n )\n .option('--json', 'Output machine-readable JSON', false)\n .option('--dry-run', 'Print the effective plan and actions without executing them', false)\n .option('--fix', 'Apply safe automatic fixes before bootstrapping when possible', false)\n .option('--no-ensure', 'Skip automatic local DB initialization/start')\n .option('--profile <name>', 'Named dev profile: local, agent, cms, fullstack')\n .option(\n '--include <service...>',\n 'Additional development services to prepare (currently supports: mcp)',\n )\n .option('--script <name>', 'Optional pnpm script to run after environment bootstrap')\n .option('--inside', 'Internal flag used after re-entering nix develop', false)\n .action(\n async (options: {\n ensure?: boolean;\n json?: boolean;\n dryRun?: boolean;\n fix?: boolean;\n script?: string;\n profile?: DevProfileName;\n include?: string[];\n inside?: boolean;\n }) => {\n await runDevUpCommand(options);\n },\n );\n\n dev\n .command('status')\n .description('Show current RevealUI development environment status')\n .option('--json', 'Output machine-readable JSON', false)\n .option('--profile <name>', 'Named dev profile: local, agent, cms, fullstack')\n .option(\n '--include <service...>',\n 'Additional development services to preview in the effective plan',\n )\n .option('--script <name>', 'Optional pnpm script to preview in the effective plan')\n .option('--inside', 'Internal flag used after re-entering nix develop', false)\n .action(\n async (options: {\n json?: boolean;\n profile?: DevProfileName;\n include?: string[];\n script?: string;\n inside?: boolean;\n }) => {\n await runDevStatusCommand(options);\n },\n );\n\n dev\n .command('down')\n .description('Stop local RevealUI development services that are managed by the CLI')\n .action(async () => {\n await runDevDownCommand();\n });\n\n dev\n .command('shell')\n .description('Alias for `revealui dev up` without starting an app script')\n .option('--json', 'Output machine-readable JSON', false)\n .option('--dry-run', 'Print the effective plan and actions without executing them', false)\n .option('--fix', 'Apply safe automatic fixes before bootstrapping when possible', false)\n .option('--no-ensure', 'Skip automatic local DB initialization/start')\n .option('--profile <name>', 'Named dev profile: local, agent, cms, fullstack')\n .option(\n '--include <service...>',\n 'Additional development services to prepare (currently supports: mcp)',\n )\n .option('--inside', 'Internal flag used after re-entering nix develop', false)\n .action(\n async (options: {\n ensure?: boolean;\n json?: boolean;\n dryRun?: boolean;\n fix?: boolean;\n profile?: DevProfileName;\n include?: string[];\n inside?: boolean;\n }) => {\n await runDevUpCommand({\n ensure: options.ensure,\n json: options.json,\n dryRun: options.dryRun,\n fix: options.fix,\n profile: options.profile,\n include: options.include,\n inside: options.inside,\n });\n },\n );\n\n const devProfile = dev\n .command('profile')\n .description('Persist or inspect the default dev profile');\n\n devProfile\n .command('set')\n .description('Set the default profile used by `revealui dev up` and `revealui dev status`')\n .argument('<name>', 'Profile name: local, agent, cms, fullstack')\n .action(async (name: DevProfileName) => {\n await runDevProfileSetCommand(name);\n });\n\n devProfile\n .command('show')\n .description('Show the configured default dev profile')\n .option('--json', 'Output machine-readable JSON', false)\n .action(async (options: { json?: boolean }) => {\n await runDevProfileShowCommand(options);\n });\n\n program\n .command('shell')\n .description('Deprecated alias for `revealui dev shell`')\n .option('--ensure', 'Initialize/start the local DB when possible', false)\n .option('--json', 'Output machine-readable JSON', false)\n .option('--inside', 'Internal flag used after re-entering nix develop', false)\n .action(async (options: { ensure?: boolean; json?: boolean; inside?: boolean }) => {\n await runDevUpCommand({\n ensure: options.ensure,\n json: options.json,\n inside: options.inside,\n });\n });\n\n return program;\n}\n\nexport function createLegacyCreateCli(): Command {\n const program = new Command();\n\n program.name('create-revealui').version('0.2.0');\n configureCreateCommand(program, 'create-revealui');\n\n return program;\n}\n","import { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { createLogger } from '@revealui/setup/utils';\nimport { importSPKI, jwtVerify } from 'jose';\nimport type { CliOptions } from '../cli.js';\nimport { promptDatabaseConfig } from '../prompts/database.js';\nimport { promptDevEnvConfig } from '../prompts/devenv.js';\nimport { promptPaymentConfig } from '../prompts/payments.js';\nimport { promptProjectConfig } from '../prompts/project.js';\nimport { promptStorageConfig } from '../prompts/storage.js';\nimport { validateNodeVersion } from '../validators/node-version.js';\nimport { createProject } from './create.js';\n\nconst logger = createLogger({ prefix: '@revealui/cli' });\n\nconst PRO_TEMPLATES = new Set<string>([]);\n\nasync function checkProLicense(): Promise<boolean> {\n let key: string | undefined = process.env.REVEALUI_LICENSE_KEY;\n\n if (!key) {\n try {\n const licenseFile = join(homedir(), '.revealui', 'license.json');\n const parsed = JSON.parse(readFileSync(licenseFile, 'utf8')) as { key?: string };\n key = parsed.key;\n } catch {\n // No license file — free tier\n }\n }\n\n if (!key) return false;\n\n const publicKeyPem = process.env.REVEALUI_LICENSE_PUBLIC_KEY;\n if (publicKeyPem) {\n try {\n const publicKey = await importSPKI(publicKeyPem, 'RS256');\n const { payload } = await jwtVerify(key, publicKey);\n const tier = (payload as { tier?: string }).tier ?? 'free';\n return tier === 'pro' || tier === 'enterprise';\n } catch {\n return false;\n }\n }\n\n try {\n const parts = key.split('.');\n if (parts.length < 3) return false;\n const payload = JSON.parse(Buffer.from(parts[1] ?? '', 'base64url').toString('utf8')) as {\n tier?: string;\n exp?: number;\n };\n if (payload.exp !== undefined && payload.exp < Math.floor(Date.now() / 1000)) {\n return false;\n }\n const tier = payload.tier ?? 'free';\n return tier === 'pro' || tier === 'enterprise';\n } catch {\n return false;\n }\n}\n\nexport async function runCreateFlow(\n projectName: string | undefined,\n options: CliOptions,\n): Promise<void> {\n logger.info('[1/8] Validating Node.js version...');\n if (!validateNodeVersion()) {\n process.exit(1);\n }\n logger.success(`Node.js version: ${process.version}`);\n\n logger.info('[2/8] Configure your project');\n const projectConfig = await promptProjectConfig(projectName, options.template, options.yes);\n logger.success(`Project: ${projectConfig.projectName}`);\n logger.success(`Template: ${projectConfig.template}`);\n\n if (PRO_TEMPLATES.has(projectConfig.template)) {\n if (!(await checkProLicense())) {\n logger.error(`The \"${projectConfig.template}\" template requires a RevealUI Pro license.`);\n logger.info('Get Pro at https://revealui.com/pricing');\n logger.info('Set your license key: export REVEALUI_LICENSE_KEY=<your-key>');\n process.exit(2);\n }\n logger.success('Pro license verified');\n }\n\n const nonInteractive = options.yes === true;\n\n logger.info('[3/8] Configure database');\n const databaseConfig = nonInteractive\n ? { provider: 'skip' as const }\n : await promptDatabaseConfig();\n if (databaseConfig.provider !== 'skip') {\n logger.success(`Database: ${databaseConfig.provider}`);\n } else {\n logger.info('Database configuration skipped');\n }\n\n logger.info('[4/8] Configure storage');\n const storageConfig = nonInteractive\n ? { provider: 'skip' as const }\n : await promptStorageConfig();\n if (storageConfig.provider !== 'skip') {\n logger.success(`Storage: ${storageConfig.provider}`);\n } else {\n logger.info('Storage configuration skipped');\n }\n\n logger.info('[5/8] Configure payments');\n const paymentConfig = nonInteractive ? { enabled: false } : await promptPaymentConfig();\n if (paymentConfig.enabled) {\n logger.success('Stripe configured');\n } else {\n logger.info('Payments disabled');\n }\n\n logger.info('[6/8] Configure development environment');\n const devEnvConfig = nonInteractive\n ? { createDevContainer: false, createDevbox: false }\n : await promptDevEnvConfig();\n logger.success(\n `Dev Container: ${devEnvConfig.createDevContainer ? 'Yes' : 'No'}, Devbox: ${devEnvConfig.createDevbox ? 'Yes' : 'No'}`,\n );\n\n logger.info('[7/8] Creating project...');\n await createProject({\n project: projectConfig,\n database: databaseConfig,\n storage: storageConfig,\n payment: paymentConfig,\n devenv: devEnvConfig,\n skipGit: options.skipGit,\n skipInstall: options.skipInstall,\n });\n logger.success('Project created successfully');\n\n logger.info('[8/8] Next steps');\n logger.divider();\n logger.info(`cd ${projectConfig.projectName}`);\n logger.info('pnpm install');\n logger.info('pnpm dev');\n logger.divider();\n logger.success(`Project ${projectConfig.projectName} created successfully`);\n}\n","/**\n * Database configuration prompts\n */\n\nimport inquirer from 'inquirer';\nimport { validateNeonUrl } from '../validators/credentials.js';\n\nexport interface DatabaseConfig {\n provider: 'neon' | 'supabase' | 'local' | 'skip';\n postgresUrl?: string;\n}\n\nexport async function promptDatabaseConfig(): Promise<DatabaseConfig> {\n const { provider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'provider',\n message: 'Which database provider would you like to use?',\n choices: [\n {\n name: 'NeonDB - Serverless PostgreSQL (recommended)',\n value: 'neon',\n },\n {\n name: 'Supabase - PostgreSQL with built-in features',\n value: 'supabase',\n },\n {\n name: 'Local PostgreSQL - Use existing local database',\n value: 'local',\n },\n {\n name: 'Skip - Configure later',\n value: 'skip',\n },\n ],\n default: 'neon',\n },\n ]);\n\n if (provider === 'skip') {\n return { provider: 'skip' };\n }\n\n if (provider === 'local') {\n const { postgresUrl } = await inquirer.prompt([\n {\n type: 'input',\n name: 'postgresUrl',\n message: 'Enter your PostgreSQL connection string:',\n default: 'postgresql://postgres:postgres@localhost:5432/revealui',\n validate: async (input: string) => {\n const result = await validateNeonUrl(input);\n return result.valid ? true : result.message || 'Invalid database URL';\n },\n },\n ]);\n return { provider: 'local', postgresUrl };\n }\n\n // For Neon or Supabase, get the connection string\n const { postgresUrl } = await inquirer.prompt([\n {\n type: 'input',\n name: 'postgresUrl',\n message: `Enter your ${provider === 'neon' ? 'Neon' : 'Supabase'} database connection string:`,\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Database URL is required';\n }\n const result = await validateNeonUrl(input);\n return result.valid ? true : result.message || 'Invalid database URL';\n },\n },\n ]);\n\n return { provider, postgresUrl };\n}\n","/**\n * API credential validation\n */\n\nimport { createLogger } from '@revealui/setup/utils';\n\nconst logger = createLogger({ prefix: 'Validator' });\n\nexport interface CredentialValidation {\n valid: boolean;\n message?: string;\n}\n\nexport async function validateStripeKey(key: string): Promise<CredentialValidation> {\n if (!(key.startsWith('sk_test_') || key.startsWith('sk_live_'))) {\n return {\n valid: false,\n message: 'Stripe key must start with sk_test_ or sk_live_',\n };\n }\n // Basic validation - full validation would require API call\n return { valid: true };\n}\n\nexport async function validateNeonUrl(url: string): Promise<CredentialValidation> {\n try {\n const parsed = new URL(url);\n if (!parsed.protocol.startsWith('postgres')) {\n return {\n valid: false,\n message: 'Database URL must use postgres:// or postgresql:// protocol',\n };\n }\n return { valid: true };\n } catch {\n return {\n valid: false,\n message: 'Invalid database URL format',\n };\n }\n}\n\nexport async function validateVercelToken(token: string): Promise<CredentialValidation> {\n if (!token || token.length < 20) {\n return {\n valid: false,\n message: 'Vercel token appears invalid (too short)',\n };\n }\n return { valid: true };\n}\n\nexport async function validateSupabaseUrl(url: string): Promise<CredentialValidation> {\n try {\n const parsed = new URL(url);\n if (!parsed.hostname.includes('supabase')) {\n logger.warn('URL does not appear to be a Supabase URL');\n }\n return { valid: true };\n } catch {\n return {\n valid: false,\n message: 'Invalid Supabase URL format',\n };\n }\n}\n\nexport async function validateOpenAIKey(key: string): Promise<CredentialValidation> {\n if (!key.startsWith('sk-')) {\n return {\n valid: false,\n message: 'OpenAI key must start with sk-',\n };\n }\n return { valid: true };\n}\n","/**\n * Development environment configuration prompts\n */\n\nimport inquirer from 'inquirer';\n\nexport interface DevEnvConfig {\n createDevContainer: boolean;\n createDevbox: boolean;\n}\n\nexport async function promptDevEnvConfig(): Promise<DevEnvConfig> {\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'createDevContainer',\n message: 'Create Dev Container configuration for VS Code / GitHub Codespaces?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'createDevbox',\n message: 'Create Devbox configuration for Nix-powered development?',\n default: true,\n },\n ]);\n\n return answers;\n}\n","/**\n * Payment configuration prompts\n */\n\nimport inquirer from 'inquirer';\nimport { validateStripeKey } from '../validators/credentials.js';\n\nexport interface PaymentConfig {\n enabled: boolean;\n stripeSecretKey?: string;\n stripePublishableKey?: string;\n stripeWebhookSecret?: string;\n}\n\nexport async function promptPaymentConfig(): Promise<PaymentConfig> {\n const { enabled } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enabled',\n message: 'Do you want to configure Stripe payments?',\n default: true,\n },\n ]);\n\n if (!enabled) {\n return { enabled: false };\n }\n\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'stripeSecretKey',\n message: 'Enter your Stripe secret key (sk_test_... or sk_live_...):',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Stripe secret key is required';\n }\n const result = await validateStripeKey(input);\n return result.valid ? true : result.message || 'Invalid Stripe key';\n },\n },\n {\n type: 'input',\n name: 'stripePublishableKey',\n message: 'Enter your Stripe publishable key (pk_test_... or pk_live_...):',\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Stripe publishable key is required';\n }\n if (!(input.startsWith('pk_test_') || input.startsWith('pk_live_'))) {\n return 'Stripe publishable key must start with pk_test_ or pk_live_';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'stripeWebhookSecret',\n message: 'Enter your Stripe webhook secret (whsec_..., optional - press Enter to skip):',\n default: '',\n },\n ]);\n\n return {\n enabled: true,\n stripeSecretKey: answers.stripeSecretKey,\n stripePublishableKey: answers.stripePublishableKey,\n stripeWebhookSecret: answers.stripeWebhookSecret || undefined,\n };\n}\n","/**\n * Project configuration prompts\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport inquirer from 'inquirer';\n\nexport interface ProjectConfig {\n projectName: string;\n projectPath: string;\n template: 'basic-blog' | 'e-commerce' | 'portfolio';\n}\n\nconst VALID_TEMPLATES = ['basic-blog', 'e-commerce', 'portfolio'] as const;\n\nexport async function promptProjectConfig(\n defaultName?: string,\n templateArg?: string,\n nonInteractive = false,\n): Promise<ProjectConfig> {\n // Resolve project name — use CLI arg or prompt\n let projectName: string;\n if (defaultName) {\n projectName = defaultName;\n } else if (nonInteractive) {\n projectName = 'my-revealui-project';\n } else {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'projectName',\n message: 'What is your project name?',\n default: 'my-revealui-project',\n validate: (input: string) => {\n if (!/^[a-z0-9-]+$/.test(input)) {\n return 'Project name must contain only lowercase letters, numbers, and hyphens';\n }\n const projectPath = path.resolve(process.cwd(), input);\n if (fs.existsSync(projectPath)) {\n return `Directory \"${input}\" already exists`;\n }\n return true;\n },\n },\n ]);\n projectName = answers.projectName;\n }\n\n // Resolve template — use CLI arg or prompt\n let template: ProjectConfig['template'];\n if (templateArg && VALID_TEMPLATES.includes(templateArg as ProjectConfig['template'])) {\n template = templateArg as ProjectConfig['template'];\n } else if (nonInteractive) {\n template = 'basic-blog';\n } else {\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'template',\n message: 'Which template would you like to use?',\n choices: [\n { name: 'Basic Blog - A simple blog with posts and pages', value: 'basic-blog' },\n { name: 'E-commerce - Product catalog with checkout', value: 'e-commerce' },\n { name: 'Portfolio - Personal portfolio site', value: 'portfolio' },\n ],\n default: 'basic-blog',\n },\n ]);\n template = answers.template;\n }\n\n return {\n projectName,\n projectPath: path.resolve(process.cwd(), projectName),\n template,\n };\n}\n","/**\n * Storage configuration prompts\n */\n\nimport inquirer from 'inquirer';\nimport { validateSupabaseUrl, validateVercelToken } from '../validators/credentials.js';\n\nexport interface StorageConfig {\n provider: 'vercel-blob' | 'supabase' | 'skip';\n blobToken?: string;\n supabaseUrl?: string;\n supabasePublishableKey?: string;\n}\n\nexport async function promptStorageConfig(): Promise<StorageConfig> {\n const { provider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'provider',\n message: 'Which storage provider would you like to use?',\n choices: [\n {\n name: 'Vercel Blob - Simple object storage (recommended)',\n value: 'vercel-blob',\n },\n {\n name: 'Supabase Storage - Integrated with Supabase',\n value: 'supabase',\n },\n {\n name: 'Skip - Configure later',\n value: 'skip',\n },\n ],\n default: 'vercel-blob',\n },\n ]);\n\n if (provider === 'skip') {\n return { provider: 'skip' };\n }\n\n if (provider === 'vercel-blob') {\n const { blobToken } = await inquirer.prompt([\n {\n type: 'input',\n name: 'blobToken',\n message: 'Enter your Vercel Blob read/write token:',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Blob token is required';\n }\n const result = await validateVercelToken(input);\n return result.valid ? true : result.message || 'Invalid token';\n },\n },\n ]);\n return { provider: 'vercel-blob', blobToken };\n }\n\n // Supabase storage\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'supabaseUrl',\n message: 'Enter your Supabase project URL:',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Supabase URL is required';\n }\n const result = await validateSupabaseUrl(input);\n return result.valid ? true : result.message || 'Invalid URL';\n },\n },\n {\n type: 'input',\n name: 'supabasePublishableKey',\n message: 'Enter your Supabase publishable key (sb_publishable_...):',\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Supabase publishable key is required';\n }\n return true;\n },\n },\n ]);\n\n return {\n provider: 'supabase',\n supabaseUrl: answers.supabaseUrl,\n supabasePublishableKey: answers.supabasePublishableKey,\n };\n}\n","/**\n * Node version validation\n */\n\nimport { createLogger } from '@revealui/setup/utils';\n\nconst logger = createLogger({ prefix: 'Setup' });\n\nconst REQUIRED_NODE_VERSION = '24.13.0';\n\nexport function validateNodeVersion(): boolean {\n const currentVersion = process.version.slice(1); // Remove 'v' prefix\n const [currentMajor, currentMinor] = currentVersion.split('.').map(Number);\n const [requiredMajor, requiredMinor] = REQUIRED_NODE_VERSION.split('.').map(Number);\n\n if (\n currentMajor < requiredMajor ||\n (currentMajor === requiredMajor && currentMinor < requiredMinor)\n ) {\n logger.error(\n `Node.js ${REQUIRED_NODE_VERSION} or higher is required. You have ${currentVersion}.`,\n );\n logger.info('Please upgrade Node.js: https://nodejs.org/');\n return false;\n }\n\n return true;\n}\n","/**\n * Project creation command\n *\n * Copies template files, writes .env.local, installs dependencies,\n * and initialises a git repo.\n */\n\nimport crypto from 'node:crypto';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createLogger } from '@revealui/setup/utils';\nimport ora from 'ora';\nimport { generateDevbox } from '../generators/devbox.js';\nimport { generateDevContainer } from '../generators/devcontainer.js';\nimport { generateReadme } from '../generators/readme.js';\nimport { installDependencies, isPnpmInstalled } from '../installers/dependencies.js';\nimport type { DatabaseConfig } from '../prompts/database.js';\nimport type { DevEnvConfig } from '../prompts/devenv.js';\nimport type { PaymentConfig } from '../prompts/payments.js';\nimport type { ProjectConfig } from '../prompts/project.js';\nimport type { StorageConfig } from '../prompts/storage.js';\nimport { createInitialCommit, initializeGitRepo, isGitInstalled } from '../utils/git.js';\n\nconst logger = createLogger({ prefix: 'Create' });\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Templates live at packages/cli/templates/ — two levels up from src/commands/ or dist/commands/\nconst TEMPLATES_DIR = path.resolve(__dirname, '../../templates');\n\nexport interface CreateProjectConfig {\n project: ProjectConfig;\n database: DatabaseConfig;\n storage: StorageConfig;\n payment: PaymentConfig;\n devenv: DevEnvConfig;\n skipGit?: boolean;\n skipInstall?: boolean;\n}\n\n/**\n * Build the .env.local content from user-provided config values.\n */\nfunction buildEnvLocal(cfg: CreateProjectConfig): string {\n const lines: string[] = [\n '# Generated by @revealui/cli — fill in the remaining placeholders before running `pnpm dev`',\n '',\n '# Core',\n `REVEALUI_SECRET=${generateSecret()}`,\n `REVEALUI_PUBLIC_SERVER_URL=http://localhost:4000`,\n `NEXT_PUBLIC_SERVER_URL=http://localhost:4000`,\n '',\n '# Database',\n ];\n\n if (cfg.database.postgresUrl) {\n lines.push(`POSTGRES_URL=${cfg.database.postgresUrl}`);\n } else {\n lines.push('POSTGRES_URL=postgresql://postgres:postgres@localhost:5432/revealui');\n }\n\n lines.push('', '# Storage (Vercel Blob)');\n if (cfg.storage.provider === 'vercel-blob' && cfg.storage.blobToken) {\n lines.push(`BLOB_READ_WRITE_TOKEN=${cfg.storage.blobToken}`);\n } else {\n lines.push('BLOB_READ_WRITE_TOKEN=vercel_blob_rw_placeholder');\n }\n\n lines.push('', '# Stripe');\n if (cfg.payment.enabled && cfg.payment.stripeSecretKey) {\n lines.push(`STRIPE_SECRET_KEY=${cfg.payment.stripeSecretKey}`);\n lines.push(`STRIPE_WEBHOOK_SECRET=${cfg.payment.stripeWebhookSecret || 'whsec_placeholder'}`);\n lines.push(\n `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${cfg.payment.stripePublishableKey || 'pk_test_placeholder'}`,\n );\n } else {\n lines.push('STRIPE_SECRET_KEY=sk_test_placeholder');\n lines.push('STRIPE_WEBHOOK_SECRET=whsec_placeholder');\n lines.push('NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_placeholder');\n }\n\n lines.push('', '# Admin bootstrap (used on first run only)');\n lines.push('REVEALUI_ADMIN_EMAIL=admin@example.com');\n lines.push('REVEALUI_ADMIN_PASSWORD=changeme-min-12-chars');\n\n return `${lines.join('\\n')}\\n`;\n}\n\n/** Generate a cryptographically random 48-char hex secret */\nfunction generateSecret(): string {\n return crypto.randomBytes(24).toString('hex');\n}\n\n/**\n * List template directories that actually exist on disk.\n */\nasync function listAvailableTemplates(): Promise<string[]> {\n try {\n const entries = await fs.readdir(TEMPLATES_DIR, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\n/**\n * Copy a template directory recursively into the target path.\n */\nasync function copyTemplate(templateName: string, targetPath: string): Promise<void> {\n const templatePath = path.join(TEMPLATES_DIR, templateName);\n\n // Verify the template exists\n try {\n await fs.access(templatePath);\n } catch {\n const available = await listAvailableTemplates();\n const listing =\n available.length > 0\n ? `Available templates: ${available.join(', ')}`\n : `No templates found in ${TEMPLATES_DIR}`;\n throw new Error(`Template \"${templateName}\" not found at ${templatePath}. ${listing}`);\n }\n\n await copyDir(templatePath, targetPath);\n}\n\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n // npm always strips .gitignore from tarballs; we store it as _gitignore and rename on copy\n const destName = entry.name === '_gitignore' ? '.gitignore' : entry.name;\n const destPath = path.join(dest, destName);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Map the CLI template name to the directory name under templates/.\n * All non-starter templates fall back to starter for now.\n */\nfunction resolveTemplateName(template: ProjectConfig['template']): string {\n const map: Record<ProjectConfig['template'], string> = {\n 'basic-blog': 'basic-blog',\n 'e-commerce': 'e-commerce',\n portfolio: 'portfolio',\n };\n return map[template] ?? 'starter';\n}\n\n/**\n * Main project creation function — wires everything together.\n */\nexport async function createProject(cfg: CreateProjectConfig): Promise<void> {\n const { project, skipGit = false, skipInstall = false } = cfg;\n const { projectPath, projectName, template } = project;\n\n // 1. Copy template files\n const spinner = ora(`Copying template \"${template}\"...`).start();\n try {\n await copyTemplate(resolveTemplateName(template), projectPath);\n spinner.succeed('Template files copied');\n } catch (err) {\n spinner.fail('Failed to copy template files');\n throw err;\n }\n\n // 2. Replace {{PROJECT_NAME}} placeholders in package.json / other files\n const pkgJsonPath = path.join(projectPath, 'package.json');\n try {\n const raw = await fs.readFile(pkgJsonPath, 'utf-8');\n await fs.writeFile(pkgJsonPath, raw.replaceAll('{{PROJECT_NAME}}', projectName), 'utf-8');\n } catch {\n // package.json placeholder replacement is best-effort\n }\n\n // 3. Write .env.local\n const envSpinner = ora('Writing .env.local...').start();\n try {\n await fs.writeFile(path.join(projectPath, '.env.local'), buildEnvLocal(cfg), 'utf-8');\n envSpinner.succeed('.env.local written');\n } catch (err) {\n envSpinner.fail('Failed to write .env.local');\n throw err;\n }\n\n // 4. Generate README\n await generateReadme(projectPath, project);\n logger.success('README.md generated');\n\n // 4b. Generate dev environment configs\n if (cfg.devenv.createDevContainer) {\n await generateDevContainer(projectPath);\n logger.success('.devcontainer/ generated');\n }\n if (cfg.devenv.createDevbox) {\n await generateDevbox(projectPath);\n logger.success('devbox.json generated');\n }\n\n // 5. Install dependencies\n if (!skipInstall) {\n const pnpmOk = await isPnpmInstalled();\n if (!pnpmOk) {\n logger.warn(\n 'pnpm not found — skipping dependency installation. Run `pnpm install` manually.',\n );\n } else {\n await installDependencies(projectPath);\n }\n } else {\n logger.info('Skipping dependency installation (--skip-install)');\n }\n\n // 6. Git init\n if (!skipGit) {\n const gitOk = await isGitInstalled();\n if (!gitOk) {\n logger.warn('git not found — skipping repository initialisation.');\n } else {\n await initializeGitRepo(projectPath);\n await createInitialCommit(projectPath);\n }\n } else {\n logger.info('Skipping git initialisation (--skip-git)');\n }\n}\n","/**\n * Devbox configuration generator\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateDevbox(projectPath: string): Promise<void> {\n const devboxConfig = {\n packages: ['nodejs@24.13.0', 'pnpm@10.28.2', 'postgresql@16', 'stripe-cli@latest'],\n shell: {\n init_hook: [\n 'corepack enable',\n 'echo \"🚀 RevealUI Devbox shell ready!\"',\n 'echo \"Run: pnpm dev to start development\"',\n ],\n scripts: {\n dev: 'pnpm dev',\n setup: 'pnpm install && pnpm db:init',\n test: 'pnpm test',\n },\n },\n env: {\n NODE_ENV: 'development',\n },\n };\n\n await fs.writeFile(\n path.join(projectPath, 'devbox.json'),\n JSON.stringify(devboxConfig, null, 2),\n 'utf-8',\n );\n}\n","/**\n * Dev Container configuration generator\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateDevContainer(projectPath: string): Promise<void> {\n const devcontainerDir = path.join(projectPath, '.devcontainer');\n await fs.mkdir(devcontainerDir, { recursive: true });\n\n // Create devcontainer.json\n const devcontainerConfig = {\n name: 'RevealUI Development',\n image: 'mcr.microsoft.com/devcontainers/typescript-node:24',\n features: {\n 'ghcr.io/devcontainers/features/common-utils:2': {\n installZsh: true,\n installOhMyZsh: true,\n },\n },\n forwardPorts: [3000, 4000, 5432],\n portsAttributes: {\n '3000': {\n label: 'Web App',\n onAutoForward: 'notify',\n },\n '4000': {\n label: 'CMS',\n onAutoForward: 'notify',\n },\n '5432': {\n label: 'PostgreSQL',\n onAutoForward: 'silent',\n },\n },\n postCreateCommand: 'corepack enable && pnpm install',\n customizations: {\n vscode: {\n extensions: [\n 'biomejs.biome',\n 'bradlc.vscode-tailwindcss',\n 'Prisma.prisma',\n 'ms-azuretools.vscode-docker',\n 'streetsidesoftware.code-spell-checker',\n ],\n settings: {\n 'editor.defaultFormatter': 'biomejs.biome',\n 'editor.formatOnSave': true,\n 'editor.codeActionsOnSave': {\n 'quickfix.biome': 'explicit',\n 'source.organizeImports.biome': 'explicit',\n },\n },\n },\n },\n remoteUser: 'node',\n };\n\n await fs.writeFile(\n path.join(devcontainerDir, 'devcontainer.json'),\n JSON.stringify(devcontainerConfig, null, 2),\n 'utf-8',\n );\n\n // Create docker-compose.yml for services\n const dockerCompose = `version: '3.8'\n\nservices:\n app:\n build:\n context: ..\n dockerfile: .devcontainer/Dockerfile\n volumes:\n - ..:/workspace:cached\n command: sleep infinity\n network_mode: service:db\n\n db:\n image: pgvector/pgvector:pg16\n restart: unless-stopped\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: revealui\n volumes:\n - postgres-data:/var/lib/postgresql/data\n\nvolumes:\n postgres-data:\n`;\n\n await fs.writeFile(path.join(devcontainerDir, 'docker-compose.yml'), dockerCompose, 'utf-8');\n\n // Create Dockerfile\n const dockerfile = `FROM mcr.microsoft.com/devcontainers/typescript-node:24\n\n# Install additional tools\nRUN apt-get update && export DEBIAN_FRONTEND=noninteractive \\\\\n && apt-get -y install --no-install-recommends postgresql-client\n\n# Enable pnpm\nRUN corepack enable\n`;\n\n await fs.writeFile(path.join(devcontainerDir, 'Dockerfile'), dockerfile, 'utf-8');\n\n // Create README\n const readme = `# Dev Container Setup\n\nThis directory contains the Dev Container configuration for RevealUI.\n\n## Usage\n\n### VS Code\n\n1. Install the \"Dev Containers\" extension\n2. Open this folder in VS Code\n3. Press F1 and select \"Dev Containers: Reopen in Container\"\n\n### GitHub Codespaces\n\n1. Click the green \"Code\" button on GitHub\n2. Select \"Codespaces\" tab\n3. Click \"Create codespace on main\"\n\n## What's Included\n\n- Node.js 24.13.0\n- pnpm package manager\n- PostgreSQL 16 with pgvector\n- VS Code extensions:\n - Biome\n - Tailwind CSS\n - Prisma\n - Docker\n - Code Spell Checker\n\n## Environment Variables\n\nEnvironment variables are loaded from \\`.env.development.local\\`.\nFor GitHub Codespaces, set secrets in your repository settings.\n\n## Ports\n\n- 3000: Web application\n- 4000: CMS\n- 5432: PostgreSQL database\n`;\n\n await fs.writeFile(path.join(devcontainerDir, 'README.md'), readme, 'utf-8');\n}\n","/**\n * Project README generator\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ProjectConfig } from '../prompts/project.js';\n\nexport async function generateReadme(\n projectPath: string,\n projectConfig: ProjectConfig,\n): Promise<void> {\n const readme = `# ${projectConfig.projectName}\n\nA RevealUI project created with @revealui/cli.\n\n## Getting Started\n\nFirst, install dependencies:\n\n\\`\\`\\`bash\npnpm install\n\\`\\`\\`\n\nThen, initialize the database:\n\n\\`\\`\\`bash\npnpm db:init\npnpm db:migrate\n\\`\\`\\`\n\nRun the development server:\n\n\\`\\`\\`bash\npnpm dev\n\\`\\`\\`\n\nOpen [http://localhost:4000](http://localhost:4000) with your browser to access the CMS.\n\nThe web application runs on [http://localhost:3000](http://localhost:3000).\n\n## Development Environments\n\n### Standard Setup\n\nRequirements:\n- Node.js 24.13.0 or higher\n- pnpm 10.28.2 or higher\n- PostgreSQL 16\n\n### Dev Containers\n\nOpen in VS Code and select \"Reopen in Container\", or use GitHub Codespaces.\n\n### Devbox\n\nInstall Devbox:\n\n\\`\\`\\`bash\ncurl -fsSL https://get.jetpack.io/devbox | bash\n\\`\\`\\`\n\nThen start the Devbox shell:\n\n\\`\\`\\`bash\ndevbox shell\npnpm dev\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\n${projectConfig.projectName}/\n├── apps/\n│ ├── cms/ # CMS application\n│ └── web/ # Frontend application\n├── packages/\n│ ├── auth/ # Authentication\n│ ├── db/ # Database\n│ └── ... # Other shared packages\n├── .devcontainer/ # Dev Container configuration\n├── devbox.json # Devbox configuration\n└── .env.development.local # Environment variables\n\\`\\`\\`\n\n## Available Scripts\n\n- \\`pnpm dev\\` - Start development servers\n- \\`pnpm build\\` - Build for production\n- \\`pnpm test\\` - Run tests\n- \\`pnpm lint\\` - Run linters\n- \\`pnpm typecheck\\` - Type check\n- \\`pnpm db:init\\` - Initialize database\n- \\`pnpm db:migrate\\` - Run migrations\n- \\`pnpm db:seed\\` - Seed database\n\n## Learn More\n\n- [RevealUI Documentation](https://github.com/your-org/RevealUI)\n- [Next.js Documentation](https://nextjs.org/docs)\n- [Hono Documentation](https://hono.dev)\n\n## Template\n\nThis project was created using the **${projectConfig.template}** template.\n\n## License\n\nMIT\n`;\n\n await fs.writeFile(path.join(projectPath, 'README.md'), readme, 'utf-8');\n}\n","/**\n * Dependency installation\n */\n\nimport { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport ora from 'ora';\n\nconst logger = createLogger({ prefix: 'Install' });\n\nexport async function installDependencies(projectPath: string): Promise<void> {\n const spinner = ora('Installing dependencies with pnpm...').start();\n\n try {\n await execa('pnpm', ['install'], {\n cwd: projectPath,\n stdio: 'pipe',\n });\n spinner.succeed('Dependencies installed successfully');\n } catch (error) {\n spinner.fail('Failed to install dependencies');\n logger.error('Please run \"pnpm install\" manually');\n throw error;\n }\n}\n\nexport async function isPnpmInstalled(): Promise<boolean> {\n try {\n await execa('pnpm', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function checkPnpmVersion(): Promise<{ version: string; valid: boolean }> {\n try {\n const { stdout } = await execa('pnpm', ['--version']);\n const version = stdout.trim();\n const [major, minor] = version.split('.').map(Number);\n\n // Require pnpm 10.28.2 or higher\n const valid = major > 10 || (major === 10 && minor >= 28);\n\n return { version, valid };\n } catch {\n return { version: 'unknown', valid: false };\n }\n}\n","/**\n * Git utilities for project initialization\n */\n\nimport { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\n\nconst logger = createLogger({ prefix: 'Git' });\n\nexport async function initializeGitRepo(projectPath: string): Promise<void> {\n try {\n await execa('git', ['init'], { cwd: projectPath });\n logger.success('Initialized git repository');\n } catch (error) {\n logger.warn('Failed to initialize git repository');\n throw error;\n }\n}\n\nexport async function createInitialCommit(projectPath: string): Promise<void> {\n try {\n await execa('git', ['add', '.'], { cwd: projectPath });\n await execa('git', ['commit', '-m', 'Initial commit from @revealui/cli'], { cwd: projectPath });\n logger.success('Created initial commit');\n } catch (error) {\n logger.warn('Failed to create initial commit');\n throw error;\n }\n}\n\nexport async function isGitInstalled(): Promise<boolean> {\n try {\n await execa('git', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport { commandExists } from '../utils/command.js';\nimport { resolveLocalDbConfig, writeLocalDbConfigs } from '../utils/db.js';\nimport { findWorkspaceRoot } from '../utils/workspace.js';\n\nconst logger = createLogger({ prefix: 'DB' });\n\nfunction isPgCtlNotRunningError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'exitCode' in error &&\n (error as { exitCode?: unknown }).exitCode === 3\n );\n}\n\nfunction getWorkspaceRootOrThrow(): string {\n const root = findWorkspaceRoot();\n if (!root) {\n throw new Error('RevealUI workspace root not found');\n }\n return root;\n}\n\nfunction buildDbEnv(root: string): NodeJS.ProcessEnv {\n const config = resolveLocalDbConfig(root, process.env);\n return {\n ...process.env,\n PGDATA: config.pgdata,\n PGHOST: config.pghost,\n PGDATABASE: config.pgdatabase,\n PGUSER: config.pguser,\n POSTGRES_URL: config.postgresUrl,\n DATABASE_URL: config.databaseUrl,\n };\n}\n\nfunction getPgDataOrThrow(env: NodeJS.ProcessEnv): string {\n const pgdata = env.PGDATA;\n if (!pgdata) {\n throw new Error('PGDATA is not configured for the local RevealUI database');\n }\n return pgdata;\n}\n\nasync function requireCommand(command: string): Promise<void> {\n if (!(await commandExists(command))) {\n throw new Error(`${command} is not available in PATH`);\n }\n}\n\nexport async function runDbInitCommand(options: { force?: boolean } = {}): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n await requireCommand('initdb');\n\n try {\n await fs.access(pgdata);\n if (!options.force) {\n throw new Error(`PostgreSQL is already initialized at ${pgdata}. Use --force to reset it.`);\n }\n await fs.rm(pgdata, { recursive: true, force: true });\n } catch (error) {\n if (error instanceof Error && !error.message.includes('already initialized')) {\n // PGDATA does not exist yet; continue.\n } else if (error instanceof Error) {\n throw error;\n }\n }\n\n await execa(\n 'initdb',\n ['--locale=C.UTF-8', '--encoding=UTF8', '-D', pgdata, '--username=postgres'],\n {\n env,\n stdio: 'inherit',\n },\n );\n await writeLocalDbConfigs(pgdata);\n logger.success(`PostgreSQL initialized at ${pgdata}`);\n}\n\nexport async function runDbStartCommand(): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n await requireCommand('pg_ctl');\n await fs.access(pgdata);\n\n await execa(\n 'pg_ctl',\n ['start', '-D', pgdata, '-l', path.join(pgdata, 'logfile'), '-o', `-k ${pgdata}`],\n {\n env,\n stdio: 'inherit',\n },\n );\n}\n\nexport async function runDbStopCommand(): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n await requireCommand('pg_ctl');\n await execa('pg_ctl', ['stop', '-D', pgdata], {\n env,\n stdio: 'inherit',\n });\n}\n\nexport async function runDbStatusCommand(): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n await requireCommand('pg_ctl');\n try {\n await execa('pg_ctl', ['status', '-D', pgdata], {\n env,\n stdio: 'inherit',\n });\n } catch (error) {\n if (isPgCtlNotRunningError(error)) {\n logger.warn(`PostgreSQL is not running (PGDATA: ${pgdata})`);\n return;\n }\n throw error;\n }\n}\n\nexport async function runDbResetCommand(options: { force?: boolean } = {}): Promise<void> {\n if (!options.force) {\n throw new Error('db reset is destructive. Re-run with --force.');\n }\n\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n if (await commandExists('pg_ctl')) {\n try {\n await execa('pg_ctl', ['stop', '-D', pgdata], { env, stdio: 'pipe' });\n } catch {\n // Ignore stop failures when server is not running.\n }\n }\n\n await fs.rm(pgdata, { recursive: true, force: true });\n await runDbInitCommand({ force: false });\n}\n\nexport async function runDbMigrateCommand(): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n\n await execa('pnpm', ['--filter', '@revealui/db', 'db:migrate'], {\n cwd: root,\n env,\n stdio: 'inherit',\n });\n}\n\nexport async function runDbCleanupCommand(\n options: { dryRun?: boolean; tables?: string } = {},\n): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n\n // Inherit ambient env (DATABASE_URL / POSTGRES_URL from vault/direnv),\n // not the local pg override used by other `db` subcommands.\n const env: NodeJS.ProcessEnv = { ...process.env };\n if (options.dryRun) env.DRY_RUN = 'true';\n if (options.tables) env.TABLES = options.tables;\n\n await execa('pnpm', ['--filter', '@revealui/db', 'db:cleanup'], {\n cwd: root,\n env,\n stdio: 'inherit',\n });\n}\n","import net from 'node:net';\nimport { execa } from 'execa';\n\nexport async function commandExists(command: string): Promise<boolean> {\n try {\n await execa('bash', ['-lc', `command -v ${command}`], {\n stdio: 'pipe',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function isTcpReachable(\n host: string,\n port: number,\n timeoutMs = 1500,\n): Promise<boolean> {\n return await new Promise((resolve) => {\n const socket = new net.Socket();\n\n const finalize = (value: boolean) => {\n socket.removeAllListeners();\n socket.destroy();\n resolve(value);\n };\n\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finalize(true));\n socket.once('timeout', () => finalize(false));\n socket.once('error', () => finalize(false));\n socket.connect(port, host);\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface LocalDbConfig {\n pgdata: string;\n pghost: string;\n pgdatabase: string;\n pguser: string;\n postgresUrl: string;\n databaseUrl: string;\n}\n\nexport function resolveLocalDbConfig(\n cwd = process.cwd(),\n env: NodeJS.ProcessEnv = process.env,\n): LocalDbConfig {\n const pgdata = env.PGDATA || path.join(cwd, '.pgdata');\n const pghost = env.PGHOST || pgdata;\n const pgdatabase = env.PGDATABASE || 'postgres';\n const pguser = env.PGUSER || 'postgres';\n const postgresUrl = env.POSTGRES_URL || 'postgresql://postgres@localhost:5432/postgres';\n const databaseUrl = env.DATABASE_URL || postgresUrl;\n\n return {\n pgdata,\n pghost,\n pgdatabase,\n pguser,\n postgresUrl,\n databaseUrl,\n };\n}\n\nexport function isLocalDbUrl(url?: string | null): boolean {\n if (!url) return false;\n\n try {\n const parsed = new URL(url);\n return parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\n } catch {\n return false;\n }\n}\n\nexport function detectDbTarget(url?: string | null): 'missing' | 'local' | 'remote' {\n if (!url) return 'missing';\n return isLocalDbUrl(url) ? 'local' : 'remote';\n}\n\nexport function buildPostgresConfig(pgdata: string): string {\n return `\n# RevealUI Development Settings\nlisten_addresses = 'localhost'\nport = 5432\nmax_connections = 100\nshared_buffers = 128MB\nunix_socket_directories = '${pgdata}'\n`.trimStart();\n}\n\nexport function buildPgHbaConfig(): string {\n return `\n# TYPE DATABASE USER ADDRESS METHOD\nlocal all all trust\nhost all all 127.0.0.1/32 trust\nhost all all ::1/128 trust\n`.trimStart();\n}\n\nexport async function writeLocalDbConfigs(pgdata: string): Promise<void> {\n await fs.appendFile(path.join(pgdata, 'postgresql.conf'), buildPostgresConfig(pgdata), 'utf8');\n await fs.writeFile(path.join(pgdata, 'pg_hba.conf'), buildPgHbaConfig(), 'utf8');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport function findWorkspaceRoot(startDir = process.cwd()): string | null {\n let current = path.resolve(startDir);\n\n while (true) {\n const packageJsonPath = path.join(current, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as {\n name?: string;\n private?: boolean;\n };\n if (pkg.name === 'revealui' && pkg.private === true) {\n return current;\n }\n } catch {\n // Ignore malformed package.json and keep walking upward.\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n","import { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport { formatDoctorReport, gatherDoctorReport } from '../runtime/doctor.js';\nimport { commandExists } from '../utils/command.js';\nimport { readDevConfig, writeDevConfig } from '../utils/dev-config.js';\nimport { findWorkspaceRoot } from '../utils/workspace.js';\nimport { runDbMigrateCommand, runDbStopCommand } from './db.js';\nimport { runDoctorCommand } from './doctor.js';\nimport { runShellCommand } from './shell.js';\n\nconst logger = createLogger({ prefix: 'Dev' });\n\nexport type DevService = 'mcp';\nexport type DevProfileName = 'local' | 'agent' | 'cms' | 'fullstack';\n\ninterface DevProfile {\n include?: DevService[];\n script?: string;\n}\n\nconst DEV_PROFILES: Record<DevProfileName, DevProfile> = {\n local: {},\n agent: {\n include: ['mcp'],\n },\n cms: {\n script: 'dev:cms',\n },\n fullstack: {\n include: ['mcp'],\n script: 'dev',\n },\n};\n\nexport interface DevUpOptions {\n ensure?: boolean;\n json?: boolean;\n dryRun?: boolean;\n fix?: boolean;\n script?: string;\n include?: string[];\n profile?: DevProfileName;\n inside?: boolean;\n}\n\nexport interface DevPlan {\n profile: DevProfileName | 'custom';\n ensure: boolean;\n include: DevService[];\n script?: string;\n dryRun: boolean;\n}\n\nfunction getConfiguredProfile(): DevProfileName | undefined {\n const configured = readDevConfig().defaultProfile;\n if (configured && configured in DEV_PROFILES) {\n return configured as DevProfileName;\n }\n\n return undefined;\n}\n\nexport function resolveDevUpOptions(options: DevUpOptions = {}): Required<\n Pick<DevUpOptions, 'ensure' | 'json' | 'inside'>\n> & {\n profile?: DevProfileName;\n script?: string;\n include: DevService[];\n} {\n const selectedProfile = options.profile ?? getConfiguredProfile();\n const profile = selectedProfile ? DEV_PROFILES[selectedProfile] : undefined;\n if (selectedProfile && !profile) {\n throw new Error(\n `Unknown dev profile \"${selectedProfile}\". Use one of: ${Object.keys(DEV_PROFILES).join(', ')}`,\n );\n }\n\n const include = Array.from(\n new Set([...(profile?.include ?? []), ...((options.include ?? []) as DevService[])]),\n );\n\n return {\n ensure: options.ensure ?? true,\n json: options.json ?? false,\n inside: options.inside ?? false,\n profile: selectedProfile,\n script: options.script ?? profile?.script,\n include,\n };\n}\n\nexport function getDevPlan(options: DevUpOptions = {}): DevPlan {\n const resolved = resolveDevUpOptions(options);\n return {\n profile: resolved.profile ?? (options.include?.length || options.script ? 'custom' : 'local'),\n ensure: resolved.ensure,\n include: resolved.include,\n script: resolved.script,\n dryRun: options.dryRun ?? false,\n };\n}\n\nexport function formatDevPlan(plan: DevPlan): string {\n const lines = ['', 'RevealUI Dev Plan', ''];\n lines.push(`profile ${plan.profile}`);\n lines.push(`ensure ${plan.ensure ? 'yes' : 'no'}`);\n lines.push(`dry-run ${plan.dryRun ? 'yes' : 'no'}`);\n lines.push(`include ${plan.include.length > 0 ? plan.include.join(', ') : 'none'}`);\n lines.push(`script ${plan.script ?? 'none'}`);\n return lines.join('\\n');\n}\n\nexport function getDevActions(plan: DevPlan): string[] {\n const actions: string[] = [];\n\n if (plan.ensure) {\n actions.push('ensure local shell and database prerequisites');\n } else {\n actions.push('skip automatic shell/database ensure');\n }\n\n actions.push('run database migrations');\n\n if (shouldIncludeMcp(plan.include)) {\n actions.push('validate MCP credentials via `pnpm setup:mcp`');\n }\n\n if (plan.script) {\n actions.push(`start pnpm script \\`${plan.script}\\``);\n }\n\n return actions;\n}\n\nexport function formatDevActions(plan: DevPlan): string {\n const actions = getDevActions(plan);\n const lines = ['', 'RevealUI Dev Actions', ''];\n for (const action of actions) {\n lines.push(`- ${action}`);\n }\n return lines.join('\\n');\n}\n\nfunction shouldIncludeMcp(include: DevService[]): boolean {\n return include.includes('mcp');\n}\n\nexport async function runDevUpCommand(options: DevUpOptions = {}): Promise<void> {\n const resolved = resolveDevUpOptions(options);\n const plan = getDevPlan(options);\n const forwardArgs: string[] = [];\n\n if (options.dryRun) {\n forwardArgs.push('--dry-run');\n }\n if (options.fix) {\n forwardArgs.push('--fix');\n }\n if (options.profile) {\n forwardArgs.push('--profile', options.profile);\n }\n for (const service of options.include ?? []) {\n forwardArgs.push('--include', service);\n }\n if (options.script) {\n forwardArgs.push('--script', options.script);\n }\n if (options.ensure === false) {\n forwardArgs.push('--no-ensure');\n }\n\n const reentered = await runShellCommand({\n ensure: resolved.ensure,\n json: resolved.json,\n inside: resolved.inside,\n forwardArgs,\n });\n if (reentered) {\n return;\n }\n\n if (resolved.json) {\n return;\n }\n\n process.stdout.write(`${formatDevPlan(plan)}\\n`);\n process.stdout.write(`${formatDevActions(plan)}\\n`);\n\n if (plan.dryRun) {\n logger.info('Dry run only; no migrations or services were started.');\n return;\n }\n\n if (options.fix) {\n await runDoctorCommand({ fix: true });\n }\n\n await runDbMigrateCommand();\n logger.success('Database migration complete');\n\n if (shouldIncludeMcp(resolved.include)) {\n const workspaceRoot = findWorkspaceRoot();\n if (!workspaceRoot) {\n throw new Error('RevealUI workspace root not found');\n }\n\n logger.info('Validating MCP setup');\n await execa('pnpm', ['setup:mcp'], {\n cwd: workspaceRoot,\n stdio: 'inherit',\n });\n }\n\n if (resolved.script) {\n const workspaceRoot = findWorkspaceRoot();\n if (!workspaceRoot) {\n throw new Error('RevealUI workspace root not found');\n }\n\n logger.info(`Starting dev script: ${resolved.script}`);\n await execa('pnpm', [resolved.script], {\n cwd: workspaceRoot,\n stdio: 'inherit',\n });\n }\n}\n\nexport async function runDevStatusCommand(options: DevUpOptions = {}): Promise<void> {\n const plan = getDevPlan(options);\n const forwardArgs: string[] = [];\n\n if (options.profile) {\n forwardArgs.push('--profile', options.profile);\n }\n for (const service of options.include ?? []) {\n forwardArgs.push('--include', service);\n }\n if (options.script) {\n forwardArgs.push('--script', options.script);\n }\n if (options.ensure === false) {\n forwardArgs.push('--no-ensure');\n }\n\n if (!(options.inside || process.env.IN_NIX_SHELL) && (await commandExists('nix'))) {\n const reentered = await runShellCommand({\n ensure: false,\n json: options.json,\n inside: options.inside,\n forwardArgs,\n });\n if (reentered) {\n return;\n }\n }\n\n const report = await gatherDoctorReport();\n\n if (options.json) {\n process.stdout.write(\n `${JSON.stringify({ report, plan, actions: getDevActions(plan) }, null, 2)}\\n`,\n );\n return;\n }\n\n process.stdout.write(`${formatDoctorReport(report)}\\n`);\n process.stdout.write(`${formatDevPlan(plan)}\\n`);\n process.stdout.write(`${formatDevActions(plan)}\\n`);\n}\n\nexport async function runDevDownCommand(): Promise<void> {\n await runDbStopCommand();\n}\n\nexport async function runDevProfileSetCommand(profile: DevProfileName): Promise<void> {\n if (!(profile in DEV_PROFILES)) {\n throw new Error(\n `Unknown dev profile \"${profile}\". Use one of: ${Object.keys(DEV_PROFILES).join(', ')}`,\n );\n }\n\n const configPath = writeDevConfig({ defaultProfile: profile });\n logger.success(`Default dev profile set to \"${profile}\" in ${configPath}`);\n}\n\nexport async function runDevProfileShowCommand(options: { json?: boolean } = {}): Promise<void> {\n const configuredProfile = getConfiguredProfile() ?? null;\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify({ defaultProfile: configuredProfile }, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`Default dev profile: ${configuredProfile ?? 'not set'}\\n`);\n}\n","import { commandExists, isTcpReachable } from '../utils/command.js';\nimport { detectDbTarget, resolveLocalDbConfig } from '../utils/db.js';\nimport { findWorkspaceRoot } from '../utils/workspace.js';\nimport { validateNodeVersion } from '../validators/node-version.js';\n\nexport interface DoctorCheck {\n id: string;\n ok: boolean;\n detail: string;\n}\n\nexport interface DoctorReport {\n workspaceRoot: string | null;\n dbTarget: 'missing' | 'local' | 'remote';\n checks: DoctorCheck[];\n}\n\nfunction getMcpDetail(env: NodeJS.ProcessEnv): { ok: boolean; detail: string } {\n const configuredKeys = [\n env.VERCEL_API_KEY ? 'vercel' : null,\n env.STRIPE_SECRET_KEY ? 'stripe' : null,\n ].filter((value): value is string => value !== null);\n\n if (configuredKeys.length === 0) {\n return {\n ok: false,\n detail: 'mcp credentials missing (set VERCEL_API_KEY and/or STRIPE_SECRET_KEY)',\n };\n }\n\n return {\n ok: true,\n detail: `mcp credentials configured for ${configuredKeys.join(', ')}`,\n };\n}\n\nexport async function gatherDoctorReport(\n cwd = process.cwd(),\n env: NodeJS.ProcessEnv = process.env,\n): Promise<DoctorReport> {\n const workspaceRoot = findWorkspaceRoot(cwd);\n const dbConfig = resolveLocalDbConfig(workspaceRoot ?? cwd, env);\n const dbTarget = detectDbTarget(env.POSTGRES_URL || env.DATABASE_URL);\n\n const nodeOk = validateNodeVersion();\n const pnpmOk = await commandExists('pnpm');\n const nixOk = await commandExists('nix');\n const direnvActive = Boolean(env.DIRENV_FILE || env.DIRENV_DIR);\n const pgCtlOk = await commandExists('pg_ctl');\n const initdbOk = await commandExists('initdb');\n const dockerOk = await commandExists('docker');\n const postgresReachable =\n dbTarget === 'local' ? await isTcpReachable('127.0.0.1', 5432, 1000) : false;\n const mcp = getMcpDetail(env);\n\n return {\n workspaceRoot,\n dbTarget,\n checks: [\n {\n id: 'workspace',\n ok: workspaceRoot !== null,\n detail: workspaceRoot ?? 'RevealUI workspace root not found',\n },\n {\n id: 'node',\n ok: nodeOk,\n detail: process.version,\n },\n {\n id: 'pnpm',\n ok: pnpmOk,\n detail: pnpmOk ? 'pnpm available' : 'pnpm not found',\n },\n {\n id: 'nix',\n ok: nixOk,\n detail: nixOk ? 'nix available' : 'nix not found',\n },\n {\n id: 'direnv',\n ok: direnvActive,\n detail: direnvActive ? 'direnv active' : 'direnv not active',\n },\n {\n id: 'db-target',\n ok: dbTarget !== 'missing',\n detail:\n dbTarget === 'missing'\n ? 'No POSTGRES_URL or DATABASE_URL configured'\n : `${dbTarget} database target (${dbConfig.postgresUrl})`,\n },\n {\n id: 'pg_ctl',\n ok: pgCtlOk,\n detail: pgCtlOk ? 'pg_ctl available' : 'pg_ctl not found',\n },\n {\n id: 'initdb',\n ok: initdbOk,\n detail: initdbOk ? 'initdb available' : 'initdb not found',\n },\n {\n id: 'postgres',\n ok: dbTarget === 'local' ? postgresReachable : true,\n detail:\n dbTarget === 'local'\n ? postgresReachable\n ? 'local postgres reachable on 127.0.0.1:5432'\n : 'local postgres not reachable on 127.0.0.1:5432'\n : 'postgres reachability skipped for non-local target',\n },\n {\n id: 'docker',\n ok: dockerOk,\n detail: dockerOk ? 'docker available' : 'docker not found',\n },\n {\n id: 'mcp',\n ok: mcp.ok,\n detail: mcp.detail,\n },\n ],\n };\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n const lines = ['', `RevealUI · ${report.workspaceRoot ?? 'workspace not found'}`, ''];\n\n for (const check of report.checks) {\n lines.push(`${check.ok ? 'OK' : 'NO'} ${check.id.padEnd(10)} ${check.detail}`);\n }\n\n return lines.join('\\n');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { findWorkspaceRoot } from './workspace.js';\n\nexport interface DevConfig {\n defaultProfile?: string;\n}\n\nexport function getDevConfigPath(startDir = process.cwd()): string | null {\n const workspaceRoot = findWorkspaceRoot(startDir);\n if (!workspaceRoot) {\n return null;\n }\n\n return path.join(workspaceRoot, '.revealui', 'dev.json');\n}\n\nexport function readDevConfig(startDir = process.cwd()): DevConfig {\n const configPath = getDevConfigPath(startDir);\n if (!(configPath && fs.existsSync(configPath))) {\n return {};\n }\n\n try {\n return JSON.parse(fs.readFileSync(configPath, 'utf8')) as DevConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeDevConfig(config: DevConfig, startDir = process.cwd()): string {\n const configPath = getDevConfigPath(startDir);\n if (!configPath) {\n throw new Error('RevealUI workspace root not found');\n }\n\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n fs.writeFileSync(`${configPath}`, `${JSON.stringify(config, null, 2)}\\n`, 'utf8');\n return configPath;\n}\n","import { createLogger } from '@revealui/setup/utils';\nimport { formatDoctorReport, gatherDoctorReport } from '../runtime/doctor.js';\nimport { runDbInitCommand, runDbStartCommand } from './db.js';\n\nconst logger = createLogger({ prefix: 'Doctor' });\n\nexport interface DoctorFixResult {\n attempted: string[];\n skipped: string[];\n}\n\nexport function getDoctorFixPlan(\n report: Awaited<ReturnType<typeof gatherDoctorReport>>,\n): DoctorFixResult {\n const attempted: string[] = [];\n const skipped: string[] = [];\n\n const postgresCheck = report.checks.find((check) => check.id === 'postgres');\n const initdbCheck = report.checks.find((check) => check.id === 'initdb');\n const pgCtlCheck = report.checks.find((check) => check.id === 'pg_ctl');\n const mcpCheck = report.checks.find((check) => check.id === 'mcp');\n\n if (report.dbTarget === 'local' && postgresCheck && !postgresCheck.ok) {\n if (initdbCheck?.ok && pgCtlCheck?.ok) {\n attempted.push('initialize/start local postgres');\n } else {\n skipped.push('local postgres repair requires both initdb and pg_ctl in PATH');\n }\n }\n\n if (mcpCheck && !mcpCheck.ok) {\n skipped.push('MCP readiness requires credentials and cannot be auto-fixed safely');\n }\n\n if (attempted.length === 0 && skipped.length === 0) {\n skipped.push('no safe automatic fixes available');\n }\n\n return { attempted, skipped };\n}\n\nasync function applyDoctorFixes(\n report: Awaited<ReturnType<typeof gatherDoctorReport>>,\n): Promise<DoctorFixResult> {\n const plan = getDoctorFixPlan(report);\n\n if (plan.attempted.includes('initialize/start local postgres')) {\n try {\n await runDbInitCommand();\n } catch {\n // Ignore \"already initialized\" and other init conflicts; start may still succeed.\n }\n await runDbStartCommand();\n }\n\n return plan;\n}\n\nfunction formatDoctorFixPlan(plan: DoctorFixResult): string {\n const lines = ['', 'RevealUI Doctor Fix Plan', ''];\n for (const action of plan.attempted) {\n lines.push(`fix ${action}`);\n }\n for (const action of plan.skipped) {\n lines.push(`skip ${action}`);\n }\n return lines.join('\\n');\n}\n\nexport async function runDoctorCommand(\n options: { json?: boolean; fix?: boolean; strict?: boolean } = {},\n): Promise<void> {\n let report = await gatherDoctorReport();\n const fixPlan = getDoctorFixPlan(report);\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify({ report, fixPlan }, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`${formatDoctorReport(report)}\\n`);\n process.stdout.write(`${formatDoctorFixPlan(fixPlan)}\\n`);\n\n if (options.fix) {\n if (fixPlan.attempted.length === 0) {\n logger.warn('No safe automatic fixes available');\n } else {\n await applyDoctorFixes(report);\n report = await gatherDoctorReport();\n process.stdout.write(`${formatDoctorReport(report)}\\n`);\n }\n }\n\n if (report.checks.some((check) => !check.ok)) {\n logger.warn('Some checks failed');\n if (options.strict || options.json || process.env.CI) {\n process.exitCode = 1;\n }\n }\n}\n","import { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport { formatDoctorReport, gatherDoctorReport } from '../runtime/doctor.js';\nimport { commandExists } from '../utils/command.js';\nimport { findWorkspaceRoot } from '../utils/workspace.js';\nimport { runDbInitCommand, runDbStartCommand } from './db.js';\n\nconst logger = createLogger({ prefix: 'Shell' });\n\nexport async function runShellCommand(\n options: { ensure?: boolean; json?: boolean; inside?: boolean; forwardArgs?: string[] } = {},\n): Promise<boolean> {\n if (!(options.inside || process.env.IN_NIX_SHELL) && (await commandExists('nix'))) {\n const workspaceRoot = findWorkspaceRoot();\n\n if (workspaceRoot) {\n const reentryArgs = options.ensure ? ['dev', 'up'] : ['dev', 'status'];\n await execa(\n 'nix',\n [\n 'develop',\n '-c',\n 'node',\n 'packages/cli/bin/revealui.js',\n ...reentryArgs,\n ...(options.forwardArgs ?? []),\n '--inside',\n ...(options.json ? ['--json'] : []),\n ],\n {\n cwd: workspaceRoot,\n stdio: 'inherit',\n },\n );\n return true;\n }\n }\n\n const report = await gatherDoctorReport();\n\n if (options.ensure && report.dbTarget === 'local' && (await commandExists('pg_ctl'))) {\n const postgresCheck = report.checks.find((check) => check.id === 'postgres');\n if (postgresCheck && !postgresCheck.ok) {\n try {\n await runDbInitCommand();\n } catch {\n // Ignore if already initialized.\n }\n await runDbStartCommand();\n }\n }\n\n const freshReport = await gatherDoctorReport();\n if (options.json) {\n process.stdout.write(`${JSON.stringify(freshReport, null, 2)}\\n`);\n return false;\n }\n\n process.stdout.write(`${formatDoctorReport(freshReport)}\\n`);\n logger.info('Use `revealui doctor --json` for machine-readable status.');\n return false;\n}\n"],"mappings":"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","names":["createLogger","createLogger","postgresUrl","inquirer","inquirer","inquirer","inquirer","inquirer","inquirer","createLogger","logger","fs","path","createLogger","ora","fs","path","fs","path","fs","path","createLogger","logger","createLogger","execa","logger","logger","createLogger","__filename","__dirname","path","fs","ora","logger","createLogger","fs","path","createLogger","execa","execa","fs","path","fs","path","logger","createLogger","fs","execa","path","createLogger","execa","fs","path","path","fs","createLogger","logger","createLogger","createLogger","execa","logger","createLogger","execa","logger","createLogger","execa","logger","createLogger"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/create-flow.ts","../src/prompts/database.ts","../src/validators/credentials.ts","../src/prompts/devenv.ts","../src/prompts/payments.ts","../src/prompts/project.ts","../src/prompts/storage.ts","../src/validators/node-version.ts","../src/commands/create.ts","../src/generators/devbox.ts","../src/generators/devcontainer.ts","../src/generators/readme.ts","../src/installers/dependencies.ts","../src/utils/git.ts","../src/commands/db.ts","../src/utils/command.ts","../src/utils/db.ts","../src/utils/workspace.ts","../src/commands/dev.ts","../src/runtime/doctor.ts","../src/utils/dev-config.ts","../src/commands/doctor.ts","../src/commands/shell.ts"],"sourcesContent":["/**\n * CLI definition using Commander.js\n */\n\nimport { createLogger } from '@revealui/setup/utils';\nimport { Command } from 'commander';\nimport { runCreateFlow } from './commands/create-flow.js';\nimport {\n runDbCleanupCommand,\n runDbInitCommand,\n runDbMigrateCommand,\n runDbResetCommand,\n runDbStartCommand,\n runDbStatusCommand,\n runDbStopCommand,\n} from './commands/db.js';\nimport {\n type DevProfileName,\n runDevDownCommand,\n runDevProfileSetCommand,\n runDevProfileShowCommand,\n runDevStatusCommand,\n runDevUpCommand,\n} from './commands/dev.js';\nimport { runDoctorCommand } from './commands/doctor.js';\n\nconst logger = createLogger({ prefix: 'CLI' });\n\nexport interface CliOptions {\n template?: string;\n skipGit?: boolean;\n skipInstall?: boolean;\n yes?: boolean;\n}\n\nfunction configureCreateCommand(command: Command, legacyName?: string): Command {\n command\n .description('Create a new RevealUI project')\n .argument('[project-name]', 'Name of the project')\n .option('-t, --template <name>', 'Template to use (basic-blog, e-commerce, portfolio)')\n .option('--skip-git', 'Skip git initialization', false)\n .option('--skip-install', 'Skip dependency installation', false)\n .option('-y, --yes', 'Skip all prompts and use defaults', false)\n .action(async (projectName: string | undefined, options: CliOptions) => {\n logger.header(legacyName ? 'Create RevealUI Project' : 'RevealUI Create');\n await runCreateFlow(projectName, options);\n });\n\n return command;\n}\n\nexport function createCli(): Command {\n const program = new Command();\n\n program.name('revealui').description('RevealUI operational CLI').version('0.2.0');\n\n configureCreateCommand(program.command('create'), undefined);\n\n program\n .command('doctor')\n .description('Check RevealUI workspace and developer environment health')\n .option('--json', 'Output machine-readable JSON', false)\n .option('--fix', 'Apply safe automatic fixes when possible', false)\n .option('--strict', 'Exit nonzero when checks fail', false)\n .action(async (options: { json?: boolean; fix?: boolean; strict?: boolean }) => {\n await runDoctorCommand(options);\n });\n\n const db = program.command('db').description('Manage the local RevealUI database');\n\n db.command('init')\n .description('Initialize the local PostgreSQL data directory')\n .option('--force', 'Delete and recreate the local data directory', false)\n .action(async (options: { force?: boolean }) => {\n await runDbInitCommand(options);\n });\n\n db.command('start')\n .description('Start the local PostgreSQL server')\n .action(async () => {\n await runDbStartCommand();\n });\n\n db.command('stop')\n .description('Stop the local PostgreSQL server')\n .action(async () => {\n await runDbStopCommand();\n });\n\n db.command('status')\n .description('Show local PostgreSQL status')\n .action(async () => {\n await runDbStatusCommand();\n });\n\n db.command('reset')\n .description('Reset the local PostgreSQL data directory')\n .option('--force', 'Confirm the destructive reset', false)\n .action(async (options: { force?: boolean }) => {\n await runDbResetCommand(options);\n });\n\n db.command('migrate')\n .description('Run Drizzle migrations using the local RevealUI database environment')\n .action(async () => {\n await runDbMigrateCommand();\n });\n\n db.command('cleanup')\n .description(\n 'Delete expired sessions, rate-limit rows, password-reset tokens, magic links, and publish due scheduled pages. Uses DATABASE_URL / POSTGRES_URL from the environment.',\n )\n .option('--dry-run', 'Count stale rows without deleting them', false)\n .option(\n '--tables <names>',\n 'Comma-separated subset: sessions,rateLimits,passwordResetTokens,magicLinks,scheduledPages',\n )\n .action(async (options: { dryRun?: boolean; tables?: string }) => {\n await runDbCleanupCommand(options);\n });\n\n const dev = program\n .command('dev')\n .description('Prepare and manage the RevealUI development workspace');\n\n dev\n .command('up')\n .description(\n 'Ensure the local dev environment is ready, migrate the DB, optionally validate MCP, and start a dev script',\n )\n .option('--json', 'Output machine-readable JSON', false)\n .option('--dry-run', 'Print the effective plan and actions without executing them', false)\n .option('--fix', 'Apply safe automatic fixes before bootstrapping when possible', false)\n .option('--no-ensure', 'Skip automatic local DB initialization/start')\n .option('--profile <name>', 'Named dev profile: local, agent, cms, fullstack')\n .option(\n '--include <service...>',\n 'Additional development services to prepare (currently supports: mcp)',\n )\n .option('--script <name>', 'Optional pnpm script to run after environment bootstrap')\n .option('--inside', 'Internal flag used after re-entering nix develop', false)\n .action(\n async (options: {\n ensure?: boolean;\n json?: boolean;\n dryRun?: boolean;\n fix?: boolean;\n script?: string;\n profile?: DevProfileName;\n include?: string[];\n inside?: boolean;\n }) => {\n await runDevUpCommand(options);\n },\n );\n\n dev\n .command('status')\n .description('Show current RevealUI development environment status')\n .option('--json', 'Output machine-readable JSON', false)\n .option('--profile <name>', 'Named dev profile: local, agent, cms, fullstack')\n .option(\n '--include <service...>',\n 'Additional development services to preview in the effective plan',\n )\n .option('--script <name>', 'Optional pnpm script to preview in the effective plan')\n .option('--inside', 'Internal flag used after re-entering nix develop', false)\n .action(\n async (options: {\n json?: boolean;\n profile?: DevProfileName;\n include?: string[];\n script?: string;\n inside?: boolean;\n }) => {\n await runDevStatusCommand(options);\n },\n );\n\n dev\n .command('down')\n .description('Stop local RevealUI development services that are managed by the CLI')\n .action(async () => {\n await runDevDownCommand();\n });\n\n dev\n .command('shell')\n .description('Alias for `revealui dev up` without starting an app script')\n .option('--json', 'Output machine-readable JSON', false)\n .option('--dry-run', 'Print the effective plan and actions without executing them', false)\n .option('--fix', 'Apply safe automatic fixes before bootstrapping when possible', false)\n .option('--no-ensure', 'Skip automatic local DB initialization/start')\n .option('--profile <name>', 'Named dev profile: local, agent, cms, fullstack')\n .option(\n '--include <service...>',\n 'Additional development services to prepare (currently supports: mcp)',\n )\n .option('--inside', 'Internal flag used after re-entering nix develop', false)\n .action(\n async (options: {\n ensure?: boolean;\n json?: boolean;\n dryRun?: boolean;\n fix?: boolean;\n profile?: DevProfileName;\n include?: string[];\n inside?: boolean;\n }) => {\n await runDevUpCommand({\n ensure: options.ensure,\n json: options.json,\n dryRun: options.dryRun,\n fix: options.fix,\n profile: options.profile,\n include: options.include,\n inside: options.inside,\n });\n },\n );\n\n const devProfile = dev\n .command('profile')\n .description('Persist or inspect the default dev profile');\n\n devProfile\n .command('set')\n .description('Set the default profile used by `revealui dev up` and `revealui dev status`')\n .argument('<name>', 'Profile name: local, agent, cms, fullstack')\n .action(async (name: DevProfileName) => {\n await runDevProfileSetCommand(name);\n });\n\n devProfile\n .command('show')\n .description('Show the configured default dev profile')\n .option('--json', 'Output machine-readable JSON', false)\n .action(async (options: { json?: boolean }) => {\n await runDevProfileShowCommand(options);\n });\n\n program\n .command('shell')\n .description('Deprecated alias for `revealui dev shell`')\n .option('--ensure', 'Initialize/start the local DB when possible', false)\n .option('--json', 'Output machine-readable JSON', false)\n .option('--inside', 'Internal flag used after re-entering nix develop', false)\n .action(async (options: { ensure?: boolean; json?: boolean; inside?: boolean }) => {\n await runDevUpCommand({\n ensure: options.ensure,\n json: options.json,\n inside: options.inside,\n });\n });\n\n return program;\n}\n\nexport function createLegacyCreateCli(): Command {\n const program = new Command();\n\n program.name('create-revealui').version('0.2.0');\n configureCreateCommand(program, 'create-revealui');\n\n return program;\n}\n","import { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { createLogger } from '@revealui/setup/utils';\nimport { importSPKI, jwtVerify } from 'jose';\nimport type { CliOptions } from '../cli.js';\nimport { promptDatabaseConfig } from '../prompts/database.js';\nimport { promptDevEnvConfig } from '../prompts/devenv.js';\nimport { promptPaymentConfig } from '../prompts/payments.js';\nimport { promptProjectConfig } from '../prompts/project.js';\nimport { promptStorageConfig } from '../prompts/storage.js';\nimport { validateNodeVersion } from '../validators/node-version.js';\nimport { createProject } from './create.js';\n\nconst logger = createLogger({ prefix: '@revealui/cli' });\n\nconst PRO_TEMPLATES = new Set<string>([]);\n\nasync function checkProLicense(): Promise<boolean> {\n let key: string | undefined = process.env.REVEALUI_LICENSE_KEY;\n\n if (!key) {\n try {\n const licenseFile = join(homedir(), '.revealui', 'license.json');\n const parsed = JSON.parse(readFileSync(licenseFile, 'utf8')) as { key?: string };\n key = parsed.key;\n } catch {\n // No license file — free tier\n }\n }\n\n if (!key) return false;\n\n const publicKeyPem = process.env.REVEALUI_LICENSE_PUBLIC_KEY;\n if (publicKeyPem) {\n try {\n const publicKey = await importSPKI(publicKeyPem, 'RS256');\n const { payload } = await jwtVerify(key, publicKey);\n const tier = (payload as { tier?: string }).tier ?? 'free';\n return tier === 'pro' || tier === 'enterprise';\n } catch {\n return false;\n }\n }\n\n try {\n const parts = key.split('.');\n if (parts.length < 3) return false;\n const payload = JSON.parse(Buffer.from(parts[1] ?? '', 'base64url').toString('utf8')) as {\n tier?: string;\n exp?: number;\n };\n if (payload.exp !== undefined && payload.exp < Math.floor(Date.now() / 1000)) {\n return false;\n }\n const tier = payload.tier ?? 'free';\n return tier === 'pro' || tier === 'enterprise';\n } catch {\n return false;\n }\n}\n\nexport async function runCreateFlow(\n projectName: string | undefined,\n options: CliOptions,\n): Promise<void> {\n logger.info('[1/8] Validating Node.js version...');\n if (!validateNodeVersion()) {\n process.exit(1);\n }\n logger.success(`Node.js version: ${process.version}`);\n\n logger.info('[2/8] Configure your project');\n const projectConfig = await promptProjectConfig(projectName, options.template, options.yes);\n logger.success(`Project: ${projectConfig.projectName}`);\n logger.success(`Template: ${projectConfig.template}`);\n\n if (PRO_TEMPLATES.has(projectConfig.template)) {\n if (!(await checkProLicense())) {\n logger.error(`The \"${projectConfig.template}\" template requires a RevealUI Pro license.`);\n logger.info('Get Pro at https://revealui.com/pricing');\n logger.info('Set your license key: export REVEALUI_LICENSE_KEY=<your-key>');\n process.exit(2);\n }\n logger.success('Pro license verified');\n }\n\n const nonInteractive = options.yes === true;\n\n logger.info('[3/8] Configure database');\n const databaseConfig = nonInteractive\n ? { provider: 'skip' as const }\n : await promptDatabaseConfig();\n if (databaseConfig.provider !== 'skip') {\n logger.success(`Database: ${databaseConfig.provider}`);\n } else {\n logger.info('Database configuration skipped');\n }\n\n logger.info('[4/8] Configure storage');\n const storageConfig = nonInteractive\n ? { provider: 'skip' as const }\n : await promptStorageConfig();\n if (storageConfig.provider !== 'skip') {\n logger.success(`Storage: ${storageConfig.provider}`);\n } else {\n logger.info('Storage configuration skipped');\n }\n\n logger.info('[5/8] Configure payments');\n const paymentConfig = nonInteractive ? { enabled: false } : await promptPaymentConfig();\n if (paymentConfig.enabled) {\n logger.success('Stripe configured');\n } else {\n logger.info('Payments disabled');\n }\n\n logger.info('[6/8] Configure development environment');\n const devEnvConfig = nonInteractive\n ? { createDevContainer: false, createDevbox: false }\n : await promptDevEnvConfig();\n logger.success(\n `Dev Container: ${devEnvConfig.createDevContainer ? 'Yes' : 'No'}, Devbox: ${devEnvConfig.createDevbox ? 'Yes' : 'No'}`,\n );\n\n logger.info('[7/8] Creating project...');\n await createProject({\n project: projectConfig,\n database: databaseConfig,\n storage: storageConfig,\n payment: paymentConfig,\n devenv: devEnvConfig,\n skipGit: options.skipGit,\n skipInstall: options.skipInstall,\n });\n logger.success('Project created successfully');\n\n logger.info('[8/8] Next steps');\n logger.divider();\n logger.info(`cd ${projectConfig.projectName}`);\n logger.info('pnpm install');\n logger.info('pnpm dev');\n logger.divider();\n logger.success(`Project ${projectConfig.projectName} created successfully`);\n}\n","/**\n * Database configuration prompts\n */\n\nimport inquirer from 'inquirer';\nimport { validateNeonUrl } from '../validators/credentials.js';\n\nexport interface DatabaseConfig {\n provider: 'neon' | 'supabase' | 'local' | 'skip';\n postgresUrl?: string;\n}\n\nexport async function promptDatabaseConfig(): Promise<DatabaseConfig> {\n const { provider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'provider',\n message: 'Which database provider would you like to use?',\n choices: [\n {\n name: 'NeonDB - Serverless PostgreSQL (recommended)',\n value: 'neon',\n },\n {\n name: 'Supabase - PostgreSQL with built-in features',\n value: 'supabase',\n },\n {\n name: 'Local PostgreSQL - Use existing local database',\n value: 'local',\n },\n {\n name: 'Skip - Configure later',\n value: 'skip',\n },\n ],\n default: 'neon',\n },\n ]);\n\n if (provider === 'skip') {\n return { provider: 'skip' };\n }\n\n if (provider === 'local') {\n const { postgresUrl } = await inquirer.prompt([\n {\n type: 'input',\n name: 'postgresUrl',\n message: 'Enter your PostgreSQL connection string:',\n default: 'postgresql://postgres:postgres@localhost:5432/revealui',\n validate: async (input: string) => {\n const result = await validateNeonUrl(input);\n return result.valid ? true : result.message || 'Invalid database URL';\n },\n },\n ]);\n return { provider: 'local', postgresUrl };\n }\n\n // For Neon or Supabase, get the connection string\n const { postgresUrl } = await inquirer.prompt([\n {\n type: 'input',\n name: 'postgresUrl',\n message: `Enter your ${provider === 'neon' ? 'Neon' : 'Supabase'} database connection string:`,\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Database URL is required';\n }\n const result = await validateNeonUrl(input);\n return result.valid ? true : result.message || 'Invalid database URL';\n },\n },\n ]);\n\n return { provider, postgresUrl };\n}\n","/**\n * API credential validation\n */\n\nimport { createLogger } from '@revealui/setup/utils';\n\nconst logger = createLogger({ prefix: 'Validator' });\n\nexport interface CredentialValidation {\n valid: boolean;\n message?: string;\n}\n\nexport async function validateStripeKey(key: string): Promise<CredentialValidation> {\n if (!(key.startsWith('sk_test_') || key.startsWith('sk_live_'))) {\n return {\n valid: false,\n message: 'Stripe key must start with sk_test_ or sk_live_',\n };\n }\n // Basic validation - full validation would require API call\n return { valid: true };\n}\n\nexport async function validateNeonUrl(url: string): Promise<CredentialValidation> {\n try {\n const parsed = new URL(url);\n if (!parsed.protocol.startsWith('postgres')) {\n return {\n valid: false,\n message: 'Database URL must use postgres:// or postgresql:// protocol',\n };\n }\n return { valid: true };\n } catch {\n return {\n valid: false,\n message: 'Invalid database URL format',\n };\n }\n}\n\nexport async function validateVercelToken(token: string): Promise<CredentialValidation> {\n if (!token || token.length < 20) {\n return {\n valid: false,\n message: 'Vercel token appears invalid (too short)',\n };\n }\n return { valid: true };\n}\n\nexport async function validateSupabaseUrl(url: string): Promise<CredentialValidation> {\n try {\n const parsed = new URL(url);\n if (!parsed.hostname.includes('supabase')) {\n logger.warn('URL does not appear to be a Supabase URL');\n }\n return { valid: true };\n } catch {\n return {\n valid: false,\n message: 'Invalid Supabase URL format',\n };\n }\n}\n\nexport async function validateOpenAIKey(key: string): Promise<CredentialValidation> {\n if (!key.startsWith('sk-')) {\n return {\n valid: false,\n message: 'OpenAI key must start with sk-',\n };\n }\n return { valid: true };\n}\n","/**\n * Development environment configuration prompts\n */\n\nimport inquirer from 'inquirer';\n\nexport interface DevEnvConfig {\n createDevContainer: boolean;\n createDevbox: boolean;\n}\n\nexport async function promptDevEnvConfig(): Promise<DevEnvConfig> {\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'createDevContainer',\n message: 'Create Dev Container configuration for VS Code / GitHub Codespaces?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'createDevbox',\n message: 'Create Devbox configuration for Nix-powered development?',\n default: true,\n },\n ]);\n\n return answers;\n}\n","/**\n * Payment configuration prompts\n */\n\nimport inquirer from 'inquirer';\nimport { validateStripeKey } from '../validators/credentials.js';\n\nexport interface PaymentConfig {\n enabled: boolean;\n stripeSecretKey?: string;\n stripePublishableKey?: string;\n stripeWebhookSecret?: string;\n}\n\nexport async function promptPaymentConfig(): Promise<PaymentConfig> {\n const { enabled } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'enabled',\n message: 'Do you want to configure Stripe payments?',\n default: true,\n },\n ]);\n\n if (!enabled) {\n return { enabled: false };\n }\n\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'stripeSecretKey',\n message: 'Enter your Stripe secret key (sk_test_... or sk_live_...):',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Stripe secret key is required';\n }\n const result = await validateStripeKey(input);\n return result.valid ? true : result.message || 'Invalid Stripe key';\n },\n },\n {\n type: 'input',\n name: 'stripePublishableKey',\n message: 'Enter your Stripe publishable key (pk_test_... or pk_live_...):',\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Stripe publishable key is required';\n }\n if (!(input.startsWith('pk_test_') || input.startsWith('pk_live_'))) {\n return 'Stripe publishable key must start with pk_test_ or pk_live_';\n }\n return true;\n },\n },\n {\n type: 'input',\n name: 'stripeWebhookSecret',\n message: 'Enter your Stripe webhook secret (whsec_..., optional - press Enter to skip):',\n default: '',\n },\n ]);\n\n return {\n enabled: true,\n stripeSecretKey: answers.stripeSecretKey,\n stripePublishableKey: answers.stripePublishableKey,\n stripeWebhookSecret: answers.stripeWebhookSecret || undefined,\n };\n}\n","/**\n * Project configuration prompts\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport inquirer from 'inquirer';\n\nexport interface ProjectConfig {\n projectName: string;\n projectPath: string;\n template: 'basic-blog' | 'e-commerce' | 'portfolio';\n}\n\nconst VALID_TEMPLATES = ['basic-blog', 'e-commerce', 'portfolio'] as const;\n\nexport async function promptProjectConfig(\n defaultName?: string,\n templateArg?: string,\n nonInteractive = false,\n): Promise<ProjectConfig> {\n // Resolve project name — use CLI arg or prompt\n let projectName: string;\n if (defaultName) {\n projectName = defaultName;\n } else if (nonInteractive) {\n projectName = 'my-revealui-project';\n } else {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'projectName',\n message: 'What is your project name?',\n default: 'my-revealui-project',\n validate: (input: string) => {\n if (!/^[a-z0-9-]+$/.test(input)) {\n return 'Project name must contain only lowercase letters, numbers, and hyphens';\n }\n const projectPath = path.resolve(process.cwd(), input);\n if (fs.existsSync(projectPath)) {\n return `Directory \"${input}\" already exists`;\n }\n return true;\n },\n },\n ]);\n projectName = answers.projectName;\n }\n\n // Resolve template — use CLI arg or prompt\n let template: ProjectConfig['template'];\n if (templateArg && VALID_TEMPLATES.includes(templateArg as ProjectConfig['template'])) {\n template = templateArg as ProjectConfig['template'];\n } else if (nonInteractive) {\n template = 'basic-blog';\n } else {\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'template',\n message: 'Which template would you like to use?',\n choices: [\n { name: 'Basic Blog - A simple blog with posts and pages', value: 'basic-blog' },\n { name: 'E-commerce - Product catalog with checkout', value: 'e-commerce' },\n { name: 'Portfolio - Personal portfolio site', value: 'portfolio' },\n ],\n default: 'basic-blog',\n },\n ]);\n template = answers.template;\n }\n\n return {\n projectName,\n projectPath: path.resolve(process.cwd(), projectName),\n template,\n };\n}\n","/**\n * Storage configuration prompts\n */\n\nimport inquirer from 'inquirer';\nimport { validateSupabaseUrl, validateVercelToken } from '../validators/credentials.js';\n\nexport interface StorageConfig {\n provider: 'vercel-blob' | 'supabase' | 'skip';\n blobToken?: string;\n supabaseUrl?: string;\n supabasePublishableKey?: string;\n}\n\nexport async function promptStorageConfig(): Promise<StorageConfig> {\n const { provider } = await inquirer.prompt([\n {\n type: 'list',\n name: 'provider',\n message: 'Which storage provider would you like to use?',\n choices: [\n {\n name: 'Vercel Blob - Simple object storage (recommended)',\n value: 'vercel-blob',\n },\n {\n name: 'Supabase Storage - Integrated with Supabase',\n value: 'supabase',\n },\n {\n name: 'Skip - Configure later',\n value: 'skip',\n },\n ],\n default: 'vercel-blob',\n },\n ]);\n\n if (provider === 'skip') {\n return { provider: 'skip' };\n }\n\n if (provider === 'vercel-blob') {\n const { blobToken } = await inquirer.prompt([\n {\n type: 'input',\n name: 'blobToken',\n message: 'Enter your Vercel Blob read/write token:',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Blob token is required';\n }\n const result = await validateVercelToken(input);\n return result.valid ? true : result.message || 'Invalid token';\n },\n },\n ]);\n return { provider: 'vercel-blob', blobToken };\n }\n\n // Supabase storage\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'supabaseUrl',\n message: 'Enter your Supabase project URL:',\n validate: async (input: string) => {\n if (!input || input.trim() === '') {\n return 'Supabase URL is required';\n }\n const result = await validateSupabaseUrl(input);\n return result.valid ? true : result.message || 'Invalid URL';\n },\n },\n {\n type: 'input',\n name: 'supabasePublishableKey',\n message: 'Enter your Supabase publishable key (sb_publishable_...):',\n validate: (input: string) => {\n if (!input || input.trim() === '') {\n return 'Supabase publishable key is required';\n }\n return true;\n },\n },\n ]);\n\n return {\n provider: 'supabase',\n supabaseUrl: answers.supabaseUrl,\n supabasePublishableKey: answers.supabasePublishableKey,\n };\n}\n","/**\n * Node version validation\n */\n\nimport { createLogger } from '@revealui/setup/utils';\n\nconst logger = createLogger({ prefix: 'Setup' });\n\nconst REQUIRED_NODE_VERSION = '24.13.0';\n\nexport function validateNodeVersion(): boolean {\n const currentVersion = process.version.slice(1); // Remove 'v' prefix\n const [currentMajor, currentMinor] = currentVersion.split('.').map(Number);\n const [requiredMajor, requiredMinor] = REQUIRED_NODE_VERSION.split('.').map(Number);\n\n if (\n currentMajor < requiredMajor ||\n (currentMajor === requiredMajor && currentMinor < requiredMinor)\n ) {\n logger.error(\n `Node.js ${REQUIRED_NODE_VERSION} or higher is required. You have ${currentVersion}.`,\n );\n logger.info('Please upgrade Node.js: https://nodejs.org/');\n return false;\n }\n\n return true;\n}\n","/**\n * Project creation command\n *\n * Copies template files, writes .env.local, installs dependencies,\n * and initialises a git repo.\n */\n\nimport crypto from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createLogger } from '@revealui/setup/utils';\nimport ora from 'ora';\nimport { generateDevbox } from '../generators/devbox.js';\nimport { generateDevContainer } from '../generators/devcontainer.js';\nimport { generateReadme } from '../generators/readme.js';\nimport { installDependencies, isPnpmInstalled } from '../installers/dependencies.js';\nimport type { DatabaseConfig } from '../prompts/database.js';\nimport type { DevEnvConfig } from '../prompts/devenv.js';\nimport type { PaymentConfig } from '../prompts/payments.js';\nimport type { ProjectConfig } from '../prompts/project.js';\nimport type { StorageConfig } from '../prompts/storage.js';\nimport { createInitialCommit, initializeGitRepo, isGitInstalled } from '../utils/git.js';\n\nconst logger = createLogger({ prefix: 'Create' });\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Templates live at packages/cli/templates/\n// In source: __dirname = src/commands/ → ../../templates\n// After tsup: __dirname = dist/ → ../templates\n// Detect by checking which path actually exists\nconst TEMPLATES_DIR = existsSync(path.resolve(__dirname, '../../templates'))\n ? path.resolve(__dirname, '../../templates')\n : path.resolve(__dirname, '../templates');\n\nexport interface CreateProjectConfig {\n project: ProjectConfig;\n database: DatabaseConfig;\n storage: StorageConfig;\n payment: PaymentConfig;\n devenv: DevEnvConfig;\n skipGit?: boolean;\n skipInstall?: boolean;\n}\n\n/**\n * Build the .env.local content from user-provided config values.\n */\nfunction buildEnvLocal(cfg: CreateProjectConfig): string {\n const lines: string[] = [\n '# Generated by @revealui/cli — fill in the remaining placeholders before running `pnpm dev`',\n '',\n '# Core',\n `REVEALUI_SECRET=${generateSecret()}`,\n `REVEALUI_PUBLIC_SERVER_URL=http://localhost:4000`,\n `NEXT_PUBLIC_SERVER_URL=http://localhost:4000`,\n '',\n '# Database',\n ];\n\n if (cfg.database.postgresUrl) {\n lines.push(`POSTGRES_URL=${cfg.database.postgresUrl}`);\n } else {\n lines.push('POSTGRES_URL=postgresql://postgres:postgres@localhost:5432/revealui');\n }\n\n lines.push('', '# Storage (Vercel Blob)');\n if (cfg.storage.provider === 'vercel-blob' && cfg.storage.blobToken) {\n lines.push(`BLOB_READ_WRITE_TOKEN=${cfg.storage.blobToken}`);\n } else {\n lines.push('BLOB_READ_WRITE_TOKEN=vercel_blob_rw_placeholder');\n }\n\n lines.push('', '# Stripe');\n if (cfg.payment.enabled && cfg.payment.stripeSecretKey) {\n lines.push(`STRIPE_SECRET_KEY=${cfg.payment.stripeSecretKey}`);\n lines.push(`STRIPE_WEBHOOK_SECRET=${cfg.payment.stripeWebhookSecret || 'whsec_placeholder'}`);\n lines.push(\n `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${cfg.payment.stripePublishableKey || 'pk_test_placeholder'}`,\n );\n } else {\n lines.push('STRIPE_SECRET_KEY=sk_test_placeholder');\n lines.push('STRIPE_WEBHOOK_SECRET=whsec_placeholder');\n lines.push('NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_placeholder');\n }\n\n lines.push('', '# Admin bootstrap (used on first run only)');\n lines.push('REVEALUI_ADMIN_EMAIL=admin@example.com');\n lines.push('REVEALUI_ADMIN_PASSWORD=changeme-min-12-chars');\n\n return `${lines.join('\\n')}\\n`;\n}\n\n/** Generate a cryptographically random 48-char hex secret */\nfunction generateSecret(): string {\n return crypto.randomBytes(24).toString('hex');\n}\n\n/**\n * List template directories that actually exist on disk.\n */\nasync function listAvailableTemplates(): Promise<string[]> {\n try {\n const entries = await fs.readdir(TEMPLATES_DIR, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\n/**\n * Copy a template directory recursively into the target path.\n */\nasync function copyTemplate(templateName: string, targetPath: string): Promise<void> {\n const templatePath = path.join(TEMPLATES_DIR, templateName);\n\n // Verify the template exists\n try {\n await fs.access(templatePath);\n } catch {\n const available = await listAvailableTemplates();\n const listing =\n available.length > 0\n ? `Available templates: ${available.join(', ')}`\n : `No templates found in ${TEMPLATES_DIR}`;\n throw new Error(`Template \"${templateName}\" not found at ${templatePath}. ${listing}`);\n }\n\n await copyDir(templatePath, targetPath);\n}\n\nasync function copyDir(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n // npm always strips .gitignore from tarballs; we store it as _gitignore and rename on copy\n const destName = entry.name === '_gitignore' ? '.gitignore' : entry.name;\n const destPath = path.join(dest, destName);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Map the CLI template name to the directory name under templates/.\n * All non-starter templates fall back to starter for now.\n */\nfunction resolveTemplateName(template: ProjectConfig['template']): string {\n const map: Record<ProjectConfig['template'], string> = {\n 'basic-blog': 'basic-blog',\n 'e-commerce': 'e-commerce',\n portfolio: 'portfolio',\n };\n return map[template] ?? 'starter';\n}\n\n/**\n * Main project creation function — wires everything together.\n */\nexport async function createProject(cfg: CreateProjectConfig): Promise<void> {\n const { project, skipGit = false, skipInstall = false } = cfg;\n const { projectPath, projectName, template } = project;\n\n // 1. Copy template files\n const spinner = ora(`Copying template \"${template}\"...`).start();\n try {\n await copyTemplate(resolveTemplateName(template), projectPath);\n spinner.succeed('Template files copied');\n } catch (err) {\n spinner.fail('Failed to copy template files');\n throw err;\n }\n\n // 2. Replace {{PROJECT_NAME}} placeholders in package.json / other files\n const pkgJsonPath = path.join(projectPath, 'package.json');\n try {\n const raw = await fs.readFile(pkgJsonPath, 'utf-8');\n await fs.writeFile(pkgJsonPath, raw.replaceAll('{{PROJECT_NAME}}', projectName), 'utf-8');\n } catch {\n // package.json placeholder replacement is best-effort\n }\n\n // 3. Write .env.local\n const envSpinner = ora('Writing .env.local...').start();\n try {\n await fs.writeFile(path.join(projectPath, '.env.local'), buildEnvLocal(cfg), 'utf-8');\n envSpinner.succeed('.env.local written');\n } catch (err) {\n envSpinner.fail('Failed to write .env.local');\n throw err;\n }\n\n // 4. Generate README\n await generateReadme(projectPath, project);\n logger.success('README.md generated');\n\n // 4b. Generate dev environment configs\n if (cfg.devenv.createDevContainer) {\n await generateDevContainer(projectPath);\n logger.success('.devcontainer/ generated');\n }\n if (cfg.devenv.createDevbox) {\n await generateDevbox(projectPath);\n logger.success('devbox.json generated');\n }\n\n // 5. Install dependencies\n if (!skipInstall) {\n const pnpmOk = await isPnpmInstalled();\n if (!pnpmOk) {\n logger.warn(\n 'pnpm not found — skipping dependency installation. Run `pnpm install` manually.',\n );\n } else {\n await installDependencies(projectPath);\n }\n } else {\n logger.info('Skipping dependency installation (--skip-install)');\n }\n\n // 6. Git init\n if (!skipGit) {\n const gitOk = await isGitInstalled();\n if (!gitOk) {\n logger.warn('git not found — skipping repository initialisation.');\n } else {\n await initializeGitRepo(projectPath);\n await createInitialCommit(projectPath);\n }\n } else {\n logger.info('Skipping git initialisation (--skip-git)');\n }\n}\n","/**\n * Devbox configuration generator\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateDevbox(projectPath: string): Promise<void> {\n const devboxConfig = {\n packages: ['nodejs@24.13.0', 'pnpm@10.28.2', 'postgresql@16', 'stripe-cli@latest'],\n shell: {\n init_hook: [\n 'corepack enable',\n 'echo \"🚀 RevealUI Devbox shell ready!\"',\n 'echo \"Run: pnpm dev to start development\"',\n ],\n scripts: {\n dev: 'pnpm dev',\n setup: 'pnpm install && pnpm db:init',\n test: 'pnpm test',\n },\n },\n env: {\n NODE_ENV: 'development',\n },\n };\n\n await fs.writeFile(\n path.join(projectPath, 'devbox.json'),\n JSON.stringify(devboxConfig, null, 2),\n 'utf-8',\n );\n}\n","/**\n * Dev Container configuration generator\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateDevContainer(projectPath: string): Promise<void> {\n const devcontainerDir = path.join(projectPath, '.devcontainer');\n await fs.mkdir(devcontainerDir, { recursive: true });\n\n // Create devcontainer.json\n const devcontainerConfig = {\n name: 'RevealUI Development',\n image: 'mcr.microsoft.com/devcontainers/typescript-node:24',\n features: {\n 'ghcr.io/devcontainers/features/common-utils:2': {\n installZsh: true,\n installOhMyZsh: true,\n },\n },\n forwardPorts: [3000, 4000, 5432],\n portsAttributes: {\n '3000': {\n label: 'Web App',\n onAutoForward: 'notify',\n },\n '4000': {\n label: 'CMS',\n onAutoForward: 'notify',\n },\n '5432': {\n label: 'PostgreSQL',\n onAutoForward: 'silent',\n },\n },\n postCreateCommand: 'corepack enable && pnpm install',\n customizations: {\n vscode: {\n extensions: [\n 'biomejs.biome',\n 'bradlc.vscode-tailwindcss',\n 'Prisma.prisma',\n 'ms-azuretools.vscode-docker',\n 'streetsidesoftware.code-spell-checker',\n ],\n settings: {\n 'editor.defaultFormatter': 'biomejs.biome',\n 'editor.formatOnSave': true,\n 'editor.codeActionsOnSave': {\n 'quickfix.biome': 'explicit',\n 'source.organizeImports.biome': 'explicit',\n },\n },\n },\n },\n remoteUser: 'node',\n };\n\n await fs.writeFile(\n path.join(devcontainerDir, 'devcontainer.json'),\n JSON.stringify(devcontainerConfig, null, 2),\n 'utf-8',\n );\n\n // Create docker-compose.yml for services\n const dockerCompose = `version: '3.8'\n\nservices:\n app:\n build:\n context: ..\n dockerfile: .devcontainer/Dockerfile\n volumes:\n - ..:/workspace:cached\n command: sleep infinity\n network_mode: service:db\n\n db:\n image: pgvector/pgvector:pg16\n restart: unless-stopped\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: revealui\n volumes:\n - postgres-data:/var/lib/postgresql/data\n\nvolumes:\n postgres-data:\n`;\n\n await fs.writeFile(path.join(devcontainerDir, 'docker-compose.yml'), dockerCompose, 'utf-8');\n\n // Create Dockerfile\n const dockerfile = `FROM mcr.microsoft.com/devcontainers/typescript-node:24\n\n# Install additional tools\nRUN apt-get update && export DEBIAN_FRONTEND=noninteractive \\\\\n && apt-get -y install --no-install-recommends postgresql-client\n\n# Enable pnpm\nRUN corepack enable\n`;\n\n await fs.writeFile(path.join(devcontainerDir, 'Dockerfile'), dockerfile, 'utf-8');\n\n // Create README\n const readme = `# Dev Container Setup\n\nThis directory contains the Dev Container configuration for RevealUI.\n\n## Usage\n\n### VS Code\n\n1. Install the \"Dev Containers\" extension\n2. Open this folder in VS Code\n3. Press F1 and select \"Dev Containers: Reopen in Container\"\n\n### GitHub Codespaces\n\n1. Click the green \"Code\" button on GitHub\n2. Select \"Codespaces\" tab\n3. Click \"Create codespace on main\"\n\n## What's Included\n\n- Node.js 24.13.0\n- pnpm package manager\n- PostgreSQL 16 with pgvector\n- VS Code extensions:\n - Biome\n - Tailwind CSS\n - Prisma\n - Docker\n - Code Spell Checker\n\n## Environment Variables\n\nEnvironment variables are loaded from \\`.env.development.local\\`.\nFor GitHub Codespaces, set secrets in your repository settings.\n\n## Ports\n\n- 3000: Web application\n- 4000: CMS\n- 5432: PostgreSQL database\n`;\n\n await fs.writeFile(path.join(devcontainerDir, 'README.md'), readme, 'utf-8');\n}\n","/**\n * Project README generator\n */\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ProjectConfig } from '../prompts/project.js';\n\nexport async function generateReadme(\n projectPath: string,\n projectConfig: ProjectConfig,\n): Promise<void> {\n const readme = `# ${projectConfig.projectName}\n\nA RevealUI project created with @revealui/cli.\n\n## Getting Started\n\nFirst, install dependencies:\n\n\\`\\`\\`bash\npnpm install\n\\`\\`\\`\n\nThen, initialize the database:\n\n\\`\\`\\`bash\npnpm db:init\npnpm db:migrate\n\\`\\`\\`\n\nRun the development server:\n\n\\`\\`\\`bash\npnpm dev\n\\`\\`\\`\n\nOpen [http://localhost:4000](http://localhost:4000) with your browser to access the CMS.\n\nThe web application runs on [http://localhost:3000](http://localhost:3000).\n\n## Development Environments\n\n### Standard Setup\n\nRequirements:\n- Node.js 24.13.0 or higher\n- pnpm 10.28.2 or higher\n- PostgreSQL 16\n\n### Dev Containers\n\nOpen in VS Code and select \"Reopen in Container\", or use GitHub Codespaces.\n\n### Devbox\n\nInstall Devbox:\n\n\\`\\`\\`bash\ncurl -fsSL https://get.jetpack.io/devbox | bash\n\\`\\`\\`\n\nThen start the Devbox shell:\n\n\\`\\`\\`bash\ndevbox shell\npnpm dev\n\\`\\`\\`\n\n## Project Structure\n\n\\`\\`\\`\n${projectConfig.projectName}/\n├── apps/\n│ ├── cms/ # CMS application\n│ └── web/ # Frontend application\n├── packages/\n│ ├── auth/ # Authentication\n│ ├── db/ # Database\n│ └── ... # Other shared packages\n├── .devcontainer/ # Dev Container configuration\n├── devbox.json # Devbox configuration\n└── .env.development.local # Environment variables\n\\`\\`\\`\n\n## Available Scripts\n\n- \\`pnpm dev\\` - Start development servers\n- \\`pnpm build\\` - Build for production\n- \\`pnpm test\\` - Run tests\n- \\`pnpm lint\\` - Run linters\n- \\`pnpm typecheck\\` - Type check\n- \\`pnpm db:init\\` - Initialize database\n- \\`pnpm db:migrate\\` - Run migrations\n- \\`pnpm db:seed\\` - Seed database\n\n## Learn More\n\n- [RevealUI Documentation](https://github.com/your-org/RevealUI)\n- [Next.js Documentation](https://nextjs.org/docs)\n- [Hono Documentation](https://hono.dev)\n\n## Template\n\nThis project was created using the **${projectConfig.template}** template.\n\n## License\n\nMIT\n`;\n\n await fs.writeFile(path.join(projectPath, 'README.md'), readme, 'utf-8');\n}\n","/**\n * Dependency installation\n */\n\nimport { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport ora from 'ora';\n\nconst logger = createLogger({ prefix: 'Install' });\n\nexport async function installDependencies(projectPath: string): Promise<void> {\n const spinner = ora('Installing dependencies with pnpm...').start();\n\n try {\n await execa('pnpm', ['install'], {\n cwd: projectPath,\n stdio: 'pipe',\n });\n spinner.succeed('Dependencies installed successfully');\n } catch (error) {\n spinner.fail('Failed to install dependencies');\n logger.error('Please run \"pnpm install\" manually');\n throw error;\n }\n}\n\nexport async function isPnpmInstalled(): Promise<boolean> {\n try {\n await execa('pnpm', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function checkPnpmVersion(): Promise<{ version: string; valid: boolean }> {\n try {\n const { stdout } = await execa('pnpm', ['--version']);\n const version = stdout.trim();\n const [major, minor] = version.split('.').map(Number);\n\n // Require pnpm 10.28.2 or higher\n const valid = major > 10 || (major === 10 && minor >= 28);\n\n return { version, valid };\n } catch {\n return { version: 'unknown', valid: false };\n }\n}\n","/**\n * Git utilities for project initialization\n */\n\nimport { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\n\nconst logger = createLogger({ prefix: 'Git' });\n\nexport async function initializeGitRepo(projectPath: string): Promise<void> {\n try {\n await execa('git', ['init'], { cwd: projectPath });\n logger.success('Initialized git repository');\n } catch (error) {\n logger.warn('Failed to initialize git repository');\n throw error;\n }\n}\n\nexport async function createInitialCommit(projectPath: string): Promise<void> {\n try {\n await execa('git', ['add', '.'], { cwd: projectPath });\n await execa('git', ['commit', '-m', 'Initial commit from @revealui/cli'], { cwd: projectPath });\n logger.success('Created initial commit');\n } catch (error) {\n logger.warn('Failed to create initial commit');\n throw error;\n }\n}\n\nexport async function isGitInstalled(): Promise<boolean> {\n try {\n await execa('git', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport { commandExists } from '../utils/command.js';\nimport { resolveLocalDbConfig, writeLocalDbConfigs } from '../utils/db.js';\nimport { findWorkspaceRoot } from '../utils/workspace.js';\n\nconst logger = createLogger({ prefix: 'DB' });\n\nfunction isPgCtlNotRunningError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'exitCode' in error &&\n (error as { exitCode?: unknown }).exitCode === 3\n );\n}\n\nfunction getWorkspaceRootOrThrow(): string {\n const root = findWorkspaceRoot();\n if (!root) {\n throw new Error('RevealUI workspace root not found');\n }\n return root;\n}\n\nfunction buildDbEnv(root: string): NodeJS.ProcessEnv {\n const config = resolveLocalDbConfig(root, process.env);\n return {\n ...process.env,\n PGDATA: config.pgdata,\n PGHOST: config.pghost,\n PGDATABASE: config.pgdatabase,\n PGUSER: config.pguser,\n POSTGRES_URL: config.postgresUrl,\n DATABASE_URL: config.databaseUrl,\n };\n}\n\nfunction getPgDataOrThrow(env: NodeJS.ProcessEnv): string {\n const pgdata = env.PGDATA;\n if (!pgdata) {\n throw new Error('PGDATA is not configured for the local RevealUI database');\n }\n return pgdata;\n}\n\nasync function requireCommand(command: string): Promise<void> {\n if (!(await commandExists(command))) {\n throw new Error(`${command} is not available in PATH`);\n }\n}\n\nexport async function runDbInitCommand(options: { force?: boolean } = {}): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n await requireCommand('initdb');\n\n try {\n await fs.access(pgdata);\n if (!options.force) {\n throw new Error(`PostgreSQL is already initialized at ${pgdata}. Use --force to reset it.`);\n }\n await fs.rm(pgdata, { recursive: true, force: true });\n } catch (error) {\n if (error instanceof Error && !error.message.includes('already initialized')) {\n // PGDATA does not exist yet; continue.\n } else if (error instanceof Error) {\n throw error;\n }\n }\n\n await execa(\n 'initdb',\n ['--locale=C.UTF-8', '--encoding=UTF8', '-D', pgdata, '--username=postgres'],\n {\n env,\n stdio: 'inherit',\n },\n );\n await writeLocalDbConfigs(pgdata);\n logger.success(`PostgreSQL initialized at ${pgdata}`);\n}\n\nexport async function runDbStartCommand(): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n await requireCommand('pg_ctl');\n await fs.access(pgdata);\n\n await execa(\n 'pg_ctl',\n ['start', '-D', pgdata, '-l', path.join(pgdata, 'logfile'), '-o', `-k ${pgdata}`],\n {\n env,\n stdio: 'inherit',\n },\n );\n}\n\nexport async function runDbStopCommand(): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n await requireCommand('pg_ctl');\n await execa('pg_ctl', ['stop', '-D', pgdata], {\n env,\n stdio: 'inherit',\n });\n}\n\nexport async function runDbStatusCommand(): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n await requireCommand('pg_ctl');\n try {\n await execa('pg_ctl', ['status', '-D', pgdata], {\n env,\n stdio: 'inherit',\n });\n } catch (error) {\n if (isPgCtlNotRunningError(error)) {\n logger.warn(`PostgreSQL is not running (PGDATA: ${pgdata})`);\n return;\n }\n throw error;\n }\n}\n\nexport async function runDbResetCommand(options: { force?: boolean } = {}): Promise<void> {\n if (!options.force) {\n throw new Error('db reset is destructive. Re-run with --force.');\n }\n\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n const pgdata = getPgDataOrThrow(env);\n\n if (await commandExists('pg_ctl')) {\n try {\n await execa('pg_ctl', ['stop', '-D', pgdata], { env, stdio: 'pipe' });\n } catch {\n // Ignore stop failures when server is not running.\n }\n }\n\n await fs.rm(pgdata, { recursive: true, force: true });\n await runDbInitCommand({ force: false });\n}\n\nexport async function runDbMigrateCommand(): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n const env = buildDbEnv(root);\n\n await execa('pnpm', ['--filter', '@revealui/db', 'db:migrate'], {\n cwd: root,\n env,\n stdio: 'inherit',\n });\n}\n\nexport async function runDbCleanupCommand(\n options: { dryRun?: boolean; tables?: string } = {},\n): Promise<void> {\n const root = getWorkspaceRootOrThrow();\n\n // Inherit ambient env (DATABASE_URL / POSTGRES_URL from vault/direnv),\n // not the local pg override used by other `db` subcommands.\n const env: NodeJS.ProcessEnv = { ...process.env };\n if (options.dryRun) env.DRY_RUN = 'true';\n if (options.tables) env.TABLES = options.tables;\n\n await execa('pnpm', ['--filter', '@revealui/db', 'db:cleanup'], {\n cwd: root,\n env,\n stdio: 'inherit',\n });\n}\n","import net from 'node:net';\nimport { execa } from 'execa';\n\nexport async function commandExists(command: string): Promise<boolean> {\n try {\n await execa('bash', ['-lc', `command -v ${command}`], {\n stdio: 'pipe',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function isTcpReachable(\n host: string,\n port: number,\n timeoutMs = 1500,\n): Promise<boolean> {\n return await new Promise((resolve) => {\n const socket = new net.Socket();\n\n const finalize = (value: boolean) => {\n socket.removeAllListeners();\n socket.destroy();\n resolve(value);\n };\n\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finalize(true));\n socket.once('timeout', () => finalize(false));\n socket.once('error', () => finalize(false));\n socket.connect(port, host);\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface LocalDbConfig {\n pgdata: string;\n pghost: string;\n pgdatabase: string;\n pguser: string;\n postgresUrl: string;\n databaseUrl: string;\n}\n\nexport function resolveLocalDbConfig(\n cwd = process.cwd(),\n env: NodeJS.ProcessEnv = process.env,\n): LocalDbConfig {\n const pgdata = env.PGDATA || path.join(cwd, '.pgdata');\n const pghost = env.PGHOST || pgdata;\n const pgdatabase = env.PGDATABASE || 'postgres';\n const pguser = env.PGUSER || 'postgres';\n const postgresUrl = env.POSTGRES_URL || 'postgresql://postgres@localhost:5432/postgres';\n const databaseUrl = env.DATABASE_URL || postgresUrl;\n\n return {\n pgdata,\n pghost,\n pgdatabase,\n pguser,\n postgresUrl,\n databaseUrl,\n };\n}\n\nexport function isLocalDbUrl(url?: string | null): boolean {\n if (!url) return false;\n\n try {\n const parsed = new URL(url);\n return parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\n } catch {\n return false;\n }\n}\n\nexport function detectDbTarget(url?: string | null): 'missing' | 'local' | 'remote' {\n if (!url) return 'missing';\n return isLocalDbUrl(url) ? 'local' : 'remote';\n}\n\nexport function buildPostgresConfig(pgdata: string): string {\n return `\n# RevealUI Development Settings\nlisten_addresses = 'localhost'\nport = 5432\nmax_connections = 100\nshared_buffers = 128MB\nunix_socket_directories = '${pgdata}'\n`.trimStart();\n}\n\nexport function buildPgHbaConfig(): string {\n return `\n# TYPE DATABASE USER ADDRESS METHOD\nlocal all all trust\nhost all all 127.0.0.1/32 trust\nhost all all ::1/128 trust\n`.trimStart();\n}\n\nexport async function writeLocalDbConfigs(pgdata: string): Promise<void> {\n await fs.appendFile(path.join(pgdata, 'postgresql.conf'), buildPostgresConfig(pgdata), 'utf8');\n await fs.writeFile(path.join(pgdata, 'pg_hba.conf'), buildPgHbaConfig(), 'utf8');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport function findWorkspaceRoot(startDir = process.cwd()): string | null {\n let current = path.resolve(startDir);\n\n while (true) {\n const packageJsonPath = path.join(current, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as {\n name?: string;\n private?: boolean;\n };\n if (pkg.name === 'revealui' && pkg.private === true) {\n return current;\n }\n } catch {\n // Ignore malformed package.json and keep walking upward.\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n","import { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport { formatDoctorReport, gatherDoctorReport } from '../runtime/doctor.js';\nimport { commandExists } from '../utils/command.js';\nimport { readDevConfig, writeDevConfig } from '../utils/dev-config.js';\nimport { findWorkspaceRoot } from '../utils/workspace.js';\nimport { runDbMigrateCommand, runDbStopCommand } from './db.js';\nimport { runDoctorCommand } from './doctor.js';\nimport { runShellCommand } from './shell.js';\n\nconst logger = createLogger({ prefix: 'Dev' });\n\nexport type DevService = 'mcp';\nexport type DevProfileName = 'local' | 'agent' | 'cms' | 'fullstack';\n\ninterface DevProfile {\n include?: DevService[];\n script?: string;\n}\n\nconst DEV_PROFILES: Record<DevProfileName, DevProfile> = {\n local: {},\n agent: {\n include: ['mcp'],\n },\n cms: {\n script: 'dev:cms',\n },\n fullstack: {\n include: ['mcp'],\n script: 'dev',\n },\n};\n\nexport interface DevUpOptions {\n ensure?: boolean;\n json?: boolean;\n dryRun?: boolean;\n fix?: boolean;\n script?: string;\n include?: string[];\n profile?: DevProfileName;\n inside?: boolean;\n}\n\nexport interface DevPlan {\n profile: DevProfileName | 'custom';\n ensure: boolean;\n include: DevService[];\n script?: string;\n dryRun: boolean;\n}\n\nfunction getConfiguredProfile(): DevProfileName | undefined {\n const configured = readDevConfig().defaultProfile;\n if (configured && configured in DEV_PROFILES) {\n return configured as DevProfileName;\n }\n\n return undefined;\n}\n\nexport function resolveDevUpOptions(options: DevUpOptions = {}): Required<\n Pick<DevUpOptions, 'ensure' | 'json' | 'inside'>\n> & {\n profile?: DevProfileName;\n script?: string;\n include: DevService[];\n} {\n const selectedProfile = options.profile ?? getConfiguredProfile();\n const profile = selectedProfile ? DEV_PROFILES[selectedProfile] : undefined;\n if (selectedProfile && !profile) {\n throw new Error(\n `Unknown dev profile \"${selectedProfile}\". Use one of: ${Object.keys(DEV_PROFILES).join(', ')}`,\n );\n }\n\n const include = Array.from(\n new Set([...(profile?.include ?? []), ...((options.include ?? []) as DevService[])]),\n );\n\n return {\n ensure: options.ensure ?? true,\n json: options.json ?? false,\n inside: options.inside ?? false,\n profile: selectedProfile,\n script: options.script ?? profile?.script,\n include,\n };\n}\n\nexport function getDevPlan(options: DevUpOptions = {}): DevPlan {\n const resolved = resolveDevUpOptions(options);\n return {\n profile: resolved.profile ?? (options.include?.length || options.script ? 'custom' : 'local'),\n ensure: resolved.ensure,\n include: resolved.include,\n script: resolved.script,\n dryRun: options.dryRun ?? false,\n };\n}\n\nexport function formatDevPlan(plan: DevPlan): string {\n const lines = ['', 'RevealUI Dev Plan', ''];\n lines.push(`profile ${plan.profile}`);\n lines.push(`ensure ${plan.ensure ? 'yes' : 'no'}`);\n lines.push(`dry-run ${plan.dryRun ? 'yes' : 'no'}`);\n lines.push(`include ${plan.include.length > 0 ? plan.include.join(', ') : 'none'}`);\n lines.push(`script ${plan.script ?? 'none'}`);\n return lines.join('\\n');\n}\n\nexport function getDevActions(plan: DevPlan): string[] {\n const actions: string[] = [];\n\n if (plan.ensure) {\n actions.push('ensure local shell and database prerequisites');\n } else {\n actions.push('skip automatic shell/database ensure');\n }\n\n actions.push('run database migrations');\n\n if (shouldIncludeMcp(plan.include)) {\n actions.push('validate MCP credentials via `pnpm setup:mcp`');\n }\n\n if (plan.script) {\n actions.push(`start pnpm script \\`${plan.script}\\``);\n }\n\n return actions;\n}\n\nexport function formatDevActions(plan: DevPlan): string {\n const actions = getDevActions(plan);\n const lines = ['', 'RevealUI Dev Actions', ''];\n for (const action of actions) {\n lines.push(`- ${action}`);\n }\n return lines.join('\\n');\n}\n\nfunction shouldIncludeMcp(include: DevService[]): boolean {\n return include.includes('mcp');\n}\n\nexport async function runDevUpCommand(options: DevUpOptions = {}): Promise<void> {\n const resolved = resolveDevUpOptions(options);\n const plan = getDevPlan(options);\n const forwardArgs: string[] = [];\n\n if (options.dryRun) {\n forwardArgs.push('--dry-run');\n }\n if (options.fix) {\n forwardArgs.push('--fix');\n }\n if (options.profile) {\n forwardArgs.push('--profile', options.profile);\n }\n for (const service of options.include ?? []) {\n forwardArgs.push('--include', service);\n }\n if (options.script) {\n forwardArgs.push('--script', options.script);\n }\n if (options.ensure === false) {\n forwardArgs.push('--no-ensure');\n }\n\n const reentered = await runShellCommand({\n ensure: resolved.ensure,\n json: resolved.json,\n inside: resolved.inside,\n forwardArgs,\n });\n if (reentered) {\n return;\n }\n\n if (resolved.json) {\n return;\n }\n\n process.stdout.write(`${formatDevPlan(plan)}\\n`);\n process.stdout.write(`${formatDevActions(plan)}\\n`);\n\n if (plan.dryRun) {\n logger.info('Dry run only; no migrations or services were started.');\n return;\n }\n\n if (options.fix) {\n await runDoctorCommand({ fix: true });\n }\n\n await runDbMigrateCommand();\n logger.success('Database migration complete');\n\n if (shouldIncludeMcp(resolved.include)) {\n const workspaceRoot = findWorkspaceRoot();\n if (!workspaceRoot) {\n throw new Error('RevealUI workspace root not found');\n }\n\n logger.info('Validating MCP setup');\n await execa('pnpm', ['setup:mcp'], {\n cwd: workspaceRoot,\n stdio: 'inherit',\n });\n }\n\n if (resolved.script) {\n const workspaceRoot = findWorkspaceRoot();\n if (!workspaceRoot) {\n throw new Error('RevealUI workspace root not found');\n }\n\n logger.info(`Starting dev script: ${resolved.script}`);\n await execa('pnpm', [resolved.script], {\n cwd: workspaceRoot,\n stdio: 'inherit',\n });\n }\n}\n\nexport async function runDevStatusCommand(options: DevUpOptions = {}): Promise<void> {\n const plan = getDevPlan(options);\n const forwardArgs: string[] = [];\n\n if (options.profile) {\n forwardArgs.push('--profile', options.profile);\n }\n for (const service of options.include ?? []) {\n forwardArgs.push('--include', service);\n }\n if (options.script) {\n forwardArgs.push('--script', options.script);\n }\n if (options.ensure === false) {\n forwardArgs.push('--no-ensure');\n }\n\n if (!(options.inside || process.env.IN_NIX_SHELL) && (await commandExists('nix'))) {\n const reentered = await runShellCommand({\n ensure: false,\n json: options.json,\n inside: options.inside,\n forwardArgs,\n });\n if (reentered) {\n return;\n }\n }\n\n const report = await gatherDoctorReport();\n\n if (options.json) {\n process.stdout.write(\n `${JSON.stringify({ report, plan, actions: getDevActions(plan) }, null, 2)}\\n`,\n );\n return;\n }\n\n process.stdout.write(`${formatDoctorReport(report)}\\n`);\n process.stdout.write(`${formatDevPlan(plan)}\\n`);\n process.stdout.write(`${formatDevActions(plan)}\\n`);\n}\n\nexport async function runDevDownCommand(): Promise<void> {\n await runDbStopCommand();\n}\n\nexport async function runDevProfileSetCommand(profile: DevProfileName): Promise<void> {\n if (!(profile in DEV_PROFILES)) {\n throw new Error(\n `Unknown dev profile \"${profile}\". Use one of: ${Object.keys(DEV_PROFILES).join(', ')}`,\n );\n }\n\n const configPath = writeDevConfig({ defaultProfile: profile });\n logger.success(`Default dev profile set to \"${profile}\" in ${configPath}`);\n}\n\nexport async function runDevProfileShowCommand(options: { json?: boolean } = {}): Promise<void> {\n const configuredProfile = getConfiguredProfile() ?? null;\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify({ defaultProfile: configuredProfile }, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`Default dev profile: ${configuredProfile ?? 'not set'}\\n`);\n}\n","import { commandExists, isTcpReachable } from '../utils/command.js';\nimport { detectDbTarget, resolveLocalDbConfig } from '../utils/db.js';\nimport { findWorkspaceRoot } from '../utils/workspace.js';\nimport { validateNodeVersion } from '../validators/node-version.js';\n\nexport interface DoctorCheck {\n id: string;\n ok: boolean;\n detail: string;\n}\n\nexport interface DoctorReport {\n workspaceRoot: string | null;\n dbTarget: 'missing' | 'local' | 'remote';\n checks: DoctorCheck[];\n}\n\nfunction getMcpDetail(env: NodeJS.ProcessEnv): { ok: boolean; detail: string } {\n const configuredKeys = [\n env.VERCEL_API_KEY ? 'vercel' : null,\n env.STRIPE_SECRET_KEY ? 'stripe' : null,\n ].filter((value): value is string => value !== null);\n\n if (configuredKeys.length === 0) {\n return {\n ok: false,\n detail: 'mcp credentials missing (set VERCEL_API_KEY and/or STRIPE_SECRET_KEY)',\n };\n }\n\n return {\n ok: true,\n detail: `mcp credentials configured for ${configuredKeys.join(', ')}`,\n };\n}\n\nexport async function gatherDoctorReport(\n cwd = process.cwd(),\n env: NodeJS.ProcessEnv = process.env,\n): Promise<DoctorReport> {\n const workspaceRoot = findWorkspaceRoot(cwd);\n const dbConfig = resolveLocalDbConfig(workspaceRoot ?? cwd, env);\n const dbTarget = detectDbTarget(env.POSTGRES_URL || env.DATABASE_URL);\n\n const nodeOk = validateNodeVersion();\n const pnpmOk = await commandExists('pnpm');\n const nixOk = await commandExists('nix');\n const direnvActive = Boolean(env.DIRENV_FILE || env.DIRENV_DIR);\n const pgCtlOk = await commandExists('pg_ctl');\n const initdbOk = await commandExists('initdb');\n const dockerOk = await commandExists('docker');\n const postgresReachable =\n dbTarget === 'local' ? await isTcpReachable('127.0.0.1', 5432, 1000) : false;\n const mcp = getMcpDetail(env);\n\n return {\n workspaceRoot,\n dbTarget,\n checks: [\n {\n id: 'workspace',\n ok: workspaceRoot !== null,\n detail: workspaceRoot ?? 'RevealUI workspace root not found',\n },\n {\n id: 'node',\n ok: nodeOk,\n detail: process.version,\n },\n {\n id: 'pnpm',\n ok: pnpmOk,\n detail: pnpmOk ? 'pnpm available' : 'pnpm not found',\n },\n {\n id: 'nix',\n ok: nixOk,\n detail: nixOk ? 'nix available' : 'nix not found',\n },\n {\n id: 'direnv',\n ok: direnvActive,\n detail: direnvActive ? 'direnv active' : 'direnv not active',\n },\n {\n id: 'db-target',\n ok: dbTarget !== 'missing',\n detail:\n dbTarget === 'missing'\n ? 'No POSTGRES_URL or DATABASE_URL configured'\n : `${dbTarget} database target (${dbConfig.postgresUrl})`,\n },\n {\n id: 'pg_ctl',\n ok: pgCtlOk,\n detail: pgCtlOk ? 'pg_ctl available' : 'pg_ctl not found',\n },\n {\n id: 'initdb',\n ok: initdbOk,\n detail: initdbOk ? 'initdb available' : 'initdb not found',\n },\n {\n id: 'postgres',\n ok: dbTarget === 'local' ? postgresReachable : true,\n detail:\n dbTarget === 'local'\n ? postgresReachable\n ? 'local postgres reachable on 127.0.0.1:5432'\n : 'local postgres not reachable on 127.0.0.1:5432'\n : 'postgres reachability skipped for non-local target',\n },\n {\n id: 'docker',\n ok: dockerOk,\n detail: dockerOk ? 'docker available' : 'docker not found',\n },\n {\n id: 'mcp',\n ok: mcp.ok,\n detail: mcp.detail,\n },\n ],\n };\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n const lines = ['', `RevealUI · ${report.workspaceRoot ?? 'workspace not found'}`, ''];\n\n for (const check of report.checks) {\n lines.push(`${check.ok ? 'OK' : 'NO'} ${check.id.padEnd(10)} ${check.detail}`);\n }\n\n return lines.join('\\n');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { findWorkspaceRoot } from './workspace.js';\n\nexport interface DevConfig {\n defaultProfile?: string;\n}\n\nexport function getDevConfigPath(startDir = process.cwd()): string | null {\n const workspaceRoot = findWorkspaceRoot(startDir);\n if (!workspaceRoot) {\n return null;\n }\n\n return path.join(workspaceRoot, '.revealui', 'dev.json');\n}\n\nexport function readDevConfig(startDir = process.cwd()): DevConfig {\n const configPath = getDevConfigPath(startDir);\n if (!(configPath && fs.existsSync(configPath))) {\n return {};\n }\n\n try {\n return JSON.parse(fs.readFileSync(configPath, 'utf8')) as DevConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeDevConfig(config: DevConfig, startDir = process.cwd()): string {\n const configPath = getDevConfigPath(startDir);\n if (!configPath) {\n throw new Error('RevealUI workspace root not found');\n }\n\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n fs.writeFileSync(`${configPath}`, `${JSON.stringify(config, null, 2)}\\n`, 'utf8');\n return configPath;\n}\n","import { createLogger } from '@revealui/setup/utils';\nimport { formatDoctorReport, gatherDoctorReport } from '../runtime/doctor.js';\nimport { runDbInitCommand, runDbStartCommand } from './db.js';\n\nconst logger = createLogger({ prefix: 'Doctor' });\n\nexport interface DoctorFixResult {\n attempted: string[];\n skipped: string[];\n}\n\nexport function getDoctorFixPlan(\n report: Awaited<ReturnType<typeof gatherDoctorReport>>,\n): DoctorFixResult {\n const attempted: string[] = [];\n const skipped: string[] = [];\n\n const postgresCheck = report.checks.find((check) => check.id === 'postgres');\n const initdbCheck = report.checks.find((check) => check.id === 'initdb');\n const pgCtlCheck = report.checks.find((check) => check.id === 'pg_ctl');\n const mcpCheck = report.checks.find((check) => check.id === 'mcp');\n\n if (report.dbTarget === 'local' && postgresCheck && !postgresCheck.ok) {\n if (initdbCheck?.ok && pgCtlCheck?.ok) {\n attempted.push('initialize/start local postgres');\n } else {\n skipped.push('local postgres repair requires both initdb and pg_ctl in PATH');\n }\n }\n\n if (mcpCheck && !mcpCheck.ok) {\n skipped.push('MCP readiness requires credentials and cannot be auto-fixed safely');\n }\n\n if (attempted.length === 0 && skipped.length === 0) {\n skipped.push('no safe automatic fixes available');\n }\n\n return { attempted, skipped };\n}\n\nasync function applyDoctorFixes(\n report: Awaited<ReturnType<typeof gatherDoctorReport>>,\n): Promise<DoctorFixResult> {\n const plan = getDoctorFixPlan(report);\n\n if (plan.attempted.includes('initialize/start local postgres')) {\n try {\n await runDbInitCommand();\n } catch {\n // Ignore \"already initialized\" and other init conflicts; start may still succeed.\n }\n await runDbStartCommand();\n }\n\n return plan;\n}\n\nfunction formatDoctorFixPlan(plan: DoctorFixResult): string {\n const lines = ['', 'RevealUI Doctor Fix Plan', ''];\n for (const action of plan.attempted) {\n lines.push(`fix ${action}`);\n }\n for (const action of plan.skipped) {\n lines.push(`skip ${action}`);\n }\n return lines.join('\\n');\n}\n\nexport async function runDoctorCommand(\n options: { json?: boolean; fix?: boolean; strict?: boolean } = {},\n): Promise<void> {\n let report = await gatherDoctorReport();\n const fixPlan = getDoctorFixPlan(report);\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify({ report, fixPlan }, null, 2)}\\n`);\n return;\n }\n\n process.stdout.write(`${formatDoctorReport(report)}\\n`);\n process.stdout.write(`${formatDoctorFixPlan(fixPlan)}\\n`);\n\n if (options.fix) {\n if (fixPlan.attempted.length === 0) {\n logger.warn('No safe automatic fixes available');\n } else {\n await applyDoctorFixes(report);\n report = await gatherDoctorReport();\n process.stdout.write(`${formatDoctorReport(report)}\\n`);\n }\n }\n\n if (report.checks.some((check) => !check.ok)) {\n logger.warn('Some checks failed');\n if (options.strict || options.json || process.env.CI) {\n process.exitCode = 1;\n }\n }\n}\n","import { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport { formatDoctorReport, gatherDoctorReport } from '../runtime/doctor.js';\nimport { commandExists } from '../utils/command.js';\nimport { findWorkspaceRoot } from '../utils/workspace.js';\nimport { runDbInitCommand, runDbStartCommand } from './db.js';\n\nconst logger = createLogger({ prefix: 'Shell' });\n\nexport async function runShellCommand(\n options: { ensure?: boolean; json?: boolean; inside?: boolean; forwardArgs?: string[] } = {},\n): Promise<boolean> {\n if (!(options.inside || process.env.IN_NIX_SHELL) && (await commandExists('nix'))) {\n const workspaceRoot = findWorkspaceRoot();\n\n if (workspaceRoot) {\n const reentryArgs = options.ensure ? ['dev', 'up'] : ['dev', 'status'];\n await execa(\n 'nix',\n [\n 'develop',\n '-c',\n 'node',\n 'packages/cli/bin/revealui.js',\n ...reentryArgs,\n ...(options.forwardArgs ?? []),\n '--inside',\n ...(options.json ? ['--json'] : []),\n ],\n {\n cwd: workspaceRoot,\n stdio: 'inherit',\n },\n );\n return true;\n }\n }\n\n const report = await gatherDoctorReport();\n\n if (options.ensure && report.dbTarget === 'local' && (await commandExists('pg_ctl'))) {\n const postgresCheck = report.checks.find((check) => check.id === 'postgres');\n if (postgresCheck && !postgresCheck.ok) {\n try {\n await runDbInitCommand();\n } catch {\n // Ignore if already initialized.\n }\n await runDbStartCommand();\n }\n }\n\n const freshReport = await gatherDoctorReport();\n if (options.json) {\n process.stdout.write(`${JSON.stringify(freshReport, null, 2)}\\n`);\n return false;\n }\n\n process.stdout.write(`${formatDoctorReport(freshReport)}\\n`);\n logger.info('Use `revealui doctor --json` for machine-readable status.');\n return false;\n}\n"],"mappings":"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","names":["createLogger","createLogger","postgresUrl","inquirer","inquirer","inquirer","inquirer","inquirer","inquirer","createLogger","logger","fs","path","createLogger","ora","fs","path","fs","path","fs","path","createLogger","logger","createLogger","execa","logger","logger","createLogger","__filename","__dirname","path","fs","ora","logger","createLogger","fs","path","createLogger","execa","execa","fs","path","fs","path","logger","createLogger","fs","execa","path","createLogger","execa","fs","path","path","fs","createLogger","logger","createLogger","createLogger","execa","logger","createLogger","execa","logger","createLogger","execa","logger","createLogger"]}
package/dist/index.js CHANGED
@@ -363,6 +363,7 @@ function validateNodeVersion() {
363
363
 
364
364
  // src/commands/create.ts
365
365
  import crypto from "crypto";
366
+ import { existsSync } from "fs";
366
367
  import fs5 from "fs/promises";
367
368
  import path5 from "path";
368
369
  import { fileURLToPath } from "url";
@@ -704,7 +705,7 @@ async function isGitInstalled() {
704
705
  var logger5 = createLogger5({ prefix: "Create" });
705
706
  var __filename2 = fileURLToPath(import.meta.url);
706
707
  var __dirname2 = path5.dirname(__filename2);
707
- var TEMPLATES_DIR = path5.resolve(__dirname2, "../../templates");
708
+ var TEMPLATES_DIR = existsSync(path5.resolve(__dirname2, "../../templates")) ? path5.resolve(__dirname2, "../../templates") : path5.resolve(__dirname2, "../templates");
708
709
  function buildEnvLocal(cfg) {
709
710
  const lines = [
710
711
  "# Generated by @revealui/cli \u2014 fill in the remaining placeholders before running `pnpm dev`",