@revealui/cli 0.3.3 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -112
- package/dist/cli.js +1432 -469
- package/dist/cli.js.map +1 -1
- package/dist/index.js +1432 -469
- package/dist/index.js.map +1 -1
- package/package.json +16 -9
- package/templates/basic-blog/next.config.mjs +1 -3
- package/templates/basic-blog/package.json +1 -1
- package/templates/e-commerce/next.config.mjs +1 -3
- package/templates/e-commerce/package.json +1 -1
- package/templates/portfolio/next.config.mjs +1 -3
- package/templates/portfolio/package.json +1 -1
- package/templates/starter/next.config.mjs +1 -3
- package/templates/starter/package.json +1 -1
package/dist/index.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","../src/index.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","#!/usr/bin/env node\n\n/**\n * @revealui/cli - Main orchestrator\n */\n\nimport { createCli } from './cli.js';\n\n// If running as main module\nif (import.meta.url === `file://${process.argv[1]}`) {\n const cli = createCli();\n cli.parse(process.argv);\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/agent.ts","../src/commands/auth.ts","../src/utils/command.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/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","../src/commands/terminal.ts","../src/index.ts"],"sourcesContent":["/**\n * CLI definition using Commander.js\n */\n\nimport { createLogger } from '@revealui/setup/utils';\nimport { Command } from 'commander';\nimport {\n runAgentHeadlessCommand,\n runAgentReplCommand,\n runAgentStatusCommand,\n} from './commands/agent.js';\nimport {\n runAuthSetTokenCommand,\n runAuthStatusCommand,\n runAuthVerifyCommand,\n} from './commands/auth.js';\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';\nimport { runTerminalInstallCommand, runTerminalListCommand } from './commands/terminal.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 agent = program\n .command('agent')\n .description('RevealUI coding agent (powered by local or cloud LLMs)');\n\n agent\n .option('-p, --prompt <text>', 'Run a single prompt in headless mode')\n .action(async (options: { prompt?: string }) => {\n if (options.prompt) {\n await runAgentHeadlessCommand(options.prompt);\n } else {\n await runAgentReplCommand();\n }\n });\n\n agent\n .command('status')\n .description('Show agent status: model, provider, project root')\n .action(async () => {\n await runAgentStatusCommand();\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 const auth = program\n .command('auth')\n .description('Manage npm registry authentication and publish tokens');\n\n auth\n .command('status')\n .description('Show current npm authentication state')\n .option('--json', 'Output machine-readable JSON', false)\n .action(async (options: { json?: boolean }) => {\n await runAuthStatusCommand(options);\n });\n\n auth\n .command('set-token')\n .description('Store an npm token via RevVault and configure .npmrc')\n .option('--token <value>', 'npm token (or set NPM_TOKEN env var)')\n .option('--skip-vault', 'Skip RevVault storage', false)\n .option('--skip-npmrc', 'Skip .npmrc modification', false)\n .action(async (options: { token?: string; skipVault?: boolean; skipNpmrc?: boolean }) => {\n await runAuthSetTokenCommand(options);\n });\n\n auth\n .command('verify')\n .description('Verify the full npm auth chain (env → RevVault → .npmrc → registry)')\n .option('--json', 'Output machine-readable JSON', false)\n .action(async (options: { json?: boolean }) => {\n await runAuthVerifyCommand(options);\n });\n\n const terminal = program\n .command('terminal')\n .description('Install RevealUI terminal profiles for your terminal emulator');\n\n terminal\n .command('install')\n .description('Detect and install terminal profiles for supported emulators')\n .option('--terminal <name>', 'Install for a specific terminal (e.g. iTerm2, Alacritty, Kitty)')\n .option('--force', 'Overwrite existing profile files', false)\n .option('--json', 'Output machine-readable JSON', false)\n .action(async (options: { terminal?: string; force?: boolean; json?: boolean }) => {\n await runTerminalInstallCommand(options);\n });\n\n terminal\n .command('list')\n .description('List available terminal profiles and detected emulators')\n .option('--json', 'Output machine-readable JSON', false)\n .action(async (options: { json?: boolean }) => {\n await runTerminalListCommand(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","/**\n * `revealui agent` — RevealUI's standalone coding agent\n *\n * Modes:\n * revealui agent — Interactive REPL\n * revealui agent --prompt \"…\" — Headless single-shot\n * revealui agent status — Show model, provider, loaded skills\n *\n * Uses @revealui/ai (Pro) and @revealui/harnesses (Pro) via lazy imports.\n * Falls back gracefully if Pro packages are not installed.\n */\n\nimport { createInterface } from 'node:readline';\nimport { createLogger } from '@revealui/setup/utils';\n\nconst logger = createLogger({ prefix: 'agent' });\n\n// ---------------------------------------------------------------------------\n// Status command\n// ---------------------------------------------------------------------------\n\nexport async function runAgentStatusCommand(): Promise<void> {\n const { available, provider, model, projectRoot } = await detectProvider();\n logger.info(`Provider: ${provider}`);\n logger.info(`Model: ${model}`);\n logger.info(`Project root: ${projectRoot}`);\n logger.info(`Available: ${available ? 'yes' : 'no'}`);\n\n if (!available) {\n logger.warn('No LLM provider detected. Start BitNet, Ollama, or set GROQ_API_KEY.');\n }\n}\n\n// ---------------------------------------------------------------------------\n// Headless prompt\n// ---------------------------------------------------------------------------\n\nexport async function runAgentHeadlessCommand(prompt: string): Promise<void> {\n const deps = await loadProDeps();\n if (!deps) return;\n\n const { StreamingAgentRuntime, createLLMClientFromEnv, createCodingTools } = deps;\n const projectRoot = process.cwd();\n\n const tools = createCodingTools({ projectRoot });\n const llmClient = createLLMClientFromEnv();\n\n const agent = {\n id: 'revealui-coding-agent',\n name: 'RevealUI Coding Agent',\n instructions: buildMinimalInstructions(),\n tools,\n config: {},\n getContext: () => ({ projectRoot, workingDirectory: projectRoot }),\n };\n\n const task = {\n id: `task-${Date.now()}`,\n type: 'headless-prompt',\n description: prompt,\n };\n\n const runtime = new StreamingAgentRuntime({\n maxIterations: 10,\n timeout: 120_000,\n });\n\n try {\n for await (const chunk of runtime.streamTask(agent, task, llmClient)) {\n switch (chunk.type) {\n case 'text':\n if (chunk.content) process.stdout.write(chunk.content);\n break;\n case 'tool_call_start':\n if (chunk.toolCall) {\n process.stderr.write(`\\n[tool] ${chunk.toolCall.name}\\n`);\n }\n break;\n case 'tool_call_result':\n if (chunk.toolResult?.content) {\n process.stderr.write(` → ${chunk.toolResult.content}\\n`);\n }\n break;\n case 'error':\n process.stderr.write(`\\n[error] ${chunk.error}\\n`);\n break;\n case 'done':\n process.stdout.write('\\n');\n break;\n }\n }\n } finally {\n await runtime.cleanup();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Interactive REPL\n// ---------------------------------------------------------------------------\n\nexport async function runAgentReplCommand(): Promise<void> {\n const deps = await loadProDeps();\n if (!deps) return;\n\n const { StreamingAgentRuntime, createLLMClientFromEnv, createCodingTools } = deps;\n const projectRoot = process.cwd();\n\n const tools = createCodingTools({ projectRoot });\n const llmClient = createLLMClientFromEnv();\n\n const agent = {\n id: 'revealui-coding-agent',\n name: 'RevealUI Coding Agent',\n instructions: buildMinimalInstructions(),\n tools,\n config: {},\n getContext: () => ({ projectRoot, workingDirectory: projectRoot }),\n };\n\n logger.info('RevealUI Agent (type \"exit\" or Ctrl+C to quit)');\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: '\\n> ',\n });\n\n rl.prompt();\n\n rl.on('line', async (line) => {\n const input = line.trim();\n if (!input) {\n rl.prompt();\n return;\n }\n if (input === 'exit' || input === 'quit') {\n rl.close();\n return;\n }\n\n const task = {\n id: `task-${Date.now()}`,\n type: 'repl-prompt',\n description: input,\n };\n\n const runtime = new StreamingAgentRuntime({\n maxIterations: 10,\n timeout: 120_000,\n });\n\n try {\n for await (const chunk of runtime.streamTask(agent, task, llmClient)) {\n switch (chunk.type) {\n case 'text':\n if (chunk.content) process.stdout.write(chunk.content);\n break;\n case 'tool_call_start':\n if (chunk.toolCall) {\n process.stderr.write(`\\n [tool] ${chunk.toolCall.name}\\n`);\n }\n break;\n case 'tool_call_result':\n if (chunk.toolResult?.content) {\n process.stderr.write(` → ${chunk.toolResult.content}\\n`);\n }\n break;\n case 'error':\n process.stderr.write(`\\n [error] ${chunk.error}\\n`);\n break;\n case 'done':\n break;\n }\n }\n } catch (err) {\n logger.error(err instanceof Error ? err.message : String(err));\n } finally {\n await runtime.cleanup();\n }\n\n rl.prompt();\n });\n\n rl.on('close', () => {\n process.exit(0);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface ProDeps {\n StreamingAgentRuntime: new (config: {\n maxIterations?: number;\n timeout?: number;\n }) => {\n streamTask: (\n agent: unknown,\n task: unknown,\n llmClient: unknown,\n ) => AsyncGenerator<{\n type: string;\n content?: string;\n toolCall?: { name: string; arguments: string };\n toolResult?: { content?: string; success: boolean };\n error?: string;\n }>;\n cleanup: () => Promise<void>;\n };\n createLLMClientFromEnv: () => unknown;\n createCodingTools: (config: { projectRoot: string }) => unknown[];\n}\n\nasync function loadProDeps(): Promise<ProDeps | null> {\n // Dynamic import paths stored in variables so TypeScript doesn't try to\n // resolve module types at compile time — @revealui/ai is an optional peer.\n const aiRuntimePath = '@revealui/ai/orchestration/streaming-runtime';\n const aiClientPath = '@revealui/ai/llm/client';\n const aiToolsPath = '@revealui/ai/tools/coding';\n\n try {\n const [runtimeMod, clientMod, toolsMod] = (await Promise.all([\n import(aiRuntimePath),\n import(aiClientPath),\n import(aiToolsPath),\n ])) as [Record<string, unknown>, Record<string, unknown>, Record<string, unknown>];\n\n return {\n StreamingAgentRuntime: runtimeMod.StreamingAgentRuntime as ProDeps['StreamingAgentRuntime'],\n createLLMClientFromEnv: clientMod.createLLMClientFromEnv as ProDeps['createLLMClientFromEnv'],\n createCodingTools: toolsMod.createCodingTools as ProDeps['createCodingTools'],\n };\n } catch {\n logger.error(\n 'Pro packages not found. Install @revealui/ai to use the agent.\\n' +\n ' npm install @revealui/ai',\n );\n return null;\n }\n}\n\nasync function detectProvider(): Promise<{\n available: boolean;\n provider: string;\n model: string;\n projectRoot: string;\n}> {\n const projectRoot = process.cwd();\n\n if (process.env.BITNET_BASE_URL) {\n try {\n const res = await fetch(`${process.env.BITNET_BASE_URL}/v1/models`, {\n signal: AbortSignal.timeout(2000),\n });\n if (res.ok) {\n return { available: true, provider: 'bitnet', model: 'bitnet-b1.58-2B-4T', projectRoot };\n }\n } catch {\n // not running\n }\n }\n\n const ollamaUrl = process.env.OLLAMA_BASE_URL ?? 'http://localhost:11434';\n try {\n const res = await fetch(`${ollamaUrl}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n if (res.ok) {\n return { available: true, provider: 'ollama', model: 'llama3.2:3b', projectRoot };\n }\n } catch {\n // not running\n }\n\n if (process.env.GROQ_API_KEY) {\n return { available: true, provider: 'groq', model: 'llama-3.3-70b-versatile', projectRoot };\n }\n\n return { available: false, provider: 'none', model: 'none', projectRoot };\n}\n\nfunction buildMinimalInstructions(): string {\n return [\n 'You are the RevealUI coding agent. You help with software development tasks in this project.',\n 'Use the available tools to read, write, edit, search, and execute commands.',\n 'Always read files before modifying them. Prefer surgical edits over full rewrites.',\n 'Follow project conventions discovered via the project_context tool.',\n 'Be concise and direct. Show your work through tool usage, not verbose explanations.',\n ].join('\\n');\n}\n","/**\n * Auth commands — manage npm tokens and registry authentication\n *\n * Subcommands:\n * revealui auth status Show current npm auth state\n * revealui auth set-token Store an npm token via RevVault + .npmrc\n * revealui auth verify Verify the current token can publish\n */\n\nimport fs from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { createLogger } from '@revealui/setup/utils';\nimport { execa } from 'execa';\nimport { commandExists } from '../utils/command.js';\n\nconst logger = createLogger({ prefix: 'Auth' });\n\nconst REVVAULT_NPM_PATH = 'revealui/env/npm';\n\n// The literal string npm uses for token interpolation in .npmrc files.\n// Constructed to avoid Biome's noTemplateCurlyInString lint rule.\nconst NPM_TOKEN_INTERPOLATION = '$' + '{NPM_TOKEN}';\nconst NPMRC_AUTH_LINE = `//registry.npmjs.org/:_authToken=${NPM_TOKEN_INTERPOLATION}`;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction write(text: string): void {\n process.stdout.write(text);\n}\n\nfunction writeJson(data: unknown): void {\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n}\n\ninterface NpmrcPaths {\n user: string;\n project: string | null;\n}\n\nfunction getNpmrcPaths(): NpmrcPaths {\n const user = path.join(os.homedir(), '.npmrc');\n // Walk up from cwd looking for a project .npmrc\n let dir = process.cwd();\n let project: string | null = null;\n for (let i = 0; i < 10; i++) {\n const candidate = path.join(dir, '.npmrc');\n if (dir !== os.homedir()) {\n // We'll check existence later; just record the first project-level candidate\n project ??= candidate;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return { user, project };\n}\n\nasync function fileContains(filePath: string, needle: string): Promise<boolean> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return content.includes(needle);\n } catch {\n return false;\n }\n}\n\nasync function getTokenFromEnv(): Promise<string | undefined> {\n return process.env.NPM_TOKEN || undefined;\n}\n\nasync function getTokenFromNpmrc(): Promise<string | undefined> {\n const userRc = path.join(os.homedir(), '.npmrc');\n try {\n const content = await fs.readFile(userRc, 'utf-8');\n const match = content.match(/\\/\\/registry\\.npmjs\\.org\\/:_authToken=(.+)/);\n return match?.[1]?.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction maskToken(token: string): string {\n if (token.length <= 8) return '***';\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n}\n\nasync function hasRevvault(): Promise<boolean> {\n return commandExists('revvault');\n}\n\nasync function revvaultGet(secretPath: string): Promise<string | undefined> {\n try {\n const { stdout } = await execa('revvault', ['get', secretPath], {\n stdio: 'pipe',\n });\n return stdout.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function revvaultSet(secretPath: string, value: string): Promise<boolean> {\n try {\n await execa('revvault', ['set', secretPath], {\n input: value,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// revealui auth status\n// ---------------------------------------------------------------------------\n\nexport async function runAuthStatusCommand(options: { json?: boolean }): Promise<void> {\n const envToken = await getTokenFromEnv();\n const npmrcToken = await getTokenFromNpmrc();\n const hasVault = await hasRevvault();\n const vaultValue = hasVault ? await revvaultGet(REVVAULT_NPM_PATH) : undefined;\n const paths = getNpmrcPaths();\n\n // Check if project .npmrc uses token interpolation\n const projectUsesEnvVar = paths.project\n ? await fileContains(paths.project, NPM_TOKEN_INTERPOLATION)\n : false;\n\n // Determine effective token\n const effectiveToken = envToken || npmrcToken;\n\n // Check npm whoami\n let npmUser: string | undefined;\n try {\n const { stdout } = await execa('npm', ['whoami'], { stdio: 'pipe' });\n npmUser = stdout.trim();\n } catch {\n npmUser = undefined;\n }\n\n if (options.json) {\n writeJson({\n authenticated: !!npmUser,\n user: npmUser ?? null,\n tokenSource: envToken ? 'env' : npmrcToken ? 'npmrc' : null,\n tokenMasked: effectiveToken ? maskToken(effectiveToken) : null,\n revvaultConfigured: !!vaultValue,\n projectNpmrcUsesEnvVar: projectUsesEnvVar,\n paths: {\n userNpmrc: paths.user,\n projectNpmrc: paths.project,\n },\n });\n return;\n }\n\n logger.header('npm Authentication Status');\n\n if (npmUser) {\n logger.success(`Authenticated as: ${npmUser}`);\n } else {\n logger.error('Not authenticated — npm whoami failed');\n }\n\n write('\\n');\n logger.info(\n `Token source: ${envToken ? '$NPM_TOKEN (env)' : npmrcToken ? '~/.npmrc (file)' : 'none'}`,\n );\n\n if (effectiveToken) {\n logger.info(`Token: ${maskToken(effectiveToken)}`);\n }\n\n write('\\n');\n logger.info(\n `RevVault (${REVVAULT_NPM_PATH}): ${vaultValue ? 'configured' : hasVault ? 'not set' : 'revvault not installed'}`,\n );\n logger.info(`Project .npmrc uses NPM_TOKEN: ${projectUsesEnvVar ? 'yes' : 'no'}`);\n\n if (!projectUsesEnvVar && paths.project) {\n logger.warn(\n \"Project .npmrc does not reference NPM_TOKEN — direnv/RevVault tokens won't be used for publishing\",\n );\n }\n\n if (!vaultValue && hasVault && effectiveToken) {\n logger.warn('Token is not stored in RevVault. Run: revealui auth set-token to persist it.');\n }\n}\n\n// ---------------------------------------------------------------------------\n// revealui auth set-token\n// ---------------------------------------------------------------------------\n\nexport async function runAuthSetTokenCommand(options: {\n token?: string;\n skipVault?: boolean;\n skipNpmrc?: boolean;\n}): Promise<void> {\n logger.header('Set npm Publish Token');\n\n const token = options.token || process.env.NPM_TOKEN;\n\n if (!token) {\n logger.error('No token provided. Pass --token <value> or set NPM_TOKEN in your environment.');\n logger.info('Create a Granular Access Token at: https://www.npmjs.com/settings/<user>/tokens');\n logger.info(' Type: Granular Access Token');\n logger.info(' Packages: All packages (read and write)');\n logger.info(' This bypasses 2FA — no OTP needed for publish');\n process.exitCode = 1;\n return;\n }\n\n if (!token.startsWith('npm_')) {\n logger.warn('Token does not start with \"npm_\" — this may not be a valid npm token');\n }\n\n // 1. Store in RevVault\n if (!options.skipVault) {\n const hasVault = await hasRevvault();\n if (hasVault) {\n const stored = await revvaultSet(REVVAULT_NPM_PATH, `NPM_TOKEN=${token}`);\n if (stored) {\n logger.success(`Stored in RevVault (${REVVAULT_NPM_PATH})`);\n } else {\n logger.error('Failed to store in RevVault');\n }\n } else {\n logger.warn('RevVault not installed — skipping vault storage');\n }\n }\n\n // 2. Ensure project .npmrc has token interpolation\n if (!options.skipNpmrc) {\n const paths = getNpmrcPaths();\n if (paths.project) {\n const hasInterpolation = await fileContains(paths.project, NPM_TOKEN_INTERPOLATION);\n if (!hasInterpolation) {\n try {\n const content = await fs.readFile(paths.project, 'utf-8');\n const updatedContent = `${content.trimEnd()}\\n${NPMRC_AUTH_LINE}\\n`;\n await fs.writeFile(paths.project, updatedContent, 'utf-8');\n logger.success(`Added NPM_TOKEN interpolation to ${paths.project}`);\n } catch (err) {\n logger.error(`Failed to update ${paths.project}: ${err}`);\n }\n } else {\n logger.info('Project .npmrc already uses NPM_TOKEN');\n }\n }\n }\n\n // 3. Remove any hardcoded token from ~/.npmrc (security hygiene)\n const userRc = path.join(os.homedir(), '.npmrc');\n try {\n const content = await fs.readFile(userRc, 'utf-8');\n const filtered = content\n .split('\\n')\n .filter((line) => !line.includes('//registry.npmjs.org/:_authToken='))\n .join('\\n');\n if (filtered !== content) {\n await fs.writeFile(userRc, filtered, 'utf-8');\n logger.success('Removed hardcoded token from ~/.npmrc (now managed via env var)');\n }\n } catch {\n // ~/.npmrc may not exist — fine\n }\n\n // 4. Verify\n write('\\n');\n logger.info('Verifying...');\n\n // Export into current process for verification\n process.env.NPM_TOKEN = token;\n\n try {\n const { stdout } = await execa('npm', ['whoami'], { stdio: 'pipe' });\n logger.success(`Authenticated as: ${stdout.trim()}`);\n } catch {\n logger.error('npm whoami failed — token may be invalid or expired');\n process.exitCode = 1;\n return;\n }\n\n write('\\n');\n logger.success('Token configured. Run `direnv reload` to load it in all terminals.');\n}\n\n// ---------------------------------------------------------------------------\n// revealui auth verify\n// ---------------------------------------------------------------------------\n\nexport async function runAuthVerifyCommand(options: { json?: boolean }): Promise<void> {\n const checks: Array<{ name: string; pass: boolean; detail: string }> = [];\n\n // 1. npm whoami\n let npmUser: string | undefined;\n try {\n const { stdout } = await execa('npm', ['whoami'], { stdio: 'pipe' });\n npmUser = stdout.trim();\n checks.push({ name: 'npm whoami', pass: true, detail: npmUser });\n } catch {\n checks.push({\n name: 'npm whoami',\n pass: false,\n detail: 'Not authenticated',\n });\n }\n\n // 2. Token source\n const envToken = await getTokenFromEnv();\n const npmrcToken = await getTokenFromNpmrc();\n const source = envToken ? '$NPM_TOKEN (env)' : npmrcToken ? '~/.npmrc (hardcoded)' : 'none';\n checks.push({\n name: 'Token source',\n pass: !!envToken,\n detail: source + (npmrcToken && !envToken ? ' — consider migrating to RevVault' : ''),\n });\n\n // 3. RevVault\n const hasVault = await hasRevvault();\n if (hasVault) {\n const vaultValue = await revvaultGet(REVVAULT_NPM_PATH);\n checks.push({\n name: 'RevVault',\n pass: !!vaultValue,\n detail: vaultValue ? `${REVVAULT_NPM_PATH} configured` : 'Not stored in vault',\n });\n }\n\n // 4. Project .npmrc interpolation\n const paths = getNpmrcPaths();\n if (paths.project) {\n const usesEnvVar = await fileContains(paths.project, NPM_TOKEN_INTERPOLATION);\n checks.push({\n name: '.npmrc NPM_TOKEN',\n pass: usesEnvVar,\n detail: usesEnvVar ? 'Project .npmrc uses env var' : \"Missing — direnv token won't reach npm\",\n });\n }\n\n // 5. .envrc loads npm group\n const envrcPath = path.join(process.cwd(), '.envrc');\n const loadsNpm = await fileContains(envrcPath, REVVAULT_NPM_PATH);\n checks.push({\n name: '.envrc loads npm',\n pass: loadsNpm,\n detail: loadsNpm ? 'revealui/env/npm in .envrc' : \"Missing — direnv won't export NPM_TOKEN\",\n });\n\n // 6. No hardcoded token in ~/.npmrc\n const hardcodedToken = await getTokenFromNpmrc();\n checks.push({\n name: '~/.npmrc clean',\n pass: !hardcodedToken,\n detail: hardcodedToken\n ? `Hardcoded token found (${maskToken(hardcodedToken)})`\n : 'No hardcoded tokens',\n });\n\n if (options.json) {\n const allPass = checks.every((c) => c.pass);\n writeJson({ pass: allPass, checks });\n return;\n }\n\n logger.header('npm Auth Verification');\n\n for (const check of checks) {\n if (check.pass) {\n logger.success(`${check.name}: ${check.detail}`);\n } else {\n logger.error(`${check.name}: ${check.detail}`);\n }\n }\n\n const allPass = checks.every((c) => c.pass);\n write('\\n');\n if (allPass) {\n logger.success('All checks passed — ready to publish');\n } else {\n logger.warn('Some checks failed. Run `revealui auth set-token` to fix.');\n process.exitCode = 1;\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 { 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?.replace(/\\\\n/g, '\\n');\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\nfunction printBanner(): void {\n logger.divider();\n logger.info(' RevealUI — The Agentic Business Runtime');\n logger.info(' Build your business, not your boilerplate.');\n logger.divider();\n logger.info('');\n}\n\nfunction printPostCreateSummary(projectName: string): void {\n logger.divider();\n logger.success('Your RevealUI project is ready!');\n logger.info('');\n logger.info(' Quick start:');\n logger.info(` cd ${projectName}`);\n logger.info(' pnpm install');\n logger.info(' pnpm dev');\n logger.info('');\n logger.info(' What was created:');\n logger.info(` ./${projectName}/ — project root`);\n logger.info(` ./${projectName}/.env.local — environment variables (edit before pnpm dev)`);\n logger.info(` ./${projectName}/README.md — getting started guide`);\n logger.info('');\n logger.info(' RevealUI ecosystem:');\n logger.info(' Studio: Desktop companion for managing your dev environment');\n logger.info(' Terminal: TUI client — run `revealui terminal install`');\n logger.info(' CMS: Admin dashboard at your-domain.com/admin');\n logger.info('');\n logger.info(' Helpful links:');\n logger.info(' Docs: https://docs.revealui.com');\n logger.info(' GitHub: https://github.com/RevealUIStudio/revealui');\n logger.info(' Support: support@revealui.com');\n logger.divider();\n}\n\nfunction formatCreateError(err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n const code = err instanceof Error && 'code' in err ? (err as { code: string }).code : undefined;\n\n logger.error('Project creation failed.');\n logger.info('');\n\n if (code === 'EACCES') {\n logger.info(' Permission denied. Try:');\n logger.info(' - Running from a directory you own');\n logger.info(' - Checking folder permissions with `ls -la`');\n } else if (code === 'ENOENT') {\n logger.info(' A required file or directory was not found.');\n logger.info(' - Check that you are in the correct directory');\n logger.info(' - Try running `revealui doctor` to diagnose your environment');\n } else if (code === 'ENOSPC') {\n logger.info(' Disk full. Free up space and try again.');\n } else if (\n message.includes('fetch') ||\n message.includes('ENOTFOUND') ||\n message.includes('ETIMEDOUT')\n ) {\n logger.info(' Network error. Check your internet connection and try again.');\n } else {\n logger.info(` ${message}`);\n }\n\n logger.info('');\n logger.info(' Troubleshooting:');\n logger.info(' revealui doctor — diagnose your environment');\n logger.info(' https://docs.revealui.com/docs/TROUBLESHOOTING');\n logger.info(' support@revealui.com — we are here to help');\n logger.divider();\n}\n\nexport async function runCreateFlow(\n projectName: string | undefined,\n options: CliOptions,\n): Promise<void> {\n printBanner();\n\n try {\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] Done!');\n printPostCreateSummary(projectConfig.projectName);\n } catch (err) {\n formatCreateError(err);\n process.exit(1);\n }\n}\n","/**\n * Database configuration prompts\n */\n\nimport { isCancel, select, text } from '@clack/prompts';\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 select({\n message: 'Which database provider would you like to use?',\n options: [\n { value: 'neon' as const, label: 'NeonDB - Serverless PostgreSQL (recommended)' },\n { value: 'supabase' as const, label: 'Supabase - PostgreSQL with built-in features' },\n { value: 'local' as const, label: 'Local PostgreSQL - Use existing local database' },\n { value: 'skip' as const, label: 'Skip - Configure later' },\n ],\n initialValue: 'neon' as const,\n });\n\n if (isCancel(provider)) {\n process.exit(0);\n }\n\n if (provider === 'skip') {\n return { provider: 'skip' };\n }\n\n if (provider === 'local') {\n const postgresUrl = await text({\n message: 'Enter your PostgreSQL connection string:',\n defaultValue: 'postgresql://postgres:postgres@localhost:5432/revealui',\n validate: (input) => {\n if (!input) return undefined;\n const result = validateNeonUrl(input);\n return result.valid ? undefined : result.message || 'Invalid database URL';\n },\n });\n\n if (isCancel(postgresUrl)) {\n process.exit(0);\n }\n\n return { provider: 'local', postgresUrl };\n }\n\n // For Neon or Supabase, get the connection string\n const label = provider === 'neon' ? 'Neon' : 'Supabase';\n const postgresUrl = await text({\n message: `Enter your ${label} database connection string:`,\n validate: (input) => {\n if (!input || input.trim() === '') {\n return 'Database URL is required';\n }\n const result = validateNeonUrl(input);\n return result.valid ? undefined : result.message || 'Invalid database URL';\n },\n });\n\n if (isCancel(postgresUrl)) {\n process.exit(0);\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 function validateStripeKey(key: string): 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 function validateNeonUrl(url: string): 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 function validateVercelToken(token: string): 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 function validateSupabaseUrl(url: string): 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 function validateNpmToken(token: string): CredentialValidation {\n if (!token.startsWith('npm_')) {\n return {\n valid: false,\n message: 'npm token must start with npm_',\n };\n }\n if (token.length < 20) {\n return {\n valid: false,\n message: 'npm token appears invalid (too short)',\n };\n }\n return { valid: true };\n}\n\nexport function validateOpenAIKey(key: string): 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 { confirm, isCancel } from '@clack/prompts';\n\nexport interface DevEnvConfig {\n createDevContainer: boolean;\n createDevbox: boolean;\n}\n\nexport async function promptDevEnvConfig(): Promise<DevEnvConfig> {\n const createDevContainer = await confirm({\n message: 'Create Dev Container configuration for VS Code / GitHub Codespaces?',\n initialValue: true,\n });\n\n if (isCancel(createDevContainer)) {\n process.exit(0);\n }\n\n const createDevbox = await confirm({\n message: 'Create Devbox configuration for Nix-powered development?',\n initialValue: true,\n });\n\n if (isCancel(createDevbox)) {\n process.exit(0);\n }\n\n return { createDevContainer, createDevbox };\n}\n","/**\n * Payment configuration prompts\n */\n\nimport { confirm, isCancel, text } from '@clack/prompts';\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 confirm({\n message: 'Do you want to configure Stripe payments?',\n initialValue: true,\n });\n\n if (isCancel(enabled)) {\n process.exit(0);\n }\n\n if (!enabled) {\n return { enabled: false };\n }\n\n const stripeSecretKey = await text({\n message: 'Enter your Stripe secret key (sk_test_... or sk_live_...):',\n validate: (input) => {\n if (!input || input.trim() === '') {\n return 'Stripe secret key is required';\n }\n const result = validateStripeKey(input);\n return result.valid ? undefined : result.message || 'Invalid Stripe key';\n },\n });\n\n if (isCancel(stripeSecretKey)) {\n process.exit(0);\n }\n\n const stripePublishableKey = await text({\n message: 'Enter your Stripe publishable key (pk_test_... or pk_live_...):',\n validate: (input) => {\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 undefined;\n },\n });\n\n if (isCancel(stripePublishableKey)) {\n process.exit(0);\n }\n\n const stripeWebhookSecret = await text({\n message: 'Enter your Stripe webhook secret (whsec_..., optional - press Enter to skip):',\n defaultValue: '',\n });\n\n if (isCancel(stripeWebhookSecret)) {\n process.exit(0);\n }\n\n return {\n enabled: true,\n stripeSecretKey,\n stripePublishableKey,\n stripeWebhookSecret: stripeWebhookSecret || undefined,\n };\n}\n","/**\n * Project configuration prompts\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { isCancel, select, text } from '@clack/prompts';\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 name = await text({\n message: 'What is your project name?',\n defaultValue: 'my-revealui-project',\n validate: (input) => {\n if (!input) return undefined;\n const isValid = input.split('').every((ch) => {\n const code = ch.charCodeAt(0);\n return (\n (code >= 97 && code <= 122) || // a-z\n (code >= 48 && code <= 57) || // 0-9\n code === 45 // -\n );\n });\n if (!isValid) {\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 undefined;\n },\n });\n\n if (isCancel(name)) {\n process.exit(0);\n }\n projectName = name;\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 selected = await select({\n message: 'Which template would you like to use?',\n options: [\n { value: 'basic-blog' as const, label: 'Basic Blog - A simple blog with posts and pages' },\n { value: 'e-commerce' as const, label: 'E-commerce - Product catalog with checkout' },\n { value: 'portfolio' as const, label: 'Portfolio - Personal portfolio site' },\n ],\n initialValue: 'basic-blog' as const,\n });\n\n if (isCancel(selected)) {\n process.exit(0);\n }\n template = selected;\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 { isCancel, select, text } from '@clack/prompts';\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 select({\n message: 'Which storage provider would you like to use?',\n options: [\n { value: 'vercel-blob' as const, label: 'Vercel Blob - Simple object storage (recommended)' },\n { value: 'supabase' as const, label: 'Supabase Storage - Integrated with Supabase' },\n { value: 'skip' as const, label: 'Skip - Configure later' },\n ],\n initialValue: 'vercel-blob' as const,\n });\n\n if (isCancel(provider)) {\n process.exit(0);\n }\n\n if (provider === 'skip') {\n return { provider: 'skip' };\n }\n\n if (provider === 'vercel-blob') {\n const blobToken = await text({\n message: 'Enter your Vercel Blob read/write token:',\n validate: (input) => {\n if (!input || input.trim() === '') {\n return 'Blob token is required';\n }\n const result = validateVercelToken(input);\n return result.valid ? undefined : result.message || 'Invalid token';\n },\n });\n\n if (isCancel(blobToken)) {\n process.exit(0);\n }\n\n return { provider: 'vercel-blob', blobToken };\n }\n\n // Supabase storage\n const supabaseUrl = await text({\n message: 'Enter your Supabase project URL:',\n validate: (input) => {\n if (!input || input.trim() === '') {\n return 'Supabase URL is required';\n }\n const result = validateSupabaseUrl(input);\n return result.valid ? undefined : result.message || 'Invalid URL';\n },\n });\n\n if (isCancel(supabaseUrl)) {\n process.exit(0);\n }\n\n const supabasePublishableKey = await text({\n message: 'Enter your Supabase publishable key (sb_publishable_...):',\n validate: (input) => {\n if (!input || input.trim() === '') {\n return 'Supabase publishable key is required';\n }\n return undefined;\n },\n });\n\n if (isCancel(supabasePublishableKey)) {\n process.exit(0);\n }\n\n return {\n provider: 'supabase',\n supabaseUrl,\n 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 * Pull OSS AI rules from the revealui-rules repo.\n * Best-effort — if the network is unavailable or the repo doesn't exist yet, skip silently.\n */\nasync function pullContentRules(projectPath: string): Promise<void> {\n const rawBaseUrl =\n process.env.REVEALUI_RULES_URL ??\n 'https://raw.githubusercontent.com/RevealUIStudio/editor-configs/main/harnesses';\n\n // Validate URL protocol to prevent file:// or other dangerous schemes\n let baseUrl: string;\n try {\n const parsed = new URL(rawBaseUrl);\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n return; // silently skip non-HTTP URLs\n }\n baseUrl = rawBaseUrl;\n } catch {\n return; // invalid URL — skip\n }\n\n const spinner = ora('Pulling AI coding rules...').start();\n try {\n const manifestRes = await fetch(`${baseUrl}/manifest.json`, {\n signal: AbortSignal.timeout(10_000),\n });\n if (!manifestRes.ok) {\n spinner.info('AI rules not available — skipping');\n return;\n }\n\n const manifest = (await manifestRes.json()) as {\n definitions: Array<{\n tier: string;\n generatorPaths: Record<string, string[]>;\n }>;\n };\n\n // Only pull OSS definitions, rendered for Claude Code\n const generatorId = 'claude-code';\n const ossDefs = manifest.definitions.filter((d) => d.tier === 'oss');\n let written = 0;\n\n // Allowed file extensions for downloaded rule files\n const allowedExtensions = new Set(['.md', '.json', '.txt', '.yaml', '.yml', '.ts', '.js']);\n // Maximum file size (1 MB) to prevent abuse\n const maxFileSize = 1_048_576;\n\n for (const def of ossDefs) {\n const paths = def.generatorPaths[generatorId] ?? [];\n for (const relPath of paths) {\n try {\n // Reject paths containing traversal sequences before fetching\n if (relPath.includes('..') || relPath.startsWith('/')) continue;\n // Only allow known text file extensions\n const ext = path.extname(relPath).toLowerCase();\n if (!allowedExtensions.has(ext)) continue;\n\n const absolutePath = path.resolve(projectPath, relPath);\n // Verify resolved path stays within project (prevent path traversal)\n if (!absolutePath.startsWith(path.resolve(projectPath))) continue;\n\n const fileRes = await fetch(`${baseUrl}/generators/${generatorId}/${relPath}`, {\n signal: AbortSignal.timeout(5_000),\n });\n if (!fileRes.ok) continue;\n\n // Enforce size limit before reading body\n const contentLength = fileRes.headers.get('content-length');\n if (contentLength && Number.parseInt(contentLength, 10) > maxFileSize) continue;\n\n const content = await fileRes.text();\n if (content.length > maxFileSize) continue;\n\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n // lgtm[js/http-to-file-access] — intentional: CLI scaffolding downloads text rule files\n // from a trusted HTTPS source with path traversal, extension, and size guards\n await fs.writeFile(absolutePath, content, 'utf-8');\n written++;\n } catch {\n // Individual file failures are non-fatal\n }\n }\n }\n\n if (written > 0) {\n spinner.succeed(`Pulled ${written} AI coding rules`);\n } else {\n spinner.info('No AI rules pulled');\n }\n } catch {\n spinner.info('AI rules not available — skipping');\n }\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 // 4c. Pull OSS AI rules from the rules repo (best-effort)\n await pullContentRules(projectPath);\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.\n\n## Requirements\n\n- Node.js 24.13.0 or higher\n- pnpm 10 or higher\n- PostgreSQL 16 (or use a hosted provider like [Neon](https://neon.tech))\n\n## Project Structure\n\n\\`\\`\\`\n${projectConfig.projectName}/\n├── src/\n│ ├── app/ # Next.js App Router pages\n│ ├── collections/ # RevealUI collection definitions\n│ └── seed.ts # Database seed script\n├── revealui.config.ts # RevealUI configuration\n├── next.config.mjs # Next.js configuration\n└── .env.local # Environment variables (git-ignored)\n\\`\\`\\`\n\n## Available Scripts\n\n- \\`pnpm dev\\` - Start the development server\n- \\`pnpm build\\` - Build for production\n- \\`pnpm test\\` - Run tests\n- \\`pnpm lint\\` - Lint with Biome\n- \\`pnpm typecheck\\` - Type check\n- \\`pnpm db:init\\` - Initialize the database\n- \\`pnpm db:migrate\\` - Run migrations\n- \\`pnpm db:seed\\` - Seed sample content\n\n## Learn More\n\n- [RevealUI Documentation](https://docs.revealui.com)\n- [Next.js Documentation](https://nextjs.org/docs)\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 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 {\n validateNeonUrl,\n validateNpmToken,\n validateStripeKey,\n validateSupabaseUrl,\n} from '../validators/credentials.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\n/**\n * Credential and environment variable checks.\n *\n * Each entry defines: env var name, whether it's required or optional,\n * a human label, and an optional format validator.\n */\ninterface EnvVarSpec {\n key: string;\n label: string;\n required: boolean;\n validate?: (value: string) => { valid: boolean; message?: string };\n}\n\nconst ENV_VAR_SPECS: EnvVarSpec[] = [\n // Core\n {\n key: 'REVEALUI_SECRET',\n label: 'App secret',\n required: false,\n },\n {\n key: 'REVEALUI_ADMIN_EMAIL',\n label: 'Admin email',\n required: false,\n },\n // Database\n {\n key: 'POSTGRES_URL',\n label: 'PostgreSQL URL',\n required: true,\n validate: validateNeonUrl,\n },\n // Stripe\n {\n key: 'STRIPE_SECRET_KEY',\n label: 'Stripe secret key',\n required: false,\n validate: validateStripeKey,\n },\n {\n key: 'NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY',\n label: 'Stripe publishable key',\n required: false,\n validate: (v) => ({\n valid: v.startsWith('pk_test_') || v.startsWith('pk_live_'),\n message: 'Must start with pk_test_ or pk_live_',\n }),\n },\n {\n key: 'STRIPE_WEBHOOK_SECRET',\n label: 'Stripe webhook secret',\n required: false,\n validate: (v) => ({\n valid: v.startsWith('whsec_'),\n message: 'Must start with whsec_',\n }),\n },\n // Supabase\n {\n key: 'NEXT_PUBLIC_SUPABASE_URL',\n label: 'Supabase URL',\n required: false,\n validate: validateSupabaseUrl,\n },\n {\n key: 'SUPABASE_SERVICE_ROLE_KEY',\n label: 'Supabase service role key',\n required: false,\n validate: (v) => ({\n valid: v.startsWith('eyJ'),\n message: 'Must be a JWT (starts with eyJ)',\n }),\n },\n // Services\n {\n key: 'RESEND_API_KEY',\n label: 'Resend API key',\n required: false,\n validate: (v) => ({\n valid: v.startsWith('re_'),\n message: 'Must start with re_',\n }),\n },\n // npm\n {\n key: 'NPM_TOKEN',\n label: 'npm publish token',\n required: false,\n validate: validateNpmToken,\n },\n // License\n {\n key: 'REVEALUI_LICENSE_PRIVATE_KEY',\n label: 'License signing key',\n required: false,\n },\n // CRON\n {\n key: 'REVEALUI_CRON_SECRET',\n label: 'Cron secret',\n required: false,\n },\n // AI\n {\n key: 'GROQ_API_KEY',\n label: 'Groq API key',\n required: false,\n validate: (v) => ({\n valid: v.startsWith('gsk_'),\n message: 'Must start with gsk_',\n }),\n },\n];\n\nfunction maskValue(value: string): string {\n if (value.length <= 8) return '***';\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n\nfunction gatherCredentialChecks(env: NodeJS.ProcessEnv): DoctorCheck[] {\n const checks: DoctorCheck[] = [];\n\n for (const spec of ENV_VAR_SPECS) {\n const value = env[spec.key];\n\n if (!value) {\n checks.push({\n id: `env:${spec.key}`,\n ok: !spec.required,\n detail: spec.required ? `${spec.label} — missing (required)` : `${spec.label} — not set`,\n });\n continue;\n }\n\n if (spec.validate) {\n const result = spec.validate(value);\n checks.push({\n id: `env:${spec.key}`,\n ok: result.valid,\n detail: result.valid\n ? `${spec.label} — ${maskValue(value)}`\n : `${spec.label} — ${result.message} (got ${maskValue(value)})`,\n });\n } else {\n checks.push({\n id: `env:${spec.key}`,\n ok: true,\n detail: `${spec.label} — set`,\n });\n }\n }\n\n return checks;\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 const credentials = gatherCredentialChecks(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 ...credentials,\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","/**\n * Terminal Profile Installer (Phase 5.6.1)\n *\n * Auto-detects the platform and installed terminal emulators,\n * then installs the appropriate RevealUI terminal profile.\n *\n * Supported terminals:\n * - macOS: iTerm2, Terminal.app, Alacritty, Kitty\n * - Linux: Alacritty, Kitty, GNOME Terminal\n *\n * Config files live in config/terminal/ at the repo root.\n */\n\nimport { copyFile, mkdir, readdir, stat } from 'node:fs/promises';\nimport { homedir, platform } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { createLogger } from '@revealui/setup/utils';\n\nconst logger = createLogger({ prefix: 'Terminal' });\n\ninterface TerminalProfile {\n name: string;\n /** Source filename in config/terminal/ */\n sourceFile: string;\n /** Destination path (~ expanded) */\n destPath: string;\n /** Human-readable install instructions */\n postInstall: string;\n /** Check if the terminal is installed */\n detect: () => Promise<boolean>;\n}\n\n/** Check if a directory exists */\nasync function dirExists(path: string): Promise<boolean> {\n try {\n const s = await stat(path);\n return s.isDirectory();\n } catch {\n return false;\n }\n}\n\n/** Check if a file exists */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n const s = await stat(path);\n return s.isFile();\n } catch {\n return false;\n }\n}\n\nfunction getMacProfiles(home: string): TerminalProfile[] {\n return [\n {\n name: 'iTerm2',\n sourceFile: 'iterm2-revealui.json',\n destPath: join(\n home,\n 'Library',\n 'Application Support',\n 'iTerm2',\n 'DynamicProfiles',\n 'revealui.json',\n ),\n postInstall:\n 'Profile loaded automatically. Select \"RevealUI\" in iTerm2 > Settings > Profiles.',\n detect: async () => dirExists(join(home, 'Library', 'Application Support', 'iTerm2')),\n },\n {\n name: 'Terminal.app',\n sourceFile: 'Terminal.app-RevealUI.terminal',\n destPath: join(home, 'Desktop', 'RevealUI.terminal'),\n postInstall:\n 'Double-click ~/Desktop/RevealUI.terminal to import, then set as default in Terminal > Settings > Profiles.',\n detect: async () =>\n fileExists('/System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal'),\n },\n {\n name: 'Alacritty',\n sourceFile: 'alacritty-revealui.toml',\n destPath: join(home, '.config', 'alacritty', 'revealui.toml'),\n postInstall:\n 'Add `import = [\"~/.config/alacritty/revealui.toml\"]` to your alacritty.toml [general] section.',\n detect: async () => dirExists(join(home, '.config', 'alacritty')),\n },\n {\n name: 'Kitty',\n sourceFile: 'kitty-revealui.conf',\n destPath: join(home, '.config', 'kitty', 'revealui.conf'),\n postInstall: 'Add `include revealui.conf` to your ~/.config/kitty/kitty.conf.',\n detect: async () => dirExists(join(home, '.config', 'kitty')),\n },\n ];\n}\n\nfunction getLinuxProfiles(home: string): TerminalProfile[] {\n return [\n {\n name: 'Alacritty',\n sourceFile: 'alacritty-revealui.toml',\n destPath: join(home, '.config', 'alacritty', 'revealui.toml'),\n postInstall:\n 'Add `import = [\"~/.config/alacritty/revealui.toml\"]` to your alacritty.toml [general] section.',\n detect: async () => dirExists(join(home, '.config', 'alacritty')),\n },\n {\n name: 'Kitty',\n sourceFile: 'kitty-revealui.conf',\n destPath: join(home, '.config', 'kitty', 'revealui.conf'),\n postInstall: 'Add `include revealui.conf` to your ~/.config/kitty/kitty.conf.',\n detect: async () => dirExists(join(home, '.config', 'kitty')),\n },\n {\n name: 'GNOME Terminal',\n sourceFile: 'gnome-terminal-revealui.dconf',\n destPath: join(home, '.config', 'revealui', 'gnome-terminal-revealui.dconf'),\n postInstall:\n 'Import with: dconf load /org/gnome/terminal/legacy/profiles:/ < ~/.config/revealui/gnome-terminal-revealui.dconf',\n detect: async () => {\n // Check for GNOME Terminal config directory or gsettings\n const gnomeConfigDir = join(home, '.config', 'dconf');\n return dirExists(gnomeConfigDir);\n },\n },\n ];\n}\n\nexport interface TerminalInstallOptions {\n /** Only install for a specific terminal */\n terminal?: string;\n /** List available profiles without installing */\n list?: boolean;\n /** Force overwrite existing files */\n force?: boolean;\n /** Output JSON */\n json?: boolean;\n}\n\n/**\n * Find the config/terminal/ directory relative to the CLI package.\n * Works both in dev (monorepo) and installed (npx) contexts.\n */\nasync function findConfigDir(): Promise<string | null> {\n // In the monorepo, config/terminal/ is at the repo root\n // The CLI package is at packages/cli/\n const monorepoPath = resolve(\n dirname(new URL(import.meta.url).pathname),\n '..',\n '..',\n '..',\n '..',\n 'config',\n 'terminal',\n );\n if (await dirExists(monorepoPath)) return monorepoPath;\n\n // When installed via npm, config files are bundled alongside\n const npmPath = resolve(dirname(new URL(import.meta.url).pathname), '..', 'config', 'terminal');\n if (await dirExists(npmPath)) return npmPath;\n\n return null;\n}\n\nexport async function runTerminalInstallCommand(options: TerminalInstallOptions): Promise<void> {\n const os = platform();\n const home = homedir();\n\n if (os !== 'darwin' && os !== 'linux') {\n logger.error(\n `Unsupported platform: ${os}. Terminal profiles are available for macOS and Linux.`,\n );\n if (os === 'win32') {\n logger.info('For Windows Terminal, copy config/terminal/ profiles manually.');\n }\n process.exitCode = 1;\n return;\n }\n\n const profiles = os === 'darwin' ? getMacProfiles(home) : getLinuxProfiles(home);\n\n // List mode\n if (options.list) {\n if (options.json) {\n const detected = await Promise.all(\n profiles.map(async (p) => ({\n name: p.name,\n sourceFile: p.sourceFile,\n destPath: p.destPath,\n detected: await p.detect(),\n })),\n );\n process.stdout.write(`${JSON.stringify({ platform: os, profiles: detected }, null, 2)}\\n`);\n return;\n }\n\n logger.header('Available Terminal Profiles');\n logger.info(`Platform: ${os === 'darwin' ? 'macOS' : 'Linux'}`);\n\n for (const profile of profiles) {\n const detected = await profile.detect();\n const icon = detected ? '[detected]' : '[not found]';\n logger.info(` ${profile.name} ${icon} — ${profile.sourceFile}`);\n }\n return;\n }\n\n // Find config directory\n const configDir = await findConfigDir();\n if (!configDir) {\n logger.error('Could not find config/terminal/ directory.');\n logger.info(\n 'Run this command from the RevealUI monorepo root, or install via npx create-revealui.',\n );\n process.exitCode = 1;\n return;\n }\n\n // Verify source files exist\n const sourceFiles = await readdir(configDir);\n\n // Filter to specific terminal if requested\n let targetProfiles = profiles;\n if (options.terminal) {\n const match = profiles.find((p) => p.name.toLowerCase() === options.terminal?.toLowerCase());\n if (!match) {\n logger.error(`Unknown terminal: ${options.terminal}`);\n logger.info(`Available: ${profiles.map((p) => p.name).join(', ')}`);\n process.exitCode = 1;\n return;\n }\n targetProfiles = [match];\n }\n\n // Detect and install\n let installed = 0;\n let skipped = 0;\n\n logger.header('RevealUI Terminal Profile Installer');\n logger.info(`Platform: ${os === 'darwin' ? 'macOS' : 'Linux'}`);\n\n for (const profile of targetProfiles) {\n const detected = await profile.detect();\n if (!(detected || options.terminal)) {\n // Skip undetected terminals unless explicitly requested\n continue;\n }\n\n if (!detected && options.terminal) {\n logger.warn(`${profile.name} not detected, installing anyway (--terminal flag).`);\n }\n\n // Check source file exists\n if (!sourceFiles.includes(profile.sourceFile)) {\n logger.warn(`Source file missing: ${profile.sourceFile} — skipping ${profile.name}`);\n skipped++;\n continue;\n }\n\n const sourcePath = join(configDir, profile.sourceFile);\n const destPath = profile.destPath;\n\n // Check if destination exists\n if (await fileExists(destPath)) {\n if (!options.force) {\n logger.warn(`${profile.name}: ${destPath} already exists. Use --force to overwrite.`);\n skipped++;\n continue;\n }\n }\n\n // Create destination directory\n await mkdir(dirname(destPath), { recursive: true });\n\n // Copy file\n await copyFile(sourcePath, destPath);\n installed++;\n\n logger.success(`${profile.name}: installed to ${destPath}`);\n logger.info(` ${profile.postInstall}`);\n }\n\n if (installed === 0 && skipped === 0) {\n logger.info('No supported terminal emulators detected.');\n logger.info(`Supported: ${profiles.map((p) => p.name).join(', ')}`);\n logger.info('Use --terminal <name> to install for a specific terminal.');\n } else if (installed > 0) {\n logger.success(\n `Installed ${installed} profile(s). ${skipped > 0 ? `Skipped ${skipped}.` : ''}`,\n );\n }\n\n if (options.json) {\n process.stdout.write(`${JSON.stringify({ installed, skipped, platform: os }, null, 2)}\\n`);\n }\n}\n\nexport async function runTerminalListCommand(options: { json?: boolean }): Promise<void> {\n await runTerminalInstallCommand({ list: true, json: options.json });\n}\n","#!/usr/bin/env node\n\n/**\n * @revealui/cli - Main orchestrator\n */\n\nimport { createCli } from './cli.js';\n\n// If running as main module\nif (import.meta.url === `file://${process.argv[1]}`) {\n const cli = createCli();\n cli.parse(process.argv);\n}\n"],"mappings":"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","names":["createLogger","createLogger","execa","resolve","logger","createLogger","text","execa","allPass","createLogger","createLogger","logger","postgresUrl","isCancel","confirm","isCancel","text","confirm","isCancel","text","fs","path","isCancel","select","text","isCancel","select","text","select","isCancel","text","createLogger","logger","fs","path","createLogger","ora","fs","path","fs","path","fs","path","createLogger","execa","logger","createLogger","execa","logger","logger","createLogger","__filename","__dirname","path","fs","ora","logger","createLogger","fs","path","createLogger","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","homedir","join","createLogger","logger","path","os","logger","createLogger"]}
|