@rebasepro/cli 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","names":[],"sources":["../src/utils/package-manager.ts","../src/commands/init.ts","../src/commands/generate_sdk.ts","../src/utils/project.ts","../src/commands/schema.ts","../src/commands/db.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/start.ts","../src/commands/auth.ts","../src/commands/doctor.ts","../src/commands/skills.ts","../src/commands/api-keys.ts","../src/cli.ts"],"sourcesContent":["/**\n * Package manager detection and command abstraction.\n *\n * Detects whether the user is running pnpm or npm and provides\n * a unified interface for common package-manager operations so\n * the rest of the CLI never has to hardcode a specific PM.\n */\nimport fs from \"fs\";\nimport path from \"path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\";\n\nexport interface PMCommands {\n /** The binary name (\"pnpm\" | \"npm\"). */\n name: PackageManager;\n /** Install all dependencies — e.g. `pnpm install` / `npm install`. */\n install: string[];\n /** Run a script — e.g. `pnpm run dev` / `npm run dev`. */\n run: (script: string) => string[];\n /** Execute a local bin — e.g. `pnpm exec rebase ...` / `npx rebase ...`. */\n exec: (bin: string, args: string[]) => string[];\n /** Query the registry — e.g. `pnpm view <pkg> version` / `npm view <pkg> version`. */\n view: (pkg: string, field: string) => string[];\n /** Run all workspace scripts — e.g. `pnpm -r run build` / `npm run build --workspaces`. */\n runAll: (script: string) => string[];\n /** Run a script in a specific workspace — e.g. `pnpm --filter \"*-backend\" start` / `npm run start -w backend`. */\n runWorkspace: (workspace: string, script: string) => string[];\n /** Execute a one-off package — e.g. `pnpm dlx skills ...` / `npx -y skills ...`. */\n dlx: (pkg: string, args: string[]) => string[];\n /** The workspace dependency protocol: `\"workspace:*\"` for pnpm, `\"*\"` for npm. */\n workspaceProtocol: string;\n}\n\n/**\n * Detect the package manager from the environment or the target directory.\n *\n * Detection order:\n * 1. Explicit override (if provided)\n * 2. `npm_config_user_agent` env var (set by npm/pnpm when running via `npx`/`pnpm dlx`)\n * 3. Lock-file presence in the target directory\n * 4. Default to pnpm (Rebase's recommended PM)\n */\nexport function detectPackageManager(targetDir?: string): PackageManager {\n // 1. Check user agent (set when invoked via npx / pnpm dlx)\n const userAgent = process.env.npm_config_user_agent ?? \"\";\n if (userAgent.startsWith(\"npm/\")) return \"npm\";\n if (userAgent.startsWith(\"pnpm/\")) return \"pnpm\";\n\n // 2. Check for lock files in the target directory\n if (targetDir) {\n if (fs.existsSync(path.join(targetDir, \"package-lock.json\"))) return \"npm\";\n if (fs.existsSync(path.join(targetDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n }\n\n // 3. Check for lock files in cwd\n const cwd = process.cwd();\n if (cwd !== targetDir) {\n if (fs.existsSync(path.join(cwd, \"package-lock.json\"))) return \"npm\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n }\n\n // 4. Default to pnpm\n return \"pnpm\";\n}\n\n/** Build the command helpers for a given package manager. */\nexport function getPMCommands(pm: PackageManager): PMCommands {\n if (pm === \"npm\") {\n return {\n name: \"npm\",\n install: [\"npm\", \"install\"],\n run: (script) => [\"npm\", \"run\", script],\n exec: (bin, args) => [\"npx\", bin, ...args],\n view: (pkg, field) => [\"npm\", \"view\", pkg, field],\n runAll: (script) => [\"npm\", \"run\", script, \"--workspaces\", \"--if-present\"],\n runWorkspace: (workspace, script) => [\"npm\", \"run\", script, \"-w\", workspace],\n dlx: (pkg, args) => [\"npx\", \"-y\", pkg, ...args],\n workspaceProtocol: \"*\"\n };\n }\n\n return {\n name: \"pnpm\",\n install: [\"pnpm\", \"install\"],\n run: (script) => [\"pnpm\", \"run\", script],\n exec: (bin, args) => [\"pnpm\", \"exec\", bin, ...args],\n view: (pkg, field) => [\"pnpm\", \"view\", pkg, field],\n runAll: (script) => [\"pnpm\", \"-r\", \"run\", script],\n runWorkspace: (workspace, script) => [\"pnpm\", \"--filter\", workspace, script],\n dlx: (pkg, args) => [\"pnpm\", \"dlx\", pkg, ...args],\n workspaceProtocol: \"workspace:*\"\n };\n}\n","import arg from \"arg\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport net from \"net\";\nimport { promisify } from \"util\";\nimport { execa } from \"execa\";\nimport { cp } from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport crypto from \"crypto\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\nimport type { PackageManager, PMCommands } from \"../utils/package-manager\";\n\nconst access = promisify(fs.access);\n\n\n// Resolve template path relative to this file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction findParentDir(currentDir: string, targetName: string): string | null {\n const root = path.parse(currentDir).root;\n while (currentDir && currentDir !== root) {\n if (path.basename(currentDir) === targetName) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n return null;\n}\n\nconst cliRoot = findParentDir(__dirname, \"cli\");\n\nexport type TemplatePreset = \"blog\" | \"ecommerce\" | \"blank\";\n\nconst PRESET_CHOICES: Array<{ name: string; value: TemplatePreset; short: string }> = [\n { name: \"Blog — Posts, Authors, Tags (with markdown editor)\",\nvalue: \"blog\",\nshort: \"Blog\" },\n { name: \"E-commerce — Products, Categories, Orders\",\nvalue: \"ecommerce\",\nshort: \"E-commerce\" },\n { name: \"Blank — Empty project, just authentication\",\nvalue: \"blank\",\nshort: \"Blank\" }\n];\n\nexport interface InitOptions {\n projectName: string;\n git: boolean;\n installDeps: boolean;\n targetDirectory: string;\n templateDirectory: string;\n databaseUrl?: string;\n introspect?: boolean;\n /** Starter template preset. */\n preset: TemplatePreset;\n /** Detected package manager (pnpm or npm). */\n pm: PackageManager;\n /** Command helpers for the detected PM. */\n pmCommands: PMCommands;\n}\n\nexport interface BuildQuestionsParams {\n nameArg?: string;\n templateArg?: TemplatePreset;\n hasGitFlag: boolean;\n hasInstallFlag: boolean;\n pm: PackageManager;\n}\n\n/**\n * Builds the interactive prompt questions for `rebase init`.\n * Exported for testability — all prompt `type` values must match\n * types registered by the installed version of inquirer.\n */\nexport function buildInitQuestions(params: BuildQuestionsParams): Record<string, unknown>[] {\n const { nameArg, templateArg, hasGitFlag, hasInstallFlag, pm } = params;\n const questions: Record<string, unknown>[] = [];\n\n if (!nameArg) {\n questions.push({\n type: \"input\",\n name: \"projectName\",\n message: \"Project name:\",\n default: \"my-rebase-app\",\n validate: (input: string) => {\n if (!input.trim()) return \"Project name is required\";\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(input)) {\n return \"Project name must start with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, dots, or underscores\";\n }\n return true;\n }\n });\n }\n\n if (!templateArg) {\n questions.push({\n type: \"select\",\n name: \"preset\",\n message: \"Choose a starter template:\",\n choices: PRESET_CHOICES,\n default: \"blog\"\n });\n }\n\n if (!hasGitFlag) {\n questions.push({\n type: \"confirm\",\n name: \"git\",\n message: \"Initialize a git repository?\",\n default: true\n });\n }\n\n if (!hasInstallFlag) {\n questions.push({\n type: \"confirm\",\n name: \"installDeps\",\n message: `Install dependencies with ${pm}?`,\n default: true\n });\n }\n\n questions.push({\n type: \"input\",\n name: \"databaseUrl\",\n message: \"Enter your PostgreSQL database connection string (leave blank to use a local default):\",\n default: \"\",\n validate: (input: string) => {\n if (input.trim() && /[\\r\\n]/.test(input)) {\n return \"Database URL cannot contain newline characters.\";\n }\n return true;\n }\n });\n\n questions.push({\n type: \"confirm\",\n name: \"introspect\",\n message: \"Would you like to introspect this database to automatically generate collections?\",\n default: true,\n when: (answers: Record<string, unknown>) => !!(answers.databaseUrl as string)?.trim()\n });\n\n return questions;\n}\n\nexport async function createRebaseApp(rawArgs: string[]) {\n console.log(`\n${chalk.bold(\"Rebase\")} — Create a new project 🚀\n`);\n\n const pm = detectPackageManager();\n const options = await promptForOptions(rawArgs, pm);\n await createProject(options);\n}\n\nasync function promptForOptions(rawArgs: string[], pm: PackageManager): Promise<InitOptions> {\n const args = arg(\n {\n \"--git\": Boolean,\n \"--install\": Boolean,\n \"--database-url\": String,\n \"--introspect\": Boolean,\n \"--template\": String,\n \"--yes\": Boolean,\n \"-g\": \"--git\",\n \"-i\": \"--install\",\n \"-t\": \"--template\",\n \"-y\": \"--yes\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node\", \"rebase\", \"init\"\n permissive: true\n }\n );\n\n // The first positional arg after \"init\" is the project name\n const nameArg = args._[0];\n const isNonInteractive = args[\"--yes\"] || false;\n\n const templateArg = args[\"--template\"] as TemplatePreset | undefined;\n if (templateArg && !PRESET_CHOICES.some(p => p.value === templateArg)) {\n console.error(chalk.red(`Unknown template \"${templateArg}\". Available: ${PRESET_CHOICES.map(p => p.value).join(\", \")}`));\n process.exit(1);\n }\n\n if (isNonInteractive) {\n const projectName = nameArg || \"my-rebase-app\";\n const targetDirectory = path.resolve(process.cwd(), projectName);\n const templateDirectory = path.resolve(cliRoot!, \"templates\", \"template\");\n const pmCommands = getPMCommands(pm);\n\n return {\n projectName: path.basename(targetDirectory),\n git: args[\"--git\"] ?? false,\n installDeps: args[\"--install\"] ?? false,\n targetDirectory,\n templateDirectory,\n databaseUrl: args[\"--database-url\"] || undefined,\n introspect: args[\"--introspect\"] || false,\n preset: templateArg || \"blog\",\n pm,\n pmCommands\n };\n }\n\n const questions = buildInitQuestions({\n nameArg,\n templateArg,\n hasGitFlag: !!args[\"--git\"],\n hasInstallFlag: !!args[\"--install\"],\n pm\n });\n\n\n const answers = await inquirer.prompt(questions as unknown as Parameters<typeof inquirer.prompt>[0]);\n\n const targetDirectory = path.resolve(process.cwd(), nameArg || answers.projectName);\n const projectName = path.basename(targetDirectory);\n const templateDirectory = path.resolve(cliRoot!, \"templates\", \"template\");\n const pmCommands = getPMCommands(pm);\n\n return {\n projectName,\n git: args[\"--git\"] || answers.git || false,\n installDeps: args[\"--install\"] || answers.installDeps || false,\n targetDirectory,\n templateDirectory,\n databaseUrl: (answers.databaseUrl as string)?.trim() || undefined,\n introspect: answers.introspect || false,\n preset: templateArg || (answers.preset as TemplatePreset) || \"blog\",\n pm,\n pmCommands\n };\n}\n\nasync function createProject(options: InitOptions) {\n // Check if directory already exists and is not empty\n if (fs.existsSync(options.targetDirectory)) {\n if (fs.readdirSync(options.targetDirectory).length !== 0) {\n console.error(`${chalk.red.bold(\"ERROR\")} Directory \"${options.projectName}\" already exists and is not empty`);\n process.exit(1);\n }\n } else {\n fs.mkdirSync(options.targetDirectory, { recursive: true });\n }\n\n // Verify template exists\n try {\n await access(options.templateDirectory, fs.constants.R_OK);\n } catch {\n console.error(`${chalk.red.bold(\"ERROR\")} Template not found at ${options.templateDirectory}`);\n process.exit(1);\n }\n\n // Copy template files\n console.log(chalk.gray(\" Copying project files...\"));\n try {\n await cp(options.templateDirectory, options.targetDirectory, {\n recursive: true,\n filter: (source: string) => {\n const basename = path.basename(source);\n // Skip node_modules and .DS_Store\n return basename !== \"node_modules\" && basename !== \".DS_Store\";\n }\n });\n } catch (err: unknown) {\n console.error(`${chalk.red.bold(\"ERROR\")} Failed to copy template files: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // Apply the selected template preset (swap collection files)\n await applyPreset(options.targetDirectory, options.preset);\n\n // Replace placeholder project name in package.json files\n await replacePlaceholders(options);\n\n // Rename .env.example to .env if it exists and randomize secrets\n await configureEnvFile(options.targetDirectory, options.databaseUrl);\n\n // Initialize git\n if (options.git) {\n console.log(chalk.gray(\" Initializing git repository...\"));\n try {\n await execa(\"git\", [\"init\"], { cwd: options.targetDirectory });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to initialize git repository\"));\n }\n }\n\n const { pm, pmCommands } = options;\n const installCmd = pmCommands.install;\n const execCmd = pmCommands.exec(\"rebase\", [\"schema\", \"introspect\", \"--force\"]);\n\n if (options.installDeps) {\n console.log(\"\");\n console.log(chalk.gray(` Installing dependencies with ${pm}...`));\n console.log(\"\");\n try {\n await execa(installCmd[0], installCmd.slice(1), {\n cwd: options.targetDirectory,\n stdio: \"inherit\"\n });\n } catch {\n console.warn(chalk.yellow(` Warning: Failed to install dependencies. You may need to run \\`${installCmd.join(\" \")}\\` manually.`));\n }\n }\n\n if (options.introspect) {\n console.log(\"\");\n if (options.installDeps) {\n console.log(chalk.gray(\" Introspecting database and generating collections...\"));\n console.log(\"\");\n try {\n // --force overwrites template example collections with real ones\n await execa(execCmd[0], execCmd.slice(1), {\n cwd: options.targetDirectory,\n stdio: \"inherit\"\n });\n console.log(chalk.green(\" Database successfully introspected!\"));\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to introspect database automatically.\"));\n console.warn(chalk.yellow(` You can run \\`${execCmd.join(\" \")}\\` manually after setup.`));\n }\n } else {\n console.warn(chalk.yellow(\" Skipping introspection because dependencies were not installed.\"));\n console.warn(chalk.yellow(` Run \\`${installCmd.join(\" \")}\\` then \\`${execCmd.join(\" \")}\\` manually.`));\n }\n }\n\n // Success message\n console.log(\"\");\n console.log(`${chalk.green.bold(\"✓\")} Project ${chalk.bold(options.projectName)} created successfully!`);\n console.log(\"\");\n console.log(chalk.bold(\"Next steps:\"));\n console.log(\"\");\n const runDev = pmCommands.run(\"dev\");\n const runDbPush = pmCommands.run(\"db:push\");\n console.log(` ${chalk.cyan(\"cd\")} ${options.projectName}`);\n if (!options.installDeps) {\n console.log(` ${chalk.cyan(installCmd.join(\" \"))}`);\n }\n console.log(\"\");\n\n if (options.databaseUrl) {\n if (options.introspect) {\n console.log(chalk.gray(\" # Database has been introspected & collections generated!\"));\n console.log(chalk.gray(\" # Start the development server (frontend + backend):\"));\n console.log(` ${chalk.cyan(runDev.join(\" \"))}`);\n } else {\n console.log(chalk.gray(\" # Your custom database is configured in .env.\"));\n console.log(chalk.gray(\" # If the database is empty, push the Rebase schema to initialize it:\"));\n console.log(` ${chalk.cyan(runDbPush.join(\" \"))}`);\n console.log(\"\");\n console.log(chalk.gray(\" # Then start the development server:\"));\n console.log(` ${chalk.cyan(runDev.join(\" \"))}`);\n }\n } else {\n console.log(chalk.gray(\" # A local database configuration has been generated in .env.\"));\n console.log(chalk.gray(\" # 1. Start the PostgreSQL database container:\"));\n console.log(` ${chalk.cyan(\"docker compose up -d db\")}`);\n console.log(\"\");\n console.log(chalk.gray(\" # 2. Push the Rebase schema to initialize database tables:\"));\n console.log(` ${chalk.cyan(runDbPush.join(\" \"))}`);\n console.log(\"\");\n console.log(chalk.gray(\" # 3. Start the development server (frontend + backend):\"));\n console.log(` ${chalk.cyan(runDev.join(\" \"))}`);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\"This starts both the backend (Hono + PostgreSQL)\")\n + chalk.gray(\" and the frontend (Vite + React) concurrently.\"));\n console.log(\"\");\n console.log(chalk.gray(\"Docs: https://rebase.pro/docs\"));\n console.log(chalk.gray(\"GitHub: https://github.com/rebasepro/rebase\"));\n console.log(\"\");\n console.log(chalk.bold(\"🤖 AI Agent Skills\"));\n console.log(\"\");\n console.log(chalk.gray(\" Install Rebase agent skills for your AI coding assistant:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"rebase skills install\")} ${chalk.gray(\"or\")} ${chalk.cyan(pmCommands.run(\"skills:install\").join(\" \"))}`);\n console.log(\"\");\n}\n\n/**\n * Apply a template preset by replacing the default collection files.\n *\n * The template ships with blog collections at the top level and\n * preset alternatives under `config/collections/presets/<name>/`.\n * This function swaps the active collection files and removes the\n * presets directory so the final project is clean.\n */\nasync function applyPreset(targetDirectory: string, preset: TemplatePreset): Promise<void> {\n const collectionsDir = path.join(targetDirectory, \"config\", \"collections\");\n const presetsDir = path.join(collectionsDir, \"presets\");\n\n if (preset !== \"blog\") {\n const presetDir = path.join(presetsDir, preset);\n if (!fs.existsSync(presetDir)) {\n console.warn(chalk.yellow(` Warning: Preset \"${preset}\" not found, falling back to blog template.`));\n cleanupPresets(presetsDir);\n return;\n }\n\n // Remove the default blog collection files (keep users.ts — it's shared)\n const blogFiles = [\"posts.ts\", \"authors.ts\", \"tags.ts\", \"index.ts\"];\n for (const file of blogFiles) {\n const filePath = path.join(collectionsDir, file);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n }\n\n // Copy preset files into the collections directory\n const presetFiles = fs.readdirSync(presetDir).filter(f => f.endsWith(\".ts\"));\n for (const file of presetFiles) {\n fs.copyFileSync(\n path.join(presetDir, file),\n path.join(collectionsDir, file)\n );\n }\n }\n\n // Always clean up the presets directory — it shouldn't ship with the final project\n cleanupPresets(presetsDir);\n}\n\nfunction cleanupPresets(presetsDir: string): void {\n if (fs.existsSync(presetsDir)) {\n fs.rmSync(presetsDir, { recursive: true,\nforce: true });\n }\n}\n\nasync function replacePlaceholders(options: InitOptions) {\n const filesToProcess = [\n \"package.json\",\n \"frontend/package.json\",\n \"backend/package.json\",\n \"config/package.json\",\n \"frontend/index.html\",\n \"pnpm-workspace.yaml\",\n \"README.md\"\n ];\n\n const packageJsonPath = path.resolve(cliRoot!, \"package.json\");\n let cliVersion = \"latest\";\n if (fs.existsSync(packageJsonPath)) {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n cliVersion = pkg.version || \"latest\";\n }\n\n const versionCache = new Map<string, string>();\n\n // Use npm view for registry queries — it's universal and works regardless of PM\n const viewBin = \"npm\";\n\n const getPackageVersion = async (pkgName: string) => {\n if (versionCache.has(pkgName)) return versionCache.get(pkgName)!;\n if (process.env.REBASE_E2E === \"true\") {\n versionCache.set(pkgName, cliVersion);\n return cliVersion;\n }\n let versionToUse = cliVersion;\n try {\n // First try to check if the specific cliVersion exists for this package\n const { stdout } = await execa(viewBin, [\"view\", `${pkgName}@${cliVersion}`, \"version\"]);\n if (!stdout.trim()) throw new Error(\"Not found\");\n versionToUse = stdout.trim();\n } catch {\n try {\n // If specific version doesn't exist, try the matching tag (canary or latest)\n const tag = cliVersion.includes(\"canary\") ? \"canary\" : \"latest\";\n const { stdout } = await execa(viewBin, [\"view\", `${pkgName}@${tag}`, \"version\"]);\n if (!stdout.trim()) throw new Error(\"Not found\");\n versionToUse = stdout.trim();\n } catch {\n try {\n // Fallback to absolute latest\n const { stdout } = await execa(viewBin, [\"view\", pkgName, \"version\"]);\n versionToUse = stdout.trim() || \"latest\";\n } catch {\n versionToUse = \"latest\";\n }\n }\n }\n versionCache.set(pkgName, versionToUse);\n return versionToUse;\n };\n\n // First, find all unique @rebasepro packages across all files to process in parallel\n const allPackages = new Set<string>();\n const fileContents = new Map<string, string>();\n\n for (const file of filesToProcess) {\n const fullPath = path.resolve(options.targetDirectory, file);\n if (!fs.existsSync(fullPath)) continue;\n const content = fs.readFileSync(fullPath, \"utf-8\");\n fileContents.set(fullPath, content);\n\n const matches = [...content.matchAll(/\"(@rebasepro\\/[^\"]+)\":\\s*\"workspace:\\*\"/g)];\n for (const match of matches) {\n allPackages.add(match[1]);\n }\n }\n\n console.log(chalk.gray(\" Resolving package versions...\"));\n\n // Resolve all versions in parallel\n await Promise.all(Array.from(allPackages).map(getPackageVersion));\n\n // Perform replacements\n for (const [fullPath, originalContent] of fileContents.entries()) {\n let content = originalContent.replace(/\\{\\{PROJECT_NAME\\}\\}/g, options.projectName);\n\n // Replace workspace:* with the dynamically resolved version\n const matches = [...content.matchAll(/\"(@rebasepro\\/[^\"]+)\":\\s*\"workspace:\\*\"/g)];\n for (const match of matches) {\n const pkgName = match[1];\n const resolvedVersion = versionCache.get(pkgName) || \"latest\";\n content = content.replace(new RegExp(`\"${pkgName}\":\\\\s*\"workspace:\\\\*\"`, \"g\"), `\"${pkgName}\": \"${resolvedVersion}\"`);\n }\n\n fs.writeFileSync(fullPath, content, \"utf-8\");\n }\n}\n\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once(\"error\", () => {\n resolve(false);\n });\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n server.listen(port);\n });\n}\n\nasync function findAvailablePort(startPort: number): Promise<number> {\n let port = startPort;\n while (!(await isPortAvailable(port))) {\n port++;\n }\n return port;\n}\n\nexport async function configureEnvFile(targetDirectory: string, databaseUrl?: string) {\n const envExamplePath = path.join(targetDirectory, \".env.example\");\n const envPath = path.join(targetDirectory, \".env\");\n if (fs.existsSync(envExamplePath) && !fs.existsSync(envPath)) {\n // Copy .env.example → .env (keep .env.example as a reference in the repo)\n fs.copyFileSync(envExamplePath, envPath);\n\n // Generate secure random strings\n const jwtSecret = crypto.randomBytes(32).toString(\"hex\");\n const dbPassword = crypto.randomBytes(16).toString(\"hex\");\n\n let envContent = fs.readFileSync(envPath, \"utf-8\");\n\n envContent = envContent.replace(\n /^JWT_SECRET=.*$/m,\n `JWT_SECRET=${jwtSecret}`\n );\n\n if (databaseUrl) {\n if (/[\\r\\n]/.test(databaseUrl)) {\n throw new Error(\"Invalid DATABASE_URL: multiline values are not allowed.\");\n }\n envContent = envContent.replace(\n /^DATABASE_URL=.*$/m,\n `DATABASE_URL=${databaseUrl}`\n );\n } else {\n const dbPort = await findAvailablePort(5432);\n envContent = envContent.replace(\n /^DATABASE_URL=.*$/m,\n `DATABASE_URL=postgresql://rebase:${dbPassword}@localhost:${dbPort}/rebase?options=-c%20search_path=public\\nDATABASE_PASSWORD=${dbPassword}`\n );\n\n // Also update docker-compose.yml with the dynamic host port if it has the default 5432 port mapping\n const dockerComposePath = path.join(targetDirectory, \"docker-compose.yml\");\n if (fs.existsSync(dockerComposePath)) {\n let dockerComposeContent = fs.readFileSync(dockerComposePath, \"utf-8\");\n dockerComposeContent = dockerComposeContent.replace(\n /-\\s*\"5432:5432\"/g,\n `- \"${dbPort}:5432\"`\n );\n fs.writeFileSync(dockerComposePath, dockerComposeContent, \"utf-8\");\n }\n }\n\n fs.writeFileSync(envPath, envContent, \"utf-8\");\n }\n}\n","/**\n * CLI command: generate-sdk\n *\n * Reads collection definitions from a specified directory (default: ./config/collections),\n * generates a typed TypeScript SDK, and writes it to the output directory (default: ./generated/sdk).\n *\n * Uses jiti for dynamic TypeScript import of collection files.\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { EntityCollection } from \"@rebasepro/types\";\nimport { generateSDK, GeneratedFile } from \"@rebasepro/sdk-generator\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\n\ninterface GenerateSDKArgs {\n collectionsDir: string;\n output: string;\n cwd: string;\n}\n\n/**\n * Dynamically load collection definitions from a directory.\n *\n * Expects the directory to have an index.ts/index.js that exports a default\n * array of EntityCollection objects (matching the app/config/collections pattern).\n */\nasync function loadCollections(collectionsDir: string): Promise<EntityCollection[]> {\n const absDir = path.resolve(collectionsDir);\n\n if (!fs.existsSync(absDir)) {\n throw new Error(`Collections directory not found: ${absDir}`);\n }\n\n // Try to import the index file using jiti (supports TypeScript natively)\n let jiti: (id: string, userOptions?: Record<string, unknown>) => (modulePath: string) => Record<string, unknown>;\n try {\n const jitiModule = await import(\"jiti\");\n jiti = (jitiModule.default || jitiModule) as typeof jiti;\n } catch {\n const installCmd = [...getPMCommands(detectPackageManager()).install, \"-D\", \"jiti\"].join(\" \");\n throw new Error(\n `Could not load 'jiti'. Install it with: ${installCmd}\\n` +\n \"jiti is required to dynamically import TypeScript collection definitions.\"\n );\n }\n\n const jitiInstance = jiti(absDir, {\n interopDefault: true,\n esmResolve: true\n });\n\n // Look for index file\n const indexCandidates = [\"index.ts\", \"index.js\", \"index.mjs\"];\n let indexPath: string | null = null;\n\n for (const candidate of indexCandidates) {\n const p = path.join(absDir, candidate);\n if (fs.existsSync(p)) {\n indexPath = p;\n break;\n }\n }\n\n if (!indexPath) {\n // Fallback: load each .ts/.js file individually\n console.log(chalk.yellow(\" No index file found, scanning individual collection files...\"));\n const collections: EntityCollection[] = [];\n const files = fs.readdirSync(absDir).filter(f =>\n (f.endsWith(\".ts\") || f.endsWith(\".js\")) && !f.startsWith(\".\")\n );\n\n for (const file of files) {\n try {\n const mod = jitiInstance(path.join(absDir, file));\n const exported = mod.default || mod;\n if (exported && typeof exported === \"object\" && \"slug\" in exported) {\n collections.push(exported as EntityCollection);\n } else if (Array.isArray(exported)) {\n collections.push(...exported);\n }\n } catch (err) {\n console.warn(chalk.yellow(` ⚠ Skipping ${file}: ${(err as Error).message}`));\n }\n }\n\n return collections;\n }\n\n // Import the index\n const mod = jitiInstance(indexPath);\n const exported = mod.default || mod;\n\n if (Array.isArray(exported)) {\n return exported as EntityCollection[];\n } else if (typeof exported === \"object\" && exported !== null) {\n // Could be a named export like { collections: [...] }\n if (\"collections\" in exported && Array.isArray(exported.collections)) {\n return exported.collections;\n }\n // Or individual named exports\n const collections: EntityCollection[] = [];\n for (const value of Object.values(exported)) {\n if (value && typeof value === \"object\" && \"slug\" in (value as EntityCollection)) {\n collections.push(value as EntityCollection);\n }\n }\n if (collections.length > 0) return collections;\n }\n\n throw new Error(\n `Could not extract collections from ${indexPath}.\\n` +\n \"Expected a default export of EntityCollection[] or an object with named collection exports.\"\n );\n}\n\n/**\n * Write generated files to the output directory.\n */\nfunction writeFiles(outputDir: string, files: GeneratedFile[]): void {\n const absOutput = path.resolve(outputDir);\n\n // Create output directory\n fs.mkdirSync(absOutput, { recursive: true });\n\n for (const file of files) {\n const filePath = path.join(absOutput, file.path);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, file.content, \"utf-8\");\n }\n}\n\n/**\n * Main entry point for the generate-sdk command.\n */\nexport async function generateSdkCommand(args: GenerateSDKArgs): Promise<void> {\n const { collectionsDir, output, cwd } = args;\n\n const resolvedCollectionsDir = path.isAbsolute(collectionsDir)\n ? collectionsDir\n : path.join(cwd, collectionsDir);\n\n const resolvedOutput = path.isAbsolute(output)\n ? output\n : path.join(cwd, output);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔧 Rebase SDK Generator\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Collections:\")} ${resolvedCollectionsDir}`);\n console.log(` ${chalk.gray(\"Output:\")} ${resolvedOutput}`);\n console.log(\"\");\n\n // 1. Load collections\n console.log(chalk.cyan(\" → Loading collection definitions...\"));\n const collections = await loadCollections(resolvedCollectionsDir);\n\n // Sort collections alphabetically by slug to ensure deterministic SDK generation\n collections.sort((a, b) => a.slug.localeCompare(b.slug));\n\n if (collections.length === 0) {\n console.log(chalk.red(\" ✗ No collections found. Nothing to generate.\"));\n process.exit(1);\n }\n\n console.log(chalk.green(` ✓ Found ${collections.length} collection(s): ${collections.map(c => c.slug).join(\", \")}`));\n console.log(\"\");\n\n // 2. Generate SDK files\n console.log(chalk.cyan(\" → Generating SDK files...\"));\n const files = generateSDK(collections);\n console.log(chalk.green(` ✓ Generated ${files.length} file(s)`));\n\n // 3. Write to disk\n console.log(chalk.cyan(` → Writing to ${resolvedOutput}...`));\n writeFiles(resolvedOutput, files);\n\n console.log(\"\");\n console.log(chalk.green.bold(\" ✓ SDK generated successfully!\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage:\"));\n console.log(chalk.gray(\" import { createRebaseClient } from '@rebasepro/client';\"));\n console.log(chalk.gray(` import type { Database } from './${path.relative(cwd, path.join(resolvedOutput, \"database.types\"))}';`));\n console.log(\"\");\n console.log(chalk.gray(\" const rebase = createRebaseClient<Database>({\"));\n console.log(chalk.gray(\" baseUrl: 'http://localhost:3001',\"));\n console.log(chalk.gray(\" // token: 'your-jwt-token',\"));\n console.log(chalk.gray(\" });\"));\n console.log(\"\");\n console.log(chalk.gray(` const { data } = await rebase.collection('${collections[0]?.slug || \"my_collection\"}').find();`));\n console.log(\"\");\n}\n","/**\n * Project discovery utilities for the Rebase CLI.\n *\n * These helpers locate the project root, backend directory, .env file,\n * and local binaries — used by all CLI command modules.\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\n/**\n * Walk up from `startDir` to find the Rebase project root.\n *\n * The root is identified by a `package.json` that either:\n * - has `workspaces` containing \"backend\" or \"frontend\", OR\n * - has a sibling `backend/` directory\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const pkgPath = path.join(dir, \"package.json\");\n\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n // Check for workspace-based project (monorepo root)\n if (pkg.workspaces && Array.isArray(pkg.workspaces)) {\n const hasBackend = pkg.workspaces.some((w: string) =>\n w === \"backend\"\n );\n if (hasBackend) return dir;\n }\n } catch {\n // ignore parse errors\n }\n\n // Check for sibling backend directory\n if (fs.existsSync(path.join(dir, \"backend\")) && fs.existsSync(path.join(dir, \"config\"))) {\n return dir;\n }\n }\n\n dir = path.dirname(dir);\n }\n\n return null;\n}\n\n/**\n * Locate the backend directory within the project root.\n */\nexport function findBackendDir(projectRoot: string): string | null {\n const backendDir = path.join(projectRoot, \"backend\");\n return fs.existsSync(backendDir) ? backendDir : null;\n}\n\n/**\n * Detect the active backend plugin (e.g. @rebasepro/server-postgresql) from the backend's package.json.\n */\nexport function getActiveBackendPlugin(backendDir: string): string | null {\n const pkgPath = path.join(backendDir, \"package.json\");\n if (!fs.existsSync(pkgPath)) return null;\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies,\n...pkg.devDependencies };\n\n // Collect all @rebasepro/server-* driver plugins (exclude server-core)\n const candidates = Object.keys(deps).filter(\n dep => dep.startsWith(\"@rebasepro/server-\") && dep !== \"@rebasepro/server-core\"\n );\n\n if (candidates.length === 0) return null;\n\n // Prefer server-postgresql — it's the primary supported driver\n if (candidates.includes(\"@rebasepro/server-postgresql\")) {\n return \"@rebasepro/server-postgresql\";\n }\n\n // Fallback: return the first candidate that actually has a CLI entry point\n for (const candidate of candidates) {\n if (resolvePluginCliScript(backendDir, candidate)) {\n return candidate;\n }\n }\n\n // Last resort: return whatever we found\n return candidates[0];\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Resolve the active plugin's CLI script.\n */\nexport function resolvePluginCliScript(backendDir: string, pluginName: string): string | null {\n const candidates = [\n path.join(backendDir, \"node_modules\", pluginName, \"src\", \"cli.ts\"),\n path.join(backendDir, \"node_modules\", pluginName, \"dist\", \"cli.js\"),\n // For monorepo dev mode:\n path.resolve(backendDir, \"..\", \"..\", \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\"),\n path.resolve(backendDir, \"..\", \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\"),\n path.resolve(backendDir, \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Locate the frontend directory within the project root.\n */\nexport function findFrontendDir(projectRoot: string): string | null {\n const frontendDir = path.join(projectRoot, \"frontend\");\n return fs.existsSync(frontendDir) ? frontendDir : null;\n}\n\n/**\n * Find the .env file. Checks the project root first, then backend.\n */\nexport function findEnvFile(projectRoot: string): string | null {\n const candidates = [\n path.join(projectRoot, \".env\"),\n path.join(projectRoot, \"backend\", \".env\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Resolve a binary from the project's node_modules/.bin.\n * Checks backend, root, parent monorepo root, then falls back to PATH.\n */\nexport function resolveLocalBin(projectRoot: string, binName: string): string | null {\n const candidates = [\n path.join(projectRoot, \"backend\", \"node_modules\", \".bin\", binName),\n path.join(projectRoot, \"node_modules\", \".bin\", binName)\n ];\n\n // Also check parent directories (for monorepo setups where app/ is nested)\n let parent = path.dirname(projectRoot);\n const rootDir = path.parse(parent).root;\n while (parent !== rootDir) {\n candidates.push(path.join(parent, \"node_modules\", \".bin\", binName));\n parent = path.dirname(parent);\n }\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n // Fall back to globally installed binary via which\n try {\n const globalPath = execSync(`which ${binName}`, { encoding: \"utf-8\" }).trim();\n if (globalPath && fs.existsSync(globalPath)) return globalPath;\n } catch {\n // not found globally\n }\n\n return null;\n}\n\n/**\n * Resolve the tsx binary. Checks backend node_modules first, then root.\n */\nexport function resolveTsx(projectRoot: string): string | null {\n return resolveLocalBin(projectRoot, \"tsx\");\n}\n\n/**\n * Require the project root or exit with a helpful error.\n */\nexport function requireProjectRoot(): string {\n const root = findProjectRoot();\n if (!root) {\n console.error(chalk.red(\"✗ Could not find a Rebase project root.\"));\n console.error(chalk.gray(\" Make sure you are inside a Rebase project directory\"));\n console.error(chalk.gray(\" (one with backend/, frontend/, and config/ directories).\"));\n process.exit(1);\n }\n return root;\n}\n\n/**\n * Require the backend directory or exit with a helpful error.\n */\nexport function requireBackendDir(projectRoot: string): string {\n const backendDir = findBackendDir(projectRoot);\n if (!backendDir) {\n console.error(chalk.red(\"✗ Could not find a backend/ directory.\"));\n console.error(chalk.gray(` Expected at: ${path.join(projectRoot, \"backend\")}`));\n process.exit(1);\n }\n return backendDir;\n}\n","/**\n * CLI command: rebase schema <action>\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function schemaCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printSchemaHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n process.exit(1);\n }\n}\n\nfunction printSchemaHelp() {\n console.log(`\n${chalk.bold(\"rebase schema\")} — Schema management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase schema ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"generate\")} Generate Schema from collection definitions\n ${chalk.blue.bold(\"introspect\")} Introspect an existing database to generate collection definitions\n\n${chalk.green.bold(\"generate Options\")}\n ${chalk.blue(\"--collections, -c\")} Path to collections directory\n ${chalk.blue(\"--output, -o\")} Output path for generated schema\n ${chalk.blue(\"--watch, -w\")} Watch for changes and regenerate automatically\n\n${chalk.green.bold(\"introspect Options\")}\n ${chalk.blue(\"--output, -o\")} Output directory for generated collection files\n`);\n}\n","/**\n * CLI command: rebase db <action>\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function dbCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printDbHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n\nfunction printDbHelp() {\n console.log(`\n${chalk.bold(\"rebase db\")} — Database management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase db ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"push\")} Apply schema directly to database (development)\n ${chalk.blue.bold(\"generate\")} Generate migration files\n ${chalk.blue.bold(\"migrate\")} Run pending migrations\n ${chalk.blue.bold(\"branch\")} Database branching (create, list, delete, info)\n\n${chalk.green.bold(\"Examples\")}\n ${chalk.gray(\"# Quick development workflow\")}\n rebase schema generate && rebase db push\n\n ${chalk.gray(\"# Production migration workflow\")}\n rebase db generate\n rebase db migrate\n\n ${chalk.gray(\"# Create a database branch\")}\n rebase db branch create feature_auth\n`);\n}\n","/**\n * CLI command: rebase dev\n *\n * Starts the full development environment:\n * - Backend: tsx watch with auto-reload\n * - Frontend: vite dev server\n *\n * Both processes stream output with color-coded prefixes.\n *\n * When the backend uses port-retry (i.e. the configured port is busy and it\n * binds to the next free one), the CLI detects the actual port from stdout\n * and injects VITE_API_URL into the frontend so it connects automatically.\n *\n * Each project gets a deterministic default port derived from the project\n * root path, so multiple Rebase instances never collide.\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport { execa, execaCommandSync, type ResultPromise } from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {\n requireProjectRoot,\n findBackendDir,\n findFrontendDir,\n findEnvFile,\n resolveTsx,\n getActiveBackendPlugin,\n resolvePluginCliScript\n} from \"../utils/project\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\n\n/** Well-known filename the backend writes its actual port to. */\nconst DEV_PORT_FILENAME = \".rebase-dev-port\";\n\n/**\n * Compute a deterministic port from the project root path.\n * Range: 3001–3999 (avoids privileged ports and common services).\n * Two different project directories will almost always get different ports.\n */\nfunction getProjectPort(projectRoot: string): number {\n let hash = 0;\n for (let i = 0; i < projectRoot.length; i++) {\n hash = ((hash << 5) - hash + projectRoot.charCodeAt(i)) | 0;\n }\n return 3001 + (Math.abs(hash) % 999);\n}\n\n/**\n * Resolve the best starting port for this project:\n * 1. Explicit --port flag (highest priority)\n * 2. PORT env var\n * 3. Previously used port from .rebase-dev-port (port affinity across restarts)\n * 4. Deterministic hash from project path (unique per project)\n */\nfunction resolveStartPort(projectRoot: string, explicitPort?: number): number {\n // 1. Explicit flag\n if (explicitPort) return explicitPort;\n\n // 2. PORT env var\n if (process.env.PORT) return parseInt(process.env.PORT, 10);\n\n // 3. Port affinity — check if we wrote a port file from a previous run\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) {\n const saved = parseInt(fs.readFileSync(portFile, \"utf-8\").trim(), 10);\n if (saved > 0 && saved < 65536) return saved;\n }\n } catch { /* ignore */ }\n\n // 4. Deterministic hash\n return getProjectPort(projectRoot);\n}\n\nexport async function devCommand(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--backend-only\": Boolean,\n \"--frontend-only\": Boolean,\n \"--port\": Number,\n \"--generate\": Boolean,\n \"--help\": Boolean,\n \"-b\": \"--backend-only\",\n \"-f\": \"--frontend-only\",\n \"-p\": \"--port\",\n \"-g\": \"--generate\",\n \"-h\": \"--help\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node rebase dev\"\n permissive: true\n }\n );\n\n if (args[\"--help\"]) {\n printDevHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = findBackendDir(projectRoot);\n const frontendDir = findFrontendDir(projectRoot);\n const backendOnly = args[\"--backend-only\"] || false;\n const frontendOnly = args[\"--frontend-only\"] || false;\n const shouldGenerate = args[\"--generate\"] || process.env.REBASE_AUTO_GENERATE === \"true\" || process.env.REBASE_GENERATE === \"true\";\n\n // Resolve the port ONCE, before starting anything\n const startPort = resolveStartPort(projectRoot, args[\"--port\"]);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🚀 Rebase Dev Server\"));\n console.log(\"\");\n\n const children: ResultPromise[] = [];\n\n // --- State for printing the banner ---\n let frontendUrl = \"\";\n let backendUrl = \"\";\n let debounceSummary: NodeJS.Timeout | null = null;\n let bannerPrinted = false;\n\n /** Actual backend port, resolved once the server prints its URL. */\n let resolvedBackendPort: number | null = null;\n\n // Use regex to strip ANSI codes before matching\n // eslint-disable-next-line no-control-regex\n const stripAnsi = (str: string) => str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n\n function printSummary() {\n if (!frontendUrl || !backendUrl) return;\n if (debounceSummary) clearTimeout(debounceSummary);\n debounceSummary = setTimeout(() => {\n if (bannerPrinted) return;\n console.log(\"\");\n console.log(chalk.cyan(\"┌────────────────────────────────────────────────────────────┐\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"│ ✦ Rebase Admin App is ready! │\"));\n const cleanUrl = stripAnsi(frontendUrl);\n const paddedUrl = cleanUrl.padEnd(41);\n console.log(chalk.cyan(\"│ ➜ Frontend URL: \") + chalk.white(paddedUrl) + chalk.cyan(\"│\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"└────────────────────────────────────────────────────────────┘\"));\n console.log(\"\");\n bannerPrinted = true;\n }, 500);\n }\n\n // Handle graceful shutdown\n const cleanup = () => {\n // Clean up dev port file\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) fs.unlinkSync(portFile);\n\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n if (fs.existsSync(urlFile)) fs.unlinkSync(urlFile);\n } catch { /* ignore */ }\n\n children.forEach((child) => {\n if (child.pid && !child.killed) {\n try {\n if (process.platform === \"win32\") {\n execaCommandSync(`taskkill /pid ${child.pid} /T /F`);\n } else {\n process.kill(-child.pid, \"SIGKILL\");\n }\n } catch (e) {\n try {\n child.kill(\"SIGKILL\");\n } catch (err) {\n // ignore\n }\n }\n }\n });\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n /**\n * Start the Vite frontend, optionally injecting the backend port.\n */\n function startFrontend(backendPort: number | null) {\n if (!frontendDir) return;\n\n console.log(` ${chalk.magenta(\"▶\")} Frontend: ${chalk.gray(frontendDir)}`);\n\n const frontendEnv: Record<string, string> = { ...process.env as Record<string, string> };\n\n // Inject the resolved backend URL so Vite picks it up\n if (backendPort) {\n frontendEnv.VITE_API_URL = `http://localhost:${backendPort}`;\n console.log(` ${chalk.gray(\"↳ VITE_API_URL\")} = ${chalk.white(`http://localhost:${backendPort}`)}`);\n }\n\n const pm = detectPackageManager(projectRoot);\n const pmCmds = getPMCommands(pm);\n const runDevCmd = pmCmds.run(\"dev\");\n\n const frontendChild = execa(\n runDevCmd[0],\n runDevCmd.slice(1),\n {\n cwd: frontendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: frontendEnv,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n frontendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n frontendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const urlMatch = cleanLine.match(/(http:\\/\\/(?:localhost|127\\.0\\.0\\.1):\\d+)/);\n if (cleanLine.includes(\"Local:\") && urlMatch) {\n frontendUrl = urlMatch[1];\n printSummary();\n }\n });\n });\n\n frontendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n });\n });\n\n children.push(frontendChild);\n }\n\n // Start backend\n if (!frontendOnly && backendDir) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n const pmCmdsLocal = getPMCommands(detectPackageManager(projectRoot));\n const addCmd = [...pmCmdsLocal.install, \"-D\", \"tsx\"].join(\" \");\n console.error(chalk.red(\" ✗ Could not find tsx binary for backend.\"));\n console.error(chalk.gray(` Install it with: ${addCmd}`));\n process.exit(1);\n }\n\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n // Always inject PORT so the backend uses our resolved port instead of\n // its hardcoded default (3001). This prevents cross-project collisions\n // when multiple Rebase instances run simultaneously.\n env.PORT = String(startPort);\n\n console.log(` ${chalk.cyan(\"▶\")} Backend: ${chalk.gray(backendDir)}`);\n console.log(` ${chalk.gray(\"↳ PORT\")} = ${chalk.white(String(startPort))}`);\n\n /** Whether the frontend has been launched (we only launch it once). */\n let frontendLaunched = false;\n\n // Initial schema and SDK generation (disabled by default, enabled via --generate or env var)\n if (shouldGenerate) {\n console.log(chalk.gray(\" → Ensuring schema and SDK are generated on start...\"));\n try {\n const activePlugin = getActiveBackendPlugin(backendDir);\n const pluginCli = activePlugin ? resolvePluginCliScript(backendDir, activePlugin) : null;\n if (pluginCli) {\n await execa(tsxBin, [pluginCli, \"schema\", \"generate\"], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n const sdkCmd = getPMCommands(detectPackageManager(projectRoot)).exec(\"rebase\", [\"generate-sdk\"]);\n await execa(sdkCmd[0], sdkCmd.slice(1), {\n cwd: projectRoot,\n stdio: \"inherit\",\n env\n });\n console.log(chalk.green(\" ✓ Initial schema and SDK generated successfully.\\n\"));\n } catch (err: unknown) {\n console.error(chalk.red(` ✗ Initial schema/SDK generation failed: ${err instanceof Error ? err.message : err}\\n`));\n }\n\n // Watch collections folder for changes\n const collectionsDir = path.join(projectRoot, \"config\", \"collections\");\n if (fs.existsSync(collectionsDir)) {\n let watchDebounce: NodeJS.Timeout | null = null;\n fs.watch(collectionsDir, { recursive: true }, (eventType, filename) => {\n if (!filename || filename.startsWith(\".\") || filename.endsWith(\".tmp\")) return;\n\n if (watchDebounce) clearTimeout(watchDebounce);\n watchDebounce = setTimeout(async () => {\n console.log(chalk.yellow(`\\n 🔄 Collection change detected (${filename}). Regenerating schema & SDK...`));\n try {\n const activePlugin = getActiveBackendPlugin(backendDir);\n const pluginCli = activePlugin ? resolvePluginCliScript(backendDir, activePlugin) : null;\n if (pluginCli) {\n await execa(tsxBin, [pluginCli, \"schema\", \"generate\"], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n const sdkCmd = getPMCommands(detectPackageManager(projectRoot)).exec(\"rebase\", [\"generate-sdk\"]);\n await execa(sdkCmd[0], sdkCmd.slice(1), {\n cwd: projectRoot,\n stdio: \"inherit\",\n env\n });\n console.log(chalk.green(\" ✓ Schema & SDK regenerated successfully. Hono will reload.\"));\n } catch (err: unknown) {\n console.error(chalk.red(` ✗ Failed to regenerate schema/SDK: ${err instanceof Error ? err.message : err}`));\n }\n }, 300);\n });\n }\n }\n\n const watchArgs = [\"watch\", \"--conditions\", \"development\", \"src/index.ts\"];\n if (!shouldGenerate) {\n // When auto-generation is disabled, watch the config/collections dir directly so the dev server\n // still reloads automatically when files there are edited/updated manually.\n watchArgs.splice(1, 0, `--watch=\"${path.join(\"..\", \"config\", \"**\", \"*\")}\"`);\n\n // Watch collections folder and warn about potential schema drift\n const collectionsDir = path.join(projectRoot, \"config\", \"collections\");\n if (fs.existsSync(collectionsDir)) {\n let driftDebounce: NodeJS.Timeout | null = null;\n fs.watch(collectionsDir, { recursive: true }, (_eventType, filename) => {\n if (!filename || filename.startsWith(\".\") || filename.endsWith(\".tmp\")) return;\n if (driftDebounce) clearTimeout(driftDebounce);\n driftDebounce = setTimeout(() => {\n console.log([\n \"\",\n chalk.yellow(\" ┌──────────────────────────────────────────────────────────────┐\"),\n chalk.yellow(\" │ ⚠️ Collection file changed: \") + chalk.white(filename!.padEnd(31)) + chalk.yellow(\"│\"),\n chalk.yellow(\" │ │\"),\n chalk.yellow(\" │ Your schema may be out of sync. Run: │\"),\n chalk.yellow(\" │ \") + chalk.cyan(\"rebase schema generate\") + chalk.yellow(\" regenerate Drizzle schema │\"),\n chalk.yellow(\" │ \") + chalk.cyan(\"rebase db push \") + chalk.yellow(\" sync schema to database │\"),\n chalk.yellow(\" │ \") + chalk.cyan(\"rebase doctor \") + chalk.yellow(\" check for drift │\"),\n chalk.yellow(\" │ │\"),\n chalk.yellow(\" │ TIP: Use \") + chalk.bold(\"rebase dev --generate\") + chalk.yellow(\" for auto-regeneration │\"),\n chalk.yellow(\" └──────────────────────────────────────────────────────────────┘\"),\n \"\"\n ].join(\"\\n\"));\n }, 500);\n });\n }\n }\n\n const backendChild = execa(\n tsxBin,\n watchArgs,\n {\n cwd: backendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n backendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n backendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const serverMatch = cleanLine.match(/Server running at http:\\/\\/(?:localhost|127\\.0\\.0\\.1):(\\d+)/);\n if (serverMatch) {\n resolvedBackendPort = parseInt(serverMatch[1], 10);\n backendUrl = \"started\";\n printSummary();\n\n // Save the url to a temp file for scripts to pick up\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n fs.writeFileSync(urlFile, `http://localhost:${resolvedBackendPort}`, \"utf-8\");\n\n // Save the port to .rebase-dev-port for port affinity\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n fs.writeFileSync(portFile, String(resolvedBackendPort), \"utf-8\");\n\n // Start frontend now that we know the real port\n if (!backendOnly && frontendDir && !frontendLaunched) {\n frontendLaunched = true;\n startFrontend(resolvedBackendPort);\n }\n }\n });\n });\n\n backendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n });\n });\n\n children.push(backendChild);\n } else if (!frontendOnly && !backendDir) {\n console.warn(chalk.yellow(\" ⚠ No backend/ directory found, skipping backend.\"));\n }\n\n // Start frontend immediately if backend-only mode or no backend\n if (!backendOnly && frontendDir && (frontendOnly || !backendDir)) {\n startFrontend(null);\n } else if (!backendOnly && !frontendDir) {\n console.warn(chalk.yellow(\" ⚠ No frontend/ directory found, skipping frontend.\"));\n }\n\n if (children.length === 0) {\n console.error(chalk.red(\" ✗ Nothing to start. Check your project structure.\"));\n process.exit(1);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\" Press Ctrl+C to stop all servers.\"));\n console.log(\"\");\n\n // Wait for all children to exit\n await Promise.all(\n children.map(\n (child) =>\n new Promise<void>((resolve) => {\n child.finally(() => resolve());\n })\n )\n );\n}\n\nfunction printDevHelp() {\n console.log(`\n${chalk.bold(\"rebase dev\")} — Start the development server\n\n${chalk.green.bold(\"Usage\")}\n rebase dev [options]\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--backend-only, -b\")} Only start the backend server\n ${chalk.blue(\"--frontend-only, -f\")} Only start the frontend server\n ${chalk.blue(\"--port, -p\")} Backend port (default: auto-detected per project)\n ${chalk.blue(\"--generate, -g\")} Enable automatic schema and SDK generation on startup and file changes\n\n${chalk.green.bold(\"Description\")}\n Starts both the backend (tsx watch + Hono) and frontend (Vite)\n dev servers concurrently with color-coded output prefixes.\n\n Each project automatically receives a unique default port derived\n from its directory path, preventing collisions when running multiple\n Rebase instances simultaneously.\n\n If the assigned port is already in use, the server will automatically\n try the next available port. The frontend is started only after the\n backend is ready, and VITE_API_URL is injected automatically.\n\n By default, automatic schema and SDK generation is disabled on startup\n and file changes. Pass --generate (-g) or set REBASE_AUTO_GENERATE=true\n in your environment to enable it.\n`);\n}\n","/**\n * CLI command: rebase build\n *\n * Runs the build script in all workspace packages.\n * Automatically detects the package manager (pnpm or npm) and\n * uses the correct workspace-aware command.\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport { requireProjectRoot } from \"../utils/project\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\n\nexport async function buildCommand(): Promise<void> {\n const projectRoot = requireProjectRoot();\n const pm = detectPackageManager(projectRoot);\n const cmds = getPMCommands(pm);\n\n const buildCmd = cmds.runAll(\"build\");\n\n console.log(`${chalk.bold(\"Rebase\")} — Building all workspaces with ${chalk.cyan(pm)}...\\n`);\n\n try {\n await execa(buildCmd[0], buildCmd.slice(1), {\n cwd: projectRoot,\n stdio: \"inherit\"\n });\n } catch {\n console.error(chalk.red(\"\\n✗ Build failed.\"));\n process.exit(1);\n }\n}\n","/**\n * CLI command: rebase start\n *\n * Starts the backend server in production mode.\n * Automatically detects the package manager (pnpm or npm) and\n * runs the start script in the backend workspace.\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport { requireProjectRoot, findEnvFile } from \"../utils/project\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\n\nexport async function startCommand(): Promise<void> {\n const projectRoot = requireProjectRoot();\n const pm = detectPackageManager(projectRoot);\n const cmds = getPMCommands(pm);\n\n const startCmd = cmds.runWorkspace(\"backend\", \"start\");\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n console.log(`${chalk.bold(\"Rebase\")} — Starting backend server...\\n`);\n\n try {\n await execa(startCmd[0], startCmd.slice(1), {\n cwd: projectRoot,\n stdio: \"inherit\",\n env\n });\n } catch {\n console.error(chalk.red(\"\\n✗ Failed to start server.\"));\n process.exit(1);\n }\n}\n","/**\n * CLI command: rebase auth <action>\n *\n * Subcommands:\n * reset-password — Reset a user's password\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { spawn } from \"child_process\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\nexport async function authCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printAuthHelp();\n return;\n }\n\n switch (subcommand) {\n case \"reset-password\":\n await resetPassword(rawArgs);\n break;\n default:\n console.error(chalk.red(`Unknown auth command: ${subcommand}`));\n console.log(\"\");\n printAuthHelp();\n process.exit(1);\n }\n}\n\nasync function resetPassword(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--email\": String,\n \"--password\": String,\n \"-e\": \"--email\",\n \"-p\": \"--password\"\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase auth reset-password\"\n permissive: true\n }\n );\n\n // Support both --email flag and positional args\n const email = args[\"--email\"] || args._[0];\n const newPassword = args[\"--password\"] || args._[1];\n\n if (!email) {\n console.error(chalk.red(\"✗ Email is required.\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage: rebase auth reset-password <email> [new-password]\"));\n console.log(chalk.gray(\" rebase auth reset-password --email user@example.com --password NewPass123!\"));\n process.exit(1);\n }\n\n const projectRoot = requireProjectRoot();\n\n // 1. Try API-first reset\n let envServiceKey: string | undefined;\n const envFile = findEnvFile(projectRoot);\n if (envFile && fs.existsSync(envFile)) {\n try {\n const envContent = fs.readFileSync(envFile, \"utf8\");\n const match = envContent.match(/^\\s*REBASE_SERVICE_KEY\\s*=\\s*['\"]?(.*?)['\"]?\\s*$/m);\n if (match && match[1]) {\n envServiceKey = match[1];\n }\n } catch {\n // Ignore\n }\n }\n\n let baseUrl = process.env.REBASE_BASE_URL;\n let serviceKey = process.env.REBASE_SERVICE_KEY || envServiceKey;\n\n const statePath = path.join(projectRoot, \".rebase\", \"state.json\");\n if (fs.existsSync(statePath)) {\n try {\n const state = JSON.parse(fs.readFileSync(statePath, \"utf8\")) as Record<string, unknown>;\n if (state && typeof state === \"object\") {\n if (typeof state.baseUrl === \"string\" && !baseUrl) {\n baseUrl = state.baseUrl;\n }\n if (typeof state.serviceKey === \"string\" && !serviceKey) {\n serviceKey = state.serviceKey;\n }\n }\n } catch {\n // Ignore\n }\n }\n\n const devUrlPath = path.join(projectRoot, \".rebase-dev-url\");\n if (fs.existsSync(devUrlPath) && !baseUrl) {\n try {\n baseUrl = fs.readFileSync(devUrlPath, \"utf8\").trim();\n } catch {\n // Ignore\n }\n }\n\n if (baseUrl && serviceKey) {\n console.log(\"Trying API-first reset via running backend...\");\n try {\n const finalPass = newPassword || \"NewPassword123!\";\n const cleanBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n const searchUrl = `${cleanBaseUrl}/api/admin/users?search=${encodeURIComponent(email)}&limit=1`;\n const searchRes = await fetch(searchUrl, {\n headers: {\n \"Authorization\": `Bearer ${serviceKey}`,\n \"Accept\": \"application/json\"\n }\n });\n if (!searchRes.ok) {\n throw new Error(`Failed to list users: ${searchRes.statusText}`);\n }\n const searchData = await searchRes.json() as unknown;\n if (!searchData || typeof searchData !== \"object\") {\n throw new Error(\"Invalid response format from user search API.\");\n }\n \n let userId: string | undefined;\n if (Array.isArray(searchData)) {\n const firstUser = searchData[0] as unknown;\n if (firstUser && typeof firstUser === \"object\" && \"id\" in firstUser && typeof (firstUser as { id: unknown }).id === \"string\") {\n userId = (firstUser as { id: string }).id;\n } else if (firstUser && typeof firstUser === \"object\" && \"uid\" in firstUser && typeof (firstUser as { uid: unknown }).uid === \"string\") {\n userId = (firstUser as { uid: string }).uid;\n }\n } else if (\"users\" in searchData && Array.isArray((searchData as { users: unknown }).users)) {\n const users = (searchData as { users: unknown[] }).users;\n const firstUser = users[0];\n if (firstUser && typeof firstUser === \"object\" && \"id\" in firstUser && typeof (firstUser as { id: unknown }).id === \"string\") {\n userId = (firstUser as { id: string }).id;\n } else if (firstUser && typeof firstUser === \"object\" && \"uid\" in firstUser && typeof (firstUser as { uid: unknown }).uid === \"string\") {\n userId = (firstUser as { uid: string }).uid;\n }\n }\n\n if (!userId) {\n throw new Error(`User not found with email: ${email}`);\n }\n\n const resetUrl = `${cleanBaseUrl}/api/admin/users/${userId}/reset-password`;\n const resetRes = await fetch(resetUrl, {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${serviceKey}`,\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n },\n body: JSON.stringify({ password: finalPass })\n });\n\n if (!resetRes.ok) {\n const errText = await resetRes.text();\n throw new Error(`Password reset endpoint failed: ${errText || resetRes.statusText}`);\n }\n\n console.log(\"API reset successful.\");\n console.log(chalk.bold(\" 🔑 Rebase Auth — Reset Password (via API)\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Email:\")} ${email}`);\n console.log(` ${chalk.gray(\"Password:\")} ${finalPass}`);\n console.log(\"\");\n return;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.warn(chalk.yellow(\"API reset failed, falling back to direct database update...\"));\n console.warn(chalk.gray(` Details: ${errMsg}`));\n }\n }\n\n // 2. Direct-DB Fallback\n const backendDir = requireBackendDir(projectRoot);\n const tsxBin = resolveTsx(projectRoot);\n\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n\n try {\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n env.REBASE_RESET_EMAIL = email;\n env.REBASE_RESET_PASSWORD = newPassword || \"NewPassword123!\";\n env.REBASE_ENV_FILE_PATH = envFile || path.join(projectRoot, \".env\");\n\n const scriptContent = `\nimport { createPostgresDatabaseConnection } from \"@rebasepro/server-postgresql\";\nimport { hashPassword } from \"@rebasepro/server-core\";\nimport { eq } from \"drizzle-orm\";\nimport * as dotenv from \"dotenv\";\nimport path from \"path\";\nimport fs from \"fs\";\n\ndotenv.config({ path: process.env.REBASE_ENV_FILE_PATH });\n\nconst email = process.env.REBASE_RESET_EMAIL!;\nconst newPassword = process.env.REBASE_RESET_PASSWORD!;\n\nasync function resetPassword() {\n const { db } = createPostgresDatabaseConnection(process.env.DATABASE_URL!);\n const hash = await hashPassword(newPassword);\n\n let usersTable;\n try {\n const schemaPath = path.resolve(\"./src/schema.generated.ts\");\n if (fs.existsSync(schemaPath)) {\n const schema = await import(\"file://\" + schemaPath);\n usersTable = schema.users || schema.tables?.users;\n }\n } catch (e) {\n // ignore and fallback\n }\n\n if (!usersTable) {\n const pgServer = await import(\"@rebasepro/server-postgresql\");\n usersTable = pgServer.users;\n }\n\n const passwordHashKey = (usersTable.passwordHash || \"passwordHash\" in usersTable) ? \"passwordHash\" : \"password_hash\";\n\n const result = await db.update(usersTable)\n .set({ [passwordHashKey]: hash })\n .where(eq(usersTable.email, email))\n .returning({\n id: usersTable.id,\n email: usersTable.email\n });\n\n if (result.length > 0) {\n console.log(\"✅ Password reset for: \" + result[0].email);\n ${!newPassword ? 'console.log(\" New password: \" + newPassword);' : \"\"}\n } else {\n console.log(\"✗ User not found: \" + email);\n }\n process.exit(0);\n}\n\nresetPassword().catch(console.error);\n`;\n\n const tmpScriptPath = path.join(backendDir, \".tmp-reset-password.ts\");\n fs.writeFileSync(tmpScriptPath, scriptContent, \"utf-8\");\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔑 Rebase Auth — Reset Password (Direct DB Fallback)\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Email:\")} ${email}`);\n if (newPassword) {\n console.log(` ${chalk.gray(\"Password:\")} ${\"*\".repeat(newPassword.length)}`);\n }\n console.log(\"\");\n\n const child = spawn(tsxBin, [tmpScriptPath], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n\n return new Promise((resolve) => {\n child.on(\"close\", (code) => {\n // Clean up temp script\n try { fs.unlinkSync(tmpScriptPath); } catch { /* ignore */ }\n if (code !== 0) {\n process.exit(code ?? 1);\n }\n resolve();\n });\n });\n } catch (err) {\n console.error(chalk.red(\"✗ Direct database update failed.\"));\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\nfunction printAuthHelp() {\n console.log(`\n${chalk.bold(\"rebase auth\")} — Authentication management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase auth ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"reset-password\")} Reset a user's password\n\n${chalk.green.bold(\"reset-password Options\")}\n ${chalk.blue(\"--email, -e\")} User's email address\n ${chalk.blue(\"--password, -p\")} New password (default: NewPassword123!)\n\n${chalk.green.bold(\"Examples\")}\n rebase auth reset-password user@example.com\n rebase auth reset-password --email user@example.com --password MyNewPass!\n`);\n}\n","/**\n * CLI command: rebase doctor\n *\n * Detects three-way schema drift between collection definitions,\n * the generated Drizzle schema, and the live PostgreSQL database.\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function doctorCommand(rawArgs: string[]): Promise<void> {\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport inquirer from \"inquirer\";\nimport { createRequire } from \"module\";\n\nconst require = createRequire(import.meta.url);\n\n/** Supported agent environments and their target directories. */\nconst AGENTS = {\n cursor: {\n label: \"Cursor\",\n detectDir: \".cursor\",\n targetDir: \".cursor/rules\",\n /** Cursor uses .mdc files (Markdown with Context). */\n transformFile: (skillName: string, content: string) => ({\n fileName: `${skillName}.mdc`,\n content\n })\n },\n claude: {\n label: \"Claude Code\",\n detectDir: \".claude\",\n targetDir: \".claude/skills\",\n /** Claude Code uses the standard SKILL.md format in subdirectories. */\n transformFile: (skillName: string, content: string) => ({\n fileName: path.join(skillName, \"SKILL.md\"),\n content\n })\n },\n windsurf: {\n label: \"Windsurf\",\n detectDir: \".windsurf\",\n targetDir: \".windsurf/rules\",\n /** Windsurf uses plain .md files. */\n transformFile: (skillName: string, content: string) => ({\n fileName: `${skillName}.md`,\n content\n })\n },\n gemini: {\n label: \"Gemini CLI / Antigravity\",\n detectDir: \".agents\",\n targetDir: \".agents/skills\",\n /** Gemini uses the standard SKILL.md format in subdirectories. */\n transformFile: (skillName: string, content: string) => ({\n fileName: path.join(skillName, \"SKILL.md\"),\n content\n })\n }\n} as const;\n\ntype AgentKey = keyof typeof AGENTS;\n\n/**\n * Resolve the path to the skills directory from @rebasepro/agent-skills.\n * Works in both workspace (symlink) and published (real files) layouts.\n */\nfunction getSkillsSourceDir(): string {\n const pkgJsonPath = require.resolve(\"@rebasepro/agent-skills/package.json\");\n const pkgRoot = path.dirname(pkgJsonPath);\n const skillsDir = path.join(pkgRoot, \"skills\");\n\n if (!fs.existsSync(skillsDir)) {\n throw new Error(\n `Skills directory not found at ${skillsDir}. ` +\n `Make sure @rebasepro/agent-skills is installed.`\n );\n }\n\n return skillsDir;\n}\n\n/** Read all skill directories and return their names + content. */\nfunction loadSkills(skillsDir: string): Array<{ name: string; content: string }> {\n const entries = fs.readdirSync(skillsDir, { withFileTypes: true });\n const skills: Array<{ name: string; content: string }> = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillMdPath = path.join(skillsDir, entry.name, \"SKILL.md\");\n if (!fs.existsSync(skillMdPath)) continue;\n skills.push({\n name: entry.name,\n content: fs.readFileSync(skillMdPath, \"utf-8\")\n });\n }\n\n return skills;\n}\n\n/** Detect which agent environments already exist in the project. */\nfunction detectAgents(projectDir: string): AgentKey[] {\n const detected: AgentKey[] = [];\n for (const [key, agent] of Object.entries(AGENTS)) {\n if (fs.existsSync(path.join(projectDir, agent.detectDir))) {\n detected.push(key as AgentKey);\n }\n }\n return detected;\n}\n\n/** Install skills for a specific agent into the project directory. */\nfunction installForAgent(\n agentKey: AgentKey,\n skills: Array<{ name: string; content: string }>,\n projectDir: string\n): number {\n const agent = AGENTS[agentKey];\n const targetBase = path.join(projectDir, agent.targetDir);\n\n // Ensure the target directory exists\n fs.mkdirSync(targetBase, { recursive: true });\n\n let count = 0;\n for (const skill of skills) {\n const { fileName, content } = agent.transformFile(skill.name, skill.content);\n const targetPath = path.join(targetBase, fileName);\n\n // Ensure parent directory exists (for subdirectory-based formats)\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, content, \"utf-8\");\n count++;\n }\n\n return count;\n}\n\nexport async function skillsCommand(subcommand: string | undefined, _args: string[]) {\n switch (subcommand) {\n case \"install\":\n await skillsInstall();\n break;\n case \"--help\":\n case undefined:\n printSkillsHelp();\n break;\n default:\n console.log(chalk.red(`Unknown skills subcommand: ${subcommand}`));\n console.log(\"\");\n printSkillsHelp();\n }\n}\n\nasync function skillsInstall() {\n const projectDir = process.cwd();\n\n // 1. Load skills from @rebasepro/agent-skills\n let skillsDir: string;\n try {\n skillsDir = getSkillsSourceDir();\n } catch (err) {\n console.error(`${chalk.red.bold(\"ERROR\")} ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n const skills = loadSkills(skillsDir);\n if (skills.length === 0) {\n console.error(`${chalk.red.bold(\"ERROR\")} No skills found in ${skillsDir}`);\n process.exit(1);\n }\n\n // 2. Detect existing agent environments\n let agents = detectAgents(projectDir);\n\n // 3. If none detected, ask the user\n if (agents.length === 0) {\n const choices = Object.entries(AGENTS).map(([key, agent]) => ({\n name: agent.label,\n value: key,\n checked: false\n }));\n\n const { selectedAgents } = await inquirer.prompt([{\n type: \"checkbox\",\n name: \"selectedAgents\",\n message: \"No AI agent configuration detected. Which agents do you use?\",\n choices,\n validate: (input: string[]) => {\n if (input.length === 0) return \"Please select at least one agent.\";\n return true;\n }\n }]);\n\n agents = selectedAgents as AgentKey[];\n }\n\n // 4. Install skills for each agent\n console.log(\"\");\n console.log(chalk.gray(` Found ${chalk.white(skills.length)} Rebase skills`));\n console.log(\"\");\n\n for (const agentKey of agents) {\n const agent = AGENTS[agentKey];\n const count = installForAgent(agentKey, skills, projectDir);\n console.log(` ${chalk.green(\"✓\")} ${chalk.bold(agent.label)} — ${count} skills installed to ${chalk.gray(agent.targetDir)}`);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\" Skills are project-local. Commit them to share with your team.\"));\n console.log(chalk.gray(\" Re-run this command anytime to update to the latest skills.\"));\n console.log(\"\");\n}\n\nfunction printSkillsHelp() {\n console.log(`\n${chalk.bold(\"rebase skills\")} — Manage AI agent skills\n\n${chalk.green.bold(\"Usage\")}\n rebase skills ${chalk.blue(\"<subcommand>\")}\n\n${chalk.green.bold(\"Subcommands\")}\n ${chalk.blue.bold(\"install\")} Install Rebase agent skills for your AI coding assistant\n Supports: Cursor, Claude Code, Windsurf, Gemini CLI, Antigravity\n\n${chalk.green.bold(\"Examples\")}\n ${chalk.cyan(\"rebase skills install\")}\n`);\n}\n","/**\n * CLI command: rebase api-keys <action>\n *\n * Subcommands:\n * list — List all API keys (masked)\n * create — Create a new API key\n * revoke — Revoke an existing API key\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport {\n requireProjectRoot,\n findEnvFile\n} from \"../utils/project\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n/* ═══════════════════════════════════════════════════════════════\n Env helper — reads SERVICE_KEY and PORT from .env\n ═══════════════════════════════════════════════════════════════ */\n\nfunction loadEnv(projectRoot: string): Record<string, string> {\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = {};\n if (envFile && fs.existsSync(envFile)) {\n const content = fs.readFileSync(envFile, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const idx = trimmed.indexOf(\"=\");\n if (idx > 0) {\n const key = trimmed.slice(0, idx).trim();\n let value = trimmed.slice(idx + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n env[key] = value;\n }\n }\n }\n return env;\n}\n\nfunction resolveBaseUrl(env: Record<string, string>): string {\n const port = env.PORT || env.REBASE_PORT || \"3001\";\n return env.REBASE_BASE_URL || `http://localhost:${port}`;\n}\n\n/* ═══════════════════════════════════════════════════════════════\n Entry\n ═══════════════════════════════════════════════════════════════ */\n\nexport async function apiKeysCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printApiKeysHelp();\n return;\n }\n\n switch (subcommand) {\n case \"list\":\n await listKeys(rawArgs);\n break;\n case \"create\":\n await createKey(rawArgs);\n break;\n case \"revoke\":\n await revokeKey(rawArgs);\n break;\n default:\n console.error(chalk.red(`Unknown api-keys command: ${subcommand}`));\n console.log(\"\");\n printApiKeysHelp();\n process.exit(1);\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n list\n ═══════════════════════════════════════════════════════════════ */\n\nasync function listKeys(_rawArgs: string[]): Promise<void> {\n const projectRoot = requireProjectRoot();\n const env = loadEnv(projectRoot);\n const baseUrl = resolveBaseUrl(env);\n const serviceKey = env.SERVICE_KEY || env.REBASE_SERVICE_KEY;\n\n if (!serviceKey) {\n console.error(chalk.red(\"✗ SERVICE_KEY not found in .env — required for admin operations.\"));\n process.exit(1);\n }\n\n try {\n const res = await fetch(`${baseUrl}/api/admin/api-keys`, {\n headers: { Authorization: `Bearer ${serviceKey}` }\n });\n if (!res.ok) {\n const body = await res.text();\n console.error(chalk.red(`✗ Failed to list API keys: ${res.status} ${body}`));\n process.exit(1);\n }\n\n const { keys } = await res.json() as { keys: Array<{\n id: string; name: string; key_prefix: string;\n permissions: Array<{ collection: string; operations: string[] }>;\n rate_limit: number | null; revoked_at: string | null;\n expires_at: string | null; last_used_at: string | null;\n created_at: string;\n }>};\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔑 API Keys\"));\n console.log(\"\");\n\n if (keys.length === 0) {\n console.log(chalk.gray(\" No API keys found.\"));\n console.log(\"\");\n return;\n }\n\n for (const key of keys) {\n const status = key.revoked_at ? chalk.red(\"revoked\")\n : (key.expires_at && new Date(key.expires_at) < new Date()) ? chalk.yellow(\"expired\")\n : chalk.green(\"active\");\n\n const perms = key.permissions.map(p =>\n `${p.collection}(${p.operations.join(\",\")})`\n ).join(\", \");\n\n console.log(` ${chalk.bold(key.name)} ${chalk.gray(`[${key.key_prefix}•••]`)} ${status}`);\n console.log(` ${chalk.gray(\"ID:\")} ${key.id}`);\n console.log(` ${chalk.gray(\"Permissions:\")} ${perms || \"none\"}`);\n console.log(` ${chalk.gray(\"Created:\")} ${new Date(key.created_at).toLocaleDateString()}`);\n if (key.last_used_at) {\n console.log(` ${chalk.gray(\"Last used:\")} ${new Date(key.last_used_at).toLocaleDateString()}`);\n }\n console.log(\"\");\n }\n } catch (e: unknown) {\n console.error(chalk.red(`✗ ${e instanceof Error ? e.message : String(e)}`));\n console.error(chalk.gray(\" Is the Rebase server running?\"));\n process.exit(1);\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n create\n ═══════════════════════════════════════════════════════════════ */\n\nasync function createKey(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--name\": String,\n \"--permissions\": String,\n \"--admin\": Boolean,\n \"--rate-limit\": Number,\n \"--expires\": String,\n \"-n\": \"--name\"\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase api-keys create\"\n permissive: true\n }\n );\n\n const name = args[\"--name\"] || args._[0];\n const permissionsRaw = args[\"--permissions\"];\n\n if (!name) {\n console.error(chalk.red(\"✗ Name is required.\"));\n console.log(\"\");\n console.log(chalk.gray(' Usage: rebase api-keys create --name \"My Key\" --permissions \\'[{\"collection\":\"*\",\"operations\":[\"read\"]}]\\''));\n process.exit(1);\n }\n\n let permissions: Array<{ collection: string; operations: string[] }>;\n if (permissionsRaw) {\n try {\n permissions = JSON.parse(permissionsRaw);\n } catch {\n console.error(chalk.red(\"✗ Invalid --permissions JSON.\"));\n console.log(chalk.gray(' Example: \\'[{\"collection\":\"*\",\"operations\":[\"read\",\"write\"]}]\\''));\n process.exit(1);\n return; // unreachable but satisfies TS\n }\n } else {\n // Default: full access to all collections\n permissions = [{ collection: \"*\", operations: [\"read\", \"write\", \"delete\"] }];\n }\n\n let expires_at: string | null = null;\n const expiresFlag = args[\"--expires\"];\n if (expiresFlag) {\n const days: Record<string, number> = { \"7d\": 7, \"30d\": 30, \"90d\": 90, \"1y\": 365 };\n if (days[expiresFlag]) {\n expires_at = new Date(Date.now() + days[expiresFlag] * 86400000).toISOString();\n } else {\n const parsed = new Date(expiresFlag);\n if (isNaN(parsed.getTime())) {\n console.error(chalk.red(\"✗ Invalid --expires value. Use 7d, 30d, 90d, 1y, or an ISO date.\"));\n process.exit(1);\n }\n expires_at = parsed.toISOString();\n }\n }\n\n const projectRoot = requireProjectRoot();\n const env = loadEnv(projectRoot);\n const baseUrl = resolveBaseUrl(env);\n const serviceKey = env.SERVICE_KEY || env.REBASE_SERVICE_KEY;\n\n if (!serviceKey) {\n console.error(chalk.red(\"✗ SERVICE_KEY not found in .env — required for admin operations.\"));\n process.exit(1);\n }\n\n try {\n const body: Record<string, unknown> = {\n name,\n permissions,\n admin: args[\"--admin\"] ?? false,\n rate_limit: args[\"--rate-limit\"] ?? null,\n expires_at\n };\n\n const res = await fetch(`${baseUrl}/api/admin/api-keys`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${serviceKey}`,\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body)\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n console.error(chalk.red(`✗ Failed to create API key: ${res.status} ${errBody}`));\n process.exit(1);\n }\n\n const { key } = await res.json() as { key: { name: string; key: string; key_prefix: string; id: string } };\n\n console.log(\"\");\n console.log(chalk.bold.green(\" ✓ API key created successfully\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Name:\")} ${key.name}`);\n console.log(` ${chalk.gray(\"ID:\")} ${key.id}`);\n console.log(` ${chalk.gray(\"Prefix:\")} ${key.key_prefix}`);\n console.log(\"\");\n console.log(chalk.bold.yellow(\" ⚠ Copy your key now — it won't be shown again:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(key.key)}`);\n console.log(\"\");\n } catch (e: unknown) {\n console.error(chalk.red(`✗ ${e instanceof Error ? e.message : String(e)}`));\n console.error(chalk.gray(\" Is the Rebase server running?\"));\n process.exit(1);\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n revoke\n ═══════════════════════════════════════════════════════════════ */\n\nasync function revokeKey(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--id\": String\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase api-keys revoke\"\n permissive: true\n }\n );\n\n const id = args[\"--id\"] || args._[0];\n\n if (!id) {\n console.error(chalk.red(\"✗ Key ID is required.\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage: rebase api-keys revoke <key-id>\"));\n process.exit(1);\n }\n\n const projectRoot = requireProjectRoot();\n const env = loadEnv(projectRoot);\n const baseUrl = resolveBaseUrl(env);\n const serviceKey = env.SERVICE_KEY || env.REBASE_SERVICE_KEY;\n\n if (!serviceKey) {\n console.error(chalk.red(\"✗ SERVICE_KEY not found in .env — required for admin operations.\"));\n process.exit(1);\n }\n\n try {\n const res = await fetch(`${baseUrl}/api/admin/api-keys/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${serviceKey}` }\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n console.error(chalk.red(`✗ Failed to revoke API key: ${res.status} ${errBody}`));\n process.exit(1);\n }\n\n console.log(\"\");\n console.log(chalk.bold.green(\" ✓ API key revoked successfully\"));\n console.log(` ${chalk.gray(\"ID:\")} ${id}`);\n console.log(\"\");\n } catch (e: unknown) {\n console.error(chalk.red(`✗ ${e instanceof Error ? e.message : String(e)}`));\n console.error(chalk.gray(\" Is the Rebase server running?\"));\n process.exit(1);\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n Help\n ═══════════════════════════════════════════════════════════════ */\n\nfunction printApiKeysHelp() {\n console.log(`\n${chalk.bold(\"rebase api-keys\")} — Manage Service API Keys\n\n${chalk.green.bold(\"Usage\")}\n rebase api-keys ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"list\")} List all API keys\n ${chalk.blue.bold(\"create\")} Create a new API key\n ${chalk.blue.bold(\"revoke\")} Revoke an API key\n\n${chalk.green.bold(\"create Options\")}\n ${chalk.blue(\"--name, -n\")} Key name ${chalk.gray(\"(required)\")}\n ${chalk.blue(\"--permissions\")} JSON array of permissions\n ${chalk.gray('Default: [{\"collection\":\"*\",\"operations\":[\"read\",\"write\",\"delete\"]}]')}\n ${chalk.blue(\"--admin\")} Grant admin role (access to admin routes)\n ${chalk.blue(\"--rate-limit\")} Requests per 15-min window ${chalk.gray(\"(default: 1000)\")}\n ${chalk.blue(\"--expires\")} Expiration: 7d, 30d, 90d, 1y, or ISO date\n\n${chalk.green.bold(\"revoke Options\")}\n ${chalk.blue(\"--id\")} API key ID to revoke ${chalk.gray(\"(or positional arg)\")}\n\n${chalk.green.bold(\"Examples\")}\n rebase api-keys list\n rebase api-keys create --name \"Analytics\" --permissions '[{\"collection\":\"events\",\"operations\":[\"read\"]}]'\n rebase api-keys create -n \"Full Access\" --expires 90d\n rebase api-keys revoke abc123-def456\n`);\n}\n","import chalk from \"chalk\";\nimport arg from \"arg\";\nimport { createRebaseApp } from \"./commands/init\";\nimport { generateSdkCommand } from \"./commands/generate_sdk\";\nimport { schemaCommand } from \"./commands/schema\";\nimport { dbCommand } from \"./commands/db\";\nimport { devCommand } from \"./commands/dev\";\nimport { buildCommand } from \"./commands/build\";\nimport { startCommand } from \"./commands/start\";\nimport { authCommand } from \"./commands/auth\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport { skillsCommand } from \"./commands/skills\";\nimport { apiKeysCommand } from \"./commands/api-keys\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction getVersion(): string {\n try {\n // Try to read version from package.json\n const pkgPath = path.resolve(__dirname, \"../package.json\");\n if (fs.existsSync(pkgPath)) {\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version;\n }\n } catch {\n // ignore\n }\n return \"unknown\";\n}\n\nexport async function entry(args: string[]) {\n const parsedArgs = arg(\n {\n \"--version\": Boolean,\n \"--help\": Boolean,\n \"-v\": \"--version\",\n \"-h\": \"--help\"\n },\n {\n argv: args.slice(2),\n permissive: true\n }\n );\n\n if (parsedArgs[\"--version\"]) {\n console.log(getVersion());\n return;\n }\n\n const command = parsedArgs._[0];\n const subcommand = parsedArgs._[1];\n\n // Show global help only when no command given, or --help with no recognized command\n const namespacedCommands = [\"schema\", \"db\", \"dev\", \"build\", \"start\", \"auth\", \"doctor\", \"skills\", \"api-keys\"];\n if (!command || (parsedArgs[\"--help\"] && !namespacedCommands.includes(command))) {\n printHelp();\n return;\n }\n\n // For namespaced commands with --help, pass it through as subcommand\n const effectiveSubcommand = parsedArgs[\"--help\"] ? \"--help\" : subcommand;\n\n switch (command) {\n case \"init\":\n await createRebaseApp(args);\n break;\n\n case \"generate-sdk\": {\n const sdkArgs = arg(\n {\n \"--collections-dir\": String,\n \"--output\": String,\n \"-c\": \"--collections-dir\",\n \"-o\": \"--output\"\n },\n {\n argv: args.slice(3),\n permissive: true\n }\n );\n await generateSdkCommand({\n collectionsDir: sdkArgs[\"--collections-dir\"] || \"./config/collections\",\n output: sdkArgs[\"--output\"] || \"./generated/sdk\",\n cwd: process.cwd()\n });\n break;\n }\n\n case \"schema\":\n await schemaCommand(effectiveSubcommand, args);\n break;\n\n case \"db\":\n await dbCommand(effectiveSubcommand, args);\n break;\n\n case \"dev\":\n await devCommand(args);\n break;\n\n case \"build\":\n await buildCommand();\n break;\n\n case \"start\":\n await startCommand();\n break;\n\n case \"auth\":\n await authCommand(effectiveSubcommand, args);\n break;\n\n case \"doctor\":\n await doctorCommand(args);\n break;\n\n case \"skills\":\n await skillsCommand(effectiveSubcommand, args);\n break;\n\n case \"api-keys\":\n await apiKeysCommand(effectiveSubcommand, args);\n break;\n\n default:\n console.log(chalk.red(`Unknown command: ${command}`));\n console.log(\"\");\n printHelp();\n }\n}\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"Rebase CLI\")} — Developer tools for Rebase projects\n\n${chalk.green.bold(\"Usage\")}\n rebase ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"init\")} Create a new Rebase project\n ${chalk.blue.bold(\"dev\")} Start the development server\n ${chalk.blue.bold(\"build\")} Build all workspace packages\n ${chalk.blue.bold(\"start\")} Start the backend server ${chalk.gray(\"(production)\")}\n\n${chalk.green.bold(\"Schema\")}\n ${chalk.blue.bold(\"schema generate\")} Generate Drizzle schema from collections\n ${chalk.blue.bold(\"schema introspect\")} Introspect database → Rebase collections\n ${chalk.blue.bold(\"schema\")} ${chalk.gray(\"--help\")} Show schema command help\n\n${chalk.green.bold(\"Database\")}\n ${chalk.blue.bold(\"db push\")} Apply schema directly to database ${chalk.gray(\"(dev)\")}\n ${chalk.blue.bold(\"db generate\")} Generate SQL migration files\n ${chalk.blue.bold(\"db migrate\")} Run pending migrations\n ${chalk.blue.bold(\"db\")} ${chalk.gray(\"--help\")} Show database command help\n\n${chalk.green.bold(\"SDK\")}\n ${chalk.blue.bold(\"generate-sdk\")} Generate a typed TypeScript SDK from collections\n\n${chalk.green.bold(\"Auth\")}\n ${chalk.blue.bold(\"auth reset-password\")} Reset a user's password\n ${chalk.blue.bold(\"auth\")} ${chalk.gray(\"--help\")} Show auth command help\n\n${chalk.green.bold(\"Diagnostics\")}\n ${chalk.blue.bold(\"doctor\")} Detect schema drift between collections, schema, and DB\n\n${chalk.green.bold(\"AI Agent Skills\")}\n ${chalk.blue.bold(\"skills install\")} Install Rebase agent skills for your AI coding assistant\n\n${chalk.green.bold(\"API Keys\")}\n ${chalk.blue.bold(\"api-keys list\")} List all service API keys\n ${chalk.blue.bold(\"api-keys create\")} Create a new scoped API key\n ${chalk.blue.bold(\"api-keys revoke\")} Revoke an existing API key\n ${chalk.blue.bold(\"api-keys\")} ${chalk.gray(\"--help\")} Show API key command help\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--version, -v\")} Show version number\n ${chalk.blue(\"--help, -h\")} Show this help message\n\n${chalk.gray(\"Documentation: https://rebase.pro/docs\")}\n`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","names":[],"sources":["../src/utils/package-manager.ts","../src/commands/init.ts","../src/commands/generate_sdk.ts","../src/utils/project.ts","../src/commands/schema.ts","../src/commands/db.ts","../src/commands/dev.ts","../src/commands/build.ts","../src/commands/start.ts","../src/commands/auth.ts","../src/commands/doctor.ts","../src/commands/skills.ts","../src/commands/api-keys.ts","../src/cli.ts"],"sourcesContent":["/**\n * Package manager detection and command abstraction.\n *\n * Detects whether the user is running pnpm or npm and provides\n * a unified interface for common package-manager operations so\n * the rest of the CLI never has to hardcode a specific PM.\n */\nimport fs from \"fs\";\nimport path from \"path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\";\n\nexport interface PMCommands {\n /** The binary name (\"pnpm\" | \"npm\"). */\n name: PackageManager;\n /** Install all dependencies — e.g. `pnpm install` / `npm install`. */\n install: string[];\n /** Run a script — e.g. `pnpm run dev` / `npm run dev`. */\n run: (script: string) => string[];\n /** Execute a local bin — e.g. `pnpm exec rebase ...` / `npx rebase ...`. */\n exec: (bin: string, args: string[]) => string[];\n /** Query the registry — e.g. `pnpm view <pkg> version` / `npm view <pkg> version`. */\n view: (pkg: string, field: string) => string[];\n /** Run all workspace scripts — e.g. `pnpm -r run build` / `npm run build --workspaces`. */\n runAll: (script: string) => string[];\n /** Run a script in a specific workspace — e.g. `pnpm --filter \"*-backend\" start` / `npm run start -w backend`. */\n runWorkspace: (workspace: string, script: string) => string[];\n /** Execute a one-off package — e.g. `pnpm dlx skills ...` / `npx -y skills ...`. */\n dlx: (pkg: string, args: string[]) => string[];\n /** The workspace dependency protocol: `\"workspace:*\"` for pnpm, `\"*\"` for npm. */\n workspaceProtocol: string;\n}\n\n/**\n * Detect the package manager from the environment or the target directory.\n *\n * Detection order:\n * 1. Explicit override (if provided)\n * 2. `npm_config_user_agent` env var (set by npm/pnpm when running via `npx`/`pnpm dlx`)\n * 3. Lock-file presence in the target directory\n * 4. Default to pnpm (Rebase's recommended PM)\n */\nexport function detectPackageManager(targetDir?: string): PackageManager {\n // 1. Check user agent (set when invoked via npx / pnpm dlx)\n const userAgent = process.env.npm_config_user_agent ?? \"\";\n if (userAgent.startsWith(\"npm/\")) return \"npm\";\n if (userAgent.startsWith(\"pnpm/\")) return \"pnpm\";\n\n // 2. Check for lock files in the target directory\n if (targetDir) {\n if (fs.existsSync(path.join(targetDir, \"package-lock.json\"))) return \"npm\";\n if (fs.existsSync(path.join(targetDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n }\n\n // 3. Check for lock files in cwd\n const cwd = process.cwd();\n if (cwd !== targetDir) {\n if (fs.existsSync(path.join(cwd, \"package-lock.json\"))) return \"npm\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n }\n\n // 4. Default to pnpm\n return \"pnpm\";\n}\n\n/** Build the command helpers for a given package manager. */\nexport function getPMCommands(pm: PackageManager): PMCommands {\n if (pm === \"npm\") {\n return {\n name: \"npm\",\n install: [\"npm\", \"install\"],\n run: (script) => [\"npm\", \"run\", script],\n exec: (bin, args) => [\"npx\", bin, ...args],\n view: (pkg, field) => [\"npm\", \"view\", pkg, field],\n runAll: (script) => [\"npm\", \"run\", script, \"--workspaces\", \"--if-present\"],\n runWorkspace: (workspace, script) => [\"npm\", \"run\", script, \"-w\", workspace],\n dlx: (pkg, args) => [\"npx\", \"-y\", pkg, ...args],\n workspaceProtocol: \"*\"\n };\n }\n\n return {\n name: \"pnpm\",\n install: [\"pnpm\", \"install\"],\n run: (script) => [\"pnpm\", \"run\", script],\n exec: (bin, args) => [\"pnpm\", \"exec\", bin, ...args],\n view: (pkg, field) => [\"pnpm\", \"view\", pkg, field],\n runAll: (script) => [\"pnpm\", \"-r\", \"run\", script],\n runWorkspace: (workspace, script) => [\"pnpm\", \"--filter\", workspace, script],\n dlx: (pkg, args) => [\"pnpm\", \"dlx\", pkg, ...args],\n workspaceProtocol: \"workspace:*\"\n };\n}\n","import arg from \"arg\";\nimport inquirer from \"inquirer\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport net from \"net\";\nimport { promisify } from \"util\";\nimport { execa } from \"execa\";\nimport { cp } from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport crypto from \"crypto\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\nimport type { PackageManager, PMCommands } from \"../utils/package-manager\";\n\nconst access = promisify(fs.access);\n\n\n// Resolve template path relative to this file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction findParentDir(currentDir: string, targetName: string): string | null {\n const root = path.parse(currentDir).root;\n while (currentDir && currentDir !== root) {\n if (path.basename(currentDir) === targetName) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n return null;\n}\n\nconst cliRoot = findParentDir(__dirname, \"cli\");\n\nexport type TemplatePreset = \"blog\" | \"ecommerce\" | \"blank\";\n\nconst PRESET_CHOICES: Array<{ name: string; value: TemplatePreset; short: string }> = [\n { name: \"Blog — Posts, Authors, Tags (with markdown editor)\",\nvalue: \"blog\",\nshort: \"Blog\" },\n { name: \"E-commerce — Products, Categories, Orders\",\nvalue: \"ecommerce\",\nshort: \"E-commerce\" },\n { name: \"Blank — Empty project, just authentication\",\nvalue: \"blank\",\nshort: \"Blank\" }\n];\n\nexport interface InitOptions {\n projectName: string;\n git: boolean;\n installDeps: boolean;\n targetDirectory: string;\n templateDirectory: string;\n databaseUrl?: string;\n introspect?: boolean;\n /** Starter template preset. */\n preset: TemplatePreset;\n /** Detected package manager (pnpm or npm). */\n pm: PackageManager;\n /** Command helpers for the detected PM. */\n pmCommands: PMCommands;\n}\n\nexport interface BuildQuestionsParams {\n nameArg?: string;\n templateArg?: TemplatePreset;\n hasGitFlag: boolean;\n hasInstallFlag: boolean;\n pm: PackageManager;\n}\n\n/**\n * Builds the interactive prompt questions for `rebase init`.\n * Exported for testability — all prompt `type` values must match\n * types registered by the installed version of inquirer.\n */\nexport function buildInitQuestions(params: BuildQuestionsParams): Record<string, unknown>[] {\n const { nameArg, templateArg, hasGitFlag, hasInstallFlag, pm } = params;\n const questions: Record<string, unknown>[] = [];\n\n if (!nameArg) {\n questions.push({\n type: \"input\",\n name: \"projectName\",\n message: \"Project name:\",\n default: \"my-rebase-app\",\n validate: (input: string) => {\n if (!input.trim()) return \"Project name is required\";\n if (!/^[a-z0-9][a-z0-9._-]*$/.test(input)) {\n return \"Project name must start with a lowercase letter or number and contain only lowercase letters, numbers, hyphens, dots, or underscores\";\n }\n return true;\n }\n });\n }\n\n if (!templateArg) {\n questions.push({\n type: \"select\",\n name: \"preset\",\n message: \"Choose a starter template:\",\n choices: PRESET_CHOICES,\n default: \"blog\"\n });\n }\n\n if (!hasGitFlag) {\n questions.push({\n type: \"confirm\",\n name: \"git\",\n message: \"Initialize a git repository?\",\n default: true\n });\n }\n\n if (!hasInstallFlag) {\n questions.push({\n type: \"confirm\",\n name: \"installDeps\",\n message: `Install dependencies with ${pm}?`,\n default: true\n });\n }\n\n questions.push({\n type: \"input\",\n name: \"databaseUrl\",\n message: \"Enter your PostgreSQL database connection string (leave blank to use a local default):\",\n default: \"\",\n validate: (input: string) => {\n if (input.trim() && /[\\r\\n]/.test(input)) {\n return \"Database URL cannot contain newline characters.\";\n }\n return true;\n }\n });\n\n questions.push({\n type: \"confirm\",\n name: \"introspect\",\n message: \"Would you like to introspect this database to automatically generate collections?\",\n default: true,\n when: (answers: Record<string, unknown>) => !!(answers.databaseUrl as string)?.trim()\n });\n\n return questions;\n}\n\nexport async function createRebaseApp(rawArgs: string[]) {\n console.log(`\n${chalk.bold(\"Rebase\")} — Create a new project 🚀\n`);\n\n const pm = detectPackageManager();\n const options = await promptForOptions(rawArgs, pm);\n await createProject(options);\n}\n\nasync function promptForOptions(rawArgs: string[], pm: PackageManager): Promise<InitOptions> {\n const args = arg(\n {\n \"--git\": Boolean,\n \"--install\": Boolean,\n \"--database-url\": String,\n \"--introspect\": Boolean,\n \"--template\": String,\n \"--yes\": Boolean,\n \"-g\": \"--git\",\n \"-i\": \"--install\",\n \"-t\": \"--template\",\n \"-y\": \"--yes\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node\", \"rebase\", \"init\"\n permissive: true\n }\n );\n\n // The first positional arg after \"init\" is the project name\n const nameArg = args._[0];\n const isNonInteractive = args[\"--yes\"] || false;\n\n const templateArg = args[\"--template\"] as TemplatePreset | undefined;\n if (templateArg && !PRESET_CHOICES.some(p => p.value === templateArg)) {\n console.error(chalk.red(`Unknown template \"${templateArg}\". Available: ${PRESET_CHOICES.map(p => p.value).join(\", \")}`));\n process.exit(1);\n }\n\n if (isNonInteractive) {\n const projectName = nameArg || \"my-rebase-app\";\n const targetDirectory = path.resolve(process.cwd(), projectName);\n const templateDirectory = path.resolve(cliRoot!, \"templates\", \"template\");\n const pmCommands = getPMCommands(pm);\n\n return {\n projectName: path.basename(targetDirectory),\n git: args[\"--git\"] ?? false,\n installDeps: args[\"--install\"] ?? false,\n targetDirectory,\n templateDirectory,\n databaseUrl: args[\"--database-url\"] || undefined,\n introspect: args[\"--introspect\"] || false,\n preset: templateArg || \"blog\",\n pm,\n pmCommands\n };\n }\n\n const questions = buildInitQuestions({\n nameArg,\n templateArg,\n hasGitFlag: !!args[\"--git\"],\n hasInstallFlag: !!args[\"--install\"],\n pm\n });\n\n\n const answers = await inquirer.prompt(questions as unknown as Parameters<typeof inquirer.prompt>[0]);\n\n const targetDirectory = path.resolve(process.cwd(), nameArg || answers.projectName);\n const projectName = path.basename(targetDirectory);\n const templateDirectory = path.resolve(cliRoot!, \"templates\", \"template\");\n const pmCommands = getPMCommands(pm);\n\n return {\n projectName,\n git: args[\"--git\"] || answers.git || false,\n installDeps: args[\"--install\"] || answers.installDeps || false,\n targetDirectory,\n templateDirectory,\n databaseUrl: (answers.databaseUrl as string)?.trim() || undefined,\n introspect: answers.introspect || false,\n preset: templateArg || (answers.preset as TemplatePreset) || \"blog\",\n pm,\n pmCommands\n };\n}\n\nasync function createProject(options: InitOptions) {\n // Check if directory already exists and is not empty\n if (fs.existsSync(options.targetDirectory)) {\n if (fs.readdirSync(options.targetDirectory).length !== 0) {\n console.error(`${chalk.red.bold(\"ERROR\")} Directory \"${options.projectName}\" already exists and is not empty`);\n process.exit(1);\n }\n } else {\n fs.mkdirSync(options.targetDirectory, { recursive: true });\n }\n\n // Verify template exists\n try {\n await access(options.templateDirectory, fs.constants.R_OK);\n } catch {\n console.error(`${chalk.red.bold(\"ERROR\")} Template not found at ${options.templateDirectory}`);\n process.exit(1);\n }\n\n // Copy template files\n console.log(chalk.gray(\" Copying project files...\"));\n try {\n await cp(options.templateDirectory, options.targetDirectory, {\n recursive: true,\n filter: (source: string) => {\n const basename = path.basename(source);\n // Skip node_modules and .DS_Store\n return basename !== \"node_modules\" && basename !== \".DS_Store\";\n }\n });\n } catch (err: unknown) {\n console.error(`${chalk.red.bold(\"ERROR\")} Failed to copy template files: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n // Apply the selected template preset (swap collection files)\n await applyPreset(options.targetDirectory, options.preset);\n\n // Replace placeholder project name in package.json files\n await replacePlaceholders(options);\n\n // Rename .env.example to .env if it exists and randomize secrets\n await configureEnvFile(options.targetDirectory, options.databaseUrl);\n\n // Initialize git\n if (options.git) {\n console.log(chalk.gray(\" Initializing git repository...\"));\n try {\n await execa(\"git\", [\"init\"], { cwd: options.targetDirectory });\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to initialize git repository\"));\n }\n }\n\n const { pm, pmCommands } = options;\n const installCmd = pmCommands.install;\n const execCmd = pmCommands.exec(\"rebase\", [\"schema\", \"introspect\", \"--force\"]);\n\n if (options.installDeps) {\n console.log(\"\");\n console.log(chalk.gray(` Installing dependencies with ${pm}...`));\n console.log(\"\");\n try {\n await execa(installCmd[0], installCmd.slice(1), {\n cwd: options.targetDirectory,\n stdio: \"inherit\"\n });\n } catch {\n console.warn(chalk.yellow(` Warning: Failed to install dependencies. You may need to run \\`${installCmd.join(\" \")}\\` manually.`));\n }\n }\n\n if (options.introspect) {\n console.log(\"\");\n if (options.installDeps) {\n console.log(chalk.gray(\" Introspecting database and generating collections...\"));\n console.log(\"\");\n try {\n // --force overwrites template example collections with real ones\n await execa(execCmd[0], execCmd.slice(1), {\n cwd: options.targetDirectory,\n stdio: \"inherit\"\n });\n console.log(chalk.green(\" Database successfully introspected!\"));\n } catch {\n console.warn(chalk.yellow(\" Warning: Failed to introspect database automatically.\"));\n console.warn(chalk.yellow(` You can run \\`${execCmd.join(\" \")}\\` manually after setup.`));\n }\n } else {\n console.warn(chalk.yellow(\" Skipping introspection because dependencies were not installed.\"));\n console.warn(chalk.yellow(` Run \\`${installCmd.join(\" \")}\\` then \\`${execCmd.join(\" \")}\\` manually.`));\n }\n }\n\n // Success message\n console.log(\"\");\n console.log(`${chalk.green.bold(\"✓\")} Project ${chalk.bold(options.projectName)} created successfully!`);\n console.log(\"\");\n console.log(chalk.bold(\"Next steps:\"));\n console.log(\"\");\n const runDev = pmCommands.run(\"dev\");\n const runDbPush = pmCommands.run(\"db:push\");\n console.log(` ${chalk.cyan(\"cd\")} ${options.projectName}`);\n if (!options.installDeps) {\n console.log(` ${chalk.cyan(installCmd.join(\" \"))}`);\n }\n console.log(\"\");\n\n if (options.databaseUrl) {\n if (options.introspect) {\n console.log(chalk.gray(\" # Database has been introspected & collections generated!\"));\n console.log(chalk.gray(\" # Start the development server (frontend + backend):\"));\n console.log(` ${chalk.cyan(runDev.join(\" \"))}`);\n } else {\n console.log(chalk.gray(\" # Your custom database is configured in .env.\"));\n console.log(chalk.gray(\" # If the database is empty, push the Rebase schema to initialize it:\"));\n console.log(` ${chalk.cyan(runDbPush.join(\" \"))}`);\n console.log(\"\");\n console.log(chalk.gray(\" # Then start the development server:\"));\n console.log(` ${chalk.cyan(runDev.join(\" \"))}`);\n }\n } else {\n console.log(chalk.gray(\" # A local database configuration has been generated in .env.\"));\n console.log(chalk.gray(\" # 1. Start the PostgreSQL database container:\"));\n console.log(` ${chalk.cyan(\"docker compose up -d db\")}`);\n console.log(\"\");\n console.log(chalk.gray(\" # 2. Push the Rebase schema to initialize database tables:\"));\n console.log(` ${chalk.cyan(runDbPush.join(\" \"))}`);\n console.log(\"\");\n console.log(chalk.gray(\" # 3. Start the development server (frontend + backend):\"));\n console.log(` ${chalk.cyan(runDev.join(\" \"))}`);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\"This starts both the backend (Hono + PostgreSQL)\")\n + chalk.gray(\" and the frontend (Vite + React) concurrently.\"));\n console.log(\"\");\n console.log(chalk.gray(\"Docs: https://rebase.pro/docs\"));\n console.log(chalk.gray(\"GitHub: https://github.com/rebasepro/rebase\"));\n console.log(\"\");\n console.log(chalk.bold(\"🤖 AI Agent Skills\"));\n console.log(\"\");\n console.log(chalk.gray(\" Install Rebase agent skills for your AI coding assistant:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(\"rebase skills install\")} ${chalk.gray(\"or\")} ${chalk.cyan(pmCommands.run(\"skills:install\").join(\" \"))}`);\n console.log(\"\");\n}\n\n/**\n * Apply a template preset by replacing the default collection files.\n *\n * The template ships with blog collections at the top level and\n * preset alternatives under `config/collections/presets/<name>/`.\n * This function swaps the active collection files and removes the\n * presets directory so the final project is clean.\n */\nasync function applyPreset(targetDirectory: string, preset: TemplatePreset): Promise<void> {\n const collectionsDir = path.join(targetDirectory, \"config\", \"collections\");\n const presetsDir = path.join(collectionsDir, \"presets\");\n\n if (preset !== \"blog\") {\n const presetDir = path.join(presetsDir, preset);\n if (!fs.existsSync(presetDir)) {\n console.warn(chalk.yellow(` Warning: Preset \"${preset}\" not found, falling back to blog template.`));\n cleanupPresets(presetsDir);\n return;\n }\n\n // Remove the default blog collection files (keep users.ts — it's shared)\n const blogFiles = [\"posts.ts\", \"authors.ts\", \"tags.ts\", \"index.ts\"];\n for (const file of blogFiles) {\n const filePath = path.join(collectionsDir, file);\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n }\n\n // Copy preset files into the collections directory\n const presetFiles = fs.readdirSync(presetDir).filter(f => f.endsWith(\".ts\"));\n for (const file of presetFiles) {\n fs.copyFileSync(\n path.join(presetDir, file),\n path.join(collectionsDir, file)\n );\n }\n }\n\n // Always clean up the presets directory — it shouldn't ship with the final project\n cleanupPresets(presetsDir);\n}\n\nfunction cleanupPresets(presetsDir: string): void {\n if (fs.existsSync(presetsDir)) {\n fs.rmSync(presetsDir, { recursive: true,\nforce: true });\n }\n}\n\nasync function replacePlaceholders(options: InitOptions) {\n const filesToProcess = [\n \"package.json\",\n \"frontend/package.json\",\n \"backend/package.json\",\n \"config/package.json\",\n \"frontend/index.html\",\n \"pnpm-workspace.yaml\",\n \"README.md\"\n ];\n\n const packageJsonPath = path.resolve(cliRoot!, \"package.json\");\n let cliVersion = \"latest\";\n if (fs.existsSync(packageJsonPath)) {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n cliVersion = pkg.version || \"latest\";\n }\n\n const versionCache = new Map<string, string>();\n\n // Use npm view for registry queries — it's universal and works regardless of PM\n const viewBin = \"npm\";\n\n const getPackageVersion = async (pkgName: string) => {\n if (versionCache.has(pkgName)) return versionCache.get(pkgName)!;\n if (process.env.REBASE_E2E === \"true\") {\n versionCache.set(pkgName, cliVersion);\n return cliVersion;\n }\n let versionToUse = cliVersion;\n try {\n // First try to check if the specific cliVersion exists for this package\n const { stdout } = await execa(viewBin, [\"view\", `${pkgName}@${cliVersion}`, \"version\"]);\n if (!stdout.trim()) throw new Error(\"Not found\");\n versionToUse = stdout.trim();\n } catch {\n try {\n // If specific version doesn't exist, try the matching tag (canary or latest)\n const tag = cliVersion.includes(\"canary\") ? \"canary\" : \"latest\";\n const { stdout } = await execa(viewBin, [\"view\", `${pkgName}@${tag}`, \"version\"]);\n if (!stdout.trim()) throw new Error(\"Not found\");\n versionToUse = stdout.trim();\n } catch {\n try {\n // Fallback to absolute latest\n const { stdout } = await execa(viewBin, [\"view\", pkgName, \"version\"]);\n versionToUse = stdout.trim() || \"latest\";\n } catch {\n versionToUse = \"latest\";\n }\n }\n }\n versionCache.set(pkgName, versionToUse);\n return versionToUse;\n };\n\n // First, find all unique @rebasepro packages across all files to process in parallel\n const allPackages = new Set<string>();\n const fileContents = new Map<string, string>();\n\n for (const file of filesToProcess) {\n const fullPath = path.resolve(options.targetDirectory, file);\n if (!fs.existsSync(fullPath)) continue;\n const content = fs.readFileSync(fullPath, \"utf-8\");\n fileContents.set(fullPath, content);\n\n const matches = [...content.matchAll(/\"(@rebasepro\\/[^\"]+)\":\\s*\"workspace:\\*\"/g)];\n for (const match of matches) {\n allPackages.add(match[1]);\n }\n }\n\n console.log(chalk.gray(\" Resolving package versions...\"));\n\n // Resolve all versions in parallel\n await Promise.all(Array.from(allPackages).map(getPackageVersion));\n\n // Perform replacements\n for (const [fullPath, originalContent] of fileContents.entries()) {\n let content = originalContent.replace(/\\{\\{PROJECT_NAME\\}\\}/g, options.projectName);\n\n // Replace workspace:* with the dynamically resolved version\n const matches = [...content.matchAll(/\"(@rebasepro\\/[^\"]+)\":\\s*\"workspace:\\*\"/g)];\n for (const match of matches) {\n const pkgName = match[1];\n const resolvedVersion = versionCache.get(pkgName) || \"latest\";\n content = content.replace(new RegExp(`\"${pkgName}\":\\\\s*\"workspace:\\\\*\"`, \"g\"), `\"${pkgName}\": \"${resolvedVersion}\"`);\n }\n\n fs.writeFileSync(fullPath, content, \"utf-8\");\n }\n}\n\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once(\"error\", () => {\n resolve(false);\n });\n server.once(\"listening\", () => {\n server.close(() => resolve(true));\n });\n server.listen(port);\n });\n}\n\nasync function findAvailablePort(startPort: number): Promise<number> {\n let port = startPort;\n while (!(await isPortAvailable(port))) {\n port++;\n }\n return port;\n}\n\nexport async function configureEnvFile(targetDirectory: string, databaseUrl?: string) {\n const envExamplePath = path.join(targetDirectory, \".env.example\");\n const envPath = path.join(targetDirectory, \".env\");\n if (fs.existsSync(envExamplePath) && !fs.existsSync(envPath)) {\n // Copy .env.example → .env (keep .env.example as a reference in the repo)\n fs.copyFileSync(envExamplePath, envPath);\n\n // Generate secure random strings\n const jwtSecret = crypto.randomBytes(32).toString(\"hex\");\n const dbPassword = crypto.randomBytes(16).toString(\"hex\");\n\n let envContent = fs.readFileSync(envPath, \"utf-8\");\n\n envContent = envContent.replace(\n /^JWT_SECRET=.*$/m,\n `JWT_SECRET=${jwtSecret}`\n );\n\n if (databaseUrl) {\n if (/[\\r\\n]/.test(databaseUrl)) {\n throw new Error(\"Invalid DATABASE_URL: multiline values are not allowed.\");\n }\n envContent = envContent.replace(\n /^DATABASE_URL=.*$/m,\n `DATABASE_URL=${databaseUrl}`\n );\n } else {\n const dbPort = await findAvailablePort(5432);\n envContent = envContent.replace(\n /^DATABASE_URL=.*$/m,\n `DATABASE_URL=postgresql://rebase:${dbPassword}@localhost:${dbPort}/rebase?options=-c%20search_path=public\\nDATABASE_PASSWORD=${dbPassword}`\n );\n\n // Also update docker-compose.yml with the dynamic host port if it has the default 5432 port mapping\n const dockerComposePath = path.join(targetDirectory, \"docker-compose.yml\");\n if (fs.existsSync(dockerComposePath)) {\n let dockerComposeContent = fs.readFileSync(dockerComposePath, \"utf-8\");\n dockerComposeContent = dockerComposeContent.replace(\n /-\\s*\"5432:5432\"/g,\n `- \"${dbPort}:5432\"`\n );\n fs.writeFileSync(dockerComposePath, dockerComposeContent, \"utf-8\");\n }\n }\n\n fs.writeFileSync(envPath, envContent, \"utf-8\");\n }\n}\n","/**\n * CLI command: generate-sdk\n *\n * Reads collection definitions from a specified directory (default: ./config/collections),\n * generates a typed TypeScript SDK, and writes it to the output directory (default: ./generated/sdk).\n *\n * Uses jiti for dynamic TypeScript import of collection files.\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { EntityCollection } from \"@rebasepro/types\";\nimport { generateSDK, GeneratedFile } from \"@rebasepro/sdk-generator\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\n\ninterface GenerateSDKArgs {\n collectionsDir: string;\n output: string;\n cwd: string;\n}\n\n/**\n * Dynamically load collection definitions from a directory.\n *\n * Expects the directory to have an index.ts/index.js that exports a default\n * array of EntityCollection objects (matching the app/config/collections pattern).\n */\nasync function loadCollections(collectionsDir: string): Promise<EntityCollection[]> {\n const absDir = path.resolve(collectionsDir);\n\n if (!fs.existsSync(absDir)) {\n throw new Error(`Collections directory not found: ${absDir}`);\n }\n\n // Try to import the index file using jiti (supports TypeScript natively)\n let jiti: (id: string, userOptions?: Record<string, unknown>) => (modulePath: string) => Record<string, unknown>;\n try {\n const jitiModule = await import(\"jiti\");\n jiti = (jitiModule.default || jitiModule) as typeof jiti;\n } catch {\n const installCmd = [...getPMCommands(detectPackageManager()).install, \"-D\", \"jiti\"].join(\" \");\n throw new Error(\n `Could not load 'jiti'. Install it with: ${installCmd}\\n` +\n \"jiti is required to dynamically import TypeScript collection definitions.\"\n );\n }\n\n const jitiInstance = jiti(absDir, {\n interopDefault: true,\n esmResolve: true\n });\n\n // Look for index file\n const indexCandidates = [\"index.ts\", \"index.js\", \"index.mjs\"];\n let indexPath: string | null = null;\n\n for (const candidate of indexCandidates) {\n const p = path.join(absDir, candidate);\n if (fs.existsSync(p)) {\n indexPath = p;\n break;\n }\n }\n\n if (!indexPath) {\n // Fallback: load each .ts/.js file individually\n console.log(chalk.yellow(\" No index file found, scanning individual collection files...\"));\n const collections: EntityCollection[] = [];\n const files = fs.readdirSync(absDir).filter(f =>\n (f.endsWith(\".ts\") || f.endsWith(\".js\")) && !f.startsWith(\".\")\n );\n\n for (const file of files) {\n try {\n const mod = jitiInstance(path.join(absDir, file));\n const exported = mod.default || mod;\n if (exported && typeof exported === \"object\" && \"slug\" in exported) {\n collections.push(exported as EntityCollection);\n } else if (Array.isArray(exported)) {\n collections.push(...exported);\n }\n } catch (err) {\n console.warn(chalk.yellow(` ⚠ Skipping ${file}: ${(err as Error).message}`));\n }\n }\n\n return collections;\n }\n\n // Import the index\n const mod = jitiInstance(indexPath);\n const exported = mod.default || mod;\n\n if (Array.isArray(exported)) {\n return exported as EntityCollection[];\n } else if (typeof exported === \"object\" && exported !== null) {\n // Could be a named export like { collections: [...] }\n if (\"collections\" in exported && Array.isArray(exported.collections)) {\n return exported.collections;\n }\n // Or individual named exports\n const collections: EntityCollection[] = [];\n for (const value of Object.values(exported)) {\n if (value && typeof value === \"object\" && \"slug\" in (value as EntityCollection)) {\n collections.push(value as EntityCollection);\n }\n }\n if (collections.length > 0) return collections;\n }\n\n throw new Error(\n `Could not extract collections from ${indexPath}.\\n` +\n \"Expected a default export of EntityCollection[] or an object with named collection exports.\"\n );\n}\n\n/**\n * Write generated files to the output directory.\n */\nfunction writeFiles(outputDir: string, files: GeneratedFile[]): void {\n const absOutput = path.resolve(outputDir);\n\n // Create output directory\n fs.mkdirSync(absOutput, { recursive: true });\n\n for (const file of files) {\n const filePath = path.join(absOutput, file.path);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, file.content, \"utf-8\");\n }\n}\n\n/**\n * Main entry point for the generate-sdk command.\n */\nexport async function generateSdkCommand(args: GenerateSDKArgs): Promise<void> {\n const { collectionsDir, output, cwd } = args;\n\n const resolvedCollectionsDir = path.isAbsolute(collectionsDir)\n ? collectionsDir\n : path.join(cwd, collectionsDir);\n\n const resolvedOutput = path.isAbsolute(output)\n ? output\n : path.join(cwd, output);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔧 Rebase SDK Generator\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Collections:\")} ${resolvedCollectionsDir}`);\n console.log(` ${chalk.gray(\"Output:\")} ${resolvedOutput}`);\n console.log(\"\");\n\n // 1. Load collections\n console.log(chalk.cyan(\" → Loading collection definitions...\"));\n const collections = await loadCollections(resolvedCollectionsDir);\n\n // Sort collections alphabetically by slug to ensure deterministic SDK generation\n collections.sort((a, b) => a.slug.localeCompare(b.slug));\n\n if (collections.length === 0) {\n console.log(chalk.red(\" ✗ No collections found. Nothing to generate.\"));\n process.exit(1);\n }\n\n console.log(chalk.green(` ✓ Found ${collections.length} collection(s): ${collections.map(c => c.slug).join(\", \")}`));\n console.log(\"\");\n\n // 2. Generate SDK files\n console.log(chalk.cyan(\" → Generating SDK files...\"));\n const files = generateSDK(collections);\n console.log(chalk.green(` ✓ Generated ${files.length} file(s)`));\n\n // 3. Write to disk\n console.log(chalk.cyan(` → Writing to ${resolvedOutput}...`));\n writeFiles(resolvedOutput, files);\n\n console.log(\"\");\n console.log(chalk.green.bold(\" ✓ SDK generated successfully!\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage:\"));\n console.log(chalk.gray(\" import { createRebaseClient } from '@rebasepro/client';\"));\n console.log(chalk.gray(` import type { Database } from './${path.relative(cwd, path.join(resolvedOutput, \"database.types\"))}';`));\n console.log(\"\");\n console.log(chalk.gray(\" const rebase = createRebaseClient<Database>({\"));\n console.log(chalk.gray(\" baseUrl: 'http://localhost:3001',\"));\n console.log(chalk.gray(\" // token: 'your-jwt-token',\"));\n console.log(chalk.gray(\" });\"));\n console.log(\"\");\n console.log(chalk.gray(` const { data } = await rebase.collection('${collections[0]?.slug || \"my_collection\"}').find();`));\n console.log(\"\");\n}\n","/**\n * Project discovery utilities for the Rebase CLI.\n *\n * These helpers locate the project root, backend directory, .env file,\n * and local binaries — used by all CLI command modules.\n */\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\n/**\n * Walk up from `startDir` to find the Rebase project root.\n *\n * The root is identified by a `package.json` that either:\n * - has `workspaces` containing \"backend\" or \"frontend\", OR\n * - has a sibling `backend/` directory\n */\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n const pkgPath = path.join(dir, \"package.json\");\n\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n // Check for workspace-based project (monorepo root)\n if (pkg.workspaces && Array.isArray(pkg.workspaces)) {\n const hasBackend = pkg.workspaces.some((w: string) =>\n w === \"backend\"\n );\n if (hasBackend) return dir;\n }\n } catch {\n // ignore parse errors\n }\n\n // Check for sibling backend directory\n if (fs.existsSync(path.join(dir, \"backend\")) && fs.existsSync(path.join(dir, \"config\"))) {\n return dir;\n }\n }\n\n dir = path.dirname(dir);\n }\n\n return null;\n}\n\n/**\n * Locate the backend directory within the project root.\n */\nexport function findBackendDir(projectRoot: string): string | null {\n const backendDir = path.join(projectRoot, \"backend\");\n return fs.existsSync(backendDir) ? backendDir : null;\n}\n\n/**\n * Detect the active backend plugin (e.g. @rebasepro/server-postgresql) from the backend's package.json.\n */\nexport function getActiveBackendPlugin(backendDir: string): string | null {\n const pkgPath = path.join(backendDir, \"package.json\");\n if (!fs.existsSync(pkgPath)) return null;\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies,\n...pkg.devDependencies };\n\n // Collect all @rebasepro/server-* driver plugins (exclude server-core)\n const candidates = Object.keys(deps).filter(\n dep => dep.startsWith(\"@rebasepro/server-\") && dep !== \"@rebasepro/server-core\"\n );\n\n if (candidates.length === 0) return null;\n\n // Prefer server-postgresql — it's the primary supported driver\n if (candidates.includes(\"@rebasepro/server-postgresql\")) {\n return \"@rebasepro/server-postgresql\";\n }\n\n // Fallback: return the first candidate that actually has a CLI entry point\n for (const candidate of candidates) {\n if (resolvePluginCliScript(backendDir, candidate)) {\n return candidate;\n }\n }\n\n // Last resort: return whatever we found\n return candidates[0];\n } catch {\n // Ignore parse errors\n }\n return null;\n}\n\n/**\n * Resolve the active plugin's CLI script.\n */\nexport function resolvePluginCliScript(backendDir: string, pluginName: string): string | null {\n const candidates = [\n path.join(backendDir, \"node_modules\", pluginName, \"src\", \"cli.ts\"),\n path.join(backendDir, \"node_modules\", pluginName, \"dist\", \"cli.js\"),\n // For monorepo dev mode:\n path.resolve(backendDir, \"..\", \"..\", \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\"),\n path.resolve(backendDir, \"..\", \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\"),\n path.resolve(backendDir, \"..\", \"packages\", pluginName.replace(\"@rebasepro/\", \"\"), \"src\", \"cli.ts\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Locate the frontend directory within the project root.\n */\nexport function findFrontendDir(projectRoot: string): string | null {\n const frontendDir = path.join(projectRoot, \"frontend\");\n return fs.existsSync(frontendDir) ? frontendDir : null;\n}\n\n/**\n * Find the .env file. Checks the project root first, then backend.\n */\nexport function findEnvFile(projectRoot: string): string | null {\n const candidates = [\n path.join(projectRoot, \".env\"),\n path.join(projectRoot, \"backend\", \".env\")\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n/**\n * Resolve a binary from the project's node_modules/.bin.\n * Checks backend, root, parent monorepo root, then falls back to PATH.\n */\nexport function resolveLocalBin(projectRoot: string, binName: string): string | null {\n const candidates = [\n path.join(projectRoot, \"backend\", \"node_modules\", \".bin\", binName),\n path.join(projectRoot, \"node_modules\", \".bin\", binName)\n ];\n\n // Also check parent directories (for monorepo setups where app/ is nested)\n let parent = path.dirname(projectRoot);\n const rootDir = path.parse(parent).root;\n while (parent !== rootDir) {\n candidates.push(path.join(parent, \"node_modules\", \".bin\", binName));\n parent = path.dirname(parent);\n }\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n // Fall back to globally installed binary via which\n try {\n const globalPath = execSync(`which ${binName}`, { encoding: \"utf-8\" }).trim();\n if (globalPath && fs.existsSync(globalPath)) return globalPath;\n } catch {\n // not found globally\n }\n\n return null;\n}\n\n/**\n * Resolve the tsx binary. Checks backend node_modules first, then root.\n */\nexport function resolveTsx(projectRoot: string): string | null {\n return resolveLocalBin(projectRoot, \"tsx\");\n}\n\n/**\n * Validate that a resolved tsx binary actually has an intact installation.\n *\n * `resolveLocalBin` only checks whether `node_modules/.bin/tsx` (a symlink)\n * exists. If the pnpm content-addressable store was cleaned or a previous\n * install was interrupted, the symlink can exist while critical files inside\n * the tsx package (e.g. `dist/preflight.cjs`) are missing — causing a\n * confusing MODULE_NOT_FOUND error at runtime.\n *\n * This function follows the symlink, walks up to find the tsx package root\n * (`package.json` with `name: \"tsx\"`), and verifies that `dist/preflight.cjs`\n * is present. Returns `null` when the installation looks healthy, or an\n * error description string when it appears corrupted.\n */\nexport function validateTsxInstallation(tsxBinPath: string): string | null {\n try {\n // Follow the symlink chain to the real tsx entry script\n const realPath = fs.realpathSync(tsxBinPath);\n\n // Walk up from the real binary to locate the tsx package root\n let dir = path.dirname(realPath);\n const fsRoot = path.parse(dir).root;\n for (let depth = 0; depth < 10 && dir !== fsRoot; depth++) {\n const pkgPath = path.join(dir, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n if (pkg.name === \"tsx\") {\n // Found the tsx package root — verify critical preload file\n const preflightPath = path.join(dir, \"dist\", \"preflight.cjs\");\n if (!fs.existsSync(preflightPath)) {\n return `tsx package at ${dir} is missing dist/preflight.cjs`;\n }\n return null; // Installation looks healthy\n }\n } catch {\n // Malformed package.json — keep walking\n }\n }\n dir = path.dirname(dir);\n }\n\n // Could not determine tsx root — don't block, assume valid\n return null;\n } catch (err) {\n // realpathSync throws if the symlink target is completely gone\n return `tsx binary symlink is broken: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n\n/**\n * Require the project root or exit with a helpful error.\n */\nexport function requireProjectRoot(): string {\n const root = findProjectRoot();\n if (!root) {\n console.error(chalk.red(\"✗ Could not find a Rebase project root.\"));\n console.error(chalk.gray(\" Make sure you are inside a Rebase project directory\"));\n console.error(chalk.gray(\" (one with backend/, frontend/, and config/ directories).\"));\n process.exit(1);\n }\n return root;\n}\n\n/**\n * Require the backend directory or exit with a helpful error.\n */\nexport function requireBackendDir(projectRoot: string): string {\n const backendDir = findBackendDir(projectRoot);\n if (!backendDir) {\n console.error(chalk.red(\"✗ Could not find a backend/ directory.\"));\n console.error(chalk.gray(` Expected at: ${path.join(projectRoot, \"backend\")}`));\n process.exit(1);\n }\n return backendDir;\n}\n","/**\n * CLI command: rebase schema <action>\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function schemaCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printSchemaHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n process.exit(1);\n }\n}\n\nfunction printSchemaHelp() {\n console.log(`\n${chalk.bold(\"rebase schema\")} — Schema management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase schema ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"generate\")} Generate Schema from collection definitions\n ${chalk.blue.bold(\"introspect\")} Introspect an existing database to generate collection definitions\n\n${chalk.green.bold(\"generate Options\")}\n ${chalk.blue(\"--collections, -c\")} Path to collections directory\n ${chalk.blue(\"--output, -o\")} Output path for generated schema\n ${chalk.blue(\"--watch, -w\")} Watch for changes and regenerate automatically\n\n${chalk.green.bold(\"introspect Options\")}\n ${chalk.blue(\"--output, -o\")} Output directory for generated collection files\n`);\n}\n","/**\n * CLI command: rebase db <action>\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function dbCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printDbHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n\nfunction printDbHelp() {\n console.log(`\n${chalk.bold(\"rebase db\")} — Database management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase db ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.gray(\"(Commands are provided by your active database driver plugin)\")}\n ${chalk.blue.bold(\"push\")} Apply schema directly to database (development)\n ${chalk.blue.bold(\"generate\")} Generate migration files\n ${chalk.blue.bold(\"migrate\")} Run pending migrations\n ${chalk.blue.bold(\"branch\")} Database branching (create, list, delete, info)\n\n${chalk.green.bold(\"Examples\")}\n ${chalk.gray(\"# Quick development workflow\")}\n rebase schema generate && rebase db push\n\n ${chalk.gray(\"# Production migration workflow\")}\n rebase db generate\n rebase db migrate\n\n ${chalk.gray(\"# Create a database branch\")}\n rebase db branch create feature_auth\n`);\n}\n","/**\n * CLI command: rebase dev\n *\n * Starts the full development environment:\n * - Backend: tsx watch with auto-reload\n * - Frontend: vite dev server\n *\n * Both processes stream output with color-coded prefixes.\n *\n * When the backend uses port-retry (i.e. the configured port is busy and it\n * binds to the next free one), the CLI detects the actual port from stdout\n * and injects VITE_API_URL into the frontend so it connects automatically.\n *\n * Each project gets a deterministic default port derived from the project\n * root path, so multiple Rebase instances never collide.\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport { execa, execaCommandSync, type ResultPromise } from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport {\n requireProjectRoot,\n findBackendDir,\n findFrontendDir,\n findEnvFile,\n resolveTsx,\n validateTsxInstallation,\n getActiveBackendPlugin,\n resolvePluginCliScript\n} from \"../utils/project\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\n\n/** Well-known filename the backend writes its actual port to. */\nconst DEV_PORT_FILENAME = \".rebase-dev-port\";\n\n/**\n * Compute a deterministic port from the project root path.\n * Range: 3001–3999 (avoids privileged ports and common services).\n * Two different project directories will almost always get different ports.\n */\nfunction getProjectPort(projectRoot: string): number {\n let hash = 0;\n for (let i = 0; i < projectRoot.length; i++) {\n hash = ((hash << 5) - hash + projectRoot.charCodeAt(i)) | 0;\n }\n return 3001 + (Math.abs(hash) % 999);\n}\n\n/**\n * Resolve the best starting port for this project:\n * 1. Explicit --port flag (highest priority)\n * 2. PORT env var\n * 3. Previously used port from .rebase-dev-port (port affinity across restarts)\n * 4. Deterministic hash from project path (unique per project)\n */\nfunction resolveStartPort(projectRoot: string, explicitPort?: number): number {\n // 1. Explicit flag\n if (explicitPort) return explicitPort;\n\n // 2. PORT env var\n if (process.env.PORT) return parseInt(process.env.PORT, 10);\n\n // 3. Port affinity — check if we wrote a port file from a previous run\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) {\n const saved = parseInt(fs.readFileSync(portFile, \"utf-8\").trim(), 10);\n if (saved > 0 && saved < 65536) return saved;\n }\n } catch { /* ignore */ }\n\n // 4. Deterministic hash\n return getProjectPort(projectRoot);\n}\n\nexport async function devCommand(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--backend-only\": Boolean,\n \"--frontend-only\": Boolean,\n \"--port\": Number,\n \"--generate\": Boolean,\n \"--help\": Boolean,\n \"-b\": \"--backend-only\",\n \"-f\": \"--frontend-only\",\n \"-p\": \"--port\",\n \"-g\": \"--generate\",\n \"-h\": \"--help\"\n },\n {\n argv: rawArgs.slice(3), // skip \"node rebase dev\"\n permissive: true\n }\n );\n\n if (args[\"--help\"]) {\n printDevHelp();\n return;\n }\n\n const projectRoot = requireProjectRoot();\n const backendDir = findBackendDir(projectRoot);\n const frontendDir = findFrontendDir(projectRoot);\n const backendOnly = args[\"--backend-only\"] || false;\n const frontendOnly = args[\"--frontend-only\"] || false;\n const shouldGenerate = args[\"--generate\"] || process.env.REBASE_AUTO_GENERATE === \"true\" || process.env.REBASE_GENERATE === \"true\";\n\n // Resolve the port ONCE, before starting anything\n const startPort = resolveStartPort(projectRoot, args[\"--port\"]);\n\n console.log(\"\");\n console.log(chalk.bold(\" 🚀 Rebase Dev Server\"));\n console.log(\"\");\n\n const children: ResultPromise[] = [];\n\n // --- State for printing the banner ---\n let frontendUrl = \"\";\n let backendUrl = \"\";\n let debounceSummary: NodeJS.Timeout | null = null;\n let bannerPrinted = false;\n\n /** Actual backend port, resolved once the server prints its URL. */\n let resolvedBackendPort: number | null = null;\n\n // Use regex to strip ANSI codes before matching\n // eslint-disable-next-line no-control-regex\n const stripAnsi = (str: string) => str.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, \"\");\n\n function printSummary() {\n if (!frontendUrl || !backendUrl) return;\n if (debounceSummary) clearTimeout(debounceSummary);\n debounceSummary = setTimeout(() => {\n if (bannerPrinted) return;\n console.log(\"\");\n console.log(chalk.cyan(\"┌────────────────────────────────────────────────────────────┐\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"│ ✦ Rebase Admin App is ready! │\"));\n const cleanUrl = stripAnsi(frontendUrl);\n const paddedUrl = cleanUrl.padEnd(41);\n console.log(chalk.cyan(\"│ ➜ Frontend URL: \") + chalk.white(paddedUrl) + chalk.cyan(\"│\"));\n console.log(chalk.cyan(\"│ │\"));\n console.log(chalk.cyan(\"└────────────────────────────────────────────────────────────┘\"));\n console.log(\"\");\n bannerPrinted = true;\n }, 500);\n }\n\n // Handle graceful shutdown\n const cleanup = () => {\n // Clean up dev port file\n try {\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n if (fs.existsSync(portFile)) fs.unlinkSync(portFile);\n\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n if (fs.existsSync(urlFile)) fs.unlinkSync(urlFile);\n } catch { /* ignore */ }\n\n children.forEach((child) => {\n if (child.pid && !child.killed) {\n try {\n if (process.platform === \"win32\") {\n execaCommandSync(`taskkill /pid ${child.pid} /T /F`);\n } else {\n process.kill(-child.pid, \"SIGKILL\");\n }\n } catch (e) {\n try {\n child.kill(\"SIGKILL\");\n } catch (err) {\n // ignore\n }\n }\n }\n });\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n /**\n * Start the Vite frontend, optionally injecting the backend port.\n */\n function startFrontend(backendPort: number | null) {\n if (!frontendDir) return;\n\n console.log(` ${chalk.magenta(\"▶\")} Frontend: ${chalk.gray(frontendDir)}`);\n\n const frontendEnv: Record<string, string> = { ...process.env as Record<string, string> };\n\n // Inject the resolved backend URL so Vite picks it up\n if (backendPort) {\n frontendEnv.VITE_API_URL = `http://localhost:${backendPort}`;\n console.log(` ${chalk.gray(\"↳ VITE_API_URL\")} = ${chalk.white(`http://localhost:${backendPort}`)}`);\n }\n\n const pm = detectPackageManager(projectRoot);\n const pmCmds = getPMCommands(pm);\n const runDevCmd = pmCmds.run(\"dev\");\n\n const frontendChild = execa(\n runDevCmd[0],\n runDevCmd.slice(1),\n {\n cwd: frontendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env: frontendEnv,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n frontendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n frontendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const urlMatch = cleanLine.match(/(http:\\/\\/(?:localhost|127\\.0\\.0\\.1):\\d+)/);\n if (cleanLine.includes(\"Local:\") && urlMatch) {\n frontendUrl = urlMatch[1];\n printSummary();\n }\n });\n });\n\n frontendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.magenta.bold(\"[admin]\")} ${line}`);\n });\n });\n\n children.push(frontendChild);\n }\n\n // Start backend\n if (!frontendOnly && backendDir) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n const pmCmdsLocal = getPMCommands(detectPackageManager(projectRoot));\n const addCmd = [...pmCmdsLocal.install, \"-D\", \"tsx\"].join(\" \");\n console.error(chalk.red(\" ✗ Could not find tsx binary for backend.\"));\n console.error(chalk.gray(` Install it with: ${addCmd}`));\n process.exit(1);\n }\n\n // Verify the tsx installation is intact (not just the symlink)\n const tsxValidationError = validateTsxInstallation(tsxBin);\n if (tsxValidationError) {\n const pmCmdsLocal = getPMCommands(detectPackageManager(projectRoot));\n const installCmd = pmCmdsLocal.install.join(\" \");\n console.error(chalk.red(\" ✗ tsx installation appears corrupted.\"));\n console.error(chalk.gray(` ${tsxValidationError}`));\n console.error(\"\");\n console.error(chalk.gray(\" To fix, run:\"));\n console.error(chalk.cyan(` rm -rf node_modules && ${installCmd}`));\n process.exit(1);\n }\n\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n // Always inject PORT so the backend uses our resolved port instead of\n // its hardcoded default (3001). This prevents cross-project collisions\n // when multiple Rebase instances run simultaneously.\n env.PORT = String(startPort);\n\n console.log(` ${chalk.cyan(\"▶\")} Backend: ${chalk.gray(backendDir)}`);\n console.log(` ${chalk.gray(\"↳ PORT\")} = ${chalk.white(String(startPort))}`);\n\n /** Whether the frontend has been launched (we only launch it once). */\n let frontendLaunched = false;\n\n // Initial schema and SDK generation (disabled by default, enabled via --generate or env var)\n if (shouldGenerate) {\n console.log(chalk.gray(\" → Ensuring schema and SDK are generated on start...\"));\n try {\n const activePlugin = getActiveBackendPlugin(backendDir);\n const pluginCli = activePlugin ? resolvePluginCliScript(backendDir, activePlugin) : null;\n if (pluginCli) {\n await execa(tsxBin, [pluginCli, \"schema\", \"generate\"], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n const sdkCmd = getPMCommands(detectPackageManager(projectRoot)).exec(\"rebase\", [\"generate-sdk\"]);\n await execa(sdkCmd[0], sdkCmd.slice(1), {\n cwd: projectRoot,\n stdio: \"inherit\",\n env\n });\n console.log(chalk.green(\" ✓ Initial schema and SDK generated successfully.\\n\"));\n } catch (err: unknown) {\n console.error(chalk.red(` ✗ Initial schema/SDK generation failed: ${err instanceof Error ? err.message : err}\\n`));\n }\n\n // Watch collections folder for changes\n const collectionsDir = path.join(projectRoot, \"config\", \"collections\");\n if (fs.existsSync(collectionsDir)) {\n let watchDebounce: NodeJS.Timeout | null = null;\n fs.watch(collectionsDir, { recursive: true }, (eventType, filename) => {\n if (!filename || filename.startsWith(\".\") || filename.endsWith(\".tmp\")) return;\n\n if (watchDebounce) clearTimeout(watchDebounce);\n watchDebounce = setTimeout(async () => {\n console.log(chalk.yellow(`\\n 🔄 Collection change detected (${filename}). Regenerating schema & SDK...`));\n try {\n const activePlugin = getActiveBackendPlugin(backendDir);\n const pluginCli = activePlugin ? resolvePluginCliScript(backendDir, activePlugin) : null;\n if (pluginCli) {\n await execa(tsxBin, [pluginCli, \"schema\", \"generate\"], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n const sdkCmd = getPMCommands(detectPackageManager(projectRoot)).exec(\"rebase\", [\"generate-sdk\"]);\n await execa(sdkCmd[0], sdkCmd.slice(1), {\n cwd: projectRoot,\n stdio: \"inherit\",\n env\n });\n console.log(chalk.green(\" ✓ Schema & SDK regenerated successfully. Hono will reload.\"));\n } catch (err: unknown) {\n console.error(chalk.red(` ✗ Failed to regenerate schema/SDK: ${err instanceof Error ? err.message : err}`));\n }\n }, 300);\n });\n }\n }\n\n const watchArgs = [\"watch\", \"--conditions\", \"development\", \"src/index.ts\"];\n if (!shouldGenerate) {\n // When auto-generation is disabled, watch the config/collections dir directly so the dev server\n // still reloads automatically when files there are edited/updated manually.\n watchArgs.splice(1, 0, `--watch=\"${path.join(\"..\", \"config\", \"**\", \"*\")}\"`);\n\n // Watch collections folder and warn about potential schema drift\n const collectionsDir = path.join(projectRoot, \"config\", \"collections\");\n if (fs.existsSync(collectionsDir)) {\n let driftDebounce: NodeJS.Timeout | null = null;\n fs.watch(collectionsDir, { recursive: true }, (_eventType, filename) => {\n if (!filename || filename.startsWith(\".\") || filename.endsWith(\".tmp\")) return;\n if (driftDebounce) clearTimeout(driftDebounce);\n driftDebounce = setTimeout(() => {\n console.log([\n \"\",\n chalk.yellow(\" ┌──────────────────────────────────────────────────────────────┐\"),\n chalk.yellow(\" │ ⚠️ Collection file changed: \") + chalk.white(filename!.padEnd(31)) + chalk.yellow(\"│\"),\n chalk.yellow(\" │ │\"),\n chalk.yellow(\" │ Your schema may be out of sync. Run: │\"),\n chalk.yellow(\" │ \") + chalk.cyan(\"rebase schema generate\") + chalk.yellow(\" regenerate Drizzle schema │\"),\n chalk.yellow(\" │ \") + chalk.cyan(\"rebase db push \") + chalk.yellow(\" sync schema to database │\"),\n chalk.yellow(\" │ \") + chalk.cyan(\"rebase doctor \") + chalk.yellow(\" check for drift │\"),\n chalk.yellow(\" │ │\"),\n chalk.yellow(\" │ TIP: Use \") + chalk.bold(\"rebase dev --generate\") + chalk.yellow(\" for auto-regeneration │\"),\n chalk.yellow(\" └──────────────────────────────────────────────────────────────┘\"),\n \"\"\n ].join(\"\\n\"));\n }, 500);\n });\n }\n }\n\n const backendChild = execa(\n tsxBin,\n watchArgs,\n {\n cwd: backendDir,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n env,\n shell: true,\n detached: process.platform !== \"win32\"\n }\n );\n backendChild.catch(() => {}); // prevent unhandled promise rejection on exit\n\n backendChild.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n const cleanLine = stripAnsi(line);\n const serverMatch = cleanLine.match(/Server running at http:\\/\\/(?:localhost|127\\.0\\.0\\.1):(\\d+)/);\n if (serverMatch) {\n resolvedBackendPort = parseInt(serverMatch[1], 10);\n backendUrl = \"started\";\n printSummary();\n\n // Save the url to a temp file for scripts to pick up\n const urlFile = path.join(projectRoot, \".rebase-dev-url\");\n fs.writeFileSync(urlFile, `http://localhost:${resolvedBackendPort}`, \"utf-8\");\n\n // Save the port to .rebase-dev-port for port affinity\n const portFile = path.join(projectRoot, DEV_PORT_FILENAME);\n fs.writeFileSync(portFile, String(resolvedBackendPort), \"utf-8\");\n\n // Start frontend now that we know the real port\n if (!backendOnly && frontendDir && !frontendLaunched) {\n frontendLaunched = true;\n startFrontend(resolvedBackendPort);\n }\n }\n });\n });\n\n /** Whether we've already shown a corrupted-modules recovery hint. */\n let corruptedModulesWarned = false;\n\n backendChild.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().split(\"\\n\").filter(Boolean);\n lines.forEach((line: string) => {\n console.log(`${chalk.cyan.bold(\"[backend]\")} ${line}`);\n\n // Detect corrupted node_modules at runtime\n // (covers tsx and any other dependency whose pnpm store entry is broken)\n if (!corruptedModulesWarned) {\n const cleanLine = stripAnsi(line);\n if (\n cleanLine.includes(\"Cannot find module\") &&\n cleanLine.includes(\"node_modules/.pnpm/\")\n ) {\n corruptedModulesWarned = true;\n // Delay slightly so the full Node.js error stack prints first\n setTimeout(() => {\n const pm = detectPackageManager(projectRoot);\n const installCmd = getPMCommands(pm).install.join(\" \");\n console.error(\"\");\n console.error(chalk.red(\" ✗ node_modules appears corrupted — a required file is missing.\"));\n console.error(chalk.gray(\" This usually happens when a previous install was interrupted\"));\n console.error(chalk.gray(\" or the package manager store was cleaned.\"));\n console.error(\"\");\n console.error(chalk.gray(\" To fix, stop the dev server and run:\"));\n console.error(chalk.cyan(` rm -rf node_modules && ${installCmd}`));\n console.error(\"\");\n }, 200);\n }\n }\n });\n });\n\n children.push(backendChild);\n } else if (!frontendOnly && !backendDir) {\n console.warn(chalk.yellow(\" ⚠ No backend/ directory found, skipping backend.\"));\n }\n\n // Start frontend immediately if backend-only mode or no backend\n if (!backendOnly && frontendDir && (frontendOnly || !backendDir)) {\n startFrontend(null);\n } else if (!backendOnly && !frontendDir) {\n console.warn(chalk.yellow(\" ⚠ No frontend/ directory found, skipping frontend.\"));\n }\n\n if (children.length === 0) {\n console.error(chalk.red(\" ✗ Nothing to start. Check your project structure.\"));\n process.exit(1);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\" Press Ctrl+C to stop all servers.\"));\n console.log(\"\");\n\n // Wait for all children to exit\n await Promise.all(\n children.map(\n (child) =>\n new Promise<void>((resolve) => {\n child.finally(() => resolve());\n })\n )\n );\n}\n\nfunction printDevHelp() {\n console.log(`\n${chalk.bold(\"rebase dev\")} — Start the development server\n\n${chalk.green.bold(\"Usage\")}\n rebase dev [options]\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--backend-only, -b\")} Only start the backend server\n ${chalk.blue(\"--frontend-only, -f\")} Only start the frontend server\n ${chalk.blue(\"--port, -p\")} Backend port (default: auto-detected per project)\n ${chalk.blue(\"--generate, -g\")} Enable automatic schema and SDK generation on startup and file changes\n\n${chalk.green.bold(\"Description\")}\n Starts both the backend (tsx watch + Hono) and frontend (Vite)\n dev servers concurrently with color-coded output prefixes.\n\n Each project automatically receives a unique default port derived\n from its directory path, preventing collisions when running multiple\n Rebase instances simultaneously.\n\n If the assigned port is already in use, the server will automatically\n try the next available port. The frontend is started only after the\n backend is ready, and VITE_API_URL is injected automatically.\n\n By default, automatic schema and SDK generation is disabled on startup\n and file changes. Pass --generate (-g) or set REBASE_AUTO_GENERATE=true\n in your environment to enable it.\n`);\n}\n","/**\n * CLI command: rebase build\n *\n * Runs the build script in all workspace packages.\n * Automatically detects the package manager (pnpm or npm) and\n * uses the correct workspace-aware command.\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport { requireProjectRoot } from \"../utils/project\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\n\nexport async function buildCommand(): Promise<void> {\n const projectRoot = requireProjectRoot();\n const pm = detectPackageManager(projectRoot);\n const cmds = getPMCommands(pm);\n\n const buildCmd = cmds.runAll(\"build\");\n\n console.log(`${chalk.bold(\"Rebase\")} — Building all workspaces with ${chalk.cyan(pm)}...\\n`);\n\n try {\n await execa(buildCmd[0], buildCmd.slice(1), {\n cwd: projectRoot,\n stdio: \"inherit\"\n });\n } catch {\n console.error(chalk.red(\"\\n✗ Build failed.\"));\n process.exit(1);\n }\n}\n","/**\n * CLI command: rebase start\n *\n * Starts the backend server in production mode.\n * Automatically detects the package manager (pnpm or npm) and\n * runs the start script in the backend workspace.\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport { requireProjectRoot, findEnvFile } from \"../utils/project\";\nimport { detectPackageManager, getPMCommands } from \"../utils/package-manager\";\n\nexport async function startCommand(): Promise<void> {\n const projectRoot = requireProjectRoot();\n const pm = detectPackageManager(projectRoot);\n const cmds = getPMCommands(pm);\n\n const startCmd = cmds.runWorkspace(\"backend\", \"start\");\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n console.log(`${chalk.bold(\"Rebase\")} — Starting backend server...\\n`);\n\n try {\n await execa(startCmd[0], startCmd.slice(1), {\n cwd: projectRoot,\n stdio: \"inherit\",\n env\n });\n } catch {\n console.error(chalk.red(\"\\n✗ Failed to start server.\"));\n process.exit(1);\n }\n}\n","/**\n * CLI command: rebase auth <action>\n *\n * Subcommands:\n * reset-password — Reset a user's password\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { spawn } from \"child_process\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n findEnvFile,\n resolveTsx\n} from \"../utils/project\";\n\nexport async function authCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printAuthHelp();\n return;\n }\n\n switch (subcommand) {\n case \"reset-password\":\n await resetPassword(rawArgs);\n break;\n default:\n console.error(chalk.red(`Unknown auth command: ${subcommand}`));\n console.log(\"\");\n printAuthHelp();\n process.exit(1);\n }\n}\n\nasync function resetPassword(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--email\": String,\n \"--password\": String,\n \"-e\": \"--email\",\n \"-p\": \"--password\"\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase auth reset-password\"\n permissive: true\n }\n );\n\n // Support both --email flag and positional args\n const email = args[\"--email\"] || args._[0];\n const newPassword = args[\"--password\"] || args._[1];\n\n if (!email) {\n console.error(chalk.red(\"✗ Email is required.\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage: rebase auth reset-password <email> [new-password]\"));\n console.log(chalk.gray(\" rebase auth reset-password --email user@example.com --password NewPass123!\"));\n process.exit(1);\n }\n\n const projectRoot = requireProjectRoot();\n\n // 1. Try API-first reset\n let envServiceKey: string | undefined;\n const envFile = findEnvFile(projectRoot);\n if (envFile && fs.existsSync(envFile)) {\n try {\n const envContent = fs.readFileSync(envFile, \"utf8\");\n const match = envContent.match(/^\\s*REBASE_SERVICE_KEY\\s*=\\s*['\"]?(.*?)['\"]?\\s*$/m);\n if (match && match[1]) {\n envServiceKey = match[1];\n }\n } catch {\n // Ignore\n }\n }\n\n let baseUrl = process.env.REBASE_BASE_URL;\n let serviceKey = process.env.REBASE_SERVICE_KEY || envServiceKey;\n\n const statePath = path.join(projectRoot, \".rebase\", \"state.json\");\n if (fs.existsSync(statePath)) {\n try {\n const state = JSON.parse(fs.readFileSync(statePath, \"utf8\")) as Record<string, unknown>;\n if (state && typeof state === \"object\") {\n if (typeof state.baseUrl === \"string\" && !baseUrl) {\n baseUrl = state.baseUrl;\n }\n if (typeof state.serviceKey === \"string\" && !serviceKey) {\n serviceKey = state.serviceKey;\n }\n }\n } catch {\n // Ignore\n }\n }\n\n const devUrlPath = path.join(projectRoot, \".rebase-dev-url\");\n if (fs.existsSync(devUrlPath) && !baseUrl) {\n try {\n baseUrl = fs.readFileSync(devUrlPath, \"utf8\").trim();\n } catch {\n // Ignore\n }\n }\n\n if (baseUrl && serviceKey) {\n console.log(\"Trying API-first reset via running backend...\");\n try {\n const finalPass = newPassword || \"NewPassword123!\";\n const cleanBaseUrl = baseUrl.replace(/\\/+$/, \"\");\n const searchUrl = `${cleanBaseUrl}/api/admin/users?search=${encodeURIComponent(email)}&limit=1`;\n const searchRes = await fetch(searchUrl, {\n headers: {\n \"Authorization\": `Bearer ${serviceKey}`,\n \"Accept\": \"application/json\"\n }\n });\n if (!searchRes.ok) {\n throw new Error(`Failed to list users: ${searchRes.statusText}`);\n }\n const searchData = await searchRes.json() as unknown;\n if (!searchData || typeof searchData !== \"object\") {\n throw new Error(\"Invalid response format from user search API.\");\n }\n \n let userId: string | undefined;\n if (Array.isArray(searchData)) {\n const firstUser = searchData[0] as unknown;\n if (firstUser && typeof firstUser === \"object\" && \"id\" in firstUser && typeof (firstUser as { id: unknown }).id === \"string\") {\n userId = (firstUser as { id: string }).id;\n } else if (firstUser && typeof firstUser === \"object\" && \"uid\" in firstUser && typeof (firstUser as { uid: unknown }).uid === \"string\") {\n userId = (firstUser as { uid: string }).uid;\n }\n } else if (\"users\" in searchData && Array.isArray((searchData as { users: unknown }).users)) {\n const users = (searchData as { users: unknown[] }).users;\n const firstUser = users[0];\n if (firstUser && typeof firstUser === \"object\" && \"id\" in firstUser && typeof (firstUser as { id: unknown }).id === \"string\") {\n userId = (firstUser as { id: string }).id;\n } else if (firstUser && typeof firstUser === \"object\" && \"uid\" in firstUser && typeof (firstUser as { uid: unknown }).uid === \"string\") {\n userId = (firstUser as { uid: string }).uid;\n }\n }\n\n if (!userId) {\n throw new Error(`User not found with email: ${email}`);\n }\n\n const resetUrl = `${cleanBaseUrl}/api/admin/users/${userId}/reset-password`;\n const resetRes = await fetch(resetUrl, {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${serviceKey}`,\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n },\n body: JSON.stringify({ password: finalPass })\n });\n\n if (!resetRes.ok) {\n const errText = await resetRes.text();\n throw new Error(`Password reset endpoint failed: ${errText || resetRes.statusText}`);\n }\n\n console.log(\"API reset successful.\");\n console.log(chalk.bold(\" 🔑 Rebase Auth — Reset Password (via API)\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Email:\")} ${email}`);\n console.log(` ${chalk.gray(\"Password:\")} ${finalPass}`);\n console.log(\"\");\n return;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n console.warn(chalk.yellow(\"API reset failed, falling back to direct database update...\"));\n console.warn(chalk.gray(` Details: ${errMsg}`));\n }\n }\n\n // 2. Direct-DB Fallback\n const backendDir = requireBackendDir(projectRoot);\n const tsxBin = resolveTsx(projectRoot);\n\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n\n try {\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n env.REBASE_RESET_EMAIL = email;\n env.REBASE_RESET_PASSWORD = newPassword || \"NewPassword123!\";\n env.REBASE_ENV_FILE_PATH = envFile || path.join(projectRoot, \".env\");\n\n const scriptContent = `\nimport { createPostgresDatabaseConnection } from \"@rebasepro/server-postgresql\";\nimport { hashPassword } from \"@rebasepro/server-core\";\nimport { eq } from \"drizzle-orm\";\nimport * as dotenv from \"dotenv\";\nimport path from \"path\";\nimport fs from \"fs\";\n\ndotenv.config({ path: process.env.REBASE_ENV_FILE_PATH });\n\nconst email = process.env.REBASE_RESET_EMAIL!;\nconst newPassword = process.env.REBASE_RESET_PASSWORD!;\n\nasync function resetPassword() {\n const { db } = createPostgresDatabaseConnection(process.env.DATABASE_URL!);\n const hash = await hashPassword(newPassword);\n\n let usersTable;\n try {\n const schemaPath = path.resolve(\"./src/schema.generated.ts\");\n if (fs.existsSync(schemaPath)) {\n const schema = await import(\"file://\" + schemaPath);\n usersTable = schema.users || schema.tables?.users;\n }\n } catch (e) {\n // ignore and fallback\n }\n\n if (!usersTable) {\n const pgServer = await import(\"@rebasepro/server-postgresql\");\n usersTable = pgServer.users;\n }\n\n const passwordHashKey = (usersTable.passwordHash || \"passwordHash\" in usersTable) ? \"passwordHash\" : \"password_hash\";\n\n const result = await db.update(usersTable)\n .set({ [passwordHashKey]: hash })\n .where(eq(usersTable.email, email))\n .returning({\n id: usersTable.id,\n email: usersTable.email\n });\n\n if (result.length > 0) {\n console.log(\"✅ Password reset for: \" + result[0].email);\n ${!newPassword ? 'console.log(\" New password: \" + newPassword);' : \"\"}\n } else {\n console.log(\"✗ User not found: \" + email);\n }\n process.exit(0);\n}\n\nresetPassword().catch(console.error);\n`;\n\n const tmpScriptPath = path.join(backendDir, \".tmp-reset-password.ts\");\n fs.writeFileSync(tmpScriptPath, scriptContent, \"utf-8\");\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔑 Rebase Auth — Reset Password (Direct DB Fallback)\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Email:\")} ${email}`);\n if (newPassword) {\n console.log(` ${chalk.gray(\"Password:\")} ${\"*\".repeat(newPassword.length)}`);\n }\n console.log(\"\");\n\n const child = spawn(tsxBin, [tmpScriptPath], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n\n return new Promise((resolve) => {\n child.on(\"close\", (code) => {\n // Clean up temp script\n try { fs.unlinkSync(tmpScriptPath); } catch { /* ignore */ }\n if (code !== 0) {\n process.exit(code ?? 1);\n }\n resolve();\n });\n });\n } catch (err) {\n console.error(chalk.red(\"✗ Direct database update failed.\"));\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\nfunction printAuthHelp() {\n console.log(`\n${chalk.bold(\"rebase auth\")} — Authentication management commands\n\n${chalk.green.bold(\"Usage\")}\n rebase auth ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"reset-password\")} Reset a user's password\n\n${chalk.green.bold(\"reset-password Options\")}\n ${chalk.blue(\"--email, -e\")} User's email address\n ${chalk.blue(\"--password, -p\")} New password (default: NewPassword123!)\n\n${chalk.green.bold(\"Examples\")}\n rebase auth reset-password user@example.com\n rebase auth reset-password --email user@example.com --password MyNewPass!\n`);\n}\n","/**\n * CLI command: rebase doctor\n *\n * Detects three-way schema drift between collection definitions,\n * the generated Drizzle schema, and the live PostgreSQL database.\n */\nimport chalk from \"chalk\";\nimport { execa } from \"execa\";\nimport {\n requireProjectRoot,\n requireBackendDir,\n getActiveBackendPlugin,\n resolvePluginCliScript,\n resolveTsx,\n findEnvFile\n} from \"../utils/project\";\n\nexport async function doctorCommand(rawArgs: string[]): Promise<void> {\n const projectRoot = requireProjectRoot();\n const backendDir = requireBackendDir(projectRoot);\n\n const activePlugin = getActiveBackendPlugin(backendDir);\n if (!activePlugin) {\n console.error(chalk.red(\"✗ Could not detect an active database plugin.\"));\n console.error(chalk.gray(\" Make sure a package like @rebasepro/server-postgresql is installed in backend/package.json.\"));\n process.exit(1);\n }\n\n const pluginCli = resolvePluginCliScript(backendDir, activePlugin);\n if (!pluginCli) {\n console.error(chalk.red(`✗ Could not find CLI entry point for ${activePlugin}.`));\n process.exit(1);\n }\n\n // Set up environment with DOTENV_CONFIG_PATH\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = { ...process.env as Record<string, string> };\n if (envFile) {\n env.DOTENV_CONFIG_PATH = envFile;\n }\n\n try {\n const isTs = pluginCli.endsWith(\".ts\");\n if (isTs) {\n const tsxBin = resolveTsx(projectRoot);\n if (!tsxBin) {\n console.error(chalk.red(\"✗ Could not find tsx binary.\"));\n process.exit(1);\n }\n await execa(tsxBin, [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n } else {\n await execa(\"node\", [pluginCli, ...rawArgs.slice(2)], {\n cwd: backendDir,\n stdio: \"inherit\",\n env\n });\n }\n } catch {\n // If the process exits with an error code, execa will throw,\n // but inherit stdio means the user already saw the output.\n process.exit(1);\n }\n}\n","import chalk from \"chalk\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport inquirer from \"inquirer\";\nimport { createRequire } from \"module\";\n\nconst require = createRequire(import.meta.url);\n\n/** Supported agent environments and their target directories. */\nconst AGENTS = {\n cursor: {\n label: \"Cursor\",\n detectDir: \".cursor\",\n targetDir: \".cursor/rules\",\n /** Cursor uses .mdc files (Markdown with Context). */\n transformFile: (skillName: string, content: string) => ({\n fileName: `${skillName}.mdc`,\n content\n })\n },\n claude: {\n label: \"Claude Code\",\n detectDir: \".claude\",\n targetDir: \".claude/skills\",\n /** Claude Code uses the standard SKILL.md format in subdirectories. */\n transformFile: (skillName: string, content: string) => ({\n fileName: path.join(skillName, \"SKILL.md\"),\n content\n })\n },\n windsurf: {\n label: \"Windsurf\",\n detectDir: \".windsurf\",\n targetDir: \".windsurf/rules\",\n /** Windsurf uses plain .md files. */\n transformFile: (skillName: string, content: string) => ({\n fileName: `${skillName}.md`,\n content\n })\n },\n gemini: {\n label: \"Gemini CLI / Antigravity\",\n detectDir: \".agents\",\n targetDir: \".agents/skills\",\n /** Gemini uses the standard SKILL.md format in subdirectories. */\n transformFile: (skillName: string, content: string) => ({\n fileName: path.join(skillName, \"SKILL.md\"),\n content\n })\n }\n} as const;\n\ntype AgentKey = keyof typeof AGENTS;\n\n/**\n * Resolve the path to the skills directory from @rebasepro/agent-skills.\n * Works in both workspace (symlink) and published (real files) layouts.\n */\nfunction getSkillsSourceDir(): string {\n const pkgJsonPath = require.resolve(\"@rebasepro/agent-skills/package.json\");\n const pkgRoot = path.dirname(pkgJsonPath);\n const skillsDir = path.join(pkgRoot, \"skills\");\n\n if (!fs.existsSync(skillsDir)) {\n throw new Error(\n `Skills directory not found at ${skillsDir}. ` +\n `Make sure @rebasepro/agent-skills is installed.`\n );\n }\n\n return skillsDir;\n}\n\n/** Read all skill directories and return their names + content. */\nfunction loadSkills(skillsDir: string): Array<{ name: string; content: string }> {\n const entries = fs.readdirSync(skillsDir, { withFileTypes: true });\n const skills: Array<{ name: string; content: string }> = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillMdPath = path.join(skillsDir, entry.name, \"SKILL.md\");\n if (!fs.existsSync(skillMdPath)) continue;\n skills.push({\n name: entry.name,\n content: fs.readFileSync(skillMdPath, \"utf-8\")\n });\n }\n\n return skills;\n}\n\n/** Detect which agent environments already exist in the project. */\nfunction detectAgents(projectDir: string): AgentKey[] {\n const detected: AgentKey[] = [];\n for (const [key, agent] of Object.entries(AGENTS)) {\n if (fs.existsSync(path.join(projectDir, agent.detectDir))) {\n detected.push(key as AgentKey);\n }\n }\n return detected;\n}\n\n/** Install skills for a specific agent into the project directory. */\nfunction installForAgent(\n agentKey: AgentKey,\n skills: Array<{ name: string; content: string }>,\n projectDir: string\n): number {\n const agent = AGENTS[agentKey];\n const targetBase = path.join(projectDir, agent.targetDir);\n\n // Ensure the target directory exists\n fs.mkdirSync(targetBase, { recursive: true });\n\n let count = 0;\n for (const skill of skills) {\n const { fileName, content } = agent.transformFile(skill.name, skill.content);\n const targetPath = path.join(targetBase, fileName);\n\n // Ensure parent directory exists (for subdirectory-based formats)\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, content, \"utf-8\");\n count++;\n }\n\n return count;\n}\n\nexport async function skillsCommand(subcommand: string | undefined, _args: string[]) {\n switch (subcommand) {\n case \"install\":\n await skillsInstall();\n break;\n case \"--help\":\n case undefined:\n printSkillsHelp();\n break;\n default:\n console.log(chalk.red(`Unknown skills subcommand: ${subcommand}`));\n console.log(\"\");\n printSkillsHelp();\n }\n}\n\nasync function skillsInstall() {\n const projectDir = process.cwd();\n\n // 1. Load skills from @rebasepro/agent-skills\n let skillsDir: string;\n try {\n skillsDir = getSkillsSourceDir();\n } catch (err) {\n console.error(`${chalk.red.bold(\"ERROR\")} ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n\n const skills = loadSkills(skillsDir);\n if (skills.length === 0) {\n console.error(`${chalk.red.bold(\"ERROR\")} No skills found in ${skillsDir}`);\n process.exit(1);\n }\n\n // 2. Detect existing agent environments\n let agents = detectAgents(projectDir);\n\n // 3. If none detected, ask the user\n if (agents.length === 0) {\n const choices = Object.entries(AGENTS).map(([key, agent]) => ({\n name: agent.label,\n value: key,\n checked: false\n }));\n\n const { selectedAgents } = await inquirer.prompt([{\n type: \"checkbox\",\n name: \"selectedAgents\",\n message: \"No AI agent configuration detected. Which agents do you use?\",\n choices,\n validate: (input: string[]) => {\n if (input.length === 0) return \"Please select at least one agent.\";\n return true;\n }\n }]);\n\n agents = selectedAgents as AgentKey[];\n }\n\n // 4. Install skills for each agent\n console.log(\"\");\n console.log(chalk.gray(` Found ${chalk.white(skills.length)} Rebase skills`));\n console.log(\"\");\n\n for (const agentKey of agents) {\n const agent = AGENTS[agentKey];\n const count = installForAgent(agentKey, skills, projectDir);\n console.log(` ${chalk.green(\"✓\")} ${chalk.bold(agent.label)} — ${count} skills installed to ${chalk.gray(agent.targetDir)}`);\n }\n\n console.log(\"\");\n console.log(chalk.gray(\" Skills are project-local. Commit them to share with your team.\"));\n console.log(chalk.gray(\" Re-run this command anytime to update to the latest skills.\"));\n console.log(\"\");\n}\n\nfunction printSkillsHelp() {\n console.log(`\n${chalk.bold(\"rebase skills\")} — Manage AI agent skills\n\n${chalk.green.bold(\"Usage\")}\n rebase skills ${chalk.blue(\"<subcommand>\")}\n\n${chalk.green.bold(\"Subcommands\")}\n ${chalk.blue.bold(\"install\")} Install Rebase agent skills for your AI coding assistant\n Supports: Cursor, Claude Code, Windsurf, Gemini CLI, Antigravity\n\n${chalk.green.bold(\"Examples\")}\n ${chalk.cyan(\"rebase skills install\")}\n`);\n}\n","/**\n * CLI command: rebase api-keys <action>\n *\n * Subcommands:\n * list — List all API keys (masked)\n * create — Create a new API key\n * revoke — Revoke an existing API key\n */\nimport arg from \"arg\";\nimport chalk from \"chalk\";\nimport {\n requireProjectRoot,\n findEnvFile\n} from \"../utils/project\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n/* ═══════════════════════════════════════════════════════════════\n Env helper — reads SERVICE_KEY and PORT from .env\n ═══════════════════════════════════════════════════════════════ */\n\nfunction loadEnv(projectRoot: string): Record<string, string> {\n const envFile = findEnvFile(projectRoot);\n const env: Record<string, string> = {};\n if (envFile && fs.existsSync(envFile)) {\n const content = fs.readFileSync(envFile, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const idx = trimmed.indexOf(\"=\");\n if (idx > 0) {\n const key = trimmed.slice(0, idx).trim();\n let value = trimmed.slice(idx + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n env[key] = value;\n }\n }\n }\n return env;\n}\n\nfunction resolveBaseUrl(env: Record<string, string>): string {\n const port = env.PORT || env.REBASE_PORT || \"3001\";\n return env.REBASE_BASE_URL || `http://localhost:${port}`;\n}\n\n/* ═══════════════════════════════════════════════════════════════\n Entry\n ═══════════════════════════════════════════════════════════════ */\n\nexport async function apiKeysCommand(subcommand: string | undefined, rawArgs: string[]): Promise<void> {\n if (!subcommand || subcommand === \"--help\") {\n printApiKeysHelp();\n return;\n }\n\n switch (subcommand) {\n case \"list\":\n await listKeys(rawArgs);\n break;\n case \"create\":\n await createKey(rawArgs);\n break;\n case \"revoke\":\n await revokeKey(rawArgs);\n break;\n default:\n console.error(chalk.red(`Unknown api-keys command: ${subcommand}`));\n console.log(\"\");\n printApiKeysHelp();\n process.exit(1);\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n list\n ═══════════════════════════════════════════════════════════════ */\n\nasync function listKeys(_rawArgs: string[]): Promise<void> {\n const projectRoot = requireProjectRoot();\n const env = loadEnv(projectRoot);\n const baseUrl = resolveBaseUrl(env);\n const serviceKey = env.SERVICE_KEY || env.REBASE_SERVICE_KEY;\n\n if (!serviceKey) {\n console.error(chalk.red(\"✗ SERVICE_KEY not found in .env — required for admin operations.\"));\n process.exit(1);\n }\n\n try {\n const res = await fetch(`${baseUrl}/api/admin/api-keys`, {\n headers: { Authorization: `Bearer ${serviceKey}` }\n });\n if (!res.ok) {\n const body = await res.text();\n console.error(chalk.red(`✗ Failed to list API keys: ${res.status} ${body}`));\n process.exit(1);\n }\n\n const { keys } = await res.json() as { keys: Array<{\n id: string; name: string; key_prefix: string;\n permissions: Array<{ collection: string; operations: string[] }>;\n rate_limit: number | null; revoked_at: string | null;\n expires_at: string | null; last_used_at: string | null;\n created_at: string;\n }>};\n\n console.log(\"\");\n console.log(chalk.bold(\" 🔑 API Keys\"));\n console.log(\"\");\n\n if (keys.length === 0) {\n console.log(chalk.gray(\" No API keys found.\"));\n console.log(\"\");\n return;\n }\n\n for (const key of keys) {\n const status = key.revoked_at ? chalk.red(\"revoked\")\n : (key.expires_at && new Date(key.expires_at) < new Date()) ? chalk.yellow(\"expired\")\n : chalk.green(\"active\");\n\n const perms = key.permissions.map(p =>\n `${p.collection}(${p.operations.join(\",\")})`\n ).join(\", \");\n\n console.log(` ${chalk.bold(key.name)} ${chalk.gray(`[${key.key_prefix}•••]`)} ${status}`);\n console.log(` ${chalk.gray(\"ID:\")} ${key.id}`);\n console.log(` ${chalk.gray(\"Permissions:\")} ${perms || \"none\"}`);\n console.log(` ${chalk.gray(\"Created:\")} ${new Date(key.created_at).toLocaleDateString()}`);\n if (key.last_used_at) {\n console.log(` ${chalk.gray(\"Last used:\")} ${new Date(key.last_used_at).toLocaleDateString()}`);\n }\n console.log(\"\");\n }\n } catch (e: unknown) {\n console.error(chalk.red(`✗ ${e instanceof Error ? e.message : String(e)}`));\n console.error(chalk.gray(\" Is the Rebase server running?\"));\n process.exit(1);\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n create\n ═══════════════════════════════════════════════════════════════ */\n\nasync function createKey(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--name\": String,\n \"--permissions\": String,\n \"--admin\": Boolean,\n \"--rate-limit\": Number,\n \"--expires\": String,\n \"-n\": \"--name\"\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase api-keys create\"\n permissive: true\n }\n );\n\n const name = args[\"--name\"] || args._[0];\n const permissionsRaw = args[\"--permissions\"];\n\n if (!name) {\n console.error(chalk.red(\"✗ Name is required.\"));\n console.log(\"\");\n console.log(chalk.gray(' Usage: rebase api-keys create --name \"My Key\" --permissions \\'[{\"collection\":\"*\",\"operations\":[\"read\"]}]\\''));\n process.exit(1);\n }\n\n let permissions: Array<{ collection: string; operations: string[] }>;\n if (permissionsRaw) {\n try {\n permissions = JSON.parse(permissionsRaw);\n } catch {\n console.error(chalk.red(\"✗ Invalid --permissions JSON.\"));\n console.log(chalk.gray(' Example: \\'[{\"collection\":\"*\",\"operations\":[\"read\",\"write\"]}]\\''));\n process.exit(1);\n return; // unreachable but satisfies TS\n }\n } else {\n // Default: full access to all collections\n permissions = [{ collection: \"*\", operations: [\"read\", \"write\", \"delete\"] }];\n }\n\n let expires_at: string | null = null;\n const expiresFlag = args[\"--expires\"];\n if (expiresFlag) {\n const days: Record<string, number> = { \"7d\": 7, \"30d\": 30, \"90d\": 90, \"1y\": 365 };\n if (days[expiresFlag]) {\n expires_at = new Date(Date.now() + days[expiresFlag] * 86400000).toISOString();\n } else {\n const parsed = new Date(expiresFlag);\n if (isNaN(parsed.getTime())) {\n console.error(chalk.red(\"✗ Invalid --expires value. Use 7d, 30d, 90d, 1y, or an ISO date.\"));\n process.exit(1);\n }\n expires_at = parsed.toISOString();\n }\n }\n\n const projectRoot = requireProjectRoot();\n const env = loadEnv(projectRoot);\n const baseUrl = resolveBaseUrl(env);\n const serviceKey = env.SERVICE_KEY || env.REBASE_SERVICE_KEY;\n\n if (!serviceKey) {\n console.error(chalk.red(\"✗ SERVICE_KEY not found in .env — required for admin operations.\"));\n process.exit(1);\n }\n\n try {\n const body: Record<string, unknown> = {\n name,\n permissions,\n admin: args[\"--admin\"] ?? false,\n rate_limit: args[\"--rate-limit\"] ?? null,\n expires_at\n };\n\n const res = await fetch(`${baseUrl}/api/admin/api-keys`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${serviceKey}`,\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body)\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n console.error(chalk.red(`✗ Failed to create API key: ${res.status} ${errBody}`));\n process.exit(1);\n }\n\n const { key } = await res.json() as { key: { name: string; key: string; key_prefix: string; id: string } };\n\n console.log(\"\");\n console.log(chalk.bold.green(\" ✓ API key created successfully\"));\n console.log(\"\");\n console.log(` ${chalk.gray(\"Name:\")} ${key.name}`);\n console.log(` ${chalk.gray(\"ID:\")} ${key.id}`);\n console.log(` ${chalk.gray(\"Prefix:\")} ${key.key_prefix}`);\n console.log(\"\");\n console.log(chalk.bold.yellow(\" ⚠ Copy your key now — it won't be shown again:\"));\n console.log(\"\");\n console.log(` ${chalk.cyan(key.key)}`);\n console.log(\"\");\n } catch (e: unknown) {\n console.error(chalk.red(`✗ ${e instanceof Error ? e.message : String(e)}`));\n console.error(chalk.gray(\" Is the Rebase server running?\"));\n process.exit(1);\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n revoke\n ═══════════════════════════════════════════════════════════════ */\n\nasync function revokeKey(rawArgs: string[]): Promise<void> {\n const args = arg(\n {\n \"--id\": String\n },\n {\n argv: rawArgs.slice(4), // skip \"node rebase api-keys revoke\"\n permissive: true\n }\n );\n\n const id = args[\"--id\"] || args._[0];\n\n if (!id) {\n console.error(chalk.red(\"✗ Key ID is required.\"));\n console.log(\"\");\n console.log(chalk.gray(\" Usage: rebase api-keys revoke <key-id>\"));\n process.exit(1);\n }\n\n const projectRoot = requireProjectRoot();\n const env = loadEnv(projectRoot);\n const baseUrl = resolveBaseUrl(env);\n const serviceKey = env.SERVICE_KEY || env.REBASE_SERVICE_KEY;\n\n if (!serviceKey) {\n console.error(chalk.red(\"✗ SERVICE_KEY not found in .env — required for admin operations.\"));\n process.exit(1);\n }\n\n try {\n const res = await fetch(`${baseUrl}/api/admin/api-keys/${encodeURIComponent(id)}`, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${serviceKey}` }\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n console.error(chalk.red(`✗ Failed to revoke API key: ${res.status} ${errBody}`));\n process.exit(1);\n }\n\n console.log(\"\");\n console.log(chalk.bold.green(\" ✓ API key revoked successfully\"));\n console.log(` ${chalk.gray(\"ID:\")} ${id}`);\n console.log(\"\");\n } catch (e: unknown) {\n console.error(chalk.red(`✗ ${e instanceof Error ? e.message : String(e)}`));\n console.error(chalk.gray(\" Is the Rebase server running?\"));\n process.exit(1);\n }\n}\n\n/* ═══════════════════════════════════════════════════════════════\n Help\n ═══════════════════════════════════════════════════════════════ */\n\nfunction printApiKeysHelp() {\n console.log(`\n${chalk.bold(\"rebase api-keys\")} — Manage Service API Keys\n\n${chalk.green.bold(\"Usage\")}\n rebase api-keys ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"list\")} List all API keys\n ${chalk.blue.bold(\"create\")} Create a new API key\n ${chalk.blue.bold(\"revoke\")} Revoke an API key\n\n${chalk.green.bold(\"create Options\")}\n ${chalk.blue(\"--name, -n\")} Key name ${chalk.gray(\"(required)\")}\n ${chalk.blue(\"--permissions\")} JSON array of permissions\n ${chalk.gray('Default: [{\"collection\":\"*\",\"operations\":[\"read\",\"write\",\"delete\"]}]')}\n ${chalk.blue(\"--admin\")} Grant admin role (access to admin routes)\n ${chalk.blue(\"--rate-limit\")} Requests per 15-min window ${chalk.gray(\"(default: 1000)\")}\n ${chalk.blue(\"--expires\")} Expiration: 7d, 30d, 90d, 1y, or ISO date\n\n${chalk.green.bold(\"revoke Options\")}\n ${chalk.blue(\"--id\")} API key ID to revoke ${chalk.gray(\"(or positional arg)\")}\n\n${chalk.green.bold(\"Examples\")}\n rebase api-keys list\n rebase api-keys create --name \"Analytics\" --permissions '[{\"collection\":\"events\",\"operations\":[\"read\"]}]'\n rebase api-keys create -n \"Full Access\" --expires 90d\n rebase api-keys revoke abc123-def456\n`);\n}\n","import chalk from \"chalk\";\nimport arg from \"arg\";\nimport { createRebaseApp } from \"./commands/init\";\nimport { generateSdkCommand } from \"./commands/generate_sdk\";\nimport { schemaCommand } from \"./commands/schema\";\nimport { dbCommand } from \"./commands/db\";\nimport { devCommand } from \"./commands/dev\";\nimport { buildCommand } from \"./commands/build\";\nimport { startCommand } from \"./commands/start\";\nimport { authCommand } from \"./commands/auth\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport { skillsCommand } from \"./commands/skills\";\nimport { apiKeysCommand } from \"./commands/api-keys\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction getVersion(): string {\n try {\n // Try to read version from package.json\n const pkgPath = path.resolve(__dirname, \"../package.json\");\n if (fs.existsSync(pkgPath)) {\n return JSON.parse(fs.readFileSync(pkgPath, \"utf-8\")).version;\n }\n } catch {\n // ignore\n }\n return \"unknown\";\n}\n\nexport async function entry(args: string[]) {\n const parsedArgs = arg(\n {\n \"--version\": Boolean,\n \"--help\": Boolean,\n \"-v\": \"--version\",\n \"-h\": \"--help\"\n },\n {\n argv: args.slice(2),\n permissive: true\n }\n );\n\n if (parsedArgs[\"--version\"]) {\n console.log(getVersion());\n return;\n }\n\n const command = parsedArgs._[0];\n const subcommand = parsedArgs._[1];\n\n // Show global help only when no command given, or --help with no recognized command\n const namespacedCommands = [\"schema\", \"db\", \"dev\", \"build\", \"start\", \"auth\", \"doctor\", \"skills\", \"api-keys\"];\n if (!command || (parsedArgs[\"--help\"] && !namespacedCommands.includes(command))) {\n printHelp();\n return;\n }\n\n // For namespaced commands with --help, pass it through as subcommand\n const effectiveSubcommand = parsedArgs[\"--help\"] ? \"--help\" : subcommand;\n\n switch (command) {\n case \"init\":\n await createRebaseApp(args);\n break;\n\n case \"generate-sdk\": {\n const sdkArgs = arg(\n {\n \"--collections-dir\": String,\n \"--output\": String,\n \"-c\": \"--collections-dir\",\n \"-o\": \"--output\"\n },\n {\n argv: args.slice(3),\n permissive: true\n }\n );\n await generateSdkCommand({\n collectionsDir: sdkArgs[\"--collections-dir\"] || \"./config/collections\",\n output: sdkArgs[\"--output\"] || \"./generated/sdk\",\n cwd: process.cwd()\n });\n break;\n }\n\n case \"schema\":\n await schemaCommand(effectiveSubcommand, args);\n break;\n\n case \"db\":\n await dbCommand(effectiveSubcommand, args);\n break;\n\n case \"dev\":\n await devCommand(args);\n break;\n\n case \"build\":\n await buildCommand();\n break;\n\n case \"start\":\n await startCommand();\n break;\n\n case \"auth\":\n await authCommand(effectiveSubcommand, args);\n break;\n\n case \"doctor\":\n await doctorCommand(args);\n break;\n\n case \"skills\":\n await skillsCommand(effectiveSubcommand, args);\n break;\n\n case \"api-keys\":\n await apiKeysCommand(effectiveSubcommand, args);\n break;\n\n default:\n console.log(chalk.red(`Unknown command: ${command}`));\n console.log(\"\");\n printHelp();\n }\n}\n\nfunction printHelp() {\n console.log(`\n${chalk.bold(\"Rebase CLI\")} — Developer tools for Rebase projects\n\n${chalk.green.bold(\"Usage\")}\n rebase ${chalk.blue(\"<command>\")} [options]\n\n${chalk.green.bold(\"Commands\")}\n ${chalk.blue.bold(\"init\")} Create a new Rebase project\n ${chalk.blue.bold(\"dev\")} Start the development server\n ${chalk.blue.bold(\"build\")} Build all workspace packages\n ${chalk.blue.bold(\"start\")} Start the backend server ${chalk.gray(\"(production)\")}\n\n${chalk.green.bold(\"Schema\")}\n ${chalk.blue.bold(\"schema generate\")} Generate Drizzle schema from collections\n ${chalk.blue.bold(\"schema introspect\")} Introspect database → Rebase collections\n ${chalk.blue.bold(\"schema\")} ${chalk.gray(\"--help\")} Show schema command help\n\n${chalk.green.bold(\"Database\")}\n ${chalk.blue.bold(\"db push\")} Apply schema directly to database ${chalk.gray(\"(dev)\")}\n ${chalk.blue.bold(\"db generate\")} Generate SQL migration files\n ${chalk.blue.bold(\"db migrate\")} Run pending migrations\n ${chalk.blue.bold(\"db\")} ${chalk.gray(\"--help\")} Show database command help\n\n${chalk.green.bold(\"SDK\")}\n ${chalk.blue.bold(\"generate-sdk\")} Generate a typed TypeScript SDK from collections\n\n${chalk.green.bold(\"Auth\")}\n ${chalk.blue.bold(\"auth reset-password\")} Reset a user's password\n ${chalk.blue.bold(\"auth\")} ${chalk.gray(\"--help\")} Show auth command help\n\n${chalk.green.bold(\"Diagnostics\")}\n ${chalk.blue.bold(\"doctor\")} Detect schema drift between collections, schema, and DB\n\n${chalk.green.bold(\"AI Agent Skills\")}\n ${chalk.blue.bold(\"skills install\")} Install Rebase agent skills for your AI coding assistant\n\n${chalk.green.bold(\"API Keys\")}\n ${chalk.blue.bold(\"api-keys list\")} List all service API keys\n ${chalk.blue.bold(\"api-keys create\")} Create a new scoped API key\n ${chalk.blue.bold(\"api-keys revoke\")} Revoke an existing API key\n ${chalk.blue.bold(\"api-keys\")} ${chalk.gray(\"--help\")} Show API key command help\n\n${chalk.green.bold(\"Options\")}\n ${chalk.blue(\"--version, -v\")} Show version number\n ${chalk.blue(\"--help, -h\")} Show this help message\n\n${chalk.gray(\"Documentation: https://rebase.pro/docs\")}\n`);\n}\n"],"mappings":"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"}