beakcrypt 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -208,9 +208,9 @@ ${link(loginUrl)}
208
208
  }
209
209
  function getDefaultUrls() {
210
210
  return {
211
- siteUrl: process.env.BEAKCRYPT_SITE_URL ?? "https://app.beakcrypt.com",
212
- convexUrl: process.env.BEAKCRYPT_CONVEX_URL ?? "",
213
- convexSiteUrl: process.env.BEAKCRYPT_CONVEX_SITE_URL ?? ""
211
+ siteUrl: process.env.BEAKCRYPT_SITE_URL ?? "https://beakcrypt.com",
212
+ convexUrl: process.env.BEAKCRYPT_CONVEX_URL ?? "https://wandering-stingray-407.convex.cloud",
213
+ convexSiteUrl: process.env.BEAKCRYPT_CONVEX_SITE_URL ?? "https://wandering-stingray-407.convex.site"
214
214
  };
215
215
  }
216
216
  function validateUrls(urls) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/errors.ts","../../convex/src/_generated/api.js","../src/lib/global-config.ts","../src/lib/auth.ts","../src/lib/output.ts","../src/lib/convex-client.ts","../src/commands/login.ts","../src/lib/interactive.ts","../src/commands/logout.ts","../src/lib/project-config.ts","../src/lib/context.ts","../src/commands/whoami.ts","../src/lib/key-manager.ts","../../crypto/src/core.ts","../src/lib/key-store.ts","../src/commands/link.ts","../src/commands/pull.ts","../src/lib/env-file.ts","../src/commands/push.ts","../src/commands/run.ts","../src/commands/secrets/list.ts","../src/commands/secrets/set.ts","../src/commands/secrets/remove.ts","../src/commands/secrets/clear.ts","../src/commands/org/list.ts","../src/commands/env/list.ts","../src/interactive-mode.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { handleError } from \"./lib/errors\";\nimport { loginCommand } from \"./commands/login\";\nimport { logoutCommand } from \"./commands/logout\";\nimport { whoamiCommand } from \"./commands/whoami\";\nimport { linkCommand } from \"./commands/link\";\nimport { pullCommand } from \"./commands/pull\";\nimport { pushCommand } from \"./commands/push\";\nimport { runCommand } from \"./commands/run\";\nimport { secretsListCommand } from \"./commands/secrets/list\";\nimport { secretsSetCommand } from \"./commands/secrets/set\";\nimport { secretsRemoveCommand } from \"./commands/secrets/remove\";\nimport { secretsClearCommand } from \"./commands/secrets/clear\";\nimport { orgListCommand } from \"./commands/org/list\";\nimport { envListCommand } from \"./commands/env/list\";\nimport { interactiveMode } from \"./interactive-mode\";\n\nconst program = new Command();\n\nprogram\n .name(\"beakcrypt\")\n .description(\"Secure environment variable management with E2E encryption\")\n .version(\"0.1.0\")\n .action(async () => {\n try {\n await interactiveMode();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Auth commands\nprogram\n .command(\"login\")\n .description(\"Log in to Beakcrypt via GitHub OAuth\")\n .action(async () => {\n try {\n await loginCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and remove all credentials\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n await logoutCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current user info\")\n .action(async () => {\n try {\n await whoamiCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Project linking\nprogram\n .command(\"link\")\n .description(\"Link this directory to a Beakcrypt project\")\n .action(async () => {\n try {\n await linkCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Secret sync commands\nprogram\n .command(\"pull [file]\")\n .description(\"Pull secrets to a local .env file\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (file, opts) => {\n try {\n await pullCommand(file, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"push [file]\")\n .description(\"Push secrets from a local .env file\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (file, opts) => {\n try {\n await pushCommand(file, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"run\")\n .description(\"Run a command with injected secrets\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .allowUnknownOption()\n .action(async (opts, cmd) => {\n try {\n await runCommand(cmd.args, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\n// Secrets subcommands\nconst secrets = program.command(\"secrets\").description(\"Manage secrets\");\n\nsecrets\n .command(\"list\")\n .description(\"List secrets (values masked)\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (opts) => {\n try {\n await secretsListCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"set <pairs...>\")\n .description(\"Set secrets (KEY=VALUE)\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (pairs, opts) => {\n try {\n await secretsSetCommand(pairs, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"remove <keys...>\")\n .description(\"Remove secrets by key\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (keys, opts) => {\n try {\n await secretsRemoveCommand(keys, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"clear\")\n .description(\"Delete all secrets in an environment\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n await secretsClearCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\n// Org subcommands\nconst org = program.command(\"org\").description(\"Manage organizations\");\n\norg\n .command(\"list\")\n .description(\"List your organizations\")\n .action(async () => {\n try {\n await orgListCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Env subcommands\nconst env = program.command(\"env\").description(\"Manage environments\");\n\nenv\n .command(\"list\")\n .description(\"List environments for the linked project\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .action(async (opts) => {\n try {\n await envListCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram.parse();\n","import pc from \"picocolors\";\nimport type { Result } from \"@beakcrypt/shared\";\n\nexport class CliError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport function handleResultError(result: {\n ok: false;\n code: string;\n error: string;\n}): never {\n throw new CliError(result.error, `Error code: ${result.code}`);\n}\n\nexport function unwrapResult<T>(result: Result<T>): T {\n if (!result.ok) {\n handleResultError(result);\n }\n return result.data;\n}\n\nexport function handleError(error: unknown): void {\n if (error instanceof CliError) {\n console.error(`\\n${pc.red(\"Error:\")} ${error.message}`);\n if (error.hint) {\n console.error(`${pc.dim(error.hint)}`);\n }\n } else if (error instanceof Error) {\n console.error(`\\n${pc.red(\"Error:\")} ${error.message}`);\n } else {\n console.error(`\\n${pc.red(\"Error:\")} An unexpected error occurred.`);\n }\n process.exit(1);\n}\n","/* eslint-disable */\n/**\n * Generated `api` utility.\n *\n * THIS CODE IS AUTOMATICALLY GENERATED.\n *\n * To regenerate, run `npx convex dev`.\n * @module\n */\n\nimport { anyApi, componentsGeneric } from \"convex/server\";\n\n/**\n * A utility for referencing Convex functions in your app's API.\n *\n * Usage:\n * ```js\n * const myFunctionReference = api.myModule.myFunction;\n * ```\n */\nexport const api = anyApi;\nexport const internal = anyApi;\nexport const components = componentsGeneric();\n","import { mkdir, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface AuthConfig {\n sessionToken: string;\n convexUrl: string;\n convexSiteUrl: string;\n siteUrl: string;\n}\n\nconst CONFIG_DIR = join(homedir(), \".beakcrypt\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n}\n\nexport async function getAuthConfig(): Promise<AuthConfig | null> {\n if (!existsSync(AUTH_FILE)) return null;\n try {\n const data = await readFile(AUTH_FILE, \"utf-8\");\n return JSON.parse(data) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveAuthConfig(config: AuthConfig): Promise<void> {\n await ensureConfigDir();\n await writeFile(AUTH_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport async function clearAuthConfig(): Promise<void> {\n if (existsSync(AUTH_FILE)) {\n await rm(AUTH_FILE);\n }\n}\n\nexport async function clearAllConfig(): Promise<void> {\n if (existsSync(CONFIG_DIR)) {\n await rm(CONFIG_DIR, { recursive: true });\n }\n}\n\nexport function isLoggedIn(): boolean {\n return existsSync(AUTH_FILE);\n}\n","import {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport ora from \"ora\";\nimport pc from \"picocolors\";\nimport { saveAuthConfig, type AuthConfig } from \"./global-config\";\nimport { CliError } from \"./errors\";\nimport * as output from \"./output\";\n\ninterface AuthResult {\n sessionToken: string;\n}\n\nfunction startCallbackServer(): Promise<{\n port: number;\n waitForToken: () => Promise<AuthResult>;\n}> {\n return new Promise((resolve, reject) => {\n let resolveToken: (result: AuthResult) => void;\n const tokenPromise = new Promise<AuthResult>((res) => {\n resolveToken = res;\n });\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url ?? \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const sessionToken = url.searchParams.get(\"session_token\");\n if (sessionToken) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"display:flex;justify-content:center;align-items:center;height:100vh;font-family:system-ui;background:#0a0a0a;color:#fafafa\">\n\t\t\t\t\t\t\t\t<div style=\"text-align:center\">\n\t\t\t\t\t\t\t\t\t<h1>Authenticated!</h1>\n\t\t\t\t\t\t\t\t\t<p>You can close this tab and return to the terminal.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n resolveToken!({ sessionToken });\n setTimeout(() => server.close(), 500);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing session_token parameter\");\n }\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n });\n\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start callback server\"));\n return;\n }\n resolve({\n port: addr.port,\n waitForToken: () => tokenPromise,\n });\n });\n\n server.on(\"error\", reject);\n });\n}\n\nexport async function loginFlow(\n siteUrl: string,\n convexUrl: string,\n convexSiteUrl: string,\n): Promise<AuthConfig> {\n const { port, waitForToken } = await startCallbackServer();\n const callbackUrl = `http://localhost:${port}/callback`;\n const loginUrl = `${siteUrl}/auth/cli?callback=${encodeURIComponent(callbackUrl)}`;\n\n const isTTY = process.stdin.isTTY;\n\n if (isTTY) {\n output.info(`Opening browser to log in...`);\n console.log(`${pc.dim(\"If the browser doesn't open, visit:\")}`);\n console.log(`${output.link(loginUrl)}\\n`);\n\n try {\n await open(loginUrl);\n } catch {\n // Browser failed to open — URL already printed above\n }\n } else {\n console.log(`Visit this URL to log in:\\n${output.link(loginUrl)}\\n`);\n }\n\n const spinner = ora(\"Waiting for authentication...\").start();\n\n const result = await waitForToken();\n spinner.stop();\n\n const config: AuthConfig = {\n sessionToken: result.sessionToken,\n convexUrl,\n convexSiteUrl,\n siteUrl,\n };\n\n await saveAuthConfig(config);\n return config;\n}\n\nexport function getDefaultUrls(): {\n siteUrl: string;\n convexUrl: string;\n convexSiteUrl: string;\n} {\n return {\n siteUrl: process.env.BEAKCRYPT_SITE_URL ?? \"https://app.beakcrypt.com\",\n convexUrl: process.env.BEAKCRYPT_CONVEX_URL ?? \"\",\n convexSiteUrl: process.env.BEAKCRYPT_CONVEX_SITE_URL ?? \"\",\n };\n}\n\nexport function validateUrls(urls: {\n convexUrl: string;\n convexSiteUrl: string;\n}): void {\n if (!urls.convexUrl) {\n throw new CliError(\n \"BEAKCRYPT_CONVEX_URL is not configured.\",\n \"Set the BEAKCRYPT_CONVEX_URL environment variable or configure it in ~/.beakcrypt/auth.json\",\n );\n }\n if (!urls.convexSiteUrl) {\n throw new CliError(\n \"BEAKCRYPT_CONVEX_SITE_URL is not configured.\",\n \"Set the BEAKCRYPT_CONVEX_SITE_URL environment variable or configure it in ~/.beakcrypt/auth.json\",\n );\n }\n}\n","import pc from \"picocolors\";\n\nexport function success(message: string): void {\n console.log(`${pc.green(\"✓\")} ${message}`);\n}\n\nexport function info(message: string): void {\n console.log(`${pc.blue(\"ℹ\")} ${message}`);\n}\n\nexport function warn(message: string): void {\n console.log(`${pc.yellow(\"⚠\")} ${message}`);\n}\n\nexport function error(message: string): void {\n console.error(`${pc.red(\"✗\")} ${message}`);\n}\n\nexport function dim(message: string): string {\n return pc.dim(message);\n}\n\nexport function bold(message: string): string {\n return pc.bold(message);\n}\n\nexport function link(url: string): string {\n return pc.cyan(pc.underline(url));\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, (row[i] ?? \"\").length);\n }\n }\n\n for (let i = 0; i < allRows.length; i++) {\n const row = allRows[i]!;\n const line = row\n .map((cell, j) => (cell ?? \"\").padEnd(colWidths[j] ?? 0))\n .join(\" \");\n\n if (i === 0 && headers) {\n console.log(pc.bold(line));\n console.log(colWidths.map((w) => \"─\".repeat(w)).join(\"──\"));\n } else {\n console.log(line);\n }\n }\n}\n","import { ConvexHttpClient } from \"convex/browser\";\nimport {\n type FunctionReference,\n type FunctionArgs,\n type FunctionReturnType,\n} from \"convex/server\";\nimport { getAuthConfig, type AuthConfig } from \"./global-config\";\nimport { CliError } from \"./errors\";\n\nlet clientInstance: ConvexHttpClient | null = null;\nlet cachedAuth: AuthConfig | null = null;\n\nasync function getConvexToken(auth: AuthConfig): Promise<string> {\n // The Convex /api/auth/convex/token endpoint is a GET that uses the bearer\n // plugin: it expects the raw session token ID (without the HMAC signature)\n // in an Authorization: Bearer header, then re-signs and verifies it.\n const url = `${auth.convexSiteUrl}/api/auth/convex/token`;\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${auth.sessionToken}`,\n },\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n console.error(`Token exchange failed: ${res.status} ${res.statusText}`);\n console.error(`URL: ${url}`);\n if (body) console.error(`Body: ${body}`);\n throw new CliError(\"Session expired. Please run `beakcrypt login` again.\");\n }\n\n const data = (await res.json()) as { token: string };\n return data.token;\n}\n\nexport async function getClient(): Promise<ConvexHttpClient> {\n const auth = await getAuthConfig();\n if (!auth) {\n throw new CliError(\"Not logged in. Run `beakcrypt login` first.\");\n }\n cachedAuth = auth;\n\n if (!clientInstance) {\n clientInstance = new ConvexHttpClient(auth.convexUrl);\n }\n\n const token = await getConvexToken(auth);\n clientInstance.setAuth(token);\n return clientInstance;\n}\n\nexport async function query<F extends FunctionReference<\"query\">>(\n fn: F,\n args: FunctionArgs<F>,\n): Promise<FunctionReturnType<F>> {\n const client = await getClient();\n return client.query(fn, args);\n}\n\nexport async function mutation<F extends FunctionReference<\"mutation\">>(\n fn: F,\n args: FunctionArgs<F>,\n): Promise<FunctionReturnType<F>> {\n const client = await getClient();\n return client.mutation(fn, args);\n}\n\nexport function getSessionToken(): string | null {\n return cachedAuth?.sessionToken ?? null;\n}\n\nexport function getSiteUrl(): string {\n if (!cachedAuth) throw new CliError(\"Not logged in.\");\n return cachedAuth.siteUrl;\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { getAuthConfig } from \"../lib/global-config\";\nimport { loginFlow, getDefaultUrls, validateUrls } from \"../lib/auth\";\nimport { query } from \"../lib/convex-client\";\nimport * as output from \"../lib/output\";\n\nexport async function loginCommand(): Promise<void> {\n const existing = await getAuthConfig();\n if (existing) {\n output.info(\"Already logged in. Refreshing session...\");\n }\n\n const urls = existing\n ? {\n siteUrl: existing.siteUrl,\n convexUrl: existing.convexUrl,\n convexSiteUrl: existing.convexSiteUrl,\n }\n : getDefaultUrls();\n\n validateUrls(urls);\n await loginFlow(urls.siteUrl, urls.convexUrl, urls.convexSiteUrl);\n try {\n const user = await query(api.auth.getCurrentUser, {});\n if (user) {\n output.success(`Logged in as ${output.bold(user.email)}`);\n } else {\n output.success(\"Logged in successfully.\");\n }\n } catch {\n output.success(\"Logged in successfully.\");\n }\n}\n","import prompts from \"prompts\";\nimport { CliError } from \"./errors\";\n\nexport function isInteractive(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nexport function requireInteractive(command: string): void {\n if (!isInteractive()) {\n throw new CliError(\n `Cannot run interactive prompts in non-interactive mode.`,\n `Run \\`beakcrypt ${command}\\` in an interactive terminal, or provide required flags.`,\n );\n }\n}\n\nexport async function select<T extends string>(opts: {\n message: string;\n choices: { title: string; value: T; description?: string }[];\n}): Promise<T> {\n const { value } = await prompts(\n {\n type: \"select\",\n name: \"value\",\n message: opts.message,\n choices: opts.choices,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as T;\n}\n\nexport async function confirm(\n message: string,\n initial = false,\n): Promise<boolean> {\n const { value } = await prompts(\n {\n type: \"confirm\",\n name: \"value\",\n message,\n initial,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as boolean;\n}\n\nexport async function text(opts: {\n message: string;\n placeholder?: string;\n validate?: (value: string) => string | true;\n}): Promise<string> {\n const { value } = await prompts(\n {\n type: \"text\",\n name: \"value\",\n message: opts.message,\n ...(opts.placeholder ? { initial: opts.placeholder } : {}),\n validate: opts.validate\n ? (v: string) => {\n const result = opts.validate!(v);\n return result === true ? true : result;\n }\n : undefined,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as string;\n}\n","import { clearAllConfig, isLoggedIn } from \"../lib/global-config\";\nimport * as interactive from \"../lib/interactive\";\nimport * as output from \"../lib/output\";\n\nexport async function logoutCommand(opts: { yes?: boolean }): Promise<void> {\n if (!isLoggedIn()) {\n output.info(\"Not currently logged in.\");\n return;\n }\n\n if (!opts.yes) {\n const confirmed = await interactive.confirm(\n \"This will remove all credentials and device keys. Continue?\",\n );\n if (!confirmed) return;\n }\n\n await clearAllConfig();\n output.success(\"Logged out. All credentials and keys removed.\");\n}\n","import { mkdir, readFile, writeFile, appendFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\n\nexport interface ProjectConfig {\n orgId: string;\n orgSlug: string;\n projectId: string;\n projectName: string;\n defaultEnv: string;\n}\n\nconst CONFIG_DIR_NAME = \".beakcrypt\";\nconst CONFIG_FILE_NAME = \"project.json\";\n\nexport function findProjectConfigDir(startDir?: string): string | null {\n let dir = startDir ?? process.cwd();\n const root = dirname(dir) === dir ? dir : \"/\";\n\n while (true) {\n const configPath = join(dir, CONFIG_DIR_NAME, CONFIG_FILE_NAME);\n if (existsSync(configPath)) {\n return join(dir, CONFIG_DIR_NAME);\n }\n const parent = dirname(dir);\n if (parent === dir || dir === root) break;\n dir = parent;\n }\n return null;\n}\n\nexport async function getProjectConfig(\n startDir?: string,\n): Promise<ProjectConfig | null> {\n const configDir = findProjectConfigDir(startDir);\n if (!configDir) return null;\n try {\n const data = await readFile(join(configDir, CONFIG_FILE_NAME), \"utf-8\");\n return JSON.parse(data) as ProjectConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveProjectConfig(\n config: ProjectConfig,\n dir?: string,\n): Promise<string> {\n const baseDir = dir ?? process.cwd();\n const configDir = join(baseDir, CONFIG_DIR_NAME);\n await mkdir(configDir, { recursive: true });\n await writeFile(\n join(configDir, CONFIG_FILE_NAME),\n JSON.stringify(config, null, 2),\n );\n await ensureGitignore(baseDir);\n return configDir;\n}\n\nasync function ensureGitignore(baseDir: string): Promise<void> {\n const gitignorePath = join(baseDir, \".gitignore\");\n\n if (existsSync(gitignorePath)) {\n const content = await readFile(gitignorePath, \"utf-8\");\n if (content.includes(CONFIG_DIR_NAME)) return;\n const suffix = content.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await appendFile(\n gitignorePath,\n `${suffix}\\n# Beakcrypt CLI\\n${CONFIG_DIR_NAME}\\n`,\n );\n } else {\n await writeFile(gitignorePath, `# Beakcrypt CLI\\n${CONFIG_DIR_NAME}\\n`);\n }\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { getAuthConfig } from \"./global-config\";\nimport {\n getProjectConfig,\n saveProjectConfig,\n type ProjectConfig,\n} from \"./project-config\";\nimport { query, mutation } from \"./convex-client\";\nimport { unwrapResult, CliError } from \"./errors\";\nimport * as interactive from \"./interactive\";\nimport * as output from \"./output\";\nimport { loginCommand } from \"../commands/login\";\n\nexport interface ResolvedContext {\n orgId: string;\n orgSlug: string;\n projectId: string;\n projectName: string;\n envName: string;\n environmentId: string;\n}\n\ninterface ContextFlags {\n org?: string;\n project?: string;\n env?: string;\n}\n\nexport async function ensureAuth(): Promise<void> {\n const auth = await getAuthConfig();\n if (auth) return;\n\n if (!interactive.isInteractive()) {\n throw new CliError(\"Not logged in. Run `beakcrypt login` first.\");\n }\n\n const shouldLogin = await interactive.confirm(\n \"You're not logged in. Log in now?\",\n true,\n );\n if (!shouldLogin) process.exit(0);\n await loginCommand();\n}\n\nexport async function resolveContext(\n flags: ContextFlags,\n): Promise<ResolvedContext> {\n await ensureAuth();\n\n const projectConfig = await getProjectConfig();\n\n const orgId = flags.org\n ? await resolveOrgBySlug(flags.org)\n : projectConfig?.orgId;\n const orgSlug = flags.org ?? projectConfig?.orgSlug;\n const projectId = flags.project\n ? await resolveProjectByName(orgId!, flags.project)\n : projectConfig?.projectId;\n const projectName = flags.project ?? projectConfig?.projectName;\n const envName = flags.env ?? projectConfig?.defaultEnv;\n\n if (!orgId || !projectId || !envName || !orgSlug || !projectName) {\n if (!interactive.isInteractive()) {\n throw new CliError(\n \"No project linked in this directory.\",\n \"Run `beakcrypt link` to connect this directory to a project.\",\n );\n }\n\n const config = await interactiveLink();\n const envId = await resolveEnvId(\n config.projectId,\n flags.env ?? config.defaultEnv,\n );\n return {\n orgId: config.orgId,\n orgSlug: config.orgSlug,\n projectId: config.projectId,\n projectName: config.projectName,\n envName: flags.env ?? config.defaultEnv,\n environmentId: envId,\n };\n }\n\n const envId = await resolveEnvId(projectId, envName);\n return {\n orgId,\n orgSlug,\n projectId,\n projectName,\n envName,\n environmentId: envId,\n };\n}\n\nasync function resolveOrgBySlug(slug: string): Promise<string> {\n const result = await query(api.organizations.getBySlug, { slug });\n const org = unwrapResult(result);\n return org._id;\n}\n\nasync function resolveProjectByName(\n orgId: string,\n name: string,\n): Promise<string> {\n const result = await query(api.projects.getByName, {\n orgId: orgId as never,\n name,\n });\n const project = unwrapResult(result);\n return project._id;\n}\n\nasync function resolveEnvId(\n projectId: string,\n envName: string,\n): Promise<string> {\n if (envName === \"local\") {\n await mutation(api.environments.ensurePersonalLocal, {\n projectId: projectId as never,\n syncFromDev: false,\n });\n }\n\n const result = await query(api.environments.list, {\n projectId: projectId as never,\n });\n const envs = unwrapResult(result);\n const env = envs.find((e: { name: string }) => e.name === envName);\n if (!env) {\n throw new CliError(`Environment \"${envName}\" not found.`);\n }\n return env._id;\n}\n\nexport async function interactiveLink(): Promise<ProjectConfig> {\n interactive.requireInteractive(\"link\");\n\n const orgsResult = await query(api.organizations.list, {});\n const orgs = unwrapResult(orgsResult);\n\n if (orgs.length === 0) {\n throw new CliError(\"You don't belong to any organizations.\");\n }\n\n const orgId = await interactive.select({\n message: \"Select an organization:\",\n choices: orgs.map((o: { _id: string; name: string; slug: string }) => ({\n title: `${o.name} (${o.slug})`,\n value: o._id,\n })),\n });\n const selectedOrg = orgs.find((o: { _id: string }) => o._id === orgId)!;\n\n const action = await interactive.select({\n message: \"What would you like to do?\",\n choices: [\n { title: \"Link to an existing project\", value: \"link\" as const },\n { title: \"Create a new project\", value: \"create\" as const },\n ],\n });\n\n let projectId: string;\n let projectName: string;\n\n if (action === \"create\") {\n const name = await interactive.text({\n message: \"Enter project name:\",\n validate: (v: string) =>\n v.trim().length > 0 ? true : \"Project name is required\",\n });\n const createResult = await mutation(api.projects.create, {\n name: name.trim(),\n orgId: orgId as never,\n });\n const project = unwrapResult(createResult);\n projectId = project._id;\n projectName = project.name;\n output.success(`Created project \"${projectName}\" in ${selectedOrg.name}`);\n } else {\n const projectsResult = await query(api.projects.list, {\n orgId: orgId as never,\n });\n const projects = unwrapResult(projectsResult);\n\n if (projects.length === 0) {\n throw new CliError(\"No projects in this organization. Create one first.\");\n }\n\n projectId = await interactive.select({\n message: \"Select a project:\",\n choices: projects.map((p: { _id: string; name: string }) => ({\n title: p.name,\n value: p._id,\n })),\n });\n const selectedProject = projects.find(\n (p: { _id: string }) => p._id === projectId,\n )!;\n projectName = selectedProject.name;\n }\n\n await mutation(api.environments.ensurePersonalLocal, {\n projectId: projectId as never,\n syncFromDev: false,\n });\n\n const envsResult = await query(api.environments.list, {\n projectId: projectId as never,\n });\n const envs = unwrapResult(envsResult);\n\n const defaultEnv = await interactive.select({\n message: \"Select a default environment:\",\n choices: envs.map(\n (e: { _id: string; name: string; isPersonal?: boolean }) => ({\n title: e.isPersonal ? `${e.name} (personal)` : e.name,\n value: e.name,\n }),\n ),\n });\n\n const config: ProjectConfig = {\n orgId,\n orgSlug: selectedOrg.slug,\n projectId,\n projectName,\n defaultEnv,\n };\n\n const configDir = await saveProjectConfig(config);\n output.success(\n `Linked to ${selectedOrg.slug}/${projectName} (${defaultEnv})`,\n );\n output.info(`Created ${configDir}/project.json`);\n output.info(`Added .beakcrypt to .gitignore`);\n\n return config;\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../lib/convex-client\";\nimport { CliError } from \"../lib/errors\";\nimport { ensureAuth } from \"../lib/context\";\nimport * as output from \"../lib/output\";\n\nexport async function whoamiCommand(): Promise<void> {\n await ensureAuth();\n\n const user = await query(api.auth.getCurrentUser, {});\n if (!user) {\n throw new CliError(\n \"Could not retrieve user info. Try `beakcrypt login` again.\",\n );\n }\n\n console.log();\n console.log(` ${output.bold(\"Email:\")} ${user.email}`);\n console.log(` ${output.bold(\"Name:\")} ${user.name}`);\n console.log();\n}\n","import ora from \"ora\";\nimport open from \"open\";\nimport {\n generateKeyPair,\n unwrapOrgKey as cryptoUnwrapOrgKey,\n} from \"@beakcrypt/crypto\";\nimport { api } from \"@beakcrypt/convex\";\nimport { query, mutation, getSessionToken, getSiteUrl } from \"./convex-client\";\nimport {\n getStoredKey,\n saveKey,\n updateWrappedOrgKey,\n type StoredKeyData,\n} from \"./key-store\";\nimport { unwrapResult } from \"./errors\";\nimport { getProjectConfig } from \"./project-config\";\nimport * as output from \"./output\";\n\nexport async function ensureOrgKey(orgId: string): Promise<string> {\n const stored = await getStoredKey(orgId);\n\n if (stored?.wrappedOrgKey) {\n return await cryptoUnwrapOrgKey(stored.wrappedOrgKey, stored.privateKey);\n }\n\n if (stored?.keyId) {\n // Key exists but no wrapped org key — check backend for approval\n const keyResult = await query(api.keys.getMyKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(stored.publicKey),\n });\n const keyRecord = unwrapResult(keyResult);\n\n if (keyRecord?.status === \"active\" && keyRecord.wrappedOrgKey) {\n await updateWrappedOrgKey(orgId, keyRecord.wrappedOrgKey);\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n stored.privateKey,\n );\n }\n\n if (keyRecord?.status === \"pending\") {\n return await waitForApproval(orgId, stored);\n }\n\n throw new Error(\n \"Device key is not active. An admin may need to approve this device.\",\n );\n }\n\n // No key pair — register new device\n return await registerNewDevice(orgId);\n}\n\nasync function registerNewDevice(orgId: string): Promise<string> {\n const sessionToken = getSessionToken();\n if (!sessionToken) throw new Error(\"Not logged in\");\n\n const spinner = ora(\"Generating device keys...\").start();\n\n let keyPair: Awaited<ReturnType<typeof generateKeyPair>>;\n let keyRecord: ReturnType<typeof unwrapResult<any>>;\n\n try {\n keyPair = await generateKeyPair();\n\n spinner.text = \"Registering device with organization...\";\n\n const result = await mutation(api.keys.registerKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(keyPair.publicKey),\n sessionToken,\n });\n\n keyRecord = unwrapResult(result);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Device registration failed.\");\n throw err;\n }\n\n const stored: StoredKeyData = {\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n keyId: keyRecord._id,\n wrappedOrgKey: keyRecord.wrappedOrgKey,\n };\n\n await saveKey(orgId, stored);\n\n if (keyRecord.status === \"active\" && keyRecord.wrappedOrgKey) {\n output.success(\"Device registered and activated.\");\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n keyPair.privateKey,\n );\n }\n\n // Pending approval\n return await waitForApproval(orgId, stored);\n}\n\nasync function waitForApproval(\n orgId: string,\n stored: StoredKeyData,\n): Promise<string> {\n // Try to open the browser for auto-approval (same-user, new device scenario)\n try {\n const projectConfig = await getProjectConfig();\n if (projectConfig?.orgSlug && stored.keyId) {\n const siteUrl = getSiteUrl();\n const approveUrl = `${siteUrl}/${projectConfig.orgSlug}/sessions?approveSession=${stored.keyId}`;\n\n output.info(\"Opening browser to approve this device...\");\n console.log(`${output.dim(\"If the browser doesn't open, visit:\")}`);\n console.log(`${output.link(approveUrl)}\\n`);\n\n try {\n await open(approveUrl);\n } catch {\n // Browser failed to open — URL already printed above\n }\n }\n } catch {\n // Could not determine approval URL — fall through to polling\n }\n\n const spinner = ora(\"Waiting for device to be approved...\").start();\n spinner.indent = 2;\n\n while (true) {\n await new Promise((r) => setTimeout(r, 5000));\n\n const result = await query(api.keys.getMyKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(stored.publicKey),\n });\n const keyRecord = unwrapResult(result);\n\n if (keyRecord?.status === \"active\" && keyRecord.wrappedOrgKey) {\n spinner.stop();\n await updateWrappedOrgKey(orgId, keyRecord.wrappedOrgKey);\n output.success(\"Device approved!\");\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n stored.privateKey,\n );\n }\n\n if (keyRecord?.status === \"revoked\") {\n spinner.stop();\n throw new Error(\"Device key was revoked. Re-run `beakcrypt login`.\");\n }\n }\n}\n","export interface ExportedKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n}\n\nexport const RSA_ALGORITHM: RsaHashedKeyGenParams = {\n name: \"RSA-OAEP\",\n modulusLength: 4096,\n publicExponent: new Uint8Array([1, 0, 1]),\n hash: \"SHA-256\",\n};\n\nexport const AES_ALGORITHM = \"AES-GCM\";\nexport const AES_KEY_LENGTH = 256;\nexport const IV_BYTE_LENGTH = 12;\n\nexport async function generateKeyPair(): Promise<ExportedKeyPair> {\n const keyPair = await crypto.subtle.generateKey(RSA_ALGORITHM, true, [\n \"wrapKey\",\n \"unwrapKey\",\n ]);\n\n const [publicKey, privateKey] = await Promise.all([\n crypto.subtle.exportKey(\"jwk\", keyPair.publicKey),\n crypto.subtle.exportKey(\"jwk\", keyPair.privateKey),\n ]);\n\n return { publicKey, privateKey };\n}\n\nexport async function generateOrgKey(): Promise<string> {\n const key = await crypto.subtle.generateKey(\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const raw = await crypto.subtle.exportKey(\"raw\", key);\n return bufferToBase64(raw);\n}\n\nexport async function wrapOrgKey(\n orgKeyBase64: string,\n publicKeyJwk: JsonWebKey,\n): Promise<string> {\n const publicKey = await crypto.subtle.importKey(\n \"jwk\",\n publicKeyJwk,\n RSA_ALGORITHM,\n false,\n [\"wrapKey\"],\n );\n\n const orgKey = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const wrapped = await crypto.subtle.wrapKey(\"raw\", orgKey, publicKey, {\n name: \"RSA-OAEP\",\n });\n\n return bufferToBase64(wrapped);\n}\n\nexport async function unwrapOrgKey(\n wrappedKeyBase64: string,\n privateKeyJwk: JsonWebKey,\n): Promise<string> {\n const privateKey = await crypto.subtle.importKey(\n \"jwk\",\n privateKeyJwk,\n RSA_ALGORITHM,\n false,\n [\"unwrapKey\"],\n );\n\n const orgKey = await crypto.subtle.unwrapKey(\n \"raw\",\n base64ToBuffer(wrappedKeyBase64),\n privateKey,\n { name: \"RSA-OAEP\" },\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const raw = await crypto.subtle.exportKey(\"raw\", orgKey);\n return bufferToBase64(raw);\n}\n\nexport async function encryptSecret(\n plaintext: string,\n orgKeyBase64: string,\n): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM },\n false,\n [\"encrypt\"],\n );\n\n const iv = crypto.getRandomValues(new Uint8Array(IV_BYTE_LENGTH));\n const encoded = new TextEncoder().encode(plaintext);\n\n const ciphertext = await crypto.subtle.encrypt(\n { name: AES_ALGORITHM, iv },\n key,\n encoded,\n );\n\n return `${bufferToBase64(iv.buffer)}:${bufferToBase64(ciphertext)}`;\n}\n\nexport async function decryptSecret(\n encryptedValue: string,\n orgKeyBase64: string,\n): Promise<string> {\n const [ivBase64, ciphertextBase64] = encryptedValue.split(\":\");\n if (!ivBase64 || !ciphertextBase64) {\n throw new Error(\n \"Invalid encrypted value format — expected 'iv:ciphertext'\",\n );\n }\n\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM },\n false,\n [\"decrypt\"],\n );\n\n const decrypted = await crypto.subtle.decrypt(\n { name: AES_ALGORITHM, iv: base64ToBuffer(ivBase64) },\n key,\n base64ToBuffer(ciphertextBase64),\n );\n\n return new TextDecoder().decode(decrypted);\n}\n\nexport function bufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n}\n\nexport function base64ToBuffer(base64: string): ArrayBuffer {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n","import { mkdir, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"./global-config\";\n\nexport interface StoredKeyData {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n wrappedOrgKey?: string;\n}\n\nfunction getKeysDir(): string {\n return join(getConfigDir(), \"keys\");\n}\n\nfunction getKeyFile(orgId: string): string {\n return join(getKeysDir(), `${orgId}.json`);\n}\n\nexport async function getStoredKey(\n orgId: string,\n): Promise<StoredKeyData | null> {\n const file = getKeyFile(orgId);\n if (!existsSync(file)) return null;\n try {\n const data = await readFile(file, \"utf-8\");\n return JSON.parse(data) as StoredKeyData;\n } catch {\n return null;\n }\n}\n\nexport async function saveKey(\n orgId: string,\n data: StoredKeyData,\n): Promise<void> {\n const dir = getKeysDir();\n await mkdir(dir, { recursive: true });\n await writeFile(getKeyFile(orgId), JSON.stringify(data, null, 2), {\n mode: 0o600,\n });\n}\n\nexport async function updateWrappedOrgKey(\n orgId: string,\n wrappedOrgKey: string,\n): Promise<void> {\n const existing = await getStoredKey(orgId);\n if (!existing) throw new Error(`No key stored for org ${orgId}`);\n existing.wrappedOrgKey = wrappedOrgKey;\n await saveKey(orgId, existing);\n}\n\nexport async function removeKey(orgId: string): Promise<void> {\n const file = getKeyFile(orgId);\n if (existsSync(file)) {\n await rm(file);\n }\n}\n\nexport async function clearAllKeys(): Promise<void> {\n const dir = getKeysDir();\n if (existsSync(dir)) {\n await rm(dir, { recursive: true });\n }\n}\n","import { ensureAuth, interactiveLink } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\n\nexport async function linkCommand(): Promise<void> {\n await ensureAuth();\n const config = await interactiveLink();\n await ensureOrgKey(config.orgId);\n}\n","import { resolve } from \"node:path\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { decryptSecret } from \"@beakcrypt/crypto\";\nimport { query } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { writeEnvFile } from \"../lib/env-file\";\nimport { unwrapResult } from \"../lib/errors\";\nimport * as output from \"../lib/output\";\n\nexport async function pullCommand(\n file: string | undefined,\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n const filePath = resolve(file ?? \".env.local\");\n const ctx = await resolveContext(opts);\n\n const spinner = ora(\"Pulling secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n const decrypted: Record<string, string> = {};\n for (const secret of secrets) {\n decrypted[secret.key] = await decryptSecret(secret.encryptedValue, orgKey);\n }\n\n await writeEnvFile(filePath, decrypted);\n spinner.stop();\n\n output.success(\n `Pulled ${secrets.length} secret${secrets.length === 1 ? \"\" : \"s\"} to ${file ?? \".env.local\"}`,\n );\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\n\nexport function parseEnvFile(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n if (key) {\n env[key] = value;\n }\n }\n\n return env;\n}\n\nexport function serializeEnvFile(env: Record<string, string>): string {\n const lines: string[] = [\n \"# Generated by Beakcrypt CLI\",\n `# ${new Date().toISOString()}`,\n \"\",\n ];\n\n const sorted = Object.entries(env).sort(([a], [b]) => a.localeCompare(b));\n\n for (const [key, value] of sorted) {\n // Quote values that contain spaces, #, or newlines\n if (/[\\s#]/.test(value)) {\n lines.push(`${key}=\"${value}\"`);\n } else {\n lines.push(`${key}=${value}`);\n }\n }\n\n lines.push(\"\"); // trailing newline\n return lines.join(\"\\n\");\n}\n\nexport async function readEnvFile(\n filePath: string,\n): Promise<Record<string, string>> {\n if (!existsSync(filePath)) {\n return {};\n }\n const content = await readFile(filePath, \"utf-8\");\n return parseEnvFile(content);\n}\n\nexport async function writeEnvFile(\n filePath: string,\n env: Record<string, string>,\n): Promise<void> {\n await writeFile(filePath, serializeEnvFile(env));\n}\n","import { resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { encryptSecret } from \"@beakcrypt/crypto\";\nimport { mutation } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { readEnvFile } from \"../lib/env-file\";\nimport { unwrapResult, CliError } from \"../lib/errors\";\nimport * as interactive from \"../lib/interactive\";\nimport * as output from \"../lib/output\";\n\nexport async function pushCommand(\n file: string | undefined,\n opts: { org?: string; project?: string; env?: string; yes?: boolean },\n): Promise<void> {\n const filePath = resolve(file ?? \".env.local\");\n\n if (!existsSync(filePath)) {\n throw new CliError(`File not found: ${filePath}`);\n }\n\n const ctx = await resolveContext(opts);\n const env = await readEnvFile(filePath);\n const keys = Object.keys(env);\n\n if (keys.length === 0) {\n output.info(\"No secrets found in file.\");\n return;\n }\n\n if (!opts.yes) {\n output.info(\n `Pushing ${keys.length} secret${keys.length === 1 ? \"\" : \"s\"} to ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})`,\n );\n const confirmed = await interactive.confirm(\"Continue?\", true);\n if (!confirmed) return;\n }\n\n const spinner = ora(\"Encrypting and pushing secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const encryptedSecrets: { key: string; encryptedValue: string }[] = [];\n for (const [key, value] of Object.entries(env)) {\n const encrypted = await encryptSecret(value, orgKey);\n encryptedSecrets.push({ key, encryptedValue: encrypted });\n }\n\n const result = await mutation(api.secrets.bulkCreate, {\n environmentId: ctx.environmentId as never,\n secrets: encryptedSecrets,\n overwrite: true,\n });\n const summary = unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Pushed ${summary.created} created, ${summary.updated} updated, ${summary.skipped} skipped`,\n );\n}\n","import { spawn } from \"node:child_process\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { decryptSecret } from \"@beakcrypt/crypto\";\nimport { query } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { unwrapResult, CliError } from \"../lib/errors\";\n\nexport async function runCommand(\n args: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (args.length === 0) {\n throw new CliError(\n \"No command provided. Usage: beakcrypt run -- <command>\",\n );\n }\n\n const ctx = await resolveContext(opts);\n\n const spinner = ora(\"Loading secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n const decrypted: Record<string, string> = {};\n for (const secret of secrets) {\n decrypted[secret.key] = await decryptSecret(secret.encryptedValue, orgKey);\n }\n\n spinner.stop();\n\n const [command, ...commandArgs] = args;\n const child = spawn(command!, commandArgs, {\n stdio: \"inherit\",\n env: { ...process.env, ...decrypted },\n });\n\n child.on(\"close\", (code) => {\n process.exit(code ?? 0);\n });\n\n child.on(\"error\", (err) => {\n throw new CliError(`Failed to run command: ${err.message}`);\n });\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsListCommand(opts: {\n org?: string;\n project?: string;\n env?: string;\n}): Promise<void> {\n const ctx = await resolveContext(opts);\n\n const result = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(result);\n\n if (secrets.length === 0) {\n output.info(\n `No secrets in ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})`,\n );\n return;\n }\n\n console.log(\n `\\n${output.bold(`${ctx.orgSlug}/${ctx.projectName}`)} ${output.dim(`(${ctx.envName})`)}\\n`,\n );\n\n output.table(\n secrets.map((s: { key: string }) => [s.key, \"••••••••\"]),\n [\"Key\", \"Value\"],\n );\n\n console.log(\n `\\n${output.dim(`${secrets.length} secret${secrets.length === 1 ? \"\" : \"s\"}`)}\\n`,\n );\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { encryptSecret } from \"@beakcrypt/crypto\";\nimport { mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { ensureOrgKey } from \"../../lib/key-manager\";\nimport { unwrapResult, CliError } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsSetCommand(\n pairs: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (pairs.length === 0) {\n throw new CliError(\n \"No key=value pairs provided. Usage: beakcrypt secrets set KEY=VALUE\",\n );\n }\n\n const parsed: { key: string; value: string }[] = [];\n for (const pair of pairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new CliError(`Invalid format: \"${pair}\". Use KEY=VALUE.`);\n }\n parsed.push({\n key: pair.slice(0, eqIndex),\n value: pair.slice(eqIndex + 1),\n });\n }\n\n const ctx = await resolveContext(opts);\n const spinner = ora(\"Setting secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const encryptedSecrets: { key: string; encryptedValue: string }[] = [];\n for (const { key, value } of parsed) {\n const encrypted = await encryptSecret(value, orgKey);\n encryptedSecrets.push({ key, encryptedValue: encrypted });\n }\n\n const result = await mutation(api.secrets.bulkCreate, {\n environmentId: ctx.environmentId as never,\n secrets: encryptedSecrets,\n overwrite: true,\n });\n unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Set ${parsed.length} secret${parsed.length === 1 ? \"\" : \"s\"} in ${ctx.envName}`,\n );\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { query, mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult, CliError } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsRemoveCommand(\n keys: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (keys.length === 0) {\n throw new CliError(\n \"No keys provided. Usage: beakcrypt secrets remove KEY [KEY2...]\",\n );\n }\n\n const ctx = await resolveContext(opts);\n const spinner = ora(\"Removing secrets...\").start();\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n let removed = 0;\n const notFound: string[] = [];\n\n for (const key of keys) {\n const secret = secrets.find((s: { key: string }) => s.key === key);\n if (secret) {\n const result = await mutation(api.secrets.remove, {\n id: secret._id as never,\n });\n unwrapResult(result);\n removed++;\n } else {\n notFound.push(key);\n }\n }\n\n spinner.stop();\n\n if (removed > 0) {\n output.success(\n `Removed ${removed} secret${removed === 1 ? \"\" : \"s\"} from ${ctx.envName}`,\n );\n }\n if (notFound.length > 0) {\n output.warn(`Not found: ${notFound.join(\", \")}`);\n }\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as interactive from \"../../lib/interactive\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsClearCommand(opts: {\n org?: string;\n project?: string;\n env?: string;\n yes?: boolean;\n}): Promise<void> {\n const ctx = await resolveContext(opts);\n\n if (!opts.yes) {\n const confirmed = await interactive.confirm(\n `Delete ALL secrets in ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})?`,\n );\n if (!confirmed) return;\n }\n\n const spinner = ora(\"Clearing secrets...\").start();\n\n const result = await mutation(api.secrets.removeAll, {\n environmentId: ctx.environmentId as never,\n });\n const summary = unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Deleted ${summary.deleted} secret${summary.deleted === 1 ? \"\" : \"s\"}`,\n );\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { ensureAuth } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function orgListCommand(): Promise<void> {\n await ensureAuth();\n\n const result = await query(api.organizations.list, {});\n const orgs = unwrapResult(result);\n\n if (orgs.length === 0) {\n output.info(\"You don't belong to any organizations.\");\n return;\n }\n\n console.log();\n output.table(\n orgs.map((o: { name: string; slug: string }) => [o.name, o.slug]),\n [\"Name\", \"Slug\"],\n );\n console.log();\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function envListCommand(opts: {\n org?: string;\n project?: string;\n}): Promise<void> {\n const ctx = await resolveContext({ ...opts, env: \"development\" });\n\n const result = await query(api.environments.list, {\n projectId: ctx.projectId as never,\n });\n const envs = unwrapResult(result);\n\n if (envs.length === 0) {\n output.info(\"No environments found.\");\n return;\n }\n\n console.log(\n `\\n${output.bold(`${ctx.orgSlug}/${ctx.projectName}`)} environments:\\n`,\n );\n\n output.table(\n envs.map((e: { name: string; isPersonal?: boolean }) => [\n e.name,\n e.isPersonal ? \"personal\" : \"shared\",\n ]),\n [\"Name\", \"Type\"],\n );\n console.log();\n}\n","import pc from \"picocolors\";\nimport { getAuthConfig } from \"./lib/global-config\";\nimport { getProjectConfig } from \"./lib/project-config\";\nimport * as interactive from \"./lib/interactive\";\nimport * as output from \"./lib/output\";\nimport { loginCommand } from \"./commands/login\";\nimport { linkCommand } from \"./commands/link\";\nimport { pullCommand } from \"./commands/pull\";\nimport { pushCommand } from \"./commands/push\";\nimport { secretsListCommand } from \"./commands/secrets/list\";\n\nexport async function interactiveMode(): Promise<void> {\n interactive.requireInteractive(\"(no args)\");\n\n console.log(`\\n${pc.bold(\"Beakcrypt\")} ${pc.dim(\"v0.1.0\")}\\n`);\n\n // Check auth\n const auth = await getAuthConfig();\n if (!auth) {\n const shouldLogin = await interactive.confirm(\n \"You're not logged in. Log in now?\",\n true,\n );\n if (!shouldLogin) process.exit(0);\n await loginCommand();\n }\n\n // Check project link\n const config = await getProjectConfig();\n if (!config) {\n output.info(\"No project linked in this directory.\");\n const shouldLink = await interactive.confirm(\n \"Link to a project now?\",\n true,\n );\n if (!shouldLink) process.exit(0);\n await linkCommand();\n return;\n }\n\n // Show linked project and action menu\n console.log(\n `Linked to ${output.bold(`${config.orgSlug}/${config.projectName}`)} ${output.dim(`(${config.defaultEnv}`)})`,\n );\n console.log();\n\n const action = await interactive.select({\n message: \"What would you like to do?\",\n choices: [\n { title: \"Pull secrets (.env.local)\", value: \"pull\" as const },\n { title: \"Push secrets (.env.local)\", value: \"push\" as const },\n { title: \"List secrets\", value: \"list\" as const },\n { title: \"Change project link\", value: \"link\" as const },\n ],\n });\n\n switch (action) {\n case \"pull\":\n await pullCommand(undefined, {});\n break;\n case \"push\":\n await pushCommand(undefined, {});\n break;\n case \"list\":\n await secretsListCommand({});\n break;\n case \"link\":\n await linkCommand();\n break;\n }\n}\n"],"mappings":"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","names":["pc","pc","pc","resolve","pc","mkdir","readFile","writeFile","existsSync","join","envId","org","env","ora","open","mkdir","readFile","writeFile","rm","existsSync","join","join","existsSync","readFile","mkdir","writeFile","ora","open","ora","readFile","writeFile","existsSync","env","ora","secrets","resolve","existsSync","ora","resolve","existsSync","env","ora","ora","ora","secrets","secrets","ora","ora","ora","ora","secrets","ora","ora","pc","pc"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/errors.ts","../../convex/src/_generated/api.js","../src/lib/global-config.ts","../src/lib/auth.ts","../src/lib/output.ts","../src/lib/convex-client.ts","../src/commands/login.ts","../src/lib/interactive.ts","../src/commands/logout.ts","../src/lib/project-config.ts","../src/lib/context.ts","../src/commands/whoami.ts","../src/lib/key-manager.ts","../../crypto/src/core.ts","../src/lib/key-store.ts","../src/commands/link.ts","../src/commands/pull.ts","../src/lib/env-file.ts","../src/commands/push.ts","../src/commands/run.ts","../src/commands/secrets/list.ts","../src/commands/secrets/set.ts","../src/commands/secrets/remove.ts","../src/commands/secrets/clear.ts","../src/commands/org/list.ts","../src/commands/env/list.ts","../src/interactive-mode.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { handleError } from \"./lib/errors\";\nimport { loginCommand } from \"./commands/login\";\nimport { logoutCommand } from \"./commands/logout\";\nimport { whoamiCommand } from \"./commands/whoami\";\nimport { linkCommand } from \"./commands/link\";\nimport { pullCommand } from \"./commands/pull\";\nimport { pushCommand } from \"./commands/push\";\nimport { runCommand } from \"./commands/run\";\nimport { secretsListCommand } from \"./commands/secrets/list\";\nimport { secretsSetCommand } from \"./commands/secrets/set\";\nimport { secretsRemoveCommand } from \"./commands/secrets/remove\";\nimport { secretsClearCommand } from \"./commands/secrets/clear\";\nimport { orgListCommand } from \"./commands/org/list\";\nimport { envListCommand } from \"./commands/env/list\";\nimport { interactiveMode } from \"./interactive-mode\";\n\nconst program = new Command();\n\nprogram\n .name(\"beakcrypt\")\n .description(\"Secure environment variable management with E2E encryption\")\n .version(\"0.1.0\")\n .action(async () => {\n try {\n await interactiveMode();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Auth commands\nprogram\n .command(\"login\")\n .description(\"Log in to Beakcrypt via GitHub OAuth\")\n .action(async () => {\n try {\n await loginCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Log out and remove all credentials\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n await logoutCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current user info\")\n .action(async () => {\n try {\n await whoamiCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Project linking\nprogram\n .command(\"link\")\n .description(\"Link this directory to a Beakcrypt project\")\n .action(async () => {\n try {\n await linkCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Secret sync commands\nprogram\n .command(\"pull [file]\")\n .description(\"Pull secrets to a local .env file\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (file, opts) => {\n try {\n await pullCommand(file, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"push [file]\")\n .description(\"Push secrets from a local .env file\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (file, opts) => {\n try {\n await pushCommand(file, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram\n .command(\"run\")\n .description(\"Run a command with injected secrets\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .allowUnknownOption()\n .action(async (opts, cmd) => {\n try {\n await runCommand(cmd.args, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\n// Secrets subcommands\nconst secrets = program.command(\"secrets\").description(\"Manage secrets\");\n\nsecrets\n .command(\"list\")\n .description(\"List secrets (values masked)\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (opts) => {\n try {\n await secretsListCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"set <pairs...>\")\n .description(\"Set secrets (KEY=VALUE)\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (pairs, opts) => {\n try {\n await secretsSetCommand(pairs, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"remove <keys...>\")\n .description(\"Remove secrets by key\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .action(async (keys, opts) => {\n try {\n await secretsRemoveCommand(keys, opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nsecrets\n .command(\"clear\")\n .description(\"Delete all secrets in an environment\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .option(\"-e, --env <name>\", \"Environment name\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n try {\n await secretsClearCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\n// Org subcommands\nconst org = program.command(\"org\").description(\"Manage organizations\");\n\norg\n .command(\"list\")\n .description(\"List your organizations\")\n .action(async () => {\n try {\n await orgListCommand();\n } catch (err) {\n handleError(err);\n }\n });\n\n// Env subcommands\nconst env = program.command(\"env\").description(\"Manage environments\");\n\nenv\n .command(\"list\")\n .description(\"List environments for the linked project\")\n .option(\"-o, --org <slug>\", \"Organization slug\")\n .option(\"-p, --project <name>\", \"Project name\")\n .action(async (opts) => {\n try {\n await envListCommand(opts);\n } catch (err) {\n handleError(err);\n }\n });\n\nprogram.parse();\n","import pc from \"picocolors\";\nimport type { Result } from \"@beakcrypt/shared\";\n\nexport class CliError extends Error {\n constructor(\n message: string,\n public readonly hint?: string,\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport function handleResultError(result: {\n ok: false;\n code: string;\n error: string;\n}): never {\n throw new CliError(result.error, `Error code: ${result.code}`);\n}\n\nexport function unwrapResult<T>(result: Result<T>): T {\n if (!result.ok) {\n handleResultError(result);\n }\n return result.data;\n}\n\nexport function handleError(error: unknown): void {\n if (error instanceof CliError) {\n console.error(`\\n${pc.red(\"Error:\")} ${error.message}`);\n if (error.hint) {\n console.error(`${pc.dim(error.hint)}`);\n }\n } else if (error instanceof Error) {\n console.error(`\\n${pc.red(\"Error:\")} ${error.message}`);\n } else {\n console.error(`\\n${pc.red(\"Error:\")} An unexpected error occurred.`);\n }\n process.exit(1);\n}\n","/* eslint-disable */\n/**\n * Generated `api` utility.\n *\n * THIS CODE IS AUTOMATICALLY GENERATED.\n *\n * To regenerate, run `npx convex dev`.\n * @module\n */\n\nimport { anyApi, componentsGeneric } from \"convex/server\";\n\n/**\n * A utility for referencing Convex functions in your app's API.\n *\n * Usage:\n * ```js\n * const myFunctionReference = api.myModule.myFunction;\n * ```\n */\nexport const api = anyApi;\nexport const internal = anyApi;\nexport const components = componentsGeneric();\n","import { mkdir, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface AuthConfig {\n sessionToken: string;\n convexUrl: string;\n convexSiteUrl: string;\n siteUrl: string;\n}\n\nconst CONFIG_DIR = join(homedir(), \".beakcrypt\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n}\n\nexport async function getAuthConfig(): Promise<AuthConfig | null> {\n if (!existsSync(AUTH_FILE)) return null;\n try {\n const data = await readFile(AUTH_FILE, \"utf-8\");\n return JSON.parse(data) as AuthConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveAuthConfig(config: AuthConfig): Promise<void> {\n await ensureConfigDir();\n await writeFile(AUTH_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n\nexport async function clearAuthConfig(): Promise<void> {\n if (existsSync(AUTH_FILE)) {\n await rm(AUTH_FILE);\n }\n}\n\nexport async function clearAllConfig(): Promise<void> {\n if (existsSync(CONFIG_DIR)) {\n await rm(CONFIG_DIR, { recursive: true });\n }\n}\n\nexport function isLoggedIn(): boolean {\n return existsSync(AUTH_FILE);\n}\n","import {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { URL } from \"node:url\";\nimport open from \"open\";\nimport ora from \"ora\";\nimport pc from \"picocolors\";\nimport { saveAuthConfig, type AuthConfig } from \"./global-config\";\nimport { CliError } from \"./errors\";\nimport * as output from \"./output\";\n\ninterface AuthResult {\n sessionToken: string;\n}\n\nfunction startCallbackServer(): Promise<{\n port: number;\n waitForToken: () => Promise<AuthResult>;\n}> {\n return new Promise((resolve, reject) => {\n let resolveToken: (result: AuthResult) => void;\n const tokenPromise = new Promise<AuthResult>((res) => {\n resolveToken = res;\n });\n\n const server = createServer((req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url ?? \"/\", `http://localhost`);\n\n if (url.pathname === \"/callback\") {\n const sessionToken = url.searchParams.get(\"session_token\");\n if (sessionToken) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(`\n\t\t\t\t\t\t<html>\n\t\t\t\t\t\t\t<body style=\"display:flex;justify-content:center;align-items:center;height:100vh;font-family:system-ui;background:#0a0a0a;color:#fafafa\">\n\t\t\t\t\t\t\t\t<div style=\"text-align:center\">\n\t\t\t\t\t\t\t\t\t<h1>Authenticated!</h1>\n\t\t\t\t\t\t\t\t\t<p>You can close this tab and return to the terminal.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</body>\n\t\t\t\t\t\t</html>\n\t\t\t\t\t`);\n resolveToken!({ sessionToken });\n setTimeout(() => server.close(), 500);\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing session_token parameter\");\n }\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n });\n\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n reject(new Error(\"Failed to start callback server\"));\n return;\n }\n resolve({\n port: addr.port,\n waitForToken: () => tokenPromise,\n });\n });\n\n server.on(\"error\", reject);\n });\n}\n\nexport async function loginFlow(\n siteUrl: string,\n convexUrl: string,\n convexSiteUrl: string,\n): Promise<AuthConfig> {\n const { port, waitForToken } = await startCallbackServer();\n const callbackUrl = `http://localhost:${port}/callback`;\n const loginUrl = `${siteUrl}/auth/cli?callback=${encodeURIComponent(callbackUrl)}`;\n\n const isTTY = process.stdin.isTTY;\n\n if (isTTY) {\n output.info(`Opening browser to log in...`);\n console.log(`${pc.dim(\"If the browser doesn't open, visit:\")}`);\n console.log(`${output.link(loginUrl)}\\n`);\n\n try {\n await open(loginUrl);\n } catch {\n // Browser failed to open — URL already printed above\n }\n } else {\n console.log(`Visit this URL to log in:\\n${output.link(loginUrl)}\\n`);\n }\n\n const spinner = ora(\"Waiting for authentication...\").start();\n\n const result = await waitForToken();\n spinner.stop();\n\n const config: AuthConfig = {\n sessionToken: result.sessionToken,\n convexUrl,\n convexSiteUrl,\n siteUrl,\n };\n\n await saveAuthConfig(config);\n return config;\n}\n\nexport function getDefaultUrls(): {\n siteUrl: string;\n convexUrl: string;\n convexSiteUrl: string;\n} {\n return {\n siteUrl: process.env.BEAKCRYPT_SITE_URL ?? \"https://beakcrypt.com\",\n convexUrl:\n process.env.BEAKCRYPT_CONVEX_URL ??\n \"https://wandering-stingray-407.convex.cloud\",\n convexSiteUrl:\n process.env.BEAKCRYPT_CONVEX_SITE_URL ??\n \"https://wandering-stingray-407.convex.site\",\n };\n}\n\nexport function validateUrls(urls: {\n convexUrl: string;\n convexSiteUrl: string;\n}): void {\n if (!urls.convexUrl) {\n throw new CliError(\n \"BEAKCRYPT_CONVEX_URL is not configured.\",\n \"Set the BEAKCRYPT_CONVEX_URL environment variable or configure it in ~/.beakcrypt/auth.json\",\n );\n }\n if (!urls.convexSiteUrl) {\n throw new CliError(\n \"BEAKCRYPT_CONVEX_SITE_URL is not configured.\",\n \"Set the BEAKCRYPT_CONVEX_SITE_URL environment variable or configure it in ~/.beakcrypt/auth.json\",\n );\n }\n}\n","import pc from \"picocolors\";\n\nexport function success(message: string): void {\n console.log(`${pc.green(\"✓\")} ${message}`);\n}\n\nexport function info(message: string): void {\n console.log(`${pc.blue(\"ℹ\")} ${message}`);\n}\n\nexport function warn(message: string): void {\n console.log(`${pc.yellow(\"⚠\")} ${message}`);\n}\n\nexport function error(message: string): void {\n console.error(`${pc.red(\"✗\")} ${message}`);\n}\n\nexport function dim(message: string): string {\n return pc.dim(message);\n}\n\nexport function bold(message: string): string {\n return pc.bold(message);\n}\n\nexport function link(url: string): string {\n return pc.cyan(pc.underline(url));\n}\n\nexport function table(rows: string[][], headers?: string[]): void {\n const allRows = headers ? [headers, ...rows] : rows;\n const colWidths: number[] = [];\n\n for (const row of allRows) {\n for (let i = 0; i < row.length; i++) {\n colWidths[i] = Math.max(colWidths[i] ?? 0, (row[i] ?? \"\").length);\n }\n }\n\n for (let i = 0; i < allRows.length; i++) {\n const row = allRows[i]!;\n const line = row\n .map((cell, j) => (cell ?? \"\").padEnd(colWidths[j] ?? 0))\n .join(\" \");\n\n if (i === 0 && headers) {\n console.log(pc.bold(line));\n console.log(colWidths.map((w) => \"─\".repeat(w)).join(\"──\"));\n } else {\n console.log(line);\n }\n }\n}\n","import { ConvexHttpClient } from \"convex/browser\";\nimport {\n type FunctionReference,\n type FunctionArgs,\n type FunctionReturnType,\n} from \"convex/server\";\nimport { getAuthConfig, type AuthConfig } from \"./global-config\";\nimport { CliError } from \"./errors\";\n\nlet clientInstance: ConvexHttpClient | null = null;\nlet cachedAuth: AuthConfig | null = null;\n\nasync function getConvexToken(auth: AuthConfig): Promise<string> {\n // The Convex /api/auth/convex/token endpoint is a GET that uses the bearer\n // plugin: it expects the raw session token ID (without the HMAC signature)\n // in an Authorization: Bearer header, then re-signs and verifies it.\n const url = `${auth.convexSiteUrl}/api/auth/convex/token`;\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${auth.sessionToken}`,\n },\n });\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n console.error(`Token exchange failed: ${res.status} ${res.statusText}`);\n console.error(`URL: ${url}`);\n if (body) console.error(`Body: ${body}`);\n throw new CliError(\"Session expired. Please run `beakcrypt login` again.\");\n }\n\n const data = (await res.json()) as { token: string };\n return data.token;\n}\n\nexport async function getClient(): Promise<ConvexHttpClient> {\n const auth = await getAuthConfig();\n if (!auth) {\n throw new CliError(\"Not logged in. Run `beakcrypt login` first.\");\n }\n cachedAuth = auth;\n\n if (!clientInstance) {\n clientInstance = new ConvexHttpClient(auth.convexUrl);\n }\n\n const token = await getConvexToken(auth);\n clientInstance.setAuth(token);\n return clientInstance;\n}\n\nexport async function query<F extends FunctionReference<\"query\">>(\n fn: F,\n args: FunctionArgs<F>,\n): Promise<FunctionReturnType<F>> {\n const client = await getClient();\n return client.query(fn, args);\n}\n\nexport async function mutation<F extends FunctionReference<\"mutation\">>(\n fn: F,\n args: FunctionArgs<F>,\n): Promise<FunctionReturnType<F>> {\n const client = await getClient();\n return client.mutation(fn, args);\n}\n\nexport function getSessionToken(): string | null {\n return cachedAuth?.sessionToken ?? null;\n}\n\nexport function getSiteUrl(): string {\n if (!cachedAuth) throw new CliError(\"Not logged in.\");\n return cachedAuth.siteUrl;\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { getAuthConfig } from \"../lib/global-config\";\nimport { loginFlow, getDefaultUrls, validateUrls } from \"../lib/auth\";\nimport { query } from \"../lib/convex-client\";\nimport * as output from \"../lib/output\";\n\nexport async function loginCommand(): Promise<void> {\n const existing = await getAuthConfig();\n if (existing) {\n output.info(\"Already logged in. Refreshing session...\");\n }\n\n const urls = existing\n ? {\n siteUrl: existing.siteUrl,\n convexUrl: existing.convexUrl,\n convexSiteUrl: existing.convexSiteUrl,\n }\n : getDefaultUrls();\n\n validateUrls(urls);\n await loginFlow(urls.siteUrl, urls.convexUrl, urls.convexSiteUrl);\n try {\n const user = await query(api.auth.getCurrentUser, {});\n if (user) {\n output.success(`Logged in as ${output.bold(user.email)}`);\n } else {\n output.success(\"Logged in successfully.\");\n }\n } catch {\n output.success(\"Logged in successfully.\");\n }\n}\n","import prompts from \"prompts\";\nimport { CliError } from \"./errors\";\n\nexport function isInteractive(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nexport function requireInteractive(command: string): void {\n if (!isInteractive()) {\n throw new CliError(\n `Cannot run interactive prompts in non-interactive mode.`,\n `Run \\`beakcrypt ${command}\\` in an interactive terminal, or provide required flags.`,\n );\n }\n}\n\nexport async function select<T extends string>(opts: {\n message: string;\n choices: { title: string; value: T; description?: string }[];\n}): Promise<T> {\n const { value } = await prompts(\n {\n type: \"select\",\n name: \"value\",\n message: opts.message,\n choices: opts.choices,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as T;\n}\n\nexport async function confirm(\n message: string,\n initial = false,\n): Promise<boolean> {\n const { value } = await prompts(\n {\n type: \"confirm\",\n name: \"value\",\n message,\n initial,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as boolean;\n}\n\nexport async function text(opts: {\n message: string;\n placeholder?: string;\n validate?: (value: string) => string | true;\n}): Promise<string> {\n const { value } = await prompts(\n {\n type: \"text\",\n name: \"value\",\n message: opts.message,\n ...(opts.placeholder ? { initial: opts.placeholder } : {}),\n validate: opts.validate\n ? (v: string) => {\n const result = opts.validate!(v);\n return result === true ? true : result;\n }\n : undefined,\n },\n { onCancel: () => process.exit(0) },\n );\n return value as string;\n}\n","import { clearAllConfig, isLoggedIn } from \"../lib/global-config\";\nimport * as interactive from \"../lib/interactive\";\nimport * as output from \"../lib/output\";\n\nexport async function logoutCommand(opts: { yes?: boolean }): Promise<void> {\n if (!isLoggedIn()) {\n output.info(\"Not currently logged in.\");\n return;\n }\n\n if (!opts.yes) {\n const confirmed = await interactive.confirm(\n \"This will remove all credentials and device keys. Continue?\",\n );\n if (!confirmed) return;\n }\n\n await clearAllConfig();\n output.success(\"Logged out. All credentials and keys removed.\");\n}\n","import { mkdir, readFile, writeFile, appendFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\n\nexport interface ProjectConfig {\n orgId: string;\n orgSlug: string;\n projectId: string;\n projectName: string;\n defaultEnv: string;\n}\n\nconst CONFIG_DIR_NAME = \".beakcrypt\";\nconst CONFIG_FILE_NAME = \"project.json\";\n\nexport function findProjectConfigDir(startDir?: string): string | null {\n let dir = startDir ?? process.cwd();\n const root = dirname(dir) === dir ? dir : \"/\";\n\n while (true) {\n const configPath = join(dir, CONFIG_DIR_NAME, CONFIG_FILE_NAME);\n if (existsSync(configPath)) {\n return join(dir, CONFIG_DIR_NAME);\n }\n const parent = dirname(dir);\n if (parent === dir || dir === root) break;\n dir = parent;\n }\n return null;\n}\n\nexport async function getProjectConfig(\n startDir?: string,\n): Promise<ProjectConfig | null> {\n const configDir = findProjectConfigDir(startDir);\n if (!configDir) return null;\n try {\n const data = await readFile(join(configDir, CONFIG_FILE_NAME), \"utf-8\");\n return JSON.parse(data) as ProjectConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveProjectConfig(\n config: ProjectConfig,\n dir?: string,\n): Promise<string> {\n const baseDir = dir ?? process.cwd();\n const configDir = join(baseDir, CONFIG_DIR_NAME);\n await mkdir(configDir, { recursive: true });\n await writeFile(\n join(configDir, CONFIG_FILE_NAME),\n JSON.stringify(config, null, 2),\n );\n await ensureGitignore(baseDir);\n return configDir;\n}\n\nasync function ensureGitignore(baseDir: string): Promise<void> {\n const gitignorePath = join(baseDir, \".gitignore\");\n\n if (existsSync(gitignorePath)) {\n const content = await readFile(gitignorePath, \"utf-8\");\n if (content.includes(CONFIG_DIR_NAME)) return;\n const suffix = content.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await appendFile(\n gitignorePath,\n `${suffix}\\n# Beakcrypt CLI\\n${CONFIG_DIR_NAME}\\n`,\n );\n } else {\n await writeFile(gitignorePath, `# Beakcrypt CLI\\n${CONFIG_DIR_NAME}\\n`);\n }\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { getAuthConfig } from \"./global-config\";\nimport {\n getProjectConfig,\n saveProjectConfig,\n type ProjectConfig,\n} from \"./project-config\";\nimport { query, mutation } from \"./convex-client\";\nimport { unwrapResult, CliError } from \"./errors\";\nimport * as interactive from \"./interactive\";\nimport * as output from \"./output\";\nimport { loginCommand } from \"../commands/login\";\n\nexport interface ResolvedContext {\n orgId: string;\n orgSlug: string;\n projectId: string;\n projectName: string;\n envName: string;\n environmentId: string;\n}\n\ninterface ContextFlags {\n org?: string;\n project?: string;\n env?: string;\n}\n\nexport async function ensureAuth(): Promise<void> {\n const auth = await getAuthConfig();\n if (auth) return;\n\n if (!interactive.isInteractive()) {\n throw new CliError(\"Not logged in. Run `beakcrypt login` first.\");\n }\n\n const shouldLogin = await interactive.confirm(\n \"You're not logged in. Log in now?\",\n true,\n );\n if (!shouldLogin) process.exit(0);\n await loginCommand();\n}\n\nexport async function resolveContext(\n flags: ContextFlags,\n): Promise<ResolvedContext> {\n await ensureAuth();\n\n const projectConfig = await getProjectConfig();\n\n const orgId = flags.org\n ? await resolveOrgBySlug(flags.org)\n : projectConfig?.orgId;\n const orgSlug = flags.org ?? projectConfig?.orgSlug;\n const projectId = flags.project\n ? await resolveProjectByName(orgId!, flags.project)\n : projectConfig?.projectId;\n const projectName = flags.project ?? projectConfig?.projectName;\n const envName = flags.env ?? projectConfig?.defaultEnv;\n\n if (!orgId || !projectId || !envName || !orgSlug || !projectName) {\n if (!interactive.isInteractive()) {\n throw new CliError(\n \"No project linked in this directory.\",\n \"Run `beakcrypt link` to connect this directory to a project.\",\n );\n }\n\n const config = await interactiveLink();\n const envId = await resolveEnvId(\n config.projectId,\n flags.env ?? config.defaultEnv,\n );\n return {\n orgId: config.orgId,\n orgSlug: config.orgSlug,\n projectId: config.projectId,\n projectName: config.projectName,\n envName: flags.env ?? config.defaultEnv,\n environmentId: envId,\n };\n }\n\n const envId = await resolveEnvId(projectId, envName);\n return {\n orgId,\n orgSlug,\n projectId,\n projectName,\n envName,\n environmentId: envId,\n };\n}\n\nasync function resolveOrgBySlug(slug: string): Promise<string> {\n const result = await query(api.organizations.getBySlug, { slug });\n const org = unwrapResult(result);\n return org._id;\n}\n\nasync function resolveProjectByName(\n orgId: string,\n name: string,\n): Promise<string> {\n const result = await query(api.projects.getByName, {\n orgId: orgId as never,\n name,\n });\n const project = unwrapResult(result);\n return project._id;\n}\n\nasync function resolveEnvId(\n projectId: string,\n envName: string,\n): Promise<string> {\n if (envName === \"local\") {\n await mutation(api.environments.ensurePersonalLocal, {\n projectId: projectId as never,\n syncFromDev: false,\n });\n }\n\n const result = await query(api.environments.list, {\n projectId: projectId as never,\n });\n const envs = unwrapResult(result);\n const env = envs.find((e: { name: string }) => e.name === envName);\n if (!env) {\n throw new CliError(`Environment \"${envName}\" not found.`);\n }\n return env._id;\n}\n\nexport async function interactiveLink(): Promise<ProjectConfig> {\n interactive.requireInteractive(\"link\");\n\n const orgsResult = await query(api.organizations.list, {});\n const orgs = unwrapResult(orgsResult);\n\n if (orgs.length === 0) {\n throw new CliError(\"You don't belong to any organizations.\");\n }\n\n const orgId = await interactive.select({\n message: \"Select an organization:\",\n choices: orgs.map((o: { _id: string; name: string; slug: string }) => ({\n title: `${o.name} (${o.slug})`,\n value: o._id,\n })),\n });\n const selectedOrg = orgs.find((o: { _id: string }) => o._id === orgId)!;\n\n const action = await interactive.select({\n message: \"What would you like to do?\",\n choices: [\n { title: \"Link to an existing project\", value: \"link\" as const },\n { title: \"Create a new project\", value: \"create\" as const },\n ],\n });\n\n let projectId: string;\n let projectName: string;\n\n if (action === \"create\") {\n const name = await interactive.text({\n message: \"Enter project name:\",\n validate: (v: string) =>\n v.trim().length > 0 ? true : \"Project name is required\",\n });\n const createResult = await mutation(api.projects.create, {\n name: name.trim(),\n orgId: orgId as never,\n });\n const project = unwrapResult(createResult);\n projectId = project._id;\n projectName = project.name;\n output.success(`Created project \"${projectName}\" in ${selectedOrg.name}`);\n } else {\n const projectsResult = await query(api.projects.list, {\n orgId: orgId as never,\n });\n const projects = unwrapResult(projectsResult);\n\n if (projects.length === 0) {\n throw new CliError(\"No projects in this organization. Create one first.\");\n }\n\n projectId = await interactive.select({\n message: \"Select a project:\",\n choices: projects.map((p: { _id: string; name: string }) => ({\n title: p.name,\n value: p._id,\n })),\n });\n const selectedProject = projects.find(\n (p: { _id: string }) => p._id === projectId,\n )!;\n projectName = selectedProject.name;\n }\n\n await mutation(api.environments.ensurePersonalLocal, {\n projectId: projectId as never,\n syncFromDev: false,\n });\n\n const envsResult = await query(api.environments.list, {\n projectId: projectId as never,\n });\n const envs = unwrapResult(envsResult);\n\n const defaultEnv = await interactive.select({\n message: \"Select a default environment:\",\n choices: envs.map(\n (e: { _id: string; name: string; isPersonal?: boolean }) => ({\n title: e.isPersonal ? `${e.name} (personal)` : e.name,\n value: e.name,\n }),\n ),\n });\n\n const config: ProjectConfig = {\n orgId,\n orgSlug: selectedOrg.slug,\n projectId,\n projectName,\n defaultEnv,\n };\n\n const configDir = await saveProjectConfig(config);\n output.success(\n `Linked to ${selectedOrg.slug}/${projectName} (${defaultEnv})`,\n );\n output.info(`Created ${configDir}/project.json`);\n output.info(`Added .beakcrypt to .gitignore`);\n\n return config;\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../lib/convex-client\";\nimport { CliError } from \"../lib/errors\";\nimport { ensureAuth } from \"../lib/context\";\nimport * as output from \"../lib/output\";\n\nexport async function whoamiCommand(): Promise<void> {\n await ensureAuth();\n\n const user = await query(api.auth.getCurrentUser, {});\n if (!user) {\n throw new CliError(\n \"Could not retrieve user info. Try `beakcrypt login` again.\",\n );\n }\n\n console.log();\n console.log(` ${output.bold(\"Email:\")} ${user.email}`);\n console.log(` ${output.bold(\"Name:\")} ${user.name}`);\n console.log();\n}\n","import ora from \"ora\";\nimport open from \"open\";\nimport {\n generateKeyPair,\n unwrapOrgKey as cryptoUnwrapOrgKey,\n} from \"@beakcrypt/crypto\";\nimport { api } from \"@beakcrypt/convex\";\nimport { query, mutation, getSessionToken, getSiteUrl } from \"./convex-client\";\nimport {\n getStoredKey,\n saveKey,\n updateWrappedOrgKey,\n type StoredKeyData,\n} from \"./key-store\";\nimport { unwrapResult } from \"./errors\";\nimport { getProjectConfig } from \"./project-config\";\nimport * as output from \"./output\";\n\nexport async function ensureOrgKey(orgId: string): Promise<string> {\n const stored = await getStoredKey(orgId);\n\n if (stored?.wrappedOrgKey) {\n return await cryptoUnwrapOrgKey(stored.wrappedOrgKey, stored.privateKey);\n }\n\n if (stored?.keyId) {\n // Key exists but no wrapped org key — check backend for approval\n const keyResult = await query(api.keys.getMyKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(stored.publicKey),\n });\n const keyRecord = unwrapResult(keyResult);\n\n if (keyRecord?.status === \"active\" && keyRecord.wrappedOrgKey) {\n await updateWrappedOrgKey(orgId, keyRecord.wrappedOrgKey);\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n stored.privateKey,\n );\n }\n\n if (keyRecord?.status === \"pending\") {\n return await waitForApproval(orgId, stored);\n }\n\n throw new Error(\n \"Device key is not active. An admin may need to approve this device.\",\n );\n }\n\n // No key pair — register new device\n return await registerNewDevice(orgId);\n}\n\nasync function registerNewDevice(orgId: string): Promise<string> {\n const sessionToken = getSessionToken();\n if (!sessionToken) throw new Error(\"Not logged in\");\n\n const spinner = ora(\"Generating device keys...\").start();\n\n let keyPair: Awaited<ReturnType<typeof generateKeyPair>>;\n let keyRecord: ReturnType<typeof unwrapResult<any>>;\n\n try {\n keyPair = await generateKeyPair();\n\n spinner.text = \"Registering device with organization...\";\n\n const result = await mutation(api.keys.registerKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(keyPair.publicKey),\n sessionToken,\n });\n\n keyRecord = unwrapResult(result);\n spinner.stop();\n } catch (err) {\n spinner.fail(\"Device registration failed.\");\n throw err;\n }\n\n const stored: StoredKeyData = {\n publicKey: keyPair.publicKey,\n privateKey: keyPair.privateKey,\n keyId: keyRecord._id,\n wrappedOrgKey: keyRecord.wrappedOrgKey,\n };\n\n await saveKey(orgId, stored);\n\n if (keyRecord.status === \"active\" && keyRecord.wrappedOrgKey) {\n output.success(\"Device registered and activated.\");\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n keyPair.privateKey,\n );\n }\n\n // Pending approval\n return await waitForApproval(orgId, stored);\n}\n\nasync function waitForApproval(\n orgId: string,\n stored: StoredKeyData,\n): Promise<string> {\n // Try to open the browser for auto-approval (same-user, new device scenario)\n try {\n const projectConfig = await getProjectConfig();\n if (projectConfig?.orgSlug && stored.keyId) {\n const siteUrl = getSiteUrl();\n const approveUrl = `${siteUrl}/${projectConfig.orgSlug}/sessions?approveSession=${stored.keyId}`;\n\n output.info(\"Opening browser to approve this device...\");\n console.log(`${output.dim(\"If the browser doesn't open, visit:\")}`);\n console.log(`${output.link(approveUrl)}\\n`);\n\n try {\n await open(approveUrl);\n } catch {\n // Browser failed to open — URL already printed above\n }\n }\n } catch {\n // Could not determine approval URL — fall through to polling\n }\n\n const spinner = ora(\"Waiting for device to be approved...\").start();\n spinner.indent = 2;\n\n while (true) {\n await new Promise((r) => setTimeout(r, 5000));\n\n const result = await query(api.keys.getMyKey, {\n orgId: orgId as never,\n publicKey: JSON.stringify(stored.publicKey),\n });\n const keyRecord = unwrapResult(result);\n\n if (keyRecord?.status === \"active\" && keyRecord.wrappedOrgKey) {\n spinner.stop();\n await updateWrappedOrgKey(orgId, keyRecord.wrappedOrgKey);\n output.success(\"Device approved!\");\n return await cryptoUnwrapOrgKey(\n keyRecord.wrappedOrgKey,\n stored.privateKey,\n );\n }\n\n if (keyRecord?.status === \"revoked\") {\n spinner.stop();\n throw new Error(\"Device key was revoked. Re-run `beakcrypt login`.\");\n }\n }\n}\n","export interface ExportedKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n}\n\nexport const RSA_ALGORITHM: RsaHashedKeyGenParams = {\n name: \"RSA-OAEP\",\n modulusLength: 4096,\n publicExponent: new Uint8Array([1, 0, 1]),\n hash: \"SHA-256\",\n};\n\nexport const AES_ALGORITHM = \"AES-GCM\";\nexport const AES_KEY_LENGTH = 256;\nexport const IV_BYTE_LENGTH = 12;\n\nexport async function generateKeyPair(): Promise<ExportedKeyPair> {\n const keyPair = await crypto.subtle.generateKey(RSA_ALGORITHM, true, [\n \"wrapKey\",\n \"unwrapKey\",\n ]);\n\n const [publicKey, privateKey] = await Promise.all([\n crypto.subtle.exportKey(\"jwk\", keyPair.publicKey),\n crypto.subtle.exportKey(\"jwk\", keyPair.privateKey),\n ]);\n\n return { publicKey, privateKey };\n}\n\nexport async function generateOrgKey(): Promise<string> {\n const key = await crypto.subtle.generateKey(\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const raw = await crypto.subtle.exportKey(\"raw\", key);\n return bufferToBase64(raw);\n}\n\nexport async function wrapOrgKey(\n orgKeyBase64: string,\n publicKeyJwk: JsonWebKey,\n): Promise<string> {\n const publicKey = await crypto.subtle.importKey(\n \"jwk\",\n publicKeyJwk,\n RSA_ALGORITHM,\n false,\n [\"wrapKey\"],\n );\n\n const orgKey = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const wrapped = await crypto.subtle.wrapKey(\"raw\", orgKey, publicKey, {\n name: \"RSA-OAEP\",\n });\n\n return bufferToBase64(wrapped);\n}\n\nexport async function unwrapOrgKey(\n wrappedKeyBase64: string,\n privateKeyJwk: JsonWebKey,\n): Promise<string> {\n const privateKey = await crypto.subtle.importKey(\n \"jwk\",\n privateKeyJwk,\n RSA_ALGORITHM,\n false,\n [\"unwrapKey\"],\n );\n\n const orgKey = await crypto.subtle.unwrapKey(\n \"raw\",\n base64ToBuffer(wrappedKeyBase64),\n privateKey,\n { name: \"RSA-OAEP\" },\n { name: AES_ALGORITHM, length: AES_KEY_LENGTH },\n true,\n [\"encrypt\", \"decrypt\"],\n );\n\n const raw = await crypto.subtle.exportKey(\"raw\", orgKey);\n return bufferToBase64(raw);\n}\n\nexport async function encryptSecret(\n plaintext: string,\n orgKeyBase64: string,\n): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM },\n false,\n [\"encrypt\"],\n );\n\n const iv = crypto.getRandomValues(new Uint8Array(IV_BYTE_LENGTH));\n const encoded = new TextEncoder().encode(plaintext);\n\n const ciphertext = await crypto.subtle.encrypt(\n { name: AES_ALGORITHM, iv },\n key,\n encoded,\n );\n\n return `${bufferToBase64(iv.buffer)}:${bufferToBase64(ciphertext)}`;\n}\n\nexport async function decryptSecret(\n encryptedValue: string,\n orgKeyBase64: string,\n): Promise<string> {\n const [ivBase64, ciphertextBase64] = encryptedValue.split(\":\");\n if (!ivBase64 || !ciphertextBase64) {\n throw new Error(\n \"Invalid encrypted value format — expected 'iv:ciphertext'\",\n );\n }\n\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBuffer(orgKeyBase64),\n { name: AES_ALGORITHM },\n false,\n [\"decrypt\"],\n );\n\n const decrypted = await crypto.subtle.decrypt(\n { name: AES_ALGORITHM, iv: base64ToBuffer(ivBase64) },\n key,\n base64ToBuffer(ciphertextBase64),\n );\n\n return new TextDecoder().decode(decrypted);\n}\n\nexport function bufferToBase64(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]!);\n }\n return btoa(binary);\n}\n\nexport function base64ToBuffer(base64: string): ArrayBuffer {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes.buffer;\n}\n","import { mkdir, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getConfigDir } from \"./global-config\";\n\nexport interface StoredKeyData {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n wrappedOrgKey?: string;\n}\n\nfunction getKeysDir(): string {\n return join(getConfigDir(), \"keys\");\n}\n\nfunction getKeyFile(orgId: string): string {\n return join(getKeysDir(), `${orgId}.json`);\n}\n\nexport async function getStoredKey(\n orgId: string,\n): Promise<StoredKeyData | null> {\n const file = getKeyFile(orgId);\n if (!existsSync(file)) return null;\n try {\n const data = await readFile(file, \"utf-8\");\n return JSON.parse(data) as StoredKeyData;\n } catch {\n return null;\n }\n}\n\nexport async function saveKey(\n orgId: string,\n data: StoredKeyData,\n): Promise<void> {\n const dir = getKeysDir();\n await mkdir(dir, { recursive: true });\n await writeFile(getKeyFile(orgId), JSON.stringify(data, null, 2), {\n mode: 0o600,\n });\n}\n\nexport async function updateWrappedOrgKey(\n orgId: string,\n wrappedOrgKey: string,\n): Promise<void> {\n const existing = await getStoredKey(orgId);\n if (!existing) throw new Error(`No key stored for org ${orgId}`);\n existing.wrappedOrgKey = wrappedOrgKey;\n await saveKey(orgId, existing);\n}\n\nexport async function removeKey(orgId: string): Promise<void> {\n const file = getKeyFile(orgId);\n if (existsSync(file)) {\n await rm(file);\n }\n}\n\nexport async function clearAllKeys(): Promise<void> {\n const dir = getKeysDir();\n if (existsSync(dir)) {\n await rm(dir, { recursive: true });\n }\n}\n","import { ensureAuth, interactiveLink } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\n\nexport async function linkCommand(): Promise<void> {\n await ensureAuth();\n const config = await interactiveLink();\n await ensureOrgKey(config.orgId);\n}\n","import { resolve } from \"node:path\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { decryptSecret } from \"@beakcrypt/crypto\";\nimport { query } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { writeEnvFile } from \"../lib/env-file\";\nimport { unwrapResult } from \"../lib/errors\";\nimport * as output from \"../lib/output\";\n\nexport async function pullCommand(\n file: string | undefined,\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n const filePath = resolve(file ?? \".env.local\");\n const ctx = await resolveContext(opts);\n\n const spinner = ora(\"Pulling secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n const decrypted: Record<string, string> = {};\n for (const secret of secrets) {\n decrypted[secret.key] = await decryptSecret(secret.encryptedValue, orgKey);\n }\n\n await writeEnvFile(filePath, decrypted);\n spinner.stop();\n\n output.success(\n `Pulled ${secrets.length} secret${secrets.length === 1 ? \"\" : \"s\"} to ${file ?? \".env.local\"}`,\n );\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\n\nexport function parseEnvFile(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n if (key) {\n env[key] = value;\n }\n }\n\n return env;\n}\n\nexport function serializeEnvFile(env: Record<string, string>): string {\n const lines: string[] = [\n \"# Generated by Beakcrypt CLI\",\n `# ${new Date().toISOString()}`,\n \"\",\n ];\n\n const sorted = Object.entries(env).sort(([a], [b]) => a.localeCompare(b));\n\n for (const [key, value] of sorted) {\n // Quote values that contain spaces, #, or newlines\n if (/[\\s#]/.test(value)) {\n lines.push(`${key}=\"${value}\"`);\n } else {\n lines.push(`${key}=${value}`);\n }\n }\n\n lines.push(\"\"); // trailing newline\n return lines.join(\"\\n\");\n}\n\nexport async function readEnvFile(\n filePath: string,\n): Promise<Record<string, string>> {\n if (!existsSync(filePath)) {\n return {};\n }\n const content = await readFile(filePath, \"utf-8\");\n return parseEnvFile(content);\n}\n\nexport async function writeEnvFile(\n filePath: string,\n env: Record<string, string>,\n): Promise<void> {\n await writeFile(filePath, serializeEnvFile(env));\n}\n","import { resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { encryptSecret } from \"@beakcrypt/crypto\";\nimport { mutation } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { readEnvFile } from \"../lib/env-file\";\nimport { unwrapResult, CliError } from \"../lib/errors\";\nimport * as interactive from \"../lib/interactive\";\nimport * as output from \"../lib/output\";\n\nexport async function pushCommand(\n file: string | undefined,\n opts: { org?: string; project?: string; env?: string; yes?: boolean },\n): Promise<void> {\n const filePath = resolve(file ?? \".env.local\");\n\n if (!existsSync(filePath)) {\n throw new CliError(`File not found: ${filePath}`);\n }\n\n const ctx = await resolveContext(opts);\n const env = await readEnvFile(filePath);\n const keys = Object.keys(env);\n\n if (keys.length === 0) {\n output.info(\"No secrets found in file.\");\n return;\n }\n\n if (!opts.yes) {\n output.info(\n `Pushing ${keys.length} secret${keys.length === 1 ? \"\" : \"s\"} to ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})`,\n );\n const confirmed = await interactive.confirm(\"Continue?\", true);\n if (!confirmed) return;\n }\n\n const spinner = ora(\"Encrypting and pushing secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const encryptedSecrets: { key: string; encryptedValue: string }[] = [];\n for (const [key, value] of Object.entries(env)) {\n const encrypted = await encryptSecret(value, orgKey);\n encryptedSecrets.push({ key, encryptedValue: encrypted });\n }\n\n const result = await mutation(api.secrets.bulkCreate, {\n environmentId: ctx.environmentId as never,\n secrets: encryptedSecrets,\n overwrite: true,\n });\n const summary = unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Pushed ${summary.created} created, ${summary.updated} updated, ${summary.skipped} skipped`,\n );\n}\n","import { spawn } from \"node:child_process\";\nimport ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { decryptSecret } from \"@beakcrypt/crypto\";\nimport { query } from \"../lib/convex-client\";\nimport { resolveContext } from \"../lib/context\";\nimport { ensureOrgKey } from \"../lib/key-manager\";\nimport { unwrapResult, CliError } from \"../lib/errors\";\n\nexport async function runCommand(\n args: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (args.length === 0) {\n throw new CliError(\n \"No command provided. Usage: beakcrypt run -- <command>\",\n );\n }\n\n const ctx = await resolveContext(opts);\n\n const spinner = ora(\"Loading secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n const decrypted: Record<string, string> = {};\n for (const secret of secrets) {\n decrypted[secret.key] = await decryptSecret(secret.encryptedValue, orgKey);\n }\n\n spinner.stop();\n\n const [command, ...commandArgs] = args;\n const child = spawn(command!, commandArgs, {\n stdio: \"inherit\",\n env: { ...process.env, ...decrypted },\n });\n\n child.on(\"close\", (code) => {\n process.exit(code ?? 0);\n });\n\n child.on(\"error\", (err) => {\n throw new CliError(`Failed to run command: ${err.message}`);\n });\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsListCommand(opts: {\n org?: string;\n project?: string;\n env?: string;\n}): Promise<void> {\n const ctx = await resolveContext(opts);\n\n const result = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(result);\n\n if (secrets.length === 0) {\n output.info(\n `No secrets in ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})`,\n );\n return;\n }\n\n console.log(\n `\\n${output.bold(`${ctx.orgSlug}/${ctx.projectName}`)} ${output.dim(`(${ctx.envName})`)}\\n`,\n );\n\n output.table(\n secrets.map((s: { key: string }) => [s.key, \"••••••••\"]),\n [\"Key\", \"Value\"],\n );\n\n console.log(\n `\\n${output.dim(`${secrets.length} secret${secrets.length === 1 ? \"\" : \"s\"}`)}\\n`,\n );\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { encryptSecret } from \"@beakcrypt/crypto\";\nimport { mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { ensureOrgKey } from \"../../lib/key-manager\";\nimport { unwrapResult, CliError } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsSetCommand(\n pairs: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (pairs.length === 0) {\n throw new CliError(\n \"No key=value pairs provided. Usage: beakcrypt secrets set KEY=VALUE\",\n );\n }\n\n const parsed: { key: string; value: string }[] = [];\n for (const pair of pairs) {\n const eqIndex = pair.indexOf(\"=\");\n if (eqIndex === -1) {\n throw new CliError(`Invalid format: \"${pair}\". Use KEY=VALUE.`);\n }\n parsed.push({\n key: pair.slice(0, eqIndex),\n value: pair.slice(eqIndex + 1),\n });\n }\n\n const ctx = await resolveContext(opts);\n const spinner = ora(\"Setting secrets...\").start();\n\n const orgKey = await ensureOrgKey(ctx.orgId);\n\n const encryptedSecrets: { key: string; encryptedValue: string }[] = [];\n for (const { key, value } of parsed) {\n const encrypted = await encryptSecret(value, orgKey);\n encryptedSecrets.push({ key, encryptedValue: encrypted });\n }\n\n const result = await mutation(api.secrets.bulkCreate, {\n environmentId: ctx.environmentId as never,\n secrets: encryptedSecrets,\n overwrite: true,\n });\n unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Set ${parsed.length} secret${parsed.length === 1 ? \"\" : \"s\"} in ${ctx.envName}`,\n );\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { query, mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult, CliError } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsRemoveCommand(\n keys: string[],\n opts: { org?: string; project?: string; env?: string },\n): Promise<void> {\n if (keys.length === 0) {\n throw new CliError(\n \"No keys provided. Usage: beakcrypt secrets remove KEY [KEY2...]\",\n );\n }\n\n const ctx = await resolveContext(opts);\n const spinner = ora(\"Removing secrets...\").start();\n\n const secretsResult = await query(api.secrets.list, {\n environmentId: ctx.environmentId as never,\n });\n const secrets = unwrapResult(secretsResult);\n\n let removed = 0;\n const notFound: string[] = [];\n\n for (const key of keys) {\n const secret = secrets.find((s: { key: string }) => s.key === key);\n if (secret) {\n const result = await mutation(api.secrets.remove, {\n id: secret._id as never,\n });\n unwrapResult(result);\n removed++;\n } else {\n notFound.push(key);\n }\n }\n\n spinner.stop();\n\n if (removed > 0) {\n output.success(\n `Removed ${removed} secret${removed === 1 ? \"\" : \"s\"} from ${ctx.envName}`,\n );\n }\n if (notFound.length > 0) {\n output.warn(`Not found: ${notFound.join(\", \")}`);\n }\n}\n","import ora from \"ora\";\nimport { api } from \"@beakcrypt/convex\";\nimport { mutation } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as interactive from \"../../lib/interactive\";\nimport * as output from \"../../lib/output\";\n\nexport async function secretsClearCommand(opts: {\n org?: string;\n project?: string;\n env?: string;\n yes?: boolean;\n}): Promise<void> {\n const ctx = await resolveContext(opts);\n\n if (!opts.yes) {\n const confirmed = await interactive.confirm(\n `Delete ALL secrets in ${ctx.orgSlug}/${ctx.projectName} (${ctx.envName})?`,\n );\n if (!confirmed) return;\n }\n\n const spinner = ora(\"Clearing secrets...\").start();\n\n const result = await mutation(api.secrets.removeAll, {\n environmentId: ctx.environmentId as never,\n });\n const summary = unwrapResult(result);\n\n spinner.stop();\n output.success(\n `Deleted ${summary.deleted} secret${summary.deleted === 1 ? \"\" : \"s\"}`,\n );\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { ensureAuth } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function orgListCommand(): Promise<void> {\n await ensureAuth();\n\n const result = await query(api.organizations.list, {});\n const orgs = unwrapResult(result);\n\n if (orgs.length === 0) {\n output.info(\"You don't belong to any organizations.\");\n return;\n }\n\n console.log();\n output.table(\n orgs.map((o: { name: string; slug: string }) => [o.name, o.slug]),\n [\"Name\", \"Slug\"],\n );\n console.log();\n}\n","import { api } from \"@beakcrypt/convex\";\nimport { query } from \"../../lib/convex-client\";\nimport { resolveContext } from \"../../lib/context\";\nimport { unwrapResult } from \"../../lib/errors\";\nimport * as output from \"../../lib/output\";\n\nexport async function envListCommand(opts: {\n org?: string;\n project?: string;\n}): Promise<void> {\n const ctx = await resolveContext({ ...opts, env: \"development\" });\n\n const result = await query(api.environments.list, {\n projectId: ctx.projectId as never,\n });\n const envs = unwrapResult(result);\n\n if (envs.length === 0) {\n output.info(\"No environments found.\");\n return;\n }\n\n console.log(\n `\\n${output.bold(`${ctx.orgSlug}/${ctx.projectName}`)} environments:\\n`,\n );\n\n output.table(\n envs.map((e: { name: string; isPersonal?: boolean }) => [\n e.name,\n e.isPersonal ? \"personal\" : \"shared\",\n ]),\n [\"Name\", \"Type\"],\n );\n console.log();\n}\n","import pc from \"picocolors\";\nimport { getAuthConfig } from \"./lib/global-config\";\nimport { getProjectConfig } from \"./lib/project-config\";\nimport * as interactive from \"./lib/interactive\";\nimport * as output from \"./lib/output\";\nimport { loginCommand } from \"./commands/login\";\nimport { linkCommand } from \"./commands/link\";\nimport { pullCommand } from \"./commands/pull\";\nimport { pushCommand } from \"./commands/push\";\nimport { secretsListCommand } from \"./commands/secrets/list\";\n\nexport async function interactiveMode(): Promise<void> {\n interactive.requireInteractive(\"(no args)\");\n\n console.log(`\\n${pc.bold(\"Beakcrypt\")} ${pc.dim(\"v0.1.0\")}\\n`);\n\n // Check auth\n const auth = await getAuthConfig();\n if (!auth) {\n const shouldLogin = await interactive.confirm(\n \"You're not logged in. Log in now?\",\n true,\n );\n if (!shouldLogin) process.exit(0);\n await loginCommand();\n }\n\n // Check project link\n const config = await getProjectConfig();\n if (!config) {\n output.info(\"No project linked in this directory.\");\n const shouldLink = await interactive.confirm(\n \"Link to a project now?\",\n true,\n );\n if (!shouldLink) process.exit(0);\n await linkCommand();\n return;\n }\n\n // Show linked project and action menu\n console.log(\n `Linked to ${output.bold(`${config.orgSlug}/${config.projectName}`)} ${output.dim(`(${config.defaultEnv}`)})`,\n );\n console.log();\n\n const action = await interactive.select({\n message: \"What would you like to do?\",\n choices: [\n { title: \"Pull secrets (.env.local)\", value: \"pull\" as const },\n { title: \"Push secrets (.env.local)\", value: \"push\" as const },\n { title: \"List secrets\", value: \"list\" as const },\n { title: \"Change project link\", value: \"link\" as const },\n ],\n });\n\n switch (action) {\n case \"pull\":\n await pullCommand(undefined, {});\n break;\n case \"push\":\n await pushCommand(undefined, {});\n break;\n case \"list\":\n await secretsListCommand({});\n break;\n case \"link\":\n await linkCommand();\n break;\n }\n}\n"],"mappings":"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","names":["pc","pc","pc","resolve","pc","mkdir","readFile","writeFile","existsSync","join","envId","org","env","ora","open","mkdir","readFile","writeFile","rm","existsSync","join","join","existsSync","readFile","mkdir","writeFile","ora","open","ora","readFile","writeFile","existsSync","env","ora","secrets","resolve","existsSync","ora","resolve","existsSync","env","ora","ora","ora","secrets","secrets","ora","ora","ora","ora","secrets","ora","ora","pc","pc"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "beakcrypt",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Secure environment variable management with E2E encryption",
5
5
  "homepage": "https://beakcrypt.com",
6
6
  "type": "module",
@@ -55,8 +55,8 @@
55
55
  "prettier": "^3.8.1",
56
56
  "tsup": "^8.5.0",
57
57
  "@beakcrypt/convex": "0.0.1",
58
- "@beakcrypt/shared": "0.0.1",
59
58
  "@beakcrypt/crypto": "0.0.1",
59
+ "@beakcrypt/shared": "0.0.1",
60
60
  "@beakcrypt/eslint-config": "0.0.1",
61
61
  "@beakcrypt/typescript-config": "0.0.1"
62
62
  },