@envmanager-cli/cli 0.1.10 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/envmanager.ts","../../src/commands/login.ts","../../src/lib/auth.ts","../../src/lib/credentials.ts","../../src/commands/logout.ts","../../src/commands/whoami.ts","../../src/lib/client.ts","../../src/commands/pull.ts","../../src/lib/config.ts","../../src/lib/formatters.ts","../../src/lib/resolve.ts","../../src/lib/variable-references.ts","../../src/commands/push.ts","../../src/lib/parser.ts","../../src/lib/naming-conventions.ts","../../src/commands/diff.ts","../../src/commands/list.ts","../../src/commands/config.ts","../../src/commands/dev.ts","../../src/lib/realtime.ts","../../src/lib/watcher.ts","../../src/lib/conflict.ts","../../src/commands/init.ts","../../src/lib/template-simple.ts","../../src/lib/template-yaml.ts","../../src/commands/template.ts","../../src/commands/validate.ts","../../src/lib/schema.ts","../../src/commands/completion.ts","../../src/commands/debug.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { readFileSync } from 'fs'\nimport { dirname, resolve } from 'path'\nimport { fileURLToPath } from 'url'\nimport { loginCommand } from '../commands/login.js'\nimport { logoutCommand } from '../commands/logout.js'\nimport { whoamiCommand } from '../commands/whoami.js'\nimport { pullCommand } from '../commands/pull.js'\nimport { pushCommand } from '../commands/push.js'\nimport { diffCommand } from '../commands/diff.js'\nimport { listCommand } from '../commands/list.js'\nimport { configCommand } from '../commands/config.js'\nimport { devCommand } from '../commands/dev.js'\nimport { initCommand } from '../commands/init.js'\nimport { templateCommand } from '../commands/template.js'\nimport { validateCommand } from '../commands/validate.js'\nimport { completionCommand, completeCommand } from '../commands/completion.js'\nimport { debugCommand } from '../commands/debug.js'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst pkg = JSON.parse(readFileSync(resolve(__dirname, '../../package.json'), 'utf-8'))\n\nconst program = new Command()\n\nprogram\n .name('envmanager')\n .description('CLI for EnvManager - secure environment variable management')\n .version(pkg.version)\n\nprogram.addCommand(loginCommand)\nprogram.addCommand(logoutCommand)\nprogram.addCommand(whoamiCommand)\nprogram.addCommand(pullCommand)\nprogram.addCommand(pushCommand)\nprogram.addCommand(diffCommand)\nprogram.addCommand(listCommand)\nprogram.addCommand(configCommand)\nprogram.addCommand(devCommand)\nprogram.addCommand(initCommand)\nprogram.addCommand(templateCommand)\nprogram.addCommand(validateCommand)\nprogram.addCommand(completionCommand)\nprogram.addCommand(completeCommand)\nprogram.addCommand(debugCommand)\n\nprogram.parse()\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loginWithBrowser } from '../lib/auth.js'\nimport { getCredentials } from '../lib/credentials.js'\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with EnvManager')\n .action(async () => {\n const existingCreds = getCredentials()\n if (existingCreds?.email) {\n console.log(chalk.yellow(`Already logged in as ${existingCreds.email}`))\n console.log(chalk.gray('Run `envmanager logout` first to switch accounts.'))\n return\n }\n\n const spinner = ora('Opening browser for authentication...').start()\n \n try {\n spinner.text = 'Waiting for authentication...'\n const { email } = await loginWithBrowser()\n \n spinner.succeed('Authentication successful!')\n \n if (email) {\n console.log(chalk.green(`\\nLogged in as ${email}`))\n }\n \n console.log(chalk.gray('\\nYou can now use envmanager commands.'))\n console.log(chalk.gray('Run `envmanager list` to see your projects.'))\n } catch (error) {\n spinner.fail('Login failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { createServer, IncomingMessage, ServerResponse } from 'http'\nimport { randomBytes, createHash } from 'crypto'\nimport open from 'open'\nimport { saveCredentials, getCredentials, isTokenExpired, shouldRefreshToken, getStoredApiKey, getStoredApiUrl } from './credentials.js'\n\nconst DEFAULT_APP_URL = 'https://envmanager.com'\nconst DEFAULT_API_URL = 'https://rhopfaburfflrdwpowcd.supabase.co'\n\nfunction getAppUrl(): string {\n return process.env.ENVMANAGER_APP_URL || DEFAULT_APP_URL\n}\n\nfunction getApiUrl(): string {\n return process.env.ENVMANAGER_API_URL || getStoredApiUrl() || DEFAULT_API_URL\n}\n\nfunction generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url')\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return createHash('sha256').update(verifier).digest('base64url')\n}\n\nfunction generateState(): string {\n return randomBytes(16).toString('hex')\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\ninterface AuthCallbackResult {\n apiKey?: string\n accessToken?: string\n refreshToken?: string\n expiresIn?: number\n}\n\nasync function startCallbackServer(expectedState: string, port: number = 8976): Promise<AuthCallbackResult> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n server.close()\n reject(new Error('Authentication timed out after 5 minutes'))\n }, 5 * 60 * 1000)\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || '/', `http://localhost:${port}`)\n \n if (url.pathname === '/callback') {\n const apiKey = url.searchParams.get('api_key')\n const accessToken = url.searchParams.get('access_token')\n const refreshToken = url.searchParams.get('refresh_token')\n const expiresIn = url.searchParams.get('expires_in')\n const state = url.searchParams.get('state')\n const error = url.searchParams.get('error')\n const errorDescription = url.searchParams.get('error_description')\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Authentication Failed</h1>\n <p>${escapeHtml(errorDescription || error || 'Unknown error')}</p>\n <p>You can close this window.</p>\n </body>\n </html>\n `)\n clearTimeout(timeout)\n server.close()\n reject(new Error(errorDescription || error))\n return\n }\n\n // Accept either API key (new flow) or session tokens (legacy/fallback)\n if (!apiKey && (!accessToken || !refreshToken)) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Invalid Callback</h1>\n <p>Missing authentication credentials.</p>\n </body>\n </html>\n `)\n clearTimeout(timeout)\n server.close()\n reject(new Error('Invalid callback: missing credentials'))\n return\n }\n\n if (!state || state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Invalid State</h1>\n <p>State mismatch - possible CSRF attack.</p>\n </body>\n </html>\n `)\n clearTimeout(timeout)\n server.close()\n reject(new Error('State mismatch - authentication failed'))\n return\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Authentication Successful!</h1>\n <p>You can close this window and return to your terminal.</p>\n </body>\n </html>\n `)\n\n clearTimeout(timeout)\n server.close()\n\n // Return API key if present (new flow), otherwise return tokens (legacy)\n if (apiKey) {\n resolve({ apiKey })\n } else {\n resolve({\n accessToken: accessToken!,\n refreshToken: refreshToken!,\n expiresIn: parseInt(expiresIn || '3600', 10)\n })\n }\n } else {\n res.writeHead(404)\n res.end('Not found')\n }\n })\n\n server.listen(port, '127.0.0.1', () => {})\n \n server.on('error', (err: Error & { code?: string }) => {\n clearTimeout(timeout)\n if (err.code === 'EADDRINUSE') {\n reject(new Error(`Port ${port} is already in use. Please close the application using it.`))\n } else {\n reject(err)\n }\n })\n })\n}\n\ninterface TokenResponse {\n access_token: string\n refresh_token: string\n expires_in: number\n user?: {\n id: string\n email?: string\n }\n}\n\nasync function exchangeCodeForTokens(code: string, codeVerifier: string): Promise<TokenResponse> {\n const apiUrl = getApiUrl()\n const response = await fetch(`${apiUrl}/functions/v1/cli-auth-callback`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n code_verifier: codeVerifier,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string }\n throw new Error(errorData.error || `HTTP ${response.status}`)\n }\n\n return response.json() as Promise<TokenResponse>\n}\n\n// In-memory cache for exchanged API key tokens (process lifetime only)\nlet cachedToken: { accessToken: string; refreshToken: string; expiresAt: number } | null = null\n\nexport function clearCachedToken(): void {\n cachedToken = null\n}\n\nexport async function refreshTokens(): Promise<void> {\n const credentials = getCredentials()\n if (!credentials?.refreshToken) {\n throw new Error('No refresh token available')\n }\n\n const apiUrl = getApiUrl()\n const response = await fetch(`${apiUrl}/functions/v1/cli-auth-refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n refresh_token: credentials.refreshToken,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: `HTTP ${response.status}` })) as { error?: string }\n const errorMessage = errorData.error || `HTTP ${response.status}`\n throw new Error(`Token refresh failed: ${errorMessage}`)\n }\n\n const tokens = await response.json() as TokenResponse\n \n saveCredentials({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt: Date.now() + tokens.expires_in * 1000,\n email: credentials.email,\n })\n}\n\nexport async function exchangeApiKeyForToken(apiKey: string): Promise<TokenResponse> {\n const apiUrl = getApiUrl()\n const response = await fetch(`${apiUrl}/functions/v1/cli-api-key-auth`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string }\n throw new Error(errorData.error || `HTTP ${response.status}`)\n }\n\n return response.json() as Promise<TokenResponse>\n}\n\nexport async function loginWithBrowser(): Promise<{ email?: string }> {\n const state = generateState()\n const port = 8976\n const redirectUri = `http://localhost:${port}/callback`\n\n const appUrl = getAppUrl()\n const authUrl = new URL(`${appUrl}/auth/cli-login`)\n authUrl.searchParams.set('redirect_uri', redirectUri)\n authUrl.searchParams.set('state', state)\n\n const serverPromise = startCallbackServer(state, port)\n\n await open(authUrl.toString())\n\n const result = await serverPromise\n\n // New flow: API key based authentication\n if (result.apiKey) {\n saveCredentials({\n apiKey: result.apiKey,\n apiUrl: getApiUrl(),\n })\n return {}\n }\n\n // Legacy flow: session tokens (fallback)\n saveCredentials({\n accessToken: result.accessToken!,\n refreshToken: result.refreshToken!,\n expiresAt: Date.now() + (result.expiresIn || 3600) * 1000,\n apiUrl: getApiUrl(),\n })\n\n return {}\n}\n\nexport async function ensureAuthenticated(): Promise<string> {\n const credentials = getCredentials()\n\n if (!credentials) {\n throw new Error('Not authenticated. Run `envmanager login` first.')\n }\n\n // New flow: API key based authentication\n const storedApiKey = getStoredApiKey()\n if (storedApiKey) {\n // Return cached token if still valid (with 5-minute buffer)\n if (cachedToken && Date.now() < cachedToken.expiresAt - 5 * 60 * 1000) {\n return cachedToken.accessToken\n }\n\n const tokens = await exchangeApiKeyForToken(storedApiKey)\n cachedToken = {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt: Date.now() + tokens.expires_in * 1000,\n }\n return cachedToken.accessToken\n }\n\n // Legacy flow: session token refresh\n if (shouldRefreshToken() || isTokenExpired()) {\n try {\n await refreshTokens()\n const newCreds = getCredentials()\n if (newCreds?.accessToken) {\n return newCreds.accessToken\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new Error(`Session refresh failed: ${message}\\nRun \\`envmanager login\\` to re-authenticate.`)\n }\n }\n\n if (!credentials.accessToken) {\n throw new Error('Not authenticated. Run `envmanager login` first.')\n }\n\n return credentials.accessToken\n}\n\nexport async function tryRefreshToken(): Promise<boolean> {\n try {\n if (shouldRefreshToken() || isTokenExpired()) {\n await refreshTokens()\n return true\n }\n return false\n } catch {\n return false\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync } from 'fs'\nimport { homedir } from 'os'\nimport { join } from 'path'\n\nconst CONFIG_DIR = join(homedir(), '.config', 'envmanager')\nconst CREDENTIALS_FILE = join(CONFIG_DIR, 'auth.json')\n\ninterface Credentials {\n // New flow: API key based auth (preferred)\n apiKey?: string\n // Legacy flow: session tokens\n accessToken?: string\n refreshToken?: string\n expiresAt?: number\n // Common\n apiUrl?: string\n email?: string\n}\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 })\n }\n}\n\nexport function getCredentials(): Credentials | null {\n if (!existsSync(CREDENTIALS_FILE)) {\n return null\n }\n\n try {\n const content = readFileSync(CREDENTIALS_FILE, 'utf-8')\n return JSON.parse(content) as Credentials\n } catch {\n return null\n }\n}\n\nexport function saveCredentials(credentials: Credentials): void {\n ensureConfigDir()\n writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), { mode: 0o600 })\n chmodSync(CREDENTIALS_FILE, 0o600)\n}\n\nexport function clearCredentials(): void {\n if (existsSync(CREDENTIALS_FILE)) {\n unlinkSync(CREDENTIALS_FILE)\n }\n}\n\nexport function isTokenExpired(): boolean {\n const creds = getCredentials()\n if (!creds) return true\n // API key auth doesn't expire in the same way - let the server validate\n if (creds.apiKey) return false\n if (!creds.expiresAt) return true\n return Date.now() >= creds.expiresAt\n}\n\nconst PROACTIVE_REFRESH_BUFFER_MS = 5 * 60 * 1000\n\nexport function shouldRefreshToken(): boolean {\n const creds = getCredentials()\n if (!creds) return false\n // API key auth doesn't need proactive refresh\n if (creds.apiKey) return false\n if (!creds.expiresAt) return false\n return Date.now() >= (creds.expiresAt - PROACTIVE_REFRESH_BUFFER_MS)\n}\n\nexport function getApiKeyFromEnv(): string | null {\n return process.env.ENVMANAGER_API_KEY || null\n}\n\nexport function getStoredApiKey(): string | null {\n const creds = getCredentials()\n return creds?.apiKey || null\n}\n\nexport function getStoredApiUrl(): string | null {\n const creds = getCredentials()\n return creds?.apiUrl || null\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { clearCredentials, getCredentials } from '../lib/credentials.js'\n\nexport const logoutCommand = new Command('logout')\n .description('Log out of EnvManager')\n .action(() => {\n const creds = getCredentials()\n \n if (!creds) {\n console.log(chalk.yellow('Not currently logged in.'))\n return\n }\n \n const email = creds.email || 'unknown user'\n clearCredentials()\n console.log(chalk.green(`Logged out from ${email}`))\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { getCredentials, isTokenExpired, getApiKeyFromEnv, getStoredApiKey } from '../lib/credentials.js'\nimport { createClient } from '../lib/client.js'\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show current user and team memberships')\n .action(async () => {\n const envApiKey = getApiKeyFromEnv()\n const storedApiKey = getStoredApiKey()\n\n if (envApiKey) {\n console.log(chalk.blue('Authenticated via environment API key'))\n console.log(chalk.gray(`Key prefix: ${envApiKey.substring(0, 11)}...`))\n return\n }\n\n const creds = getCredentials()\n\n if (!creds) {\n console.log(chalk.yellow('Not logged in.'))\n console.log(chalk.gray('Run `envmanager login` to authenticate.'))\n return\n }\n\n // New flow: API key from login\n if (storedApiKey) {\n // Continue to fetch user info below\n } else if (isTokenExpired()) {\n // Legacy flow: session tokens\n console.log(chalk.yellow('Session expired.'))\n console.log(chalk.gray('Run `envmanager login` to re-authenticate.'))\n return\n }\n\n const spinner = ora('Fetching user info...').start()\n\n try {\n const client = await createClient()\n \n const { data: { user }, error: userError } = await client.auth.getUser()\n \n if (userError || !user) {\n spinner.fail('Failed to fetch user')\n console.error(chalk.red(userError?.message || 'Unknown error'))\n return\n }\n\n const { data: memberships, error: memberError } = await client\n .from('organization_members')\n .select('role, organizations(name)')\n .eq('user_id', user.id)\n \n if (memberError) {\n spinner.fail('Failed to fetch memberships')\n console.error(chalk.red(memberError.message))\n return\n }\n\n spinner.stop()\n\n console.log(chalk.green(`Logged in as ${user.email}`))\n\n if (storedApiKey) {\n console.log(chalk.gray(`Authenticated via CLI session key (${storedApiKey.substring(0, 11)}...)`))\n } else if (creds.expiresAt) {\n const expiresIn = Math.round((creds.expiresAt - Date.now()) / 1000 / 60)\n if (expiresIn > 0) {\n console.log(chalk.gray(`Session expires in ${expiresIn} minutes`))\n }\n }\n\n if (memberships && memberships.length > 0) {\n console.log('')\n console.log(chalk.white('Organizations:'))\n memberships.forEach(m => {\n const org = m.organizations as { name: string } | { name: string }[] | null\n const orgName = Array.isArray(org) ? org[0]?.name : org?.name || 'Unknown'\n console.log(` ${orgName} ${chalk.gray(`(${m.role})`)}`)\n })\n }\n\n } catch (error) {\n spinner.fail('Failed to fetch user info')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n }\n })\n","import { createClient as createSupabaseClient, SupabaseClient } from '@supabase/supabase-js'\nimport { getCredentials, getApiKeyFromEnv, getStoredApiUrl, getStoredApiKey } from './credentials.js'\nimport { ensureAuthenticated, exchangeApiKeyForToken, clearCachedToken } from './auth.js'\n\nconst DEFAULT_API_URL = 'https://rhopfaburfflrdwpowcd.supabase.co'\nconst DEFAULT_ANON_KEY = 'sb_publishable_Y2EpPiIN3KPjQMc1GLVXjw__ghRVLC4'\nconst LOCAL_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0'\n\nfunction getApiUrl(): string {\n return process.env.ENVMANAGER_API_URL || getStoredApiUrl() || DEFAULT_API_URL\n}\n\nfunction getAnonKey(): string {\n const apiUrl = getApiUrl()\n if (apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1')) {\n return LOCAL_ANON_KEY\n }\n return process.env.ENVMANAGER_ANON_KEY || DEFAULT_ANON_KEY\n}\n\nlet clientInstance: SupabaseClient | null = null\nlet currentAccessToken: string | null = null\n\nexport async function createClient(): Promise<SupabaseClient> {\n if (clientInstance) {\n return clientInstance\n }\n\n // Priority: 1. Environment API key, 2. Stored API key (from login), 3. Session tokens\n const apiKey = getApiKeyFromEnv() || getStoredApiKey()\n\n if (apiKey) {\n const tokenResponse = await exchangeApiKeyForToken(apiKey)\n currentAccessToken = tokenResponse.access_token\n\n clientInstance = createSupabaseClient(getApiUrl(), getAnonKey(), {\n global: {\n headers: {\n Authorization: `Bearer ${currentAccessToken}`\n }\n }\n })\n\n await clientInstance.realtime.setAuth(currentAccessToken)\n return clientInstance\n }\n\n // Legacy flow: session tokens\n currentAccessToken = await ensureAuthenticated()\n\n clientInstance = createSupabaseClient(getApiUrl(), getAnonKey(), {\n global: {\n headers: {\n Authorization: `Bearer ${currentAccessToken}`\n }\n }\n })\n\n await clientInstance.realtime.setAuth(currentAccessToken)\n\n return clientInstance\n}\n\nexport function getAccessToken(): string | null {\n return currentAccessToken\n}\n\nexport async function refreshClientAuth(): Promise<void> {\n if (!clientInstance) return\n\n const accessToken = await ensureAuthenticated()\n currentAccessToken = accessToken\n\n // Update the realtime connection's auth token (preserves active channels)\n await clientInstance.realtime.setAuth(accessToken)\n}\n\nexport function resetClient(): void {\n clientInstance = null\n currentAccessToken = null\n clearCachedToken()\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { writeFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { Variable } from '../lib/types.js'\nimport { resolveAll, detectCircularReferences, type VariableInput, type ResolvedVariable } from '../lib/variable-references.js'\nimport { formatVariables, sanitizeK8sName, EXPORT_FORMATS, type ExportFormat, type ExportVariable, type K8sConfig } from '../lib/formatters.js'\n\nexport const pullCommand = new Command('pull')\n .description('Pull environment variables from EnvManager to local .env file')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: from config or \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('-o, --output <file>', 'Output file path (default: .env)')\n .option('--no-secrets', 'Exclude secret values (will be empty)')\n .option('-f, --force', 'Overwrite existing file without prompting')\n .option('-r, --resolve-references', 'Resolve ${VAR} references to their values')\n .option('-F, --include-fallbacks', 'Include fallback values for empty variables')\n .option('-s, --show-sources', 'Show value source as inline comments')\n .option('--format <type>', `Export format (${EXPORT_FORMATS.join(', ')})`)\n .option('--k8s-namespace <ns>', 'Kubernetes namespace (default: \"default\")')\n .option('--k8s-name <name>', 'Kubernetes resource name')\n .action(async (options) => {\n const spinner = ora('Connecting to EnvManager...').start()\n\n try {\n const config = loadConfig()\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const outputFile = resolve(options.output || config?.output || '.env')\n const includeSecrets = options.secrets !== false\n const shouldResolve = options.resolveReferences === true\n const shouldFallback = options.includeFallbacks === true\n const shouldShowSources = options.showSources === true\n\n // Resolve export format\n const formatInput = options.format || config?.format || 'dotenv'\n if (!EXPORT_FORMATS.includes(formatInput)) {\n spinner.fail(`Invalid format \"${formatInput}\". Valid formats: ${EXPORT_FORMATS.join(', ')}`)\n process.exit(1)\n }\n const format = formatInput as ExportFormat\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name> or create envmanager.json'))\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n // Resolve project (accepts UUID, friendly ID, or name)\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environments, error: envError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environments) {\n spinner.fail(`Environment \"${envName}\" not found in project`)\n console.log(chalk.gray('\\nAvailable environments:'))\n const { data: allEnvs } = await client\n .from('environments')\n .select('name')\n .eq('project_id', projectId)\n allEnvs?.forEach(e => console.log(chalk.gray(` - ${e.name}`)))\n process.exit(1)\n }\n\n const environmentId = environments.id\n\n spinner.text = 'Fetching variables...'\n const rpcParams: Record<string, unknown> = {\n p_environment_id: environmentId,\n p_sync_secrets: includeSecrets,\n p_sync_variables: true,\n p_include_fallbacks: shouldFallback || false,\n }\n\n const { data: variables, error: varError } = await client.rpc('get_variables_for_sync', rpcParams)\n\n if (varError) {\n spinner.fail('Failed to fetch variables')\n console.error(chalk.red(varError.message))\n process.exit(1)\n }\n\n if (!variables || variables.length === 0) {\n spinner.warn('No variables found')\n process.exit(0)\n }\n\n if (existsSync(outputFile) && !options.force) {\n spinner.stop()\n console.log(chalk.yellow(`\\nFile ${outputFile} already exists.`))\n console.log(chalk.gray('Use --force to overwrite.'))\n process.exit(1)\n }\n\n const vars = (variables as Variable[]).sort((a, b) => a.key.localeCompare(b.key))\n\n // Resolve references if requested\n let resolvedMap: Map<string, ResolvedVariable> | null = null\n if (shouldResolve) {\n spinner.text = 'Resolving variable references...'\n\n const inputs: VariableInput[] = vars.map(v => ({\n key: v.key,\n value: v.value,\n fallbackValue: v.fallback_value ?? null,\n isSecret: v.is_secret,\n }))\n\n // Warn about circular references\n const cycles = detectCircularReferences(inputs)\n if (cycles.length > 0) {\n spinner.stop()\n for (const cycle of cycles) {\n console.log(chalk.yellow(`Warning: circular reference detected: ${cycle.join(' -> ')} -> ${cycle[0]}`))\n }\n spinner.start('Resolving variable references...')\n }\n\n const resolved = resolveAll(inputs)\n resolvedMap = new Map(resolved.map(r => [r.key, r]))\n }\n\n spinner.text = `Writing ${format} output...`\n\n // Build export variables with resolved/fallback values\n const exportVars: ExportVariable[] = vars.map(v => {\n let value: string\n if (resolvedMap) {\n value = resolvedMap.get(v.key)!.resolvedValue\n } else if (shouldFallback && (!v.value || v.value === '') && v.fallback_value) {\n value = v.fallback_value\n } else {\n value = v.value || ''\n }\n return { key: v.key, value, isSecret: v.is_secret }\n })\n\n let content: string\n if (format === 'dotenv' && (shouldShowSources || shouldResolve)) {\n // Dotenv with inline comments needs special handling\n content = vars\n .map(v => {\n let value: string\n let source: ResolvedVariable['source'] | null = null\n\n if (resolvedMap) {\n const resolved = resolvedMap.get(v.key)!\n value = resolved.resolvedValue\n source = resolved.source\n } else if (shouldFallback && (!v.value || v.value === '') && v.fallback_value) {\n value = v.fallback_value\n source = 'fallback'\n } else {\n value = v.value || ''\n }\n\n const needsQuotes = value.includes(' ') || value.includes('\\n') || value.includes('\"')\n const formattedValue = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value\n let line = `${v.key}=${formattedValue}`\n\n if (shouldShowSources && resolvedMap) {\n const resolved = resolvedMap.get(v.key)!\n if (resolved.references.length > 0 && resolved.source !== 'empty') {\n line += ` # resolved from ${resolved.rawValue ?? v.value ?? ''}`\n } else if (resolved.source === 'fallback') {\n line += ` # fallback value`\n }\n } else if (shouldShowSources && source === 'fallback') {\n line += ` # fallback value`\n }\n\n return line\n })\n .join('\\n')\n } else {\n // Build k8s config if needed\n let k8sConfig: K8sConfig | undefined\n if (format === 'k8s-secret' || format === 'k8s-configmap') {\n const defaultName = format === 'k8s-secret' ? 'app-secrets' : 'app-config'\n k8sConfig = {\n name: sanitizeK8sName(options.k8sName || config?.k8s_name || defaultName),\n namespace: options.k8sNamespace || config?.k8s_namespace || 'default',\n }\n }\n content = formatVariables(exportVars, format, k8sConfig)\n }\n\n writeFileSync(outputFile, content + '\\n')\n\n const secretCount = vars.filter(v => v.is_secret).length\n const plainCount = vars.length - secretCount\n\n spinner.succeed(`Pulled ${variables.length} variables to ${outputFile} (${format})`)\n console.log(chalk.gray(` ${plainCount} plain, ${secretCount} secrets`))\n\n // Fire-and-forget: log CLI pull access\n client.rpc('log_variable_access', {\n p_environment_id: environmentId,\n p_access_type: 'cli_pull',\n p_metadata: { cli_version: '0.1.1' },\n }).then(() => {}, () => { /* ignore tracking failures */ })\n\n } catch (error) {\n spinner.fail('Pull failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { existsSync, readFileSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { z } from 'zod'\nimport { EXPORT_FORMATS } from './formatters.js'\n\nconst ConfigSchema = z.object({\n project_id: z.string().uuid().optional(),\n project_name: z.string().optional(),\n environment: z.string().optional(),\n environment_id: z.string().uuid().optional(),\n organization_id: z.string().uuid().optional(),\n output: z.string().default('.env'),\n api_url: z.string().url().optional(),\n format: z.enum(EXPORT_FORMATS as [string, ...string[]]).optional(),\n k8s_namespace: z.string().optional(),\n k8s_name: z.string().optional(),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\n\nconst CONFIG_FILENAMES = ['envmanager.json', '.envmanagerrc']\n\nfunction findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = startDir\n \n while (currentDir !== dirname(currentDir)) {\n for (const filename of CONFIG_FILENAMES) {\n const configPath = join(currentDir, filename)\n if (existsSync(configPath)) {\n return configPath\n }\n }\n currentDir = dirname(currentDir)\n }\n \n return null\n}\n\nexport function loadConfig(): Config | null {\n const configPath = findConfigFile()\n \n if (!configPath) {\n return null\n }\n \n try {\n const content = readFileSync(configPath, 'utf-8')\n const parsed = JSON.parse(content)\n return ConfigSchema.parse(parsed)\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error('Invalid config file:', error.errors)\n }\n return null\n }\n}\n\nexport function getConfigPath(): string | null {\n return findConfigFile()\n}\n","import * as yaml from 'js-yaml'\n\nexport type ExportFormat = 'dotenv' | 'docker-compose' | 'k8s-secret' | 'k8s-configmap' | 'vercel' | 'railway' | 'render'\n\nexport const EXPORT_FORMATS: ExportFormat[] = [\n 'dotenv', 'docker-compose', 'k8s-secret', 'k8s-configmap', 'vercel', 'railway', 'render'\n]\n\nexport interface ExportVariable {\n key: string\n value: string\n isSecret: boolean\n}\n\nexport interface K8sConfig {\n name: string\n namespace: string\n}\n\n/**\n * Sanitize a name to be valid K8s resource name (DNS subdomain format)\n */\nexport function sanitizeK8sName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/^-+|-+$/g, '')\n .substring(0, 63)\n}\n\nexport function toDotEnv(variables: ExportVariable[]): string {\n return variables\n .map(v => {\n const needsQuotes = /[\\s='\"#\\n\\r]/.test(v.value)\n const value = needsQuotes\n ? `\"${v.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`\n : v.value\n return `${v.key}=${value}`\n })\n .join('\\n')\n}\n\nexport function toDockerCompose(variables: ExportVariable[]): string {\n const envData: Record<string, string> = {}\n for (const v of variables) {\n envData[v.key] = v.value\n }\n\n const snippet = {\n services: {\n app: {\n environment: envData\n }\n }\n }\n\n const yamlOutput = yaml.dump(snippet, { lineWidth: -1, quotingType: '\"' })\n\n return `# Docker Compose environment section\\n# Copy this into your docker-compose.yml and replace 'app' with your service name\\n${yamlOutput}`\n}\n\nexport function toKubernetesSecret(variables: ExportVariable[], config: K8sConfig): string {\n const data: Record<string, string> = {}\n for (const v of variables) {\n data[v.key] = Buffer.from(v.value).toString('base64')\n }\n\n const manifest = {\n apiVersion: 'v1',\n kind: 'Secret',\n metadata: {\n name: config.name,\n namespace: config.namespace,\n },\n type: 'Opaque',\n data\n }\n\n return yaml.dump(manifest, { lineWidth: -1, quotingType: '\"' })\n}\n\nexport function toKubernetesConfigMap(variables: ExportVariable[], config: K8sConfig): string {\n const data: Record<string, string> = {}\n for (const v of variables) {\n data[v.key] = v.value\n }\n\n const manifest = {\n apiVersion: 'v1',\n kind: 'ConfigMap',\n metadata: {\n name: config.name,\n namespace: config.namespace,\n },\n data\n }\n\n return yaml.dump(manifest, { lineWidth: -1, quotingType: '\"' })\n}\n\nexport function toVercelCLI(variables: ExportVariable[]): string {\n if (variables.length === 0) return '# No variables to export'\n\n const header = `# Vercel CLI commands to add environment variables\n# Run these commands in your project directory\n# Docs: https://vercel.com/docs/cli/env\n# Note: You may need to run 'vercel login' first\n\n`\n\n const commands = variables.map(v => {\n if (v.value.includes('\\n')) {\n const escapedValue = v.value.replace(/'/g, \"'\\\\''\")\n return `vercel env add ${v.key} production << 'EOF'\\n${escapedValue}\\nEOF`\n } else {\n const escapedValue = v.value.replace(/'/g, \"'\\\\''\")\n return `echo '${escapedValue}' | vercel env add ${v.key} production`\n }\n }).join('\\n\\n')\n\n return header + commands\n}\n\nexport function toRailwayCLI(variables: ExportVariable[]): string {\n if (variables.length === 0) return '# No variables to export'\n\n const header = `# Railway CLI commands to set environment variables\n# Run these commands in your project directory\n# Docs: https://docs.railway.app/reference/cli-api#variables-set\n# Note: You may need to run 'railway login' first\n\n`\n\n const commands = variables.map(v => {\n const escapedValue = v.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n return `railway variables set ${v.key}=\"${escapedValue}\"`\n }).join('\\n')\n\n return header + commands\n}\n\nexport function toRenderCLI(variables: ExportVariable[]): string {\n if (variables.length === 0) return '# No variables to export'\n\n const header = `# Render CLI commands to set environment variables\n# Run these commands in your project directory\n# Docs: https://render.com/docs/cli\n# Note: You may need to authenticate first\n\n`\n\n const commands = variables.map(v => {\n const escapedValue = v.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n return `render env:set ${v.key}=\"${escapedValue}\"`\n }).join('\\n')\n\n return header + commands\n}\n\nexport function formatVariables(\n variables: ExportVariable[],\n format: ExportFormat,\n k8sConfig?: K8sConfig\n): string {\n switch (format) {\n case 'dotenv':\n return toDotEnv(variables)\n case 'docker-compose':\n return toDockerCompose(variables)\n case 'k8s-secret':\n return toKubernetesSecret(variables, k8sConfig ?? { name: 'app-secrets', namespace: 'default' })\n case 'k8s-configmap':\n return toKubernetesConfigMap(variables, k8sConfig ?? { name: 'app-config', namespace: 'default' })\n case 'vercel':\n return toVercelCLI(variables)\n case 'railway':\n return toRailwayCLI(variables)\n case 'render':\n return toRenderCLI(variables)\n }\n}\n","import { SupabaseClient } from '@supabase/supabase-js'\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/**\n * Strip optional '#' prefix and return the cleaned input.\n */\nfunction cleanProjectInput(input: string): string {\n return input.startsWith('#') ? input.slice(1) : input\n}\n\n/**\n * Resolve a project identifier (UUID, friendly ID, or name) to a UUID.\n * @param input - UUID, \"#N\" friendly ID, numeric friendly ID, or project name\n * @param client - Supabase client\n * @param organizationId - Organization context (required for friendly ID/name lookup)\n */\nexport async function resolveProjectId(\n input: string,\n client: SupabaseClient,\n organizationId: string\n): Promise<string> {\n const cleaned = cleanProjectInput(input)\n\n // If UUID, return directly\n if (UUID_REGEX.test(cleaned)) {\n return cleaned\n }\n\n // If numeric, treat as friendly_id\n if (/^\\d+$/.test(cleaned)) {\n const friendlyId = parseInt(cleaned, 10)\n if (friendlyId < 1) {\n throw new Error('Project ID must be 1 or greater')\n }\n\n const { data, error } = await client\n .from('projects')\n .select('id')\n .eq('organization_id', organizationId)\n .eq('friendly_id', friendlyId)\n .single()\n\n if (error || !data) {\n throw new Error(`Project with ID ${friendlyId} not found in this organization`)\n }\n return data.id\n }\n\n // Otherwise treat as name (case-insensitive)\n const { data, error } = await client\n .from('projects')\n .select('id')\n .eq('organization_id', organizationId)\n .ilike('name', cleaned)\n .single()\n\n if (error || !data) {\n throw new Error(`Project \"${input}\" not found in this organization`)\n }\n return data.id\n}\n\n/**\n * Resolve an environment identifier to a UUID.\n */\nexport async function resolveEnvironmentId(\n input: string,\n client: SupabaseClient,\n projectId: string\n): Promise<string> {\n // If UUID, return directly\n if (UUID_REGEX.test(input)) {\n return input\n }\n\n // If numeric, treat as friendly_id\n if (/^\\d+$/.test(input)) {\n const friendlyId = parseInt(input, 10)\n if (friendlyId < 1) {\n throw new Error('Environment ID must be 1 or greater')\n }\n\n const { data, error } = await client\n .from('environments')\n .select('id')\n .eq('project_id', projectId)\n .eq('friendly_id', friendlyId)\n .single()\n\n if (error || !data) {\n throw new Error(`Environment with ID ${friendlyId} not found in this project`)\n }\n return data.id\n }\n\n // Otherwise treat as name\n const { data, error } = await client\n .from('environments')\n .select('id')\n .eq('project_id', projectId)\n .ilike('name', input)\n .single()\n\n if (error || !data) {\n throw new Error(`Environment \"${input}\" not found in this project`)\n }\n return data.id\n}\n\n/**\n * Resolve organization context. Auto-selects for single-org users.\n * When multiple orgs exist and a project hint is provided, tries to\n * auto-detect the org by searching for the project across all orgs.\n * @param input - Organization name (optional for single-org users)\n * @param client - Supabase client\n * @param projectHint - Optional project identifier to auto-detect org from\n */\nexport async function resolveOrganizationId(\n input: string | undefined,\n client: SupabaseClient,\n projectHint?: string\n): Promise<string> {\n // Get current user ID to scope query (platform admins bypass RLS otherwise)\n const { data: { user } } = await client.auth.getUser()\n if (!user) throw new Error('Not authenticated')\n\n // Fetch only this user's organizations\n const { data: memberships, error: memberError } = await client\n .from('organization_members')\n .select('organization_id, organizations(id, name)')\n .eq('user_id', user.id)\n\n if (memberError || !memberships || memberships.length === 0) {\n throw new Error('No organizations found. Create one at envmanager.dev')\n }\n\n // Single org: auto-select if no input\n if (memberships.length === 1 && !input) {\n return memberships[0].organization_id\n }\n\n // Explicit --org provided: find by name\n if (input) {\n const match = memberships.find(m => {\n const org = (m.organizations as unknown) as { name: string } | null\n return org?.name?.toLowerCase() === input.toLowerCase()\n })\n\n if (!match) {\n throw new Error(`Organization \"${input}\" not found or you don't have access`)\n }\n\n return match.organization_id\n }\n\n // Multiple orgs, no --org: try to auto-detect from project\n if (projectHint) {\n const orgId = await detectOrgFromProject(projectHint, client, memberships)\n if (orgId) return orgId\n }\n\n // Fallback: list orgs for user\n const orgList = memberships\n .map(m => {\n const org = (m.organizations as unknown) as { name: string } | null\n return org?.name || 'Unknown'\n })\n .join(', ')\n throw new Error(`Multiple organizations found. Use --org to specify: ${orgList}`)\n}\n\n/**\n * Try to find which org a project belongs to by searching across all user's orgs.\n * Returns the org ID if found in exactly one org, null otherwise.\n */\nasync function detectOrgFromProject(\n projectInput: string,\n client: SupabaseClient,\n memberships: { organization_id: string }[]\n): Promise<string | null> {\n const cleaned = cleanProjectInput(projectInput)\n const orgIds = memberships.map(m => m.organization_id)\n\n // UUID: direct lookup\n if (UUID_REGEX.test(cleaned)) {\n const { data } = await client\n .from('projects')\n .select('organization_id')\n .eq('id', cleaned)\n .in('organization_id', orgIds)\n .single()\n return data?.organization_id ?? null\n }\n\n // Friendly ID (numeric)\n if (/^\\d+$/.test(cleaned)) {\n const friendlyId = parseInt(cleaned, 10)\n const { data } = await client\n .from('projects')\n .select('organization_id')\n .in('organization_id', orgIds)\n .eq('friendly_id', friendlyId)\n\n if (data && data.length === 1) return data[0].organization_id\n return null // ambiguous or not found\n }\n\n // Name (case-insensitive)\n const { data } = await client\n .from('projects')\n .select('organization_id')\n .in('organization_id', orgIds)\n .ilike('name', cleaned)\n\n if (data && data.length === 1) return data[0].organization_id\n return null // ambiguous or not found\n}\n","// SYNC: also update utils/variable-references.ts\n\nexport const REFERENCE_PATTERN = /\\$\\{([A-Z_][A-Z0-9_]*)\\}/g\nexport const MAX_DEPTH = 10\n\nexport interface VariableInput {\n key: string\n value: string | null\n fallbackValue?: string | null\n isSecret?: boolean\n}\n\nexport interface ResolvedVariable {\n key: string\n rawValue: string | null\n resolvedValue: string\n source: 'explicit' | 'fallback' | 'empty'\n references: string[]\n referencedBy: string[]\n unresolvedRefs: string[]\n hasCircularRef: boolean\n}\n\n/**\n * Extract ${VAR} tokens from a value string.\n * Escaped \\${ sequences are ignored.\n */\nexport function parseReferences(value: string): string[] {\n // Remove escaped sequences before parsing\n const cleaned = value.replace(/\\\\\\$\\{/g, '___ESCAPED___')\n const refs: string[] = []\n const pattern = new RegExp(REFERENCE_PATTERN.source, 'g')\n let match: RegExpExecArray | null\n while ((match = pattern.exec(cleaned)) !== null) {\n refs.push(match[1])\n }\n return refs\n}\n\n/**\n * Detect circular reference chains in a set of variables.\n * Returns arrays of keys forming each cycle.\n */\nexport function detectCircularReferences(variables: VariableInput[]): string[][] {\n const graph = new Map<string, string[]>()\n for (const v of variables) {\n const base = v.value || v.fallbackValue || ''\n graph.set(v.key, parseReferences(base))\n }\n\n const cycles: string[][] = []\n const visited = new Set<string>()\n const inStack = new Set<string>()\n\n function dfs(key: string, stack: string[]) {\n if (inStack.has(key)) {\n // Found cycle — extract the cycle portion\n const cycleStart = stack.indexOf(key)\n cycles.push(stack.slice(cycleStart))\n return\n }\n if (visited.has(key)) return\n\n visited.add(key)\n inStack.add(key)\n stack.push(key)\n\n const deps = graph.get(key) || []\n for (const dep of deps) {\n if (graph.has(dep)) {\n dfs(dep, stack)\n }\n }\n\n stack.pop()\n inStack.delete(key)\n }\n\n for (const key of graph.keys()) {\n dfs(key, [])\n }\n\n return cycles\n}\n\n/**\n * Resolve a single variable's value against a map of all variables.\n */\nexport function resolveValue(\n key: string,\n variables: Map<string, VariableInput>,\n depth: number = 0,\n _stack: Set<string> = new Set()\n): ResolvedVariable {\n const variable = variables.get(key)\n\n if (!variable) {\n return {\n key,\n rawValue: null,\n resolvedValue: '',\n source: 'empty',\n references: [],\n referencedBy: [],\n unresolvedRefs: [key],\n hasCircularRef: false,\n }\n }\n\n // Secret variables are NOT resolved — preserve raw value\n if (variable.isSecret) {\n const base = variable.value ?? variable.fallbackValue ?? ''\n const source: ResolvedVariable['source'] = variable.value ? 'explicit' : variable.fallbackValue ? 'fallback' : 'empty'\n return {\n key,\n rawValue: variable.value,\n resolvedValue: base,\n source,\n references: parseReferences(base),\n referencedBy: [],\n unresolvedRefs: [],\n hasCircularRef: false,\n }\n }\n\n // Determine base value and source\n let base: string\n let source: ResolvedVariable['source']\n if (variable.value !== null && variable.value !== undefined && variable.value !== '') {\n base = variable.value\n source = 'explicit'\n } else if (variable.fallbackValue !== null && variable.fallbackValue !== undefined && variable.fallbackValue !== '') {\n base = variable.fallbackValue\n source = 'fallback'\n } else {\n return {\n key,\n rawValue: variable.value,\n resolvedValue: '',\n source: 'empty',\n references: [],\n referencedBy: [],\n unresolvedRefs: [],\n hasCircularRef: false,\n }\n }\n\n const references = parseReferences(base)\n const unresolvedRefs: string[] = []\n let hasCircularRef = false\n\n // Resolve references in the base value\n // First handle escaped sequences\n let resolved = base.replace(/\\\\\\$\\{/g, '___ESCAPED___')\n\n const pattern = new RegExp(REFERENCE_PATTERN.source, 'g')\n resolved = resolved.replace(pattern, (fullMatch, refKey: string) => {\n // Circular reference check\n if (_stack.has(refKey)) {\n hasCircularRef = true\n unresolvedRefs.push(refKey)\n return fullMatch\n }\n\n // Max depth check\n if (depth >= MAX_DEPTH) {\n unresolvedRefs.push(refKey)\n return fullMatch\n }\n\n // Variable doesn't exist\n if (!variables.has(refKey)) {\n unresolvedRefs.push(refKey)\n return fullMatch\n }\n\n // Recurse\n const newStack = new Set(_stack)\n newStack.add(key)\n const inner = resolveValue(refKey, variables, depth + 1, newStack)\n\n if (inner.hasCircularRef) {\n hasCircularRef = true\n }\n unresolvedRefs.push(...inner.unresolvedRefs)\n\n return inner.resolvedValue\n })\n\n // Restore escaped sequences\n resolved = resolved.replace(/___ESCAPED___/g, '${')\n\n return {\n key,\n rawValue: variable.value,\n resolvedValue: resolved,\n source,\n references,\n referencedBy: [],\n unresolvedRefs: [...new Set(unresolvedRefs)],\n hasCircularRef,\n }\n}\n\n/**\n * Resolve all variables in an environment.\n * Populates referencedBy for each variable.\n */\nexport function resolveAll(variables: VariableInput[]): ResolvedVariable[] {\n const varMap = new Map<string, VariableInput>()\n for (const v of variables) {\n varMap.set(v.key, v)\n }\n\n const results = variables.map(v => resolveValue(v.key, varMap))\n\n // Populate referencedBy\n const referencedByMap = new Map<string, string[]>()\n for (const v of variables) {\n referencedByMap.set(v.key, [])\n }\n\n for (const result of results) {\n for (const ref of result.references) {\n const existing = referencedByMap.get(ref)\n if (existing) {\n existing.push(result.key)\n }\n }\n }\n\n for (const result of results) {\n result.referencedBy = referencedByMap.get(result.key) || []\n }\n\n return results\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { readFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { parseEnvFileAsArray } from '../lib/parser.js'\nimport { validateVariableName, type NamingConventionConfig } from '../lib/naming-conventions.js'\n\nexport const pushCommand = new Command('push')\n .description('Push local .env file to EnvManager')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: from config or \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('-i, --input <file>', 'Input file path (default: .env)')\n .option('--secrets <keys>', 'Comma-separated list of keys to mark as secrets')\n .option('--all-secrets', 'Mark all variables as secrets')\n .option('--dry-run', 'Show what would be pushed without making changes')\n .action(async (options) => {\n const spinner = ora('Reading .env file...').start()\n \n try {\n const config = loadConfig()\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const inputFile = resolve(options.input || '.env')\n const secretKeys = options.secrets ? options.secrets.split(',').map((k: string) => k.trim()) : []\n const allSecrets = options.allSecrets === true\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name> or create envmanager.json'))\n process.exit(1)\n }\n\n if (!existsSync(inputFile)) {\n spinner.fail(`File not found: ${inputFile}`)\n process.exit(1)\n }\n\n const content = readFileSync(inputFile, 'utf-8')\n const vars = parseEnvFileAsArray(content)\n\n if (vars.length === 0) {\n spinner.warn('No variables found in file')\n process.exit(0)\n }\n\n spinner.text = `Found ${vars.length} variables`\n\n if (options.dryRun) {\n spinner.succeed('Dry run - changes NOT applied')\n console.log(chalk.gray('\\nVariables to push:'))\n vars.forEach(v => {\n const isSecret = allSecrets || secretKeys.includes(v.key)\n const secretBadge = isSecret ? chalk.yellow(' [secret]') : ''\n console.log(` ${v.key}=${v.value.substring(0, 20)}${v.value.length > 20 ? '...' : ''}${secretBadge}`)\n })\n process.exit(0)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n // Resolve project (accepts UUID, friendly ID, or name)\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name, project_id')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found in project`)\n process.exit(1)\n }\n\n\n // Validate naming conventions\n spinner.text = 'Checking naming conventions...'\n const { data: namingRules } = await client\n .from('naming_conventions')\n .select('*')\n .eq('organization_id', organizationId)\n .eq('project_id', projectId)\n .maybeSingle()\n\n // Fall back to org-level rules if no project override\n let namingConfig: NamingConventionConfig | null = null\n if (namingRules) {\n namingConfig = {\n rules: namingRules.rules as any,\n enforcement_mode: namingRules.enforcement_mode as 'warn' | 'block',\n template_name: namingRules.template_name || undefined\n }\n } else {\n const { data: orgRules } = await client\n .from('naming_conventions')\n .select('*')\n .eq('organization_id', organizationId)\n .is('project_id', null)\n .maybeSingle()\n\n if (orgRules) {\n namingConfig = {\n rules: orgRules.rules as any,\n enforcement_mode: orgRules.enforcement_mode as 'warn' | 'block',\n template_name: orgRules.template_name || undefined\n }\n }\n }\n\n if (namingConfig) {\n const issues: Array<{ key: string; message: string; suggestion?: string }> = []\n\n for (const v of vars) {\n const result = validateVariableName(v.key, namingConfig)\n const allIssues = [...result.errors, ...result.warnings]\n for (const issue of allIssues) {\n issues.push({ key: v.key, message: issue.message, suggestion: issue.suggestion })\n }\n }\n\n if (issues.length > 0) {\n const isBlock = namingConfig.enforcement_mode === 'block'\n\n console.log('')\n console.log(chalk[isBlock ? 'red' : 'yellow'](` Naming convention ${isBlock ? 'errors' : 'warnings'}:`))\n for (const issue of issues) {\n const suggestion = issue.suggestion ? chalk.gray(` → ${issue.suggestion}`) : ''\n console.log(chalk[isBlock ? 'red' : 'yellow'](` ${issue.key}: ${issue.message}${suggestion}`))\n }\n console.log('')\n\n if (isBlock) {\n spinner.fail('Push blocked by naming convention errors')\n process.exit(1)\n }\n }\n }\n\n spinner.text = 'Pushing variables...'\n\n const markAsSecrets = allSecrets || secretKeys.length > 0\n const variablesData = vars.map(v => ({\n key: v.key,\n value: v.value,\n }))\n\n // Delete existing variables first, then bulk insert (upsert pattern)\n // Get existing keys to determine insert vs update counts\n const { data: existingVars } = await client\n .from('variables')\n .select('key')\n .eq('environment_id', environment.id)\n\n const existingKeys = new Set((existingVars || []).map((v: { key: string }) => v.key))\n const keysToUpdate = variablesData.filter(v => existingKeys.has(v.key))\n const keysToInsert = variablesData.filter(v => !existingKeys.has(v.key))\n\n // Delete variables that will be overwritten\n if (keysToUpdate.length > 0) {\n const { error: deleteError } = await client\n .from('variables')\n .delete()\n .eq('environment_id', environment.id)\n .in('key', keysToUpdate.map(v => v.key))\n\n if (deleteError) {\n spinner.fail('Failed to update existing variables')\n console.error(chalk.red(deleteError.message))\n process.exit(1)\n }\n }\n\n const { error: pushError } = await client.rpc('bulk_insert_variables', {\n variables_data: variablesData,\n environment_id_param: environment.id,\n organization_id_param: organizationId,\n import_as_secrets: markAsSecrets,\n })\n\n if (pushError) {\n spinner.fail('Push failed')\n console.error(chalk.red(pushError.message))\n process.exit(1)\n }\n\n spinner.succeed(`Pushed ${vars.length} variables to ${envName}`)\n if (keysToUpdate.length > 0) {\n console.log(chalk.gray(` ${keysToInsert.length} inserted, ${keysToUpdate.length} updated`))\n }\n if (markAsSecrets) {\n console.log(chalk.gray(` All marked as secrets`))\n }\n\n } catch (error) {\n spinner.fail('Push failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { parse as parseDotenv } from 'dotenv'\nimport chalk from 'chalk'\n\nexport interface ParsedEnvVar {\n key: string\n value: string\n}\n\n/**\n * Parse a .env file string using dotenv. Returns a Map<string, string>.\n * Warns when duplicate keys are detected (dotenv uses last-wins).\n */\nexport function parseEnvFile(content: string): Map<string, string> {\n const parsed = parseDotenv(content)\n\n // Detect duplicates by scanning raw lines\n const seen = new Set<string>()\n const duplicates: string[] = []\n for (const line of content.split('\\n')) {\n const match = line.match(/^\\s*([^#=\\s][^=]*?)\\s*=/)\n if (match) {\n const key = match[1]\n if (seen.has(key)) {\n duplicates.push(key)\n }\n seen.add(key)\n }\n }\n\n if (duplicates.length > 0) {\n console.warn(\n chalk.yellow(`Warning: Duplicate keys detected (last value wins): ${duplicates.join(', ')}`)\n )\n }\n\n return new Map(Object.entries(parsed))\n}\n\n/**\n * Parse a .env file string and return as an array of {key, value} pairs.\n * Convenience wrapper for commands that need array format (e.g., push).\n */\nexport function parseEnvFileAsArray(content: string): ParsedEnvVar[] {\n const map = parseEnvFile(content)\n return Array.from(map.entries()).map(([key, value]) => ({ key, value }))\n}\n","// SYNC: also update utils/naming-conventions.ts\n\nexport interface NamingRule {\n case?: 'SCREAMING_SNAKE_CASE' | 'snake_case' | 'PascalCase' | 'camelCase'\n patterns?: Array<{ match: string; description: string; example?: string }>\n forbidden?: Array<{ match: string; reason: string }>\n}\n\nexport interface NamingConventionConfig {\n rules: NamingRule\n enforcement_mode: 'warn' | 'block'\n template_name?: string\n}\n\nexport interface NamingValidationResult {\n valid: boolean\n errors: ValidationIssue[]\n warnings: ValidationIssue[]\n suggestions: string[]\n}\n\nexport interface ValidationIssue {\n type: 'case' | 'pattern' | 'forbidden'\n message: string\n suggestion?: string\n}\n\n// --- Case detection helpers ---\n\nfunction isScreamingSnakeCase(name: string): boolean {\n return /^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$/.test(name)\n}\n\nfunction isSnakeCase(name: string): boolean {\n return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name)\n}\n\nfunction isPascalCase(name: string): boolean {\n return /^[A-Z][a-zA-Z0-9]*$/.test(name)\n}\n\nfunction isCamelCase(name: string): boolean {\n return /^[a-z][a-zA-Z0-9]*$/.test(name)\n}\n\n// --- Case conversion ---\n\nfunction splitIntoWords(name: string): string[] {\n // Handle SCREAMING_SNAKE_CASE and snake_case\n if (name.includes('_')) {\n return name.split('_').filter(Boolean)\n }\n // Handle PascalCase and camelCase\n return name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').split('_').filter(Boolean)\n}\n\nexport function convertToCase(name: string, targetCase: string): string {\n const words = splitIntoWords(name)\n if (words.length === 0) return name\n\n switch (targetCase) {\n case 'SCREAMING_SNAKE_CASE':\n return words.map(w => w.toUpperCase()).join('_')\n case 'snake_case':\n return words.map(w => w.toLowerCase()).join('_')\n case 'PascalCase':\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('')\n case 'camelCase':\n return words.map((w, i) => {\n if (i === 0) return w.toLowerCase()\n return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()\n }).join('')\n default:\n return name\n }\n}\n\n// --- Validation ---\n\nexport function validateVariableName(name: string, config: NamingConventionConfig): NamingValidationResult {\n const issues: ValidationIssue[] = []\n\n // Case check\n if (config.rules.case) {\n let caseValid = false\n switch (config.rules.case) {\n case 'SCREAMING_SNAKE_CASE': caseValid = isScreamingSnakeCase(name); break\n case 'snake_case': caseValid = isSnakeCase(name); break\n case 'PascalCase': caseValid = isPascalCase(name); break\n case 'camelCase': caseValid = isCamelCase(name); break\n }\n if (!caseValid) {\n const suggestion = convertToCase(name, config.rules.case)\n issues.push({\n type: 'case',\n message: `Must be ${config.rules.case}`,\n suggestion\n })\n }\n }\n\n // Pattern checks\n if (config.rules.patterns) {\n for (const pattern of config.rules.patterns) {\n try {\n const regex = new RegExp(pattern.match)\n if (!regex.test(name)) {\n issues.push({\n type: 'pattern',\n message: pattern.description,\n suggestion: pattern.example\n })\n }\n } catch {\n // Skip invalid regex patterns\n }\n }\n }\n\n // Forbidden checks\n if (config.rules.forbidden) {\n for (const rule of config.rules.forbidden) {\n try {\n const regex = new RegExp(rule.match, 'i')\n if (regex.test(name)) {\n issues.push({\n type: 'forbidden',\n message: rule.reason\n })\n }\n } catch {\n // Skip invalid regex patterns\n }\n }\n }\n\n const isBlock = config.enforcement_mode === 'block'\n const suggestions = issues\n .map(i => i.suggestion)\n .filter((s): s is string => !!s)\n\n return {\n valid: isBlock ? issues.length === 0 : true,\n errors: isBlock ? issues : [],\n warnings: isBlock ? [] : issues,\n suggestions: [...new Set(suggestions)]\n }\n}\n\n// --- Templates ---\n\nexport const TEMPLATES: Record<string, NamingConventionConfig> = {\n standard: {\n rules: {\n case: 'SCREAMING_SNAKE_CASE',\n forbidden: [\n { match: '^(password|secret|key|token)$', reason: 'Too generic — use a descriptive name like DB_PASSWORD or API_KEY' }\n ]\n },\n enforcement_mode: 'warn',\n template_name: 'standard'\n },\n nextjs: {\n rules: {\n case: 'SCREAMING_SNAKE_CASE',\n patterns: [\n { match: '^NEXT_PUBLIC_', description: 'Client-side variables must start with NEXT_PUBLIC_', example: 'NEXT_PUBLIC_API_URL' }\n ]\n },\n enforcement_mode: 'warn',\n template_name: 'nextjs'\n },\n vite: {\n rules: {\n case: 'SCREAMING_SNAKE_CASE',\n patterns: [\n { match: '^VITE_', description: 'Client-side variables must start with VITE_', example: 'VITE_API_URL' }\n ]\n },\n enforcement_mode: 'warn',\n template_name: 'vite'\n },\n strict: {\n rules: {\n case: 'SCREAMING_SNAKE_CASE',\n forbidden: [\n { match: '^(password|secret|key|token)$', reason: 'Too generic — use a descriptive name' },\n { match: '[a-z]', reason: 'Lowercase characters not allowed in strict mode' },\n { match: '^[0-9]', reason: 'Must not start with a number' },\n { match: '__', reason: 'Double underscores not allowed' }\n ]\n },\n enforcement_mode: 'block',\n template_name: 'strict'\n }\n}\n\nexport function getTemplate(templateName: string): NamingConventionConfig | null {\n return TEMPLATES[templateName] || null\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { readFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { Variable } from '../lib/types.js'\nimport { parseEnvFile } from '../lib/parser.js'\n\nexport const diffCommand = new Command('diff')\n .description('Show differences between local .env and EnvManager')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: from config or \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('-i, --input <file>', 'Input file path (default: .env)')\n .option('--keys-only', 'Only show key names, not values')\n .action(async (options) => {\n const spinner = ora('Comparing...').start()\n \n try {\n const config = loadConfig()\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const inputFile = resolve(options.input || '.env')\n const keysOnly = options.keysOnly === true\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name> or create envmanager.json'))\n process.exit(1)\n }\n\n let localVars = new Map<string, string>()\n \n if (existsSync(inputFile)) {\n const content = readFileSync(inputFile, 'utf-8')\n localVars = parseEnvFile(content)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n // Resolve project (accepts UUID, friendly ID, or name)\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching remote variables...'\n const { data: remoteVarsData, error: varError } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environment.id,\n p_sync_secrets: true,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (varError) {\n spinner.fail('Failed to fetch remote variables')\n console.error(chalk.red(varError.message))\n process.exit(1)\n }\n\n const remoteVars = new Map<string, Variable>()\n for (const v of (remoteVarsData as Variable[]) || []) {\n remoteVars.set(v.key, v)\n }\n\n spinner.stop()\n\n const allKeys = new Set([...localVars.keys(), ...remoteVars.keys()])\n const added: string[] = []\n const removed: string[] = []\n const modified: string[] = []\n const unchanged: string[] = []\n\n for (const key of allKeys) {\n const localVal = localVars.get(key)\n const remoteVar = remoteVars.get(key)\n\n if (localVal !== undefined && !remoteVar) {\n added.push(key)\n } else if (localVal === undefined && remoteVar) {\n removed.push(key)\n } else if (localVal !== remoteVar?.value) {\n modified.push(key)\n } else {\n unchanged.push(key)\n }\n }\n\n if (added.length === 0 && removed.length === 0 && modified.length === 0) {\n console.log(chalk.green('\\nNo differences found.'))\n console.log(chalk.gray(`${unchanged.length} variables in sync.`))\n process.exit(0)\n }\n\n console.log('')\n\n if (added.length > 0) {\n console.log(chalk.green(`+ ${added.length} to add (local only):`))\n added.sort().forEach(key => {\n if (keysOnly) {\n console.log(chalk.green(` + ${key}`))\n } else {\n const val = localVars.get(key) || ''\n const display = val.length > 30 ? val.substring(0, 30) + '...' : val\n console.log(chalk.green(` + ${key}=${display}`))\n }\n })\n console.log('')\n }\n\n if (removed.length > 0) {\n console.log(chalk.red(`- ${removed.length} to remove (remote only):`))\n removed.sort().forEach(key => {\n const remoteVar = remoteVars.get(key)\n const secretBadge = remoteVar?.is_secret ? chalk.yellow(' [secret]') : ''\n console.log(chalk.red(` - ${key}${secretBadge}`))\n })\n console.log('')\n }\n\n if (modified.length > 0) {\n console.log(chalk.yellow(`~ ${modified.length} modified:`))\n modified.sort().forEach(key => {\n const remoteVar = remoteVars.get(key)\n const secretBadge = remoteVar?.is_secret ? chalk.yellow(' [secret]') : ''\n console.log(chalk.yellow(` ~ ${key}${secretBadge}`))\n })\n console.log('')\n }\n\n console.log(chalk.gray(`${unchanged.length} unchanged`))\n\n } catch (error) {\n spinner.fail('Diff failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\n\nexport const listCommand = new Command('list')\n .description('List projects, environments, or variables')\n .argument('[resource]', 'Resource to list: projects, environments, variables', 'projects')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-p, --project <name-or-id>', 'Project name or ID (for environments/variables)')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-v, --verbose', 'Show IDs')\n .action(async (resource, options) => {\n const spinner = ora('Connecting...').start()\n \n try {\n const config = loadConfig()\n const client = await createClient()\n\n switch (resource) {\n case 'projects':\n case 'project': {\n spinner.text = 'Fetching projects...'\n \n const { data: { user: currentUser } } = await client.auth.getUser()\n if (!currentUser) throw new Error('Not authenticated')\n\n const { data: memberships, error: memberError } = await client\n .from('organization_members')\n .select('organization_id')\n .eq('user_id', currentUser.id)\n\n if (memberError) throw new Error(memberError.message)\n \n const orgIds = memberships?.map(m => m.organization_id) || []\n \n if (orgIds.length === 0) {\n spinner.warn('No organizations found')\n process.exit(0)\n }\n\n const { data: projects, error: projError } = await client\n .from('projects')\n .select('id, name, friendly_id, organization_id, organizations(name)')\n .in('organization_id', orgIds)\n .order('name')\n \n if (projError) throw new Error(projError.message)\n \n if (!projects || projects.length === 0) {\n spinner.warn('No projects found')\n process.exit(0)\n }\n\n spinner.succeed(`Found ${projects.length} projects`)\n console.log('')\n \n projects.forEach(p => {\n const org = p.organizations as { name: string } | { name: string }[] | null\n const orgName = Array.isArray(org) ? org[0]?.name : org?.name || 'Unknown'\n const friendlyId = p.friendly_id ? `#${p.friendly_id}` : ''\n if (options.verbose) {\n console.log(` ${chalk.green(friendlyId.padEnd(4))} ${chalk.cyan(p.id)} ${p.name} ${chalk.gray(`(${orgName})`)}`)\n } else {\n console.log(` ${chalk.green(friendlyId.padEnd(4))} ${p.name} ${chalk.gray(`(${orgName})`)}`)\n }\n })\n \n if (!options.verbose && projects.length > 0) {\n console.log(chalk.gray('\\n Use -v to show UUIDs'))\n }\n break\n }\n\n case 'environments':\n case 'envs':\n case 'env': {\n const projectInput = options.project || config?.project_id\n \n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name>'))\n process.exit(1)\n }\n\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n let projectId: string\n try {\n spinner.text = 'Resolving project...'\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environments...'\n \n const { data: environments, error: envError } = await client\n .from('environments')\n .select('id, name, friendly_id, created_at')\n .eq('project_id', projectId)\n .order('name')\n \n if (envError) throw new Error(envError.message)\n \n if (!environments || environments.length === 0) {\n spinner.warn('No environments found')\n process.exit(0)\n }\n\n spinner.succeed(`Found ${environments.length} environments`)\n console.log('')\n \n environments.forEach(e => {\n const friendlyId = e.friendly_id ? `#${e.friendly_id}` : ''\n if (options.verbose) {\n console.log(` ${chalk.green(friendlyId.padEnd(4))} ${chalk.cyan(e.id)} ${e.name}`)\n } else {\n console.log(` ${chalk.green(friendlyId.padEnd(4))} ${e.name}`)\n }\n })\n break\n }\n\n case 'variables':\n case 'vars':\n case 'var': {\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n \n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name>'))\n process.exit(1)\n }\n\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n let projectId: string\n try {\n spinner.text = 'Resolving project...'\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n \n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n \n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching variables...'\n \n const { data: variables, error: varError } = await client\n .from('variables')\n .select('id, key, is_secret, created_at')\n .eq('environment_id', environment.id)\n .order('key')\n \n if (varError) throw new Error(varError.message)\n \n if (!variables || variables.length === 0) {\n spinner.warn(`No variables in ${envName}`)\n process.exit(0)\n }\n\n const secretCount = variables.filter(v => v.is_secret).length\n spinner.succeed(`Found ${variables.length} variables (${secretCount} secrets)`)\n console.log('')\n \n variables.forEach(v => {\n const badge = v.is_secret ? chalk.yellow(' [secret]') : ''\n console.log(` ${v.key}${badge}`)\n })\n break\n }\n\n default:\n spinner.fail(`Unknown resource: ${resource}`)\n console.log(chalk.gray('\\nAvailable: projects, environments, variables'))\n process.exit(1)\n }\n\n } catch (error) {\n spinner.fail('Failed to list')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { loadConfig, getConfigPath } from '../lib/config.js'\n\nexport const configCommand = new Command('config')\n .description('Manage project configuration')\n\nconfigCommand\n .command('show')\n .description('Show current configuration')\n .action(() => {\n const configPath = getConfigPath()\n const config = loadConfig()\n \n if (!configPath || !config) {\n console.log(chalk.yellow('No configuration file found'))\n console.log('Run `envmanager init` to create one')\n return\n }\n \n console.log(chalk.green(`Config file: ${configPath}`))\n console.log(JSON.stringify(config, null, 2))\n })\n\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { writeFileSync, existsSync, readFileSync } from 'fs'\nimport { resolve } from 'path'\nimport { parse as parseDotenv } from 'dotenv'\nimport { createClient, refreshClientAuth } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport {\n subscribeToVariableChanges,\n fetchAllVariables,\n type VariableChangeEvent\n} from '../lib/realtime.js'\nimport { EnvFileWatcher, formatEnvFile } from '../lib/watcher.js'\nimport { mergeWithRemote } from '../lib/conflict.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { Variable } from '../lib/types.js'\n\nexport const devCommand = new Command('dev')\n .description('Start real-time sync daemon - watches for remote variable changes')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: from config or \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('--output <file>', 'Output file path (default: .env)')\n .option('--no-watch', 'Disable local file watching')\n .option('--strategy <type>', 'Merge strategy: remote_wins, local_wins, merge_new (default: remote_wins)', 'remote_wins')\n .action(async (options) => {\n const spinner = ora('Starting dev mode...').start()\n \n try {\n const config = loadConfig()\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const outputFile = resolve(options.output || '.env')\n const watchLocal = options.watch !== false\n const strategy = options.strategy as 'remote_wins' | 'local_wins' | 'merge_new'\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name> or create envmanager.json'))\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n // Resolve project (accepts UUID, friendly ID, or name)\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name, project_id')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found in project`)\n process.exit(1)\n }\n\n const environmentId = environment.id\n\n spinner.text = 'Performing initial sync...'\n const remoteVariables = await fetchAllVariables(environmentId, true)\n \n let localVariables = new Map<string, string>()\n if (existsSync(outputFile)) {\n const content = readFileSync(outputFile, 'utf-8')\n localVariables = new Map(Object.entries(parseDotenv(content)))\n }\n\n const merged = mergeWithRemote(\n localVariables,\n remoteVariables,\n strategy\n )\n \n writeFileSync(outputFile, formatEnvFile(merged))\n \n spinner.text = 'Connecting to realtime...'\n \n let fileWatcher: EnvFileWatcher | null = null\n let isPaused = false\n let lastRemoteKeys: string | null = null // serialized key list for change detection\n\n // Sync remote state to local .env file\n async function syncRemoteToLocal(silent = false): Promise<boolean> {\n const updatedVariables = await fetchAllVariables(environmentId, true)\n const currentLocal = new Map<string, string>()\n if (existsSync(outputFile)) {\n const content = readFileSync(outputFile, 'utf-8')\n Object.entries(parseDotenv(content)).forEach(([k, v]) => {\n currentLocal.set(k, v)\n })\n }\n\n const newMerged = mergeWithRemote(currentLocal, updatedVariables, strategy)\n\n // Check if anything actually changed\n const remoteKeySig = [...newMerged.entries()].sort().map(([k, v]) => `${k}=${v}`).join('\\n')\n if (remoteKeySig === lastRemoteKeys) return false\n lastRemoteKeys = remoteKeySig\n\n if (!silent) {\n // Detect what changed for logging\n const timestamp = new Date().toLocaleTimeString()\n for (const key of currentLocal.keys()) {\n if (!newMerged.has(key)) {\n console.log(chalk.red(`[${timestamp}] - ${key}`))\n }\n }\n for (const [key] of newMerged) {\n if (!currentLocal.has(key)) {\n console.log(chalk.green(`[${timestamp}] + ${key}`))\n }\n }\n }\n\n writeFileSync(outputFile, formatEnvFile(newMerged))\n return true\n }\n\n // Set initial signature\n const initialKeys = [...merged.entries()].sort().map(([k, v]) => `${k}=${v}`).join('\\n')\n lastRemoteKeys = initialKeys\n\n const subscription = await subscribeToVariableChanges(\n environmentId,\n async (event: VariableChangeEvent) => {\n if (isPaused) return\n\n const timestamp = new Date().toLocaleTimeString()\n\n switch (event.action) {\n case 'INSERT':\n console.log(chalk.green(`[${timestamp}] + ${event.key}`))\n break\n case 'UPDATE':\n if (event.old_key && event.old_key !== event.key) {\n console.log(chalk.yellow(`[${timestamp}] ~ ${event.old_key} -> ${event.key}`))\n } else {\n console.log(chalk.yellow(`[${timestamp}] ~ ${event.key}`))\n }\n break\n case 'DELETE':\n console.log(chalk.red(`[${timestamp}] - ${event.key}`))\n break\n }\n\n isPaused = true\n try {\n await syncRemoteToLocal(true) // silent — we already logged the event\n } finally {\n isPaused = false\n }\n },\n (status, message) => {\n switch (status) {\n case 'connected':\n console.log(chalk.green(' Realtime connected'))\n break\n case 'disconnected':\n console.log(chalk.yellow('\\nDisconnected from realtime'))\n break\n case 'reconnecting':\n console.log(chalk.yellow(`\\nReconnecting... ${message || ''}`))\n break\n case 'error':\n console.log(chalk.red(`\\nRealtime error: ${message || ''}`))\n break\n }\n }\n )\n\n if (watchLocal) {\n fileWatcher = new EnvFileWatcher(outputFile)\n fileWatcher.on('change', () => {\n if (!isPaused) {\n console.log(chalk.gray(`[${new Date().toLocaleTimeString()}] Local file changed`))\n }\n })\n fileWatcher.on('error', (error) => {\n console.error(chalk.red(`File watcher error: ${error.message}`))\n })\n fileWatcher.start()\n }\n\n spinner.succeed('Dev mode started')\n console.log('')\n console.log(chalk.cyan(' Project:'), projectId)\n console.log(chalk.cyan(' Environment:'), envName)\n console.log(chalk.cyan(' Output:'), outputFile)\n console.log(chalk.cyan(' Strategy:'), strategy)\n console.log(chalk.cyan(' Watching:'), watchLocal ? 'local + remote' : 'remote only')\n console.log('')\n console.log(chalk.gray('Watching for changes. Press Ctrl+C to stop.'))\n console.log('')\n\n let isCleaningUp = false\n\n // Periodic poll to catch missed realtime events (e.g. DELETEs)\n const POLL_INTERVAL_MS = 5000\n const pollInterval = setInterval(async () => {\n if (isPaused) return\n isPaused = true\n try {\n await syncRemoteToLocal()\n } catch {\n // Poll failed, will retry next interval\n } finally {\n isPaused = false\n }\n }, POLL_INTERVAL_MS)\n\n const TOKEN_REFRESH_INTERVAL_MS = 30 * 60 * 1000\n const refreshInterval = setInterval(async () => {\n try {\n await refreshClientAuth()\n } catch {\n // Token refresh failed, will retry on next interval\n }\n }, TOKEN_REFRESH_INTERVAL_MS)\n\n const cleanup = () => {\n if (isCleaningUp) {\n console.log(chalk.gray('\\nForce exiting...'))\n process.exit(1)\n }\n isCleaningUp = true\n console.log(chalk.gray('\\nStopping dev mode...'))\n \n clearInterval(pollInterval)\n clearInterval(refreshInterval)\n fileWatcher?.stop()\n \n subscription.unsubscribe()\n .catch(() => {})\n .finally(() => process.exit(0))\n \n setTimeout(() => {\n console.log(chalk.yellow('Cleanup timeout, forcing exit...'))\n process.exit(0)\n }, 2000)\n }\n\n process.on('SIGINT', cleanup)\n process.on('SIGTERM', cleanup)\n\n await new Promise(() => {})\n\n } catch (error) {\n spinner.fail('Dev mode failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { RealtimeChannel } from '@supabase/supabase-js'\nimport { createClient } from './client.js'\n\nexport interface VariableChangeEvent {\n action: 'INSERT' | 'UPDATE' | 'DELETE'\n variable_id: string\n key: string\n environment_id: string\n is_secret: boolean\n old_key?: string\n timestamp: number\n}\n\nexport type VariableChangeCallback = (event: VariableChangeEvent) => void\n\ninterface RealtimeSubscription {\n channel: RealtimeChannel\n environmentId: string\n unsubscribe: () => Promise<void>\n}\n\nconst MAX_RECONNECT_ATTEMPTS = 10\nconst BASE_RECONNECT_DELAY_MS = 1000\n\n/**\n * SECURITY: Does NOT receive actual values - only metadata.\n * Caller must fetch values via RPC after receiving event.\n */\nexport async function subscribeToVariableChanges(\n environmentId: string,\n onEvent: VariableChangeCallback,\n onStatus?: (status: 'connected' | 'disconnected' | 'reconnecting' | 'error', message?: string) => void\n): Promise<RealtimeSubscription> {\n const client = await createClient()\n \n const { data: envAccess, error: accessError } = await client\n .from('environment_access')\n .select('environment_id')\n .eq('environment_id', environmentId)\n .maybeSingle()\n \n if (accessError || !envAccess) {\n throw new Error(`No access to environment ${environmentId}`)\n }\n\n const channelName = `variables:${environmentId}`\n let reconnectAttempts = 0\n let reconnectTimeout: NodeJS.Timeout | null = null\n\n const channel = client.channel(channelName, {\n config: {\n broadcast: { self: false }\n }\n })\n\n channel.on(\n 'postgres_changes',\n {\n event: '*',\n schema: 'public',\n table: 'variables'\n },\n (payload) => {\n const newRecord = payload.new as Record<string, unknown> | null\n const oldRecord = payload.old as Record<string, unknown> | null\n const record = (newRecord && Object.keys(newRecord).length > 0 ? newRecord : oldRecord)\n \n if (!record) return\n \n const recordEnvId = record.environment_id as string\n if (recordEnvId !== environmentId) {\n return\n }\n \n const event: VariableChangeEvent = {\n action: payload.eventType.toUpperCase() as 'INSERT' | 'UPDATE' | 'DELETE',\n variable_id: record.id as string,\n key: record.key as string,\n environment_id: record.environment_id as string,\n is_secret: record.is_secret as boolean,\n timestamp: Date.now() / 1000\n }\n\n if (payload.eventType === 'UPDATE' && oldRecord) {\n if (oldRecord.key !== record.key) {\n event.old_key = oldRecord.key as string\n }\n }\n\n onEvent(event)\n }\n )\n\n // Listen for broadcast events (from trigger or other clients)\n channel.on('broadcast', { event: 'variable_change' }, (payload) => {\n onEvent(payload.payload as VariableChangeEvent)\n })\n\n // Also listen for any broadcast event name the trigger might use\n channel.on('broadcast', { event: '*' }, (payload) => {\n const data = payload.payload as Record<string, unknown>\n if (data?.action && data?.key && data?.environment_id) {\n onEvent(data as unknown as VariableChangeEvent)\n }\n })\n\n channel.on('system', { event: '*' }, (status) => {\n if (status.event === 'connected') {\n reconnectAttempts = 0\n onStatus?.('connected')\n }\n })\n\n const subscription = await new Promise<RealtimeSubscription>((resolve, reject) => {\n channel.subscribe(async (status, err) => {\n if (status === 'SUBSCRIBED') {\n onStatus?.('connected')\n resolve({\n channel,\n environmentId,\n unsubscribe: async () => {\n if (reconnectTimeout) {\n clearTimeout(reconnectTimeout)\n }\n await client.removeChannel(channel)\n }\n })\n } else if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {\n if (reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {\n reconnectAttempts++\n const delay = BASE_RECONNECT_DELAY_MS * Math.pow(2, reconnectAttempts - 1)\n onStatus?.('reconnecting', `Attempt ${reconnectAttempts}/${MAX_RECONNECT_ATTEMPTS} in ${delay}ms`)\n \n reconnectTimeout = setTimeout(() => {\n channel.subscribe()\n }, delay)\n } else {\n onStatus?.('error', `Failed after ${MAX_RECONNECT_ATTEMPTS} attempts`)\n reject(new Error(`Failed to subscribe to channel after ${MAX_RECONNECT_ATTEMPTS} attempts: ${err?.message || status}`))\n }\n } else if (status === 'CLOSED') {\n onStatus?.('disconnected')\n }\n })\n })\n\n return subscription\n}\n\nexport async function fetchVariableAfterChange(\n environmentId: string,\n variableId: string,\n includeSecrets: boolean = true\n): Promise<{ key: string; value: string | null; is_secret: boolean } | null> {\n const client = await createClient()\n \n const { data: variables, error } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environmentId,\n p_sync_secrets: includeSecrets,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (error || !variables) {\n return null\n }\n\n const variable = (variables as Array<{ id: string; key: string; value: string | null; is_secret: boolean }>)\n .find(v => v.id === variableId)\n\n return variable || null\n}\n\nexport async function fetchAllVariables(\n environmentId: string,\n includeSecrets: boolean = true\n): Promise<Array<{ id: string; key: string; value: string | null; is_secret: boolean }>> {\n const client = await createClient()\n\n const { data: variables, error } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environmentId,\n p_sync_secrets: includeSecrets,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (error) {\n throw new Error(`Failed to fetch variables: ${error.message}`)\n }\n\n return (variables || []) as Array<{ id: string; key: string; value: string | null; is_secret: boolean }>\n}\n","import { watch, FSWatcher } from 'fs'\nimport { existsSync, readFileSync } from 'fs'\nimport { EventEmitter } from 'events'\nimport { parse as parseDotenv } from 'dotenv'\n\nexport interface FileChangeEvent {\n type: 'change' | 'rename'\n path: string\n variables: Map<string, string>\n}\n\nexport interface FileWatcherEvents {\n change: (event: FileChangeEvent) => void\n error: (error: Error) => void\n}\n\nexport class EnvFileWatcher extends EventEmitter {\n private watcher: FSWatcher | null = null\n private filePath: string\n private lastContent: string = ''\n private debounceTimeout: NodeJS.Timeout | null = null\n private readonly debounceMs: number\n\n constructor(filePath: string, debounceMs: number = 300) {\n super()\n this.filePath = filePath\n this.debounceMs = debounceMs\n }\n\n start(): void {\n if (this.watcher) {\n return\n }\n\n if (!existsSync(this.filePath)) {\n this.emit('error', new Error(`File not found: ${this.filePath}`))\n return\n }\n\n this.lastContent = this.readFile()\n\n this.watcher = watch(this.filePath, (eventType) => {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout)\n }\n\n this.debounceTimeout = setTimeout(() => {\n this.handleFileChange(eventType as 'change' | 'rename')\n }, this.debounceMs)\n })\n\n this.watcher.on('error', (error) => {\n this.emit('error', error)\n })\n }\n\n stop(): void {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout)\n this.debounceTimeout = null\n }\n\n if (this.watcher) {\n this.watcher.close()\n this.watcher = null\n }\n }\n\n private readFile(): string {\n try {\n return readFileSync(this.filePath, 'utf-8')\n } catch {\n return ''\n }\n }\n\n private handleFileChange(eventType: 'change' | 'rename'): void {\n if (!existsSync(this.filePath)) {\n this.emit('change', {\n type: eventType,\n path: this.filePath,\n variables: new Map()\n })\n return\n }\n\n const currentContent = this.readFile()\n \n if (currentContent === this.lastContent) {\n return\n }\n\n this.lastContent = currentContent\n\n const parsed = parseDotenv(currentContent)\n const variables = new Map(Object.entries(parsed))\n\n this.emit('change', {\n type: eventType,\n path: this.filePath,\n variables\n })\n }\n\n getCurrentVariables(): Map<string, string> {\n const content = this.readFile()\n const parsed = parseDotenv(content)\n return new Map(Object.entries(parsed))\n }\n}\n\nexport { parseEnvFile } from './parser.js'\n\nexport function formatEnvFile(variables: Map<string, string>): string {\n const lines: string[] = []\n \n const sortedKeys = Array.from(variables.keys()).sort()\n \n for (const key of sortedKeys) {\n const value = variables.get(key) || ''\n const needsQuotes = value.includes(' ') || value.includes('\\n') || value.includes('\"') || value.includes(\"'\")\n const formattedValue = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value\n lines.push(`${key}=${formattedValue}`)\n }\n \n return lines.join('\\n') + '\\n'\n}\n","export interface VariableDiff {\n key: string\n localValue: string | null\n remoteValue: string | null\n type: 'added_local' | 'added_remote' | 'removed_local' | 'removed_remote' | 'modified'\n}\n\nexport interface ConflictResult {\n added: VariableDiff[]\n removed: VariableDiff[]\n modified: VariableDiff[]\n unchanged: string[]\n}\n\nexport function detectChanges(\n local: Map<string, string>,\n remote: Map<string, { key: string; value: string | null }>\n): ConflictResult {\n const result: ConflictResult = {\n added: [],\n removed: [],\n modified: [],\n unchanged: []\n }\n\n const remoteMap = new Map<string, string | null>()\n for (const [_, v] of remote) {\n remoteMap.set(v.key, v.value)\n }\n\n for (const [key, localValue] of local) {\n if (!remoteMap.has(key)) {\n result.added.push({\n key,\n localValue,\n remoteValue: null,\n type: 'added_local'\n })\n } else {\n const remoteValue = remoteMap.get(key) ?? null\n if (localValue !== remoteValue) {\n result.modified.push({\n key,\n localValue,\n remoteValue,\n type: 'modified'\n })\n } else {\n result.unchanged.push(key)\n }\n }\n }\n\n for (const [key, remoteValue] of remoteMap) {\n if (!local.has(key)) {\n result.removed.push({\n key,\n localValue: null,\n remoteValue,\n type: 'removed_local'\n })\n }\n }\n\n return result\n}\n\nexport type ConflictResolution = 'keep_local' | 'keep_remote' | 'skip'\n\nexport interface ResolvedVariable {\n key: string\n value: string | null\n action: 'set' | 'delete' | 'skip'\n}\n\nexport function applyResolution(\n diff: VariableDiff,\n resolution: ConflictResolution\n): ResolvedVariable {\n switch (resolution) {\n case 'keep_local':\n return {\n key: diff.key,\n value: diff.localValue,\n action: diff.localValue === null ? 'delete' : 'set'\n }\n case 'keep_remote':\n return {\n key: diff.key,\n value: diff.remoteValue,\n action: diff.remoteValue === null ? 'delete' : 'set'\n }\n case 'skip':\n return {\n key: diff.key,\n value: null,\n action: 'skip'\n }\n }\n}\n\nexport function mergeWithRemote(\n local: Map<string, string>,\n remoteVariables: Array<{ key: string; value: string | null }>,\n strategy: 'local_wins' | 'remote_wins' | 'merge_new'\n): Map<string, string> {\n const result = new Map<string, string>()\n\n switch (strategy) {\n case 'local_wins':\n for (const v of remoteVariables) {\n if (v.value !== null && !local.has(v.key)) {\n result.set(v.key, v.value)\n }\n }\n for (const [key, value] of local) {\n result.set(key, value)\n }\n break\n\n case 'remote_wins': {\n const remoteKeys = new Set(remoteVariables.map(v => v.key))\n // Keep local keys only if they also exist in remote\n for (const [key, value] of local) {\n if (remoteKeys.has(key)) {\n result.set(key, value)\n }\n }\n // Overlay remote values (remote wins)\n for (const v of remoteVariables) {\n if (v.value !== null) {\n result.set(v.key, v.value)\n }\n }\n break\n }\n\n case 'merge_new':\n for (const [key, value] of local) {\n result.set(key, value)\n }\n for (const v of remoteVariables) {\n if (v.value !== null && !local.has(v.key)) {\n result.set(v.key, v.value)\n }\n }\n break\n }\n\n return result\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { writeFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { generateTemplate } from '../lib/template-simple.js'\nimport { generateYamlTemplate } from '../lib/template-yaml.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { Variable } from '../lib/types.js'\n\nexport const initCommand = new Command('init')\n .description('Initialize project configuration and generate .env.template from EnvManager')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-p, --project <id>', 'Project ID')\n .option('--format <type>', 'Template format: simple or yaml (default: simple)', 'simple')\n .option('-f, --force', 'Overwrite existing files without prompting')\n .action(async (options) => {\n const spinner = ora('Initializing project...').start()\n \n try {\n const configPath = resolve('envmanager.json')\n const format = options.format as 'simple' | 'yaml'\n const templatePath = resolve(format === 'yaml' ? '.env.template.yaml' : '.env.template')\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n spinner.text = 'Fetching projects...'\n const { data: projects, error: projectError } = await client\n .from('projects')\n .select('id, name, friendly_id')\n .eq('organization_id', organizationId)\n\n if (projectError || !projects?.length) {\n spinner.fail('No projects found in organization')\n process.exit(1)\n }\n\n let projectId: string\n let projectName = ''\n\n if (options.project) {\n // Resolve project (accepts UUID, friendly ID, or name)\n try {\n projectId = await resolveProjectId(options.project, client, organizationId)\n const found = projects.find(p => p.id === projectId)\n projectName = found?.name || ''\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n } else if (projects.length === 1) {\n projectId = projects[0].id\n projectName = projects[0].name\n } else {\n spinner.stop()\n console.log(chalk.yellow('\\nMultiple projects found. Please specify with --project <id-or-name>:'))\n for (const p of projects) {\n const friendlyId = p.friendly_id ? `#${p.friendly_id}` : ''\n console.log(chalk.gray(` ${friendlyId} ${p.name}`))\n }\n process.exit(1)\n }\n\n spinner.text = 'Fetching environments...'\n const { data: environments, error: envListError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n\n if (envListError || !environments?.length) {\n spinner.fail('No environments found in project')\n process.exit(1)\n }\n\n const envName = options.environment || 'development'\n const environment = environments.find(e => e.name.toLowerCase() === envName.toLowerCase())\n \n if (!environment) {\n spinner.stop()\n console.log(chalk.yellow(`\\nEnvironment \"${envName}\" not found. Available:`))\n for (const e of environments) {\n console.log(chalk.gray(` ${e.name}`))\n }\n process.exit(1)\n }\n\n spinner.text = 'Fetching variables...'\n const { data: variables, error: varError } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environment.id,\n p_sync_secrets: false,\n p_sync_variables: true,\n p_include_fallbacks: false\n })\n\n if (varError) {\n spinner.fail('Failed to fetch variables')\n console.error(chalk.red(varError.message))\n process.exit(1)\n }\n\n const varsArray = (variables || []) as Variable[]\n\n if (existsSync(configPath) && !options.force) {\n spinner.stop()\n console.log(chalk.yellow(`\\nFile ${configPath} already exists. Use --force to overwrite.`))\n process.exit(1)\n }\n\n if (existsSync(templatePath) && !options.force) {\n spinner.stop()\n console.log(chalk.yellow(`\\nFile ${templatePath} already exists. Use --force to overwrite.`))\n process.exit(1)\n }\n\n spinner.text = 'Writing configuration...'\n\n const config = {\n project_id: projectId,\n environment: environment.name\n }\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n')\n\n const templateVars = varsArray.map(v => ({\n key: v.key,\n value: v.is_secret ? undefined : (v.value || undefined),\n isSecret: v.is_secret\n }))\n\n if (format === 'yaml') {\n const yamlContent = generateYamlTemplate(templateVars, { name: projectName })\n writeFileSync(templatePath, yamlContent)\n } else {\n const simpleContent = generateTemplate(templateVars, { includeDefaults: true })\n writeFileSync(templatePath, simpleContent)\n }\n\n spinner.succeed('Project initialized')\n console.log('')\n console.log(chalk.green('Created:'))\n console.log(chalk.gray(` ${configPath}`))\n console.log(chalk.gray(` ${templatePath}`))\n console.log('')\n console.log(chalk.cyan('Next steps:'))\n console.log(chalk.gray(' 1. Review and customize the template'))\n console.log(chalk.gray(' 2. Run `envmanager pull` to fetch current values'))\n console.log(chalk.gray(' 3. Run `envmanager dev` to start real-time sync'))\n\n } catch (error) {\n spinner.fail('Init failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","export interface TemplateVariable {\n key: string\n placeholder: string\n defaultValue: string | null\n required: boolean\n comment: string | null\n}\n\nexport interface ParsedTemplate {\n variables: TemplateVariable[]\n comments: string[]\n raw: string\n}\n\nconst PLACEHOLDER_REGEX = /\\$\\{([A-Z_][A-Z0-9_]*)(?::([^}]*))?\\}/g\nconst LINE_VAR_REGEX = /^([A-Z_][A-Z0-9_]*)=(.*)$/\n\nexport function parseTemplate(content: string): ParsedTemplate {\n const variables: TemplateVariable[] = []\n const comments: string[] = []\n const lines = content.split('\\n')\n \n let currentComment: string | null = null\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n if (trimmed.startsWith('#')) {\n currentComment = trimmed.substring(1).trim()\n comments.push(currentComment)\n continue\n }\n\n if (!trimmed) {\n currentComment = null\n continue\n }\n\n const match = trimmed.match(LINE_VAR_REGEX)\n if (match) {\n const [, key, value] = match\n const placeholderMatch = value.match(/^\\$\\{([A-Z_][A-Z0-9_]*)(?::([^}]*))?\\}$/)\n \n if (placeholderMatch) {\n const [, placeholderKey, defaultValue] = placeholderMatch\n variables.push({\n key,\n placeholder: placeholderKey,\n defaultValue: defaultValue ?? null,\n required: defaultValue === undefined,\n comment: currentComment\n })\n } else {\n variables.push({\n key,\n placeholder: key,\n defaultValue: value || null,\n required: false,\n comment: currentComment\n })\n }\n currentComment = null\n }\n }\n\n return { variables, comments, raw: content }\n}\n\nexport function extractPlaceholders(content: string): Map<string, { defaultValue: string | null; required: boolean }> {\n const placeholders = new Map<string, { defaultValue: string | null; required: boolean }>()\n \n let match\n while ((match = PLACEHOLDER_REGEX.exec(content)) !== null) {\n const [, name, defaultValue] = match\n placeholders.set(name, {\n defaultValue: defaultValue ?? null,\n required: defaultValue === undefined\n })\n }\n \n return placeholders\n}\n\nexport function substituteTemplate(\n template: string,\n values: Map<string, string>,\n options: { throwOnMissing?: boolean } = {}\n): { result: string; missing: string[] } {\n const missing: string[] = []\n \n const result = template.replace(PLACEHOLDER_REGEX, (match, name, defaultValue) => {\n if (values.has(name)) {\n return values.get(name)!\n }\n \n if (defaultValue !== undefined) {\n return defaultValue\n }\n \n missing.push(name)\n \n if (options.throwOnMissing) {\n throw new Error(`Missing required variable: ${name}`)\n }\n \n return match\n })\n\n return { result, missing }\n}\n\nexport function generateTemplate(\n variables: Array<{ key: string; value?: string; isSecret?: boolean; description?: string }>,\n options: { includeDefaults?: boolean; includeComments?: boolean } = {}\n): string {\n const lines: string[] = []\n \n for (const v of variables.sort((a, b) => a.key.localeCompare(b.key))) {\n if (options.includeComments && v.description) {\n lines.push(`# ${v.description}`)\n }\n \n if (v.isSecret) {\n lines.push(`${v.key}=\\${${v.key}}`)\n } else if (options.includeDefaults && v.value) {\n lines.push(`${v.key}=\\${${v.key}:${v.value}}`)\n } else {\n lines.push(`${v.key}=\\${${v.key}}`)\n }\n }\n \n return lines.join('\\n') + '\\n'\n}\n\nexport function validateAgainstTemplate(\n template: ParsedTemplate,\n env: Map<string, string>\n): { valid: boolean; missing: string[]; extra: string[] } {\n const required = template.variables\n .filter(v => v.required)\n .map(v => v.key)\n \n const templateKeys = new Set(template.variables.map(v => v.key))\n const envKeys = new Set(env.keys())\n \n const missing = required.filter(k => !env.has(k))\n const extra = Array.from(envKeys).filter(k => !templateKeys.has(k))\n \n return {\n valid: missing.length === 0,\n missing,\n extra\n }\n}\n","import yaml from 'js-yaml'\n\nexport type VariableType = 'string' | 'number' | 'boolean' | 'url' | 'email' | 'port' | 'path'\n\nexport interface YamlTemplateVariable {\n name: string\n type: VariableType\n required: boolean\n default?: string\n description?: string\n example?: string\n enum?: string[]\n pattern?: string\n min?: number\n max?: number\n}\n\nexport interface YamlTemplate {\n version: string\n name?: string\n description?: string\n variables: YamlTemplateVariable[]\n}\n\ninterface RawYamlVariable {\n type?: string\n required?: boolean\n default?: string | number | boolean\n description?: string\n example?: string | number | boolean\n enum?: (string | number)[]\n pattern?: string\n min?: number\n max?: number\n}\n\nexport function parseYamlTemplate(content: string): YamlTemplate {\n const parsed = yaml.load(content) as Record<string, unknown>\n \n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Invalid YAML template: must be an object')\n }\n\n const version = String(parsed.version || '1')\n const name = parsed.name as string | undefined\n const description = parsed.description as string | undefined\n const rawVariables = (parsed.variables || parsed.env || {}) as Record<string, RawYamlVariable | null>\n\n const variables: YamlTemplateVariable[] = []\n\n for (const [varName, config] of Object.entries(rawVariables)) {\n if (config === null) {\n variables.push({\n name: varName,\n type: 'string',\n required: true\n })\n continue\n }\n\n variables.push({\n name: varName,\n type: (config.type as VariableType) || 'string',\n required: config.required !== false,\n default: config.default !== undefined ? String(config.default) : undefined,\n description: config.description,\n example: config.example !== undefined ? String(config.example) : undefined,\n enum: config.enum?.map(String),\n pattern: config.pattern,\n min: config.min,\n max: config.max\n })\n }\n\n return { version, name, description, variables }\n}\n\nexport function validateValue(value: string, variable: YamlTemplateVariable): { valid: boolean; error?: string } {\n if (!value && variable.required && !variable.default) {\n return { valid: false, error: `${variable.name} is required` }\n }\n\n const actualValue = value || variable.default || ''\n\n if (!actualValue && !variable.required) {\n return { valid: true }\n }\n\n if (variable.enum && !variable.enum.includes(actualValue)) {\n return { valid: false, error: `${variable.name} must be one of: ${variable.enum.join(', ')}` }\n }\n\n if (variable.pattern) {\n const regex = new RegExp(variable.pattern)\n if (!regex.test(actualValue)) {\n return { valid: false, error: `${variable.name} does not match pattern: ${variable.pattern}` }\n }\n }\n\n switch (variable.type) {\n case 'number': {\n const num = Number(actualValue)\n if (isNaN(num)) {\n return { valid: false, error: `${variable.name} must be a number` }\n }\n if (variable.min !== undefined && num < variable.min) {\n return { valid: false, error: `${variable.name} must be >= ${variable.min}` }\n }\n if (variable.max !== undefined && num > variable.max) {\n return { valid: false, error: `${variable.name} must be <= ${variable.max}` }\n }\n break\n }\n\n case 'boolean': {\n const lower = actualValue.toLowerCase()\n if (!['true', 'false', '1', '0', 'yes', 'no'].includes(lower)) {\n return { valid: false, error: `${variable.name} must be a boolean` }\n }\n break\n }\n\n case 'url': {\n try {\n new URL(actualValue)\n } catch {\n return { valid: false, error: `${variable.name} must be a valid URL` }\n }\n break\n }\n\n case 'email': {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(actualValue)) {\n return { valid: false, error: `${variable.name} must be a valid email` }\n }\n break\n }\n\n case 'port': {\n const port = Number(actualValue)\n if (isNaN(port) || port < 1 || port > 65535) {\n return { valid: false, error: `${variable.name} must be a valid port (1-65535)` }\n }\n break\n }\n\n case 'path': {\n if (!actualValue.startsWith('/') && !actualValue.startsWith('./') && !actualValue.startsWith('../')) {\n return { valid: false, error: `${variable.name} must be a valid path` }\n }\n break\n }\n }\n\n return { valid: true }\n}\n\nexport function validateYamlTemplate(\n template: YamlTemplate,\n env: Map<string, string>\n): { valid: boolean; errors: string[]; warnings: string[] } {\n const errors: string[] = []\n const warnings: string[] = []\n const templateKeys = new Set(template.variables.map(v => v.name))\n\n for (const variable of template.variables) {\n const value = env.get(variable.name)\n const result = validateValue(value || '', variable)\n \n if (!result.valid && result.error) {\n errors.push(result.error)\n }\n }\n\n for (const key of env.keys()) {\n if (!templateKeys.has(key)) {\n warnings.push(`Extra variable not in template: ${key}`)\n }\n }\n\n return { valid: errors.length === 0, errors, warnings }\n}\n\nexport function generateYamlTemplate(\n variables: Array<{ key: string; value?: string; isSecret?: boolean; description?: string }>,\n options: { name?: string; description?: string } = {}\n): string {\n const template: Record<string, unknown> = {\n version: '1'\n }\n\n if (options.name) {\n template.name = options.name\n }\n\n if (options.description) {\n template.description = options.description\n }\n\n const vars: Record<string, Record<string, unknown>> = {}\n\n for (const v of variables.sort((a, b) => a.key.localeCompare(b.key))) {\n const varConfig: Record<string, unknown> = {\n type: 'string',\n required: true\n }\n\n if (v.description) {\n varConfig.description = v.description\n }\n\n if (v.value && !v.isSecret) {\n varConfig.example = v.value\n }\n\n vars[v.key] = varConfig\n }\n\n template.variables = vars\n\n return yaml.dump(template, { lineWidth: -1, quotingType: '\"' })\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { readFileSync, writeFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { parse as parseDotenv } from 'dotenv'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { parseTemplate, substituteTemplate, validateAgainstTemplate } from '../lib/template-simple.js'\nimport { parseYamlTemplate, validateYamlTemplate } from '../lib/template-yaml.js'\nimport { Variable } from '../lib/types.js'\n\nexport const templateCommand = new Command('template')\n .description('Manage environment templates')\n\ntemplateCommand\n .command('generate')\n .description('Generate .env file from template and EnvManager values')\n .option('-t, --template <file>', 'Template file (default: .env.template or .env.template.yaml)')\n .option('-o, --output <file>', 'Output file (default: .env)')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('-f, --force', 'Overwrite existing output file')\n .action(async (options) => {\n const spinner = ora('Generating .env from template...').start()\n\n try {\n const config = loadConfig()\n const projectId = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const outputPath = resolve(options.output || '.env')\n\n let templatePath = options.template\n let isYaml = false\n\n if (!templatePath) {\n if (existsSync('.env.template.yaml')) {\n templatePath = '.env.template.yaml'\n isYaml = true\n } else if (existsSync('.env.template')) {\n templatePath = '.env.template'\n } else {\n spinner.fail('No template file found')\n console.log(chalk.yellow('\\nCreate .env.template or .env.template.yaml first'))\n console.log(chalk.gray(' Run `envmanager init` to generate from EnvManager'))\n process.exit(1)\n }\n }\n\n templatePath = resolve(templatePath)\n isYaml = templatePath.endsWith('.yaml') || templatePath.endsWith('.yml')\n\n if (!existsSync(templatePath)) {\n spinner.fail(`Template file not found: ${templatePath}`)\n process.exit(1)\n }\n\n if (existsSync(outputPath) && !options.force) {\n spinner.stop()\n console.log(chalk.yellow(`\\nFile ${outputPath} already exists. Use --force to overwrite.`))\n process.exit(1)\n }\n\n if (!projectId) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify --project or create envmanager.json'))\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n .eq('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching variables...'\n const { data: variables, error: varError } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environment.id,\n p_sync_secrets: true,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (varError) {\n spinner.fail('Failed to fetch variables')\n process.exit(1)\n }\n\n const varsArray = (variables || []) as Variable[]\n const valuesMap = new Map<string, string>()\n for (const v of varsArray) {\n if (v.value !== null) {\n valuesMap.set(v.key, v.value)\n }\n }\n\n spinner.text = 'Generating output...'\n const templateContent = readFileSync(templatePath, 'utf-8')\n\n if (isYaml) {\n const parsed = parseYamlTemplate(templateContent)\n const lines: string[] = []\n\n for (const variable of parsed.variables.sort((a, b) => a.name.localeCompare(b.name))) {\n const value = valuesMap.get(variable.name) || variable.default || ''\n const needsQuotes = value.includes(' ') || value.includes('\\n') || value.includes('\"')\n const formatted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value\n lines.push(`${variable.name}=${formatted}`)\n }\n\n writeFileSync(outputPath, lines.join('\\n') + '\\n')\n } else {\n const parsed = parseTemplate(templateContent)\n const { result, missing } = substituteTemplate(templateContent, valuesMap)\n\n if (missing.length > 0) {\n spinner.warn('Generated with missing variables')\n console.log(chalk.yellow('\\nMissing variables (using placeholders):'))\n for (const m of missing) {\n console.log(chalk.yellow(` - ${m}`))\n }\n }\n\n const lines = result.split('\\n').filter(line => {\n const trimmed = line.trim()\n return !trimmed.startsWith('#') && trimmed.includes('=')\n })\n\n writeFileSync(outputPath, lines.join('\\n') + '\\n')\n }\n\n spinner.succeed(`Generated ${outputPath}`)\n console.log(chalk.gray(` From template: ${templatePath}`))\n console.log(chalk.gray(` Environment: ${envName}`))\n\n } catch (error) {\n spinner.fail('Generate failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\ntemplateCommand\n .command('sync')\n .description('Compare template with EnvManager and report differences')\n .option('-t, --template <file>', 'Template file (default: .env.template or .env.template.yaml)')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .action(async (options) => {\n const spinner = ora('Comparing template with EnvManager...').start()\n\n try {\n const config = loadConfig()\n const projectId = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n\n let templatePath = options.template\n let isYaml = false\n\n if (!templatePath) {\n if (existsSync('.env.template.yaml')) {\n templatePath = '.env.template.yaml'\n isYaml = true\n } else if (existsSync('.env.template')) {\n templatePath = '.env.template'\n } else {\n spinner.fail('No template file found')\n process.exit(1)\n }\n }\n\n templatePath = resolve(templatePath)\n isYaml = templatePath.endsWith('.yaml') || templatePath.endsWith('.yml')\n\n if (!existsSync(templatePath)) {\n spinner.fail(`Template file not found: ${templatePath}`)\n process.exit(1)\n }\n\n if (!projectId) {\n spinner.fail('No project specified')\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n .eq('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching variables...'\n const { data: variables, error: varError } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environment.id,\n p_sync_secrets: false,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (varError) {\n spinner.fail('Failed to fetch variables')\n process.exit(1)\n }\n\n const varsArray = (variables || []) as Variable[]\n const remoteKeys = new Set(varsArray.map(v => v.key))\n const templateContent = readFileSync(templatePath, 'utf-8')\n\n let templateKeys: Set<string>\n\n if (isYaml) {\n const parsed = parseYamlTemplate(templateContent)\n templateKeys = new Set(parsed.variables.map(v => v.name))\n } else {\n const parsed = parseTemplate(templateContent)\n templateKeys = new Set(parsed.variables.map(v => v.key))\n }\n\n const missingInRemote: string[] = []\n const missingInTemplate: string[] = []\n const inBoth: string[] = []\n\n for (const key of templateKeys) {\n if (remoteKeys.has(key)) {\n inBoth.push(key)\n } else {\n missingInRemote.push(key)\n }\n }\n\n for (const key of remoteKeys) {\n if (!templateKeys.has(key)) {\n missingInTemplate.push(key)\n }\n }\n\n spinner.stop()\n\n console.log('')\n console.log(chalk.cyan('Template Sync Report'))\n console.log(chalk.gray(`Template: ${templatePath}`))\n console.log(chalk.gray(`Environment: ${envName}`))\n console.log('')\n\n if (missingInRemote.length === 0 && missingInTemplate.length === 0) {\n console.log(chalk.green('Template and EnvManager are in sync'))\n console.log(chalk.gray(`${inBoth.length} variables matched`))\n } else {\n if (missingInRemote.length > 0) {\n console.log(chalk.yellow(`Missing in EnvManager (${missingInRemote.length}):`))\n for (const key of missingInRemote.sort()) {\n console.log(chalk.yellow(` + ${key}`))\n }\n console.log('')\n }\n\n if (missingInTemplate.length > 0) {\n console.log(chalk.blue(`Missing in template (${missingInTemplate.length}):`))\n for (const key of missingInTemplate.sort()) {\n console.log(chalk.blue(` - ${key}`))\n }\n console.log('')\n }\n\n console.log(chalk.gray(`${inBoth.length} variables matched`))\n }\n\n } catch (error) {\n spinner.fail('Sync check failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\ntemplateCommand\n .command('validate')\n .description('Validate local .env file against template')\n .option('-t, --template <file>', 'Template file (default: .env.template or .env.template.yaml)')\n .option('-i, --input <file>', 'Input .env file (default: .env)')\n .action(async (options) => {\n const spinner = ora('Validating .env against template...').start()\n\n try {\n const inputPath = resolve(options.input || '.env')\n\n if (!existsSync(inputPath)) {\n spinner.fail(`Input file not found: ${inputPath}`)\n process.exit(1)\n }\n\n let templatePath = options.template\n let isYaml = false\n\n if (!templatePath) {\n if (existsSync('.env.template.yaml')) {\n templatePath = '.env.template.yaml'\n isYaml = true\n } else if (existsSync('.env.template')) {\n templatePath = '.env.template'\n } else {\n spinner.fail('No template file found')\n process.exit(1)\n }\n }\n\n templatePath = resolve(templatePath)\n isYaml = templatePath.endsWith('.yaml') || templatePath.endsWith('.yml')\n\n if (!existsSync(templatePath)) {\n spinner.fail(`Template file not found: ${templatePath}`)\n process.exit(1)\n }\n\n const envContent = readFileSync(inputPath, 'utf-8')\n const envVars = new Map(Object.entries(parseDotenv(envContent)))\n const templateContent = readFileSync(templatePath, 'utf-8')\n\n spinner.stop()\n\n if (isYaml) {\n const parsed = parseYamlTemplate(templateContent)\n const result = validateYamlTemplate(parsed, envVars)\n\n console.log('')\n if (result.valid && result.warnings.length === 0) {\n console.log(chalk.green('Validation passed'))\n } else {\n if (result.errors.length > 0) {\n console.log(chalk.red(`Validation failed (${result.errors.length} errors):`))\n for (const error of result.errors) {\n console.log(chalk.red(` - ${error}`))\n }\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(`\\nWarnings (${result.warnings.length}):`))\n for (const warning of result.warnings) {\n console.log(chalk.yellow(` - ${warning}`))\n }\n }\n\n if (!result.valid) {\n process.exit(1)\n }\n }\n } else {\n const parsed = parseTemplate(templateContent)\n const result = validateAgainstTemplate(parsed, envVars)\n\n console.log('')\n if (result.valid && result.extra.length === 0) {\n console.log(chalk.green('Validation passed'))\n } else {\n if (result.missing.length > 0) {\n console.log(chalk.red(`Missing required variables (${result.missing.length}):`))\n for (const key of result.missing) {\n console.log(chalk.red(` - ${key}`))\n }\n }\n\n if (result.extra.length > 0) {\n console.log(chalk.yellow(`\\nExtra variables not in template (${result.extra.length}):`))\n for (const key of result.extra) {\n console.log(chalk.yellow(` - ${key}`))\n }\n }\n\n if (!result.valid) {\n process.exit(1)\n }\n }\n }\n\n } catch (error) {\n spinner.fail('Validation failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { readFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { parse as parseDotenv } from 'dotenv'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { validateEnvAgainstSchema, jsonToSchema, type EnvSchema } from '../lib/schema.js'\n\nexport const validateCommand = new Command('validate')\n .description('Validate local .env file against schema from EnvManager or local file')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-i, --input <file>', 'Input .env file (default: .env)')\n .option('-s, --schema <file>', 'Local schema JSON file (skip fetching from EnvManager)')\n .option('--strict', 'Fail on warnings (extra variables not in schema)')\n .action(async (options) => {\n const spinner = ora('Validating environment...').start()\n\n try {\n const config = loadConfig()\n const inputPath = resolve(options.input || '.env')\n\n if (!existsSync(inputPath)) {\n spinner.fail(`Input file not found: ${inputPath}`)\n process.exit(1)\n }\n\n const envContent = readFileSync(inputPath, 'utf-8')\n const envVars = new Map(Object.entries(parseDotenv(envContent)))\n\n let schema: EnvSchema\n\n if (options.schema) {\n spinner.text = 'Loading local schema...'\n const schemaPath = resolve(options.schema)\n \n if (!existsSync(schemaPath)) {\n spinner.fail(`Schema file not found: ${schemaPath}`)\n process.exit(1)\n }\n\n const schemaContent = readFileSync(schemaPath, 'utf-8')\n const schemaJson = JSON.parse(schemaContent) as Record<string, unknown>\n schema = jsonToSchema(schemaJson)\n } else {\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify --project or use --schema for local validation'))\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching schema...'\n const { data: schemaJson, error: schemaError } = await client.rpc('get_environment_schema', {\n p_environment_id: environment.id\n })\n\n if (schemaError) {\n spinner.fail('Failed to fetch schema')\n console.error(chalk.red(schemaError.message))\n process.exit(1)\n }\n\n if (!schemaJson) {\n spinner.warn('No schema defined for this environment')\n console.log(chalk.yellow('\\nTo create a schema, use the web UI or upload with:'))\n console.log(chalk.gray(' envmanager validate --schema schema.json'))\n process.exit(0)\n }\n\n schema = jsonToSchema(schemaJson as Record<string, unknown>)\n }\n\n spinner.text = 'Validating...'\n const result = validateEnvAgainstSchema(envVars, schema)\n\n spinner.stop()\n\n console.log('')\n console.log(chalk.cyan('Validation Results'))\n console.log(chalk.gray(`File: ${inputPath}`))\n console.log(chalk.gray(`Variables: ${envVars.size}`))\n console.log(chalk.gray(`Schema fields: ${Object.keys(schema).length}`))\n console.log('')\n\n if (result.valid && result.warnings.length === 0) {\n console.log(chalk.green('All validations passed'))\n process.exit(0)\n }\n\n if (result.errors.length > 0) {\n console.log(chalk.red(`Errors (${result.errors.length}):`))\n for (const error of result.errors) {\n console.log(chalk.red(` - ${error.message}`))\n if (error.value) {\n console.log(chalk.gray(` Value: \"${error.value}\"`))\n }\n }\n console.log('')\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(`Warnings (${result.warnings.length}):`))\n for (const warning of result.warnings) {\n console.log(chalk.yellow(` - ${warning}`))\n }\n console.log('')\n }\n\n if (!result.valid) {\n console.log(chalk.red('Validation failed'))\n process.exit(1)\n }\n\n if (options.strict && result.warnings.length > 0) {\n console.log(chalk.red('Validation failed (strict mode)'))\n process.exit(1)\n }\n\n console.log(chalk.green('Validation passed with warnings'))\n\n } catch (error) {\n spinner.fail('Validation failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { z } from 'zod'\n\nexport type SchemaFieldType = 'string' | 'number' | 'boolean' | 'url' | 'email' | 'port' | 'json'\n\nexport interface SchemaField {\n type: SchemaFieldType\n required?: boolean\n default?: string\n description?: string\n enum?: string[]\n pattern?: string\n minimum?: number\n maximum?: number\n minLength?: number\n maxLength?: number\n}\n\nexport type EnvSchema = Record<string, SchemaField>\n\nconst fieldTypeValidators: Record<SchemaFieldType, (value: string) => boolean> = {\n string: () => true,\n number: (v) => !isNaN(Number(v)),\n boolean: (v) => ['true', 'false', '1', '0', 'yes', 'no'].includes(v.toLowerCase()),\n url: (v) => { try { new URL(v); return true } catch { return false } },\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v),\n port: (v) => { const n = Number(v); return !isNaN(n) && n >= 1 && n <= 65535 },\n json: (v) => { try { JSON.parse(v); return true } catch { return false } }\n}\n\nexport interface ValidationError {\n key: string\n message: string\n value?: string\n}\n\nexport interface ValidationResult {\n valid: boolean\n errors: ValidationError[]\n warnings: string[]\n}\n\nexport function validateEnvAgainstSchema(\n env: Map<string, string>,\n schema: EnvSchema\n): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: string[] = []\n\n for (const [key, field] of Object.entries(schema)) {\n const value = env.get(key)\n const actualValue = value ?? field.default\n\n if (field.required !== false && !actualValue) {\n errors.push({ key, message: `${key} is required` })\n continue\n }\n\n if (!actualValue) continue\n\n const validator = fieldTypeValidators[field.type]\n if (!validator(actualValue)) {\n errors.push({ key, message: `${key} must be a valid ${field.type}`, value: actualValue })\n continue\n }\n\n if (field.enum && !field.enum.includes(actualValue)) {\n errors.push({ key, message: `${key} must be one of: ${field.enum.join(', ')}`, value: actualValue })\n continue\n }\n\n if (field.pattern) {\n const regex = new RegExp(field.pattern)\n if (!regex.test(actualValue)) {\n errors.push({ key, message: `${key} does not match pattern: ${field.pattern}`, value: actualValue })\n continue\n }\n }\n\n if (field.type === 'number') {\n const num = Number(actualValue)\n if (field.minimum !== undefined && num < field.minimum) {\n errors.push({ key, message: `${key} must be >= ${field.minimum}`, value: actualValue })\n }\n if (field.maximum !== undefined && num > field.maximum) {\n errors.push({ key, message: `${key} must be <= ${field.maximum}`, value: actualValue })\n }\n }\n\n if (field.type === 'string') {\n if (field.minLength !== undefined && actualValue.length < field.minLength) {\n errors.push({ key, message: `${key} must be at least ${field.minLength} characters`, value: actualValue })\n }\n if (field.maxLength !== undefined && actualValue.length > field.maxLength) {\n errors.push({ key, message: `${key} must be at most ${field.maxLength} characters`, value: actualValue })\n }\n }\n }\n\n const schemaKeys = new Set(Object.keys(schema))\n for (const key of env.keys()) {\n if (!schemaKeys.has(key)) {\n warnings.push(`${key} is not defined in schema`)\n }\n }\n\n return { valid: errors.length === 0, errors, warnings }\n}\n\nexport function schemaToZod(schema: EnvSchema): z.ZodObject<Record<string, z.ZodTypeAny>> {\n const shape: Record<string, z.ZodTypeAny> = {}\n\n for (const [key, field] of Object.entries(schema)) {\n let zodType: z.ZodTypeAny\n\n switch (field.type) {\n case 'number':\n zodType = z.string().transform(Number).pipe(z.number())\n if (field.minimum !== undefined) zodType = (zodType as z.ZodNumber).min(field.minimum)\n if (field.maximum !== undefined) zodType = (zodType as z.ZodNumber).max(field.maximum)\n break\n\n case 'boolean':\n zodType = z.string().transform(v => ['true', '1', 'yes'].includes(v.toLowerCase()))\n break\n\n case 'url':\n zodType = z.string().url()\n break\n\n case 'email':\n zodType = z.string().email()\n break\n\n case 'port':\n zodType = z.string().transform(Number).pipe(z.number().int().min(1).max(65535))\n break\n\n case 'json':\n zodType = z.string().transform(v => JSON.parse(v))\n break\n\n default:\n zodType = z.string()\n if (field.minLength) zodType = (zodType as z.ZodString).min(field.minLength)\n if (field.maxLength) zodType = (zodType as z.ZodString).max(field.maxLength)\n if (field.pattern) zodType = (zodType as z.ZodString).regex(new RegExp(field.pattern))\n }\n\n if (field.enum) {\n zodType = z.enum(field.enum as [string, ...string[]])\n }\n\n if (field.required === false) {\n zodType = zodType.optional()\n if (field.default) {\n zodType = zodType.default(field.default)\n }\n }\n\n shape[key] = zodType\n }\n\n return z.object(shape)\n}\n\nexport function schemaToJson(schema: EnvSchema): object {\n const properties: Record<string, object> = {}\n const required: string[] = []\n\n for (const [key, field] of Object.entries(schema)) {\n const prop: Record<string, unknown> = {}\n\n switch (field.type) {\n case 'number':\n case 'port':\n prop.type = 'number'\n if (field.minimum !== undefined) prop.minimum = field.minimum\n if (field.maximum !== undefined) prop.maximum = field.maximum\n break\n case 'boolean':\n prop.type = 'boolean'\n break\n default:\n prop.type = 'string'\n if (field.minLength !== undefined) prop.minLength = field.minLength\n if (field.maxLength !== undefined) prop.maxLength = field.maxLength\n if (field.pattern) prop.pattern = field.pattern\n }\n\n if (field.type === 'url') prop.format = 'uri'\n if (field.type === 'email') prop.format = 'email'\n if (field.enum) prop.enum = field.enum\n if (field.default !== undefined) prop.default = field.default\n if (field.description) prop.description = field.description\n\n properties[key] = prop\n\n if (field.required !== false) {\n required.push(key)\n }\n }\n\n return {\n $schema: 'http://json-schema.org/draft-07/schema#',\n type: 'object',\n properties,\n required,\n additionalProperties: true\n }\n}\n\nexport function jsonToSchema(json: Record<string, unknown>): EnvSchema {\n const schema: EnvSchema = {}\n \n if (!json || typeof json !== 'object') {\n return schema\n }\n\n for (const [key, value] of Object.entries(json)) {\n if (!value || typeof value !== 'object') continue\n \n const field = value as Record<string, unknown>\n const schemaField: SchemaField = { type: 'string' }\n\n if (field.type === 'number') {\n schemaField.type = 'number'\n if (typeof field.minimum === 'number') schemaField.minimum = field.minimum\n if (typeof field.maximum === 'number') schemaField.maximum = field.maximum\n } else if (field.type === 'boolean') {\n schemaField.type = 'boolean'\n } else {\n if (field.format === 'uri' || field.format === 'url') schemaField.type = 'url'\n else if (field.format === 'email') schemaField.type = 'email'\n else if (typeof field.pattern === 'string' && field.pattern.includes('^postgres')) schemaField.type = 'url'\n }\n\n if (Array.isArray(field.enum)) schemaField.enum = field.enum as string[]\n if (typeof field.pattern === 'string') schemaField.pattern = field.pattern\n if (typeof field.default === 'string') schemaField.default = field.default\n if (typeof field.description === 'string') schemaField.description = field.description\n if (typeof field.minLength === 'number') schemaField.minLength = field.minLength\n if (typeof field.maxLength === 'number') schemaField.maxLength = field.maxLength\n if (field.required === false) schemaField.required = false\n else schemaField.required = true\n\n schema[key] = schemaField\n }\n\n return schema\n}\n","import { Command } from 'commander'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { getCredentials } from '../lib/credentials.js'\n\nconst COMMANDS = [\n 'login',\n 'logout', \n 'whoami',\n 'pull',\n 'push',\n 'diff',\n 'list',\n 'config',\n 'dev',\n 'init',\n 'template',\n 'validate',\n 'completion',\n]\n\nconst LIST_RESOURCES = ['projects', 'environments', 'variables']\n\nconst bashScript = `\n_envmanager_completions() {\n local cur prev words cword\n _init_completion || return\n\n local completions\n completions=$(envmanager __complete \"\\${COMP_WORDS[@]:1}\" 2>/dev/null)\n \n if [[ $? -eq 0 ]]; then\n COMPREPLY=($(compgen -W \"$completions\" -- \"$cur\"))\n fi\n}\n\ncomplete -F _envmanager_completions envmanager\n`.trim()\n\nconst zshScript = `\n#compdef envmanager\n\n_envmanager() {\n local completions\n completions=(\"\\${(@f)$(envmanager __complete \"\\${words[@]:1}\" 2>/dev/null)}\")\n \n if [[ \\${#completions[@]} -gt 0 ]]; then\n _describe 'envmanager' completions\n fi\n}\n\ncompdef _envmanager envmanager\n`.trim()\n\nconst fishScript = `\nfunction __fish_envmanager_complete\n set -l tokens (commandline -opc)\n set -l current (commandline -ct)\n envmanager __complete $tokens[2..-1] $current 2>/dev/null\nend\n\ncomplete -c envmanager -f -a '(__fish_envmanager_complete)'\n`.trim()\n\nasync function getCompletions(args: string[]): Promise<string[]> {\n if (args.length === 0) {\n return COMMANDS\n }\n\n const command = args[0]\n const lastArg = args[args.length - 1] ?? ''\n const prevArg = args.length > 1 ? args[args.length - 2] : ''\n\n if (args.length === 1 && !COMMANDS.includes(command)) {\n return COMMANDS.filter(c => c.startsWith(command))\n }\n\n if (command === 'list' && args.length === 2) {\n return LIST_RESOURCES.filter(r => r.startsWith(lastArg))\n }\n\n if (prevArg === '--project' || prevArg === '-p') {\n return await getProjectCompletions(lastArg)\n }\n\n if (prevArg === '--environment' || prevArg === '-e') {\n const projectArg = findArgValue(args, ['--project', '-p'])\n return await getEnvironmentCompletions(lastArg, projectArg)\n }\n\n const commandsWithProject = ['pull', 'push', 'diff', 'list', 'dev', 'validate', 'template']\n const commandsWithEnv = ['pull', 'push', 'diff', 'dev', 'validate', 'template']\n\n const suggestions: string[] = []\n\n if (commandsWithProject.includes(command) && !hasArg(args, ['--project', '-p'])) {\n suggestions.push('--project')\n }\n\n if (commandsWithEnv.includes(command) && !hasArg(args, ['--environment', '-e'])) {\n suggestions.push('--environment')\n }\n\n switch (command) {\n case 'pull':\n if (!hasArg(args, ['--output', '-o'])) suggestions.push('--output')\n if (!hasArg(args, ['--force', '-f'])) suggestions.push('--force')\n if (!hasArg(args, ['--no-secrets'])) suggestions.push('--no-secrets')\n break\n case 'push':\n if (!hasArg(args, ['--input', '-i'])) suggestions.push('--input')\n if (!hasArg(args, ['--secrets'])) suggestions.push('--secrets')\n if (!hasArg(args, ['--all-secrets'])) suggestions.push('--all-secrets')\n if (!hasArg(args, ['--dry-run'])) suggestions.push('--dry-run')\n break\n case 'list':\n if (!hasArg(args, ['--verbose', '-v'])) suggestions.push('--verbose')\n break\n case 'dev':\n if (!hasArg(args, ['--output', '-o'])) suggestions.push('--output')\n if (!hasArg(args, ['--watch', '-w'])) suggestions.push('--watch')\n break\n case 'template':\n if (args.length === 2) {\n return ['generate', 'sync', 'validate'].filter(s => s.startsWith(lastArg))\n }\n break\n case 'completion':\n if (args.length === 2) {\n return ['bash', 'zsh', 'fish'].filter(s => s.startsWith(lastArg))\n }\n break\n case 'config':\n if (args.length === 2) {\n return ['show'].filter(s => s.startsWith(lastArg))\n }\n break\n }\n\n return suggestions.filter(s => s.startsWith(lastArg))\n}\n\nfunction findArgValue(args: string[], flags: string[]): string | undefined {\n for (let i = 0; i < args.length - 1; i++) {\n if (flags.includes(args[i])) {\n return args[i + 1]\n }\n }\n return undefined\n}\n\nfunction hasArg(args: string[], flags: string[]): boolean {\n return args.some(a => flags.includes(a))\n}\n\nasync function getProjectCompletions(prefix: string): Promise<string[]> {\n try {\n if (!getCredentials()) return []\n \n const client = await createClient()\n \n const { data: { user } } = await client.auth.getUser()\n if (!user) return []\n\n const { data: memberships } = await client\n .from('organization_members')\n .select('organization_id')\n .eq('user_id', user.id)\n\n if (!memberships || memberships.length === 0) return []\n \n const orgIds = memberships.map(m => m.organization_id)\n \n const { data: projects } = await client\n .from('projects')\n .select('name')\n .in('organization_id', orgIds)\n .order('name')\n \n if (!projects) return []\n \n return projects\n .map(p => p.name)\n .filter(name => name.toLowerCase().startsWith(prefix.toLowerCase()))\n } catch {\n return []\n }\n}\n\nasync function getEnvironmentCompletions(prefix: string, projectName?: string): Promise<string[]> {\n try {\n if (!getCredentials()) return []\n \n const client = await createClient()\n const config = loadConfig()\n \n let projectId = config?.project_id\n \n if (projectName) {\n const isUUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n if (isUUID.test(projectName)) {\n projectId = projectName\n } else {\n const { data: project } = await client\n .from('projects')\n .select('id')\n .ilike('name', projectName)\n .single()\n \n if (project) {\n projectId = project.id\n }\n }\n }\n \n const defaultEnvs = ['development', 'staging', 'production', 'test']\n \n if (!projectId) {\n return defaultEnvs.filter(e => e.startsWith(prefix.toLowerCase()))\n }\n \n const { data: environments } = await client\n .from('environments')\n .select('name')\n .eq('project_id', projectId)\n .order('name')\n \n if (!environments) {\n return defaultEnvs.filter(e => e.startsWith(prefix.toLowerCase()))\n }\n \n return environments\n .map(e => e.name)\n .filter(name => name.toLowerCase().startsWith(prefix.toLowerCase()))\n } catch {\n return ['development', 'staging', 'production', 'test']\n .filter(e => e.startsWith(prefix.toLowerCase()))\n }\n}\n\nexport const completeCommand = new Command('__complete')\n .description('Internal command for shell completion')\n .allowUnknownOption()\n .allowExcessArguments()\n .argument('[args...]', 'Arguments to complete')\n .action(async (args: string[]) => {\n try {\n const completions = await getCompletions(args || [])\n completions.forEach(c => console.log(c))\n } catch {\n process.exit(1)\n }\n })\n\nexport const completionCommand = new Command('completion')\n .description('Generate shell completion script')\n .argument('<shell>', 'Shell type: bash, zsh, or fish')\n .action((shell: string) => {\n switch (shell.toLowerCase()) {\n case 'bash':\n console.log(bashScript)\n console.log('\\n# Add to ~/.bashrc:')\n console.log('# eval \"$(envmanager completion bash)\"')\n break\n case 'zsh':\n console.log(zshScript)\n console.log('\\n# Add to ~/.zshrc:')\n console.log('# eval \"$(envmanager completion zsh)\"')\n break\n case 'fish':\n console.log(fishScript)\n console.log('\\n# Save to ~/.config/fish/completions/envmanager.fish:')\n console.log('# envmanager completion fish > ~/.config/fish/completions/envmanager.fish')\n break\n default:\n console.error(`Unknown shell: ${shell}`)\n console.error('Supported: bash, zsh, fish')\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { dirname, resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig, getConfigPath } from '../lib/config.js'\nimport { getCredentials, getApiKeyFromEnv, getStoredApiKey, getStoredApiUrl } from '../lib/credentials.js'\n\nfunction getCliVersion(): string {\n try {\n const __dirname = dirname(fileURLToPath(import.meta.url))\n const pkg = JSON.parse(readFileSync(resolve(__dirname, '../../package.json'), 'utf-8'))\n return pkg.version || 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nexport const debugCommand = new Command('debug')\n .description('Collect diagnostic info for troubleshooting')\n .action(async () => {\n const lines: string[] = []\n const log = (msg: string) => lines.push(msg)\n\n log('=== EnvManager CLI Debug Report ===')\n log(`Timestamp: ${new Date().toISOString()}`)\n log(`CLI Version: ${getCliVersion()}`)\n log(`Node: ${process.version}`)\n log(`Platform: ${process.platform} ${process.arch}`)\n log('')\n\n // Config\n log('--- Config ---')\n const configPath = getConfigPath()\n const config = loadConfig()\n log(`Config file: ${configPath || 'not found'}`)\n if (config) {\n log(` project_id: ${config.project_id || 'not set'}`)\n log(` project_name: ${config.project_name || 'not set'}`)\n log(` environment: ${config.environment || 'not set'}`)\n log(` organization_id: ${config.organization_id || 'not set'}`)\n log(` api_url: ${config.api_url || 'not set'}`)\n }\n log('')\n\n // Auth\n log('--- Authentication ---')\n const envApiKey = getApiKeyFromEnv()\n const storedApiKey = getStoredApiKey()\n const storedApiUrl = getStoredApiUrl()\n const creds = getCredentials()\n\n if (envApiKey) {\n log(`Auth method: Environment API key (${envApiKey.substring(0, 11)}...)`)\n } else if (storedApiKey) {\n log(`Auth method: CLI session key (${storedApiKey.substring(0, 11)}...)`)\n } else if (creds?.accessToken) {\n log('Auth method: Legacy session tokens')\n if (creds.expiresAt) {\n const remaining = Math.round((creds.expiresAt - Date.now()) / 1000)\n log(` Token expires in: ${remaining > 0 ? `${remaining}s` : 'EXPIRED'}`)\n }\n } else {\n log('Auth method: Not authenticated')\n }\n log(`API URL: ${storedApiUrl || process.env.ENVMANAGER_API_URL || 'default (production)'}`)\n log('')\n\n // API connectivity & user\n log('--- API Connection ---')\n try {\n const start = Date.now()\n const client = await createClient()\n const authTime = Date.now() - start\n log(`Auth exchange: ${authTime}ms`)\n\n const userStart = Date.now()\n const { data: { user }, error: userError } = await client.auth.getUser()\n const userTime = Date.now() - userStart\n log(`getUser: ${userTime}ms`)\n\n if (userError) {\n log(` ERROR: ${userError.message}`)\n } else if (user) {\n log(` User ID: ${user.id}`)\n log(` Email: ${user.email}`)\n }\n\n // Orgs\n if (user) {\n const orgStart = Date.now()\n const { data: memberships, error: orgError } = await client\n .from('organization_members')\n .select('organization_id, role, organizations(id, name)')\n .eq('user_id', user.id)\n const orgTime = Date.now() - orgStart\n log(`Org query: ${orgTime}ms`)\n\n if (orgError) {\n log(` ERROR: ${orgError.message}`)\n } else if (memberships) {\n log(` Organizations (${memberships.length}):`)\n memberships.forEach(m => {\n const org = m.organizations as { id: string; name: string } | { id: string; name: string }[] | null\n const orgName = Array.isArray(org) ? org[0]?.name : org?.name || 'Unknown'\n const orgId = Array.isArray(org) ? org[0]?.id : org?.id || '?'\n log(` - ${orgName} (${m.role}) [${orgId.substring(0, 8)}...]`)\n })\n }\n }\n } catch (error) {\n log(` ERROR: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n\n log('')\n log('=== End Debug Report ===')\n\n // Print all lines\n const output = lines.join('\\n')\n console.log(output)\n\n console.log('')\n console.log(chalk.gray('Copy the output above and share it for troubleshooting.'))\n console.log(chalk.gray('Note: API keys are partially redacted. No secrets are exposed.'))\n })\n"],"mappings":"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","names":["Command","readFileSync","dirname","resolve","fileURLToPath","resolve","Command","chalk","Command","chalk","Command","chalk","ora","DEFAULT_API_URL","getApiUrl","Command","chalk","ora","Command","chalk","ora","writeFileSync","existsSync","existsSync","readFileSync","join","join","existsSync","readFileSync","data","error","data","base","source","Command","ora","chalk","existsSync","writeFileSync","Command","chalk","ora","readFileSync","existsSync","resolve","chalk","Command","ora","resolve","chalk","existsSync","readFileSync","Command","chalk","ora","readFileSync","existsSync","resolve","Command","ora","resolve","chalk","existsSync","readFileSync","Command","chalk","ora","Command","ora","chalk","Command","chalk","Command","chalk","Command","chalk","ora","writeFileSync","existsSync","readFileSync","resolve","parseDotenv","resolve","existsSync","readFileSync","parseDotenv","Command","ora","resolve","chalk","existsSync","readFileSync","parseDotenv","writeFileSync","Command","chalk","ora","writeFileSync","existsSync","resolve","yaml","Command","ora","resolve","chalk","existsSync","writeFileSync","Command","chalk","ora","readFileSync","writeFileSync","existsSync","resolve","parseDotenv","Command","ora","resolve","existsSync","chalk","readFileSync","writeFileSync","parseDotenv","Command","chalk","ora","readFileSync","existsSync","resolve","parseDotenv","z","Command","ora","resolve","existsSync","readFileSync","parseDotenv","chalk","Command","Command","Command","chalk","readFileSync","dirname","resolve","__dirname","dirname","pkg","readFileSync","resolve","Command","chalk","__dirname","dirname","fileURLToPath","readFileSync","resolve","Command"]}
1
+ {"version":3,"sources":["../../src/bin/envmanager.ts","../../src/commands/login.ts","../../src/lib/auth.ts","../../src/lib/credentials.ts","../../src/commands/logout.ts","../../src/commands/whoami.ts","../../src/lib/client.ts","../../src/commands/pull.ts","../../src/lib/config.ts","../../src/lib/formatters.ts","../../src/lib/resolve.ts","../../src/lib/variable-references.ts","../../src/commands/push.ts","../../src/lib/parser.ts","../../src/lib/naming-conventions.ts","../../src/commands/diff.ts","../../src/commands/list.ts","../../src/commands/config.ts","../../src/commands/dev.ts","../../src/lib/realtime.ts","../../src/lib/watcher.ts","../../src/lib/conflict.ts","../../src/commands/init.ts","../../src/lib/template-simple.ts","../../src/lib/template-yaml.ts","../../src/commands/template.ts","../../src/commands/validate.ts","../../src/lib/schema.ts","../../src/commands/completion.ts","../../src/commands/debug.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { readFileSync } from 'fs'\nimport { dirname, resolve } from 'path'\nimport { fileURLToPath } from 'url'\nimport { loginCommand } from '../commands/login.js'\nimport { logoutCommand } from '../commands/logout.js'\nimport { whoamiCommand } from '../commands/whoami.js'\nimport { pullCommand } from '../commands/pull.js'\nimport { pushCommand } from '../commands/push.js'\nimport { diffCommand } from '../commands/diff.js'\nimport { listCommand } from '../commands/list.js'\nimport { configCommand } from '../commands/config.js'\nimport { devCommand } from '../commands/dev.js'\nimport { initCommand } from '../commands/init.js'\nimport { templateCommand } from '../commands/template.js'\nimport { validateCommand } from '../commands/validate.js'\nimport { completionCommand, completeCommand } from '../commands/completion.js'\nimport { debugCommand } from '../commands/debug.js'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst pkg = JSON.parse(readFileSync(resolve(__dirname, '../../package.json'), 'utf-8'))\n\nconst program = new Command()\n\nprogram\n .name('envmanager')\n .description('CLI for EnvManager - secure environment variable management')\n .version(pkg.version)\n\nprogram.addCommand(loginCommand)\nprogram.addCommand(logoutCommand)\nprogram.addCommand(whoamiCommand)\nprogram.addCommand(pullCommand)\nprogram.addCommand(pushCommand)\nprogram.addCommand(diffCommand)\nprogram.addCommand(listCommand)\nprogram.addCommand(configCommand)\nprogram.addCommand(devCommand)\nprogram.addCommand(initCommand)\nprogram.addCommand(templateCommand)\nprogram.addCommand(validateCommand)\nprogram.addCommand(completionCommand)\nprogram.addCommand(completeCommand)\nprogram.addCommand(debugCommand)\n\nprogram.parse()\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { loginWithBrowser } from '../lib/auth.js'\nimport { getCredentials } from '../lib/credentials.js'\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with EnvManager')\n .action(async () => {\n const existingCreds = getCredentials()\n if (existingCreds?.email) {\n console.log(chalk.yellow(`Already logged in as ${existingCreds.email}`))\n console.log(chalk.gray('Run `envmanager logout` first to switch accounts.'))\n return\n }\n\n const spinner = ora('Opening browser for authentication...').start()\n \n try {\n spinner.text = 'Waiting for authentication...'\n const { email } = await loginWithBrowser()\n \n spinner.succeed('Authentication successful!')\n \n if (email) {\n console.log(chalk.green(`\\nLogged in as ${email}`))\n }\n \n console.log(chalk.gray('\\nYou can now use envmanager commands.'))\n console.log(chalk.gray('Run `envmanager list` to see your projects.'))\n } catch (error) {\n spinner.fail('Login failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { createServer, IncomingMessage, ServerResponse } from 'http'\nimport { randomBytes, createHash } from 'crypto'\nimport open from 'open'\nimport { saveCredentials, getCredentials, isTokenExpired, shouldRefreshToken, getStoredApiKey, getStoredApiUrl } from './credentials.js'\n\nconst DEFAULT_APP_URL = 'https://envmanager.com'\nconst DEFAULT_API_URL = 'https://rhopfaburfflrdwpowcd.supabase.co'\n\nfunction getAppUrl(): string {\n return process.env.ENVMANAGER_APP_URL || DEFAULT_APP_URL\n}\n\nfunction getApiUrl(): string {\n return process.env.ENVMANAGER_API_URL || getStoredApiUrl() || DEFAULT_API_URL\n}\n\nfunction generateCodeVerifier(): string {\n return randomBytes(32).toString('base64url')\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return createHash('sha256').update(verifier).digest('base64url')\n}\n\nfunction generateState(): string {\n return randomBytes(16).toString('hex')\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\ninterface AuthCallbackResult {\n apiKey?: string\n accessToken?: string\n refreshToken?: string\n expiresIn?: number\n}\n\nasync function startCallbackServer(expectedState: string, port: number = 8976): Promise<AuthCallbackResult> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n server.close()\n reject(new Error('Authentication timed out after 5 minutes'))\n }, 5 * 60 * 1000)\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url || '/', `http://localhost:${port}`)\n \n if (url.pathname === '/callback') {\n const apiKey = url.searchParams.get('api_key')\n const accessToken = url.searchParams.get('access_token')\n const refreshToken = url.searchParams.get('refresh_token')\n const expiresIn = url.searchParams.get('expires_in')\n const state = url.searchParams.get('state')\n const error = url.searchParams.get('error')\n const errorDescription = url.searchParams.get('error_description')\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Authentication Failed</h1>\n <p>${escapeHtml(errorDescription || error || 'Unknown error')}</p>\n <p>You can close this window.</p>\n </body>\n </html>\n `)\n clearTimeout(timeout)\n server.close()\n reject(new Error(errorDescription || error))\n return\n }\n\n // Accept either API key (new flow) or session tokens (legacy/fallback)\n if (!apiKey && (!accessToken || !refreshToken)) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Invalid Callback</h1>\n <p>Missing authentication credentials.</p>\n </body>\n </html>\n `)\n clearTimeout(timeout)\n server.close()\n reject(new Error('Invalid callback: missing credentials'))\n return\n }\n\n if (!state || state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Invalid State</h1>\n <p>State mismatch - possible CSRF attack.</p>\n </body>\n </html>\n `)\n clearTimeout(timeout)\n server.close()\n reject(new Error('State mismatch - authentication failed'))\n return\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; padding: 40px; text-align: center;\">\n <h1>Authentication Successful!</h1>\n <p>You can close this window and return to your terminal.</p>\n </body>\n </html>\n `)\n\n clearTimeout(timeout)\n server.close()\n\n // Return API key if present (new flow), otherwise return tokens (legacy)\n if (apiKey) {\n resolve({ apiKey })\n } else {\n resolve({\n accessToken: accessToken!,\n refreshToken: refreshToken!,\n expiresIn: parseInt(expiresIn || '3600', 10)\n })\n }\n } else {\n res.writeHead(404)\n res.end('Not found')\n }\n })\n\n server.listen(port, '127.0.0.1', () => {})\n \n server.on('error', (err: Error & { code?: string }) => {\n clearTimeout(timeout)\n if (err.code === 'EADDRINUSE') {\n reject(new Error(`Port ${port} is already in use. Please close the application using it.`))\n } else {\n reject(err)\n }\n })\n })\n}\n\ninterface TokenResponse {\n access_token: string\n refresh_token: string\n expires_in: number\n user?: {\n id: string\n email?: string\n }\n}\n\nasync function exchangeCodeForTokens(code: string, codeVerifier: string): Promise<TokenResponse> {\n const apiUrl = getApiUrl()\n const response = await fetch(`${apiUrl}/functions/v1/cli-auth-callback`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n code,\n code_verifier: codeVerifier,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string }\n throw new Error(errorData.error || `HTTP ${response.status}`)\n }\n\n return response.json() as Promise<TokenResponse>\n}\n\n// In-memory cache for exchanged API key tokens (process lifetime only)\nlet cachedToken: { accessToken: string; refreshToken: string; expiresAt: number } | null = null\n\nexport function clearCachedToken(): void {\n cachedToken = null\n}\n\nexport async function refreshTokens(): Promise<void> {\n const credentials = getCredentials()\n if (!credentials?.refreshToken) {\n throw new Error('No refresh token available')\n }\n\n const apiUrl = getApiUrl()\n const response = await fetch(`${apiUrl}/functions/v1/cli-auth-refresh`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n refresh_token: credentials.refreshToken,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: `HTTP ${response.status}` })) as { error?: string }\n const errorMessage = errorData.error || `HTTP ${response.status}`\n throw new Error(`Token refresh failed: ${errorMessage}`)\n }\n\n const tokens = await response.json() as TokenResponse\n \n saveCredentials({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt: Date.now() + tokens.expires_in * 1000,\n email: credentials.email,\n })\n}\n\nexport async function exchangeApiKeyForToken(apiKey: string): Promise<TokenResponse> {\n const apiUrl = getApiUrl()\n const response = await fetch(`${apiUrl}/functions/v1/cli-api-key-auth`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string }\n throw new Error(errorData.error || `HTTP ${response.status}`)\n }\n\n return response.json() as Promise<TokenResponse>\n}\n\nexport async function loginWithBrowser(): Promise<{ email?: string }> {\n const state = generateState()\n const port = 8976\n const redirectUri = `http://localhost:${port}/callback`\n\n const appUrl = getAppUrl()\n const authUrl = new URL(`${appUrl}/auth/cli-login`)\n authUrl.searchParams.set('redirect_uri', redirectUri)\n authUrl.searchParams.set('state', state)\n\n const serverPromise = startCallbackServer(state, port)\n\n await open(authUrl.toString())\n\n const result = await serverPromise\n\n // New flow: API key based authentication\n if (result.apiKey) {\n saveCredentials({\n apiKey: result.apiKey,\n apiUrl: getApiUrl(),\n })\n return {}\n }\n\n // Legacy flow: session tokens (fallback)\n saveCredentials({\n accessToken: result.accessToken!,\n refreshToken: result.refreshToken!,\n expiresAt: Date.now() + (result.expiresIn || 3600) * 1000,\n apiUrl: getApiUrl(),\n })\n\n return {}\n}\n\nexport async function ensureAuthenticated(): Promise<string> {\n const credentials = getCredentials()\n\n if (!credentials) {\n throw new Error('Not authenticated. Run `envmanager login` first.')\n }\n\n // New flow: API key based authentication\n const storedApiKey = getStoredApiKey()\n if (storedApiKey) {\n // Return cached token if still valid (with 5-minute buffer)\n if (cachedToken && Date.now() < cachedToken.expiresAt - 5 * 60 * 1000) {\n return cachedToken.accessToken\n }\n\n const tokens = await exchangeApiKeyForToken(storedApiKey)\n cachedToken = {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt: Date.now() + tokens.expires_in * 1000,\n }\n return cachedToken.accessToken\n }\n\n // Legacy flow: session token refresh\n if (shouldRefreshToken() || isTokenExpired()) {\n try {\n await refreshTokens()\n const newCreds = getCredentials()\n if (newCreds?.accessToken) {\n return newCreds.accessToken\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n throw new Error(`Session refresh failed: ${message}\\nRun \\`envmanager login\\` to re-authenticate.`)\n }\n }\n\n if (!credentials.accessToken) {\n throw new Error('Not authenticated. Run `envmanager login` first.')\n }\n\n return credentials.accessToken\n}\n\nexport async function tryRefreshToken(): Promise<boolean> {\n try {\n if (shouldRefreshToken() || isTokenExpired()) {\n await refreshTokens()\n return true\n }\n return false\n } catch {\n return false\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync } from 'fs'\nimport { homedir } from 'os'\nimport { join } from 'path'\n\nconst CONFIG_DIR = join(homedir(), '.config', 'envmanager')\nconst CREDENTIALS_FILE = join(CONFIG_DIR, 'auth.json')\n\ninterface Credentials {\n // New flow: API key based auth (preferred)\n apiKey?: string\n // Legacy flow: session tokens\n accessToken?: string\n refreshToken?: string\n expiresAt?: number\n // Common\n apiUrl?: string\n email?: string\n}\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 })\n }\n}\n\nexport function getCredentials(): Credentials | null {\n if (!existsSync(CREDENTIALS_FILE)) {\n return null\n }\n\n try {\n const content = readFileSync(CREDENTIALS_FILE, 'utf-8')\n return JSON.parse(content) as Credentials\n } catch {\n return null\n }\n}\n\nexport function saveCredentials(credentials: Credentials): void {\n ensureConfigDir()\n writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), { mode: 0o600 })\n chmodSync(CREDENTIALS_FILE, 0o600)\n}\n\nexport function clearCredentials(): void {\n if (existsSync(CREDENTIALS_FILE)) {\n unlinkSync(CREDENTIALS_FILE)\n }\n}\n\nexport function isTokenExpired(): boolean {\n const creds = getCredentials()\n if (!creds) return true\n // API key auth doesn't expire in the same way - let the server validate\n if (creds.apiKey) return false\n if (!creds.expiresAt) return true\n return Date.now() >= creds.expiresAt\n}\n\nconst PROACTIVE_REFRESH_BUFFER_MS = 5 * 60 * 1000\n\nexport function shouldRefreshToken(): boolean {\n const creds = getCredentials()\n if (!creds) return false\n // API key auth doesn't need proactive refresh\n if (creds.apiKey) return false\n if (!creds.expiresAt) return false\n return Date.now() >= (creds.expiresAt - PROACTIVE_REFRESH_BUFFER_MS)\n}\n\nexport function getApiKeyFromEnv(): string | null {\n return process.env.ENVMANAGER_API_KEY || null\n}\n\nexport function getStoredApiKey(): string | null {\n const creds = getCredentials()\n return creds?.apiKey || null\n}\n\nexport function getStoredApiUrl(): string | null {\n const creds = getCredentials()\n return creds?.apiUrl || null\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { clearCredentials, getCredentials } from '../lib/credentials.js'\n\nexport const logoutCommand = new Command('logout')\n .description('Log out of EnvManager')\n .action(() => {\n const creds = getCredentials()\n \n if (!creds) {\n console.log(chalk.yellow('Not currently logged in.'))\n return\n }\n \n const email = creds.email || 'unknown user'\n clearCredentials()\n console.log(chalk.green(`Logged out from ${email}`))\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { getCredentials, isTokenExpired, getApiKeyFromEnv, getStoredApiKey } from '../lib/credentials.js'\nimport { createClient } from '../lib/client.js'\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show current user and team memberships')\n .action(async () => {\n const envApiKey = getApiKeyFromEnv()\n const storedApiKey = getStoredApiKey()\n\n if (envApiKey) {\n console.log(chalk.blue('Authenticated via environment API key'))\n console.log(chalk.gray(`Key prefix: ${envApiKey.substring(0, 11)}...`))\n return\n }\n\n const creds = getCredentials()\n\n if (!creds) {\n console.log(chalk.yellow('Not logged in.'))\n console.log(chalk.gray('Run `envmanager login` to authenticate.'))\n return\n }\n\n // New flow: API key from login\n if (storedApiKey) {\n // Continue to fetch user info below\n } else if (isTokenExpired()) {\n // Legacy flow: session tokens\n console.log(chalk.yellow('Session expired.'))\n console.log(chalk.gray('Run `envmanager login` to re-authenticate.'))\n return\n }\n\n const spinner = ora('Fetching user info...').start()\n\n try {\n const client = await createClient()\n \n const { data: { user }, error: userError } = await client.auth.getUser()\n \n if (userError || !user) {\n spinner.fail('Failed to fetch user')\n console.error(chalk.red(userError?.message || 'Unknown error'))\n return\n }\n\n const { data: memberships, error: memberError } = await client\n .from('organization_members')\n .select('role, organizations(name)')\n .eq('user_id', user.id)\n \n if (memberError) {\n spinner.fail('Failed to fetch memberships')\n console.error(chalk.red(memberError.message))\n return\n }\n\n spinner.stop()\n\n console.log(chalk.green(`Logged in as ${user.email}`))\n\n if (storedApiKey) {\n console.log(chalk.gray(`Authenticated via CLI session key (${storedApiKey.substring(0, 11)}...)`))\n } else if (creds.expiresAt) {\n const expiresIn = Math.round((creds.expiresAt - Date.now()) / 1000 / 60)\n if (expiresIn > 0) {\n console.log(chalk.gray(`Session expires in ${expiresIn} minutes`))\n }\n }\n\n if (memberships && memberships.length > 0) {\n console.log('')\n console.log(chalk.white('Organizations:'))\n memberships.forEach(m => {\n const org = m.organizations as { name: string } | { name: string }[] | null\n const orgName = Array.isArray(org) ? org[0]?.name : org?.name || 'Unknown'\n console.log(` ${orgName} ${chalk.gray(`(${m.role})`)}`)\n })\n }\n\n } catch (error) {\n spinner.fail('Failed to fetch user info')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n }\n })\n","import { createClient as createSupabaseClient, SupabaseClient } from '@supabase/supabase-js'\nimport { getCredentials, getApiKeyFromEnv, getStoredApiUrl, getStoredApiKey } from './credentials.js'\nimport { ensureAuthenticated, exchangeApiKeyForToken, clearCachedToken } from './auth.js'\n\nconst DEFAULT_API_URL = 'https://rhopfaburfflrdwpowcd.supabase.co'\nconst DEFAULT_ANON_KEY = 'sb_publishable_Y2EpPiIN3KPjQMc1GLVXjw__ghRVLC4'\nconst LOCAL_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0'\n\nfunction getApiUrl(): string {\n return process.env.ENVMANAGER_API_URL || getStoredApiUrl() || DEFAULT_API_URL\n}\n\nfunction getAnonKey(): string {\n const apiUrl = getApiUrl()\n if (apiUrl.includes('localhost') || apiUrl.includes('127.0.0.1')) {\n return LOCAL_ANON_KEY\n }\n return process.env.ENVMANAGER_ANON_KEY || DEFAULT_ANON_KEY\n}\n\nlet clientInstance: SupabaseClient | null = null\nlet currentAccessToken: string | null = null\n\nexport async function createClient(): Promise<SupabaseClient> {\n if (clientInstance) {\n return clientInstance\n }\n\n // Priority: 1. Environment API key, 2. Stored API key (from login), 3. Session tokens\n const apiKey = getApiKeyFromEnv() || getStoredApiKey()\n\n if (apiKey) {\n const tokenResponse = await exchangeApiKeyForToken(apiKey)\n currentAccessToken = tokenResponse.access_token\n\n clientInstance = createSupabaseClient(getApiUrl(), getAnonKey(), {\n global: {\n headers: {\n Authorization: `Bearer ${currentAccessToken}`\n }\n }\n })\n\n await clientInstance.realtime.setAuth(currentAccessToken)\n return clientInstance\n }\n\n // Legacy flow: session tokens\n currentAccessToken = await ensureAuthenticated()\n\n clientInstance = createSupabaseClient(getApiUrl(), getAnonKey(), {\n global: {\n headers: {\n Authorization: `Bearer ${currentAccessToken}`\n }\n }\n })\n\n await clientInstance.realtime.setAuth(currentAccessToken)\n\n return clientInstance\n}\n\nexport function getAccessToken(): string | null {\n return currentAccessToken\n}\n\nexport async function refreshClientAuth(): Promise<void> {\n if (!clientInstance) return\n\n const accessToken = await ensureAuthenticated()\n currentAccessToken = accessToken\n\n // Update the realtime connection's auth token (preserves active channels)\n await clientInstance.realtime.setAuth(accessToken)\n}\n\nexport function resetClient(): void {\n clientInstance = null\n currentAccessToken = null\n clearCachedToken()\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { writeFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { Variable } from '../lib/types.js'\nimport { resolveAll, detectCircularReferences, type VariableInput, type ResolvedVariable } from '../lib/variable-references.js'\nimport { formatVariables, sanitizeK8sName, EXPORT_FORMATS, type ExportFormat, type ExportVariable, type K8sConfig } from '../lib/formatters.js'\n\nexport const pullCommand = new Command('pull')\n .description('Pull environment variables from EnvManager to local .env file')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: from config or \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('-o, --output <file>', 'Output file path (default: .env)')\n .option('--no-secrets', 'Exclude secret values (will be empty)')\n .option('-f, --force', 'Overwrite existing file without prompting')\n .option('-r, --resolve-references', 'Resolve ${VAR} references to their values')\n .option('-F, --include-fallbacks', 'Include fallback values for empty variables')\n .option('-s, --show-sources', 'Show value source as inline comments')\n .option('--format <type>', `Export format (${EXPORT_FORMATS.join(', ')})`)\n .option('--k8s-namespace <ns>', 'Kubernetes namespace (default: \"default\")')\n .option('--k8s-name <name>', 'Kubernetes resource name')\n .option('--tag <tags...>', 'Filter by tags (untagged variables always included)')\n .action(async (options) => {\n const spinner = ora('Connecting to EnvManager...').start()\n\n try {\n const config = loadConfig()\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const outputFile = resolve(options.output || config?.output || '.env')\n const includeSecrets = options.secrets !== false\n const shouldResolve = options.resolveReferences === true\n const shouldFallback = options.includeFallbacks === true\n const shouldShowSources = options.showSources === true\n\n // Resolve export format\n const formatInput = options.format || config?.format || 'dotenv'\n if (!EXPORT_FORMATS.includes(formatInput)) {\n spinner.fail(`Invalid format \"${formatInput}\". Valid formats: ${EXPORT_FORMATS.join(', ')}`)\n process.exit(1)\n }\n const format = formatInput as ExportFormat\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name> or create envmanager.json'))\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n // Resolve project (accepts UUID, friendly ID, or name)\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environments, error: envError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environments) {\n spinner.fail(`Environment \"${envName}\" not found in project`)\n console.log(chalk.gray('\\nAvailable environments:'))\n const { data: allEnvs } = await client\n .from('environments')\n .select('name')\n .eq('project_id', projectId)\n allEnvs?.forEach(e => console.log(chalk.gray(` - ${e.name}`)))\n process.exit(1)\n }\n\n const environmentId = environments.id\n\n spinner.text = 'Fetching variables...'\n const rpcParams: Record<string, unknown> = {\n p_environment_id: environmentId,\n p_sync_secrets: includeSecrets,\n p_sync_variables: true,\n p_include_fallbacks: shouldFallback || false,\n }\n\n const { data: variables, error: varError } = await client.rpc('get_variables_for_sync', rpcParams)\n\n if (varError) {\n spinner.fail('Failed to fetch variables')\n console.error(chalk.red(varError.message))\n process.exit(1)\n }\n\n if (!variables || variables.length === 0) {\n spinner.warn('No variables found')\n process.exit(0)\n }\n\n if (existsSync(outputFile) && !options.force) {\n spinner.stop()\n console.log(chalk.yellow(`\\nFile ${outputFile} already exists.`))\n console.log(chalk.gray('Use --force to overwrite.'))\n process.exit(1)\n }\n\n const filterTags: string[] = options.tag || config?.tags || []\n const vars = filterTags.length > 0\n ? (variables as Variable[])\n .filter(v => {\n const t = v.tags || []\n return t.length === 0 || t.some(tag => filterTags.includes(tag))\n })\n .sort((a, b) => a.key.localeCompare(b.key))\n : (variables as Variable[]).sort((a, b) => a.key.localeCompare(b.key))\n\n // Resolve references if requested\n let resolvedMap: Map<string, ResolvedVariable> | null = null\n if (shouldResolve) {\n spinner.text = 'Resolving variable references...'\n\n const inputs: VariableInput[] = vars.map(v => ({\n key: v.key,\n value: v.value,\n fallbackValue: v.fallback_value ?? null,\n isSecret: v.is_secret,\n }))\n\n // Warn about circular references\n const cycles = detectCircularReferences(inputs)\n if (cycles.length > 0) {\n spinner.stop()\n for (const cycle of cycles) {\n console.log(chalk.yellow(`Warning: circular reference detected: ${cycle.join(' -> ')} -> ${cycle[0]}`))\n }\n spinner.start('Resolving variable references...')\n }\n\n const resolved = resolveAll(inputs)\n resolvedMap = new Map(resolved.map(r => [r.key, r]))\n }\n\n spinner.text = `Writing ${format} output...`\n\n // Build export variables with resolved/fallback values\n const exportVars: ExportVariable[] = vars.map(v => {\n let value: string\n if (resolvedMap) {\n value = resolvedMap.get(v.key)!.resolvedValue\n } else if (shouldFallback && (!v.value || v.value === '') && v.fallback_value) {\n value = v.fallback_value\n } else {\n value = v.value || ''\n }\n return { key: v.key, value, isSecret: v.is_secret }\n })\n\n let content: string\n if (format === 'dotenv' && (shouldShowSources || shouldResolve)) {\n // Dotenv with inline comments needs special handling\n content = vars\n .map(v => {\n let value: string\n let source: ResolvedVariable['source'] | null = null\n\n if (resolvedMap) {\n const resolved = resolvedMap.get(v.key)!\n value = resolved.resolvedValue\n source = resolved.source\n } else if (shouldFallback && (!v.value || v.value === '') && v.fallback_value) {\n value = v.fallback_value\n source = 'fallback'\n } else {\n value = v.value || ''\n }\n\n const needsQuotes = value.includes(' ') || value.includes('\\n') || value.includes('\"')\n const formattedValue = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value\n let line = `${v.key}=${formattedValue}`\n\n if (shouldShowSources && resolvedMap) {\n const resolved = resolvedMap.get(v.key)!\n if (resolved.references.length > 0 && resolved.source !== 'empty') {\n line += ` # resolved from ${resolved.rawValue ?? v.value ?? ''}`\n } else if (resolved.source === 'fallback') {\n line += ` # fallback value`\n }\n } else if (shouldShowSources && source === 'fallback') {\n line += ` # fallback value`\n }\n\n return line\n })\n .join('\\n')\n } else {\n // Build k8s config if needed\n let k8sConfig: K8sConfig | undefined\n if (format === 'k8s-secret' || format === 'k8s-configmap') {\n const defaultName = format === 'k8s-secret' ? 'app-secrets' : 'app-config'\n k8sConfig = {\n name: sanitizeK8sName(options.k8sName || config?.k8s_name || defaultName),\n namespace: options.k8sNamespace || config?.k8s_namespace || 'default',\n }\n }\n content = formatVariables(exportVars, format, k8sConfig)\n }\n\n writeFileSync(outputFile, content + '\\n')\n\n const secretCount = vars.filter(v => v.is_secret).length\n const plainCount = vars.length - secretCount\n\n const tagInfo = filterTags.length > 0 ? ` (tags: ${filterTags.join(', ')})` : ''\n spinner.succeed(`Pulled ${vars.length} variables to ${outputFile} (${format})${tagInfo}`)\n console.log(chalk.gray(` ${plainCount} plain, ${secretCount} secrets`))\n\n // Fire-and-forget: log CLI pull access\n client.rpc('log_variable_access', {\n p_environment_id: environmentId,\n p_access_type: 'cli_pull',\n p_metadata: { cli_version: '0.1.1' },\n }).then(() => {}, () => { /* ignore tracking failures */ })\n\n } catch (error) {\n spinner.fail('Pull failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { existsSync, readFileSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { z } from 'zod'\nimport { EXPORT_FORMATS } from './formatters.js'\n\nconst ConfigSchema = z.object({\n project_id: z.string().uuid().optional(),\n project_name: z.string().optional(),\n environment: z.string().optional(),\n environment_id: z.string().uuid().optional(),\n organization_id: z.string().uuid().optional(),\n output: z.string().default('.env'),\n api_url: z.string().url().optional(),\n format: z.enum(EXPORT_FORMATS as [string, ...string[]]).optional(),\n k8s_namespace: z.string().optional(),\n k8s_name: z.string().optional(),\n tags: z.array(z.string()).optional(),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\n\nconst CONFIG_FILENAMES = ['envmanager.json', '.envmanagerrc']\n\nfunction findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = startDir\n \n while (currentDir !== dirname(currentDir)) {\n for (const filename of CONFIG_FILENAMES) {\n const configPath = join(currentDir, filename)\n if (existsSync(configPath)) {\n return configPath\n }\n }\n currentDir = dirname(currentDir)\n }\n \n return null\n}\n\nexport function loadConfig(): Config | null {\n const configPath = findConfigFile()\n \n if (!configPath) {\n return null\n }\n \n try {\n const content = readFileSync(configPath, 'utf-8')\n const parsed = JSON.parse(content)\n return ConfigSchema.parse(parsed)\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error('Invalid config file:', error.errors)\n }\n return null\n }\n}\n\nexport function getConfigPath(): string | null {\n return findConfigFile()\n}\n","import * as yaml from 'js-yaml'\n\nexport type ExportFormat = 'dotenv' | 'docker-compose' | 'k8s-secret' | 'k8s-configmap' | 'vercel' | 'railway' | 'render'\n\nexport const EXPORT_FORMATS: ExportFormat[] = [\n 'dotenv', 'docker-compose', 'k8s-secret', 'k8s-configmap', 'vercel', 'railway', 'render'\n]\n\nexport interface ExportVariable {\n key: string\n value: string\n isSecret: boolean\n}\n\nexport interface K8sConfig {\n name: string\n namespace: string\n}\n\n/**\n * Sanitize a name to be valid K8s resource name (DNS subdomain format)\n */\nexport function sanitizeK8sName(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/^-+|-+$/g, '')\n .substring(0, 63)\n}\n\nexport function toDotEnv(variables: ExportVariable[]): string {\n return variables\n .map(v => {\n const needsQuotes = /[\\s='\"#\\n\\r]/.test(v.value)\n const value = needsQuotes\n ? `\"${v.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`\n : v.value\n return `${v.key}=${value}`\n })\n .join('\\n')\n}\n\nexport function toDockerCompose(variables: ExportVariable[]): string {\n const envData: Record<string, string> = {}\n for (const v of variables) {\n envData[v.key] = v.value\n }\n\n const snippet = {\n services: {\n app: {\n environment: envData\n }\n }\n }\n\n const yamlOutput = yaml.dump(snippet, { lineWidth: -1, quotingType: '\"' })\n\n return `# Docker Compose environment section\\n# Copy this into your docker-compose.yml and replace 'app' with your service name\\n${yamlOutput}`\n}\n\nexport function toKubernetesSecret(variables: ExportVariable[], config: K8sConfig): string {\n const data: Record<string, string> = {}\n for (const v of variables) {\n data[v.key] = Buffer.from(v.value).toString('base64')\n }\n\n const manifest = {\n apiVersion: 'v1',\n kind: 'Secret',\n metadata: {\n name: config.name,\n namespace: config.namespace,\n },\n type: 'Opaque',\n data\n }\n\n return yaml.dump(manifest, { lineWidth: -1, quotingType: '\"' })\n}\n\nexport function toKubernetesConfigMap(variables: ExportVariable[], config: K8sConfig): string {\n const data: Record<string, string> = {}\n for (const v of variables) {\n data[v.key] = v.value\n }\n\n const manifest = {\n apiVersion: 'v1',\n kind: 'ConfigMap',\n metadata: {\n name: config.name,\n namespace: config.namespace,\n },\n data\n }\n\n return yaml.dump(manifest, { lineWidth: -1, quotingType: '\"' })\n}\n\nexport function toVercelCLI(variables: ExportVariable[]): string {\n if (variables.length === 0) return '# No variables to export'\n\n const header = `# Vercel CLI commands to add environment variables\n# Run these commands in your project directory\n# Docs: https://vercel.com/docs/cli/env\n# Note: You may need to run 'vercel login' first\n\n`\n\n const commands = variables.map(v => {\n if (v.value.includes('\\n')) {\n const escapedValue = v.value.replace(/'/g, \"'\\\\''\")\n return `vercel env add ${v.key} production << 'EOF'\\n${escapedValue}\\nEOF`\n } else {\n const escapedValue = v.value.replace(/'/g, \"'\\\\''\")\n return `echo '${escapedValue}' | vercel env add ${v.key} production`\n }\n }).join('\\n\\n')\n\n return header + commands\n}\n\nexport function toRailwayCLI(variables: ExportVariable[]): string {\n if (variables.length === 0) return '# No variables to export'\n\n const header = `# Railway CLI commands to set environment variables\n# Run these commands in your project directory\n# Docs: https://docs.railway.app/reference/cli-api#variables-set\n# Note: You may need to run 'railway login' first\n\n`\n\n const commands = variables.map(v => {\n const escapedValue = v.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n return `railway variables set ${v.key}=\"${escapedValue}\"`\n }).join('\\n')\n\n return header + commands\n}\n\nexport function toRenderCLI(variables: ExportVariable[]): string {\n if (variables.length === 0) return '# No variables to export'\n\n const header = `# Render CLI commands to set environment variables\n# Run these commands in your project directory\n# Docs: https://render.com/docs/cli\n# Note: You may need to authenticate first\n\n`\n\n const commands = variables.map(v => {\n const escapedValue = v.value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n return `render env:set ${v.key}=\"${escapedValue}\"`\n }).join('\\n')\n\n return header + commands\n}\n\nexport function formatVariables(\n variables: ExportVariable[],\n format: ExportFormat,\n k8sConfig?: K8sConfig\n): string {\n switch (format) {\n case 'dotenv':\n return toDotEnv(variables)\n case 'docker-compose':\n return toDockerCompose(variables)\n case 'k8s-secret':\n return toKubernetesSecret(variables, k8sConfig ?? { name: 'app-secrets', namespace: 'default' })\n case 'k8s-configmap':\n return toKubernetesConfigMap(variables, k8sConfig ?? { name: 'app-config', namespace: 'default' })\n case 'vercel':\n return toVercelCLI(variables)\n case 'railway':\n return toRailwayCLI(variables)\n case 'render':\n return toRenderCLI(variables)\n }\n}\n","import { SupabaseClient } from '@supabase/supabase-js'\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\n/**\n * Strip optional '#' prefix and return the cleaned input.\n */\nfunction cleanProjectInput(input: string): string {\n return input.startsWith('#') ? input.slice(1) : input\n}\n\n/**\n * Resolve a project identifier (UUID, friendly ID, or name) to a UUID.\n * @param input - UUID, \"#N\" friendly ID, numeric friendly ID, or project name\n * @param client - Supabase client\n * @param organizationId - Organization context (required for friendly ID/name lookup)\n */\nexport async function resolveProjectId(\n input: string,\n client: SupabaseClient,\n organizationId: string\n): Promise<string> {\n const cleaned = cleanProjectInput(input)\n\n // If UUID, return directly\n if (UUID_REGEX.test(cleaned)) {\n return cleaned\n }\n\n // If numeric, treat as friendly_id\n if (/^\\d+$/.test(cleaned)) {\n const friendlyId = parseInt(cleaned, 10)\n if (friendlyId < 1) {\n throw new Error('Project ID must be 1 or greater')\n }\n\n const { data, error } = await client\n .from('projects')\n .select('id')\n .eq('organization_id', organizationId)\n .eq('friendly_id', friendlyId)\n .single()\n\n if (error || !data) {\n throw new Error(`Project with ID ${friendlyId} not found in this organization`)\n }\n return data.id\n }\n\n // Otherwise treat as name (case-insensitive)\n const { data, error } = await client\n .from('projects')\n .select('id')\n .eq('organization_id', organizationId)\n .ilike('name', cleaned)\n .single()\n\n if (error || !data) {\n throw new Error(`Project \"${input}\" not found in this organization`)\n }\n return data.id\n}\n\n/**\n * Resolve an environment identifier to a UUID.\n */\nexport async function resolveEnvironmentId(\n input: string,\n client: SupabaseClient,\n projectId: string\n): Promise<string> {\n // If UUID, return directly\n if (UUID_REGEX.test(input)) {\n return input\n }\n\n // If numeric, treat as friendly_id\n if (/^\\d+$/.test(input)) {\n const friendlyId = parseInt(input, 10)\n if (friendlyId < 1) {\n throw new Error('Environment ID must be 1 or greater')\n }\n\n const { data, error } = await client\n .from('environments')\n .select('id')\n .eq('project_id', projectId)\n .eq('friendly_id', friendlyId)\n .single()\n\n if (error || !data) {\n throw new Error(`Environment with ID ${friendlyId} not found in this project`)\n }\n return data.id\n }\n\n // Otherwise treat as name\n const { data, error } = await client\n .from('environments')\n .select('id')\n .eq('project_id', projectId)\n .ilike('name', input)\n .single()\n\n if (error || !data) {\n throw new Error(`Environment \"${input}\" not found in this project`)\n }\n return data.id\n}\n\n/**\n * Resolve organization context. Auto-selects for single-org users.\n * When multiple orgs exist and a project hint is provided, tries to\n * auto-detect the org by searching for the project across all orgs.\n * @param input - Organization name (optional for single-org users)\n * @param client - Supabase client\n * @param projectHint - Optional project identifier to auto-detect org from\n */\nexport async function resolveOrganizationId(\n input: string | undefined,\n client: SupabaseClient,\n projectHint?: string\n): Promise<string> {\n // Get current user ID to scope query (platform admins bypass RLS otherwise)\n const { data: { user } } = await client.auth.getUser()\n if (!user) throw new Error('Not authenticated')\n\n // Fetch only this user's organizations\n const { data: memberships, error: memberError } = await client\n .from('organization_members')\n .select('organization_id, organizations(id, name)')\n .eq('user_id', user.id)\n\n if (memberError || !memberships || memberships.length === 0) {\n throw new Error('No organizations found. Create one at envmanager.dev')\n }\n\n // Single org: auto-select if no input\n if (memberships.length === 1 && !input) {\n return memberships[0].organization_id\n }\n\n // Explicit --org provided: find by name\n if (input) {\n const match = memberships.find(m => {\n const org = (m.organizations as unknown) as { name: string } | null\n return org?.name?.toLowerCase() === input.toLowerCase()\n })\n\n if (!match) {\n throw new Error(`Organization \"${input}\" not found or you don't have access`)\n }\n\n return match.organization_id\n }\n\n // Multiple orgs, no --org: try to auto-detect from project\n if (projectHint) {\n const orgId = await detectOrgFromProject(projectHint, client, memberships)\n if (orgId) return orgId\n }\n\n // Fallback: list orgs for user\n const orgList = memberships\n .map(m => {\n const org = (m.organizations as unknown) as { name: string } | null\n return org?.name || 'Unknown'\n })\n .join(', ')\n throw new Error(`Multiple organizations found. Use --org to specify: ${orgList}`)\n}\n\n/**\n * Try to find which org a project belongs to by searching across all user's orgs.\n * Returns the org ID if found in exactly one org, null otherwise.\n */\nasync function detectOrgFromProject(\n projectInput: string,\n client: SupabaseClient,\n memberships: { organization_id: string }[]\n): Promise<string | null> {\n const cleaned = cleanProjectInput(projectInput)\n const orgIds = memberships.map(m => m.organization_id)\n\n // UUID: direct lookup\n if (UUID_REGEX.test(cleaned)) {\n const { data } = await client\n .from('projects')\n .select('organization_id')\n .eq('id', cleaned)\n .in('organization_id', orgIds)\n .single()\n return data?.organization_id ?? null\n }\n\n // Friendly ID (numeric)\n if (/^\\d+$/.test(cleaned)) {\n const friendlyId = parseInt(cleaned, 10)\n const { data } = await client\n .from('projects')\n .select('organization_id')\n .in('organization_id', orgIds)\n .eq('friendly_id', friendlyId)\n\n if (data && data.length === 1) return data[0].organization_id\n return null // ambiguous or not found\n }\n\n // Name (case-insensitive)\n const { data } = await client\n .from('projects')\n .select('organization_id')\n .in('organization_id', orgIds)\n .ilike('name', cleaned)\n\n if (data && data.length === 1) return data[0].organization_id\n return null // ambiguous or not found\n}\n","// SYNC: also update utils/variable-references.ts\n\nexport const REFERENCE_PATTERN = /\\$\\{([A-Z_][A-Z0-9_]*)\\}/g\nexport const MAX_DEPTH = 10\n\nexport interface VariableInput {\n key: string\n value: string | null\n fallbackValue?: string | null\n isSecret?: boolean\n}\n\nexport interface ResolvedVariable {\n key: string\n rawValue: string | null\n resolvedValue: string\n source: 'explicit' | 'fallback' | 'empty'\n references: string[]\n referencedBy: string[]\n unresolvedRefs: string[]\n hasCircularRef: boolean\n}\n\n/**\n * Extract ${VAR} tokens from a value string.\n * Escaped \\${ sequences are ignored.\n */\nexport function parseReferences(value: string): string[] {\n // Remove escaped sequences before parsing\n const cleaned = value.replace(/\\\\\\$\\{/g, '___ESCAPED___')\n const refs: string[] = []\n const pattern = new RegExp(REFERENCE_PATTERN.source, 'g')\n let match: RegExpExecArray | null\n while ((match = pattern.exec(cleaned)) !== null) {\n refs.push(match[1])\n }\n return refs\n}\n\n/**\n * Detect circular reference chains in a set of variables.\n * Returns arrays of keys forming each cycle.\n */\nexport function detectCircularReferences(variables: VariableInput[]): string[][] {\n const graph = new Map<string, string[]>()\n for (const v of variables) {\n const base = v.value || v.fallbackValue || ''\n graph.set(v.key, parseReferences(base))\n }\n\n const cycles: string[][] = []\n const visited = new Set<string>()\n const inStack = new Set<string>()\n\n function dfs(key: string, stack: string[]) {\n if (inStack.has(key)) {\n // Found cycle — extract the cycle portion\n const cycleStart = stack.indexOf(key)\n cycles.push(stack.slice(cycleStart))\n return\n }\n if (visited.has(key)) return\n\n visited.add(key)\n inStack.add(key)\n stack.push(key)\n\n const deps = graph.get(key) || []\n for (const dep of deps) {\n if (graph.has(dep)) {\n dfs(dep, stack)\n }\n }\n\n stack.pop()\n inStack.delete(key)\n }\n\n for (const key of graph.keys()) {\n dfs(key, [])\n }\n\n return cycles\n}\n\n/**\n * Resolve a single variable's value against a map of all variables.\n */\nexport function resolveValue(\n key: string,\n variables: Map<string, VariableInput>,\n depth: number = 0,\n _stack: Set<string> = new Set()\n): ResolvedVariable {\n const variable = variables.get(key)\n\n if (!variable) {\n return {\n key,\n rawValue: null,\n resolvedValue: '',\n source: 'empty',\n references: [],\n referencedBy: [],\n unresolvedRefs: [key],\n hasCircularRef: false,\n }\n }\n\n // Secret variables are NOT resolved — preserve raw value\n if (variable.isSecret) {\n const base = variable.value ?? variable.fallbackValue ?? ''\n const source: ResolvedVariable['source'] = variable.value ? 'explicit' : variable.fallbackValue ? 'fallback' : 'empty'\n return {\n key,\n rawValue: variable.value,\n resolvedValue: base,\n source,\n references: parseReferences(base),\n referencedBy: [],\n unresolvedRefs: [],\n hasCircularRef: false,\n }\n }\n\n // Determine base value and source\n let base: string\n let source: ResolvedVariable['source']\n if (variable.value !== null && variable.value !== undefined && variable.value !== '') {\n base = variable.value\n source = 'explicit'\n } else if (variable.fallbackValue !== null && variable.fallbackValue !== undefined && variable.fallbackValue !== '') {\n base = variable.fallbackValue\n source = 'fallback'\n } else {\n return {\n key,\n rawValue: variable.value,\n resolvedValue: '',\n source: 'empty',\n references: [],\n referencedBy: [],\n unresolvedRefs: [],\n hasCircularRef: false,\n }\n }\n\n const references = parseReferences(base)\n const unresolvedRefs: string[] = []\n let hasCircularRef = false\n\n // Resolve references in the base value\n // First handle escaped sequences\n let resolved = base.replace(/\\\\\\$\\{/g, '___ESCAPED___')\n\n const pattern = new RegExp(REFERENCE_PATTERN.source, 'g')\n resolved = resolved.replace(pattern, (fullMatch, refKey: string) => {\n // Circular reference check\n if (_stack.has(refKey)) {\n hasCircularRef = true\n unresolvedRefs.push(refKey)\n return fullMatch\n }\n\n // Max depth check\n if (depth >= MAX_DEPTH) {\n unresolvedRefs.push(refKey)\n return fullMatch\n }\n\n // Variable doesn't exist\n if (!variables.has(refKey)) {\n unresolvedRefs.push(refKey)\n return fullMatch\n }\n\n // Recurse\n const newStack = new Set(_stack)\n newStack.add(key)\n const inner = resolveValue(refKey, variables, depth + 1, newStack)\n\n if (inner.hasCircularRef) {\n hasCircularRef = true\n }\n unresolvedRefs.push(...inner.unresolvedRefs)\n\n return inner.resolvedValue\n })\n\n // Restore escaped sequences\n resolved = resolved.replace(/___ESCAPED___/g, '${')\n\n return {\n key,\n rawValue: variable.value,\n resolvedValue: resolved,\n source,\n references,\n referencedBy: [],\n unresolvedRefs: [...new Set(unresolvedRefs)],\n hasCircularRef,\n }\n}\n\n/**\n * Resolve all variables in an environment.\n * Populates referencedBy for each variable.\n */\nexport function resolveAll(variables: VariableInput[]): ResolvedVariable[] {\n const varMap = new Map<string, VariableInput>()\n for (const v of variables) {\n varMap.set(v.key, v)\n }\n\n const results = variables.map(v => resolveValue(v.key, varMap))\n\n // Populate referencedBy\n const referencedByMap = new Map<string, string[]>()\n for (const v of variables) {\n referencedByMap.set(v.key, [])\n }\n\n for (const result of results) {\n for (const ref of result.references) {\n const existing = referencedByMap.get(ref)\n if (existing) {\n existing.push(result.key)\n }\n }\n }\n\n for (const result of results) {\n result.referencedBy = referencedByMap.get(result.key) || []\n }\n\n return results\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { readFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { parseEnvFileAsArray } from '../lib/parser.js'\nimport { validateVariableName, type NamingConventionConfig } from '../lib/naming-conventions.js'\n\nexport const pushCommand = new Command('push')\n .description('Push local .env file to EnvManager')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: from config or \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('-i, --input <file>', 'Input file path (default: .env)')\n .option('--secrets <keys>', 'Comma-separated list of keys to mark as secrets')\n .option('--all-secrets', 'Mark all variables as secrets')\n .option('--dry-run', 'Show what would be pushed without making changes')\n .action(async (options) => {\n const spinner = ora('Reading .env file...').start()\n \n try {\n const config = loadConfig()\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const inputFile = resolve(options.input || '.env')\n const secretKeys = options.secrets ? options.secrets.split(',').map((k: string) => k.trim()) : []\n const allSecrets = options.allSecrets === true\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name> or create envmanager.json'))\n process.exit(1)\n }\n\n if (!existsSync(inputFile)) {\n spinner.fail(`File not found: ${inputFile}`)\n process.exit(1)\n }\n\n const content = readFileSync(inputFile, 'utf-8')\n const vars = parseEnvFileAsArray(content)\n\n if (vars.length === 0) {\n spinner.warn('No variables found in file')\n process.exit(0)\n }\n\n spinner.text = `Found ${vars.length} variables`\n\n if (options.dryRun) {\n spinner.succeed('Dry run - changes NOT applied')\n console.log(chalk.gray('\\nVariables to push:'))\n vars.forEach(v => {\n const isSecret = allSecrets || secretKeys.includes(v.key)\n const secretBadge = isSecret ? chalk.yellow(' [secret]') : ''\n console.log(` ${v.key}=${v.value.substring(0, 20)}${v.value.length > 20 ? '...' : ''}${secretBadge}`)\n })\n process.exit(0)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n // Resolve project (accepts UUID, friendly ID, or name)\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name, project_id')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found in project`)\n process.exit(1)\n }\n\n\n // Validate naming conventions\n spinner.text = 'Checking naming conventions...'\n const { data: namingRules } = await client\n .from('naming_conventions')\n .select('*')\n .eq('organization_id', organizationId)\n .eq('project_id', projectId)\n .maybeSingle()\n\n // Fall back to org-level rules if no project override\n let namingConfig: NamingConventionConfig | null = null\n if (namingRules) {\n namingConfig = {\n rules: namingRules.rules as any,\n enforcement_mode: namingRules.enforcement_mode as 'warn' | 'block',\n template_name: namingRules.template_name || undefined\n }\n } else {\n const { data: orgRules } = await client\n .from('naming_conventions')\n .select('*')\n .eq('organization_id', organizationId)\n .is('project_id', null)\n .maybeSingle()\n\n if (orgRules) {\n namingConfig = {\n rules: orgRules.rules as any,\n enforcement_mode: orgRules.enforcement_mode as 'warn' | 'block',\n template_name: orgRules.template_name || undefined\n }\n }\n }\n\n if (namingConfig) {\n const issues: Array<{ key: string; message: string; suggestion?: string }> = []\n\n for (const v of vars) {\n const result = validateVariableName(v.key, namingConfig)\n const allIssues = [...result.errors, ...result.warnings]\n for (const issue of allIssues) {\n issues.push({ key: v.key, message: issue.message, suggestion: issue.suggestion })\n }\n }\n\n if (issues.length > 0) {\n const isBlock = namingConfig.enforcement_mode === 'block'\n\n console.log('')\n console.log(chalk[isBlock ? 'red' : 'yellow'](` Naming convention ${isBlock ? 'errors' : 'warnings'}:`))\n for (const issue of issues) {\n const suggestion = issue.suggestion ? chalk.gray(` → ${issue.suggestion}`) : ''\n console.log(chalk[isBlock ? 'red' : 'yellow'](` ${issue.key}: ${issue.message}${suggestion}`))\n }\n console.log('')\n\n if (isBlock) {\n spinner.fail('Push blocked by naming convention errors')\n process.exit(1)\n }\n }\n }\n\n spinner.text = 'Pushing variables...'\n\n const markAsSecrets = allSecrets || secretKeys.length > 0\n const variablesData = vars.map(v => ({\n key: v.key,\n value: v.value,\n }))\n\n // Delete existing variables first, then bulk insert (upsert pattern)\n // Get existing keys to determine insert vs update counts\n const { data: existingVars } = await client\n .from('variables')\n .select('key')\n .eq('environment_id', environment.id)\n\n const existingKeys = new Set((existingVars || []).map((v: { key: string }) => v.key))\n const keysToUpdate = variablesData.filter(v => existingKeys.has(v.key))\n const keysToInsert = variablesData.filter(v => !existingKeys.has(v.key))\n\n // Delete variables that will be overwritten\n if (keysToUpdate.length > 0) {\n const { error: deleteError } = await client\n .from('variables')\n .delete()\n .eq('environment_id', environment.id)\n .in('key', keysToUpdate.map(v => v.key))\n\n if (deleteError) {\n spinner.fail('Failed to update existing variables')\n console.error(chalk.red(deleteError.message))\n process.exit(1)\n }\n }\n\n const { error: pushError } = await client.rpc('bulk_insert_variables', {\n variables_data: variablesData,\n environment_id_param: environment.id,\n organization_id_param: organizationId,\n import_as_secrets: markAsSecrets,\n })\n\n if (pushError) {\n spinner.fail('Push failed')\n console.error(chalk.red(pushError.message))\n process.exit(1)\n }\n\n spinner.succeed(`Pushed ${vars.length} variables to ${envName}`)\n if (keysToUpdate.length > 0) {\n console.log(chalk.gray(` ${keysToInsert.length} inserted, ${keysToUpdate.length} updated`))\n }\n if (markAsSecrets) {\n console.log(chalk.gray(` All marked as secrets`))\n }\n\n } catch (error) {\n spinner.fail('Push failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { parse as parseDotenv } from 'dotenv'\nimport chalk from 'chalk'\n\nexport interface ParsedEnvVar {\n key: string\n value: string\n}\n\n/**\n * Parse a .env file string using dotenv. Returns a Map<string, string>.\n * Warns when duplicate keys are detected (dotenv uses last-wins).\n */\nexport function parseEnvFile(content: string): Map<string, string> {\n const parsed = parseDotenv(content)\n\n // Detect duplicates by scanning raw lines\n const seen = new Set<string>()\n const duplicates: string[] = []\n for (const line of content.split('\\n')) {\n const match = line.match(/^\\s*([^#=\\s][^=]*?)\\s*=/)\n if (match) {\n const key = match[1]\n if (seen.has(key)) {\n duplicates.push(key)\n }\n seen.add(key)\n }\n }\n\n if (duplicates.length > 0) {\n console.warn(\n chalk.yellow(`Warning: Duplicate keys detected (last value wins): ${duplicates.join(', ')}`)\n )\n }\n\n return new Map(Object.entries(parsed))\n}\n\n/**\n * Parse a .env file string and return as an array of {key, value} pairs.\n * Convenience wrapper for commands that need array format (e.g., push).\n */\nexport function parseEnvFileAsArray(content: string): ParsedEnvVar[] {\n const map = parseEnvFile(content)\n return Array.from(map.entries()).map(([key, value]) => ({ key, value }))\n}\n","// SYNC: also update utils/naming-conventions.ts\n\nexport interface NamingRule {\n case?: 'SCREAMING_SNAKE_CASE' | 'snake_case' | 'PascalCase' | 'camelCase'\n patterns?: Array<{ match: string; description: string; example?: string }>\n forbidden?: Array<{ match: string; reason: string }>\n}\n\nexport interface NamingConventionConfig {\n rules: NamingRule\n enforcement_mode: 'warn' | 'block'\n template_name?: string\n}\n\nexport interface NamingValidationResult {\n valid: boolean\n errors: ValidationIssue[]\n warnings: ValidationIssue[]\n suggestions: string[]\n}\n\nexport interface ValidationIssue {\n type: 'case' | 'pattern' | 'forbidden'\n message: string\n suggestion?: string\n}\n\n// --- Case detection helpers ---\n\nfunction isScreamingSnakeCase(name: string): boolean {\n return /^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$/.test(name)\n}\n\nfunction isSnakeCase(name: string): boolean {\n return /^[a-z][a-z0-9]*(_[a-z0-9]+)*$/.test(name)\n}\n\nfunction isPascalCase(name: string): boolean {\n return /^[A-Z][a-zA-Z0-9]*$/.test(name)\n}\n\nfunction isCamelCase(name: string): boolean {\n return /^[a-z][a-zA-Z0-9]*$/.test(name)\n}\n\n// --- Case conversion ---\n\nfunction splitIntoWords(name: string): string[] {\n // Handle SCREAMING_SNAKE_CASE and snake_case\n if (name.includes('_')) {\n return name.split('_').filter(Boolean)\n }\n // Handle PascalCase and camelCase\n return name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').split('_').filter(Boolean)\n}\n\nexport function convertToCase(name: string, targetCase: string): string {\n const words = splitIntoWords(name)\n if (words.length === 0) return name\n\n switch (targetCase) {\n case 'SCREAMING_SNAKE_CASE':\n return words.map(w => w.toUpperCase()).join('_')\n case 'snake_case':\n return words.map(w => w.toLowerCase()).join('_')\n case 'PascalCase':\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('')\n case 'camelCase':\n return words.map((w, i) => {\n if (i === 0) return w.toLowerCase()\n return w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()\n }).join('')\n default:\n return name\n }\n}\n\n// --- Validation ---\n\nexport function validateVariableName(name: string, config: NamingConventionConfig): NamingValidationResult {\n const issues: ValidationIssue[] = []\n\n // Case check\n if (config.rules.case) {\n let caseValid = false\n switch (config.rules.case) {\n case 'SCREAMING_SNAKE_CASE': caseValid = isScreamingSnakeCase(name); break\n case 'snake_case': caseValid = isSnakeCase(name); break\n case 'PascalCase': caseValid = isPascalCase(name); break\n case 'camelCase': caseValid = isCamelCase(name); break\n }\n if (!caseValid) {\n const suggestion = convertToCase(name, config.rules.case)\n issues.push({\n type: 'case',\n message: `Must be ${config.rules.case}`,\n suggestion\n })\n }\n }\n\n // Pattern checks\n if (config.rules.patterns) {\n for (const pattern of config.rules.patterns) {\n try {\n const regex = new RegExp(pattern.match)\n if (!regex.test(name)) {\n issues.push({\n type: 'pattern',\n message: pattern.description,\n suggestion: pattern.example\n })\n }\n } catch {\n // Skip invalid regex patterns\n }\n }\n }\n\n // Forbidden checks\n if (config.rules.forbidden) {\n for (const rule of config.rules.forbidden) {\n try {\n const regex = new RegExp(rule.match, 'i')\n if (regex.test(name)) {\n issues.push({\n type: 'forbidden',\n message: rule.reason\n })\n }\n } catch {\n // Skip invalid regex patterns\n }\n }\n }\n\n const isBlock = config.enforcement_mode === 'block'\n const suggestions = issues\n .map(i => i.suggestion)\n .filter((s): s is string => !!s)\n\n return {\n valid: isBlock ? issues.length === 0 : true,\n errors: isBlock ? issues : [],\n warnings: isBlock ? [] : issues,\n suggestions: [...new Set(suggestions)]\n }\n}\n\n// --- Templates ---\n\nexport const TEMPLATES: Record<string, NamingConventionConfig> = {\n standard: {\n rules: {\n case: 'SCREAMING_SNAKE_CASE',\n forbidden: [\n { match: '^(password|secret|key|token)$', reason: 'Too generic — use a descriptive name like DB_PASSWORD or API_KEY' }\n ]\n },\n enforcement_mode: 'warn',\n template_name: 'standard'\n },\n nextjs: {\n rules: {\n case: 'SCREAMING_SNAKE_CASE',\n patterns: [\n { match: '^NEXT_PUBLIC_', description: 'Client-side variables must start with NEXT_PUBLIC_', example: 'NEXT_PUBLIC_API_URL' }\n ]\n },\n enforcement_mode: 'warn',\n template_name: 'nextjs'\n },\n vite: {\n rules: {\n case: 'SCREAMING_SNAKE_CASE',\n patterns: [\n { match: '^VITE_', description: 'Client-side variables must start with VITE_', example: 'VITE_API_URL' }\n ]\n },\n enforcement_mode: 'warn',\n template_name: 'vite'\n },\n strict: {\n rules: {\n case: 'SCREAMING_SNAKE_CASE',\n forbidden: [\n { match: '^(password|secret|key|token)$', reason: 'Too generic — use a descriptive name' },\n { match: '[a-z]', reason: 'Lowercase characters not allowed in strict mode' },\n { match: '^[0-9]', reason: 'Must not start with a number' },\n { match: '__', reason: 'Double underscores not allowed' }\n ]\n },\n enforcement_mode: 'block',\n template_name: 'strict'\n }\n}\n\nexport function getTemplate(templateName: string): NamingConventionConfig | null {\n return TEMPLATES[templateName] || null\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { readFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { Variable } from '../lib/types.js'\nimport { parseEnvFile } from '../lib/parser.js'\n\nexport const diffCommand = new Command('diff')\n .description('Show differences between local .env and EnvManager')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: from config or \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('-i, --input <file>', 'Input file path (default: .env)')\n .option('--keys-only', 'Only show key names, not values')\n .option('--tag <tags...>', 'Filter by tags (untagged variables always included)')\n .action(async (options) => {\n const spinner = ora('Comparing...').start()\n \n try {\n const config = loadConfig()\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const inputFile = resolve(options.input || '.env')\n const keysOnly = options.keysOnly === true\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name> or create envmanager.json'))\n process.exit(1)\n }\n\n let localVars = new Map<string, string>()\n \n if (existsSync(inputFile)) {\n const content = readFileSync(inputFile, 'utf-8')\n localVars = parseEnvFile(content)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n // Resolve project (accepts UUID, friendly ID, or name)\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching remote variables...'\n const { data: remoteVarsData, error: varError } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environment.id,\n p_sync_secrets: true,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (varError) {\n spinner.fail('Failed to fetch remote variables')\n console.error(chalk.red(varError.message))\n process.exit(1)\n }\n\n const filterTags: string[] = options.tag || config?.tags || []\n const filteredRemoteData = filterTags.length > 0\n ? ((remoteVarsData as Variable[]) || []).filter(v => {\n const t = v.tags || []\n return t.length === 0 || t.some(tag => filterTags.includes(tag))\n })\n : (remoteVarsData as Variable[]) || []\n\n const remoteVars = new Map<string, Variable>()\n for (const v of filteredRemoteData) {\n remoteVars.set(v.key, v)\n }\n\n spinner.stop()\n\n const allKeys = new Set([...localVars.keys(), ...remoteVars.keys()])\n const added: string[] = []\n const removed: string[] = []\n const modified: string[] = []\n const unchanged: string[] = []\n\n for (const key of allKeys) {\n const localVal = localVars.get(key)\n const remoteVar = remoteVars.get(key)\n\n if (localVal !== undefined && !remoteVar) {\n added.push(key)\n } else if (localVal === undefined && remoteVar) {\n removed.push(key)\n } else if (localVal !== remoteVar?.value) {\n modified.push(key)\n } else {\n unchanged.push(key)\n }\n }\n\n if (added.length === 0 && removed.length === 0 && modified.length === 0) {\n console.log(chalk.green('\\nNo differences found.'))\n console.log(chalk.gray(`${unchanged.length} variables in sync.`))\n process.exit(0)\n }\n\n console.log('')\n\n if (added.length > 0) {\n console.log(chalk.green(`+ ${added.length} to add (local only):`))\n added.sort().forEach(key => {\n if (keysOnly) {\n console.log(chalk.green(` + ${key}`))\n } else {\n const val = localVars.get(key) || ''\n const display = val.length > 30 ? val.substring(0, 30) + '...' : val\n console.log(chalk.green(` + ${key}=${display}`))\n }\n })\n console.log('')\n }\n\n if (removed.length > 0) {\n console.log(chalk.red(`- ${removed.length} to remove (remote only):`))\n removed.sort().forEach(key => {\n const remoteVar = remoteVars.get(key)\n const secretBadge = remoteVar?.is_secret ? chalk.yellow(' [secret]') : ''\n console.log(chalk.red(` - ${key}${secretBadge}`))\n })\n console.log('')\n }\n\n if (modified.length > 0) {\n console.log(chalk.yellow(`~ ${modified.length} modified:`))\n modified.sort().forEach(key => {\n const remoteVar = remoteVars.get(key)\n const secretBadge = remoteVar?.is_secret ? chalk.yellow(' [secret]') : ''\n console.log(chalk.yellow(` ~ ${key}${secretBadge}`))\n })\n console.log('')\n }\n\n console.log(chalk.gray(`${unchanged.length} unchanged`))\n\n } catch (error) {\n spinner.fail('Diff failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\n\nexport const listCommand = new Command('list')\n .description('List projects, environments, or variables')\n .argument('[resource]', 'Resource to list: projects, environments, variables', 'projects')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-p, --project <name-or-id>', 'Project name or ID (for environments/variables)')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-v, --verbose', 'Show IDs')\n .action(async (resource, options) => {\n const spinner = ora('Connecting...').start()\n \n try {\n const config = loadConfig()\n const client = await createClient()\n\n switch (resource) {\n case 'projects':\n case 'project': {\n spinner.text = 'Fetching projects...'\n \n const { data: { user: currentUser } } = await client.auth.getUser()\n if (!currentUser) throw new Error('Not authenticated')\n\n const { data: memberships, error: memberError } = await client\n .from('organization_members')\n .select('organization_id')\n .eq('user_id', currentUser.id)\n\n if (memberError) throw new Error(memberError.message)\n \n const orgIds = memberships?.map(m => m.organization_id) || []\n \n if (orgIds.length === 0) {\n spinner.warn('No organizations found')\n process.exit(0)\n }\n\n const { data: projects, error: projError } = await client\n .from('projects')\n .select('id, name, friendly_id, organization_id, organizations(name)')\n .in('organization_id', orgIds)\n .order('name')\n \n if (projError) throw new Error(projError.message)\n \n if (!projects || projects.length === 0) {\n spinner.warn('No projects found')\n process.exit(0)\n }\n\n spinner.succeed(`Found ${projects.length} projects`)\n console.log('')\n \n projects.forEach(p => {\n const org = p.organizations as { name: string } | { name: string }[] | null\n const orgName = Array.isArray(org) ? org[0]?.name : org?.name || 'Unknown'\n const friendlyId = p.friendly_id ? `#${p.friendly_id}` : ''\n if (options.verbose) {\n console.log(` ${chalk.green(friendlyId.padEnd(4))} ${chalk.cyan(p.id)} ${p.name} ${chalk.gray(`(${orgName})`)}`)\n } else {\n console.log(` ${chalk.green(friendlyId.padEnd(4))} ${p.name} ${chalk.gray(`(${orgName})`)}`)\n }\n })\n \n if (!options.verbose && projects.length > 0) {\n console.log(chalk.gray('\\n Use -v to show UUIDs'))\n }\n break\n }\n\n case 'environments':\n case 'envs':\n case 'env': {\n const projectInput = options.project || config?.project_id\n \n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name>'))\n process.exit(1)\n }\n\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n let projectId: string\n try {\n spinner.text = 'Resolving project...'\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environments...'\n \n const { data: environments, error: envError } = await client\n .from('environments')\n .select('id, name, friendly_id, created_at')\n .eq('project_id', projectId)\n .order('name')\n \n if (envError) throw new Error(envError.message)\n \n if (!environments || environments.length === 0) {\n spinner.warn('No environments found')\n process.exit(0)\n }\n\n spinner.succeed(`Found ${environments.length} environments`)\n console.log('')\n \n environments.forEach(e => {\n const friendlyId = e.friendly_id ? `#${e.friendly_id}` : ''\n if (options.verbose) {\n console.log(` ${chalk.green(friendlyId.padEnd(4))} ${chalk.cyan(e.id)} ${e.name}`)\n } else {\n console.log(` ${chalk.green(friendlyId.padEnd(4))} ${e.name}`)\n }\n })\n break\n }\n\n case 'variables':\n case 'vars':\n case 'var': {\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n \n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name>'))\n process.exit(1)\n }\n\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n let projectId: string\n try {\n spinner.text = 'Resolving project...'\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n \n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n \n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching variables...'\n \n const { data: variables, error: varError } = await client\n .from('variables')\n .select('id, key, is_secret, created_at')\n .eq('environment_id', environment.id)\n .order('key')\n \n if (varError) throw new Error(varError.message)\n \n if (!variables || variables.length === 0) {\n spinner.warn(`No variables in ${envName}`)\n process.exit(0)\n }\n\n const secretCount = variables.filter(v => v.is_secret).length\n spinner.succeed(`Found ${variables.length} variables (${secretCount} secrets)`)\n console.log('')\n \n variables.forEach(v => {\n const badge = v.is_secret ? chalk.yellow(' [secret]') : ''\n console.log(` ${v.key}${badge}`)\n })\n break\n }\n\n default:\n spinner.fail(`Unknown resource: ${resource}`)\n console.log(chalk.gray('\\nAvailable: projects, environments, variables'))\n process.exit(1)\n }\n\n } catch (error) {\n spinner.fail('Failed to list')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { loadConfig, getConfigPath } from '../lib/config.js'\n\nexport const configCommand = new Command('config')\n .description('Manage project configuration')\n\nconfigCommand\n .command('show')\n .description('Show current configuration')\n .action(() => {\n const configPath = getConfigPath()\n const config = loadConfig()\n \n if (!configPath || !config) {\n console.log(chalk.yellow('No configuration file found'))\n console.log('Run `envmanager init` to create one')\n return\n }\n \n console.log(chalk.green(`Config file: ${configPath}`))\n console.log(JSON.stringify(config, null, 2))\n })\n\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { writeFileSync, existsSync, readFileSync } from 'fs'\nimport { resolve } from 'path'\nimport { parse as parseDotenv } from 'dotenv'\nimport { createClient, refreshClientAuth } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport {\n subscribeToVariableChanges,\n fetchAllVariables,\n type VariableChangeEvent\n} from '../lib/realtime.js'\nimport { EnvFileWatcher, formatEnvFile } from '../lib/watcher.js'\nimport { mergeWithRemote } from '../lib/conflict.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { Variable } from '../lib/types.js'\n\nexport const devCommand = new Command('dev')\n .description('Start real-time sync daemon - watches for remote variable changes')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: from config or \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('--output <file>', 'Output file path (default: .env)')\n .option('--no-watch', 'Disable local file watching')\n .option('--strategy <type>', 'Merge strategy: remote_wins, local_wins, merge_new (default: remote_wins)', 'remote_wins')\n .option('--tag <tags...>', 'Filter by tags (untagged variables always included)')\n .action(async (options) => {\n const spinner = ora('Starting dev mode...').start()\n \n try {\n const config = loadConfig()\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const outputFile = resolve(options.output || '.env')\n const watchLocal = options.watch !== false\n const strategy = options.strategy as 'remote_wins' | 'local_wins' | 'merge_new'\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify a project with --project <id-or-name> or create envmanager.json'))\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n // Resolve project (accepts UUID, friendly ID, or name)\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name, project_id')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found in project`)\n process.exit(1)\n }\n\n const environmentId = environment.id\n\n const filterTags: string[] = options.tag || config?.tags || []\n const applyTagFilter = <T extends { tags?: string[] }>(vars: T[]): T[] => {\n if (filterTags.length === 0) return vars\n return vars.filter(v => {\n const t = v.tags || []\n return t.length === 0 || t.some(tag => filterTags.includes(tag))\n })\n }\n\n spinner.text = 'Performing initial sync...'\n const remoteVariables = applyTagFilter(await fetchAllVariables(environmentId, true))\n \n let localVariables = new Map<string, string>()\n if (existsSync(outputFile)) {\n const content = readFileSync(outputFile, 'utf-8')\n localVariables = new Map(Object.entries(parseDotenv(content)))\n }\n\n const merged = mergeWithRemote(\n localVariables,\n remoteVariables,\n strategy\n )\n \n writeFileSync(outputFile, formatEnvFile(merged))\n \n spinner.text = 'Connecting to realtime...'\n \n let fileWatcher: EnvFileWatcher | null = null\n let isPaused = false\n let lastRemoteKeys: string | null = null // serialized key list for change detection\n\n // Sync remote state to local .env file\n async function syncRemoteToLocal(silent = false): Promise<boolean> {\n const updatedVariables = applyTagFilter(await fetchAllVariables(environmentId, true))\n const currentLocal = new Map<string, string>()\n if (existsSync(outputFile)) {\n const content = readFileSync(outputFile, 'utf-8')\n Object.entries(parseDotenv(content)).forEach(([k, v]) => {\n currentLocal.set(k, v)\n })\n }\n\n const newMerged = mergeWithRemote(currentLocal, updatedVariables, strategy)\n\n // Check if anything actually changed\n const remoteKeySig = [...newMerged.entries()].sort().map(([k, v]) => `${k}=${v}`).join('\\n')\n if (remoteKeySig === lastRemoteKeys) return false\n lastRemoteKeys = remoteKeySig\n\n if (!silent) {\n // Detect what changed for logging\n const timestamp = new Date().toLocaleTimeString()\n for (const key of currentLocal.keys()) {\n if (!newMerged.has(key)) {\n console.log(chalk.red(`[${timestamp}] - ${key}`))\n }\n }\n for (const [key] of newMerged) {\n if (!currentLocal.has(key)) {\n console.log(chalk.green(`[${timestamp}] + ${key}`))\n }\n }\n }\n\n writeFileSync(outputFile, formatEnvFile(newMerged))\n return true\n }\n\n // Set initial signature\n const initialKeys = [...merged.entries()].sort().map(([k, v]) => `${k}=${v}`).join('\\n')\n lastRemoteKeys = initialKeys\n\n const subscription = await subscribeToVariableChanges(\n environmentId,\n async (event: VariableChangeEvent) => {\n if (isPaused) return\n\n const timestamp = new Date().toLocaleTimeString()\n\n switch (event.action) {\n case 'INSERT':\n console.log(chalk.green(`[${timestamp}] + ${event.key}`))\n break\n case 'UPDATE':\n if (event.old_key && event.old_key !== event.key) {\n console.log(chalk.yellow(`[${timestamp}] ~ ${event.old_key} -> ${event.key}`))\n } else {\n console.log(chalk.yellow(`[${timestamp}] ~ ${event.key}`))\n }\n break\n case 'DELETE':\n console.log(chalk.red(`[${timestamp}] - ${event.key}`))\n break\n }\n\n isPaused = true\n try {\n await syncRemoteToLocal(true) // silent — we already logged the event\n } finally {\n isPaused = false\n }\n },\n (status, message) => {\n switch (status) {\n case 'connected':\n console.log(chalk.green(' Realtime connected'))\n break\n case 'disconnected':\n console.log(chalk.yellow('\\nDisconnected from realtime'))\n break\n case 'reconnecting':\n console.log(chalk.yellow(`\\nReconnecting... ${message || ''}`))\n break\n case 'error':\n console.log(chalk.red(`\\nRealtime error: ${message || ''}`))\n break\n }\n }\n )\n\n if (watchLocal) {\n fileWatcher = new EnvFileWatcher(outputFile)\n fileWatcher.on('change', () => {\n if (!isPaused) {\n console.log(chalk.gray(`[${new Date().toLocaleTimeString()}] Local file changed`))\n }\n })\n fileWatcher.on('error', (error) => {\n console.error(chalk.red(`File watcher error: ${error.message}`))\n })\n fileWatcher.start()\n }\n\n spinner.succeed('Dev mode started')\n console.log('')\n console.log(chalk.cyan(' Project:'), projectId)\n console.log(chalk.cyan(' Environment:'), envName)\n console.log(chalk.cyan(' Output:'), outputFile)\n console.log(chalk.cyan(' Strategy:'), strategy)\n console.log(chalk.cyan(' Watching:'), watchLocal ? 'local + remote' : 'remote only')\n console.log('')\n console.log(chalk.gray('Watching for changes. Press Ctrl+C to stop.'))\n console.log('')\n\n let isCleaningUp = false\n\n // Periodic poll to catch missed realtime events (e.g. DELETEs)\n const POLL_INTERVAL_MS = 5000\n const pollInterval = setInterval(async () => {\n if (isPaused) return\n isPaused = true\n try {\n await syncRemoteToLocal()\n } catch {\n // Poll failed, will retry next interval\n } finally {\n isPaused = false\n }\n }, POLL_INTERVAL_MS)\n\n const TOKEN_REFRESH_INTERVAL_MS = 30 * 60 * 1000\n const refreshInterval = setInterval(async () => {\n try {\n await refreshClientAuth()\n } catch {\n // Token refresh failed, will retry on next interval\n }\n }, TOKEN_REFRESH_INTERVAL_MS)\n\n const cleanup = () => {\n if (isCleaningUp) {\n console.log(chalk.gray('\\nForce exiting...'))\n process.exit(1)\n }\n isCleaningUp = true\n console.log(chalk.gray('\\nStopping dev mode...'))\n \n clearInterval(pollInterval)\n clearInterval(refreshInterval)\n fileWatcher?.stop()\n \n subscription.unsubscribe()\n .catch(() => {})\n .finally(() => process.exit(0))\n \n setTimeout(() => {\n console.log(chalk.yellow('Cleanup timeout, forcing exit...'))\n process.exit(0)\n }, 2000)\n }\n\n process.on('SIGINT', cleanup)\n process.on('SIGTERM', cleanup)\n\n await new Promise(() => {})\n\n } catch (error) {\n spinner.fail('Dev mode failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { RealtimeChannel } from '@supabase/supabase-js'\nimport { createClient } from './client.js'\n\nexport interface VariableChangeEvent {\n action: 'INSERT' | 'UPDATE' | 'DELETE'\n variable_id: string\n key: string\n environment_id: string\n is_secret: boolean\n old_key?: string\n timestamp: number\n}\n\nexport type VariableChangeCallback = (event: VariableChangeEvent) => void\n\ninterface RealtimeSubscription {\n channel: RealtimeChannel\n environmentId: string\n unsubscribe: () => Promise<void>\n}\n\nconst MAX_RECONNECT_ATTEMPTS = 10\nconst BASE_RECONNECT_DELAY_MS = 1000\n\n/**\n * SECURITY: Does NOT receive actual values - only metadata.\n * Caller must fetch values via RPC after receiving event.\n */\nexport async function subscribeToVariableChanges(\n environmentId: string,\n onEvent: VariableChangeCallback,\n onStatus?: (status: 'connected' | 'disconnected' | 'reconnecting' | 'error', message?: string) => void\n): Promise<RealtimeSubscription> {\n const client = await createClient()\n \n const { data: envAccess, error: accessError } = await client\n .from('environment_access')\n .select('environment_id')\n .eq('environment_id', environmentId)\n .maybeSingle()\n \n if (accessError || !envAccess) {\n throw new Error(`No access to environment ${environmentId}`)\n }\n\n const channelName = `variables:${environmentId}`\n let reconnectAttempts = 0\n let reconnectTimeout: NodeJS.Timeout | null = null\n\n const channel = client.channel(channelName, {\n config: {\n broadcast: { self: false }\n }\n })\n\n channel.on(\n 'postgres_changes',\n {\n event: '*',\n schema: 'public',\n table: 'variables'\n },\n (payload) => {\n const newRecord = payload.new as Record<string, unknown> | null\n const oldRecord = payload.old as Record<string, unknown> | null\n const record = (newRecord && Object.keys(newRecord).length > 0 ? newRecord : oldRecord)\n \n if (!record) return\n \n const recordEnvId = record.environment_id as string\n if (recordEnvId !== environmentId) {\n return\n }\n \n const event: VariableChangeEvent = {\n action: payload.eventType.toUpperCase() as 'INSERT' | 'UPDATE' | 'DELETE',\n variable_id: record.id as string,\n key: record.key as string,\n environment_id: record.environment_id as string,\n is_secret: record.is_secret as boolean,\n timestamp: Date.now() / 1000\n }\n\n if (payload.eventType === 'UPDATE' && oldRecord) {\n if (oldRecord.key !== record.key) {\n event.old_key = oldRecord.key as string\n }\n }\n\n onEvent(event)\n }\n )\n\n // Listen for broadcast events (from trigger or other clients)\n channel.on('broadcast', { event: 'variable_change' }, (payload) => {\n onEvent(payload.payload as VariableChangeEvent)\n })\n\n // Also listen for any broadcast event name the trigger might use\n channel.on('broadcast', { event: '*' }, (payload) => {\n const data = payload.payload as Record<string, unknown>\n if (data?.action && data?.key && data?.environment_id) {\n onEvent(data as unknown as VariableChangeEvent)\n }\n })\n\n channel.on('system', { event: '*' }, (status) => {\n if (status.event === 'connected') {\n reconnectAttempts = 0\n onStatus?.('connected')\n }\n })\n\n const subscription = await new Promise<RealtimeSubscription>((resolve, reject) => {\n channel.subscribe(async (status, err) => {\n if (status === 'SUBSCRIBED') {\n onStatus?.('connected')\n resolve({\n channel,\n environmentId,\n unsubscribe: async () => {\n if (reconnectTimeout) {\n clearTimeout(reconnectTimeout)\n }\n await client.removeChannel(channel)\n }\n })\n } else if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {\n if (reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {\n reconnectAttempts++\n const delay = BASE_RECONNECT_DELAY_MS * Math.pow(2, reconnectAttempts - 1)\n onStatus?.('reconnecting', `Attempt ${reconnectAttempts}/${MAX_RECONNECT_ATTEMPTS} in ${delay}ms`)\n \n reconnectTimeout = setTimeout(() => {\n channel.subscribe()\n }, delay)\n } else {\n onStatus?.('error', `Failed after ${MAX_RECONNECT_ATTEMPTS} attempts`)\n reject(new Error(`Failed to subscribe to channel after ${MAX_RECONNECT_ATTEMPTS} attempts: ${err?.message || status}`))\n }\n } else if (status === 'CLOSED') {\n onStatus?.('disconnected')\n }\n })\n })\n\n return subscription\n}\n\nexport async function fetchVariableAfterChange(\n environmentId: string,\n variableId: string,\n includeSecrets: boolean = true\n): Promise<{ key: string; value: string | null; is_secret: boolean; tags: string[] } | null> {\n const client = await createClient()\n \n const { data: variables, error } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environmentId,\n p_sync_secrets: includeSecrets,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (error || !variables) {\n return null\n }\n\n const variable = (variables as Array<{ id: string; key: string; value: string | null; is_secret: boolean; tags: string[] }>)\n .find(v => v.id === variableId)\n\n return variable || null\n}\n\nexport async function fetchAllVariables(\n environmentId: string,\n includeSecrets: boolean = true\n): Promise<Array<{ id: string; key: string; value: string | null; is_secret: boolean; tags: string[] }>> {\n const client = await createClient()\n\n const { data: variables, error } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environmentId,\n p_sync_secrets: includeSecrets,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (error) {\n throw new Error(`Failed to fetch variables: ${error.message}`)\n }\n\n return (variables || []) as Array<{ id: string; key: string; value: string | null; is_secret: boolean; tags: string[] }>\n}\n","import { watch, FSWatcher } from 'fs'\nimport { existsSync, readFileSync } from 'fs'\nimport { EventEmitter } from 'events'\nimport { parse as parseDotenv } from 'dotenv'\n\nexport interface FileChangeEvent {\n type: 'change' | 'rename'\n path: string\n variables: Map<string, string>\n}\n\nexport interface FileWatcherEvents {\n change: (event: FileChangeEvent) => void\n error: (error: Error) => void\n}\n\nexport class EnvFileWatcher extends EventEmitter {\n private watcher: FSWatcher | null = null\n private filePath: string\n private lastContent: string = ''\n private debounceTimeout: NodeJS.Timeout | null = null\n private readonly debounceMs: number\n\n constructor(filePath: string, debounceMs: number = 300) {\n super()\n this.filePath = filePath\n this.debounceMs = debounceMs\n }\n\n start(): void {\n if (this.watcher) {\n return\n }\n\n if (!existsSync(this.filePath)) {\n this.emit('error', new Error(`File not found: ${this.filePath}`))\n return\n }\n\n this.lastContent = this.readFile()\n\n this.watcher = watch(this.filePath, (eventType) => {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout)\n }\n\n this.debounceTimeout = setTimeout(() => {\n this.handleFileChange(eventType as 'change' | 'rename')\n }, this.debounceMs)\n })\n\n this.watcher.on('error', (error) => {\n this.emit('error', error)\n })\n }\n\n stop(): void {\n if (this.debounceTimeout) {\n clearTimeout(this.debounceTimeout)\n this.debounceTimeout = null\n }\n\n if (this.watcher) {\n this.watcher.close()\n this.watcher = null\n }\n }\n\n private readFile(): string {\n try {\n return readFileSync(this.filePath, 'utf-8')\n } catch {\n return ''\n }\n }\n\n private handleFileChange(eventType: 'change' | 'rename'): void {\n if (!existsSync(this.filePath)) {\n this.emit('change', {\n type: eventType,\n path: this.filePath,\n variables: new Map()\n })\n return\n }\n\n const currentContent = this.readFile()\n \n if (currentContent === this.lastContent) {\n return\n }\n\n this.lastContent = currentContent\n\n const parsed = parseDotenv(currentContent)\n const variables = new Map(Object.entries(parsed))\n\n this.emit('change', {\n type: eventType,\n path: this.filePath,\n variables\n })\n }\n\n getCurrentVariables(): Map<string, string> {\n const content = this.readFile()\n const parsed = parseDotenv(content)\n return new Map(Object.entries(parsed))\n }\n}\n\nexport { parseEnvFile } from './parser.js'\n\nexport function formatEnvFile(variables: Map<string, string>): string {\n const lines: string[] = []\n \n const sortedKeys = Array.from(variables.keys()).sort()\n \n for (const key of sortedKeys) {\n const value = variables.get(key) || ''\n const needsQuotes = value.includes(' ') || value.includes('\\n') || value.includes('\"') || value.includes(\"'\")\n const formattedValue = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value\n lines.push(`${key}=${formattedValue}`)\n }\n \n return lines.join('\\n') + '\\n'\n}\n","export interface VariableDiff {\n key: string\n localValue: string | null\n remoteValue: string | null\n type: 'added_local' | 'added_remote' | 'removed_local' | 'removed_remote' | 'modified'\n}\n\nexport interface ConflictResult {\n added: VariableDiff[]\n removed: VariableDiff[]\n modified: VariableDiff[]\n unchanged: string[]\n}\n\nexport function detectChanges(\n local: Map<string, string>,\n remote: Map<string, { key: string; value: string | null }>\n): ConflictResult {\n const result: ConflictResult = {\n added: [],\n removed: [],\n modified: [],\n unchanged: []\n }\n\n const remoteMap = new Map<string, string | null>()\n for (const [_, v] of remote) {\n remoteMap.set(v.key, v.value)\n }\n\n for (const [key, localValue] of local) {\n if (!remoteMap.has(key)) {\n result.added.push({\n key,\n localValue,\n remoteValue: null,\n type: 'added_local'\n })\n } else {\n const remoteValue = remoteMap.get(key) ?? null\n if (localValue !== remoteValue) {\n result.modified.push({\n key,\n localValue,\n remoteValue,\n type: 'modified'\n })\n } else {\n result.unchanged.push(key)\n }\n }\n }\n\n for (const [key, remoteValue] of remoteMap) {\n if (!local.has(key)) {\n result.removed.push({\n key,\n localValue: null,\n remoteValue,\n type: 'removed_local'\n })\n }\n }\n\n return result\n}\n\nexport type ConflictResolution = 'keep_local' | 'keep_remote' | 'skip'\n\nexport interface ResolvedVariable {\n key: string\n value: string | null\n action: 'set' | 'delete' | 'skip'\n}\n\nexport function applyResolution(\n diff: VariableDiff,\n resolution: ConflictResolution\n): ResolvedVariable {\n switch (resolution) {\n case 'keep_local':\n return {\n key: diff.key,\n value: diff.localValue,\n action: diff.localValue === null ? 'delete' : 'set'\n }\n case 'keep_remote':\n return {\n key: diff.key,\n value: diff.remoteValue,\n action: diff.remoteValue === null ? 'delete' : 'set'\n }\n case 'skip':\n return {\n key: diff.key,\n value: null,\n action: 'skip'\n }\n }\n}\n\nexport function mergeWithRemote(\n local: Map<string, string>,\n remoteVariables: Array<{ key: string; value: string | null }>,\n strategy: 'local_wins' | 'remote_wins' | 'merge_new'\n): Map<string, string> {\n const result = new Map<string, string>()\n\n switch (strategy) {\n case 'local_wins':\n for (const v of remoteVariables) {\n if (v.value !== null && !local.has(v.key)) {\n result.set(v.key, v.value)\n }\n }\n for (const [key, value] of local) {\n result.set(key, value)\n }\n break\n\n case 'remote_wins': {\n const remoteKeys = new Set(remoteVariables.map(v => v.key))\n // Keep local keys only if they also exist in remote\n for (const [key, value] of local) {\n if (remoteKeys.has(key)) {\n result.set(key, value)\n }\n }\n // Overlay remote values (remote wins)\n for (const v of remoteVariables) {\n if (v.value !== null) {\n result.set(v.key, v.value)\n }\n }\n break\n }\n\n case 'merge_new':\n for (const [key, value] of local) {\n result.set(key, value)\n }\n for (const v of remoteVariables) {\n if (v.value !== null && !local.has(v.key)) {\n result.set(v.key, v.value)\n }\n }\n break\n }\n\n return result\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { writeFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { generateTemplate } from '../lib/template-simple.js'\nimport { generateYamlTemplate } from '../lib/template-yaml.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { Variable } from '../lib/types.js'\n\nexport const initCommand = new Command('init')\n .description('Initialize project configuration and generate .env.template from EnvManager')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-p, --project <id>', 'Project ID')\n .option('--format <type>', 'Template format: simple or yaml (default: simple)', 'simple')\n .option('-f, --force', 'Overwrite existing files without prompting')\n .action(async (options) => {\n const spinner = ora('Initializing project...').start()\n \n try {\n const configPath = resolve('envmanager.json')\n const format = options.format as 'simple' | 'yaml'\n const templatePath = resolve(format === 'yaml' ? '.env.template.yaml' : '.env.template')\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n // Resolve organization (auto-selects for single-org users)\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n spinner.text = 'Fetching projects...'\n const { data: projects, error: projectError } = await client\n .from('projects')\n .select('id, name, friendly_id')\n .eq('organization_id', organizationId)\n\n if (projectError || !projects?.length) {\n spinner.fail('No projects found in organization')\n process.exit(1)\n }\n\n let projectId: string\n let projectName = ''\n\n if (options.project) {\n // Resolve project (accepts UUID, friendly ID, or name)\n try {\n projectId = await resolveProjectId(options.project, client, organizationId)\n const found = projects.find(p => p.id === projectId)\n projectName = found?.name || ''\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n } else if (projects.length === 1) {\n projectId = projects[0].id\n projectName = projects[0].name\n } else {\n spinner.stop()\n console.log(chalk.yellow('\\nMultiple projects found. Please specify with --project <id-or-name>:'))\n for (const p of projects) {\n const friendlyId = p.friendly_id ? `#${p.friendly_id}` : ''\n console.log(chalk.gray(` ${friendlyId} ${p.name}`))\n }\n process.exit(1)\n }\n\n spinner.text = 'Fetching environments...'\n const { data: environments, error: envListError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n\n if (envListError || !environments?.length) {\n spinner.fail('No environments found in project')\n process.exit(1)\n }\n\n const envName = options.environment || 'development'\n const environment = environments.find(e => e.name.toLowerCase() === envName.toLowerCase())\n \n if (!environment) {\n spinner.stop()\n console.log(chalk.yellow(`\\nEnvironment \"${envName}\" not found. Available:`))\n for (const e of environments) {\n console.log(chalk.gray(` ${e.name}`))\n }\n process.exit(1)\n }\n\n spinner.text = 'Fetching variables...'\n const { data: variables, error: varError } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environment.id,\n p_sync_secrets: false,\n p_sync_variables: true,\n p_include_fallbacks: false\n })\n\n if (varError) {\n spinner.fail('Failed to fetch variables')\n console.error(chalk.red(varError.message))\n process.exit(1)\n }\n\n const varsArray = (variables || []) as Variable[]\n\n if (existsSync(configPath) && !options.force) {\n spinner.stop()\n console.log(chalk.yellow(`\\nFile ${configPath} already exists. Use --force to overwrite.`))\n process.exit(1)\n }\n\n if (existsSync(templatePath) && !options.force) {\n spinner.stop()\n console.log(chalk.yellow(`\\nFile ${templatePath} already exists. Use --force to overwrite.`))\n process.exit(1)\n }\n\n spinner.text = 'Writing configuration...'\n\n const config = {\n project_id: projectId,\n environment: environment.name\n }\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n')\n\n const templateVars = varsArray.map(v => ({\n key: v.key,\n value: v.is_secret ? undefined : (v.value || undefined),\n isSecret: v.is_secret\n }))\n\n if (format === 'yaml') {\n const yamlContent = generateYamlTemplate(templateVars, { name: projectName })\n writeFileSync(templatePath, yamlContent)\n } else {\n const simpleContent = generateTemplate(templateVars, { includeDefaults: true })\n writeFileSync(templatePath, simpleContent)\n }\n\n spinner.succeed('Project initialized')\n console.log('')\n console.log(chalk.green('Created:'))\n console.log(chalk.gray(` ${configPath}`))\n console.log(chalk.gray(` ${templatePath}`))\n console.log('')\n console.log(chalk.cyan('Next steps:'))\n console.log(chalk.gray(' 1. Review and customize the template'))\n console.log(chalk.gray(' 2. Run `envmanager pull` to fetch current values'))\n console.log(chalk.gray(' 3. Run `envmanager dev` to start real-time sync'))\n\n } catch (error) {\n spinner.fail('Init failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","export interface TemplateVariable {\n key: string\n placeholder: string\n defaultValue: string | null\n required: boolean\n comment: string | null\n}\n\nexport interface ParsedTemplate {\n variables: TemplateVariable[]\n comments: string[]\n raw: string\n}\n\nconst PLACEHOLDER_REGEX = /\\$\\{([A-Z_][A-Z0-9_]*)(?::([^}]*))?\\}/g\nconst LINE_VAR_REGEX = /^([A-Z_][A-Z0-9_]*)=(.*)$/\n\nexport function parseTemplate(content: string): ParsedTemplate {\n const variables: TemplateVariable[] = []\n const comments: string[] = []\n const lines = content.split('\\n')\n \n let currentComment: string | null = null\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n if (trimmed.startsWith('#')) {\n currentComment = trimmed.substring(1).trim()\n comments.push(currentComment)\n continue\n }\n\n if (!trimmed) {\n currentComment = null\n continue\n }\n\n const match = trimmed.match(LINE_VAR_REGEX)\n if (match) {\n const [, key, value] = match\n const placeholderMatch = value.match(/^\\$\\{([A-Z_][A-Z0-9_]*)(?::([^}]*))?\\}$/)\n \n if (placeholderMatch) {\n const [, placeholderKey, defaultValue] = placeholderMatch\n variables.push({\n key,\n placeholder: placeholderKey,\n defaultValue: defaultValue ?? null,\n required: defaultValue === undefined,\n comment: currentComment\n })\n } else {\n variables.push({\n key,\n placeholder: key,\n defaultValue: value || null,\n required: false,\n comment: currentComment\n })\n }\n currentComment = null\n }\n }\n\n return { variables, comments, raw: content }\n}\n\nexport function extractPlaceholders(content: string): Map<string, { defaultValue: string | null; required: boolean }> {\n const placeholders = new Map<string, { defaultValue: string | null; required: boolean }>()\n \n let match\n while ((match = PLACEHOLDER_REGEX.exec(content)) !== null) {\n const [, name, defaultValue] = match\n placeholders.set(name, {\n defaultValue: defaultValue ?? null,\n required: defaultValue === undefined\n })\n }\n \n return placeholders\n}\n\nexport function substituteTemplate(\n template: string,\n values: Map<string, string>,\n options: { throwOnMissing?: boolean } = {}\n): { result: string; missing: string[] } {\n const missing: string[] = []\n \n const result = template.replace(PLACEHOLDER_REGEX, (match, name, defaultValue) => {\n if (values.has(name)) {\n return values.get(name)!\n }\n \n if (defaultValue !== undefined) {\n return defaultValue\n }\n \n missing.push(name)\n \n if (options.throwOnMissing) {\n throw new Error(`Missing required variable: ${name}`)\n }\n \n return match\n })\n\n return { result, missing }\n}\n\nexport function generateTemplate(\n variables: Array<{ key: string; value?: string; isSecret?: boolean; description?: string }>,\n options: { includeDefaults?: boolean; includeComments?: boolean } = {}\n): string {\n const lines: string[] = []\n \n for (const v of variables.sort((a, b) => a.key.localeCompare(b.key))) {\n if (options.includeComments && v.description) {\n lines.push(`# ${v.description}`)\n }\n \n if (v.isSecret) {\n lines.push(`${v.key}=\\${${v.key}}`)\n } else if (options.includeDefaults && v.value) {\n lines.push(`${v.key}=\\${${v.key}:${v.value}}`)\n } else {\n lines.push(`${v.key}=\\${${v.key}}`)\n }\n }\n \n return lines.join('\\n') + '\\n'\n}\n\nexport function validateAgainstTemplate(\n template: ParsedTemplate,\n env: Map<string, string>\n): { valid: boolean; missing: string[]; extra: string[] } {\n const required = template.variables\n .filter(v => v.required)\n .map(v => v.key)\n \n const templateKeys = new Set(template.variables.map(v => v.key))\n const envKeys = new Set(env.keys())\n \n const missing = required.filter(k => !env.has(k))\n const extra = Array.from(envKeys).filter(k => !templateKeys.has(k))\n \n return {\n valid: missing.length === 0,\n missing,\n extra\n }\n}\n","import yaml from 'js-yaml'\n\nexport type VariableType = 'string' | 'number' | 'boolean' | 'url' | 'email' | 'port' | 'path'\n\nexport interface YamlTemplateVariable {\n name: string\n type: VariableType\n required: boolean\n default?: string\n description?: string\n example?: string\n enum?: string[]\n pattern?: string\n min?: number\n max?: number\n}\n\nexport interface YamlTemplate {\n version: string\n name?: string\n description?: string\n variables: YamlTemplateVariable[]\n}\n\ninterface RawYamlVariable {\n type?: string\n required?: boolean\n default?: string | number | boolean\n description?: string\n example?: string | number | boolean\n enum?: (string | number)[]\n pattern?: string\n min?: number\n max?: number\n}\n\nexport function parseYamlTemplate(content: string): YamlTemplate {\n const parsed = yaml.load(content) as Record<string, unknown>\n \n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Invalid YAML template: must be an object')\n }\n\n const version = String(parsed.version || '1')\n const name = parsed.name as string | undefined\n const description = parsed.description as string | undefined\n const rawVariables = (parsed.variables || parsed.env || {}) as Record<string, RawYamlVariable | null>\n\n const variables: YamlTemplateVariable[] = []\n\n for (const [varName, config] of Object.entries(rawVariables)) {\n if (config === null) {\n variables.push({\n name: varName,\n type: 'string',\n required: true\n })\n continue\n }\n\n variables.push({\n name: varName,\n type: (config.type as VariableType) || 'string',\n required: config.required !== false,\n default: config.default !== undefined ? String(config.default) : undefined,\n description: config.description,\n example: config.example !== undefined ? String(config.example) : undefined,\n enum: config.enum?.map(String),\n pattern: config.pattern,\n min: config.min,\n max: config.max\n })\n }\n\n return { version, name, description, variables }\n}\n\nexport function validateValue(value: string, variable: YamlTemplateVariable): { valid: boolean; error?: string } {\n if (!value && variable.required && !variable.default) {\n return { valid: false, error: `${variable.name} is required` }\n }\n\n const actualValue = value || variable.default || ''\n\n if (!actualValue && !variable.required) {\n return { valid: true }\n }\n\n if (variable.enum && !variable.enum.includes(actualValue)) {\n return { valid: false, error: `${variable.name} must be one of: ${variable.enum.join(', ')}` }\n }\n\n if (variable.pattern) {\n const regex = new RegExp(variable.pattern)\n if (!regex.test(actualValue)) {\n return { valid: false, error: `${variable.name} does not match pattern: ${variable.pattern}` }\n }\n }\n\n switch (variable.type) {\n case 'number': {\n const num = Number(actualValue)\n if (isNaN(num)) {\n return { valid: false, error: `${variable.name} must be a number` }\n }\n if (variable.min !== undefined && num < variable.min) {\n return { valid: false, error: `${variable.name} must be >= ${variable.min}` }\n }\n if (variable.max !== undefined && num > variable.max) {\n return { valid: false, error: `${variable.name} must be <= ${variable.max}` }\n }\n break\n }\n\n case 'boolean': {\n const lower = actualValue.toLowerCase()\n if (!['true', 'false', '1', '0', 'yes', 'no'].includes(lower)) {\n return { valid: false, error: `${variable.name} must be a boolean` }\n }\n break\n }\n\n case 'url': {\n try {\n new URL(actualValue)\n } catch {\n return { valid: false, error: `${variable.name} must be a valid URL` }\n }\n break\n }\n\n case 'email': {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n if (!emailRegex.test(actualValue)) {\n return { valid: false, error: `${variable.name} must be a valid email` }\n }\n break\n }\n\n case 'port': {\n const port = Number(actualValue)\n if (isNaN(port) || port < 1 || port > 65535) {\n return { valid: false, error: `${variable.name} must be a valid port (1-65535)` }\n }\n break\n }\n\n case 'path': {\n if (!actualValue.startsWith('/') && !actualValue.startsWith('./') && !actualValue.startsWith('../')) {\n return { valid: false, error: `${variable.name} must be a valid path` }\n }\n break\n }\n }\n\n return { valid: true }\n}\n\nexport function validateYamlTemplate(\n template: YamlTemplate,\n env: Map<string, string>\n): { valid: boolean; errors: string[]; warnings: string[] } {\n const errors: string[] = []\n const warnings: string[] = []\n const templateKeys = new Set(template.variables.map(v => v.name))\n\n for (const variable of template.variables) {\n const value = env.get(variable.name)\n const result = validateValue(value || '', variable)\n \n if (!result.valid && result.error) {\n errors.push(result.error)\n }\n }\n\n for (const key of env.keys()) {\n if (!templateKeys.has(key)) {\n warnings.push(`Extra variable not in template: ${key}`)\n }\n }\n\n return { valid: errors.length === 0, errors, warnings }\n}\n\nexport function generateYamlTemplate(\n variables: Array<{ key: string; value?: string; isSecret?: boolean; description?: string }>,\n options: { name?: string; description?: string } = {}\n): string {\n const template: Record<string, unknown> = {\n version: '1'\n }\n\n if (options.name) {\n template.name = options.name\n }\n\n if (options.description) {\n template.description = options.description\n }\n\n const vars: Record<string, Record<string, unknown>> = {}\n\n for (const v of variables.sort((a, b) => a.key.localeCompare(b.key))) {\n const varConfig: Record<string, unknown> = {\n type: 'string',\n required: true\n }\n\n if (v.description) {\n varConfig.description = v.description\n }\n\n if (v.value && !v.isSecret) {\n varConfig.example = v.value\n }\n\n vars[v.key] = varConfig\n }\n\n template.variables = vars\n\n return yaml.dump(template, { lineWidth: -1, quotingType: '\"' })\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { readFileSync, writeFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { parse as parseDotenv } from 'dotenv'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { parseTemplate, substituteTemplate, validateAgainstTemplate } from '../lib/template-simple.js'\nimport { parseYamlTemplate, validateYamlTemplate } from '../lib/template-yaml.js'\nimport { Variable } from '../lib/types.js'\n\nexport const templateCommand = new Command('template')\n .description('Manage environment templates')\n\ntemplateCommand\n .command('generate')\n .description('Generate .env file from template and EnvManager values')\n .option('-t, --template <file>', 'Template file (default: .env.template or .env.template.yaml)')\n .option('-o, --output <file>', 'Output file (default: .env)')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('-f, --force', 'Overwrite existing output file')\n .action(async (options) => {\n const spinner = ora('Generating .env from template...').start()\n\n try {\n const config = loadConfig()\n const projectId = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n const outputPath = resolve(options.output || '.env')\n\n let templatePath = options.template\n let isYaml = false\n\n if (!templatePath) {\n if (existsSync('.env.template.yaml')) {\n templatePath = '.env.template.yaml'\n isYaml = true\n } else if (existsSync('.env.template')) {\n templatePath = '.env.template'\n } else {\n spinner.fail('No template file found')\n console.log(chalk.yellow('\\nCreate .env.template or .env.template.yaml first'))\n console.log(chalk.gray(' Run `envmanager init` to generate from EnvManager'))\n process.exit(1)\n }\n }\n\n templatePath = resolve(templatePath)\n isYaml = templatePath.endsWith('.yaml') || templatePath.endsWith('.yml')\n\n if (!existsSync(templatePath)) {\n spinner.fail(`Template file not found: ${templatePath}`)\n process.exit(1)\n }\n\n if (existsSync(outputPath) && !options.force) {\n spinner.stop()\n console.log(chalk.yellow(`\\nFile ${outputPath} already exists. Use --force to overwrite.`))\n process.exit(1)\n }\n\n if (!projectId) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify --project or create envmanager.json'))\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n .eq('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching variables...'\n const { data: variables, error: varError } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environment.id,\n p_sync_secrets: true,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (varError) {\n spinner.fail('Failed to fetch variables')\n process.exit(1)\n }\n\n const varsArray = (variables || []) as Variable[]\n const valuesMap = new Map<string, string>()\n for (const v of varsArray) {\n if (v.value !== null) {\n valuesMap.set(v.key, v.value)\n }\n }\n\n spinner.text = 'Generating output...'\n const templateContent = readFileSync(templatePath, 'utf-8')\n\n if (isYaml) {\n const parsed = parseYamlTemplate(templateContent)\n const lines: string[] = []\n\n for (const variable of parsed.variables.sort((a, b) => a.name.localeCompare(b.name))) {\n const value = valuesMap.get(variable.name) || variable.default || ''\n const needsQuotes = value.includes(' ') || value.includes('\\n') || value.includes('\"')\n const formatted = needsQuotes ? `\"${value.replace(/\"/g, '\\\\\"')}\"` : value\n lines.push(`${variable.name}=${formatted}`)\n }\n\n writeFileSync(outputPath, lines.join('\\n') + '\\n')\n } else {\n const parsed = parseTemplate(templateContent)\n const { result, missing } = substituteTemplate(templateContent, valuesMap)\n\n if (missing.length > 0) {\n spinner.warn('Generated with missing variables')\n console.log(chalk.yellow('\\nMissing variables (using placeholders):'))\n for (const m of missing) {\n console.log(chalk.yellow(` - ${m}`))\n }\n }\n\n const lines = result.split('\\n').filter(line => {\n const trimmed = line.trim()\n return !trimmed.startsWith('#') && trimmed.includes('=')\n })\n\n writeFileSync(outputPath, lines.join('\\n') + '\\n')\n }\n\n spinner.succeed(`Generated ${outputPath}`)\n console.log(chalk.gray(` From template: ${templatePath}`))\n console.log(chalk.gray(` Environment: ${envName}`))\n\n } catch (error) {\n spinner.fail('Generate failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\ntemplateCommand\n .command('sync')\n .description('Compare template with EnvManager and report differences')\n .option('-t, --template <file>', 'Template file (default: .env.template or .env.template.yaml)')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .action(async (options) => {\n const spinner = ora('Comparing template with EnvManager...').start()\n\n try {\n const config = loadConfig()\n const projectId = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n\n let templatePath = options.template\n let isYaml = false\n\n if (!templatePath) {\n if (existsSync('.env.template.yaml')) {\n templatePath = '.env.template.yaml'\n isYaml = true\n } else if (existsSync('.env.template')) {\n templatePath = '.env.template'\n } else {\n spinner.fail('No template file found')\n process.exit(1)\n }\n }\n\n templatePath = resolve(templatePath)\n isYaml = templatePath.endsWith('.yaml') || templatePath.endsWith('.yml')\n\n if (!existsSync(templatePath)) {\n spinner.fail(`Template file not found: ${templatePath}`)\n process.exit(1)\n }\n\n if (!projectId) {\n spinner.fail('No project specified')\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n .eq('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching variables...'\n const { data: variables, error: varError } = await client.rpc('get_variables_for_sync', {\n p_environment_id: environment.id,\n p_sync_secrets: false,\n p_sync_variables: true,\n p_include_fallbacks: false,\n })\n\n if (varError) {\n spinner.fail('Failed to fetch variables')\n process.exit(1)\n }\n\n const varsArray = (variables || []) as Variable[]\n const remoteKeys = new Set(varsArray.map(v => v.key))\n const templateContent = readFileSync(templatePath, 'utf-8')\n\n let templateKeys: Set<string>\n\n if (isYaml) {\n const parsed = parseYamlTemplate(templateContent)\n templateKeys = new Set(parsed.variables.map(v => v.name))\n } else {\n const parsed = parseTemplate(templateContent)\n templateKeys = new Set(parsed.variables.map(v => v.key))\n }\n\n const missingInRemote: string[] = []\n const missingInTemplate: string[] = []\n const inBoth: string[] = []\n\n for (const key of templateKeys) {\n if (remoteKeys.has(key)) {\n inBoth.push(key)\n } else {\n missingInRemote.push(key)\n }\n }\n\n for (const key of remoteKeys) {\n if (!templateKeys.has(key)) {\n missingInTemplate.push(key)\n }\n }\n\n spinner.stop()\n\n console.log('')\n console.log(chalk.cyan('Template Sync Report'))\n console.log(chalk.gray(`Template: ${templatePath}`))\n console.log(chalk.gray(`Environment: ${envName}`))\n console.log('')\n\n if (missingInRemote.length === 0 && missingInTemplate.length === 0) {\n console.log(chalk.green('Template and EnvManager are in sync'))\n console.log(chalk.gray(`${inBoth.length} variables matched`))\n } else {\n if (missingInRemote.length > 0) {\n console.log(chalk.yellow(`Missing in EnvManager (${missingInRemote.length}):`))\n for (const key of missingInRemote.sort()) {\n console.log(chalk.yellow(` + ${key}`))\n }\n console.log('')\n }\n\n if (missingInTemplate.length > 0) {\n console.log(chalk.blue(`Missing in template (${missingInTemplate.length}):`))\n for (const key of missingInTemplate.sort()) {\n console.log(chalk.blue(` - ${key}`))\n }\n console.log('')\n }\n\n console.log(chalk.gray(`${inBoth.length} variables matched`))\n }\n\n } catch (error) {\n spinner.fail('Sync check failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\ntemplateCommand\n .command('validate')\n .description('Validate local .env file against template')\n .option('-t, --template <file>', 'Template file (default: .env.template or .env.template.yaml)')\n .option('-i, --input <file>', 'Input .env file (default: .env)')\n .action(async (options) => {\n const spinner = ora('Validating .env against template...').start()\n\n try {\n const inputPath = resolve(options.input || '.env')\n\n if (!existsSync(inputPath)) {\n spinner.fail(`Input file not found: ${inputPath}`)\n process.exit(1)\n }\n\n let templatePath = options.template\n let isYaml = false\n\n if (!templatePath) {\n if (existsSync('.env.template.yaml')) {\n templatePath = '.env.template.yaml'\n isYaml = true\n } else if (existsSync('.env.template')) {\n templatePath = '.env.template'\n } else {\n spinner.fail('No template file found')\n process.exit(1)\n }\n }\n\n templatePath = resolve(templatePath)\n isYaml = templatePath.endsWith('.yaml') || templatePath.endsWith('.yml')\n\n if (!existsSync(templatePath)) {\n spinner.fail(`Template file not found: ${templatePath}`)\n process.exit(1)\n }\n\n const envContent = readFileSync(inputPath, 'utf-8')\n const envVars = new Map(Object.entries(parseDotenv(envContent)))\n const templateContent = readFileSync(templatePath, 'utf-8')\n\n spinner.stop()\n\n if (isYaml) {\n const parsed = parseYamlTemplate(templateContent)\n const result = validateYamlTemplate(parsed, envVars)\n\n console.log('')\n if (result.valid && result.warnings.length === 0) {\n console.log(chalk.green('Validation passed'))\n } else {\n if (result.errors.length > 0) {\n console.log(chalk.red(`Validation failed (${result.errors.length} errors):`))\n for (const error of result.errors) {\n console.log(chalk.red(` - ${error}`))\n }\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(`\\nWarnings (${result.warnings.length}):`))\n for (const warning of result.warnings) {\n console.log(chalk.yellow(` - ${warning}`))\n }\n }\n\n if (!result.valid) {\n process.exit(1)\n }\n }\n } else {\n const parsed = parseTemplate(templateContent)\n const result = validateAgainstTemplate(parsed, envVars)\n\n console.log('')\n if (result.valid && result.extra.length === 0) {\n console.log(chalk.green('Validation passed'))\n } else {\n if (result.missing.length > 0) {\n console.log(chalk.red(`Missing required variables (${result.missing.length}):`))\n for (const key of result.missing) {\n console.log(chalk.red(` - ${key}`))\n }\n }\n\n if (result.extra.length > 0) {\n console.log(chalk.yellow(`\\nExtra variables not in template (${result.extra.length}):`))\n for (const key of result.extra) {\n console.log(chalk.yellow(` - ${key}`))\n }\n }\n\n if (!result.valid) {\n process.exit(1)\n }\n }\n }\n\n } catch (error) {\n spinner.fail('Validation failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { readFileSync, existsSync } from 'fs'\nimport { resolve } from 'path'\nimport { parse as parseDotenv } from 'dotenv'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { resolveProjectId, resolveOrganizationId } from '../lib/resolve.js'\nimport { validateEnvAgainstSchema, jsonToSchema, type EnvSchema } from '../lib/schema.js'\n\nexport const validateCommand = new Command('validate')\n .description('Validate local .env file against schema from EnvManager or local file')\n .option('-e, --environment <name>', 'Environment name (default: \"development\")')\n .option('-p, --project <id>', 'Project ID (default: from config)')\n .option('--org <name>', 'Organization name (required if you belong to multiple)')\n .option('-i, --input <file>', 'Input .env file (default: .env)')\n .option('-s, --schema <file>', 'Local schema JSON file (skip fetching from EnvManager)')\n .option('--strict', 'Fail on warnings (extra variables not in schema)')\n .action(async (options) => {\n const spinner = ora('Validating environment...').start()\n\n try {\n const config = loadConfig()\n const inputPath = resolve(options.input || '.env')\n\n if (!existsSync(inputPath)) {\n spinner.fail(`Input file not found: ${inputPath}`)\n process.exit(1)\n }\n\n const envContent = readFileSync(inputPath, 'utf-8')\n const envVars = new Map(Object.entries(parseDotenv(envContent)))\n\n let schema: EnvSchema\n\n if (options.schema) {\n spinner.text = 'Loading local schema...'\n const schemaPath = resolve(options.schema)\n \n if (!existsSync(schemaPath)) {\n spinner.fail(`Schema file not found: ${schemaPath}`)\n process.exit(1)\n }\n\n const schemaContent = readFileSync(schemaPath, 'utf-8')\n const schemaJson = JSON.parse(schemaContent) as Record<string, unknown>\n schema = jsonToSchema(schemaJson)\n } else {\n const projectInput = options.project || config?.project_id\n const envName = options.environment || config?.environment || 'development'\n\n if (!projectInput) {\n spinner.fail('No project specified')\n console.log(chalk.yellow('\\nSpecify --project or use --schema for local validation'))\n process.exit(1)\n }\n\n spinner.text = 'Authenticating...'\n const client = await createClient()\n\n let organizationId: string\n try {\n organizationId = await resolveOrganizationId(options.org, client, projectInput)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve organization')\n process.exit(1)\n }\n\n let projectId: string\n try {\n projectId = await resolveProjectId(projectInput, client, organizationId)\n } catch (error) {\n spinner.fail(error instanceof Error ? error.message : 'Failed to resolve project')\n process.exit(1)\n }\n\n spinner.text = 'Fetching environment...'\n const { data: environment, error: envError } = await client\n .from('environments')\n .select('id, name')\n .eq('project_id', projectId)\n .ilike('name', envName)\n .single()\n\n if (envError || !environment) {\n spinner.fail(`Environment \"${envName}\" not found`)\n process.exit(1)\n }\n\n spinner.text = 'Fetching schema...'\n const { data: schemaJson, error: schemaError } = await client.rpc('get_environment_schema', {\n p_environment_id: environment.id\n })\n\n if (schemaError) {\n spinner.fail('Failed to fetch schema')\n console.error(chalk.red(schemaError.message))\n process.exit(1)\n }\n\n if (!schemaJson) {\n spinner.warn('No schema defined for this environment')\n console.log(chalk.yellow('\\nTo create a schema, use the web UI or upload with:'))\n console.log(chalk.gray(' envmanager validate --schema schema.json'))\n process.exit(0)\n }\n\n schema = jsonToSchema(schemaJson as Record<string, unknown>)\n }\n\n spinner.text = 'Validating...'\n const result = validateEnvAgainstSchema(envVars, schema)\n\n spinner.stop()\n\n console.log('')\n console.log(chalk.cyan('Validation Results'))\n console.log(chalk.gray(`File: ${inputPath}`))\n console.log(chalk.gray(`Variables: ${envVars.size}`))\n console.log(chalk.gray(`Schema fields: ${Object.keys(schema).length}`))\n console.log('')\n\n if (result.valid && result.warnings.length === 0) {\n console.log(chalk.green('All validations passed'))\n process.exit(0)\n }\n\n if (result.errors.length > 0) {\n console.log(chalk.red(`Errors (${result.errors.length}):`))\n for (const error of result.errors) {\n console.log(chalk.red(` - ${error.message}`))\n if (error.value) {\n console.log(chalk.gray(` Value: \"${error.value}\"`))\n }\n }\n console.log('')\n }\n\n if (result.warnings.length > 0) {\n console.log(chalk.yellow(`Warnings (${result.warnings.length}):`))\n for (const warning of result.warnings) {\n console.log(chalk.yellow(` - ${warning}`))\n }\n console.log('')\n }\n\n if (!result.valid) {\n console.log(chalk.red('Validation failed'))\n process.exit(1)\n }\n\n if (options.strict && result.warnings.length > 0) {\n console.log(chalk.red('Validation failed (strict mode)'))\n process.exit(1)\n }\n\n console.log(chalk.green('Validation passed with warnings'))\n\n } catch (error) {\n spinner.fail('Validation failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { z } from 'zod'\n\nexport type SchemaFieldType = 'string' | 'number' | 'boolean' | 'url' | 'email' | 'port' | 'json'\n\nexport interface SchemaField {\n type: SchemaFieldType\n required?: boolean\n default?: string\n description?: string\n enum?: string[]\n pattern?: string\n minimum?: number\n maximum?: number\n minLength?: number\n maxLength?: number\n}\n\nexport type EnvSchema = Record<string, SchemaField>\n\nconst fieldTypeValidators: Record<SchemaFieldType, (value: string) => boolean> = {\n string: () => true,\n number: (v) => !isNaN(Number(v)),\n boolean: (v) => ['true', 'false', '1', '0', 'yes', 'no'].includes(v.toLowerCase()),\n url: (v) => { try { new URL(v); return true } catch { return false } },\n email: (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v),\n port: (v) => { const n = Number(v); return !isNaN(n) && n >= 1 && n <= 65535 },\n json: (v) => { try { JSON.parse(v); return true } catch { return false } }\n}\n\nexport interface ValidationError {\n key: string\n message: string\n value?: string\n}\n\nexport interface ValidationResult {\n valid: boolean\n errors: ValidationError[]\n warnings: string[]\n}\n\nexport function validateEnvAgainstSchema(\n env: Map<string, string>,\n schema: EnvSchema\n): ValidationResult {\n const errors: ValidationError[] = []\n const warnings: string[] = []\n\n for (const [key, field] of Object.entries(schema)) {\n const value = env.get(key)\n const actualValue = value ?? field.default\n\n if (field.required !== false && !actualValue) {\n errors.push({ key, message: `${key} is required` })\n continue\n }\n\n if (!actualValue) continue\n\n const validator = fieldTypeValidators[field.type]\n if (!validator(actualValue)) {\n errors.push({ key, message: `${key} must be a valid ${field.type}`, value: actualValue })\n continue\n }\n\n if (field.enum && !field.enum.includes(actualValue)) {\n errors.push({ key, message: `${key} must be one of: ${field.enum.join(', ')}`, value: actualValue })\n continue\n }\n\n if (field.pattern) {\n const regex = new RegExp(field.pattern)\n if (!regex.test(actualValue)) {\n errors.push({ key, message: `${key} does not match pattern: ${field.pattern}`, value: actualValue })\n continue\n }\n }\n\n if (field.type === 'number') {\n const num = Number(actualValue)\n if (field.minimum !== undefined && num < field.minimum) {\n errors.push({ key, message: `${key} must be >= ${field.minimum}`, value: actualValue })\n }\n if (field.maximum !== undefined && num > field.maximum) {\n errors.push({ key, message: `${key} must be <= ${field.maximum}`, value: actualValue })\n }\n }\n\n if (field.type === 'string') {\n if (field.minLength !== undefined && actualValue.length < field.minLength) {\n errors.push({ key, message: `${key} must be at least ${field.minLength} characters`, value: actualValue })\n }\n if (field.maxLength !== undefined && actualValue.length > field.maxLength) {\n errors.push({ key, message: `${key} must be at most ${field.maxLength} characters`, value: actualValue })\n }\n }\n }\n\n const schemaKeys = new Set(Object.keys(schema))\n for (const key of env.keys()) {\n if (!schemaKeys.has(key)) {\n warnings.push(`${key} is not defined in schema`)\n }\n }\n\n return { valid: errors.length === 0, errors, warnings }\n}\n\nexport function schemaToZod(schema: EnvSchema): z.ZodObject<Record<string, z.ZodTypeAny>> {\n const shape: Record<string, z.ZodTypeAny> = {}\n\n for (const [key, field] of Object.entries(schema)) {\n let zodType: z.ZodTypeAny\n\n switch (field.type) {\n case 'number':\n zodType = z.string().transform(Number).pipe(z.number())\n if (field.minimum !== undefined) zodType = (zodType as z.ZodNumber).min(field.minimum)\n if (field.maximum !== undefined) zodType = (zodType as z.ZodNumber).max(field.maximum)\n break\n\n case 'boolean':\n zodType = z.string().transform(v => ['true', '1', 'yes'].includes(v.toLowerCase()))\n break\n\n case 'url':\n zodType = z.string().url()\n break\n\n case 'email':\n zodType = z.string().email()\n break\n\n case 'port':\n zodType = z.string().transform(Number).pipe(z.number().int().min(1).max(65535))\n break\n\n case 'json':\n zodType = z.string().transform(v => JSON.parse(v))\n break\n\n default:\n zodType = z.string()\n if (field.minLength) zodType = (zodType as z.ZodString).min(field.minLength)\n if (field.maxLength) zodType = (zodType as z.ZodString).max(field.maxLength)\n if (field.pattern) zodType = (zodType as z.ZodString).regex(new RegExp(field.pattern))\n }\n\n if (field.enum) {\n zodType = z.enum(field.enum as [string, ...string[]])\n }\n\n if (field.required === false) {\n zodType = zodType.optional()\n if (field.default) {\n zodType = zodType.default(field.default)\n }\n }\n\n shape[key] = zodType\n }\n\n return z.object(shape)\n}\n\nexport function schemaToJson(schema: EnvSchema): object {\n const properties: Record<string, object> = {}\n const required: string[] = []\n\n for (const [key, field] of Object.entries(schema)) {\n const prop: Record<string, unknown> = {}\n\n switch (field.type) {\n case 'number':\n case 'port':\n prop.type = 'number'\n if (field.minimum !== undefined) prop.minimum = field.minimum\n if (field.maximum !== undefined) prop.maximum = field.maximum\n break\n case 'boolean':\n prop.type = 'boolean'\n break\n default:\n prop.type = 'string'\n if (field.minLength !== undefined) prop.minLength = field.minLength\n if (field.maxLength !== undefined) prop.maxLength = field.maxLength\n if (field.pattern) prop.pattern = field.pattern\n }\n\n if (field.type === 'url') prop.format = 'uri'\n if (field.type === 'email') prop.format = 'email'\n if (field.enum) prop.enum = field.enum\n if (field.default !== undefined) prop.default = field.default\n if (field.description) prop.description = field.description\n\n properties[key] = prop\n\n if (field.required !== false) {\n required.push(key)\n }\n }\n\n return {\n $schema: 'http://json-schema.org/draft-07/schema#',\n type: 'object',\n properties,\n required,\n additionalProperties: true\n }\n}\n\nexport function jsonToSchema(json: Record<string, unknown>): EnvSchema {\n const schema: EnvSchema = {}\n \n if (!json || typeof json !== 'object') {\n return schema\n }\n\n for (const [key, value] of Object.entries(json)) {\n if (!value || typeof value !== 'object') continue\n \n const field = value as Record<string, unknown>\n const schemaField: SchemaField = { type: 'string' }\n\n if (field.type === 'number') {\n schemaField.type = 'number'\n if (typeof field.minimum === 'number') schemaField.minimum = field.minimum\n if (typeof field.maximum === 'number') schemaField.maximum = field.maximum\n } else if (field.type === 'boolean') {\n schemaField.type = 'boolean'\n } else {\n if (field.format === 'uri' || field.format === 'url') schemaField.type = 'url'\n else if (field.format === 'email') schemaField.type = 'email'\n else if (typeof field.pattern === 'string' && field.pattern.includes('^postgres')) schemaField.type = 'url'\n }\n\n if (Array.isArray(field.enum)) schemaField.enum = field.enum as string[]\n if (typeof field.pattern === 'string') schemaField.pattern = field.pattern\n if (typeof field.default === 'string') schemaField.default = field.default\n if (typeof field.description === 'string') schemaField.description = field.description\n if (typeof field.minLength === 'number') schemaField.minLength = field.minLength\n if (typeof field.maxLength === 'number') schemaField.maxLength = field.maxLength\n if (field.required === false) schemaField.required = false\n else schemaField.required = true\n\n schema[key] = schemaField\n }\n\n return schema\n}\n","import { Command } from 'commander'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig } from '../lib/config.js'\nimport { getCredentials } from '../lib/credentials.js'\n\nconst COMMANDS = [\n 'login',\n 'logout', \n 'whoami',\n 'pull',\n 'push',\n 'diff',\n 'list',\n 'config',\n 'dev',\n 'init',\n 'template',\n 'validate',\n 'completion',\n]\n\nconst LIST_RESOURCES = ['projects', 'environments', 'variables']\n\nconst bashScript = `\n_envmanager_completions() {\n local cur prev words cword\n _init_completion || return\n\n local completions\n completions=$(envmanager __complete \"\\${COMP_WORDS[@]:1}\" 2>/dev/null)\n \n if [[ $? -eq 0 ]]; then\n COMPREPLY=($(compgen -W \"$completions\" -- \"$cur\"))\n fi\n}\n\ncomplete -F _envmanager_completions envmanager\n`.trim()\n\nconst zshScript = `\n#compdef envmanager\n\n_envmanager() {\n local completions\n completions=(\"\\${(@f)$(envmanager __complete \"\\${words[@]:1}\" 2>/dev/null)}\")\n \n if [[ \\${#completions[@]} -gt 0 ]]; then\n _describe 'envmanager' completions\n fi\n}\n\ncompdef _envmanager envmanager\n`.trim()\n\nconst fishScript = `\nfunction __fish_envmanager_complete\n set -l tokens (commandline -opc)\n set -l current (commandline -ct)\n envmanager __complete $tokens[2..-1] $current 2>/dev/null\nend\n\ncomplete -c envmanager -f -a '(__fish_envmanager_complete)'\n`.trim()\n\nasync function getCompletions(args: string[]): Promise<string[]> {\n if (args.length === 0) {\n return COMMANDS\n }\n\n const command = args[0]\n const lastArg = args[args.length - 1] ?? ''\n const prevArg = args.length > 1 ? args[args.length - 2] : ''\n\n if (args.length === 1 && !COMMANDS.includes(command)) {\n return COMMANDS.filter(c => c.startsWith(command))\n }\n\n if (command === 'list' && args.length === 2) {\n return LIST_RESOURCES.filter(r => r.startsWith(lastArg))\n }\n\n if (prevArg === '--project' || prevArg === '-p') {\n return await getProjectCompletions(lastArg)\n }\n\n if (prevArg === '--environment' || prevArg === '-e') {\n const projectArg = findArgValue(args, ['--project', '-p'])\n return await getEnvironmentCompletions(lastArg, projectArg)\n }\n\n const commandsWithProject = ['pull', 'push', 'diff', 'list', 'dev', 'validate', 'template']\n const commandsWithEnv = ['pull', 'push', 'diff', 'dev', 'validate', 'template']\n\n const suggestions: string[] = []\n\n if (commandsWithProject.includes(command) && !hasArg(args, ['--project', '-p'])) {\n suggestions.push('--project')\n }\n\n if (commandsWithEnv.includes(command) && !hasArg(args, ['--environment', '-e'])) {\n suggestions.push('--environment')\n }\n\n switch (command) {\n case 'pull':\n if (!hasArg(args, ['--output', '-o'])) suggestions.push('--output')\n if (!hasArg(args, ['--force', '-f'])) suggestions.push('--force')\n if (!hasArg(args, ['--no-secrets'])) suggestions.push('--no-secrets')\n break\n case 'push':\n if (!hasArg(args, ['--input', '-i'])) suggestions.push('--input')\n if (!hasArg(args, ['--secrets'])) suggestions.push('--secrets')\n if (!hasArg(args, ['--all-secrets'])) suggestions.push('--all-secrets')\n if (!hasArg(args, ['--dry-run'])) suggestions.push('--dry-run')\n break\n case 'list':\n if (!hasArg(args, ['--verbose', '-v'])) suggestions.push('--verbose')\n break\n case 'dev':\n if (!hasArg(args, ['--output', '-o'])) suggestions.push('--output')\n if (!hasArg(args, ['--watch', '-w'])) suggestions.push('--watch')\n break\n case 'template':\n if (args.length === 2) {\n return ['generate', 'sync', 'validate'].filter(s => s.startsWith(lastArg))\n }\n break\n case 'completion':\n if (args.length === 2) {\n return ['bash', 'zsh', 'fish'].filter(s => s.startsWith(lastArg))\n }\n break\n case 'config':\n if (args.length === 2) {\n return ['show'].filter(s => s.startsWith(lastArg))\n }\n break\n }\n\n return suggestions.filter(s => s.startsWith(lastArg))\n}\n\nfunction findArgValue(args: string[], flags: string[]): string | undefined {\n for (let i = 0; i < args.length - 1; i++) {\n if (flags.includes(args[i])) {\n return args[i + 1]\n }\n }\n return undefined\n}\n\nfunction hasArg(args: string[], flags: string[]): boolean {\n return args.some(a => flags.includes(a))\n}\n\nasync function getProjectCompletions(prefix: string): Promise<string[]> {\n try {\n if (!getCredentials()) return []\n \n const client = await createClient()\n \n const { data: { user } } = await client.auth.getUser()\n if (!user) return []\n\n const { data: memberships } = await client\n .from('organization_members')\n .select('organization_id')\n .eq('user_id', user.id)\n\n if (!memberships || memberships.length === 0) return []\n \n const orgIds = memberships.map(m => m.organization_id)\n \n const { data: projects } = await client\n .from('projects')\n .select('name')\n .in('organization_id', orgIds)\n .order('name')\n \n if (!projects) return []\n \n return projects\n .map(p => p.name)\n .filter(name => name.toLowerCase().startsWith(prefix.toLowerCase()))\n } catch {\n return []\n }\n}\n\nasync function getEnvironmentCompletions(prefix: string, projectName?: string): Promise<string[]> {\n try {\n if (!getCredentials()) return []\n \n const client = await createClient()\n const config = loadConfig()\n \n let projectId = config?.project_id\n \n if (projectName) {\n const isUUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n if (isUUID.test(projectName)) {\n projectId = projectName\n } else {\n const { data: project } = await client\n .from('projects')\n .select('id')\n .ilike('name', projectName)\n .single()\n \n if (project) {\n projectId = project.id\n }\n }\n }\n \n const defaultEnvs = ['development', 'staging', 'production', 'test']\n \n if (!projectId) {\n return defaultEnvs.filter(e => e.startsWith(prefix.toLowerCase()))\n }\n \n const { data: environments } = await client\n .from('environments')\n .select('name')\n .eq('project_id', projectId)\n .order('name')\n \n if (!environments) {\n return defaultEnvs.filter(e => e.startsWith(prefix.toLowerCase()))\n }\n \n return environments\n .map(e => e.name)\n .filter(name => name.toLowerCase().startsWith(prefix.toLowerCase()))\n } catch {\n return ['development', 'staging', 'production', 'test']\n .filter(e => e.startsWith(prefix.toLowerCase()))\n }\n}\n\nexport const completeCommand = new Command('__complete')\n .description('Internal command for shell completion')\n .allowUnknownOption()\n .allowExcessArguments()\n .argument('[args...]', 'Arguments to complete')\n .action(async (args: string[]) => {\n try {\n const completions = await getCompletions(args || [])\n completions.forEach(c => console.log(c))\n } catch {\n process.exit(1)\n }\n })\n\nexport const completionCommand = new Command('completion')\n .description('Generate shell completion script')\n .argument('<shell>', 'Shell type: bash, zsh, or fish')\n .action((shell: string) => {\n switch (shell.toLowerCase()) {\n case 'bash':\n console.log(bashScript)\n console.log('\\n# Add to ~/.bashrc:')\n console.log('# eval \"$(envmanager completion bash)\"')\n break\n case 'zsh':\n console.log(zshScript)\n console.log('\\n# Add to ~/.zshrc:')\n console.log('# eval \"$(envmanager completion zsh)\"')\n break\n case 'fish':\n console.log(fishScript)\n console.log('\\n# Save to ~/.config/fish/completions/envmanager.fish:')\n console.log('# envmanager completion fish > ~/.config/fish/completions/envmanager.fish')\n break\n default:\n console.error(`Unknown shell: ${shell}`)\n console.error('Supported: bash, zsh, fish')\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url'\nimport { dirname, resolve } from 'path'\nimport { createClient } from '../lib/client.js'\nimport { loadConfig, getConfigPath } from '../lib/config.js'\nimport { getCredentials, getApiKeyFromEnv, getStoredApiKey, getStoredApiUrl } from '../lib/credentials.js'\n\nfunction getCliVersion(): string {\n try {\n const __dirname = dirname(fileURLToPath(import.meta.url))\n const pkg = JSON.parse(readFileSync(resolve(__dirname, '../../package.json'), 'utf-8'))\n return pkg.version || 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nexport const debugCommand = new Command('debug')\n .description('Collect diagnostic info for troubleshooting')\n .action(async () => {\n const lines: string[] = []\n const log = (msg: string) => lines.push(msg)\n\n log('=== EnvManager CLI Debug Report ===')\n log(`Timestamp: ${new Date().toISOString()}`)\n log(`CLI Version: ${getCliVersion()}`)\n log(`Node: ${process.version}`)\n log(`Platform: ${process.platform} ${process.arch}`)\n log('')\n\n // Config\n log('--- Config ---')\n const configPath = getConfigPath()\n const config = loadConfig()\n log(`Config file: ${configPath || 'not found'}`)\n if (config) {\n log(` project_id: ${config.project_id || 'not set'}`)\n log(` project_name: ${config.project_name || 'not set'}`)\n log(` environment: ${config.environment || 'not set'}`)\n log(` organization_id: ${config.organization_id || 'not set'}`)\n log(` api_url: ${config.api_url || 'not set'}`)\n }\n log('')\n\n // Auth\n log('--- Authentication ---')\n const envApiKey = getApiKeyFromEnv()\n const storedApiKey = getStoredApiKey()\n const storedApiUrl = getStoredApiUrl()\n const creds = getCredentials()\n\n if (envApiKey) {\n log(`Auth method: Environment API key (${envApiKey.substring(0, 11)}...)`)\n } else if (storedApiKey) {\n log(`Auth method: CLI session key (${storedApiKey.substring(0, 11)}...)`)\n } else if (creds?.accessToken) {\n log('Auth method: Legacy session tokens')\n if (creds.expiresAt) {\n const remaining = Math.round((creds.expiresAt - Date.now()) / 1000)\n log(` Token expires in: ${remaining > 0 ? `${remaining}s` : 'EXPIRED'}`)\n }\n } else {\n log('Auth method: Not authenticated')\n }\n log(`API URL: ${storedApiUrl || process.env.ENVMANAGER_API_URL || 'default (production)'}`)\n log('')\n\n // API connectivity & user\n log('--- API Connection ---')\n try {\n const start = Date.now()\n const client = await createClient()\n const authTime = Date.now() - start\n log(`Auth exchange: ${authTime}ms`)\n\n const userStart = Date.now()\n const { data: { user }, error: userError } = await client.auth.getUser()\n const userTime = Date.now() - userStart\n log(`getUser: ${userTime}ms`)\n\n if (userError) {\n log(` ERROR: ${userError.message}`)\n } else if (user) {\n log(` User ID: ${user.id}`)\n log(` Email: ${user.email}`)\n }\n\n // Orgs\n if (user) {\n const orgStart = Date.now()\n const { data: memberships, error: orgError } = await client\n .from('organization_members')\n .select('organization_id, role, organizations(id, name)')\n .eq('user_id', user.id)\n const orgTime = Date.now() - orgStart\n log(`Org query: ${orgTime}ms`)\n\n if (orgError) {\n log(` ERROR: ${orgError.message}`)\n } else if (memberships) {\n log(` Organizations (${memberships.length}):`)\n memberships.forEach(m => {\n const org = m.organizations as { id: string; name: string } | { id: string; name: string }[] | null\n const orgName = Array.isArray(org) ? org[0]?.name : org?.name || 'Unknown'\n const orgId = Array.isArray(org) ? org[0]?.id : org?.id || '?'\n log(` - ${orgName} (${m.role}) [${orgId.substring(0, 8)}...]`)\n })\n }\n }\n } catch (error) {\n log(` ERROR: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n\n log('')\n log('=== End Debug Report ===')\n\n // Print all lines\n const output = lines.join('\\n')\n console.log(output)\n\n console.log('')\n console.log(chalk.gray('Copy the output above and share it for troubleshooting.'))\n console.log(chalk.gray('Note: API keys are partially redacted. No secrets are exposed.'))\n })\n"],"mappings":"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","names":["Command","readFileSync","dirname","resolve","fileURLToPath","resolve","Command","chalk","Command","chalk","Command","chalk","ora","DEFAULT_API_URL","getApiUrl","Command","chalk","ora","Command","chalk","ora","writeFileSync","existsSync","existsSync","readFileSync","join","join","existsSync","readFileSync","data","error","data","base","source","Command","ora","chalk","existsSync","writeFileSync","Command","chalk","ora","readFileSync","existsSync","resolve","chalk","Command","ora","resolve","chalk","existsSync","readFileSync","Command","chalk","ora","readFileSync","existsSync","resolve","Command","ora","resolve","chalk","existsSync","readFileSync","Command","chalk","ora","Command","ora","chalk","Command","chalk","Command","chalk","Command","chalk","ora","writeFileSync","existsSync","readFileSync","resolve","parseDotenv","resolve","existsSync","readFileSync","parseDotenv","Command","ora","resolve","chalk","existsSync","readFileSync","parseDotenv","writeFileSync","Command","chalk","ora","writeFileSync","existsSync","resolve","yaml","Command","ora","resolve","chalk","existsSync","writeFileSync","Command","chalk","ora","readFileSync","writeFileSync","existsSync","resolve","parseDotenv","Command","ora","resolve","existsSync","chalk","readFileSync","writeFileSync","parseDotenv","Command","chalk","ora","readFileSync","existsSync","resolve","parseDotenv","z","Command","ora","resolve","existsSync","readFileSync","parseDotenv","chalk","Command","Command","Command","chalk","readFileSync","dirname","resolve","__dirname","dirname","pkg","readFileSync","resolve","Command","chalk","__dirname","dirname","fileURLToPath","readFileSync","resolve","Command"]}