@stackframe/stack-cli 2.8.85 → 2.8.86

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
@@ -61,7 +61,7 @@ function removeConfigValue(key) {
61
61
  //#region src/lib/auth.ts
62
62
  const DEFAULT_API_URL = "https://api.stack-auth.com";
63
63
  const DEFAULT_DASHBOARD_URL = "https://app.stack-auth.com";
64
- const DEFAULT_PUBLISHABLE_CLIENT_KEY = process.env.STACK_CLI_PUBLISHABLE_CLIENT_KEY ?? "pck_6ypt981excjnk24dmgx5703my25k2f3y2z3qjhbykz3q0";
64
+ const DEFAULT_PUBLISHABLE_CLIENT_KEY = process.env.STACK_CLI_PUBLISHABLE_CLIENT_KEY ?? "pck_9bbqvqsbh0gdb6smk11d71qg4ktc4rz8ya7cc69yndm7g";
65
65
  function resolveApiUrl() {
66
66
  return process.env.STACK_API_URL ?? readConfigValue("STACK_API_URL") ?? DEFAULT_API_URL;
67
67
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/lib/errors.ts","../src/lib/config.ts","../src/lib/auth.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/lib/app.ts","../src/commands/exec.ts","../src/commands/config-file.ts","../src/lib/interactive.ts","../src/lib/init-prompt.ts","../src/lib/claude-agent.ts","../src/commands/init.ts","../src/commands/project.ts","../src/commands/emulator.ts","../src/index.ts"],"sourcesContent":["export class CliError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport class AuthError extends CliError {\n constructor(message: string) {\n super(message);\n this.name = \"AuthError\";\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst CONFIG_PATH = process.env.STACK_CLI_CONFIG_PATH ?? path.join(os.homedir(), \".config\", \"stack-auth\", \"credentials.json\");\n\ntype ConfigKey = \"STACK_CLI_REFRESH_TOKEN\" | \"STACK_CLI_ANON_REFRESH_TOKEN\" | \"STACK_API_URL\" | \"STACK_DASHBOARD_URL\";\n\nfunction readConfigJson(): Record<string, string> {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeConfigJson(data: Record<string, string>): void {\n fs.mkdirSync(path.dirname(CONFIG_PATH), { recursive: true });\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(data, null, 2) + \"\\n\", { mode: 0o600 });\n}\n\nexport function readConfigValue(key: ConfigKey): string | undefined {\n const config = readConfigJson();\n return config[key];\n}\n\nexport function writeConfigValue(key: ConfigKey, value: string): void {\n const config = readConfigJson();\n config[key] = value;\n writeConfigJson(config);\n}\n\nexport function removeConfigValue(key: ConfigKey): void {\n const config = readConfigJson();\n delete config[key];\n writeConfigJson(config);\n}\n","import { readConfigValue } from \"./config.js\";\nimport { AuthError } from \"./errors.js\";\n\nexport const DEFAULT_API_URL = \"https://api.stack-auth.com\";\nexport const DEFAULT_DASHBOARD_URL = \"https://app.stack-auth.com\";\nexport const DEFAULT_PUBLISHABLE_CLIENT_KEY = process.env.STACK_CLI_PUBLISHABLE_CLIENT_KEY ?? \"pck_6ypt981excjnk24dmgx5703my25k2f3y2z3qjhbykz3q0\";\n\ntype Flags = {\n projectId?: string,\n};\n\nexport type LoginConfig = {\n apiUrl: string,\n dashboardUrl: string,\n};\n\nexport type SessionAuth = LoginConfig & {\n refreshToken: string,\n};\n\nexport type ProjectAuthWithRefreshToken = SessionAuth & {\n projectId: string,\n};\n\nexport type ProjectAuthWithSecretServerKey = LoginConfig & {\n projectId: string,\n secretServerKey: string,\n};\n\nexport type ProjectAuth = (ProjectAuthWithRefreshToken | ProjectAuthWithSecretServerKey) & {\n projectId: string,\n};\n\nfunction resolveApiUrl(): string {\n return process.env.STACK_API_URL\n ?? readConfigValue(\"STACK_API_URL\")\n ?? DEFAULT_API_URL;\n}\n\nfunction resolveDashboardUrl(): string {\n return process.env.STACK_DASHBOARD_URL\n ?? readConfigValue(\"STACK_DASHBOARD_URL\")\n ?? DEFAULT_DASHBOARD_URL;\n}\n\nfunction resolveRefreshToken(): string {\n const token = process.env.STACK_CLI_REFRESH_TOKEN\n ?? readConfigValue(\"STACK_CLI_REFRESH_TOKEN\");\n if (!token) {\n throw new AuthError(\"Not logged in. Run `stack login` first.\");\n }\n return token;\n}\n\nfunction resolveSecretServerKey(): string | null {\n return process.env.STACK_SECRET_SERVER_KEY ?? null;\n}\n\nfunction resolveProjectId(flags: Flags): string {\n const projectId = flags.projectId ?? process.env.STACK_PROJECT_ID;\n if (!projectId) {\n throw new AuthError(\"No project ID specified. Use --project-id or set STACK_PROJECT_ID.\");\n }\n return projectId;\n}\n\nexport function resolveLoginConfig(flags: Flags): LoginConfig {\n return {\n apiUrl: resolveApiUrl(),\n dashboardUrl: resolveDashboardUrl(),\n };\n}\n\nexport function resolveSessionAuth(flags: Flags): SessionAuth {\n return {\n ...resolveLoginConfig(flags),\n refreshToken: resolveRefreshToken(),\n };\n}\n\nexport function resolveAuth(flags: Flags): ProjectAuth {\n const secretServerKey = resolveSecretServerKey();\n if (secretServerKey) {\n return {\n ...resolveLoginConfig(flags),\n projectId: resolveProjectId(flags),\n secretServerKey,\n };\n }\n\n return {\n ...resolveSessionAuth(flags),\n projectId: resolveProjectId(flags),\n };\n}\n\nexport function isProjectAuthWithSecretServerKey(auth: ProjectAuth): auth is ProjectAuthWithSecretServerKey {\n return \"secretServerKey\" in auth;\n}\n\nexport function isProjectAuthWithRefreshToken(auth: ProjectAuth): auth is ProjectAuthWithRefreshToken {\n return \"refreshToken\" in auth;\n}\n","import { StackClientApp } from \"@stackframe/js\";\nimport { Command } from \"commander\";\nimport { DEFAULT_PUBLISHABLE_CLIENT_KEY, resolveLoginConfig } from \"../lib/auth.js\";\nimport { readConfigValue, removeConfigValue, writeConfigValue } from \"../lib/config.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nexport function registerLoginCommand(program: Command) {\n program\n .command(\"login\")\n .description(\n \"Log in to Stack Auth via browser. To attach this login to an existing anonymous session, set STACK_CLI_ANON_REFRESH_TOKEN (env var) or the same key in the CLI credentials file before running; login does not write that value.\",\n )\n .action(async () => {\n const flags = program.opts();\n const config = resolveLoginConfig(flags);\n\n const app = new StackClientApp({\n projectId: \"internal\",\n publishableClientKey: DEFAULT_PUBLISHABLE_CLIENT_KEY,\n baseUrl: config.apiUrl,\n tokenStore: \"memory\",\n noAutomaticPrefetch: true,\n });\n\n const anonRefreshToken =\n process.env.STACK_CLI_ANON_REFRESH_TOKEN ?? readConfigValue(\"STACK_CLI_ANON_REFRESH_TOKEN\");\n\n console.log(\"Waiting for browser authentication...\");\n\n const result = await app.promptCliLogin({\n appUrl: config.dashboardUrl,\n anonRefreshToken,\n promptLink: (url) => {\n console.log(`\\nPlease visit the following URL to authenticate:\\n${url}`);\n },\n });\n\n if (result.status === \"error\") {\n throw new CliError(`Login failed: ${result.error.message}`);\n }\n\n writeConfigValue(\"STACK_CLI_REFRESH_TOKEN\", result.data);\n if (anonRefreshToken) {\n removeConfigValue(\"STACK_CLI_ANON_REFRESH_TOKEN\");\n }\n console.log(\"Login successful!\");\n });\n}\n","import { Command } from \"commander\";\nimport { removeConfigValue } from \"../lib/config.js\";\n\nexport function registerLogoutCommand(program: Command) {\n program\n .command(\"logout\")\n .description(\"Log out of Stack Auth\")\n .action(() => {\n removeConfigValue(\"STACK_CLI_REFRESH_TOKEN\");\n console.log(\"Logged out successfully.\");\n });\n}\n","import { StackClientApp } from \"@stackframe/js\";\nimport type { CurrentInternalUser, AdminOwnedProject } from \"@stackframe/js\";\nimport { AuthError } from \"./errors.js\";\nimport { DEFAULT_PUBLISHABLE_CLIENT_KEY } from \"./auth.js\";\nimport type { SessionAuth, ProjectAuthWithRefreshToken } from \"./auth.js\";\n\nexport function getInternalApp(auth: SessionAuth): StackClientApp<true, \"internal\"> {\n return new StackClientApp({\n projectId: \"internal\",\n publishableClientKey: DEFAULT_PUBLISHABLE_CLIENT_KEY,\n baseUrl: auth.apiUrl,\n tokenStore: {\n accessToken: \"\",\n refreshToken: auth.refreshToken,\n },\n noAutomaticPrefetch: true,\n });\n}\n\nexport async function getInternalUser(auth: SessionAuth): Promise<CurrentInternalUser> {\n const app = getInternalApp(auth);\n const user = await app.getUser({ or: \"throw\" });\n return user as CurrentInternalUser;\n}\n\nexport async function getAdminProject(auth: ProjectAuthWithRefreshToken): Promise<AdminOwnedProject> {\n const user = await getInternalUser(auth);\n const projects = await user.listOwnedProjects();\n const project = projects.find((p) => p.id === auth.projectId);\n if (!project) {\n throw new AuthError(`Project '${auth.projectId}' not found. Make sure you own this project.`);\n }\n return project;\n}\n","import { Command } from \"commander\";\nimport { isProjectAuthWithRefreshToken, resolveAuth } from \"../lib/auth.js\";\nimport { getAdminProject } from \"../lib/app.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nfunction getErrorMessage(err: unknown): string {\n if (err instanceof Error) {\n return err.message;\n }\n if (typeof err === \"string\") {\n return err;\n }\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\n}\n\nexport function registerExecCommand(program: Command) {\n program\n .command(\"exec [javascript]\")\n .description(\"Execute JavaScript with a pre-configured StackServerApp as `stackServerApp`\")\n .addHelpText(\"after\", \"\\nFor available API methods, see: https://docs.stack-auth.com/docs/sdk\")\n .action(async (javascript: string | undefined) => {\n if (javascript === undefined) {\n throw new CliError(\"Missing JavaScript argument. Use `stack exec \\\"<javascript>\\\"` or `stack exec --help`.\");\n }\n\n const flags = program.opts();\n const auth = resolveAuth(flags);\n if (!isProjectAuthWithRefreshToken(auth)) {\n throw new CliError(\"`stack exec` requires `stack login`. Remove STACK_SECRET_SERVER_KEY and try again.\");\n }\n const project = await getAdminProject(auth);\n\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;\n let fn;\n try {\n fn = new AsyncFunction(\"stackServerApp\", javascript);\n } catch (err: unknown) {\n throw new CliError(`Syntax error in exec code: ${getErrorMessage(err)}`);\n }\n let result;\n try {\n result = await fn(project.app);\n } catch (err: unknown) {\n throw new CliError(`Exec error: ${getErrorMessage(err)}`);\n }\n\n if (result !== undefined) {\n console.log(JSON.stringify(result, null, 2));\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { isProjectAuthWithRefreshToken, isProjectAuthWithSecretServerKey, resolveAuth, type ProjectAuthWithSecretServerKey } from \"../lib/auth.js\";\nimport { getAdminProject } from \"../lib/app.js\";\nimport { CliError } from \"../lib/errors.js\";\nimport type { EnvironmentConfigOverrideOverride } from \"@stackframe/stack-shared/dist/config/schema\";\nimport { detectImportPackageFromDir, renderConfigFileContent } from \"@stackframe/stack-shared/dist/config-rendering\";\n\nfunction isConfigOverride(value: unknown): value is EnvironmentConfigOverrideOverride {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\ntype BranchConfigSourceApi =\n | { type: \"pushed-from-github\", owner: string, repo: string, branch: string, commit_hash: string, config_file_path: string }\n | { type: \"pushed-from-unknown\" }\n | { type: \"unlinked\" };\n\nfunction parseGitHubRepository(): { owner: string, repo: string } | null {\n const repository = process.env.GITHUB_REPOSITORY;\n if (!repository) {\n return null;\n }\n\n const slashIndex = repository.indexOf(\"/\");\n if (slashIndex <= 0 || slashIndex >= repository.length - 1) {\n return null;\n }\n\n return {\n owner: repository.slice(0, slashIndex),\n repo: repository.slice(slashIndex + 1),\n };\n}\n\nfunction buildConfigPushSource(configFilePath: string): BranchConfigSourceApi {\n const repository = parseGitHubRepository();\n const sha = process.env.GITHUB_SHA;\n const branch = process.env.GITHUB_REF_NAME;\n\n if (repository && sha && branch) {\n return {\n type: \"pushed-from-github\",\n owner: repository.owner,\n repo: repository.repo,\n branch,\n commit_hash: sha,\n config_file_path: configFilePath,\n };\n }\n\n return { type: \"pushed-from-unknown\" };\n}\n\nasync function pushConfigWithSecretServerKey(\n auth: ProjectAuthWithSecretServerKey,\n config: EnvironmentConfigOverrideOverride,\n source: BranchConfigSourceApi,\n) {\n const endpoint = `${auth.apiUrl.replace(/\\/$/, \"\")}/api/v1/internal/config/override/branch`;\n const response = await fetch(endpoint, {\n method: \"PUT\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-stack-project-id\": auth.projectId,\n \"x-stack-access-type\": \"server\",\n \"x-stack-secret-server-key\": auth.secretServerKey,\n },\n body: JSON.stringify({\n config_string: JSON.stringify(config),\n source,\n }),\n });\n\n if (response.ok) {\n return;\n }\n\n const responseText = await response.text();\n const message = responseText.length > 0\n ? responseText\n : `Request failed with status ${response.status}.`;\n throw new CliError(`Failed to push config with STACK_SECRET_SERVER_KEY: ${message}`);\n}\n\nfunction sourceToSdkSource(source: BranchConfigSourceApi):\n { type: \"pushed-from-github\", owner: string, repo: string, branch: string, commitHash: string, configFilePath: string }\n | { type: \"pushed-from-unknown\" }\n | { type: \"unlinked\" } {\n if (source.type === \"pushed-from-github\") {\n return {\n type: \"pushed-from-github\",\n owner: source.owner,\n repo: source.repo,\n branch: source.branch,\n commitHash: source.commit_hash,\n configFilePath: source.config_file_path,\n };\n }\n if (source.type === \"pushed-from-unknown\") {\n return { type: \"pushed-from-unknown\" };\n }\n return { type: \"unlinked\" };\n}\n\nexport function registerConfigCommand(program: Command) {\n const config = program\n .command(\"config\")\n .description(\"Manage project configuration files\");\n\n config\n .command(\"pull\")\n .description(\"Pull branch config to a local file\")\n .requiredOption(\"--config-file <path>\", \"Path to write config file (.ts)\")\n .option(\"--overwrite\", \"Overwrite an existing config file\")\n .action(async (opts) => {\n const flags = program.opts();\n const auth = resolveAuth(flags);\n if (!isProjectAuthWithRefreshToken(auth)) {\n throw new CliError(\"`stack config pull` requires `stack login`. Remove STACK_SECRET_SERVER_KEY and try again.\");\n }\n const project = await getAdminProject(auth);\n\n const configOverride = await project.getConfigOverride(\"branch\");\n const filePath = path.resolve(opts.configFile);\n const ext = path.extname(filePath);\n\n if (ext !== \".ts\") {\n throw new CliError(\"Config file must have a .ts extension. Typed config files require TypeScript.\");\n }\n\n if (fs.existsSync(filePath) && !opts.overwrite) {\n throw new CliError(`Config file already exists at ${filePath}. Stage or back up your changes, then re-run with --overwrite.`);\n }\n\n const importPackage = detectImportPackageFromDir(path.dirname(filePath));\n const content = renderConfigFileContent(configOverride, importPackage);\n\n fs.writeFileSync(filePath, content);\n console.log(`Config written to ${filePath}`);\n });\n\n config\n .command(\"push\")\n .description(\"Push a local config file to branch config\")\n .requiredOption(\"--config-file <path>\", \"Path to config file (.js or .ts)\")\n .action(async (opts) => {\n const flags = program.opts();\n const auth = resolveAuth(flags);\n\n const filePath = path.resolve(opts.configFile);\n const ext = path.extname(filePath);\n\n if (ext !== \".js\" && ext !== \".ts\") {\n throw new CliError(\"Config file must have a .js or .ts extension.\");\n }\n\n if (!fs.existsSync(filePath)) {\n throw new CliError(`Config file not found: ${filePath}`);\n }\n\n const { createJiti } = await import(\"jiti\");\n const jiti = createJiti(import.meta.url);\n const configModule: { config?: unknown } = await jiti.import(filePath);\n\n const config = configModule.config;\n if (!isConfigOverride(config)) {\n const examplePkg = detectImportPackageFromDir(path.dirname(filePath)) ?? \"@stackframe/js\";\n throw new CliError(`Config file must export a plain \\`config\\` object. Example: import type { StackConfig } from \"${examplePkg}\"; export const config: StackConfig = { ... };`);\n }\n\n const source = buildConfigPushSource(opts.configFile);\n\n if (isProjectAuthWithSecretServerKey(auth)) {\n await pushConfigWithSecretServerKey(auth, config, source);\n } else {\n if (!isProjectAuthWithRefreshToken(auth)) {\n throw new CliError(\"`stack config push` requires either STACK_SECRET_SERVER_KEY or `stack login`.\");\n }\n const project = await getAdminProject(auth);\n await project.pushConfig(config, {\n source: sourceToSdkSource(source),\n });\n }\n\n console.log(\"Config pushed successfully.\");\n });\n}\n","export function isNonInteractiveEnv(): boolean {\n return !!(\n process.env.CI\n || process.env.GITHUB_ACTIONS\n || process.env.NONINTERACTIVE\n || !process.stdin.isTTY\n );\n}\n","// TODO: Use configPath in the prompt once local emulator is set up:\n// Add \"npx @stackframe/stack-cli emulator run --config-file ${configPath}\" to project dev command\nexport const createInitPrompt = (web: boolean, configPath?: string) => `=============================\nSTACK AUTH SETUP INSTRUCTIONS\n=============================\n\nThese instructions describe how to set up Stack Auth.\n${web ? `\nFirst of all, if you have access to a terminal, it is better to use the \\`npx @stackframe/stack-cli init\\`` : \"\"}\n\nInstall mcp server from https://mcp.stack-auth.com if not already installed\n\nFor reference, questions, or information on Stack Auth, you can query the docs on https://docs.stack-auth.com via curl or any tools that you have\n\n## Setup\n\n### 1) Install the package\n\nRun the install command using whatever package manager the project uses (npm, yarn, pnpm, bun):\n\n| Framework | Package |\n|-----------|---------|\n| Next.js | \\`@stackframe/stack\\` |\n| React | \\`@stackframe/react\\` |\n| Vanilla JS | \\`@stackframe/js\\` |\n\n### 2) Create the Stack apps\n\nDepending on whether you're on a client or a server, you will want to create stackClientApp or stackServerApp. Some environments, like Next.js, have both, so create both files.\n\nThe stack client app has client-level permissions. It contains most of the useful methods and hooks for your client-side code.\nThe stack server app has full read and write access to all users. It requires STACK_SECRET_SERVER_KEY env variable and should only be used in secure context\n\nIn Next.js, env vars are auto-detected (NEXT_PUBLIC_STACK_PROJECT_ID etc.), so the constructor needs no explicit config. For other frameworks, you must pass projectId explicitly using the framework's env var access method. Pass publishableClientKey only if your project is configured to require publishable client keys.\n\nThe tokenStore should be \"nextjs-cookie\" for Next.js, or \"cookie\" for all other frameworks.\n\nMake sure to set redirectMethod on non next.js frameworks. For example for tanstack router import like so:\nimport { useNavigate } from '@tanstack/react-router'\n\n\\`\\`\\`ts\n// src/stack/client.ts\nimport { StackClientApp } from \"@stackframe/stack\"; // or \"@stackframe/react\" or \"@stackframe/js\"\n\nexport const stackClientApp = new StackClientApp({\n // Next.js: omit projectId/publishableClientKey (auto-detected from NEXT_PUBLIC_ env vars)\n // Other frameworks: pass projectId explicitly, and publishableClientKey only if required by your project. For Vite:\n // projectId: import.meta.env.VITE_STACK_PROJECT_ID,\n // publishableClientKey: import.meta.env.VITE_STACK_PUBLISHABLE_CLIENT_KEY,\n tokenStore: \"nextjs-cookie\", // or \"cookie\" for non-Next.js,\n // redirectMethod: { useNavigate } // or \"window\"\n});\n\\`\\`\\`\n\nIf the framework has server-side support (e.g. Next.js), also create a server app:\n\n\\`\\`\\`ts\n// src/stack/server.ts\nimport \"server-only\";\nimport { StackServerApp } from \"@stackframe/stack\";\nimport { stackClientApp } from \"./client\";\n\nexport const stackServerApp = new StackServerApp({\n inheritsFrom: stackClientApp,\n});\n\\`\\`\\`\n\n### 3) Create the Stack handler (if available in framework)\n\nThis sets up pages for sign in, sign up, password reset, etc.\n\n\\`\\`\\`tsx\nimport { StackHandler } from \"@stackframe/stack\"; // Next.js\n// import { StackHandler } from \"@stackframe/react\"; // React\n\nexport default function Handler() {\n return <StackHandler fullPage />;\n}\n\\`\\`\\`\n\n### 4) Create a Suspense boundary\n\nSuspense is necessary for many stack auth hooks such as useUser to function. Add a loading component with a custom loading indicator for the current project. Don't add if one already exists\n\nFor example:\n\\`\\`\\`tsx\n//src/loading.tsx\n\nexport default function Loading() {\n return <p>Loading...</p>\n}\n\\`\\`\\`\n\n### 5) Link environment variables\n\nThis is only necessary if not using local emulator. Ensure these are ignored by git.\n\nRename the env var keys in .env to match the framework's convention for client-exposed variables. For example, Vite requires VITE_ prefix, Next.js uses NEXT_PUBLIC_, etc. The values should stay the same — only rename the keys.\n\nThe required variables are:\n- Project ID (e.g. NEXT_PUBLIC_STACK_PROJECT_ID, VITE_STACK_PROJECT_ID, etc.)\n- Secret server key: STACK_SECRET_SERVER_KEY (only for frameworks with server-side support, no prefix needed)\n\nThe publishable client key (e.g. NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY, VITE_STACK_PUBLISHABLE_CLIENT_KEY, etc.) is only required if your project has publishable client keys enabled as a requirement.\n\n### 6) React only: Wrap the entire page in a Stack provider\n\nThis is used for the useUser and useStackApp hooks.\n\n\\`\\`\\`tsx\nimport { StackProvider, StackTheme } from \"@stackframe/stack\";\nimport { stackClientApp } from \"../stack/client\"; // adjust relative path\n\\`\\`\\`\n\nThen wrap the body content: \n\n\\`\\`\\`tsx\nreturn (\n <body>\n <StackProvider app={stackClientApp}>\n <StackTheme>{children}</StackTheme>\n </StackProvider>\n </body>\n);\n\\`\\`\\`\n`;\n","import { query } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst DEFAULT_PROXY_URL = \"https://api.stack-auth.com/api/v1/integrations/ai-proxy\";\nconst ANTHROPIC_PROXY_BASE_URL: string = process.env.STACK_CLAUDE_PROXY_URL ?? DEFAULT_PROXY_URL;\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nclass AgentProgressUI {\n private mainLabel: string;\n private spinnerFrame = 0;\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n private activeSpinners = new Map<string, string>(); // id -> label\n private flushedCount = 0; // number of completed items already printed above the spinner area\n private pendingCompleted: string[] = []; // completed items not yet flushed\n private lastLineCount = 0;\n\n constructor(mainLabel: string) {\n this.mainLabel = mainLabel;\n }\n\n start() {\n this.spinnerTimer = setInterval(() => {\n this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER_FRAMES.length;\n this.render();\n }, 80);\n this.render();\n }\n\n stop(success: boolean) {\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n this.completeAllActive();\n this.clearLines();\n const icon = success ? \"\\x1b[32m✔\\x1b[0m\" : \"\\x1b[31m✖\\x1b[0m\";\n // Re-print header + all completed items as final output\n console.log(`${icon} ${this.mainLabel}`);\n for (const label of this.pendingCompleted) {\n console.log(` \\x1b[32m✔\\x1b[0m ${label}`);\n }\n this.pendingCompleted = [];\n }\n\n setSpinner(id: string, label: string) {\n this.activeSpinners.set(id, label);\n }\n\n complete(id: string, label?: string) {\n const existing = this.activeSpinners.get(id);\n this.activeSpinners.delete(id);\n const finalLabel = label ?? existing;\n if (finalLabel) {\n this.pendingCompleted.push(finalLabel);\n }\n }\n\n completeAllActive() {\n for (const label of this.activeSpinners.values()) {\n this.pendingCompleted.push(label);\n }\n this.activeSpinners.clear();\n }\n\n private clearLines() {\n if (this.lastLineCount > 0) {\n process.stdout.write(`\\x1b[${this.lastLineCount}A\\x1b[J`);\n }\n }\n\n private flushCompleted() {\n if (this.pendingCompleted.length === 0) {\n return;\n }\n // Clear the spinner area, print completed items permanently, then re-render spinner below\n this.clearLines();\n // Re-print the header line if this is the first flush\n if (this.flushedCount === 0) {\n const frame = SPINNER_FRAMES[this.spinnerFrame];\n process.stdout.write(`\\x1b[36m${frame}\\x1b[0m ${this.mainLabel}\\n`);\n }\n for (const label of this.pendingCompleted) {\n process.stdout.write(` \\x1b[32m✔\\x1b[0m ${label}\\n`);\n }\n this.flushedCount += this.pendingCompleted.length;\n this.pendingCompleted = [];\n this.lastLineCount = 0; // reset since we printed permanent lines\n }\n\n private render() {\n this.flushCompleted();\n this.clearLines();\n\n const frame = SPINNER_FRAMES[this.spinnerFrame];\n const lines: string[] = [];\n\n // Only show header in spinner area if nothing has been flushed yet\n if (this.flushedCount === 0) {\n lines.push(`\\x1b[36m${frame}\\x1b[0m ${this.mainLabel}`);\n }\n\n for (const label of this.activeSpinners.values()) {\n lines.push(` \\x1b[36m${frame}\\x1b[0m ${label}`);\n }\n\n if (lines.length > 0) {\n const output = lines.join(\"\\n\") + \"\\n\";\n process.stdout.write(output);\n }\n this.lastLineCount = lines.length;\n }\n}\n\nfunction getToolLabel(toolName: string, input: Record<string, unknown>): string {\n switch (toolName) {\n case \"Read\": {\n return `Reading ${input.file_path ?? \"file\"}`;\n }\n case \"Write\": {\n return `Writing ${input.file_path ?? \"file\"}`;\n }\n case \"Edit\": {\n return `Editing ${input.file_path ?? \"file\"}`;\n }\n case \"Bash\": {\n return `Running \\`${truncate(String(input.command ?? \"\"), 40)}\\``;\n }\n case \"Glob\": {\n return `Searching for ${input.pattern ?? \"files\"}`;\n }\n case \"Grep\": {\n return `Searching for \"${truncate(String(input.pattern ?? \"\"), 30)}\"`;\n }\n default: {\n return toolName;\n }\n }\n}\n\nfunction truncate(str: string, maxLen: number): string {\n return str.length > maxLen ? str.slice(0, maxLen - 1) + \"…\" : str;\n}\n\nfunction stripClaudeCodeEnv(): Record<string, string> {\n const env = { ...process.env };\n delete env.CLAUDECODE;\n return env as Record<string, string>;\n}\n\nexport async function runClaudeAgent(options: {\n prompt: string,\n cwd: string,\n}): Promise<boolean> {\n const ui = new AgentProgressUI(\"Setting up Stack Auth...\");\n ui.start();\n\n try {\n let resultText = \"\";\n\n for await (const message of query({\n prompt: options.prompt,\n options: {\n allowedTools: [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Glob\", \"Grep\"],\n permissionMode: \"dontAsk\",\n cwd: options.cwd,\n // stripClaudeCodeEnv removes CLAUDECODE env var to prevent nested agent detection. Anthropic api key cannot be empty otherwise users without claude code installed get a login error\n env: { ...stripClaudeCodeEnv(), ANTHROPIC_BASE_URL: ANTHROPIC_PROXY_BASE_URL, ANTHROPIC_API_KEY: \"stack-auth-proxy\" },\n stderr: (data: string) => { process.stderr.write(data); },\n },\n })) {\n if (\"result\" in message) {\n resultText = message.result;\n } else if (message.type === \"assistant\" && message.parent_tool_use_id === null) {\n // New parent assistant turn — previous tools are done\n ui.completeAllActive();\n // Register new tool calls from this turn\n for (const block of message.message.content) {\n if (block.type === \"tool_use\") {\n ui.setSpinner(block.id, getToolLabel(block.name, block.input as Record<string, unknown>));\n }\n }\n } else if (message.type === \"system\") {\n // Subagent task lifecycle\n const msg = message as Record<string, unknown>;\n const taskId = msg.task_id as string | undefined;\n\n if (msg.subtype === \"task_started\" && taskId) {\n ui.setSpinner(taskId, String(msg.description ?? \"Working...\"));\n } else if (msg.subtype === \"task_progress\" && taskId) {\n ui.setSpinner(taskId, String(msg.description ?? \"Working...\"));\n } else if (msg.subtype === \"task_notification\" && taskId) {\n ui.complete(taskId, String(msg.summary ?? msg.description ?? \"Done\"));\n }\n }\n }\n\n ui.stop(true);\n if (resultText) {\n console.log(`\\n${resultText}`);\n }\n return true;\n } catch (error) {\n ui.stop(false);\n console.error(\"\\nClaude agent encountered an error:\", error instanceof Error ? error.message : error);\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport { select, input, checkbox, confirm } from \"@inquirer/prompts\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StackClientApp } from \"@stackframe/js\";\nimport { ALL_APPS } from \"@stackframe/stack-shared/dist/apps/apps-config\";\nimport { resolveLoginConfig, resolveSessionAuth, DEFAULT_PUBLISHABLE_CLIENT_KEY } from \"../lib/auth.js\";\nimport { getInternalUser } from \"../lib/app.js\";\nimport { writeConfigValue } from \"../lib/config.js\";\nimport { CliError, AuthError } from \"../lib/errors.js\";\nimport { isNonInteractiveEnv } from \"../lib/interactive.js\";\nimport { createInitPrompt } from \"../lib/init-prompt.js\";\nimport { runClaudeAgent } from \"../lib/claude-agent.js\";\nimport { detectImportPackageFromDir, renderConfigFileContent } from \"@stackframe/stack-shared/dist/config-rendering\";\n\ntype InitOptions = {\n mode?: \"create\" | \"link-config\" | \"link-cloud\",\n apps?: string,\n configFile?: string,\n selectProjectId?: string,\n outputDir?: string,\n agent?: boolean,\n};\n\nexport function registerInitCommand(program: Command) {\n program\n .command(\"init\")\n .description(\"Initialize Stack Auth in your project\")\n .option(\"--mode <mode>\", \"Mode: create, link-config, or link-cloud (skips interactive prompts)\")\n .option(\"--apps <apps>\", \"Comma-separated app IDs to enable (for create mode)\")\n .option(\"--config-file <path>\", \"Path to existing config file (for link-config mode)\")\n .option(\"--select-project-id <id>\", \"Project ID to link (for link-cloud mode)\")\n .option(\"--output-dir <dir>\", \"Directory to write output files (defaults to cwd)\")\n .option(\"--no-agent\", \"Skip Claude agent and print setup instructions instead\")\n .action(async (opts: InitOptions) => {\n const hasFlags = opts.mode != null;\n\n if (!hasFlags && isNonInteractiveEnv()) {\n throw new CliError(\"stack init requires an interactive terminal. Use --mode flag for non-interactive usage.\");\n }\n\n try {\n await runInit(program, opts);\n } catch (error: unknown) {\n if (error != null && typeof error === \"object\" && \"name\" in error && error.name === \"ExitPromptError\") {\n console.log(\"\\nAborted.\");\n process.exit(0);\n }\n throw error;\n }\n });\n}\n\nasync function runInit(program: Command, opts: InitOptions) {\n const flags = program.opts();\n const outputDir = opts.outputDir ? path.resolve(opts.outputDir) : process.cwd();\n\n console.log(\"Welcome to Stack Auth!\\n\");\n\n const mode: string = \"link\";\n // TODO: re-enable local emulator option\n // const mode: string = opts.mode ?? await select({\n // message: \"Would you like to link to an existing project, or create a new one?\",\n // choices: [\n // { name: \"Create a new project (local emulator)\", value: \"create\" as const },\n // { name: \"Link an existing project\", value: \"link\" as const },\n // ],\n // });\n\n let configPath: string | undefined;\n\n if (mode === \"link\" || mode === \"link-config\" || mode === \"link-cloud\") {\n const result = await handleLink(flags, opts, outputDir);\n configPath = result.configPath;\n } else if (mode === \"create\") {\n const result = await handleCreate(opts, outputDir);\n configPath = result.configPath;\n } else {\n throw new CliError(`Unknown mode: ${mode}`);\n }\n\n const initPrompt = createInitPrompt(false, configPath);\n const useAgent = opts.agent !== false && !isNonInteractiveEnv();\n\n if (useAgent) {\n const success = await runClaudeAgent({\n prompt: `Execute ALL of the following setup steps in my project now. Do not ask questions — just detect the framework and package manager from existing files and proceed.\\n\\n${initPrompt}`,\n cwd: outputDir,\n });\n if (!success) {\n console.log(\"\\nFalling back to manual instructions:\\n\");\n console.log(initPrompt);\n }\n } else {\n console.log(\"\\n\" + initPrompt);\n }\n}\n\nasync function handleLink(flags: Record<string, unknown>, opts: InitOptions, outputDir: string): Promise<{ configPath?: string }> {\n let source: \"config-file\" | \"cloud\";\n\n if (opts.mode === \"link-config\") {\n source = \"config-file\";\n } else if (opts.mode === \"link-cloud\") {\n source = \"cloud\";\n } else {\n source = \"cloud\";\n // TODO: re-enable config file linking option\n // source = await select({\n // message: \"How would you like to link your project?\",\n // choices: [\n // { name: \"Link from config file\", value: \"config-file\" as const },\n // { name: \"Link from app.stack-auth.com\", value: \"cloud\" as const },\n // ],\n // });\n }\n\n if (source === \"config-file\") {\n return await handleLinkFromConfigFile(opts);\n }\n return await handleLinkFromCloud(flags, opts, outputDir);\n}\n\nasync function handleLinkFromConfigFile(opts: InitOptions): Promise<{ configPath: string }> {\n const filePath = opts.configFile ?? await input({\n message: \"Path to your existing stack.config.ts:\",\n validate: (value) => {\n const resolved = path.resolve(value);\n if (!fs.existsSync(resolved)) {\n return `File not found: ${resolved}`;\n }\n return true;\n },\n });\n\n const configPath = path.resolve(filePath);\n if (!fs.existsSync(configPath)) {\n throw new CliError(`File not found: ${configPath}`);\n }\n\n console.log(`\\nLinked to config file: ${configPath}`);\n return { configPath };\n}\n\nasync function handleLinkFromCloud(flags: Record<string, unknown>, opts: InitOptions, outputDir: string): Promise<{ configPath?: string }> {\n let sessionAuth;\n try {\n sessionAuth = resolveSessionAuth(flags as { projectId?: string });\n } catch (e) {\n if (e instanceof AuthError) {\n if (isNonInteractiveEnv()) {\n throw new CliError(\"Not logged in. Run `stack login` first or set STACK_CLI_REFRESH_TOKEN.\");\n }\n console.log(\"You need to log in first.\\n\");\n await performLogin(flags);\n sessionAuth = resolveSessionAuth(flags as { projectId?: string });\n } else {\n throw e;\n }\n }\n\n const user = await getInternalUser(sessionAuth);\n const projects = await user.listOwnedProjects();\n\n if (projects.length === 0) {\n throw new CliError(\"You don't own any projects. Create one at app.stack-auth.com first.\");\n }\n\n let projectId: string;\n if (opts.selectProjectId) {\n const found = projects.find((p) => p.id === opts.selectProjectId);\n if (!found) {\n throw new CliError(`Project '${opts.selectProjectId}' not found among your owned projects.`);\n }\n projectId = opts.selectProjectId;\n } else {\n projectId = await select({\n message: \"Select a project:\",\n choices: projects.map((p) => ({\n name: `${p.displayName} (${p.id})`,\n value: p.id,\n })),\n });\n }\n\n const project = projects.find((p) => p.id === projectId)!;\n const apiKey = await project.app.createInternalApiKey({\n description: \"Created by CLI init script\",\n expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365 * 200), // 200 years\n hasPublishableClientKey: true,\n hasSecretServerKey: true,\n hasSuperSecretAdminKey: false,\n });\n\n const envLines = [\n \"# Stack Auth\",\n `NEXT_PUBLIC_STACK_PROJECT_ID=${projectId}`,\n `NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=${apiKey.publishableClientKey ?? \"\"}`,\n `STACK_SECRET_SERVER_KEY=${apiKey.secretServerKey ?? \"\"}`,\n ].join(\"\\n\");\n\n const envPath = path.resolve(outputDir, \".env\");\n\n if (fs.existsSync(envPath)) {\n const existing = fs.readFileSync(envPath, \"utf-8\");\n const separator = existing.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n\n if (isNonInteractiveEnv()) {\n fs.appendFileSync(envPath, separator + envLines + \"\\n\");\n console.log(\"\\nAppended Stack Auth keys to .env\");\n } else {\n const shouldAppend = await confirm({\n message: `.env file already exists. Append Stack Auth keys?`,\n default: true,\n });\n\n if (shouldAppend) {\n fs.appendFileSync(envPath, separator + envLines + \"\\n\");\n console.log(\"\\nAppended Stack Auth keys to .env\");\n } else {\n console.log(\"\\nHere are your environment variables:\\n\");\n console.log(envLines);\n }\n }\n } else {\n fs.writeFileSync(envPath, envLines + \"\\n\");\n console.log(\"\\nCreated .env with Stack Auth keys\");\n }\n\n return {};\n}\n\nasync function performLogin(flags: Record<string, unknown>) {\n const config = resolveLoginConfig(flags as { projectId?: string });\n\n const app = new StackClientApp({\n projectId: \"internal\",\n publishableClientKey: DEFAULT_PUBLISHABLE_CLIENT_KEY,\n baseUrl: config.apiUrl,\n tokenStore: \"memory\",\n noAutomaticPrefetch: true,\n });\n\n console.log(\"Waiting for browser authentication...\");\n\n const result = await app.promptCliLogin({\n appUrl: config.dashboardUrl,\n });\n\n if (result.status === \"error\") {\n throw new CliError(`Login failed: ${result.error.message}`);\n }\n\n writeConfigValue(\"STACK_CLI_REFRESH_TOKEN\", result.data);\n console.log(\"Login successful!\\n\");\n}\n\nasync function handleCreate(opts: InitOptions, outputDir: string): Promise<{ configPath: string }> {\n const configPath = path.resolve(outputDir, \"stack.config.ts\");\n\n console.log(`\\nCreating a new config file at ${configPath}!\\n`);\n\n let selectedApps: string[];\n\n if (opts.apps) {\n selectedApps = opts.apps.split(\",\").map((s) => s.trim()).filter(Boolean);\n const validAppIds = Object.keys(ALL_APPS);\n const invalidApps = selectedApps.filter((id) => !validAppIds.includes(id));\n if (invalidApps.length > 0) {\n throw new CliError(`Unknown app IDs: ${invalidApps.join(\", \")}. Valid IDs: ${validAppIds.join(\", \")}`);\n }\n } else {\n const stageOrder = { stable: 0, beta: 1 } as const;\n const appEntries = Object.entries(ALL_APPS)\n .filter(([, app]) => app.stage !== \"alpha\")\n .sort((a, b) => stageOrder[a[1].stage as keyof typeof stageOrder] - stageOrder[b[1].stage as keyof typeof stageOrder]);\n\n selectedApps = await checkbox({\n message: \"Select apps to enable:\",\n choices: appEntries.map(([id, app]) => ({\n name: `${app.displayName} - ${app.subtitle}${app.stage !== \"stable\" ? ` (${app.stage})` : \"\"}`,\n value: id,\n checked: id === \"authentication\",\n })),\n });\n }\n\n const installed = Object.fromEntries(\n selectedApps.map((appId) => [appId, { enabled: true }])\n );\n\n const config = {\n apps: {\n installed,\n },\n };\n\n const importPackage = detectImportPackageFromDir(path.dirname(configPath));\n const content = renderConfigFileContent(config, importPackage);\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n fs.writeFileSync(configPath, content);\n\n console.log(`\\nConfig file written to ${configPath}`);\n return { configPath };\n}\n","import { Command } from \"commander\";\nimport * as readline from \"readline\";\nimport { resolveSessionAuth } from \"../lib/auth.js\";\nimport { getInternalUser } from \"../lib/app.js\";\nimport { isNonInteractiveEnv } from \"../lib/interactive.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\nexport function registerProjectCommand(program: Command) {\n const project = program\n .command(\"project\")\n .description(\"Manage projects\");\n\n project\n .command(\"list\")\n .description(\"List your owned projects\")\n .action(async () => {\n const flags = program.opts();\n const auth = resolveSessionAuth(flags);\n const user = await getInternalUser(auth);\n const projects = await user.listOwnedProjects();\n\n if (program.opts().json) {\n console.log(JSON.stringify(projects.map((p) => ({ id: p.id, displayName: p.displayName })), null, 2));\n } else {\n if (projects.length === 0) {\n console.log(\"No projects found.\");\n return;\n }\n for (const p of projects) {\n console.log(`${p.id}\\t${p.displayName}`);\n }\n }\n });\n\n project\n .command(\"create\")\n .description(\"Create a new project\")\n .option(\"--display-name <name>\", \"Project display name\")\n .action(async (opts) => {\n const flags = program.opts();\n const auth = resolveSessionAuth(flags);\n const user = await getInternalUser(auth);\n\n let displayName: string = opts.displayName;\n if (!displayName) {\n if (isNonInteractiveEnv()) {\n throw new CliError(\"--display-name is required in non-interactive environments (CI).\");\n }\n displayName = await prompt(\"Project display name: \");\n if (!displayName.trim()) {\n throw new CliError(\"Display name cannot be empty.\");\n }\n }\n\n const teams = await user.listTeams();\n if (teams.length === 0) {\n throw new CliError(\"No teams found. You need a team to create a project.\");\n }\n\n const newProject = await user.createProject({\n displayName,\n teamId: teams[0].id,\n });\n\n if (program.opts().json) {\n console.log(JSON.stringify({ id: newProject.id, displayName: newProject.displayName }, null, 2));\n } else {\n console.log(`Project created: ${newProject.id} (${newProject.displayName})`);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { execFileSync, spawn } from \"child_process\";\nimport { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { CliError } from \"../lib/errors.js\";\n\nconst DEFAULT_EMULATOR_BACKEND_PORT = 26701;\n\nfunction emulatorBackendPort(): number {\n const raw = process.env.EMULATOR_BACKEND_PORT;\n if (!raw) return DEFAULT_EMULATOR_BACKEND_PORT;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new CliError(`Invalid EMULATOR_BACKEND_PORT: ${raw}`);\n }\n return parsed;\n}\n\nfunction emulatorHome(): string {\n return process.env.STACK_EMULATOR_HOME ?? join(homedir(), \".stack\", \"emulator\");\n}\n\nfunction emulatorRunDir(): string {\n return join(emulatorHome(), \"run\");\n}\n\nfunction emulatorImageDir(): string {\n return join(emulatorHome(), \"images\");\n}\n\nfunction internalPckPath(): string {\n return join(emulatorRunDir(), \"vm\", \"internal-pck\");\n}\n\nasync function readInternalPck(timeoutMs = 60_000): Promise<string> {\n const path = internalPckPath();\n const deadline = Date.now() + timeoutMs;\n let delay = 250;\n while (Date.now() < deadline) {\n if (existsSync(path)) {\n const contents = readFileSync(path, \"utf-8\").trim();\n if (contents) return contents;\n }\n await new Promise((r) => setTimeout(r, delay));\n delay = Math.min(delay * 2, 2000);\n }\n throw new CliError(`Timed out waiting for emulator internal publishable client key at ${path}`);\n}\n\ntype EmulatorCredentials = {\n project_id: string,\n publishable_client_key: string,\n secret_server_key: string,\n};\n\nasync function fetchEmulatorCredentials(pck: string, backendPort: number, configFile: string): Promise<EmulatorCredentials> {\n const url = `http://127.0.0.1:${backendPort}/api/v1/internal/local-emulator/project`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Stack-Project-Id\": \"internal\",\n \"X-Stack-Access-Type\": \"client\",\n \"X-Stack-Publishable-Client-Key\": pck,\n },\n body: JSON.stringify({ absolute_file_path: configFile }),\n });\n if (!res.ok) {\n throw new CliError(`Failed to initialize local emulator project (${res.status}): ${await res.text()}`);\n }\n const data = await res.json() as {\n project_id: string,\n publishable_client_key: string,\n secret_server_key: string,\n };\n return {\n project_id: data.project_id,\n publishable_client_key: data.publishable_client_key,\n secret_server_key: data.secret_server_key,\n };\n}\n\nfunction gh(args: string[]): string {\n try {\n return execFileSync(\"gh\", args, { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n } catch (err: unknown) {\n if (err instanceof Error && \"stderr\" in err && typeof err.stderr === \"string\") {\n throw new CliError(`GitHub CLI error: ${err.stderr}`);\n }\n throw new CliError(\"GitHub CLI (gh) is required. Install: https://cli.github.com/\");\n }\n}\n\nfunction emulatorScriptsDir(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n const bundled = join(here, \"emulator\");\n if (existsSync(join(bundled, \"run-emulator.sh\"))) return bundled;\n const repo = resolve(here, \"../../../docker/local-emulator/qemu\");\n if (existsSync(join(repo, \"run-emulator.sh\"))) return repo;\n throw new CliError(\"Emulator scripts not found in CLI bundle.\");\n}\n\nfunction emulatorSpawnEnv(extra?: Record<string, string>): NodeJS.ProcessEnv {\n return {\n ...process.env,\n EMULATOR_RUN_DIR: emulatorRunDir(),\n EMULATOR_IMAGE_DIR: emulatorImageDir(),\n ...extra,\n };\n}\n\nfunction runEmulator(action: string, env?: Record<string, string>): Promise<void> {\n const scriptsDir = emulatorScriptsDir();\n mkdirSync(emulatorRunDir(), { recursive: true });\n mkdirSync(emulatorImageDir(), { recursive: true });\n return new Promise((resolvePromise, reject) => {\n const child = spawn(join(scriptsDir, \"run-emulator.sh\"), [action], {\n stdio: \"inherit\",\n env: emulatorSpawnEnv(env),\n cwd: scriptsDir,\n });\n child.on(\"close\", (code) => code === 0 ? resolvePromise() : reject(new CliError(`run-emulator.sh ${action} exited with code ${code}`)));\n child.on(\"error\", (err) => reject(new CliError(`Failed to run run-emulator.sh: ${err.message}`)));\n });\n}\n\nfunction isEmulatorRunning(): boolean {\n const scriptsDir = emulatorScriptsDir();\n try {\n execFileSync(join(scriptsDir, \"run-emulator.sh\"), [\"status\"], {\n stdio: \"pipe\",\n cwd: scriptsDir,\n env: emulatorSpawnEnv(),\n });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function startEmulator(arch: \"arm64\" | \"amd64\"): Promise<void> {\n mkdirSync(emulatorImageDir(), { recursive: true });\n const img = join(emulatorImageDir(), `stack-emulator-${arch}.qcow2`);\n if (!existsSync(img)) {\n console.log(\"No emulator image found. Pulling latest...\");\n pullRelease(arch);\n }\n await runEmulator(\"start\", { EMULATOR_ARCH: arch });\n}\n\nfunction resolveArch(raw?: string): \"arm64\" | \"amd64\" {\n const arch = raw ?? (process.arch === \"arm64\" ? \"arm64\" : process.arch === \"x64\" ? \"amd64\" : null);\n if (arch === \"arm64\" || arch === \"amd64\") return arch;\n throw new CliError(`Invalid architecture: ${raw ?? process.arch}. Expected arm64 or amd64.`);\n}\n\nfunction pullRelease(arch: \"arm64\" | \"amd64\", opts: { repo?: string; branch?: string; tag?: string } = {}) {\n const repo = opts.repo ?? \"stack-auth/stack-auth\";\n const branch = opts.branch ?? \"dev\";\n const tag = opts.tag ?? `emulator-${branch}-latest`;\n const asset = `stack-emulator-${arch}.qcow2`;\n const imageDir = emulatorImageDir();\n mkdirSync(imageDir, { recursive: true });\n const dest = join(imageDir, asset);\n const tmpDest = `${dest}.download`;\n\n console.log(`Pulling ${asset} from release ${tag}...`);\n try {\n execFileSync(\"gh\", [\"release\", \"download\", tag, \"--repo\", repo, \"--pattern\", asset, \"--output\", tmpDest, \"--clobber\"], { stdio: \"inherit\" });\n } catch (err) {\n if (existsSync(tmpDest)) unlinkSync(tmpDest);\n throw new CliError(`Failed to download ${asset} from release ${tag}: ${err instanceof Error ? err.message : err}\\nRun 'stack emulator list-releases' to see available releases.`);\n }\n renameSync(tmpDest, dest);\n console.log(`Downloaded: ${dest}`);\n}\n\nexport function registerEmulatorCommand(program: Command) {\n const emulator = program.command(\"emulator\").description(\"Manage the QEMU local emulator\");\n\n emulator\n .command(\"pull\")\n .description(\"Download an emulator image from GitHub Releases or a PR build\")\n .option(\"--arch <arch>\", \"Target architecture (default: current system arch)\")\n .option(\"--branch <branch>\", \"Release branch (default: dev)\")\n .option(\"--tag <tag>\", \"Specific release tag (default: latest)\")\n .option(\"--repo <repo>\", \"GitHub repository (default: stack-auth/stack-auth)\")\n .option(\"--pr <number>\", \"Pull from a PR's CI artifacts\")\n .option(\"--run <id>\", \"Pull from a specific workflow run's artifacts\")\n .action(async (opts) => {\n const arch = resolveArch(opts.arch);\n const repo = opts.repo ?? \"stack-auth/stack-auth\";\n\n if (opts.run || opts.pr) {\n let runId = opts.run as string | undefined;\n if (!runId) {\n console.log(`Finding latest successful build for PR #${opts.pr}...`);\n const { headRefName } = JSON.parse(gh([\"pr\", \"view\", opts.pr, \"--repo\", repo, \"--json\", \"headRefName\"]));\n const runs = JSON.parse(gh([\"run\", \"list\", \"--repo\", repo, \"--workflow\", \"qemu-emulator-build.yaml\", \"--branch\", headRefName, \"--status\", \"success\", \"--limit\", \"1\", \"--json\", \"databaseId\"]));\n if (runs.length === 0) throw new CliError(`No successful build found for PR #${opts.pr} (branch: ${headRefName}).`);\n runId = String(runs[0].databaseId);\n }\n\n const imageDir = emulatorImageDir();\n mkdirSync(imageDir, { recursive: true });\n const dest = join(imageDir, `stack-emulator-${arch}.qcow2`);\n if (existsSync(dest)) unlinkSync(dest);\n console.log(`Downloading qemu-emulator-${arch} from workflow run ${runId}...`);\n try {\n execFileSync(\"gh\", [\"run\", \"download\", runId, \"--repo\", repo, \"--name\", `qemu-emulator-${arch}`, \"--dir\", imageDir], { stdio: \"inherit\" });\n } catch (err) {\n throw new CliError(`Failed to download artifact from run ${runId}: ${err instanceof Error ? err.message : err}`);\n }\n if (!existsSync(dest)) throw new CliError(`Expected image not found at ${dest} after download.`);\n console.log(`Downloaded: ${dest}`);\n } else {\n pullRelease(arch, { repo, branch: opts.branch, tag: opts.tag });\n }\n });\n\n emulator\n .command(\"start\")\n .description(\"Start the emulator in the background (auto-pulls the latest image if none exists)\")\n .option(\"--arch <arch>\", \"Target architecture (default: current system arch). Non-native uses software emulation and is significantly slower.\")\n .option(\"--config-file <path>\", \"Path to a config file; when set, credentials for this project are printed to stdout as JSON\")\n .action(async (opts: { arch?: string, configFile?: string }) => {\n const arch = resolveArch(opts.arch);\n\n let resolvedConfigFile: string | undefined;\n if (opts.configFile) {\n resolvedConfigFile = resolve(opts.configFile);\n if (!existsSync(resolvedConfigFile)) {\n throw new CliError(`Config file not found: ${resolvedConfigFile}`);\n }\n }\n\n if (isEmulatorRunning()) {\n console.warn(\"Emulator already running, reusing existing instance.\");\n } else {\n await startEmulator(arch);\n }\n\n if (resolvedConfigFile) {\n const pck = await readInternalPck();\n const creds = await fetchEmulatorCredentials(pck, emulatorBackendPort(), resolvedConfigFile);\n console.log(JSON.stringify(creds, null, 2));\n }\n });\n\n emulator\n .command(\"run\")\n .description(\"Start the emulator, run a command, and stop the emulator when the command exits\")\n .argument(\"<cmd>\", \"Command to run (e.g. \\\"npm run dev\\\")\")\n .option(\"--arch <arch>\", \"Target architecture\")\n .option(\"--config-file <path>\", \"Path to a config file; fetches credentials and injects STACK_PROJECT_ID / STACK_PUBLISHABLE_CLIENT_KEY / STACK_SECRET_SERVER_KEY into the child\")\n .action(async (cmd: string, opts: { arch?: string, configFile?: string }) => {\n const arch = resolveArch(opts.arch);\n\n let resolvedConfigFile: string | undefined;\n if (opts.configFile) {\n resolvedConfigFile = resolve(opts.configFile);\n if (!existsSync(resolvedConfigFile)) {\n throw new CliError(`Config file not found: ${resolvedConfigFile}`);\n }\n }\n\n const alreadyRunning = isEmulatorRunning();\n if (alreadyRunning) {\n console.log(\"Emulator already running, reusing existing instance.\");\n } else {\n await startEmulator(arch);\n }\n\n const childEnv: Record<string, string> = { ...process.env as Record<string, string> };\n if (resolvedConfigFile) {\n const pck = await readInternalPck();\n const backendPort = emulatorBackendPort();\n const creds = await fetchEmulatorCredentials(pck, backendPort, resolvedConfigFile);\n const apiUrl = `http://127.0.0.1:${backendPort}`;\n childEnv.STACK_PROJECT_ID = creds.project_id;\n childEnv.NEXT_PUBLIC_STACK_PROJECT_ID = creds.project_id;\n childEnv.STACK_PUBLISHABLE_CLIENT_KEY = creds.publishable_client_key;\n childEnv.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY = creds.publishable_client_key;\n childEnv.STACK_SECRET_SERVER_KEY = creds.secret_server_key;\n childEnv.STACK_API_URL = apiUrl;\n childEnv.NEXT_PUBLIC_STACK_API_URL = apiUrl;\n }\n\n const child = spawn(cmd, { shell: true, stdio: \"inherit\", env: childEnv });\n\n const forward = (signal: NodeJS.Signals) => () => child.kill(signal);\n const onSigint = forward(\"SIGINT\");\n const onSigterm = forward(\"SIGTERM\");\n process.on(\"SIGINT\", onSigint);\n process.on(\"SIGTERM\", onSigterm);\n\n child.on(\"close\", (code) => {\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n const exitCode = code ?? 1;\n if (alreadyRunning) {\n process.exit(exitCode);\n } else {\n console.log(\"\\nStopping emulator...\");\n runEmulator(\"stop\")\n .catch(() => { /* best-effort stop */ })\n .finally(() => process.exit(exitCode));\n }\n });\n });\n\n emulator.command(\"stop\").description(\"Stop the emulator (data preserved; use 'reset' to clear)\").action(() => runEmulator(\"stop\"));\n emulator.command(\"reset\").description(\"Reset emulator state for a fresh boot\").action(() => runEmulator(\"reset\"));\n emulator.command(\"status\").description(\"Show emulator and service health\").action(() => runEmulator(\"status\"));\n\n emulator\n .command(\"list-releases\")\n .description(\"List available emulator releases\")\n .option(\"--repo <repo>\", \"GitHub repository (default: stack-auth/stack-auth)\")\n .action((opts) => {\n const repo = opts.repo ?? \"stack-auth/stack-auth\";\n console.log(`Available emulator releases from ${repo}:\\n`);\n const lines = gh([\"release\", \"list\", \"--repo\", repo, \"--limit\", \"20\"]).split(\"\\n\").filter((l) => l.toLowerCase().includes(\"emulator\"));\n if (lines.length === 0) console.log(\"No emulator releases found.\");\n else for (const line of lines) console.log(line);\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\nimport { AuthError, CliError } from \"./lib/errors.js\";\nimport { registerLoginCommand } from \"./commands/login.js\";\nimport { registerLogoutCommand } from \"./commands/logout.js\";\nimport { registerExecCommand } from \"./commands/exec.js\";\nimport { registerConfigCommand } from \"./commands/config-file.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerProjectCommand } from \"./commands/project.js\";\nimport { registerEmulatorCommand } from \"./commands/emulator.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"));\n\nconst program = new Command();\n\nprogram\n .name(\"stack\")\n .description(\"Stack Auth CLI\")\n .version(pkg.version)\n .option(\"--project-id <id>\", \"Project ID\")\n .option(\"--json\", \"Output in JSON format\");\n\nregisterLoginCommand(program);\nregisterLogoutCommand(program);\nregisterExecCommand(program);\nregisterConfigCommand(program);\nregisterInitCommand(program);\nregisterProjectCommand(program);\nregisterEmulatorCommand(program);\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n if (err instanceof AuthError) {\n console.error(`Auth error: ${err.message}`);\n process.exit(1);\n }\n if (err instanceof CliError) {\n console.error(`Error: ${err.message}`);\n process.exit(1);\n }\n throw err;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-floating-promises\nmain();\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/lib/errors.ts","../src/lib/config.ts","../src/lib/auth.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/lib/app.ts","../src/commands/exec.ts","../src/commands/config-file.ts","../src/lib/interactive.ts","../src/lib/init-prompt.ts","../src/lib/claude-agent.ts","../src/commands/init.ts","../src/commands/project.ts","../src/commands/emulator.ts","../src/index.ts"],"sourcesContent":["export class CliError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\nexport class AuthError extends CliError {\n constructor(message: string) {\n super(message);\n this.name = \"AuthError\";\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst CONFIG_PATH = process.env.STACK_CLI_CONFIG_PATH ?? path.join(os.homedir(), \".config\", \"stack-auth\", \"credentials.json\");\n\ntype ConfigKey = \"STACK_CLI_REFRESH_TOKEN\" | \"STACK_CLI_ANON_REFRESH_TOKEN\" | \"STACK_API_URL\" | \"STACK_DASHBOARD_URL\";\n\nfunction readConfigJson(): Record<string, string> {\n try {\n return JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeConfigJson(data: Record<string, string>): void {\n fs.mkdirSync(path.dirname(CONFIG_PATH), { recursive: true });\n fs.writeFileSync(CONFIG_PATH, JSON.stringify(data, null, 2) + \"\\n\", { mode: 0o600 });\n}\n\nexport function readConfigValue(key: ConfigKey): string | undefined {\n const config = readConfigJson();\n return config[key];\n}\n\nexport function writeConfigValue(key: ConfigKey, value: string): void {\n const config = readConfigJson();\n config[key] = value;\n writeConfigJson(config);\n}\n\nexport function removeConfigValue(key: ConfigKey): void {\n const config = readConfigJson();\n delete config[key];\n writeConfigJson(config);\n}\n","import { readConfigValue } from \"./config.js\";\nimport { AuthError } from \"./errors.js\";\n\nexport const DEFAULT_API_URL = \"https://api.stack-auth.com\";\nexport const DEFAULT_DASHBOARD_URL = \"https://app.stack-auth.com\";\nexport const DEFAULT_PUBLISHABLE_CLIENT_KEY = process.env.STACK_CLI_PUBLISHABLE_CLIENT_KEY ?? \"pck_9bbqvqsbh0gdb6smk11d71qg4ktc4rz8ya7cc69yndm7g\";\n\ntype Flags = {\n projectId?: string,\n};\n\nexport type LoginConfig = {\n apiUrl: string,\n dashboardUrl: string,\n};\n\nexport type SessionAuth = LoginConfig & {\n refreshToken: string,\n};\n\nexport type ProjectAuthWithRefreshToken = SessionAuth & {\n projectId: string,\n};\n\nexport type ProjectAuthWithSecretServerKey = LoginConfig & {\n projectId: string,\n secretServerKey: string,\n};\n\nexport type ProjectAuth = (ProjectAuthWithRefreshToken | ProjectAuthWithSecretServerKey) & {\n projectId: string,\n};\n\nfunction resolveApiUrl(): string {\n return process.env.STACK_API_URL\n ?? readConfigValue(\"STACK_API_URL\")\n ?? DEFAULT_API_URL;\n}\n\nfunction resolveDashboardUrl(): string {\n return process.env.STACK_DASHBOARD_URL\n ?? readConfigValue(\"STACK_DASHBOARD_URL\")\n ?? DEFAULT_DASHBOARD_URL;\n}\n\nfunction resolveRefreshToken(): string {\n const token = process.env.STACK_CLI_REFRESH_TOKEN\n ?? readConfigValue(\"STACK_CLI_REFRESH_TOKEN\");\n if (!token) {\n throw new AuthError(\"Not logged in. Run `stack login` first.\");\n }\n return token;\n}\n\nfunction resolveSecretServerKey(): string | null {\n return process.env.STACK_SECRET_SERVER_KEY ?? null;\n}\n\nfunction resolveProjectId(flags: Flags): string {\n const projectId = flags.projectId ?? process.env.STACK_PROJECT_ID;\n if (!projectId) {\n throw new AuthError(\"No project ID specified. Use --project-id or set STACK_PROJECT_ID.\");\n }\n return projectId;\n}\n\nexport function resolveLoginConfig(flags: Flags): LoginConfig {\n return {\n apiUrl: resolveApiUrl(),\n dashboardUrl: resolveDashboardUrl(),\n };\n}\n\nexport function resolveSessionAuth(flags: Flags): SessionAuth {\n return {\n ...resolveLoginConfig(flags),\n refreshToken: resolveRefreshToken(),\n };\n}\n\nexport function resolveAuth(flags: Flags): ProjectAuth {\n const secretServerKey = resolveSecretServerKey();\n if (secretServerKey) {\n return {\n ...resolveLoginConfig(flags),\n projectId: resolveProjectId(flags),\n secretServerKey,\n };\n }\n\n return {\n ...resolveSessionAuth(flags),\n projectId: resolveProjectId(flags),\n };\n}\n\nexport function isProjectAuthWithSecretServerKey(auth: ProjectAuth): auth is ProjectAuthWithSecretServerKey {\n return \"secretServerKey\" in auth;\n}\n\nexport function isProjectAuthWithRefreshToken(auth: ProjectAuth): auth is ProjectAuthWithRefreshToken {\n return \"refreshToken\" in auth;\n}\n","import { StackClientApp } from \"@stackframe/js\";\nimport { Command } from \"commander\";\nimport { DEFAULT_PUBLISHABLE_CLIENT_KEY, resolveLoginConfig } from \"../lib/auth.js\";\nimport { readConfigValue, removeConfigValue, writeConfigValue } from \"../lib/config.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nexport function registerLoginCommand(program: Command) {\n program\n .command(\"login\")\n .description(\n \"Log in to Stack Auth via browser. To attach this login to an existing anonymous session, set STACK_CLI_ANON_REFRESH_TOKEN (env var) or the same key in the CLI credentials file before running; login does not write that value.\",\n )\n .action(async () => {\n const flags = program.opts();\n const config = resolveLoginConfig(flags);\n\n const app = new StackClientApp({\n projectId: \"internal\",\n publishableClientKey: DEFAULT_PUBLISHABLE_CLIENT_KEY,\n baseUrl: config.apiUrl,\n tokenStore: \"memory\",\n noAutomaticPrefetch: true,\n });\n\n const anonRefreshToken =\n process.env.STACK_CLI_ANON_REFRESH_TOKEN ?? readConfigValue(\"STACK_CLI_ANON_REFRESH_TOKEN\");\n\n console.log(\"Waiting for browser authentication...\");\n\n const result = await app.promptCliLogin({\n appUrl: config.dashboardUrl,\n anonRefreshToken,\n promptLink: (url) => {\n console.log(`\\nPlease visit the following URL to authenticate:\\n${url}`);\n },\n });\n\n if (result.status === \"error\") {\n throw new CliError(`Login failed: ${result.error.message}`);\n }\n\n writeConfigValue(\"STACK_CLI_REFRESH_TOKEN\", result.data);\n if (anonRefreshToken) {\n removeConfigValue(\"STACK_CLI_ANON_REFRESH_TOKEN\");\n }\n console.log(\"Login successful!\");\n });\n}\n","import { Command } from \"commander\";\nimport { removeConfigValue } from \"../lib/config.js\";\n\nexport function registerLogoutCommand(program: Command) {\n program\n .command(\"logout\")\n .description(\"Log out of Stack Auth\")\n .action(() => {\n removeConfigValue(\"STACK_CLI_REFRESH_TOKEN\");\n console.log(\"Logged out successfully.\");\n });\n}\n","import { StackClientApp } from \"@stackframe/js\";\nimport type { CurrentInternalUser, AdminOwnedProject } from \"@stackframe/js\";\nimport { AuthError } from \"./errors.js\";\nimport { DEFAULT_PUBLISHABLE_CLIENT_KEY } from \"./auth.js\";\nimport type { SessionAuth, ProjectAuthWithRefreshToken } from \"./auth.js\";\n\nexport function getInternalApp(auth: SessionAuth): StackClientApp<true, \"internal\"> {\n return new StackClientApp({\n projectId: \"internal\",\n publishableClientKey: DEFAULT_PUBLISHABLE_CLIENT_KEY,\n baseUrl: auth.apiUrl,\n tokenStore: {\n accessToken: \"\",\n refreshToken: auth.refreshToken,\n },\n noAutomaticPrefetch: true,\n });\n}\n\nexport async function getInternalUser(auth: SessionAuth): Promise<CurrentInternalUser> {\n const app = getInternalApp(auth);\n const user = await app.getUser({ or: \"throw\" });\n return user as CurrentInternalUser;\n}\n\nexport async function getAdminProject(auth: ProjectAuthWithRefreshToken): Promise<AdminOwnedProject> {\n const user = await getInternalUser(auth);\n const projects = await user.listOwnedProjects();\n const project = projects.find((p) => p.id === auth.projectId);\n if (!project) {\n throw new AuthError(`Project '${auth.projectId}' not found. Make sure you own this project.`);\n }\n return project;\n}\n","import { Command } from \"commander\";\nimport { isProjectAuthWithRefreshToken, resolveAuth } from \"../lib/auth.js\";\nimport { getAdminProject } from \"../lib/app.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nfunction getErrorMessage(err: unknown): string {\n if (err instanceof Error) {\n return err.message;\n }\n if (typeof err === \"string\") {\n return err;\n }\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\n}\n\nexport function registerExecCommand(program: Command) {\n program\n .command(\"exec [javascript]\")\n .description(\"Execute JavaScript with a pre-configured StackServerApp as `stackServerApp`\")\n .addHelpText(\"after\", \"\\nFor available API methods, see: https://docs.stack-auth.com/docs/sdk\")\n .action(async (javascript: string | undefined) => {\n if (javascript === undefined) {\n throw new CliError(\"Missing JavaScript argument. Use `stack exec \\\"<javascript>\\\"` or `stack exec --help`.\");\n }\n\n const flags = program.opts();\n const auth = resolveAuth(flags);\n if (!isProjectAuthWithRefreshToken(auth)) {\n throw new CliError(\"`stack exec` requires `stack login`. Remove STACK_SECRET_SERVER_KEY and try again.\");\n }\n const project = await getAdminProject(auth);\n\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;\n let fn;\n try {\n fn = new AsyncFunction(\"stackServerApp\", javascript);\n } catch (err: unknown) {\n throw new CliError(`Syntax error in exec code: ${getErrorMessage(err)}`);\n }\n let result;\n try {\n result = await fn(project.app);\n } catch (err: unknown) {\n throw new CliError(`Exec error: ${getErrorMessage(err)}`);\n }\n\n if (result !== undefined) {\n console.log(JSON.stringify(result, null, 2));\n }\n });\n}\n","import { Command } from \"commander\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { isProjectAuthWithRefreshToken, isProjectAuthWithSecretServerKey, resolveAuth, type ProjectAuthWithSecretServerKey } from \"../lib/auth.js\";\nimport { getAdminProject } from \"../lib/app.js\";\nimport { CliError } from \"../lib/errors.js\";\nimport type { EnvironmentConfigOverrideOverride } from \"@stackframe/stack-shared/dist/config/schema\";\nimport { detectImportPackageFromDir, renderConfigFileContent } from \"@stackframe/stack-shared/dist/config-rendering\";\n\nfunction isConfigOverride(value: unknown): value is EnvironmentConfigOverrideOverride {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\ntype BranchConfigSourceApi =\n | { type: \"pushed-from-github\", owner: string, repo: string, branch: string, commit_hash: string, config_file_path: string }\n | { type: \"pushed-from-unknown\" }\n | { type: \"unlinked\" };\n\nfunction parseGitHubRepository(): { owner: string, repo: string } | null {\n const repository = process.env.GITHUB_REPOSITORY;\n if (!repository) {\n return null;\n }\n\n const slashIndex = repository.indexOf(\"/\");\n if (slashIndex <= 0 || slashIndex >= repository.length - 1) {\n return null;\n }\n\n return {\n owner: repository.slice(0, slashIndex),\n repo: repository.slice(slashIndex + 1),\n };\n}\n\nfunction buildConfigPushSource(configFilePath: string): BranchConfigSourceApi {\n const repository = parseGitHubRepository();\n const sha = process.env.GITHUB_SHA;\n const branch = process.env.GITHUB_REF_NAME;\n\n if (repository && sha && branch) {\n return {\n type: \"pushed-from-github\",\n owner: repository.owner,\n repo: repository.repo,\n branch,\n commit_hash: sha,\n config_file_path: configFilePath,\n };\n }\n\n return { type: \"pushed-from-unknown\" };\n}\n\nasync function pushConfigWithSecretServerKey(\n auth: ProjectAuthWithSecretServerKey,\n config: EnvironmentConfigOverrideOverride,\n source: BranchConfigSourceApi,\n) {\n const endpoint = `${auth.apiUrl.replace(/\\/$/, \"\")}/api/v1/internal/config/override/branch`;\n const response = await fetch(endpoint, {\n method: \"PUT\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-stack-project-id\": auth.projectId,\n \"x-stack-access-type\": \"server\",\n \"x-stack-secret-server-key\": auth.secretServerKey,\n },\n body: JSON.stringify({\n config_string: JSON.stringify(config),\n source,\n }),\n });\n\n if (response.ok) {\n return;\n }\n\n const responseText = await response.text();\n const message = responseText.length > 0\n ? responseText\n : `Request failed with status ${response.status}.`;\n throw new CliError(`Failed to push config with STACK_SECRET_SERVER_KEY: ${message}`);\n}\n\nfunction sourceToSdkSource(source: BranchConfigSourceApi):\n { type: \"pushed-from-github\", owner: string, repo: string, branch: string, commitHash: string, configFilePath: string }\n | { type: \"pushed-from-unknown\" }\n | { type: \"unlinked\" } {\n if (source.type === \"pushed-from-github\") {\n return {\n type: \"pushed-from-github\",\n owner: source.owner,\n repo: source.repo,\n branch: source.branch,\n commitHash: source.commit_hash,\n configFilePath: source.config_file_path,\n };\n }\n if (source.type === \"pushed-from-unknown\") {\n return { type: \"pushed-from-unknown\" };\n }\n return { type: \"unlinked\" };\n}\n\nexport function registerConfigCommand(program: Command) {\n const config = program\n .command(\"config\")\n .description(\"Manage project configuration files\");\n\n config\n .command(\"pull\")\n .description(\"Pull branch config to a local file\")\n .requiredOption(\"--config-file <path>\", \"Path to write config file (.ts)\")\n .option(\"--overwrite\", \"Overwrite an existing config file\")\n .action(async (opts) => {\n const flags = program.opts();\n const auth = resolveAuth(flags);\n if (!isProjectAuthWithRefreshToken(auth)) {\n throw new CliError(\"`stack config pull` requires `stack login`. Remove STACK_SECRET_SERVER_KEY and try again.\");\n }\n const project = await getAdminProject(auth);\n\n const configOverride = await project.getConfigOverride(\"branch\");\n const filePath = path.resolve(opts.configFile);\n const ext = path.extname(filePath);\n\n if (ext !== \".ts\") {\n throw new CliError(\"Config file must have a .ts extension. Typed config files require TypeScript.\");\n }\n\n if (fs.existsSync(filePath) && !opts.overwrite) {\n throw new CliError(`Config file already exists at ${filePath}. Stage or back up your changes, then re-run with --overwrite.`);\n }\n\n const importPackage = detectImportPackageFromDir(path.dirname(filePath));\n const content = renderConfigFileContent(configOverride, importPackage);\n\n fs.writeFileSync(filePath, content);\n console.log(`Config written to ${filePath}`);\n });\n\n config\n .command(\"push\")\n .description(\"Push a local config file to branch config\")\n .requiredOption(\"--config-file <path>\", \"Path to config file (.js or .ts)\")\n .action(async (opts) => {\n const flags = program.opts();\n const auth = resolveAuth(flags);\n\n const filePath = path.resolve(opts.configFile);\n const ext = path.extname(filePath);\n\n if (ext !== \".js\" && ext !== \".ts\") {\n throw new CliError(\"Config file must have a .js or .ts extension.\");\n }\n\n if (!fs.existsSync(filePath)) {\n throw new CliError(`Config file not found: ${filePath}`);\n }\n\n const { createJiti } = await import(\"jiti\");\n const jiti = createJiti(import.meta.url);\n const configModule: { config?: unknown } = await jiti.import(filePath);\n\n const config = configModule.config;\n if (!isConfigOverride(config)) {\n const examplePkg = detectImportPackageFromDir(path.dirname(filePath)) ?? \"@stackframe/js\";\n throw new CliError(`Config file must export a plain \\`config\\` object. Example: import type { StackConfig } from \"${examplePkg}\"; export const config: StackConfig = { ... };`);\n }\n\n const source = buildConfigPushSource(opts.configFile);\n\n if (isProjectAuthWithSecretServerKey(auth)) {\n await pushConfigWithSecretServerKey(auth, config, source);\n } else {\n if (!isProjectAuthWithRefreshToken(auth)) {\n throw new CliError(\"`stack config push` requires either STACK_SECRET_SERVER_KEY or `stack login`.\");\n }\n const project = await getAdminProject(auth);\n await project.pushConfig(config, {\n source: sourceToSdkSource(source),\n });\n }\n\n console.log(\"Config pushed successfully.\");\n });\n}\n","export function isNonInteractiveEnv(): boolean {\n return !!(\n process.env.CI\n || process.env.GITHUB_ACTIONS\n || process.env.NONINTERACTIVE\n || !process.stdin.isTTY\n );\n}\n","// TODO: Use configPath in the prompt once local emulator is set up:\n// Add \"npx @stackframe/stack-cli emulator run --config-file ${configPath}\" to project dev command\nexport const createInitPrompt = (web: boolean, configPath?: string) => `=============================\nSTACK AUTH SETUP INSTRUCTIONS\n=============================\n\nThese instructions describe how to set up Stack Auth.\n${web ? `\nFirst of all, if you have access to a terminal, it is better to use the \\`npx @stackframe/stack-cli init\\`` : \"\"}\n\nInstall mcp server from https://mcp.stack-auth.com if not already installed\n\nFor reference, questions, or information on Stack Auth, you can query the docs on https://docs.stack-auth.com via curl or any tools that you have\n\n## Setup\n\n### 1) Install the package\n\nRun the install command using whatever package manager the project uses (npm, yarn, pnpm, bun):\n\n| Framework | Package |\n|-----------|---------|\n| Next.js | \\`@stackframe/stack\\` |\n| React | \\`@stackframe/react\\` |\n| Vanilla JS | \\`@stackframe/js\\` |\n\n### 2) Create the Stack apps\n\nDepending on whether you're on a client or a server, you will want to create stackClientApp or stackServerApp. Some environments, like Next.js, have both, so create both files.\n\nThe stack client app has client-level permissions. It contains most of the useful methods and hooks for your client-side code.\nThe stack server app has full read and write access to all users. It requires STACK_SECRET_SERVER_KEY env variable and should only be used in secure context\n\nIn Next.js, env vars are auto-detected (NEXT_PUBLIC_STACK_PROJECT_ID etc.), so the constructor needs no explicit config. For other frameworks, you must pass projectId explicitly using the framework's env var access method. Pass publishableClientKey only if your project is configured to require publishable client keys.\n\nThe tokenStore should be \"nextjs-cookie\" for Next.js, or \"cookie\" for all other frameworks.\n\nMake sure to set redirectMethod on non next.js frameworks. For example for tanstack router import like so:\nimport { useNavigate } from '@tanstack/react-router'\n\n\\`\\`\\`ts\n// src/stack/client.ts\nimport { StackClientApp } from \"@stackframe/stack\"; // or \"@stackframe/react\" or \"@stackframe/js\"\n\nexport const stackClientApp = new StackClientApp({\n // Next.js: omit projectId/publishableClientKey (auto-detected from NEXT_PUBLIC_ env vars)\n // Other frameworks: pass projectId explicitly, and publishableClientKey only if required by your project. For Vite:\n // projectId: import.meta.env.VITE_STACK_PROJECT_ID,\n // publishableClientKey: import.meta.env.VITE_STACK_PUBLISHABLE_CLIENT_KEY,\n tokenStore: \"nextjs-cookie\", // or \"cookie\" for non-Next.js,\n // redirectMethod: { useNavigate } // or \"window\"\n});\n\\`\\`\\`\n\nIf the framework has server-side support (e.g. Next.js), also create a server app:\n\n\\`\\`\\`ts\n// src/stack/server.ts\nimport \"server-only\";\nimport { StackServerApp } from \"@stackframe/stack\";\nimport { stackClientApp } from \"./client\";\n\nexport const stackServerApp = new StackServerApp({\n inheritsFrom: stackClientApp,\n});\n\\`\\`\\`\n\n### 3) Create the Stack handler (if available in framework)\n\nThis sets up pages for sign in, sign up, password reset, etc.\n\n\\`\\`\\`tsx\nimport { StackHandler } from \"@stackframe/stack\"; // Next.js\n// import { StackHandler } from \"@stackframe/react\"; // React\n\nexport default function Handler() {\n return <StackHandler fullPage />;\n}\n\\`\\`\\`\n\n### 4) Create a Suspense boundary\n\nSuspense is necessary for many stack auth hooks such as useUser to function. Add a loading component with a custom loading indicator for the current project. Don't add if one already exists\n\nFor example:\n\\`\\`\\`tsx\n//src/loading.tsx\n\nexport default function Loading() {\n return <p>Loading...</p>\n}\n\\`\\`\\`\n\n### 5) Link environment variables\n\nThis is only necessary if not using local emulator. Ensure these are ignored by git.\n\nRename the env var keys in .env to match the framework's convention for client-exposed variables. For example, Vite requires VITE_ prefix, Next.js uses NEXT_PUBLIC_, etc. The values should stay the same — only rename the keys.\n\nThe required variables are:\n- Project ID (e.g. NEXT_PUBLIC_STACK_PROJECT_ID, VITE_STACK_PROJECT_ID, etc.)\n- Secret server key: STACK_SECRET_SERVER_KEY (only for frameworks with server-side support, no prefix needed)\n\nThe publishable client key (e.g. NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY, VITE_STACK_PUBLISHABLE_CLIENT_KEY, etc.) is only required if your project has publishable client keys enabled as a requirement.\n\n### 6) React only: Wrap the entire page in a Stack provider\n\nThis is used for the useUser and useStackApp hooks.\n\n\\`\\`\\`tsx\nimport { StackProvider, StackTheme } from \"@stackframe/stack\";\nimport { stackClientApp } from \"../stack/client\"; // adjust relative path\n\\`\\`\\`\n\nThen wrap the body content: \n\n\\`\\`\\`tsx\nreturn (\n <body>\n <StackProvider app={stackClientApp}>\n <StackTheme>{children}</StackTheme>\n </StackProvider>\n </body>\n);\n\\`\\`\\`\n`;\n","import { query } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst DEFAULT_PROXY_URL = \"https://api.stack-auth.com/api/v1/integrations/ai-proxy\";\nconst ANTHROPIC_PROXY_BASE_URL: string = process.env.STACK_CLAUDE_PROXY_URL ?? DEFAULT_PROXY_URL;\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nclass AgentProgressUI {\n private mainLabel: string;\n private spinnerFrame = 0;\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n private activeSpinners = new Map<string, string>(); // id -> label\n private flushedCount = 0; // number of completed items already printed above the spinner area\n private pendingCompleted: string[] = []; // completed items not yet flushed\n private lastLineCount = 0;\n\n constructor(mainLabel: string) {\n this.mainLabel = mainLabel;\n }\n\n start() {\n this.spinnerTimer = setInterval(() => {\n this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER_FRAMES.length;\n this.render();\n }, 80);\n this.render();\n }\n\n stop(success: boolean) {\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n this.completeAllActive();\n this.clearLines();\n const icon = success ? \"\\x1b[32m✔\\x1b[0m\" : \"\\x1b[31m✖\\x1b[0m\";\n // Re-print header + all completed items as final output\n console.log(`${icon} ${this.mainLabel}`);\n for (const label of this.pendingCompleted) {\n console.log(` \\x1b[32m✔\\x1b[0m ${label}`);\n }\n this.pendingCompleted = [];\n }\n\n setSpinner(id: string, label: string) {\n this.activeSpinners.set(id, label);\n }\n\n complete(id: string, label?: string) {\n const existing = this.activeSpinners.get(id);\n this.activeSpinners.delete(id);\n const finalLabel = label ?? existing;\n if (finalLabel) {\n this.pendingCompleted.push(finalLabel);\n }\n }\n\n completeAllActive() {\n for (const label of this.activeSpinners.values()) {\n this.pendingCompleted.push(label);\n }\n this.activeSpinners.clear();\n }\n\n private clearLines() {\n if (this.lastLineCount > 0) {\n process.stdout.write(`\\x1b[${this.lastLineCount}A\\x1b[J`);\n }\n }\n\n private flushCompleted() {\n if (this.pendingCompleted.length === 0) {\n return;\n }\n // Clear the spinner area, print completed items permanently, then re-render spinner below\n this.clearLines();\n // Re-print the header line if this is the first flush\n if (this.flushedCount === 0) {\n const frame = SPINNER_FRAMES[this.spinnerFrame];\n process.stdout.write(`\\x1b[36m${frame}\\x1b[0m ${this.mainLabel}\\n`);\n }\n for (const label of this.pendingCompleted) {\n process.stdout.write(` \\x1b[32m✔\\x1b[0m ${label}\\n`);\n }\n this.flushedCount += this.pendingCompleted.length;\n this.pendingCompleted = [];\n this.lastLineCount = 0; // reset since we printed permanent lines\n }\n\n private render() {\n this.flushCompleted();\n this.clearLines();\n\n const frame = SPINNER_FRAMES[this.spinnerFrame];\n const lines: string[] = [];\n\n // Only show header in spinner area if nothing has been flushed yet\n if (this.flushedCount === 0) {\n lines.push(`\\x1b[36m${frame}\\x1b[0m ${this.mainLabel}`);\n }\n\n for (const label of this.activeSpinners.values()) {\n lines.push(` \\x1b[36m${frame}\\x1b[0m ${label}`);\n }\n\n if (lines.length > 0) {\n const output = lines.join(\"\\n\") + \"\\n\";\n process.stdout.write(output);\n }\n this.lastLineCount = lines.length;\n }\n}\n\nfunction getToolLabel(toolName: string, input: Record<string, unknown>): string {\n switch (toolName) {\n case \"Read\": {\n return `Reading ${input.file_path ?? \"file\"}`;\n }\n case \"Write\": {\n return `Writing ${input.file_path ?? \"file\"}`;\n }\n case \"Edit\": {\n return `Editing ${input.file_path ?? \"file\"}`;\n }\n case \"Bash\": {\n return `Running \\`${truncate(String(input.command ?? \"\"), 40)}\\``;\n }\n case \"Glob\": {\n return `Searching for ${input.pattern ?? \"files\"}`;\n }\n case \"Grep\": {\n return `Searching for \"${truncate(String(input.pattern ?? \"\"), 30)}\"`;\n }\n default: {\n return toolName;\n }\n }\n}\n\nfunction truncate(str: string, maxLen: number): string {\n return str.length > maxLen ? str.slice(0, maxLen - 1) + \"…\" : str;\n}\n\nfunction stripClaudeCodeEnv(): Record<string, string> {\n const env = { ...process.env };\n delete env.CLAUDECODE;\n return env as Record<string, string>;\n}\n\nexport async function runClaudeAgent(options: {\n prompt: string,\n cwd: string,\n}): Promise<boolean> {\n const ui = new AgentProgressUI(\"Setting up Stack Auth...\");\n ui.start();\n\n try {\n let resultText = \"\";\n\n for await (const message of query({\n prompt: options.prompt,\n options: {\n allowedTools: [\"Read\", \"Write\", \"Edit\", \"Bash\", \"Glob\", \"Grep\"],\n permissionMode: \"dontAsk\",\n cwd: options.cwd,\n // stripClaudeCodeEnv removes CLAUDECODE env var to prevent nested agent detection. Anthropic api key cannot be empty otherwise users without claude code installed get a login error\n env: { ...stripClaudeCodeEnv(), ANTHROPIC_BASE_URL: ANTHROPIC_PROXY_BASE_URL, ANTHROPIC_API_KEY: \"stack-auth-proxy\" },\n stderr: (data: string) => { process.stderr.write(data); },\n },\n })) {\n if (\"result\" in message) {\n resultText = message.result;\n } else if (message.type === \"assistant\" && message.parent_tool_use_id === null) {\n // New parent assistant turn — previous tools are done\n ui.completeAllActive();\n // Register new tool calls from this turn\n for (const block of message.message.content) {\n if (block.type === \"tool_use\") {\n ui.setSpinner(block.id, getToolLabel(block.name, block.input as Record<string, unknown>));\n }\n }\n } else if (message.type === \"system\") {\n // Subagent task lifecycle\n const msg = message as Record<string, unknown>;\n const taskId = msg.task_id as string | undefined;\n\n if (msg.subtype === \"task_started\" && taskId) {\n ui.setSpinner(taskId, String(msg.description ?? \"Working...\"));\n } else if (msg.subtype === \"task_progress\" && taskId) {\n ui.setSpinner(taskId, String(msg.description ?? \"Working...\"));\n } else if (msg.subtype === \"task_notification\" && taskId) {\n ui.complete(taskId, String(msg.summary ?? msg.description ?? \"Done\"));\n }\n }\n }\n\n ui.stop(true);\n if (resultText) {\n console.log(`\\n${resultText}`);\n }\n return true;\n } catch (error) {\n ui.stop(false);\n console.error(\"\\nClaude agent encountered an error:\", error instanceof Error ? error.message : error);\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport { select, input, checkbox, confirm } from \"@inquirer/prompts\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StackClientApp } from \"@stackframe/js\";\nimport { ALL_APPS } from \"@stackframe/stack-shared/dist/apps/apps-config\";\nimport { resolveLoginConfig, resolveSessionAuth, DEFAULT_PUBLISHABLE_CLIENT_KEY } from \"../lib/auth.js\";\nimport { getInternalUser } from \"../lib/app.js\";\nimport { writeConfigValue } from \"../lib/config.js\";\nimport { CliError, AuthError } from \"../lib/errors.js\";\nimport { isNonInteractiveEnv } from \"../lib/interactive.js\";\nimport { createInitPrompt } from \"../lib/init-prompt.js\";\nimport { runClaudeAgent } from \"../lib/claude-agent.js\";\nimport { detectImportPackageFromDir, renderConfigFileContent } from \"@stackframe/stack-shared/dist/config-rendering\";\n\ntype InitOptions = {\n mode?: \"create\" | \"link-config\" | \"link-cloud\",\n apps?: string,\n configFile?: string,\n selectProjectId?: string,\n outputDir?: string,\n agent?: boolean,\n};\n\nexport function registerInitCommand(program: Command) {\n program\n .command(\"init\")\n .description(\"Initialize Stack Auth in your project\")\n .option(\"--mode <mode>\", \"Mode: create, link-config, or link-cloud (skips interactive prompts)\")\n .option(\"--apps <apps>\", \"Comma-separated app IDs to enable (for create mode)\")\n .option(\"--config-file <path>\", \"Path to existing config file (for link-config mode)\")\n .option(\"--select-project-id <id>\", \"Project ID to link (for link-cloud mode)\")\n .option(\"--output-dir <dir>\", \"Directory to write output files (defaults to cwd)\")\n .option(\"--no-agent\", \"Skip Claude agent and print setup instructions instead\")\n .action(async (opts: InitOptions) => {\n const hasFlags = opts.mode != null;\n\n if (!hasFlags && isNonInteractiveEnv()) {\n throw new CliError(\"stack init requires an interactive terminal. Use --mode flag for non-interactive usage.\");\n }\n\n try {\n await runInit(program, opts);\n } catch (error: unknown) {\n if (error != null && typeof error === \"object\" && \"name\" in error && error.name === \"ExitPromptError\") {\n console.log(\"\\nAborted.\");\n process.exit(0);\n }\n throw error;\n }\n });\n}\n\nasync function runInit(program: Command, opts: InitOptions) {\n const flags = program.opts();\n const outputDir = opts.outputDir ? path.resolve(opts.outputDir) : process.cwd();\n\n console.log(\"Welcome to Stack Auth!\\n\");\n\n const mode: string = \"link\";\n // TODO: re-enable local emulator option\n // const mode: string = opts.mode ?? await select({\n // message: \"Would you like to link to an existing project, or create a new one?\",\n // choices: [\n // { name: \"Create a new project (local emulator)\", value: \"create\" as const },\n // { name: \"Link an existing project\", value: \"link\" as const },\n // ],\n // });\n\n let configPath: string | undefined;\n\n if (mode === \"link\" || mode === \"link-config\" || mode === \"link-cloud\") {\n const result = await handleLink(flags, opts, outputDir);\n configPath = result.configPath;\n } else if (mode === \"create\") {\n const result = await handleCreate(opts, outputDir);\n configPath = result.configPath;\n } else {\n throw new CliError(`Unknown mode: ${mode}`);\n }\n\n const initPrompt = createInitPrompt(false, configPath);\n const useAgent = opts.agent !== false && !isNonInteractiveEnv();\n\n if (useAgent) {\n const success = await runClaudeAgent({\n prompt: `Execute ALL of the following setup steps in my project now. Do not ask questions — just detect the framework and package manager from existing files and proceed.\\n\\n${initPrompt}`,\n cwd: outputDir,\n });\n if (!success) {\n console.log(\"\\nFalling back to manual instructions:\\n\");\n console.log(initPrompt);\n }\n } else {\n console.log(\"\\n\" + initPrompt);\n }\n}\n\nasync function handleLink(flags: Record<string, unknown>, opts: InitOptions, outputDir: string): Promise<{ configPath?: string }> {\n let source: \"config-file\" | \"cloud\";\n\n if (opts.mode === \"link-config\") {\n source = \"config-file\";\n } else if (opts.mode === \"link-cloud\") {\n source = \"cloud\";\n } else {\n source = \"cloud\";\n // TODO: re-enable config file linking option\n // source = await select({\n // message: \"How would you like to link your project?\",\n // choices: [\n // { name: \"Link from config file\", value: \"config-file\" as const },\n // { name: \"Link from app.stack-auth.com\", value: \"cloud\" as const },\n // ],\n // });\n }\n\n if (source === \"config-file\") {\n return await handleLinkFromConfigFile(opts);\n }\n return await handleLinkFromCloud(flags, opts, outputDir);\n}\n\nasync function handleLinkFromConfigFile(opts: InitOptions): Promise<{ configPath: string }> {\n const filePath = opts.configFile ?? await input({\n message: \"Path to your existing stack.config.ts:\",\n validate: (value) => {\n const resolved = path.resolve(value);\n if (!fs.existsSync(resolved)) {\n return `File not found: ${resolved}`;\n }\n return true;\n },\n });\n\n const configPath = path.resolve(filePath);\n if (!fs.existsSync(configPath)) {\n throw new CliError(`File not found: ${configPath}`);\n }\n\n console.log(`\\nLinked to config file: ${configPath}`);\n return { configPath };\n}\n\nasync function handleLinkFromCloud(flags: Record<string, unknown>, opts: InitOptions, outputDir: string): Promise<{ configPath?: string }> {\n let sessionAuth;\n try {\n sessionAuth = resolveSessionAuth(flags as { projectId?: string });\n } catch (e) {\n if (e instanceof AuthError) {\n if (isNonInteractiveEnv()) {\n throw new CliError(\"Not logged in. Run `stack login` first or set STACK_CLI_REFRESH_TOKEN.\");\n }\n console.log(\"You need to log in first.\\n\");\n await performLogin(flags);\n sessionAuth = resolveSessionAuth(flags as { projectId?: string });\n } else {\n throw e;\n }\n }\n\n const user = await getInternalUser(sessionAuth);\n const projects = await user.listOwnedProjects();\n\n if (projects.length === 0) {\n throw new CliError(\"You don't own any projects. Create one at app.stack-auth.com first.\");\n }\n\n let projectId: string;\n if (opts.selectProjectId) {\n const found = projects.find((p) => p.id === opts.selectProjectId);\n if (!found) {\n throw new CliError(`Project '${opts.selectProjectId}' not found among your owned projects.`);\n }\n projectId = opts.selectProjectId;\n } else {\n projectId = await select({\n message: \"Select a project:\",\n choices: projects.map((p) => ({\n name: `${p.displayName} (${p.id})`,\n value: p.id,\n })),\n });\n }\n\n const project = projects.find((p) => p.id === projectId)!;\n const apiKey = await project.app.createInternalApiKey({\n description: \"Created by CLI init script\",\n expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365 * 200), // 200 years\n hasPublishableClientKey: true,\n hasSecretServerKey: true,\n hasSuperSecretAdminKey: false,\n });\n\n const envLines = [\n \"# Stack Auth\",\n `NEXT_PUBLIC_STACK_PROJECT_ID=${projectId}`,\n `NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY=${apiKey.publishableClientKey ?? \"\"}`,\n `STACK_SECRET_SERVER_KEY=${apiKey.secretServerKey ?? \"\"}`,\n ].join(\"\\n\");\n\n const envPath = path.resolve(outputDir, \".env\");\n\n if (fs.existsSync(envPath)) {\n const existing = fs.readFileSync(envPath, \"utf-8\");\n const separator = existing.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n\n if (isNonInteractiveEnv()) {\n fs.appendFileSync(envPath, separator + envLines + \"\\n\");\n console.log(\"\\nAppended Stack Auth keys to .env\");\n } else {\n const shouldAppend = await confirm({\n message: `.env file already exists. Append Stack Auth keys?`,\n default: true,\n });\n\n if (shouldAppend) {\n fs.appendFileSync(envPath, separator + envLines + \"\\n\");\n console.log(\"\\nAppended Stack Auth keys to .env\");\n } else {\n console.log(\"\\nHere are your environment variables:\\n\");\n console.log(envLines);\n }\n }\n } else {\n fs.writeFileSync(envPath, envLines + \"\\n\");\n console.log(\"\\nCreated .env with Stack Auth keys\");\n }\n\n return {};\n}\n\nasync function performLogin(flags: Record<string, unknown>) {\n const config = resolveLoginConfig(flags as { projectId?: string });\n\n const app = new StackClientApp({\n projectId: \"internal\",\n publishableClientKey: DEFAULT_PUBLISHABLE_CLIENT_KEY,\n baseUrl: config.apiUrl,\n tokenStore: \"memory\",\n noAutomaticPrefetch: true,\n });\n\n console.log(\"Waiting for browser authentication...\");\n\n const result = await app.promptCliLogin({\n appUrl: config.dashboardUrl,\n });\n\n if (result.status === \"error\") {\n throw new CliError(`Login failed: ${result.error.message}`);\n }\n\n writeConfigValue(\"STACK_CLI_REFRESH_TOKEN\", result.data);\n console.log(\"Login successful!\\n\");\n}\n\nasync function handleCreate(opts: InitOptions, outputDir: string): Promise<{ configPath: string }> {\n const configPath = path.resolve(outputDir, \"stack.config.ts\");\n\n console.log(`\\nCreating a new config file at ${configPath}!\\n`);\n\n let selectedApps: string[];\n\n if (opts.apps) {\n selectedApps = opts.apps.split(\",\").map((s) => s.trim()).filter(Boolean);\n const validAppIds = Object.keys(ALL_APPS);\n const invalidApps = selectedApps.filter((id) => !validAppIds.includes(id));\n if (invalidApps.length > 0) {\n throw new CliError(`Unknown app IDs: ${invalidApps.join(\", \")}. Valid IDs: ${validAppIds.join(\", \")}`);\n }\n } else {\n const stageOrder = { stable: 0, beta: 1 } as const;\n const appEntries = Object.entries(ALL_APPS)\n .filter(([, app]) => app.stage !== \"alpha\")\n .sort((a, b) => stageOrder[a[1].stage as keyof typeof stageOrder] - stageOrder[b[1].stage as keyof typeof stageOrder]);\n\n selectedApps = await checkbox({\n message: \"Select apps to enable:\",\n choices: appEntries.map(([id, app]) => ({\n name: `${app.displayName} - ${app.subtitle}${app.stage !== \"stable\" ? ` (${app.stage})` : \"\"}`,\n value: id,\n checked: id === \"authentication\",\n })),\n });\n }\n\n const installed = Object.fromEntries(\n selectedApps.map((appId) => [appId, { enabled: true }])\n );\n\n const config = {\n apps: {\n installed,\n },\n };\n\n const importPackage = detectImportPackageFromDir(path.dirname(configPath));\n const content = renderConfigFileContent(config, importPackage);\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n fs.writeFileSync(configPath, content);\n\n console.log(`\\nConfig file written to ${configPath}`);\n return { configPath };\n}\n","import { Command } from \"commander\";\nimport * as readline from \"readline\";\nimport { resolveSessionAuth } from \"../lib/auth.js\";\nimport { getInternalUser } from \"../lib/app.js\";\nimport { isNonInteractiveEnv } from \"../lib/interactive.js\";\nimport { CliError } from \"../lib/errors.js\";\n\nfunction prompt(question: string): Promise<string> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\nexport function registerProjectCommand(program: Command) {\n const project = program\n .command(\"project\")\n .description(\"Manage projects\");\n\n project\n .command(\"list\")\n .description(\"List your owned projects\")\n .action(async () => {\n const flags = program.opts();\n const auth = resolveSessionAuth(flags);\n const user = await getInternalUser(auth);\n const projects = await user.listOwnedProjects();\n\n if (program.opts().json) {\n console.log(JSON.stringify(projects.map((p) => ({ id: p.id, displayName: p.displayName })), null, 2));\n } else {\n if (projects.length === 0) {\n console.log(\"No projects found.\");\n return;\n }\n for (const p of projects) {\n console.log(`${p.id}\\t${p.displayName}`);\n }\n }\n });\n\n project\n .command(\"create\")\n .description(\"Create a new project\")\n .option(\"--display-name <name>\", \"Project display name\")\n .action(async (opts) => {\n const flags = program.opts();\n const auth = resolveSessionAuth(flags);\n const user = await getInternalUser(auth);\n\n let displayName: string = opts.displayName;\n if (!displayName) {\n if (isNonInteractiveEnv()) {\n throw new CliError(\"--display-name is required in non-interactive environments (CI).\");\n }\n displayName = await prompt(\"Project display name: \");\n if (!displayName.trim()) {\n throw new CliError(\"Display name cannot be empty.\");\n }\n }\n\n const teams = await user.listTeams();\n if (teams.length === 0) {\n throw new CliError(\"No teams found. You need a team to create a project.\");\n }\n\n const newProject = await user.createProject({\n displayName,\n teamId: teams[0].id,\n });\n\n if (program.opts().json) {\n console.log(JSON.stringify({ id: newProject.id, displayName: newProject.displayName }, null, 2));\n } else {\n console.log(`Project created: ${newProject.id} (${newProject.displayName})`);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { execFileSync, spawn } from \"child_process\";\nimport { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { CliError } from \"../lib/errors.js\";\n\nconst DEFAULT_EMULATOR_BACKEND_PORT = 26701;\n\nfunction emulatorBackendPort(): number {\n const raw = process.env.EMULATOR_BACKEND_PORT;\n if (!raw) return DEFAULT_EMULATOR_BACKEND_PORT;\n const parsed = Number(raw);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new CliError(`Invalid EMULATOR_BACKEND_PORT: ${raw}`);\n }\n return parsed;\n}\n\nfunction emulatorHome(): string {\n return process.env.STACK_EMULATOR_HOME ?? join(homedir(), \".stack\", \"emulator\");\n}\n\nfunction emulatorRunDir(): string {\n return join(emulatorHome(), \"run\");\n}\n\nfunction emulatorImageDir(): string {\n return join(emulatorHome(), \"images\");\n}\n\nfunction internalPckPath(): string {\n return join(emulatorRunDir(), \"vm\", \"internal-pck\");\n}\n\nasync function readInternalPck(timeoutMs = 60_000): Promise<string> {\n const path = internalPckPath();\n const deadline = Date.now() + timeoutMs;\n let delay = 250;\n while (Date.now() < deadline) {\n if (existsSync(path)) {\n const contents = readFileSync(path, \"utf-8\").trim();\n if (contents) return contents;\n }\n await new Promise((r) => setTimeout(r, delay));\n delay = Math.min(delay * 2, 2000);\n }\n throw new CliError(`Timed out waiting for emulator internal publishable client key at ${path}`);\n}\n\ntype EmulatorCredentials = {\n project_id: string,\n publishable_client_key: string,\n secret_server_key: string,\n};\n\nasync function fetchEmulatorCredentials(pck: string, backendPort: number, configFile: string): Promise<EmulatorCredentials> {\n const url = `http://127.0.0.1:${backendPort}/api/v1/internal/local-emulator/project`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Stack-Project-Id\": \"internal\",\n \"X-Stack-Access-Type\": \"client\",\n \"X-Stack-Publishable-Client-Key\": pck,\n },\n body: JSON.stringify({ absolute_file_path: configFile }),\n });\n if (!res.ok) {\n throw new CliError(`Failed to initialize local emulator project (${res.status}): ${await res.text()}`);\n }\n const data = await res.json() as {\n project_id: string,\n publishable_client_key: string,\n secret_server_key: string,\n };\n return {\n project_id: data.project_id,\n publishable_client_key: data.publishable_client_key,\n secret_server_key: data.secret_server_key,\n };\n}\n\nfunction gh(args: string[]): string {\n try {\n return execFileSync(\"gh\", args, { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n } catch (err: unknown) {\n if (err instanceof Error && \"stderr\" in err && typeof err.stderr === \"string\") {\n throw new CliError(`GitHub CLI error: ${err.stderr}`);\n }\n throw new CliError(\"GitHub CLI (gh) is required. Install: https://cli.github.com/\");\n }\n}\n\nfunction emulatorScriptsDir(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n const bundled = join(here, \"emulator\");\n if (existsSync(join(bundled, \"run-emulator.sh\"))) return bundled;\n const repo = resolve(here, \"../../../docker/local-emulator/qemu\");\n if (existsSync(join(repo, \"run-emulator.sh\"))) return repo;\n throw new CliError(\"Emulator scripts not found in CLI bundle.\");\n}\n\nfunction emulatorSpawnEnv(extra?: Record<string, string>): NodeJS.ProcessEnv {\n return {\n ...process.env,\n EMULATOR_RUN_DIR: emulatorRunDir(),\n EMULATOR_IMAGE_DIR: emulatorImageDir(),\n ...extra,\n };\n}\n\nfunction runEmulator(action: string, env?: Record<string, string>): Promise<void> {\n const scriptsDir = emulatorScriptsDir();\n mkdirSync(emulatorRunDir(), { recursive: true });\n mkdirSync(emulatorImageDir(), { recursive: true });\n return new Promise((resolvePromise, reject) => {\n const child = spawn(join(scriptsDir, \"run-emulator.sh\"), [action], {\n stdio: \"inherit\",\n env: emulatorSpawnEnv(env),\n cwd: scriptsDir,\n });\n child.on(\"close\", (code) => code === 0 ? resolvePromise() : reject(new CliError(`run-emulator.sh ${action} exited with code ${code}`)));\n child.on(\"error\", (err) => reject(new CliError(`Failed to run run-emulator.sh: ${err.message}`)));\n });\n}\n\nfunction isEmulatorRunning(): boolean {\n const scriptsDir = emulatorScriptsDir();\n try {\n execFileSync(join(scriptsDir, \"run-emulator.sh\"), [\"status\"], {\n stdio: \"pipe\",\n cwd: scriptsDir,\n env: emulatorSpawnEnv(),\n });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function startEmulator(arch: \"arm64\" | \"amd64\"): Promise<void> {\n mkdirSync(emulatorImageDir(), { recursive: true });\n const img = join(emulatorImageDir(), `stack-emulator-${arch}.qcow2`);\n if (!existsSync(img)) {\n console.log(\"No emulator image found. Pulling latest...\");\n pullRelease(arch);\n }\n await runEmulator(\"start\", { EMULATOR_ARCH: arch });\n}\n\nfunction resolveArch(raw?: string): \"arm64\" | \"amd64\" {\n const arch = raw ?? (process.arch === \"arm64\" ? \"arm64\" : process.arch === \"x64\" ? \"amd64\" : null);\n if (arch === \"arm64\" || arch === \"amd64\") return arch;\n throw new CliError(`Invalid architecture: ${raw ?? process.arch}. Expected arm64 or amd64.`);\n}\n\nfunction pullRelease(arch: \"arm64\" | \"amd64\", opts: { repo?: string; branch?: string; tag?: string } = {}) {\n const repo = opts.repo ?? \"stack-auth/stack-auth\";\n const branch = opts.branch ?? \"dev\";\n const tag = opts.tag ?? `emulator-${branch}-latest`;\n const asset = `stack-emulator-${arch}.qcow2`;\n const imageDir = emulatorImageDir();\n mkdirSync(imageDir, { recursive: true });\n const dest = join(imageDir, asset);\n const tmpDest = `${dest}.download`;\n\n console.log(`Pulling ${asset} from release ${tag}...`);\n try {\n execFileSync(\"gh\", [\"release\", \"download\", tag, \"--repo\", repo, \"--pattern\", asset, \"--output\", tmpDest, \"--clobber\"], { stdio: \"inherit\" });\n } catch (err) {\n if (existsSync(tmpDest)) unlinkSync(tmpDest);\n throw new CliError(`Failed to download ${asset} from release ${tag}: ${err instanceof Error ? err.message : err}\\nRun 'stack emulator list-releases' to see available releases.`);\n }\n renameSync(tmpDest, dest);\n console.log(`Downloaded: ${dest}`);\n}\n\nexport function registerEmulatorCommand(program: Command) {\n const emulator = program.command(\"emulator\").description(\"Manage the QEMU local emulator\");\n\n emulator\n .command(\"pull\")\n .description(\"Download an emulator image from GitHub Releases or a PR build\")\n .option(\"--arch <arch>\", \"Target architecture (default: current system arch)\")\n .option(\"--branch <branch>\", \"Release branch (default: dev)\")\n .option(\"--tag <tag>\", \"Specific release tag (default: latest)\")\n .option(\"--repo <repo>\", \"GitHub repository (default: stack-auth/stack-auth)\")\n .option(\"--pr <number>\", \"Pull from a PR's CI artifacts\")\n .option(\"--run <id>\", \"Pull from a specific workflow run's artifacts\")\n .action(async (opts) => {\n const arch = resolveArch(opts.arch);\n const repo = opts.repo ?? \"stack-auth/stack-auth\";\n\n if (opts.run || opts.pr) {\n let runId = opts.run as string | undefined;\n if (!runId) {\n console.log(`Finding latest successful build for PR #${opts.pr}...`);\n const { headRefName } = JSON.parse(gh([\"pr\", \"view\", opts.pr, \"--repo\", repo, \"--json\", \"headRefName\"]));\n const runs = JSON.parse(gh([\"run\", \"list\", \"--repo\", repo, \"--workflow\", \"qemu-emulator-build.yaml\", \"--branch\", headRefName, \"--status\", \"success\", \"--limit\", \"1\", \"--json\", \"databaseId\"]));\n if (runs.length === 0) throw new CliError(`No successful build found for PR #${opts.pr} (branch: ${headRefName}).`);\n runId = String(runs[0].databaseId);\n }\n\n const imageDir = emulatorImageDir();\n mkdirSync(imageDir, { recursive: true });\n const dest = join(imageDir, `stack-emulator-${arch}.qcow2`);\n if (existsSync(dest)) unlinkSync(dest);\n console.log(`Downloading qemu-emulator-${arch} from workflow run ${runId}...`);\n try {\n execFileSync(\"gh\", [\"run\", \"download\", runId, \"--repo\", repo, \"--name\", `qemu-emulator-${arch}`, \"--dir\", imageDir], { stdio: \"inherit\" });\n } catch (err) {\n throw new CliError(`Failed to download artifact from run ${runId}: ${err instanceof Error ? err.message : err}`);\n }\n if (!existsSync(dest)) throw new CliError(`Expected image not found at ${dest} after download.`);\n console.log(`Downloaded: ${dest}`);\n } else {\n pullRelease(arch, { repo, branch: opts.branch, tag: opts.tag });\n }\n });\n\n emulator\n .command(\"start\")\n .description(\"Start the emulator in the background (auto-pulls the latest image if none exists)\")\n .option(\"--arch <arch>\", \"Target architecture (default: current system arch). Non-native uses software emulation and is significantly slower.\")\n .option(\"--config-file <path>\", \"Path to a config file; when set, credentials for this project are printed to stdout as JSON\")\n .action(async (opts: { arch?: string, configFile?: string }) => {\n const arch = resolveArch(opts.arch);\n\n let resolvedConfigFile: string | undefined;\n if (opts.configFile) {\n resolvedConfigFile = resolve(opts.configFile);\n if (!existsSync(resolvedConfigFile)) {\n throw new CliError(`Config file not found: ${resolvedConfigFile}`);\n }\n }\n\n if (isEmulatorRunning()) {\n console.warn(\"Emulator already running, reusing existing instance.\");\n } else {\n await startEmulator(arch);\n }\n\n if (resolvedConfigFile) {\n const pck = await readInternalPck();\n const creds = await fetchEmulatorCredentials(pck, emulatorBackendPort(), resolvedConfigFile);\n console.log(JSON.stringify(creds, null, 2));\n }\n });\n\n emulator\n .command(\"run\")\n .description(\"Start the emulator, run a command, and stop the emulator when the command exits\")\n .argument(\"<cmd>\", \"Command to run (e.g. \\\"npm run dev\\\")\")\n .option(\"--arch <arch>\", \"Target architecture\")\n .option(\"--config-file <path>\", \"Path to a config file; fetches credentials and injects STACK_PROJECT_ID / STACK_PUBLISHABLE_CLIENT_KEY / STACK_SECRET_SERVER_KEY into the child\")\n .action(async (cmd: string, opts: { arch?: string, configFile?: string }) => {\n const arch = resolveArch(opts.arch);\n\n let resolvedConfigFile: string | undefined;\n if (opts.configFile) {\n resolvedConfigFile = resolve(opts.configFile);\n if (!existsSync(resolvedConfigFile)) {\n throw new CliError(`Config file not found: ${resolvedConfigFile}`);\n }\n }\n\n const alreadyRunning = isEmulatorRunning();\n if (alreadyRunning) {\n console.log(\"Emulator already running, reusing existing instance.\");\n } else {\n await startEmulator(arch);\n }\n\n const childEnv: Record<string, string> = { ...process.env as Record<string, string> };\n if (resolvedConfigFile) {\n const pck = await readInternalPck();\n const backendPort = emulatorBackendPort();\n const creds = await fetchEmulatorCredentials(pck, backendPort, resolvedConfigFile);\n const apiUrl = `http://127.0.0.1:${backendPort}`;\n childEnv.STACK_PROJECT_ID = creds.project_id;\n childEnv.NEXT_PUBLIC_STACK_PROJECT_ID = creds.project_id;\n childEnv.STACK_PUBLISHABLE_CLIENT_KEY = creds.publishable_client_key;\n childEnv.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY = creds.publishable_client_key;\n childEnv.STACK_SECRET_SERVER_KEY = creds.secret_server_key;\n childEnv.STACK_API_URL = apiUrl;\n childEnv.NEXT_PUBLIC_STACK_API_URL = apiUrl;\n }\n\n const child = spawn(cmd, { shell: true, stdio: \"inherit\", env: childEnv });\n\n const forward = (signal: NodeJS.Signals) => () => child.kill(signal);\n const onSigint = forward(\"SIGINT\");\n const onSigterm = forward(\"SIGTERM\");\n process.on(\"SIGINT\", onSigint);\n process.on(\"SIGTERM\", onSigterm);\n\n child.on(\"close\", (code) => {\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n const exitCode = code ?? 1;\n if (alreadyRunning) {\n process.exit(exitCode);\n } else {\n console.log(\"\\nStopping emulator...\");\n runEmulator(\"stop\")\n .catch(() => { /* best-effort stop */ })\n .finally(() => process.exit(exitCode));\n }\n });\n });\n\n emulator.command(\"stop\").description(\"Stop the emulator (data preserved; use 'reset' to clear)\").action(() => runEmulator(\"stop\"));\n emulator.command(\"reset\").description(\"Reset emulator state for a fresh boot\").action(() => runEmulator(\"reset\"));\n emulator.command(\"status\").description(\"Show emulator and service health\").action(() => runEmulator(\"status\"));\n\n emulator\n .command(\"list-releases\")\n .description(\"List available emulator releases\")\n .option(\"--repo <repo>\", \"GitHub repository (default: stack-auth/stack-auth)\")\n .action((opts) => {\n const repo = opts.repo ?? \"stack-auth/stack-auth\";\n console.log(`Available emulator releases from ${repo}:\\n`);\n const lines = gh([\"release\", \"list\", \"--repo\", repo, \"--limit\", \"20\"]).split(\"\\n\").filter((l) => l.toLowerCase().includes(\"emulator\"));\n if (lines.length === 0) console.log(\"No emulator releases found.\");\n else for (const line of lines) console.log(line);\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"fs\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, join } from \"path\";\nimport { AuthError, CliError } from \"./lib/errors.js\";\nimport { registerLoginCommand } from \"./commands/login.js\";\nimport { registerLogoutCommand } from \"./commands/logout.js\";\nimport { registerExecCommand } from \"./commands/exec.js\";\nimport { registerConfigCommand } from \"./commands/config-file.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerProjectCommand } from \"./commands/project.js\";\nimport { registerEmulatorCommand } from \"./commands/emulator.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"));\n\nconst program = new Command();\n\nprogram\n .name(\"stack\")\n .description(\"Stack Auth CLI\")\n .version(pkg.version)\n .option(\"--project-id <id>\", \"Project ID\")\n .option(\"--json\", \"Output in JSON format\");\n\nregisterLoginCommand(program);\nregisterLogoutCommand(program);\nregisterExecCommand(program);\nregisterConfigCommand(program);\nregisterInitCommand(program);\nregisterProjectCommand(program);\nregisterEmulatorCommand(program);\n\nasync function main() {\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n if (err instanceof AuthError) {\n console.error(`Auth error: ${err.message}`);\n process.exit(1);\n }\n if (err instanceof CliError) {\n console.error(`Error: ${err.message}`);\n process.exit(1);\n }\n throw err;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-floating-promises\nmain();\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackframe/stack-cli",
3
- "version": "2.8.85",
3
+ "version": "2.8.86",
4
4
  "repository": "https://github.com/stack-auth/stack-auth",
5
5
  "description": "The CLI for Stack Auth. https://stack-auth.com",
6
6
  "main": "dist/index.js",
@@ -23,8 +23,8 @@
23
23
  "@inquirer/prompts": "^7.0.0",
24
24
  "commander": "^13.1.0",
25
25
  "jiti": "^2.4.2",
26
- "@stackframe/stack-shared": "2.8.85",
27
- "@stackframe/js": "2.8.85"
26
+ "@stackframe/js": "2.8.85",
27
+ "@stackframe/stack-shared": "2.8.86"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "20.17.6",