@beaulewis/saas-cli 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -33,6 +33,7 @@ import {
33
33
  import dotenv from "dotenv";
34
34
 
35
35
  // src/cli.ts
36
+ import { createRequire } from "module";
36
37
  import { Command as Command11 } from "commander";
37
38
  import pc8 from "picocolors";
38
39
 
@@ -1431,7 +1432,8 @@ var videoCommand = new Command10("video").description("Video processing with FFm
1431
1432
  );
1432
1433
 
1433
1434
  // src/cli.ts
1434
- var VERSION = "1.0.0";
1435
+ var require2 = createRequire(import.meta.url);
1436
+ var { version: VERSION } = require2("../package.json");
1435
1437
  function createProgram() {
1436
1438
  const program = new Command11();
1437
1439
  program.name("saas").description("A unified CLI for Flutter SaaS development").version(VERSION, "-V, --version", "Display version number").configureHelp({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/cli.ts","../src/commands/ask/index.ts","../src/services/perplexity.ts","../src/commands/cf/index.ts","../src/utils/exec.ts","../src/commands/docs/index.ts","../src/commands/flags/index.ts","../src/commands/gen/index.ts","../src/commands/init/index.ts","../src/commands/push/index.ts","../src/commands/redis/index.ts","../src/commands/supabase/index.ts","../src/services/supabase.ts","../src/commands/video/index.ts"],"sourcesContent":["import dotenv from 'dotenv';\nimport { run } from './cli.js';\n\n// Load .env from current working directory\n// Shell exports take precedence (override: false is default)\n// quiet: true suppresses dotenv's default logging\nconst result = dotenv.config({ quiet: true });\nif (result.error && process.env.DEBUG) {\n console.error('[dotenv]', result.error.message);\n}\n\nrun();\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { askCommand } from './commands/ask/index.js';\nimport { cfCommand } from './commands/cf/index.js';\n// Import commands (will be added as we implement them)\nimport { docsCommand } from './commands/docs/index.js';\nimport { flagsCommand } from './commands/flags/index.js';\nimport { genCommand } from './commands/gen/index.js';\nimport { initCommand } from './commands/init/index.js';\nimport { pushCommand } from './commands/push/index.js';\nimport { redisCommand } from './commands/redis/index.js';\nimport { supabaseCommand } from './commands/supabase/index.js';\nimport { videoCommand } from './commands/video/index.js';\nimport { handleError } from './utils/error.js';\n\nconst VERSION = '1.0.0';\n\n/**\n * Create and configure the CLI program\n */\nfunction createProgram(): Command {\n const program = new Command();\n\n program\n .name('saas')\n .description('A unified CLI for Flutter SaaS development')\n .version(VERSION, '-V, --version', 'Display version number')\n .configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n })\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Enable verbose output')\n .option('--debug', 'Enable debug output')\n .hook('preAction', (thisCommand) => {\n // Store global options for access in commands\n const opts = thisCommand.opts();\n process.env.SAAS_CLI_JSON = opts.json ? '1' : '';\n process.env.SAAS_CLI_VERBOSE = opts.verbose ? '1' : '';\n process.env.SAAS_CLI_DEBUG = opts.debug ? '1' : '';\n });\n\n // Register domain commands\n program.addCommand(docsCommand);\n program.addCommand(askCommand);\n program.addCommand(genCommand);\n program.addCommand(supabaseCommand);\n program.addCommand(redisCommand);\n program.addCommand(cfCommand);\n program.addCommand(pushCommand);\n program.addCommand(flagsCommand);\n program.addCommand(videoCommand);\n program.addCommand(initCommand);\n\n // Add examples to help\n program.addHelpText(\n 'after',\n `\n${pc.cyan('Examples:')}\n ${pc.dim('# Look up Flutter documentation')}\n $ saas docs flutter \"ListView.builder with pagination\"\n\n ${pc.dim('# Ask AI a question')}\n $ saas ask \"best practices for offline-first Flutter apps\"\n\n ${pc.dim('# Generate a Riverpod notifier')}\n $ saas gen riverpod notifier UserList --state \"List<User>\"\n\n ${pc.dim('# Generate RLS policies')}\n $ saas supabase rls recipes --policy user-owned --column user_id\n\n ${pc.dim('# Check feature flag status')}\n $ saas flags list\n\n${pc.cyan('Documentation:')}\n https://github.com/your-username/saas-cli\n`,\n );\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function run(): Promise<void> {\n const program = createProgram();\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n handleError(error);\n }\n}\n\nexport { createProgram };\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { getPerplexityClient } from '../../services/perplexity.js';\nimport { MODEL_ALIASES, type PerplexityModel } from '../../types/index.js';\nimport { getAPIKey, loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\n\ninterface AskOptions {\n model?: string;\n recent?: 'day' | 'week' | 'month' | 'year';\n domains?: string;\n sources?: boolean;\n json?: boolean;\n}\n\nexport const askCommand = new Command('ask')\n .description('Ask AI-powered questions with web search (Perplexity)')\n .argument('<query>', 'Your question')\n .option('-m, --model <model>', 'Model: sonar, pro, reasoning, deep', 'sonar')\n .option('--recent <period>', 'Filter by recency: day, week, month, year')\n .option('--domains <domains>', 'Limit to domains (comma-separated)')\n .option('--sources', 'Include source URLs in output')\n .option('--json', 'Output as JSON')\n .action(async (query: string, options: AskOptions) => {\n const modelAlias = options.model ?? 'sonar';\n const model: PerplexityModel = MODEL_ALIASES[modelAlias] ?? 'sonar';\n const modelDisplay = modelAlias.toUpperCase();\n\n const spinner = ora(`Asking ${modelDisplay}...`).start();\n\n try {\n const config = await loadGlobalConfig();\n const apiKey = getAPIKey('perplexity', config);\n\n if (!apiKey) {\n spinner.fail('Perplexity API key not found');\n throw new AuthError(\n 'PERPLEXITY_API_KEY environment variable is not set',\n 'Get your API key from https://perplexity.ai/settings/api and set PERPLEXITY_API_KEY',\n );\n }\n\n const client = getPerplexityClient(apiKey);\n const result = await client.ask(query, {\n model,\n searchRecencyFilter: options.recent,\n searchDomainFilter: options.domains?.split(','),\n returnSources: options.sources,\n });\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify({ query, model: modelAlias, result }, null, 2));\n } else {\n console.log(pc.cyan(`\\n━━━ ${modelDisplay} ━━━\\n`));\n console.log(result);\n }\n } catch (error) {\n spinner.fail('Query failed');\n handleError(error);\n }\n });\n","import type { Got } from 'got';\nimport type { PerplexityAskOptions, PerplexityResponse } from '../types/index.js';\nimport { cachedFetch, cacheKey } from '../utils/cache.js';\nimport { createAuthenticatedClient } from './http.js';\n\nconst PERPLEXITY_BASE_URL = 'https://api.perplexity.ai';\n\n/**\n * Perplexity AI client for web-grounded questions\n */\nexport class PerplexityClient {\n private client: Got;\n\n constructor(apiKey: string) {\n this.client = createAuthenticatedClient(PERPLEXITY_BASE_URL, apiKey);\n }\n\n /**\n * Ask a question using Perplexity AI\n */\n async ask(query: string, options: PerplexityAskOptions = {}): Promise<string> {\n const model = options.model ?? 'sonar';\n\n const requestBody: Record<string, unknown> = {\n model,\n messages: [\n {\n role: 'system',\n content:\n 'You are a helpful assistant for software development questions. Be precise and include code examples when relevant. Focus on Flutter, Dart, and related technologies.',\n },\n {\n role: 'user',\n content: query,\n },\n ],\n max_tokens: options.maxTokens ?? 2048,\n temperature: options.temperature ?? 0.2,\n return_related_questions: false,\n };\n\n // Add optional filters\n if (options.searchRecencyFilter) {\n requestBody.search_recency_filter = options.searchRecencyFilter;\n }\n\n if (options.searchDomainFilter && options.searchDomainFilter.length > 0) {\n requestBody.search_domain_filter = options.searchDomainFilter;\n }\n\n const response = await this.client\n .post('chat/completions', {\n json: requestBody,\n })\n .json<PerplexityResponse>();\n\n return this.formatResponse(response, options.returnSources);\n }\n\n /**\n * Ask with caching enabled\n */\n async askCached(query: string, options: PerplexityAskOptions = {}): Promise<string> {\n const model = options.model ?? 'sonar';\n const key = cacheKey('perplexity', model, query);\n\n return cachedFetch(\n key,\n () => this.ask(query, options),\n 1800 * 1000, // 30 minute cache for AI responses\n );\n }\n\n /**\n * Format the API response\n */\n private formatResponse(response: PerplexityResponse, includeSources?: boolean): string {\n const choice = response.choices[0];\n if (!choice) {\n return 'No response received from AI.';\n }\n\n let output = choice.message.content;\n\n // Add citations if requested\n if (includeSources && response.citations && response.citations.length > 0) {\n output += '\\n\\n---\\nSources:\\n';\n response.citations.forEach((url, i) => {\n output += `[${i + 1}] ${url}\\n`;\n });\n }\n\n return output;\n }\n}\n\n// Singleton instance cache\nlet clientInstance: PerplexityClient | null = null;\nlet currentApiKey: string | null = null;\n\n/**\n * Get or create a Perplexity client instance\n */\nexport function getPerplexityClient(apiKey: string): PerplexityClient {\n if (!clientInstance || currentApiKey !== apiKey) {\n clientInstance = new PerplexityClient(apiKey);\n currentApiKey = apiKey;\n }\n return clientInstance;\n}\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { AuthError, CLIError, handleError } from '../../utils/error.js';\nimport { execFileAsync } from '../../utils/exec.js';\nimport { assertValidWorkerName } from '../../utils/validation.js';\n\nasync function checkWranglerCLI(): Promise<boolean> {\n try {\n await execFileAsync('wrangler', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function runWranglerCommand(args: string[]): Promise<string> {\n const isInstalled = await checkWranglerCLI();\n if (!isInstalled) {\n throw new CLIError('Wrangler CLI not found', 1, 'Install with: pnpm add -g wrangler');\n }\n\n if (!process.env.CF_API_TOKEN && !process.env.CLOUDFLARE_API_TOKEN) {\n throw new AuthError(\n 'Cloudflare API token not found',\n 'Set CF_API_TOKEN or CLOUDFLARE_API_TOKEN environment variable',\n );\n }\n\n try {\n const { stdout, stderr } = await execFileAsync('wrangler', args);\n if (stderr && !stderr.includes('warning')) {\n console.error(stderr);\n }\n return stdout;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`Wrangler command failed: ${message}`);\n }\n}\n\nexport const cfCommand = new Command('cf')\n .description('Cloudflare Workers and KV management')\n .addCommand(\n new Command('worker')\n .description('Worker management')\n .argument('<action>', 'Action: new, deploy, logs, list')\n .argument('[name]', 'Worker name')\n .action(async (action, name) => {\n const spinner = ora(`Worker ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n if (!name) throw new CLIError('Worker name required for \"new\" action');\n assertValidWorkerName(name);\n args = ['init', name];\n break;\n case 'deploy':\n if (name) assertValidWorkerName(name);\n args = name ? ['deploy', '--name', name] : ['deploy'];\n break;\n case 'logs':\n if (name) assertValidWorkerName(name);\n args = name ? ['tail', name] : ['tail'];\n break;\n case 'list':\n args = ['deployments', 'list'];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, deploy, logs, list',\n );\n }\n\n const output = await runWranglerCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Worker ${action} failed`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('kv')\n .description('KV namespace operations')\n .argument('<action>', 'Action: namespaces, keys, get, put, del')\n .argument('[namespace]', 'KV namespace ID')\n .argument('[key]', 'Key name')\n .argument('[value]', 'Value (for put)')\n .action(async (action, namespace, key, value) => {\n const spinner = ora(`KV ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'namespaces':\n args = ['kv:namespace', 'list'];\n break;\n case 'keys':\n if (!namespace) throw new CLIError('Namespace ID required');\n args = ['kv:key', 'list', '--namespace-id', namespace];\n break;\n case 'get':\n if (!namespace || !key) throw new CLIError('Namespace and key required');\n args = ['kv:key', 'get', key, '--namespace-id', namespace];\n break;\n case 'put':\n if (!namespace || !key || !value)\n throw new CLIError('Namespace, key, and value required');\n args = ['kv:key', 'put', key, value, '--namespace-id', namespace];\n break;\n case 'del':\n if (!namespace || !key) throw new CLIError('Namespace and key required');\n args = ['kv:key', 'delete', key, '--namespace-id', namespace];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: namespaces, keys, get, put, del',\n );\n }\n\n const output = await runWranglerCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`KV ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\n/**\n * Promisified execFile for safe command execution.\n * Uses execFile instead of exec to prevent shell injection attacks.\n * Arguments are passed as an array, not concatenated into a shell command string.\n */\nexport const execFileAsync = promisify(execFile);\n\n/**\n * Check if a command exists in the system PATH.\n * Uses 'which' on Unix-like systems and 'where' on Windows.\n *\n * @param command - The command name to check\n * @returns Promise<boolean> - true if command exists, false otherwise\n */\nexport async function commandExists(command: string): Promise<boolean> {\n const checker = process.platform === 'win32' ? 'where' : 'which';\n try {\n await execFileAsync(checker, [command]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Assert that a command exists, throwing a helpful CLIError if not.\n *\n * @param command - The command name to check\n * @param displayName - Human-readable name for error messages\n * @param installHint - Installation instructions\n */\nexport async function assertCommandExists(\n command: string,\n displayName: string,\n installHint: string,\n): Promise<void> {\n const exists = await commandExists(command);\n if (!exists) {\n // Import dynamically to avoid circular dependency\n const { CLIError } = await import('./error.js');\n const { EXIT_CODES } = await import('../types/index.js');\n throw new CLIError(`${displayName} not found`, EXIT_CODES.GENERAL_ERROR, installHint);\n }\n}\n","import { Command } from 'commander';\n\nexport const docsCommand = new Command('docs')\n .description('Look up documentation via Context7')\n .addCommand(\n new Command('flutter')\n .description('Search Flutter documentation')\n .argument('<query>', 'Search query')\n .action(async (query) => {\n const { flutterAction } = await import('./flutter.js');\n await flutterAction(query);\n }),\n )\n .addCommand(\n new Command('dart')\n .description('Search Dart documentation')\n .argument('<query>', 'Search query')\n .action(async (query) => {\n const { dartAction } = await import('./dart.js');\n await dartAction(query);\n }),\n )\n .addCommand(\n new Command('package')\n .description('Search package documentation')\n .argument('<package>', 'Package name')\n .argument('[query]', 'Search query')\n .action(async (pkg, query) => {\n const { packageAction } = await import('./package.js');\n await packageAction(pkg, query);\n }),\n )\n .addCommand(\n new Command('widget')\n .description('Look up widget documentation')\n .argument('<name>', 'Widget name')\n .option('--properties', 'Show all properties')\n .action(async (name, options) => {\n const { widgetAction } = await import('./widget.js');\n await widgetAction(name, options);\n }),\n );\n","import { Command } from 'commander';\nimport got from 'got';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\nimport { formatTable } from '../../utils/output.js';\n\nconst POSTHOG_API = 'https://app.posthog.com/api';\n\nasync function getPostHogConfig() {\n const projectId = process.env.POSTHOG_PROJECT_ID;\n const apiKey = process.env.POSTHOG_API_KEY;\n\n if (!projectId || !apiKey) {\n const config = await loadGlobalConfig();\n return {\n projectId: projectId || config.posthog?.projectId,\n apiKey: apiKey || config.posthog?.apiKey,\n };\n }\n\n return { projectId, apiKey };\n}\n\ninterface FeatureFlag {\n id: number;\n key: string;\n name: string;\n active: boolean;\n rollout_percentage?: number;\n}\n\nexport const flagsCommand = new Command('flags')\n .description('PostHog feature flag management')\n .addCommand(\n new Command('list').description('List all feature flags').action(async () => {\n const spinner = ora('Fetching feature flags...').start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n const response = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n })\n .json<{ results: FeatureFlag[] }>();\n\n spinner.stop();\n\n const rows = response.results.map((flag) => [\n flag.key,\n flag.active ? pc.green('enabled') : pc.red('disabled'),\n flag.rollout_percentage !== undefined ? `${flag.rollout_percentage}%` : '100%',\n ]);\n\n console.log(formatTable(['Flag', 'Status', 'Rollout'], rows));\n } catch (error) {\n spinner.fail('Failed to fetch feature flags');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('get')\n .description('Get feature flag details')\n .argument('<flag>', 'Flag key')\n .action(async (flag) => {\n const spinner = ora(`Fetching flag: ${flag}...`).start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n const response = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n searchParams: { key: flag },\n })\n .json<{ results: FeatureFlag[] }>();\n\n spinner.stop();\n\n const flagData = response.results.find((f) => f.key === flag);\n if (!flagData) {\n console.log(pc.yellow(`Flag \"${flag}\" not found`));\n return;\n }\n\n console.log(pc.cyan(`Flag: ${flagData.key}`));\n console.log(` Name: ${flagData.name || 'N/A'}`);\n console.log(` Status: ${flagData.active ? pc.green('enabled') : pc.red('disabled')}`);\n console.log(` Rollout: ${flagData.rollout_percentage ?? 100}%`);\n } catch (error) {\n spinner.fail('Failed to fetch flag');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('set')\n .description('Enable or disable a feature flag')\n .argument('<flag>', 'Flag key')\n .argument('<value>', 'true/false or percentage (0-100)')\n .action(async (flag, value) => {\n const spinner = ora(`Updating flag: ${flag}...`).start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n // First, find the flag ID\n const listResponse = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n })\n .json<{ results: FeatureFlag[] }>();\n\n const flagData = listResponse.results.find((f) => f.key === flag);\n if (!flagData) {\n spinner.fail(`Flag \"${flag}\" not found`);\n return;\n }\n\n // Determine if it's a boolean or percentage\n const isPercentage = /^\\d+$/.test(value) && Number.parseInt(value, 10) <= 100;\n const isBoolean = value === 'true' || value === 'false';\n\n const updateData: Record<string, unknown> = {};\n if (isPercentage) {\n updateData.rollout_percentage = Number.parseInt(value, 10);\n } else if (isBoolean) {\n updateData.active = value === 'true';\n } else {\n spinner.fail('Value must be true, false, or a percentage (0-100)');\n return;\n }\n\n await got.patch(`${POSTHOG_API}/projects/${projectId}/feature_flags/${flagData.id}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: updateData,\n });\n\n spinner.succeed('Feature flag updated');\n console.log(pc.green(`${flag} = ${value}`));\n } catch (error) {\n spinner.fail('Failed to update flag');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('add-user')\n .description('Add user to flag override')\n .argument('<flag>', 'Flag key')\n .argument('<userId>', 'User ID')\n .action(async (flag, userId) => {\n console.log(pc.yellow('Note: User-level overrides require PostHog Enterprise'));\n console.log(pc.dim(`Would add user ${userId} to flag ${flag}`));\n }),\n )\n .addCommand(\n new Command('remove-user')\n .description('Remove user from flag override')\n .argument('<flag>', 'Flag key')\n .argument('<userId>', 'User ID')\n .action(async (flag, userId) => {\n console.log(pc.yellow('Note: User-level overrides require PostHog Enterprise'));\n console.log(pc.dim(`Would remove user ${userId} from flag ${flag}`));\n }),\n );\n","import { Command } from 'commander';\n\nexport const genCommand = new Command('gen')\n .description('Generate boilerplate code for Flutter/Dart patterns')\n .addCommand(\n new Command('riverpod')\n .description('Generate Riverpod providers')\n .argument('<pattern>', 'Pattern: notifier, async-notifier, future, stream, family')\n .argument('<name>', 'Provider name')\n .option('-s, --state <type>', 'State type (e.g., \"List<User>\")')\n .option('-o, --output <path>', 'Output file path')\n .action(async (pattern, name, options) => {\n const { riverpodAction } = await import('./riverpod.js');\n await riverpodAction(pattern, name, options);\n }),\n )\n .addCommand(\n new Command('drift')\n .description('Generate Drift database code')\n .argument('<type>', 'Type: table, dao, migration')\n .argument('<name>', 'Table or DAO name')\n .option('-c, --columns <spec>', 'Column specification (for table)')\n .option('-o, --output <path>', 'Output file path')\n .action(async (type, name, options) => {\n const { driftAction } = await import('./drift.js');\n await driftAction(type, name, options);\n }),\n )\n .addCommand(\n new Command('gorouter')\n .description('Generate GoRouter routes')\n .argument('<name>', 'Route name')\n .option('-p, --path <path>', 'Route path (e.g., /recipe/:id)')\n .option('--params <params>', 'Path parameters (e.g., id:string)')\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { gorouterAction } = await import('./gorouter.js');\n await gorouterAction(name, options);\n }),\n )\n .addCommand(\n new Command('powersync')\n .description('Generate PowerSync sync rules')\n .argument('<type>', 'Type: rules, schema')\n .argument('<table>', 'Table name')\n .option('-u, --user-column <column>', 'User ID column for sync rules')\n .option('-o, --output <path>', 'Output file path')\n .action(async (type, table, options) => {\n const { powersyncAction } = await import('./powersync.js');\n await powersyncAction(type, table, options);\n }),\n )\n .addCommand(\n new Command('freezed')\n .description('Generate Freezed models')\n .argument('<name>', 'Model name')\n .option(\n '-f, --fields <spec>',\n 'Field specification (e.g., id:String,name:String,email:String?)',\n )\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { freezedAction } = await import('./freezed.js');\n await freezedAction(name, options);\n }),\n )\n .addCommand(\n new Command('repository')\n .description('Generate repository pattern')\n .argument('<name>', 'Repository name')\n .option('-e, --entity <name>', 'Entity name')\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { repositoryAction } = await import('./repository.js');\n await repositoryAction(name, options);\n }),\n );\n","import { existsSync } from 'node:fs';\nimport { writeFile } from 'node:fs/promises';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { CLIError, handleError } from '../../utils/error.js';\nimport { assertCommandExists, execFileAsync } from '../../utils/exec.js';\nimport { assertValidFlutterPackageName, assertValidWorkerName } from '../../utils/validation.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize projects and add features')\n .addCommand(\n new Command('flutter')\n .description('Initialize a new Flutter project with SaaS stack')\n .argument('<name>', 'Project name')\n .action(async (name) => {\n assertValidFlutterPackageName(name);\n const spinner = ora('Creating Flutter project...').start();\n try {\n await assertCommandExists(\n 'flutter',\n 'Flutter SDK',\n 'Install Flutter: https://docs.flutter.dev/get-started/install',\n );\n // Create Flutter project\n await execFileAsync('flutter', ['create', name]);\n spinner.text = 'Adding dependencies...';\n\n // Add dependencies\n const deps = [\n 'flutter_riverpod',\n 'riverpod_annotation',\n 'go_router',\n 'freezed_annotation',\n 'json_annotation',\n 'supabase_flutter',\n ];\n\n const devDeps = ['riverpod_generator', 'build_runner', 'freezed', 'json_serializable'];\n\n process.chdir(name);\n await execFileAsync('flutter', ['pub', 'add', ...deps]);\n await execFileAsync('flutter', ['pub', 'add', '--dev', ...devDeps]);\n\n spinner.succeed('Flutter project created');\n console.log(pc.green(`\\nProject \"${name}\" created with:`));\n console.log(' - Riverpod (state management)');\n console.log(' - GoRouter (navigation)');\n console.log(' - Freezed (immutable models)');\n console.log(' - Supabase (backend)');\n console.log(`\\nNext steps:`);\n console.log(` cd ${name}`);\n console.log(` flutter run`);\n } catch (error) {\n spinner.fail('Failed to create Flutter project');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('supabase')\n .description('Initialize Supabase in current project')\n .action(async () => {\n const spinner = ora('Initializing Supabase...').start();\n try {\n await assertCommandExists(\n 'supabase',\n 'Supabase CLI',\n 'Install Supabase CLI: npm install -g supabase or brew install supabase/tap/supabase',\n );\n await execFileAsync('supabase', ['init']);\n\n spinner.succeed('Supabase initialized');\n console.log(pc.green('\\nSupabase project created'));\n console.log('Next steps:');\n console.log(' supabase start');\n console.log(' supabase db push');\n } catch (error) {\n spinner.fail('Failed to initialize Supabase');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('worker')\n .description('Initialize a new Cloudflare Worker')\n .argument('<name>', 'Worker name')\n .action(async (name) => {\n assertValidWorkerName(name);\n const spinner = ora('Creating Cloudflare Worker...').start();\n try {\n await assertCommandExists(\n 'wrangler',\n 'Wrangler CLI',\n 'Install Wrangler: npm install -g wrangler',\n );\n await execFileAsync('wrangler', ['init', name]);\n\n spinner.succeed('Cloudflare Worker created');\n console.log(pc.green(`\\nWorker \"${name}\" created`));\n console.log('Next steps:');\n console.log(` cd ${name}`);\n console.log(' wrangler dev');\n } catch (error) {\n spinner.fail('Failed to create Worker');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('add')\n .description('Add a feature to existing Flutter project')\n .argument('<feature>', 'Feature: riverpod, drift, powersync, auth')\n .action(async (feature) => {\n const spinner = ora(`Adding ${feature}...`).start();\n try {\n await assertCommandExists(\n 'flutter',\n 'Flutter SDK',\n 'Install Flutter: https://docs.flutter.dev/get-started/install',\n );\n let deps: string[] = [];\n let devDeps: string[] = [];\n\n switch (feature) {\n case 'riverpod':\n deps = ['flutter_riverpod', 'riverpod_annotation'];\n devDeps = ['riverpod_generator', 'build_runner'];\n break;\n case 'drift':\n deps = ['drift', 'sqlite3_flutter_libs', 'path_provider', 'path'];\n devDeps = ['drift_dev', 'build_runner'];\n break;\n case 'powersync':\n deps = ['powersync'];\n break;\n case 'auth':\n deps = ['supabase_flutter'];\n break;\n default:\n throw new CLIError(\n `Unknown feature: \"${feature}\"`,\n 1,\n 'Valid features: riverpod, drift, powersync, auth',\n );\n }\n\n if (deps.length > 0) {\n await execFileAsync('flutter', ['pub', 'add', ...deps]);\n }\n if (devDeps.length > 0) {\n await execFileAsync('flutter', ['pub', 'add', '--dev', ...devDeps]);\n }\n\n spinner.succeed(`${feature} added`);\n console.log(pc.green(`\\n${feature} dependencies installed`));\n\n if (feature === 'riverpod' || feature === 'drift') {\n console.log('Run code generation:');\n console.log(' dart run build_runner build');\n }\n } catch (error) {\n spinner.fail(`Failed to add ${feature}`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('config').description('Create saas.yaml config file').action(async () => {\n const configPath = 'saas.yaml';\n\n if (existsSync(configPath)) {\n console.log(pc.yellow('saas.yaml already exists'));\n return;\n }\n\n const config = `# SaaS CLI Configuration\nproject:\n name: my-saas-app\n type: flutter\n\nflutter:\n path: .\n\nsupabase:\n path: supabase\n types_output: lib/generated/supabase_types.dart\n\ntemplates:\n riverpod:\n path: lib/features/{feature}/presentation/providers\n drift:\n path: lib/features/{feature}/data/datasources/local\n freezed:\n path: lib/features/{feature}/domain/entities\n`;\n\n await writeFile(configPath, config);\n console.log(pc.green('✓ Created saas.yaml'));\n }),\n );\n","import { Command } from 'commander';\nimport got from 'got';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\n\nconst ONESIGNAL_API = 'https://onesignal.com/api/v1';\n\nasync function getOneSignalConfig() {\n const appId = process.env.ONESIGNAL_APP_ID;\n const apiKey = process.env.ONESIGNAL_API_KEY;\n\n if (!appId || !apiKey) {\n const config = await loadGlobalConfig();\n return {\n appId: appId || config.onesignal?.appId,\n apiKey: apiKey || config.onesignal?.apiKey,\n };\n }\n\n return { appId, apiKey };\n}\n\nasync function sendNotification(\n target: { userId?: string; segment?: string },\n message: string,\n data?: Record<string, unknown>,\n scheduleAt?: string,\n) {\n const { appId, apiKey } = await getOneSignalConfig();\n\n if (!appId || !apiKey) {\n throw new AuthError(\n 'OneSignal credentials not found',\n 'Set ONESIGNAL_APP_ID and ONESIGNAL_API_KEY environment variables',\n );\n }\n\n const payload: Record<string, unknown> = {\n app_id: appId,\n contents: { en: message },\n };\n\n if (target.userId) {\n payload.include_external_user_ids = [target.userId];\n } else if (target.segment) {\n payload.included_segments = [target.segment];\n }\n\n if (data) {\n payload.data = data;\n }\n\n if (scheduleAt) {\n payload.send_after = scheduleAt;\n }\n\n const response = await got\n .post(`${ONESIGNAL_API}/notifications`, {\n headers: {\n Authorization: `Basic ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: payload,\n })\n .json<{ id: string; recipients: number }>();\n\n return response;\n}\n\nexport const pushCommand = new Command('push')\n .description('OneSignal push notification management')\n .addCommand(\n new Command('send')\n .description('Send a push notification')\n .argument('<target>', 'User ID or segment name')\n .argument('<message>', 'Notification message')\n .option('-s, --segment', 'Target is a segment name')\n .option('-d, --data <json>', 'Additional data (JSON)')\n .action(async (target, message, options) => {\n const spinner = ora('Sending notification...').start();\n try {\n const data = options.data ? JSON.parse(options.data) : undefined;\n const targetObj = options.segment ? { segment: target } : { userId: target };\n\n const result = await sendNotification(targetObj, message, data);\n\n spinner.succeed('Notification sent');\n console.log(pc.green(`ID: ${result.id}`));\n console.log(pc.dim(`Recipients: ${result.recipients}`));\n } catch (error) {\n spinner.fail('Failed to send notification');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('schedule')\n .description('Schedule a push notification')\n .argument('<target>', 'User ID')\n .argument('<message>', 'Notification message')\n .option(\n '--at <datetime>',\n 'Send time (ISO 8601 format)',\n new Date(Date.now() + 3600000).toISOString(),\n )\n .option('-d, --data <json>', 'Additional data (JSON)')\n .action(async (target, message, options) => {\n const spinner = ora('Scheduling notification...').start();\n try {\n const data = options.data ? JSON.parse(options.data) : undefined;\n\n const result = await sendNotification({ userId: target }, message, data, options.at);\n\n spinner.succeed('Notification scheduled');\n console.log(pc.green(`ID: ${result.id}`));\n console.log(pc.dim(`Scheduled for: ${options.at}`));\n } catch (error) {\n spinner.fail('Failed to schedule notification');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('template')\n .description('Template operations')\n .argument('<action>', 'Action: list, send')\n .argument('[templateId]', 'Template ID (for send)')\n .option('--to <userId>', 'Target user ID (for send)')\n .action(async (action, templateId, options) => {\n const spinner = ora(`Template ${action}...`).start();\n try {\n const { appId, apiKey } = await getOneSignalConfig();\n\n if (!appId || !apiKey) {\n throw new AuthError(\n 'OneSignal credentials not found',\n 'Set ONESIGNAL_APP_ID and ONESIGNAL_API_KEY environment variables',\n );\n }\n\n if (action === 'list') {\n const response = await got\n .get(`${ONESIGNAL_API}/templates?app_id=${appId}`, {\n headers: { Authorization: `Basic ${apiKey}` },\n })\n .json<{ templates: Array<{ id: string; name: string }> }>();\n\n spinner.stop();\n console.log(pc.cyan('Templates:'));\n for (const template of response.templates) {\n console.log(` ${pc.green(template.id)} - ${template.name}`);\n }\n } else if (action === 'send') {\n if (!templateId || !options.to) {\n throw new Error('Template ID and target user required');\n }\n\n const response = await got\n .post(`${ONESIGNAL_API}/notifications`, {\n headers: {\n Authorization: `Basic ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: {\n app_id: appId,\n template_id: templateId,\n include_external_user_ids: [options.to],\n },\n })\n .json<{ id: string }>();\n\n spinner.succeed('Template notification sent');\n console.log(pc.green(`ID: ${response.id}`));\n }\n } catch (error) {\n spinner.fail(`Template ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\nimport { formatTable } from '../../utils/output.js';\n\n// Note: In production, you'd use ioredis. This is a simplified implementation.\nasync function getRedisUrl(): Promise<string> {\n const url = process.env.REDIS_URL;\n if (!url) {\n const config = await loadGlobalConfig();\n if (config.redis?.url) {\n return config.redis.url;\n }\n throw new AuthError(\n 'REDIS_URL environment variable is not set',\n 'Set REDIS_URL to your Redis/DragonflyDB connection string',\n );\n }\n return url;\n}\n\nexport const redisCommand = new Command('redis')\n .description('Redis/DragonflyDB cache and queue management')\n .addCommand(\n new Command('ping').description('Test Redis connection').action(async () => {\n const spinner = ora('Pinging Redis...').start();\n try {\n const url = await getRedisUrl();\n // In production, use ioredis here\n spinner.succeed(`Connected to Redis at ${url.replace(/:[^:]+@/, ':****@')}`);\n console.log(pc.green('PONG'));\n } catch (error) {\n spinner.fail('Failed to connect to Redis');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('info').description('Get Redis server info').action(async () => {\n const spinner = ora('Fetching Redis info...').start();\n try {\n await getRedisUrl();\n spinner.stop();\n console.log(pc.yellow('Note: Full Redis info requires ioredis integration'));\n console.log('Install ioredis for full functionality: pnpm add ioredis');\n } catch (error) {\n spinner.fail('Failed to get Redis info');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('keys')\n .description('List keys matching pattern')\n .argument('<pattern>', 'Key pattern (e.g., user:*)')\n .action(async (pattern) => {\n const spinner = ora(`Searching keys: ${pattern}...`).start();\n try {\n await getRedisUrl();\n spinner.stop();\n console.log(pc.yellow('Note: Key listing requires ioredis integration'));\n } catch (error) {\n spinner.fail('Failed to list keys');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('get')\n .description('Get value by key')\n .argument('<key>', 'Key name')\n .action(async (_key) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Get operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('set')\n .description('Set a key-value pair')\n .argument('<key>', 'Key name')\n .argument('<value>', 'Value')\n .option('--ttl <seconds>', 'Time to live in seconds')\n .action(async (_key, _value, _options) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Set operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('del')\n .description('Delete a key')\n .argument('<key>', 'Key name')\n .action(async (_key) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Delete operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('queue')\n .description('BullMQ queue operations')\n .argument('<name>', 'Queue name')\n .argument(\n '[action]',\n 'Action: status, waiting, active, failed, delayed, pause, resume, clean',\n )\n .option('--status <status>', 'Job status for clean action')\n .option('--age <hours>', 'Job age in hours for clean action')\n .action(async (name, action = 'status', _options) => {\n const spinner = ora(`Queue ${name}: ${action}...`).start();\n try {\n await getRedisUrl();\n spinner.stop();\n\n // Placeholder output\n if (action === 'status') {\n console.log(pc.cyan(`Queue: ${name}`));\n console.log(\n formatTable(\n ['Status', 'Count'],\n [\n ['waiting', '0'],\n ['active', '0'],\n ['completed', '0'],\n ['failed', '0'],\n ['delayed', '0'],\n ],\n ),\n );\n }\n console.log(pc.yellow('\\nNote: Full BullMQ integration requires bullmq package'));\n } catch (error) {\n spinner.fail(`Queue operation failed`);\n handleError(error);\n }\n }),\n );\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { RLS_POLICIES, type RLSPolicyType, runSupabaseCommand } from '../../services/supabase.js';\nimport { columnsToSQL, parseColumnSpec } from '../../utils/column-parser.js';\nimport { CLIError, handleError } from '../../utils/error.js';\nimport { validateOutputPath } from '../../utils/path.js';\nimport { assertValidProjectName } from '../../utils/validation.js';\n\nexport const supabaseCommand = new Command('supabase')\n .description('Supabase database management')\n .addCommand(\n new Command('schema')\n .description('Show database schema')\n .argument('[table]', 'Specific table name')\n .option('--rls', 'Include RLS policies')\n .option('--relationships', 'Show foreign key relationships')\n .action(async (_table, _options) => {\n const spinner = ora('Fetching schema...').start();\n try {\n const output = await runSupabaseCommand(['db', 'dump', '--schema', 'public', '-f', '-']);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail('Failed to fetch schema');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('create-table')\n .description('Generate CREATE TABLE SQL')\n .argument('<name>', 'Table name')\n .option('-c, --columns <spec>', 'Column specification')\n .option('--from-freezed <file>', 'Generate from Freezed model file')\n .action(async (name, options) => {\n try {\n if (!options.columns) {\n throw new CLIError(\n 'Columns specification required',\n 1,\n 'Use --columns \"id:uuid:pk,title:text,user_id:uuid:fk(auth.users)\"',\n );\n }\n\n const columns = parseColumnSpec(options.columns);\n const sql = columnsToSQL(name, columns);\n\n console.log(pc.cyan('-- Migration: create_' + name + '_table'));\n console.log(sql);\n console.log('\\n-- Enable RLS');\n console.log(`ALTER TABLE ${name} ENABLE ROW LEVEL SECURITY;`);\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('rls')\n .description('Generate RLS policies')\n .argument('<table>', 'Table name')\n .option(\n '-p, --policy <type>',\n 'Policy type: user-owned, team-owned, public-read, admin-only',\n 'user-owned',\n )\n .option('-c, --column <name>', 'User/team ID column', 'user_id')\n .action(async (table, options) => {\n try {\n const policyType = options.policy as RLSPolicyType;\n if (!RLS_POLICIES[policyType]) {\n throw new CLIError(\n `Invalid policy type: \"${policyType}\"`,\n 1,\n 'Valid types: user-owned, team-owned, public-read, admin-only',\n );\n }\n\n const sql = RLS_POLICIES[policyType](table, options.column);\n console.log(sql);\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('migration')\n .description('Migration management')\n .argument('<action>', 'Action: new, apply, status')\n .argument('[name]', 'Migration name (for new)')\n .action(async (action, name) => {\n const spinner = ora(`Running migration ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n if (!name) {\n throw new CLIError('Migration name required for \"new\" action');\n }\n assertValidProjectName(name);\n args = ['migration', 'new', name];\n break;\n case 'apply':\n args = ['db', 'push'];\n break;\n case 'status':\n args = ['migration', 'list'];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, apply, status',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Migration ${action} failed`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('types')\n .description('Generate TypeScript/Dart types')\n .argument('<lang>', 'Language: dart, typescript')\n .option('-o, --output <path>', 'Output file path')\n .action(async (lang, options) => {\n const spinner = ora(`Generating ${lang} types...`).start();\n try {\n let args: string[];\n switch (lang) {\n case 'dart':\n case 'typescript':\n args = ['gen', 'types', lang, '--local'];\n break;\n default:\n throw new CLIError(\n `Invalid language: \"${lang}\"`,\n 1,\n 'Valid languages: dart, typescript',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n\n if (options.output) {\n const safePath = validateOutputPath(options.output);\n const { writeFile } = await import('node:fs/promises');\n await writeFile(safePath, output);\n console.log(pc.green(`✓ Generated ${safePath}`));\n } else {\n console.log(output);\n }\n } catch (error) {\n spinner.fail('Type generation failed');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('fn')\n .description('Edge function management')\n .argument('<action>', 'Action: new, deploy, logs')\n .argument('<name>', 'Function name')\n .action(async (action, name) => {\n assertValidProjectName(name);\n const spinner = ora(`Running fn ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n args = ['functions', 'new', name];\n break;\n case 'deploy':\n args = ['functions', 'deploy', name];\n break;\n case 'logs':\n args = ['functions', 'logs', name];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, deploy, logs',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Function ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { CLIError } from '../utils/error.js';\nimport { execFileAsync } from '../utils/exec.js';\nimport { validateOutputPath } from '../utils/path.js';\nimport { assertValidIdentifier } from '../utils/validation.js';\n\n/**\n * Check if Supabase CLI is installed\n */\nexport async function checkSupabaseCLI(): Promise<boolean> {\n try {\n await execFileAsync('supabase', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Run a Supabase CLI command\n */\nexport async function runSupabaseCommand(args: string[]): Promise<string> {\n const isInstalled = await checkSupabaseCLI();\n if (!isInstalled) {\n throw new CLIError(\n 'Supabase CLI not found',\n 1,\n 'Install with: brew install supabase/tap/supabase',\n );\n }\n\n try {\n const { stdout, stderr } = await execFileAsync('supabase', args);\n if (stderr && !stderr.includes('warning')) {\n console.error(stderr);\n }\n return stdout;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`Supabase command failed: ${message}`);\n }\n}\n\n/**\n * Get database schema\n */\nexport async function getSchema(tableName?: string): Promise<string> {\n const args = ['db', 'dump', '--schema', 'public'];\n if (tableName) {\n assertValidIdentifier(tableName, 'table name');\n args.push('--data-only', '--table', tableName);\n }\n return runSupabaseCommand(args);\n}\n\n/**\n * Generate TypeScript types\n */\nexport async function generateTypes(outputPath?: string): Promise<string> {\n const args = ['gen', 'types', 'typescript', '--local'];\n const output = await runSupabaseCommand(args);\n\n if (outputPath) {\n const safePath = validateOutputPath(outputPath);\n const { writeFile } = await import('node:fs/promises');\n await writeFile(safePath, output);\n }\n\n return output;\n}\n\n/**\n * RLS policy templates\n */\nexport const RLS_POLICIES = {\n 'user-owned': (table: string, column: string) => {\n assertValidIdentifier(table, 'table name');\n assertValidIdentifier(column, 'column name');\n return `\n-- RLS Policies for ${table} (user-owned)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Users can view their own records\nCREATE POLICY \"Users can view own ${table}\"\n ON ${table} FOR SELECT\n USING (auth.uid() = ${column});\n\n-- Users can create their own records\nCREATE POLICY \"Users can create own ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (auth.uid() = ${column});\n\n-- Users can update their own records\nCREATE POLICY \"Users can update own ${table}\"\n ON ${table} FOR UPDATE\n USING (auth.uid() = ${column});\n\n-- Users can delete their own records\nCREATE POLICY \"Users can delete own ${table}\"\n ON ${table} FOR DELETE\n USING (auth.uid() = ${column});\n`;\n },\n\n 'team-owned': (table: string, teamColumn: string) => {\n assertValidIdentifier(table, 'table name');\n assertValidIdentifier(teamColumn, 'column name');\n return `\n-- RLS Policies for ${table} (team-owned)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Team members can view team records\nCREATE POLICY \"Team members can view ${table}\"\n ON ${table} FOR SELECT\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team members can create team records\nCREATE POLICY \"Team members can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team members can update team records\nCREATE POLICY \"Team members can update ${table}\"\n ON ${table} FOR UPDATE\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team admins can delete team records\nCREATE POLICY \"Team admins can delete ${table}\"\n ON ${table} FOR DELETE\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid() AND role = 'admin'\n )\n );\n`;\n },\n\n 'public-read': (table: string) => {\n assertValidIdentifier(table, 'table name');\n return `\n-- RLS Policies for ${table} (public-read)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Anyone can view records\nCREATE POLICY \"Anyone can view ${table}\"\n ON ${table} FOR SELECT\n USING (true);\n\n-- Only authenticated users can create records\nCREATE POLICY \"Authenticated users can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (auth.role() = 'authenticated');\n\n-- Only owners can update their records\nCREATE POLICY \"Owners can update ${table}\"\n ON ${table} FOR UPDATE\n USING (auth.uid() = user_id);\n\n-- Only owners can delete their records\nCREATE POLICY \"Owners can delete ${table}\"\n ON ${table} FOR DELETE\n USING (auth.uid() = user_id);\n`;\n },\n\n 'admin-only': (table: string) => {\n assertValidIdentifier(table, 'table name');\n return `\n-- RLS Policies for ${table} (admin-only)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Only admins can view records\nCREATE POLICY \"Admins can view ${table}\"\n ON ${table} FOR SELECT\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can create records\nCREATE POLICY \"Admins can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can update records\nCREATE POLICY \"Admins can update ${table}\"\n ON ${table} FOR UPDATE\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can delete records\nCREATE POLICY \"Admins can delete ${table}\"\n ON ${table} FOR DELETE\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n`;\n },\n};\n\nexport type RLSPolicyType = keyof typeof RLS_POLICIES;\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { CLIError, handleError } from '../../utils/error.js';\nimport { execFileAsync } from '../../utils/exec.js';\nimport { validateOutputPath } from '../../utils/path.js';\nimport {\n assertValidCRF,\n assertValidResolution,\n assertValidTimestamp,\n} from '../../utils/validation.js';\n\nasync function checkFFmpeg(): Promise<boolean> {\n try {\n await execFileAsync('ffmpeg', ['-version']);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function runFFmpeg(args: string[]): Promise<string> {\n const isInstalled = await checkFFmpeg();\n if (!isInstalled) {\n throw new CLIError(\n 'FFmpeg not found',\n 1,\n 'Install FFmpeg: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)',\n );\n }\n\n try {\n const { stdout, stderr } = await execFileAsync('ffmpeg', args);\n return stdout || stderr;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`FFmpeg command failed: ${message}`);\n }\n}\n\nasync function runFFprobe(args: string[]): Promise<string> {\n const isInstalled = await checkFFmpeg();\n if (!isInstalled) {\n throw new CLIError(\n 'FFmpeg/FFprobe not found',\n 1,\n 'Install FFmpeg: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)',\n );\n }\n\n try {\n const { stdout } = await execFileAsync('ffprobe', args);\n return stdout;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`FFprobe command failed: ${message}`);\n }\n}\n\nexport const videoCommand = new Command('video')\n .description('Video processing with FFmpeg')\n .addCommand(\n new Command('info')\n .description('Get video file information')\n .argument('<file>', 'Video file path')\n .action(async (file) => {\n const spinner = ora('Analyzing video...').start();\n try {\n const output = await runFFprobe([\n '-v',\n 'quiet',\n '-print_format',\n 'json',\n '-show_format',\n '-show_streams',\n file,\n ]);\n\n spinner.stop();\n\n try {\n const info = JSON.parse(output);\n const format = info.format || {};\n const videoStream =\n info.streams?.find((s: { codec_type: string }) => s.codec_type === 'video') || {};\n const audioStream =\n info.streams?.find((s: { codec_type: string }) => s.codec_type === 'audio') || {};\n\n console.log(pc.cyan('Video Information:'));\n console.log(` File: ${format.filename || file}`);\n console.log(\n ` Duration: ${format.duration ? Number.parseFloat(format.duration).toFixed(2) + 's' : 'N/A'}`,\n );\n console.log(\n ` Size: ${format.size ? (Number.parseInt(format.size, 10) / 1024 / 1024).toFixed(2) + ' MB' : 'N/A'}`,\n );\n console.log(\n ` Bitrate: ${format.bit_rate ? (Number.parseInt(format.bit_rate, 10) / 1000).toFixed(0) + ' kbps' : 'N/A'}`,\n );\n\n if (videoStream.width) {\n console.log(pc.cyan('\\nVideo Stream:'));\n console.log(` Resolution: ${videoStream.width}x${videoStream.height}`);\n console.log(` Codec: ${videoStream.codec_name || 'N/A'}`);\n console.log(` FPS: ${videoStream.r_frame_rate || 'N/A'}`);\n }\n\n if (audioStream.codec_name) {\n console.log(pc.cyan('\\nAudio Stream:'));\n console.log(` Codec: ${audioStream.codec_name}`);\n console.log(` Sample Rate: ${audioStream.sample_rate || 'N/A'} Hz`);\n console.log(` Channels: ${audioStream.channels || 'N/A'}`);\n }\n } catch {\n console.log(output);\n }\n } catch (error) {\n spinner.fail('Failed to analyze video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('combine')\n .description('Combine video and audio')\n .argument('<video>', 'Video file path')\n .argument('<audio>', 'Audio file path')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, audio, options) => {\n const safePath = validateOutputPath(options.output);\n const spinner = ora('Combining video and audio...').start();\n try {\n await runFFmpeg([\n '-i',\n video,\n '-i',\n audio,\n '-c:v',\n 'copy',\n '-c:a',\n 'aac',\n '-y',\n safePath,\n ]);\n\n spinner.succeed(`Combined: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to combine video and audio');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('thumbnail')\n .description('Extract thumbnail from video')\n .argument('<video>', 'Video file path')\n .option('--at <timestamp>', 'Timestamp (e.g., 00:00:05)', '00:00:01')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n assertValidTimestamp(options.at);\n const safePath = validateOutputPath(options.output);\n const spinner = ora('Extracting thumbnail...').start();\n try {\n await runFFmpeg(['-i', video, '-ss', options.at, '-vframes', '1', '-y', safePath]);\n\n spinner.succeed(`Thumbnail: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to extract thumbnail');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('resize')\n .description('Resize video')\n .argument('<video>', 'Video file path')\n .requiredOption('-s, --size <WxH>', 'New size (e.g., 1280x720 or -1:720)')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n assertValidResolution(options.size);\n const safePath = validateOutputPath(options.output);\n // Convert WxH format to W:H for FFmpeg scale filter\n const scaleSize = options.size.replace('x', ':');\n const spinner = ora('Resizing video...').start();\n try {\n await runFFmpeg(['-i', video, '-vf', `scale=${scaleSize}`, '-y', safePath]);\n\n spinner.succeed(`Resized: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to resize video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('compress')\n .description('Compress video')\n .argument('<video>', 'Video file path')\n .option('-q, --quality <crf>', 'Quality (0-51, lower is better)', '23')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n assertValidCRF(options.quality);\n const safePath = validateOutputPath(options.output);\n const spinner = ora('Compressing video...').start();\n try {\n await runFFmpeg([\n '-i',\n video,\n '-c:v',\n 'libx264',\n '-crf',\n options.quality,\n '-preset',\n 'medium',\n '-y',\n safePath,\n ]);\n\n spinner.succeed(`Compressed: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to compress video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('trim')\n .description('Trim video')\n .argument('<video>', 'Video file path')\n .requiredOption('--start <time>', 'Start time (e.g., 00:00:10)')\n .requiredOption('--end <time>', 'End time (e.g., 00:01:00)')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n assertValidTimestamp(options.start);\n assertValidTimestamp(options.end);\n const safePath = validateOutputPath(options.output);\n const spinner = ora('Trimming video...').start();\n try {\n await runFFmpeg([\n '-i',\n video,\n '-ss',\n options.start,\n '-to',\n options.end,\n '-c',\n 'copy',\n '-y',\n safePath,\n ]);\n\n spinner.succeed(`Trimmed: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to trim video');\n handleError(error);\n }\n }),\n );\n"],"mappings":"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","names":["Command","pc","result","Command","ora","CLIError","Command","ora","Command","Command","ora","pc","Command","ora","pc","Command","Command","ora","pc","Command","ora","pc","Command","got","ora","pc","got","Command","ora","result","pc","Command","ora","pc","Command","ora","pc","Command","ora","pc","Command","ora","pc","writeFile","Command","ora","pc","Command","ora","pc","Command","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cli.ts","../src/commands/ask/index.ts","../src/services/perplexity.ts","../src/commands/cf/index.ts","../src/utils/exec.ts","../src/commands/docs/index.ts","../src/commands/flags/index.ts","../src/commands/gen/index.ts","../src/commands/init/index.ts","../src/commands/push/index.ts","../src/commands/redis/index.ts","../src/commands/supabase/index.ts","../src/services/supabase.ts","../src/commands/video/index.ts"],"sourcesContent":["import dotenv from 'dotenv';\nimport { run } from './cli.js';\n\n// Load .env from current working directory\n// Shell exports take precedence (override: false is default)\n// quiet: true suppresses dotenv's default logging\nconst result = dotenv.config({ quiet: true });\nif (result.error && process.env.DEBUG) {\n console.error('[dotenv]', result.error.message);\n}\n\nrun();\n","import { createRequire } from 'node:module';\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { askCommand } from './commands/ask/index.js';\nimport { cfCommand } from './commands/cf/index.js';\n// Import commands (will be added as we implement them)\nimport { docsCommand } from './commands/docs/index.js';\nimport { flagsCommand } from './commands/flags/index.js';\nimport { genCommand } from './commands/gen/index.js';\nimport { initCommand } from './commands/init/index.js';\nimport { pushCommand } from './commands/push/index.js';\nimport { redisCommand } from './commands/redis/index.js';\nimport { supabaseCommand } from './commands/supabase/index.js';\nimport { videoCommand } from './commands/video/index.js';\nimport { handleError } from './utils/error.js';\n\nconst require = createRequire(import.meta.url);\nconst { version: VERSION } = require('../package.json');\n\n/**\n * Create and configure the CLI program\n */\nfunction createProgram(): Command {\n const program = new Command();\n\n program\n .name('saas')\n .description('A unified CLI for Flutter SaaS development')\n .version(VERSION, '-V, --version', 'Display version number')\n .configureHelp({\n sortSubcommands: true,\n sortOptions: true,\n })\n .option('--json', 'Output results as JSON')\n .option('-v, --verbose', 'Enable verbose output')\n .option('--debug', 'Enable debug output')\n .hook('preAction', (thisCommand) => {\n // Store global options for access in commands\n const opts = thisCommand.opts();\n process.env.SAAS_CLI_JSON = opts.json ? '1' : '';\n process.env.SAAS_CLI_VERBOSE = opts.verbose ? '1' : '';\n process.env.SAAS_CLI_DEBUG = opts.debug ? '1' : '';\n });\n\n // Register domain commands\n program.addCommand(docsCommand);\n program.addCommand(askCommand);\n program.addCommand(genCommand);\n program.addCommand(supabaseCommand);\n program.addCommand(redisCommand);\n program.addCommand(cfCommand);\n program.addCommand(pushCommand);\n program.addCommand(flagsCommand);\n program.addCommand(videoCommand);\n program.addCommand(initCommand);\n\n // Add examples to help\n program.addHelpText(\n 'after',\n `\n${pc.cyan('Examples:')}\n ${pc.dim('# Look up Flutter documentation')}\n $ saas docs flutter \"ListView.builder with pagination\"\n\n ${pc.dim('# Ask AI a question')}\n $ saas ask \"best practices for offline-first Flutter apps\"\n\n ${pc.dim('# Generate a Riverpod notifier')}\n $ saas gen riverpod notifier UserList --state \"List<User>\"\n\n ${pc.dim('# Generate RLS policies')}\n $ saas supabase rls recipes --policy user-owned --column user_id\n\n ${pc.dim('# Check feature flag status')}\n $ saas flags list\n\n${pc.cyan('Documentation:')}\n https://github.com/your-username/saas-cli\n`,\n );\n\n return program;\n}\n\n/**\n * Run the CLI\n */\nexport async function run(): Promise<void> {\n const program = createProgram();\n\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n handleError(error);\n }\n}\n\nexport { createProgram };\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { getPerplexityClient } from '../../services/perplexity.js';\nimport { MODEL_ALIASES, type PerplexityModel } from '../../types/index.js';\nimport { getAPIKey, loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\n\ninterface AskOptions {\n model?: string;\n recent?: 'day' | 'week' | 'month' | 'year';\n domains?: string;\n sources?: boolean;\n json?: boolean;\n}\n\nexport const askCommand = new Command('ask')\n .description('Ask AI-powered questions with web search (Perplexity)')\n .argument('<query>', 'Your question')\n .option('-m, --model <model>', 'Model: sonar, pro, reasoning, deep', 'sonar')\n .option('--recent <period>', 'Filter by recency: day, week, month, year')\n .option('--domains <domains>', 'Limit to domains (comma-separated)')\n .option('--sources', 'Include source URLs in output')\n .option('--json', 'Output as JSON')\n .action(async (query: string, options: AskOptions) => {\n const modelAlias = options.model ?? 'sonar';\n const model: PerplexityModel = MODEL_ALIASES[modelAlias] ?? 'sonar';\n const modelDisplay = modelAlias.toUpperCase();\n\n const spinner = ora(`Asking ${modelDisplay}...`).start();\n\n try {\n const config = await loadGlobalConfig();\n const apiKey = getAPIKey('perplexity', config);\n\n if (!apiKey) {\n spinner.fail('Perplexity API key not found');\n throw new AuthError(\n 'PERPLEXITY_API_KEY environment variable is not set',\n 'Get your API key from https://perplexity.ai/settings/api and set PERPLEXITY_API_KEY',\n );\n }\n\n const client = getPerplexityClient(apiKey);\n const result = await client.ask(query, {\n model,\n searchRecencyFilter: options.recent,\n searchDomainFilter: options.domains?.split(','),\n returnSources: options.sources,\n });\n\n spinner.stop();\n\n if (options.json) {\n console.log(JSON.stringify({ query, model: modelAlias, result }, null, 2));\n } else {\n console.log(pc.cyan(`\\n━━━ ${modelDisplay} ━━━\\n`));\n console.log(result);\n }\n } catch (error) {\n spinner.fail('Query failed');\n handleError(error);\n }\n });\n","import type { Got } from 'got';\nimport type { PerplexityAskOptions, PerplexityResponse } from '../types/index.js';\nimport { cachedFetch, cacheKey } from '../utils/cache.js';\nimport { createAuthenticatedClient } from './http.js';\n\nconst PERPLEXITY_BASE_URL = 'https://api.perplexity.ai';\n\n/**\n * Perplexity AI client for web-grounded questions\n */\nexport class PerplexityClient {\n private client: Got;\n\n constructor(apiKey: string) {\n this.client = createAuthenticatedClient(PERPLEXITY_BASE_URL, apiKey);\n }\n\n /**\n * Ask a question using Perplexity AI\n */\n async ask(query: string, options: PerplexityAskOptions = {}): Promise<string> {\n const model = options.model ?? 'sonar';\n\n const requestBody: Record<string, unknown> = {\n model,\n messages: [\n {\n role: 'system',\n content:\n 'You are a helpful assistant for software development questions. Be precise and include code examples when relevant. Focus on Flutter, Dart, and related technologies.',\n },\n {\n role: 'user',\n content: query,\n },\n ],\n max_tokens: options.maxTokens ?? 2048,\n temperature: options.temperature ?? 0.2,\n return_related_questions: false,\n };\n\n // Add optional filters\n if (options.searchRecencyFilter) {\n requestBody.search_recency_filter = options.searchRecencyFilter;\n }\n\n if (options.searchDomainFilter && options.searchDomainFilter.length > 0) {\n requestBody.search_domain_filter = options.searchDomainFilter;\n }\n\n const response = await this.client\n .post('chat/completions', {\n json: requestBody,\n })\n .json<PerplexityResponse>();\n\n return this.formatResponse(response, options.returnSources);\n }\n\n /**\n * Ask with caching enabled\n */\n async askCached(query: string, options: PerplexityAskOptions = {}): Promise<string> {\n const model = options.model ?? 'sonar';\n const key = cacheKey('perplexity', model, query);\n\n return cachedFetch(\n key,\n () => this.ask(query, options),\n 1800 * 1000, // 30 minute cache for AI responses\n );\n }\n\n /**\n * Format the API response\n */\n private formatResponse(response: PerplexityResponse, includeSources?: boolean): string {\n const choice = response.choices[0];\n if (!choice) {\n return 'No response received from AI.';\n }\n\n let output = choice.message.content;\n\n // Add citations if requested\n if (includeSources && response.citations && response.citations.length > 0) {\n output += '\\n\\n---\\nSources:\\n';\n response.citations.forEach((url, i) => {\n output += `[${i + 1}] ${url}\\n`;\n });\n }\n\n return output;\n }\n}\n\n// Singleton instance cache\nlet clientInstance: PerplexityClient | null = null;\nlet currentApiKey: string | null = null;\n\n/**\n * Get or create a Perplexity client instance\n */\nexport function getPerplexityClient(apiKey: string): PerplexityClient {\n if (!clientInstance || currentApiKey !== apiKey) {\n clientInstance = new PerplexityClient(apiKey);\n currentApiKey = apiKey;\n }\n return clientInstance;\n}\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport { AuthError, CLIError, handleError } from '../../utils/error.js';\nimport { execFileAsync } from '../../utils/exec.js';\nimport { assertValidWorkerName } from '../../utils/validation.js';\n\nasync function checkWranglerCLI(): Promise<boolean> {\n try {\n await execFileAsync('wrangler', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function runWranglerCommand(args: string[]): Promise<string> {\n const isInstalled = await checkWranglerCLI();\n if (!isInstalled) {\n throw new CLIError('Wrangler CLI not found', 1, 'Install with: pnpm add -g wrangler');\n }\n\n if (!process.env.CF_API_TOKEN && !process.env.CLOUDFLARE_API_TOKEN) {\n throw new AuthError(\n 'Cloudflare API token not found',\n 'Set CF_API_TOKEN or CLOUDFLARE_API_TOKEN environment variable',\n );\n }\n\n try {\n const { stdout, stderr } = await execFileAsync('wrangler', args);\n if (stderr && !stderr.includes('warning')) {\n console.error(stderr);\n }\n return stdout;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`Wrangler command failed: ${message}`);\n }\n}\n\nexport const cfCommand = new Command('cf')\n .description('Cloudflare Workers and KV management')\n .addCommand(\n new Command('worker')\n .description('Worker management')\n .argument('<action>', 'Action: new, deploy, logs, list')\n .argument('[name]', 'Worker name')\n .action(async (action, name) => {\n const spinner = ora(`Worker ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n if (!name) throw new CLIError('Worker name required for \"new\" action');\n assertValidWorkerName(name);\n args = ['init', name];\n break;\n case 'deploy':\n if (name) assertValidWorkerName(name);\n args = name ? ['deploy', '--name', name] : ['deploy'];\n break;\n case 'logs':\n if (name) assertValidWorkerName(name);\n args = name ? ['tail', name] : ['tail'];\n break;\n case 'list':\n args = ['deployments', 'list'];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, deploy, logs, list',\n );\n }\n\n const output = await runWranglerCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Worker ${action} failed`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('kv')\n .description('KV namespace operations')\n .argument('<action>', 'Action: namespaces, keys, get, put, del')\n .argument('[namespace]', 'KV namespace ID')\n .argument('[key]', 'Key name')\n .argument('[value]', 'Value (for put)')\n .action(async (action, namespace, key, value) => {\n const spinner = ora(`KV ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'namespaces':\n args = ['kv:namespace', 'list'];\n break;\n case 'keys':\n if (!namespace) throw new CLIError('Namespace ID required');\n args = ['kv:key', 'list', '--namespace-id', namespace];\n break;\n case 'get':\n if (!namespace || !key) throw new CLIError('Namespace and key required');\n args = ['kv:key', 'get', key, '--namespace-id', namespace];\n break;\n case 'put':\n if (!namespace || !key || !value)\n throw new CLIError('Namespace, key, and value required');\n args = ['kv:key', 'put', key, value, '--namespace-id', namespace];\n break;\n case 'del':\n if (!namespace || !key) throw new CLIError('Namespace and key required');\n args = ['kv:key', 'delete', key, '--namespace-id', namespace];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: namespaces, keys, get, put, del',\n );\n }\n\n const output = await runWranglerCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`KV ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\n/**\n * Promisified execFile for safe command execution.\n * Uses execFile instead of exec to prevent shell injection attacks.\n * Arguments are passed as an array, not concatenated into a shell command string.\n */\nexport const execFileAsync = promisify(execFile);\n\n/**\n * Check if a command exists in the system PATH.\n * Uses 'which' on Unix-like systems and 'where' on Windows.\n *\n * @param command - The command name to check\n * @returns Promise<boolean> - true if command exists, false otherwise\n */\nexport async function commandExists(command: string): Promise<boolean> {\n const checker = process.platform === 'win32' ? 'where' : 'which';\n try {\n await execFileAsync(checker, [command]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Assert that a command exists, throwing a helpful CLIError if not.\n *\n * @param command - The command name to check\n * @param displayName - Human-readable name for error messages\n * @param installHint - Installation instructions\n */\nexport async function assertCommandExists(\n command: string,\n displayName: string,\n installHint: string,\n): Promise<void> {\n const exists = await commandExists(command);\n if (!exists) {\n // Import dynamically to avoid circular dependency\n const { CLIError } = await import('./error.js');\n const { EXIT_CODES } = await import('../types/index.js');\n throw new CLIError(`${displayName} not found`, EXIT_CODES.GENERAL_ERROR, installHint);\n }\n}\n","import { Command } from 'commander';\n\nexport const docsCommand = new Command('docs')\n .description('Look up documentation via Context7')\n .addCommand(\n new Command('flutter')\n .description('Search Flutter documentation')\n .argument('<query>', 'Search query')\n .action(async (query) => {\n const { flutterAction } = await import('./flutter.js');\n await flutterAction(query);\n }),\n )\n .addCommand(\n new Command('dart')\n .description('Search Dart documentation')\n .argument('<query>', 'Search query')\n .action(async (query) => {\n const { dartAction } = await import('./dart.js');\n await dartAction(query);\n }),\n )\n .addCommand(\n new Command('package')\n .description('Search package documentation')\n .argument('<package>', 'Package name')\n .argument('[query]', 'Search query')\n .action(async (pkg, query) => {\n const { packageAction } = await import('./package.js');\n await packageAction(pkg, query);\n }),\n )\n .addCommand(\n new Command('widget')\n .description('Look up widget documentation')\n .argument('<name>', 'Widget name')\n .option('--properties', 'Show all properties')\n .action(async (name, options) => {\n const { widgetAction } = await import('./widget.js');\n await widgetAction(name, options);\n }),\n );\n","import { Command } from 'commander';\nimport got from 'got';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\nimport { formatTable } from '../../utils/output.js';\n\nconst POSTHOG_API = 'https://app.posthog.com/api';\n\nasync function getPostHogConfig() {\n const projectId = process.env.POSTHOG_PROJECT_ID;\n const apiKey = process.env.POSTHOG_API_KEY;\n\n if (!projectId || !apiKey) {\n const config = await loadGlobalConfig();\n return {\n projectId: projectId || config.posthog?.projectId,\n apiKey: apiKey || config.posthog?.apiKey,\n };\n }\n\n return { projectId, apiKey };\n}\n\ninterface FeatureFlag {\n id: number;\n key: string;\n name: string;\n active: boolean;\n rollout_percentage?: number;\n}\n\nexport const flagsCommand = new Command('flags')\n .description('PostHog feature flag management')\n .addCommand(\n new Command('list').description('List all feature flags').action(async () => {\n const spinner = ora('Fetching feature flags...').start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n const response = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n })\n .json<{ results: FeatureFlag[] }>();\n\n spinner.stop();\n\n const rows = response.results.map((flag) => [\n flag.key,\n flag.active ? pc.green('enabled') : pc.red('disabled'),\n flag.rollout_percentage !== undefined ? `${flag.rollout_percentage}%` : '100%',\n ]);\n\n console.log(formatTable(['Flag', 'Status', 'Rollout'], rows));\n } catch (error) {\n spinner.fail('Failed to fetch feature flags');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('get')\n .description('Get feature flag details')\n .argument('<flag>', 'Flag key')\n .action(async (flag) => {\n const spinner = ora(`Fetching flag: ${flag}...`).start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n const response = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n searchParams: { key: flag },\n })\n .json<{ results: FeatureFlag[] }>();\n\n spinner.stop();\n\n const flagData = response.results.find((f) => f.key === flag);\n if (!flagData) {\n console.log(pc.yellow(`Flag \"${flag}\" not found`));\n return;\n }\n\n console.log(pc.cyan(`Flag: ${flagData.key}`));\n console.log(` Name: ${flagData.name || 'N/A'}`);\n console.log(` Status: ${flagData.active ? pc.green('enabled') : pc.red('disabled')}`);\n console.log(` Rollout: ${flagData.rollout_percentage ?? 100}%`);\n } catch (error) {\n spinner.fail('Failed to fetch flag');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('set')\n .description('Enable or disable a feature flag')\n .argument('<flag>', 'Flag key')\n .argument('<value>', 'true/false or percentage (0-100)')\n .action(async (flag, value) => {\n const spinner = ora(`Updating flag: ${flag}...`).start();\n try {\n const { projectId, apiKey } = await getPostHogConfig();\n\n if (!projectId || !apiKey) {\n throw new AuthError(\n 'PostHog credentials not found',\n 'Set POSTHOG_PROJECT_ID and POSTHOG_API_KEY environment variables',\n );\n }\n\n // First, find the flag ID\n const listResponse = await got\n .get(`${POSTHOG_API}/projects/${projectId}/feature_flags`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n })\n .json<{ results: FeatureFlag[] }>();\n\n const flagData = listResponse.results.find((f) => f.key === flag);\n if (!flagData) {\n spinner.fail(`Flag \"${flag}\" not found`);\n return;\n }\n\n // Determine if it's a boolean or percentage\n const isPercentage = /^\\d+$/.test(value) && Number.parseInt(value, 10) <= 100;\n const isBoolean = value === 'true' || value === 'false';\n\n const updateData: Record<string, unknown> = {};\n if (isPercentage) {\n updateData.rollout_percentage = Number.parseInt(value, 10);\n } else if (isBoolean) {\n updateData.active = value === 'true';\n } else {\n spinner.fail('Value must be true, false, or a percentage (0-100)');\n return;\n }\n\n await got.patch(`${POSTHOG_API}/projects/${projectId}/feature_flags/${flagData.id}`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: updateData,\n });\n\n spinner.succeed('Feature flag updated');\n console.log(pc.green(`${flag} = ${value}`));\n } catch (error) {\n spinner.fail('Failed to update flag');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('add-user')\n .description('Add user to flag override')\n .argument('<flag>', 'Flag key')\n .argument('<userId>', 'User ID')\n .action(async (flag, userId) => {\n console.log(pc.yellow('Note: User-level overrides require PostHog Enterprise'));\n console.log(pc.dim(`Would add user ${userId} to flag ${flag}`));\n }),\n )\n .addCommand(\n new Command('remove-user')\n .description('Remove user from flag override')\n .argument('<flag>', 'Flag key')\n .argument('<userId>', 'User ID')\n .action(async (flag, userId) => {\n console.log(pc.yellow('Note: User-level overrides require PostHog Enterprise'));\n console.log(pc.dim(`Would remove user ${userId} from flag ${flag}`));\n }),\n );\n","import { Command } from 'commander';\n\nexport const genCommand = new Command('gen')\n .description('Generate boilerplate code for Flutter/Dart patterns')\n .addCommand(\n new Command('riverpod')\n .description('Generate Riverpod providers')\n .argument('<pattern>', 'Pattern: notifier, async-notifier, future, stream, family')\n .argument('<name>', 'Provider name')\n .option('-s, --state <type>', 'State type (e.g., \"List<User>\")')\n .option('-o, --output <path>', 'Output file path')\n .action(async (pattern, name, options) => {\n const { riverpodAction } = await import('./riverpod.js');\n await riverpodAction(pattern, name, options);\n }),\n )\n .addCommand(\n new Command('drift')\n .description('Generate Drift database code')\n .argument('<type>', 'Type: table, dao, migration')\n .argument('<name>', 'Table or DAO name')\n .option('-c, --columns <spec>', 'Column specification (for table)')\n .option('-o, --output <path>', 'Output file path')\n .action(async (type, name, options) => {\n const { driftAction } = await import('./drift.js');\n await driftAction(type, name, options);\n }),\n )\n .addCommand(\n new Command('gorouter')\n .description('Generate GoRouter routes')\n .argument('<name>', 'Route name')\n .option('-p, --path <path>', 'Route path (e.g., /recipe/:id)')\n .option('--params <params>', 'Path parameters (e.g., id:string)')\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { gorouterAction } = await import('./gorouter.js');\n await gorouterAction(name, options);\n }),\n )\n .addCommand(\n new Command('powersync')\n .description('Generate PowerSync sync rules')\n .argument('<type>', 'Type: rules, schema')\n .argument('<table>', 'Table name')\n .option('-u, --user-column <column>', 'User ID column for sync rules')\n .option('-o, --output <path>', 'Output file path')\n .action(async (type, table, options) => {\n const { powersyncAction } = await import('./powersync.js');\n await powersyncAction(type, table, options);\n }),\n )\n .addCommand(\n new Command('freezed')\n .description('Generate Freezed models')\n .argument('<name>', 'Model name')\n .option(\n '-f, --fields <spec>',\n 'Field specification (e.g., id:String,name:String,email:String?)',\n )\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { freezedAction } = await import('./freezed.js');\n await freezedAction(name, options);\n }),\n )\n .addCommand(\n new Command('repository')\n .description('Generate repository pattern')\n .argument('<name>', 'Repository name')\n .option('-e, --entity <name>', 'Entity name')\n .option('-o, --output <path>', 'Output file path')\n .action(async (name, options) => {\n const { repositoryAction } = await import('./repository.js');\n await repositoryAction(name, options);\n }),\n );\n","import { existsSync } from 'node:fs';\nimport { writeFile } from 'node:fs/promises';\nimport { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { CLIError, handleError } from '../../utils/error.js';\nimport { assertCommandExists, execFileAsync } from '../../utils/exec.js';\nimport { assertValidFlutterPackageName, assertValidWorkerName } from '../../utils/validation.js';\n\nexport const initCommand = new Command('init')\n .description('Initialize projects and add features')\n .addCommand(\n new Command('flutter')\n .description('Initialize a new Flutter project with SaaS stack')\n .argument('<name>', 'Project name')\n .action(async (name) => {\n assertValidFlutterPackageName(name);\n const spinner = ora('Creating Flutter project...').start();\n try {\n await assertCommandExists(\n 'flutter',\n 'Flutter SDK',\n 'Install Flutter: https://docs.flutter.dev/get-started/install',\n );\n // Create Flutter project\n await execFileAsync('flutter', ['create', name]);\n spinner.text = 'Adding dependencies...';\n\n // Add dependencies\n const deps = [\n 'flutter_riverpod',\n 'riverpod_annotation',\n 'go_router',\n 'freezed_annotation',\n 'json_annotation',\n 'supabase_flutter',\n ];\n\n const devDeps = ['riverpod_generator', 'build_runner', 'freezed', 'json_serializable'];\n\n process.chdir(name);\n await execFileAsync('flutter', ['pub', 'add', ...deps]);\n await execFileAsync('flutter', ['pub', 'add', '--dev', ...devDeps]);\n\n spinner.succeed('Flutter project created');\n console.log(pc.green(`\\nProject \"${name}\" created with:`));\n console.log(' - Riverpod (state management)');\n console.log(' - GoRouter (navigation)');\n console.log(' - Freezed (immutable models)');\n console.log(' - Supabase (backend)');\n console.log(`\\nNext steps:`);\n console.log(` cd ${name}`);\n console.log(` flutter run`);\n } catch (error) {\n spinner.fail('Failed to create Flutter project');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('supabase')\n .description('Initialize Supabase in current project')\n .action(async () => {\n const spinner = ora('Initializing Supabase...').start();\n try {\n await assertCommandExists(\n 'supabase',\n 'Supabase CLI',\n 'Install Supabase CLI: npm install -g supabase or brew install supabase/tap/supabase',\n );\n await execFileAsync('supabase', ['init']);\n\n spinner.succeed('Supabase initialized');\n console.log(pc.green('\\nSupabase project created'));\n console.log('Next steps:');\n console.log(' supabase start');\n console.log(' supabase db push');\n } catch (error) {\n spinner.fail('Failed to initialize Supabase');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('worker')\n .description('Initialize a new Cloudflare Worker')\n .argument('<name>', 'Worker name')\n .action(async (name) => {\n assertValidWorkerName(name);\n const spinner = ora('Creating Cloudflare Worker...').start();\n try {\n await assertCommandExists(\n 'wrangler',\n 'Wrangler CLI',\n 'Install Wrangler: npm install -g wrangler',\n );\n await execFileAsync('wrangler', ['init', name]);\n\n spinner.succeed('Cloudflare Worker created');\n console.log(pc.green(`\\nWorker \"${name}\" created`));\n console.log('Next steps:');\n console.log(` cd ${name}`);\n console.log(' wrangler dev');\n } catch (error) {\n spinner.fail('Failed to create Worker');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('add')\n .description('Add a feature to existing Flutter project')\n .argument('<feature>', 'Feature: riverpod, drift, powersync, auth')\n .action(async (feature) => {\n const spinner = ora(`Adding ${feature}...`).start();\n try {\n await assertCommandExists(\n 'flutter',\n 'Flutter SDK',\n 'Install Flutter: https://docs.flutter.dev/get-started/install',\n );\n let deps: string[] = [];\n let devDeps: string[] = [];\n\n switch (feature) {\n case 'riverpod':\n deps = ['flutter_riverpod', 'riverpod_annotation'];\n devDeps = ['riverpod_generator', 'build_runner'];\n break;\n case 'drift':\n deps = ['drift', 'sqlite3_flutter_libs', 'path_provider', 'path'];\n devDeps = ['drift_dev', 'build_runner'];\n break;\n case 'powersync':\n deps = ['powersync'];\n break;\n case 'auth':\n deps = ['supabase_flutter'];\n break;\n default:\n throw new CLIError(\n `Unknown feature: \"${feature}\"`,\n 1,\n 'Valid features: riverpod, drift, powersync, auth',\n );\n }\n\n if (deps.length > 0) {\n await execFileAsync('flutter', ['pub', 'add', ...deps]);\n }\n if (devDeps.length > 0) {\n await execFileAsync('flutter', ['pub', 'add', '--dev', ...devDeps]);\n }\n\n spinner.succeed(`${feature} added`);\n console.log(pc.green(`\\n${feature} dependencies installed`));\n\n if (feature === 'riverpod' || feature === 'drift') {\n console.log('Run code generation:');\n console.log(' dart run build_runner build');\n }\n } catch (error) {\n spinner.fail(`Failed to add ${feature}`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('config').description('Create saas.yaml config file').action(async () => {\n const configPath = 'saas.yaml';\n\n if (existsSync(configPath)) {\n console.log(pc.yellow('saas.yaml already exists'));\n return;\n }\n\n const config = `# SaaS CLI Configuration\nproject:\n name: my-saas-app\n type: flutter\n\nflutter:\n path: .\n\nsupabase:\n path: supabase\n types_output: lib/generated/supabase_types.dart\n\ntemplates:\n riverpod:\n path: lib/features/{feature}/presentation/providers\n drift:\n path: lib/features/{feature}/data/datasources/local\n freezed:\n path: lib/features/{feature}/domain/entities\n`;\n\n await writeFile(configPath, config);\n console.log(pc.green('✓ Created saas.yaml'));\n }),\n );\n","import { Command } from 'commander';\nimport got from 'got';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\n\nconst ONESIGNAL_API = 'https://onesignal.com/api/v1';\n\nasync function getOneSignalConfig() {\n const appId = process.env.ONESIGNAL_APP_ID;\n const apiKey = process.env.ONESIGNAL_API_KEY;\n\n if (!appId || !apiKey) {\n const config = await loadGlobalConfig();\n return {\n appId: appId || config.onesignal?.appId,\n apiKey: apiKey || config.onesignal?.apiKey,\n };\n }\n\n return { appId, apiKey };\n}\n\nasync function sendNotification(\n target: { userId?: string; segment?: string },\n message: string,\n data?: Record<string, unknown>,\n scheduleAt?: string,\n) {\n const { appId, apiKey } = await getOneSignalConfig();\n\n if (!appId || !apiKey) {\n throw new AuthError(\n 'OneSignal credentials not found',\n 'Set ONESIGNAL_APP_ID and ONESIGNAL_API_KEY environment variables',\n );\n }\n\n const payload: Record<string, unknown> = {\n app_id: appId,\n contents: { en: message },\n };\n\n if (target.userId) {\n payload.include_external_user_ids = [target.userId];\n } else if (target.segment) {\n payload.included_segments = [target.segment];\n }\n\n if (data) {\n payload.data = data;\n }\n\n if (scheduleAt) {\n payload.send_after = scheduleAt;\n }\n\n const response = await got\n .post(`${ONESIGNAL_API}/notifications`, {\n headers: {\n Authorization: `Basic ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: payload,\n })\n .json<{ id: string; recipients: number }>();\n\n return response;\n}\n\nexport const pushCommand = new Command('push')\n .description('OneSignal push notification management')\n .addCommand(\n new Command('send')\n .description('Send a push notification')\n .argument('<target>', 'User ID or segment name')\n .argument('<message>', 'Notification message')\n .option('-s, --segment', 'Target is a segment name')\n .option('-d, --data <json>', 'Additional data (JSON)')\n .action(async (target, message, options) => {\n const spinner = ora('Sending notification...').start();\n try {\n const data = options.data ? JSON.parse(options.data) : undefined;\n const targetObj = options.segment ? { segment: target } : { userId: target };\n\n const result = await sendNotification(targetObj, message, data);\n\n spinner.succeed('Notification sent');\n console.log(pc.green(`ID: ${result.id}`));\n console.log(pc.dim(`Recipients: ${result.recipients}`));\n } catch (error) {\n spinner.fail('Failed to send notification');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('schedule')\n .description('Schedule a push notification')\n .argument('<target>', 'User ID')\n .argument('<message>', 'Notification message')\n .option(\n '--at <datetime>',\n 'Send time (ISO 8601 format)',\n new Date(Date.now() + 3600000).toISOString(),\n )\n .option('-d, --data <json>', 'Additional data (JSON)')\n .action(async (target, message, options) => {\n const spinner = ora('Scheduling notification...').start();\n try {\n const data = options.data ? JSON.parse(options.data) : undefined;\n\n const result = await sendNotification({ userId: target }, message, data, options.at);\n\n spinner.succeed('Notification scheduled');\n console.log(pc.green(`ID: ${result.id}`));\n console.log(pc.dim(`Scheduled for: ${options.at}`));\n } catch (error) {\n spinner.fail('Failed to schedule notification');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('template')\n .description('Template operations')\n .argument('<action>', 'Action: list, send')\n .argument('[templateId]', 'Template ID (for send)')\n .option('--to <userId>', 'Target user ID (for send)')\n .action(async (action, templateId, options) => {\n const spinner = ora(`Template ${action}...`).start();\n try {\n const { appId, apiKey } = await getOneSignalConfig();\n\n if (!appId || !apiKey) {\n throw new AuthError(\n 'OneSignal credentials not found',\n 'Set ONESIGNAL_APP_ID and ONESIGNAL_API_KEY environment variables',\n );\n }\n\n if (action === 'list') {\n const response = await got\n .get(`${ONESIGNAL_API}/templates?app_id=${appId}`, {\n headers: { Authorization: `Basic ${apiKey}` },\n })\n .json<{ templates: Array<{ id: string; name: string }> }>();\n\n spinner.stop();\n console.log(pc.cyan('Templates:'));\n for (const template of response.templates) {\n console.log(` ${pc.green(template.id)} - ${template.name}`);\n }\n } else if (action === 'send') {\n if (!templateId || !options.to) {\n throw new Error('Template ID and target user required');\n }\n\n const response = await got\n .post(`${ONESIGNAL_API}/notifications`, {\n headers: {\n Authorization: `Basic ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n json: {\n app_id: appId,\n template_id: templateId,\n include_external_user_ids: [options.to],\n },\n })\n .json<{ id: string }>();\n\n spinner.succeed('Template notification sent');\n console.log(pc.green(`ID: ${response.id}`));\n }\n } catch (error) {\n spinner.fail(`Template ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { loadGlobalConfig } from '../../utils/config.js';\nimport { AuthError, handleError } from '../../utils/error.js';\nimport { formatTable } from '../../utils/output.js';\n\n// Note: In production, you'd use ioredis. This is a simplified implementation.\nasync function getRedisUrl(): Promise<string> {\n const url = process.env.REDIS_URL;\n if (!url) {\n const config = await loadGlobalConfig();\n if (config.redis?.url) {\n return config.redis.url;\n }\n throw new AuthError(\n 'REDIS_URL environment variable is not set',\n 'Set REDIS_URL to your Redis/DragonflyDB connection string',\n );\n }\n return url;\n}\n\nexport const redisCommand = new Command('redis')\n .description('Redis/DragonflyDB cache and queue management')\n .addCommand(\n new Command('ping').description('Test Redis connection').action(async () => {\n const spinner = ora('Pinging Redis...').start();\n try {\n const url = await getRedisUrl();\n // In production, use ioredis here\n spinner.succeed(`Connected to Redis at ${url.replace(/:[^:]+@/, ':****@')}`);\n console.log(pc.green('PONG'));\n } catch (error) {\n spinner.fail('Failed to connect to Redis');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('info').description('Get Redis server info').action(async () => {\n const spinner = ora('Fetching Redis info...').start();\n try {\n await getRedisUrl();\n spinner.stop();\n console.log(pc.yellow('Note: Full Redis info requires ioredis integration'));\n console.log('Install ioredis for full functionality: pnpm add ioredis');\n } catch (error) {\n spinner.fail('Failed to get Redis info');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('keys')\n .description('List keys matching pattern')\n .argument('<pattern>', 'Key pattern (e.g., user:*)')\n .action(async (pattern) => {\n const spinner = ora(`Searching keys: ${pattern}...`).start();\n try {\n await getRedisUrl();\n spinner.stop();\n console.log(pc.yellow('Note: Key listing requires ioredis integration'));\n } catch (error) {\n spinner.fail('Failed to list keys');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('get')\n .description('Get value by key')\n .argument('<key>', 'Key name')\n .action(async (_key) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Get operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('set')\n .description('Set a key-value pair')\n .argument('<key>', 'Key name')\n .argument('<value>', 'Value')\n .option('--ttl <seconds>', 'Time to live in seconds')\n .action(async (_key, _value, _options) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Set operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('del')\n .description('Delete a key')\n .argument('<key>', 'Key name')\n .action(async (_key) => {\n try {\n await getRedisUrl();\n console.log(pc.yellow('Note: Delete operation requires ioredis integration'));\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('queue')\n .description('BullMQ queue operations')\n .argument('<name>', 'Queue name')\n .argument(\n '[action]',\n 'Action: status, waiting, active, failed, delayed, pause, resume, clean',\n )\n .option('--status <status>', 'Job status for clean action')\n .option('--age <hours>', 'Job age in hours for clean action')\n .action(async (name, action = 'status', _options) => {\n const spinner = ora(`Queue ${name}: ${action}...`).start();\n try {\n await getRedisUrl();\n spinner.stop();\n\n // Placeholder output\n if (action === 'status') {\n console.log(pc.cyan(`Queue: ${name}`));\n console.log(\n formatTable(\n ['Status', 'Count'],\n [\n ['waiting', '0'],\n ['active', '0'],\n ['completed', '0'],\n ['failed', '0'],\n ['delayed', '0'],\n ],\n ),\n );\n }\n console.log(pc.yellow('\\nNote: Full BullMQ integration requires bullmq package'));\n } catch (error) {\n spinner.fail(`Queue operation failed`);\n handleError(error);\n }\n }),\n );\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { RLS_POLICIES, type RLSPolicyType, runSupabaseCommand } from '../../services/supabase.js';\nimport { columnsToSQL, parseColumnSpec } from '../../utils/column-parser.js';\nimport { CLIError, handleError } from '../../utils/error.js';\nimport { validateOutputPath } from '../../utils/path.js';\nimport { assertValidProjectName } from '../../utils/validation.js';\n\nexport const supabaseCommand = new Command('supabase')\n .description('Supabase database management')\n .addCommand(\n new Command('schema')\n .description('Show database schema')\n .argument('[table]', 'Specific table name')\n .option('--rls', 'Include RLS policies')\n .option('--relationships', 'Show foreign key relationships')\n .action(async (_table, _options) => {\n const spinner = ora('Fetching schema...').start();\n try {\n const output = await runSupabaseCommand(['db', 'dump', '--schema', 'public', '-f', '-']);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail('Failed to fetch schema');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('create-table')\n .description('Generate CREATE TABLE SQL')\n .argument('<name>', 'Table name')\n .option('-c, --columns <spec>', 'Column specification')\n .option('--from-freezed <file>', 'Generate from Freezed model file')\n .action(async (name, options) => {\n try {\n if (!options.columns) {\n throw new CLIError(\n 'Columns specification required',\n 1,\n 'Use --columns \"id:uuid:pk,title:text,user_id:uuid:fk(auth.users)\"',\n );\n }\n\n const columns = parseColumnSpec(options.columns);\n const sql = columnsToSQL(name, columns);\n\n console.log(pc.cyan('-- Migration: create_' + name + '_table'));\n console.log(sql);\n console.log('\\n-- Enable RLS');\n console.log(`ALTER TABLE ${name} ENABLE ROW LEVEL SECURITY;`);\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('rls')\n .description('Generate RLS policies')\n .argument('<table>', 'Table name')\n .option(\n '-p, --policy <type>',\n 'Policy type: user-owned, team-owned, public-read, admin-only',\n 'user-owned',\n )\n .option('-c, --column <name>', 'User/team ID column', 'user_id')\n .action(async (table, options) => {\n try {\n const policyType = options.policy as RLSPolicyType;\n if (!RLS_POLICIES[policyType]) {\n throw new CLIError(\n `Invalid policy type: \"${policyType}\"`,\n 1,\n 'Valid types: user-owned, team-owned, public-read, admin-only',\n );\n }\n\n const sql = RLS_POLICIES[policyType](table, options.column);\n console.log(sql);\n } catch (error) {\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('migration')\n .description('Migration management')\n .argument('<action>', 'Action: new, apply, status')\n .argument('[name]', 'Migration name (for new)')\n .action(async (action, name) => {\n const spinner = ora(`Running migration ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n if (!name) {\n throw new CLIError('Migration name required for \"new\" action');\n }\n assertValidProjectName(name);\n args = ['migration', 'new', name];\n break;\n case 'apply':\n args = ['db', 'push'];\n break;\n case 'status':\n args = ['migration', 'list'];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, apply, status',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Migration ${action} failed`);\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('types')\n .description('Generate TypeScript/Dart types')\n .argument('<lang>', 'Language: dart, typescript')\n .option('-o, --output <path>', 'Output file path')\n .action(async (lang, options) => {\n const spinner = ora(`Generating ${lang} types...`).start();\n try {\n let args: string[];\n switch (lang) {\n case 'dart':\n case 'typescript':\n args = ['gen', 'types', lang, '--local'];\n break;\n default:\n throw new CLIError(\n `Invalid language: \"${lang}\"`,\n 1,\n 'Valid languages: dart, typescript',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n\n if (options.output) {\n const safePath = validateOutputPath(options.output);\n const { writeFile } = await import('node:fs/promises');\n await writeFile(safePath, output);\n console.log(pc.green(`✓ Generated ${safePath}`));\n } else {\n console.log(output);\n }\n } catch (error) {\n spinner.fail('Type generation failed');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('fn')\n .description('Edge function management')\n .argument('<action>', 'Action: new, deploy, logs')\n .argument('<name>', 'Function name')\n .action(async (action, name) => {\n assertValidProjectName(name);\n const spinner = ora(`Running fn ${action}...`).start();\n try {\n let args: string[];\n switch (action) {\n case 'new':\n args = ['functions', 'new', name];\n break;\n case 'deploy':\n args = ['functions', 'deploy', name];\n break;\n case 'logs':\n args = ['functions', 'logs', name];\n break;\n default:\n throw new CLIError(\n `Invalid action: \"${action}\"`,\n 1,\n 'Valid actions: new, deploy, logs',\n );\n }\n\n const output = await runSupabaseCommand(args);\n spinner.stop();\n console.log(output);\n } catch (error) {\n spinner.fail(`Function ${action} failed`);\n handleError(error);\n }\n }),\n );\n","import { CLIError } from '../utils/error.js';\nimport { execFileAsync } from '../utils/exec.js';\nimport { validateOutputPath } from '../utils/path.js';\nimport { assertValidIdentifier } from '../utils/validation.js';\n\n/**\n * Check if Supabase CLI is installed\n */\nexport async function checkSupabaseCLI(): Promise<boolean> {\n try {\n await execFileAsync('supabase', ['--version']);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Run a Supabase CLI command\n */\nexport async function runSupabaseCommand(args: string[]): Promise<string> {\n const isInstalled = await checkSupabaseCLI();\n if (!isInstalled) {\n throw new CLIError(\n 'Supabase CLI not found',\n 1,\n 'Install with: brew install supabase/tap/supabase',\n );\n }\n\n try {\n const { stdout, stderr } = await execFileAsync('supabase', args);\n if (stderr && !stderr.includes('warning')) {\n console.error(stderr);\n }\n return stdout;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`Supabase command failed: ${message}`);\n }\n}\n\n/**\n * Get database schema\n */\nexport async function getSchema(tableName?: string): Promise<string> {\n const args = ['db', 'dump', '--schema', 'public'];\n if (tableName) {\n assertValidIdentifier(tableName, 'table name');\n args.push('--data-only', '--table', tableName);\n }\n return runSupabaseCommand(args);\n}\n\n/**\n * Generate TypeScript types\n */\nexport async function generateTypes(outputPath?: string): Promise<string> {\n const args = ['gen', 'types', 'typescript', '--local'];\n const output = await runSupabaseCommand(args);\n\n if (outputPath) {\n const safePath = validateOutputPath(outputPath);\n const { writeFile } = await import('node:fs/promises');\n await writeFile(safePath, output);\n }\n\n return output;\n}\n\n/**\n * RLS policy templates\n */\nexport const RLS_POLICIES = {\n 'user-owned': (table: string, column: string) => {\n assertValidIdentifier(table, 'table name');\n assertValidIdentifier(column, 'column name');\n return `\n-- RLS Policies for ${table} (user-owned)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Users can view their own records\nCREATE POLICY \"Users can view own ${table}\"\n ON ${table} FOR SELECT\n USING (auth.uid() = ${column});\n\n-- Users can create their own records\nCREATE POLICY \"Users can create own ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (auth.uid() = ${column});\n\n-- Users can update their own records\nCREATE POLICY \"Users can update own ${table}\"\n ON ${table} FOR UPDATE\n USING (auth.uid() = ${column});\n\n-- Users can delete their own records\nCREATE POLICY \"Users can delete own ${table}\"\n ON ${table} FOR DELETE\n USING (auth.uid() = ${column});\n`;\n },\n\n 'team-owned': (table: string, teamColumn: string) => {\n assertValidIdentifier(table, 'table name');\n assertValidIdentifier(teamColumn, 'column name');\n return `\n-- RLS Policies for ${table} (team-owned)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Team members can view team records\nCREATE POLICY \"Team members can view ${table}\"\n ON ${table} FOR SELECT\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team members can create team records\nCREATE POLICY \"Team members can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team members can update team records\nCREATE POLICY \"Team members can update ${table}\"\n ON ${table} FOR UPDATE\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid()\n )\n );\n\n-- Team admins can delete team records\nCREATE POLICY \"Team admins can delete ${table}\"\n ON ${table} FOR DELETE\n USING (\n ${teamColumn} IN (\n SELECT team_id FROM team_members WHERE user_id = auth.uid() AND role = 'admin'\n )\n );\n`;\n },\n\n 'public-read': (table: string) => {\n assertValidIdentifier(table, 'table name');\n return `\n-- RLS Policies for ${table} (public-read)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Anyone can view records\nCREATE POLICY \"Anyone can view ${table}\"\n ON ${table} FOR SELECT\n USING (true);\n\n-- Only authenticated users can create records\nCREATE POLICY \"Authenticated users can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (auth.role() = 'authenticated');\n\n-- Only owners can update their records\nCREATE POLICY \"Owners can update ${table}\"\n ON ${table} FOR UPDATE\n USING (auth.uid() = user_id);\n\n-- Only owners can delete their records\nCREATE POLICY \"Owners can delete ${table}\"\n ON ${table} FOR DELETE\n USING (auth.uid() = user_id);\n`;\n },\n\n 'admin-only': (table: string) => {\n assertValidIdentifier(table, 'table name');\n return `\n-- RLS Policies for ${table} (admin-only)\n\n-- Enable RLS\nALTER TABLE ${table} ENABLE ROW LEVEL SECURITY;\n\n-- Only admins can view records\nCREATE POLICY \"Admins can view ${table}\"\n ON ${table} FOR SELECT\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can create records\nCREATE POLICY \"Admins can create ${table}\"\n ON ${table} FOR INSERT\n WITH CHECK (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can update records\nCREATE POLICY \"Admins can update ${table}\"\n ON ${table} FOR UPDATE\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n\n-- Only admins can delete records\nCREATE POLICY \"Admins can delete ${table}\"\n ON ${table} FOR DELETE\n USING (\n auth.uid() IN (SELECT user_id FROM admins)\n );\n`;\n },\n};\n\nexport type RLSPolicyType = keyof typeof RLS_POLICIES;\n","import { Command } from 'commander';\nimport ora from 'ora';\nimport pc from 'picocolors';\nimport { CLIError, handleError } from '../../utils/error.js';\nimport { execFileAsync } from '../../utils/exec.js';\nimport { validateOutputPath } from '../../utils/path.js';\nimport {\n assertValidCRF,\n assertValidResolution,\n assertValidTimestamp,\n} from '../../utils/validation.js';\n\nasync function checkFFmpeg(): Promise<boolean> {\n try {\n await execFileAsync('ffmpeg', ['-version']);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function runFFmpeg(args: string[]): Promise<string> {\n const isInstalled = await checkFFmpeg();\n if (!isInstalled) {\n throw new CLIError(\n 'FFmpeg not found',\n 1,\n 'Install FFmpeg: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)',\n );\n }\n\n try {\n const { stdout, stderr } = await execFileAsync('ffmpeg', args);\n return stdout || stderr;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`FFmpeg command failed: ${message}`);\n }\n}\n\nasync function runFFprobe(args: string[]): Promise<string> {\n const isInstalled = await checkFFmpeg();\n if (!isInstalled) {\n throw new CLIError(\n 'FFmpeg/FFprobe not found',\n 1,\n 'Install FFmpeg: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)',\n );\n }\n\n try {\n const { stdout } = await execFileAsync('ffprobe', args);\n return stdout;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new CLIError(`FFprobe command failed: ${message}`);\n }\n}\n\nexport const videoCommand = new Command('video')\n .description('Video processing with FFmpeg')\n .addCommand(\n new Command('info')\n .description('Get video file information')\n .argument('<file>', 'Video file path')\n .action(async (file) => {\n const spinner = ora('Analyzing video...').start();\n try {\n const output = await runFFprobe([\n '-v',\n 'quiet',\n '-print_format',\n 'json',\n '-show_format',\n '-show_streams',\n file,\n ]);\n\n spinner.stop();\n\n try {\n const info = JSON.parse(output);\n const format = info.format || {};\n const videoStream =\n info.streams?.find((s: { codec_type: string }) => s.codec_type === 'video') || {};\n const audioStream =\n info.streams?.find((s: { codec_type: string }) => s.codec_type === 'audio') || {};\n\n console.log(pc.cyan('Video Information:'));\n console.log(` File: ${format.filename || file}`);\n console.log(\n ` Duration: ${format.duration ? Number.parseFloat(format.duration).toFixed(2) + 's' : 'N/A'}`,\n );\n console.log(\n ` Size: ${format.size ? (Number.parseInt(format.size, 10) / 1024 / 1024).toFixed(2) + ' MB' : 'N/A'}`,\n );\n console.log(\n ` Bitrate: ${format.bit_rate ? (Number.parseInt(format.bit_rate, 10) / 1000).toFixed(0) + ' kbps' : 'N/A'}`,\n );\n\n if (videoStream.width) {\n console.log(pc.cyan('\\nVideo Stream:'));\n console.log(` Resolution: ${videoStream.width}x${videoStream.height}`);\n console.log(` Codec: ${videoStream.codec_name || 'N/A'}`);\n console.log(` FPS: ${videoStream.r_frame_rate || 'N/A'}`);\n }\n\n if (audioStream.codec_name) {\n console.log(pc.cyan('\\nAudio Stream:'));\n console.log(` Codec: ${audioStream.codec_name}`);\n console.log(` Sample Rate: ${audioStream.sample_rate || 'N/A'} Hz`);\n console.log(` Channels: ${audioStream.channels || 'N/A'}`);\n }\n } catch {\n console.log(output);\n }\n } catch (error) {\n spinner.fail('Failed to analyze video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('combine')\n .description('Combine video and audio')\n .argument('<video>', 'Video file path')\n .argument('<audio>', 'Audio file path')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, audio, options) => {\n const safePath = validateOutputPath(options.output);\n const spinner = ora('Combining video and audio...').start();\n try {\n await runFFmpeg([\n '-i',\n video,\n '-i',\n audio,\n '-c:v',\n 'copy',\n '-c:a',\n 'aac',\n '-y',\n safePath,\n ]);\n\n spinner.succeed(`Combined: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to combine video and audio');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('thumbnail')\n .description('Extract thumbnail from video')\n .argument('<video>', 'Video file path')\n .option('--at <timestamp>', 'Timestamp (e.g., 00:00:05)', '00:00:01')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n assertValidTimestamp(options.at);\n const safePath = validateOutputPath(options.output);\n const spinner = ora('Extracting thumbnail...').start();\n try {\n await runFFmpeg(['-i', video, '-ss', options.at, '-vframes', '1', '-y', safePath]);\n\n spinner.succeed(`Thumbnail: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to extract thumbnail');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('resize')\n .description('Resize video')\n .argument('<video>', 'Video file path')\n .requiredOption('-s, --size <WxH>', 'New size (e.g., 1280x720 or -1:720)')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n assertValidResolution(options.size);\n const safePath = validateOutputPath(options.output);\n // Convert WxH format to W:H for FFmpeg scale filter\n const scaleSize = options.size.replace('x', ':');\n const spinner = ora('Resizing video...').start();\n try {\n await runFFmpeg(['-i', video, '-vf', `scale=${scaleSize}`, '-y', safePath]);\n\n spinner.succeed(`Resized: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to resize video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('compress')\n .description('Compress video')\n .argument('<video>', 'Video file path')\n .option('-q, --quality <crf>', 'Quality (0-51, lower is better)', '23')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n assertValidCRF(options.quality);\n const safePath = validateOutputPath(options.output);\n const spinner = ora('Compressing video...').start();\n try {\n await runFFmpeg([\n '-i',\n video,\n '-c:v',\n 'libx264',\n '-crf',\n options.quality,\n '-preset',\n 'medium',\n '-y',\n safePath,\n ]);\n\n spinner.succeed(`Compressed: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to compress video');\n handleError(error);\n }\n }),\n )\n .addCommand(\n new Command('trim')\n .description('Trim video')\n .argument('<video>', 'Video file path')\n .requiredOption('--start <time>', 'Start time (e.g., 00:00:10)')\n .requiredOption('--end <time>', 'End time (e.g., 00:01:00)')\n .requiredOption('-o, --output <file>', 'Output file path')\n .action(async (video, options) => {\n assertValidTimestamp(options.start);\n assertValidTimestamp(options.end);\n const safePath = validateOutputPath(options.output);\n const spinner = ora('Trimming video...').start();\n try {\n await runFFmpeg([\n '-i',\n video,\n '-ss',\n options.start,\n '-to',\n options.end,\n '-c',\n 'copy',\n '-y',\n safePath,\n ]);\n\n spinner.succeed(`Trimmed: ${safePath}`);\n } catch (error) {\n spinner.fail('Failed to trim video');\n handleError(error);\n }\n }),\n );\n"],"mappings":"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","names":["Command","pc","result","Command","ora","CLIError","Command","ora","Command","Command","ora","pc","Command","ora","pc","Command","Command","ora","pc","Command","ora","pc","Command","got","ora","pc","got","Command","ora","result","pc","Command","ora","pc","Command","ora","pc","Command","ora","pc","Command","ora","pc","writeFile","Command","ora","pc","Command","ora","pc","require","Command","pc"]}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@beaulewis/saas-cli",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "A unified CLI tool for Flutter SaaS development with live documentation, code generation, and backend integration",
5
5
  "type": "module",
6
+ "packageManager": "pnpm@9.15.0",
6
7
  "bin": {
7
8
  "saas": "./bin/saas.js"
8
9
  },
@@ -17,6 +18,23 @@
17
18
  "dist",
18
19
  "templates"
19
20
  ],
21
+ "scripts": {
22
+ "dev": "tsx watch src/index.ts",
23
+ "build": "tsup",
24
+ "start": "node dist/index.js",
25
+ "lint": "biome check src/",
26
+ "lint:fix": "biome check --write src/",
27
+ "format": "biome format --write src/",
28
+ "format:check": "biome format src/",
29
+ "typecheck": "tsc --noEmit",
30
+ "test": "vitest run",
31
+ "test:watch": "vitest",
32
+ "test:unit": "vitest run tests/unit",
33
+ "test:integration": "vitest run tests/integration",
34
+ "test:coverage": "vitest run --coverage",
35
+ "prepare": "husky",
36
+ "prepublishOnly": "pnpm build"
37
+ },
20
38
  "dependencies": {
21
39
  "@inquirer/prompts": "^8.1.0",
22
40
  "cli-table3": "^0.6.5",
@@ -68,20 +86,5 @@
68
86
  "license": "MIT",
69
87
  "publishConfig": {
70
88
  "access": "public"
71
- },
72
- "scripts": {
73
- "dev": "tsx watch src/index.ts",
74
- "build": "tsup",
75
- "start": "node dist/index.js",
76
- "lint": "biome check src/",
77
- "lint:fix": "biome check --write src/",
78
- "format": "biome format --write src/",
79
- "format:check": "biome format src/",
80
- "typecheck": "tsc --noEmit",
81
- "test": "vitest run",
82
- "test:watch": "vitest",
83
- "test:unit": "vitest run tests/unit",
84
- "test:integration": "vitest run tests/integration",
85
- "test:coverage": "vitest run --coverage"
86
89
  }
87
- }
90
+ }