@telebort/question-banks-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -0
- package/bin/question-banks.js +9 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1097 -0
- package/dist/index.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/paths.ts","../src/ui/colors.ts","../src/ui/spinners.ts","../src/ui/tables.ts","../src/utils/error-handler.ts","../src/api/client.ts","../src/auth/types.ts","../src/auth/device-flow.ts","../src/auth/token-manager.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/usage.ts","../src/commands/billing.ts","../src/commands/validate.ts","../src/commands/api-keys/list.ts","../src/commands/api-keys/create.ts","../src/commands/api-keys/revoke.ts","../src/commands/api-keys/rotate.ts","../src/index.ts"],"names":["text","fs","open","z","pc"],"mappings":"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","file":"index.js","sourcesContent":["import { homedir } from 'os'\nimport { join } from 'path'\n\n// Configuration directory: ~/.question-banks/\nexport const CONFIG_DIR = join(homedir(), '.question-banks')\n\n// Configuration files\nexport const PATHS = {\n configDir: CONFIG_DIR,\n tokensFile: join(CONFIG_DIR, 'tokens.json'),\n configFile: join(CONFIG_DIR, 'config.json'),\n cacheDir: join(CONFIG_DIR, 'cache'),\n} as const\n\n// API endpoints\nexport const API_BASE_URL = process.env.QUESTION_BANKS_API_URL\n ?? 'https://exit-tickets-cli-api.vercel.app/api'\n\nexport const ENDPOINTS = {\n // Auth\n deviceCode: '/auth/device-code',\n token: '/auth/token',\n refresh: '/auth/refresh',\n\n // Account\n me: '/account/me',\n usage: '/account/usage',\n billingPortal: '/account/billing-portal',\n\n // API Keys\n apiKeys: '/api-keys',\n apiKeyById: (id: string) => `/api-keys/${id}`,\n rotateKey: (id: string) => `/api-keys/${id}/rotate`,\n\n // Validation\n validate: '/v1/validate',\n} as const\n\n// Stripe Customer Portal return URL\nexport const BILLING_RETURN_URL = 'https://question-banks.telebort.com/billing/success'\n","import pc from 'picocolors'\n\nexport const colors = {\n // Text styles\n bold: pc.bold,\n dim: pc.dim,\n italic: pc.italic,\n underline: pc.underline,\n\n // Colors\n red: pc.red,\n green: pc.green,\n yellow: pc.yellow,\n blue: pc.blue,\n cyan: pc.cyan,\n magenta: pc.magenta,\n white: pc.white,\n gray: pc.gray,\n\n // Semantic colors\n success: pc.green,\n error: pc.red,\n warning: pc.yellow,\n info: pc.cyan,\n muted: pc.dim,\n\n // Composite styles\n errorBold: (text: string) => pc.bold(pc.red(text)),\n successBold: (text: string) => pc.bold(pc.green(text)),\n warningBold: (text: string) => pc.bold(pc.yellow(text)),\n}\n\n// Symbols for consistent output\nexport const symbols = {\n success: colors.green('✓'),\n error: colors.red('✗'),\n warning: colors.yellow('⚠'),\n info: colors.cyan('ℹ'),\n arrow: colors.cyan('→'),\n bullet: colors.dim('•'),\n}\n","import ora, { type Ora } from 'ora'\nimport { colors } from './colors.js'\n\nexport interface SpinnerInstance {\n stop: () => void\n succeed: (text?: string) => void\n fail: (text?: string) => void\n warn: (text?: string) => void\n info: (text?: string) => void\n text: (text: string) => void\n}\n\nexport function spinner(text: string): SpinnerInstance {\n const spin: Ora = ora({\n text,\n spinner: 'dots',\n color: 'cyan',\n }).start()\n\n return {\n stop: () => spin.stop(),\n succeed: (text?: string) => spin.succeed(text),\n fail: (text?: string) => spin.fail(text),\n warn: (text?: string) => spin.warn(text),\n info: (text?: string) => spin.info(text),\n text: (text: string) => {\n spin.text = text\n },\n }\n}\n\n// Pre-configured spinners for common operations\nexport const spinners = {\n authenticating: () => spinner('Authenticating...'),\n loading: () => spinner('Loading...'),\n saving: () => spinner('Saving...'),\n connecting: () => spinner('Connecting to API...'),\n fetching: () => spinner('Fetching data...'),\n validating: () => spinner('Validating...'),\n}\n","import Table from 'cli-table3'\nimport { colors } from './colors.js'\n\nexport interface TableOptions {\n head?: string[]\n colWidths?: number[]\n style?: {\n head?: string[]\n border?: string[]\n }\n}\n\nexport function createTable(options: TableOptions = {}): Table.Table {\n return new Table({\n chars: {\n 'top': '─',\n 'top-mid': '┬',\n 'top-left': '┌',\n 'top-right': '┐',\n 'bottom': '─',\n 'bottom-mid': '┴',\n 'bottom-left': '└',\n 'bottom-right': '┘',\n 'left': '│',\n 'left-mid': '├',\n 'mid': '─',\n 'mid-mid': '┼',\n 'right': '│',\n 'right-mid': '┤',\n 'middle': '│',\n },\n style: {\n 'padding-left': 1,\n 'padding-right': 1,\n head: options.style?.head ?? ['cyan'],\n border: options.style?.border ?? ['dim'],\n },\n head: options.head,\n colWidths: options.colWidths,\n }) as Table.Table\n}\n\n// Pre-configured table styles\nexport function keyValueTable(data: Record<string, string>): string {\n const table = createTable({\n style: { head: [], border: ['dim'] },\n })\n\n Object.entries(data).forEach(([key, value]) => {\n table.push([colors.bold(key), value])\n })\n\n return table.toString()\n}\n\n// Progress bar helper\nexport function progressBar(\n current: number,\n total: number,\n width: number = 40\n): string {\n const percentage = Math.min(current / total, 1)\n const filled = Math.floor(percentage * width)\n const empty = width - filled\n\n const bar = '█'.repeat(filled) + '░'.repeat(empty)\n const pct = (percentage * 100).toFixed(1)\n\n // Color based on usage level\n let colorFn = colors.green\n if (percentage >= 0.85) colorFn = colors.red\n else if (percentage >= 0.70) colorFn = colors.yellow\n\n return `${colorFn(bar)} ${pct}%`\n}\n\n// Horizontal divider\nexport function divider(width: number = 50): string {\n return colors.dim('─'.repeat(width))\n}\n","import { colors, symbols } from '../ui/index.js'\n\n// Exit codes following Unix conventions\nexport const EXIT_CODES = {\n SUCCESS: 0,\n GENERAL_ERROR: 1,\n AUTH_ERROR: 2,\n VALIDATION_ERROR: 3,\n NETWORK_ERROR: 4,\n} as const\n\nexport class CLIError extends Error {\n constructor(\n message: string,\n public code: keyof typeof EXIT_CODES = 'GENERAL_ERROR',\n public hint?: string\n ) {\n super(message)\n this.name = 'CLIError'\n }\n}\n\nexport class AuthError extends CLIError {\n constructor(message: string, hint?: string) {\n super(message, 'AUTH_ERROR', hint)\n this.name = 'AuthError'\n }\n}\n\nexport class ValidationError extends CLIError {\n constructor(message: string, hint?: string) {\n super(message, 'VALIDATION_ERROR', hint)\n this.name = 'ValidationError'\n }\n}\n\nexport class NetworkError extends CLIError {\n constructor(message: string, hint?: string) {\n super(message, 'NETWORK_ERROR', hint)\n this.name = 'NetworkError'\n }\n}\n\nfunction formatError(error: Error): void {\n console.error('')\n console.error(`${symbols.error} ${colors.errorBold('Error:')} ${error.message}`)\n\n if (error instanceof CLIError && error.hint) {\n console.error(`${symbols.info} ${colors.dim('Hint:')} ${error.hint}`)\n }\n\n // Show stack trace in debug mode\n if (process.env.DEBUG === 'true' && error.stack) {\n console.error('')\n console.error(colors.dim(error.stack))\n }\n\n console.error('')\n}\n\nexport function handleError(error: unknown): never {\n if (error instanceof CLIError) {\n formatError(error)\n process.exit(EXIT_CODES[error.code])\n }\n\n if (error instanceof Error) {\n formatError(error)\n process.exit(EXIT_CODES.GENERAL_ERROR)\n }\n\n console.error(`${symbols.error} ${colors.errorBold('Unknown error:')}`, error)\n process.exit(EXIT_CODES.GENERAL_ERROR)\n}\n\nexport function setupErrorHandlers(): void {\n // Handle uncaught exceptions\n process.on('uncaughtException', (error: Error) => {\n console.error('')\n console.error(`${symbols.error} ${colors.errorBold('Uncaught exception:')}`)\n formatError(error)\n process.exit(EXIT_CODES.GENERAL_ERROR)\n })\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason: unknown) => {\n console.error('')\n console.error(`${symbols.error} ${colors.errorBold('Unhandled rejection:')}`)\n if (reason instanceof Error) {\n formatError(reason)\n } else {\n console.error(reason)\n }\n process.exit(EXIT_CODES.GENERAL_ERROR)\n })\n\n // Handle SIGINT (Ctrl+C)\n process.on('SIGINT', () => {\n console.log('')\n console.log(colors.yellow('Interrupted'))\n process.exit(0)\n })\n\n // Handle SIGTERM\n process.on('SIGTERM', () => {\n console.log('')\n console.log(colors.yellow('Terminated'))\n process.exit(0)\n })\n}\n","import { API_BASE_URL } from '../config/paths.js'\nimport { NetworkError } from '../utils/error-handler.js'\n\nexport interface ApiResponse<T = unknown> {\n data: T\n status: number\n}\n\nexport interface ApiError {\n code: string\n message: string\n timestamp?: string\n}\n\nexport interface RequestOptions {\n headers?: Record<string, string>\n params?: Record<string, string>\n timeout?: number\n}\n\nexport class ApiClient {\n private baseUrl: string\n\n constructor(baseUrl: string = API_BASE_URL) {\n this.baseUrl = baseUrl\n }\n\n private buildUrl(path: string, params?: Record<string, string>): string {\n const url = new URL(path, this.baseUrl)\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n url.searchParams.set(key, value)\n })\n }\n return url.toString()\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n ): Promise<ApiResponse<T>> {\n const url = this.buildUrl(path, options.params)\n const timeout = options.timeout ?? 30000 // 30s default\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(timeout),\n })\n\n const data = await response.json()\n\n if (!response.ok) {\n const error = data as ApiError\n throw new NetworkError(\n error.message ?? `HTTP ${response.status}`,\n `Check your network connection or try again later`\n )\n }\n\n return {\n data: data as T,\n status: response.status,\n }\n } catch (error) {\n if (error instanceof NetworkError) {\n throw error\n }\n\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new NetworkError(\n 'Network error: Unable to connect to API',\n 'Check your internet connection'\n )\n }\n\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new NetworkError(\n 'Request timed out',\n 'The API is taking too long to respond. Try again later.'\n )\n }\n\n throw error\n }\n }\n\n async get<T>(path: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>('GET', path, undefined, options)\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>('POST', path, body, options)\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>('DELETE', path, undefined, options)\n }\n\n async patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<ApiResponse<T>> {\n return this.request<T>('PATCH', path, body, options)\n }\n}\n\n// Singleton instance\nexport const apiClient = new ApiClient()\n","import { z } from 'zod'\n\n// Device code response from OAuth Device Flow\nexport const DeviceCodeResponseSchema = z.object({\n device_code: z.string(),\n user_code: z.string(),\n verification_uri: z.string().url(),\n verification_uri_complete: z.string().url().optional(),\n expires_in: z.number(), // seconds\n interval: z.number(), // seconds between polls\n})\n\nexport type DeviceCodeResponse = z.infer<typeof DeviceCodeResponseSchema>\n\n// Token response\nexport const TokenResponseSchema = z.object({\n access_token: z.string(),\n token_type: z.literal('Bearer'),\n expires_in: z.number(), // seconds\n refresh_token: z.string(),\n scope: z.string().optional(),\n})\n\nexport type TokenResponse = z.infer<typeof TokenResponseSchema>\n\n// Stored token data\nexport const StoredTokenSchema = z.object({\n access_token: z.string(),\n refresh_token: z.string(),\n expires_at: z.number(), // Unix timestamp (ms)\n})\n\nexport type StoredToken = z.infer<typeof StoredTokenSchema>\n\n// Error responses during device flow\nexport const DeviceFlowErrorSchema = z.object({\n error: z.enum([\n 'authorization_pending',\n 'slow_down',\n 'expired_token',\n 'access_denied',\n ]),\n error_description: z.string().optional(),\n})\n\nexport type DeviceFlowError = z.infer<typeof DeviceFlowErrorSchema>\n","import open from 'open'\nimport { apiClient } from '../api/client.js'\nimport { ENDPOINTS } from '../config/paths.js'\nimport { colors, symbols, spinner } from '../ui/index.js'\nimport { AuthError } from '../utils/error-handler.js'\nimport {\n DeviceCodeResponseSchema,\n TokenResponseSchema,\n type DeviceCodeResponse,\n type TokenResponse,\n} from './types.js'\n\nconst CLIENT_ID = 'question-banks-cli'\n\nexport class DeviceFlowAuth {\n async authenticate(): Promise<TokenResponse> {\n // Step 1: Request device code\n const deviceCode = await this.requestDeviceCode()\n\n // Step 2: Display user code and prompt to open browser\n this.displayUserCode(deviceCode)\n\n // Step 3: Open browser automatically\n const opened = await this.openBrowser(deviceCode.verification_uri_complete ?? deviceCode.verification_uri)\n\n if (!opened) {\n console.log(\n colors.yellow('Could not open browser automatically.'),\n colors.dim('Please visit the URL above manually.')\n )\n }\n\n console.log('')\n\n // Step 4: Poll for token\n const spin = spinner('Waiting for authorization...')\n try {\n const token = await this.pollForToken(deviceCode)\n spin.succeed('Authentication complete!')\n return token\n } catch (error) {\n spin.fail('Authentication failed')\n throw error\n }\n }\n\n private async requestDeviceCode(): Promise<DeviceCodeResponse> {\n const { data } = await apiClient.post(ENDPOINTS.deviceCode, {\n client_id: CLIENT_ID,\n })\n\n return DeviceCodeResponseSchema.parse(data)\n }\n\n private displayUserCode(deviceCode: DeviceCodeResponse): void {\n console.log('')\n console.log(colors.bold('First-time setup required'))\n console.log('')\n console.log(`${symbols.arrow} Visit: ${colors.cyan(colors.underline(deviceCode.verification_uri))}`)\n console.log(`${symbols.arrow} Enter code: ${colors.bold(colors.yellow(deviceCode.user_code))}`)\n console.log('')\n }\n\n private async openBrowser(url: string): Promise<boolean> {\n try {\n await open(url)\n return true\n } catch {\n return false\n }\n }\n\n private async pollForToken(deviceCode: DeviceCodeResponse): Promise<TokenResponse> {\n const expiresAt = Date.now() + deviceCode.expires_in * 1000\n let interval = deviceCode.interval * 1000\n\n while (Date.now() < expiresAt) {\n await this.sleep(interval)\n\n try {\n const { data } = await apiClient.post(ENDPOINTS.token, {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceCode.device_code,\n client_id: CLIENT_ID,\n })\n\n return TokenResponseSchema.parse(data)\n } catch (error: unknown) {\n // Check for expected polling errors\n if (this.isPollingError(error)) {\n const errorCode = this.getErrorCode(error)\n\n if (errorCode === 'authorization_pending') {\n // Continue polling\n continue\n }\n\n if (errorCode === 'slow_down') {\n // Increase polling interval\n interval += 1000\n continue\n }\n\n if (errorCode === 'access_denied') {\n throw new AuthError(\n 'Authorization denied',\n 'You declined the authorization request'\n )\n }\n\n if (errorCode === 'expired_token') {\n throw new AuthError(\n 'Authorization code expired',\n 'Please try again: question-banks login'\n )\n }\n }\n\n throw error\n }\n }\n\n throw new AuthError(\n 'Authorization timed out',\n 'Please try again: question-banks login'\n )\n }\n\n private isPollingError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'error' in error &&\n typeof (error as Record<string, unknown>).error === 'string'\n )\n }\n\n private getErrorCode(error: unknown): string | null {\n if (this.isPollingError(error)) {\n return (error as Record<string, string>).error\n }\n return null\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n}\n\n// Singleton instance\nexport const deviceFlowAuth = new DeviceFlowAuth()\n","import { promises as fs } from 'fs'\nimport { PATHS, ENDPOINTS } from '../config/paths.js'\nimport { StoredTokenSchema, type StoredToken, type TokenResponse } from './types.js'\nimport { AuthError } from '../utils/error-handler.js'\nimport { apiClient } from '../api/client.js'\n\nexport class TokenManager {\n private cachedToken: StoredToken | null = null\n\n async save(token: TokenResponse): Promise<void> {\n await fs.mkdir(PATHS.configDir, { recursive: true })\n\n const data: StoredToken = {\n access_token: token.access_token,\n refresh_token: token.refresh_token,\n expires_at: Date.now() + token.expires_in * 1000,\n }\n\n await fs.writeFile(\n PATHS.tokensFile,\n JSON.stringify(data, null, 2),\n { mode: 0o600 } // Read/write for owner only\n )\n\n this.cachedToken = data\n }\n\n async load(): Promise<StoredToken | null> {\n if (this.cachedToken) return this.cachedToken\n\n try {\n const content = await fs.readFile(PATHS.tokensFile, 'utf-8')\n const parsed = JSON.parse(content)\n this.cachedToken = StoredTokenSchema.parse(parsed)\n return this.cachedToken\n } catch {\n return null\n }\n }\n\n async clear(): Promise<void> {\n this.cachedToken = null\n try {\n await fs.unlink(PATHS.tokensFile)\n } catch {\n // Ignore if file doesn't exist\n }\n }\n\n async getValidToken(): Promise<string> {\n const token = await this.load()\n\n if (!token) {\n throw new AuthError(\n 'Not authenticated',\n 'Run: question-banks login'\n )\n }\n\n // Check if token is still valid (with 5min buffer)\n const bufferMs = 5 * 60 * 1000\n if (Date.now() < token.expires_at - bufferMs) {\n return token.access_token\n }\n\n // Token expired or about to expire, refresh it\n return this.refreshToken(token.refresh_token)\n }\n\n private async refreshToken(refreshToken: string): Promise<string> {\n try {\n const { data } = await apiClient.post<TokenResponse>(\n ENDPOINTS.refresh,\n {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n }\n )\n\n await this.save(data)\n return data.access_token\n } catch (error) {\n // Clear invalid tokens\n await this.clear()\n throw new AuthError(\n 'Session expired',\n 'Please log in again: question-banks login'\n )\n }\n }\n\n async isAuthenticated(): Promise<boolean> {\n try {\n await this.getValidToken()\n return true\n } catch {\n return false\n }\n }\n}\n\n// Singleton instance\nexport const tokenManager = new TokenManager()\n","import type { Command } from 'commander'\nimport { deviceFlowAuth } from '../auth/device-flow.js'\nimport { tokenManager } from '../auth/token-manager.js'\nimport { colors, symbols } from '../ui/index.js'\nimport { handleError } from '../utils/error-handler.js'\n\nexport function loginCommand(program: Command): void {\n program\n .command('login')\n .description('Authenticate with Question Banks API')\n .action(async () => {\n try {\n // Check if already logged in\n const isAuthenticated = await tokenManager.isAuthenticated()\n if (isAuthenticated) {\n console.log(colors.yellow('Already logged in.'))\n console.log(`Run ${colors.cyan('question-banks logout')} first to switch accounts.`)\n return\n }\n\n // Start device flow authentication\n const token = await deviceFlowAuth.authenticate()\n await tokenManager.save(token)\n\n console.log('')\n console.log(`${symbols.success} ${colors.successBold('Successfully authenticated!')}`)\n console.log('')\n console.log(`Run ${colors.cyan('question-banks whoami')} to verify your account.`)\n } catch (error) {\n handleError(error)\n }\n })\n}\n","import type { Command } from 'commander'\nimport { tokenManager } from '../auth/token-manager.js'\nimport { colors, symbols } from '../ui/index.js'\n\nexport function logoutCommand(program: Command): void {\n program\n .command('logout')\n .description('Clear local authentication tokens')\n .action(async () => {\n await tokenManager.clear()\n console.log(`${symbols.success} ${colors.green('Logged out successfully')}`)\n })\n}\n","import type { Command } from 'commander'\nimport { apiClient } from '../api/client.js'\nimport { tokenManager } from '../auth/token-manager.js'\nimport { ENDPOINTS } from '../config/paths.js'\nimport { colors, divider, spinners } from '../ui/index.js'\nimport { handleError } from '../utils/error-handler.js'\n\ninterface MeResponse {\n user: {\n id: string\n email: string\n name: string | null\n avatarUrl: string | null\n }\n organization: {\n id: string\n name: string\n slug: string\n }\n subscription: {\n plan: 'free' | 'standard' | 'premium' | 'enterprise'\n status: 'active' | 'canceled' | 'past_due' | 'trialing'\n monthlyQuota: number | null\n currentPeriodEnd: string | null\n trialEndsAt: string | null\n }\n}\n\nexport function whoamiCommand(program: Command): void {\n program\n .command('whoami')\n .description('Display current account information')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const spin = spinners.fetching()\n\n try {\n const accessToken = await tokenManager.getValidToken()\n const { data } = await apiClient.get<MeResponse>(ENDPOINTS.me, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n spin.stop()\n\n if (options.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n // Display formatted output\n console.log('')\n console.log(colors.bold('Account Information'))\n console.log(divider())\n console.log('')\n console.log(`${colors.dim('User:')} ${data.user.name ?? colors.dim('(not set)')} ${colors.dim(`<${data.user.email}>`)}`)\n console.log(`${colors.dim('Organization:')} ${data.organization.name} ${colors.dim(`(${data.organization.slug})`)}`)\n console.log('')\n console.log(colors.bold('Subscription'))\n console.log(divider())\n console.log('')\n\n const planColors: Record<string, (s: string) => string> = {\n free: colors.dim,\n standard: colors.cyan,\n premium: colors.yellow,\n enterprise: colors.magenta,\n }\n const planColor = planColors[data.subscription.plan] ?? colors.white\n\n console.log(`${colors.dim('Plan:')} ${planColor(data.subscription.plan.toUpperCase())}`)\n\n const statusColors: Record<string, (s: string) => string> = {\n active: colors.green,\n trialing: colors.cyan,\n past_due: colors.red,\n canceled: colors.dim,\n }\n const statusColor = statusColors[data.subscription.status] ?? colors.white\n console.log(`${colors.dim('Status:')} ${statusColor(data.subscription.status)}`)\n\n if (data.subscription.monthlyQuota) {\n console.log(`${colors.dim('Quota:')} ${data.subscription.monthlyQuota.toLocaleString()} requests/month`)\n }\n\n if (data.subscription.trialEndsAt) {\n const trialEnd = new Date(data.subscription.trialEndsAt)\n const now = new Date()\n if (trialEnd > now) {\n const daysLeft = Math.ceil((trialEnd.getTime() - now.getTime()) / (1000 * 60 * 60 * 24))\n console.log(`${colors.dim('Trial:')} ${colors.cyan(`${daysLeft} days remaining`)}`)\n }\n }\n\n console.log('')\n } catch (error) {\n spin.stop()\n handleError(error)\n }\n })\n}\n","import type { Command } from 'commander'\nimport { apiClient } from '../api/client.js'\nimport { tokenManager } from '../auth/token-manager.js'\nimport { ENDPOINTS } from '../config/paths.js'\nimport { colors, divider, createTable, progressBar, spinners, symbols } from '../ui/index.js'\nimport { handleError } from '../utils/error-handler.js'\n\ninterface UsageResponse {\n period: string\n quota: number\n used: number\n remaining: number\n isUnlimited: boolean\n breakdown: Record<string, number>\n dailyUsage: Array<{ date: string; count: number }>\n}\n\nexport function usageCommand(program: Command): void {\n program\n .command('usage')\n .description('Display API usage statistics')\n .option('--period <YYYY-MM>', 'Billing period (default: current)')\n .option('--daily', 'Show daily breakdown')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const spin = spinners.fetching()\n\n try {\n const accessToken = await tokenManager.getValidToken()\n const { data } = await apiClient.get<UsageResponse>(ENDPOINTS.usage, {\n headers: { Authorization: `Bearer ${accessToken}` },\n params: options.period ? { period: options.period } : undefined,\n })\n\n spin.stop()\n\n if (options.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n // Header\n console.log('')\n console.log(colors.bold(`Usage for ${data.period}`))\n console.log(divider())\n console.log('')\n\n // Summary stats\n if (data.isUnlimited) {\n console.log(`${colors.dim('Quota:')} ${colors.cyan('Unlimited')}`)\n console.log(`${colors.dim('Used:')} ${data.used.toLocaleString()} requests`)\n } else {\n console.log(`${colors.dim('Quota:')} ${data.quota.toLocaleString()} requests`)\n console.log(`${colors.dim('Used:')} ${data.used.toLocaleString()} ${colors.dim(`(${((data.used / data.quota) * 100).toFixed(1)}%)`)}`)\n console.log(`${colors.dim('Remaining:')} ${colors.green(data.remaining.toLocaleString())}`)\n console.log('')\n\n // Progress bar\n console.log(progressBar(data.used, data.quota))\n\n // Warning if approaching limit\n const usagePercent = (data.used / data.quota) * 100\n if (usagePercent >= 85) {\n console.log('')\n console.log(`${symbols.warning} ${colors.yellow('You are at ' + usagePercent.toFixed(0) + '% of your monthly limit.')}`)\n console.log(` Consider upgrading: ${colors.cyan('question-banks billing')}`)\n }\n }\n\n // Endpoint breakdown\n if (Object.keys(data.breakdown).length > 0) {\n console.log('')\n console.log(colors.bold('Breakdown by Endpoint'))\n console.log(divider(30))\n\n const table = createTable({\n head: ['Endpoint', 'Requests', '%'],\n colWidths: [25, 15, 10],\n })\n\n Object.entries(data.breakdown)\n .sort(([, a], [, b]) => b - a)\n .forEach(([endpoint, count]) => {\n const pct = data.used > 0 ? ((count / data.used) * 100).toFixed(1) : '0.0'\n table.push([endpoint, count.toLocaleString(), `${pct}%`])\n })\n\n console.log(table.toString())\n }\n\n // Daily breakdown (if requested)\n if (options.daily && data.dailyUsage.length > 0) {\n console.log('')\n console.log(colors.bold('Daily Usage'))\n console.log(divider(30))\n\n const table = createTable({\n head: ['Date', 'Requests'],\n colWidths: [15, 15],\n })\n\n data.dailyUsage\n .slice(-14) // Last 14 days\n .reverse()\n .forEach(({ date, count }) => {\n table.push([date, count.toLocaleString()])\n })\n\n console.log(table.toString())\n }\n\n console.log('')\n } catch (error) {\n spin.stop()\n handleError(error)\n }\n })\n}\n","import type { Command } from 'commander'\nimport open from 'open'\nimport { apiClient } from '../api/client.js'\nimport { tokenManager } from '../auth/token-manager.js'\nimport { ENDPOINTS } from '../config/paths.js'\nimport { colors, symbols, spinners } from '../ui/index.js'\nimport { handleError } from '../utils/error-handler.js'\n\ninterface BillingPortalResponse {\n url: string\n}\n\nexport function billingCommand(program: Command): void {\n program\n .command('billing')\n .description('Open Stripe Customer Portal to manage subscription')\n .option('--url-only', 'Print URL instead of opening browser')\n .action(async (options) => {\n const spin = spinners.loading()\n spin.text('Generating billing portal URL...')\n\n try {\n const accessToken = await tokenManager.getValidToken()\n const { data } = await apiClient.post<BillingPortalResponse>(\n ENDPOINTS.billingPortal,\n {},\n { headers: { Authorization: `Bearer ${accessToken}` } }\n )\n\n spin.stop()\n\n if (options.urlOnly) {\n console.log(data.url)\n return\n }\n\n console.log(`${symbols.info} Opening billing portal in your browser...`)\n\n try {\n await open(data.url)\n console.log(`${symbols.success} ${colors.green('Billing portal opened successfully')}`)\n console.log('')\n console.log(colors.dim('In the portal you can:'))\n console.log(colors.dim(' • View and download invoices'))\n console.log(colors.dim(' • Update payment methods'))\n console.log(colors.dim(' • Upgrade or downgrade your plan'))\n console.log(colors.dim(' • Cancel subscription'))\n } catch {\n console.log(colors.yellow('Could not open browser automatically.'))\n console.log('')\n console.log('Visit this URL to manage your billing:')\n console.log(colors.cyan(data.url))\n }\n\n console.log('')\n } catch (error) {\n spin.stop()\n handleError(error)\n }\n })\n}\n","import type { Command } from 'commander'\nimport { promises as fs } from 'fs'\nimport { colors, symbols, spinners } from '../ui/index.js'\nimport { handleError, ValidationError } from '../utils/error-handler.js'\nimport { z } from 'zod'\n\n// Option schema with misconception feedback (v1.1)\nconst OptionFeedbackSchema = z.object({\n short: z.string(),\n detailed: z.string(),\n socraticHint: z.string().optional(),\n})\n\nconst OptionSchema = z.object({\n key: z.string(), // \"A\", \"B\", \"C\", \"D\"\n text: z.string().min(1),\n isCorrect: z.boolean(),\n misconceptionId: z.string().optional(),\n feedback: OptionFeedbackSchema.optional(),\n})\n\n// Question schema matching Exit Tickets SDK v1.1 format\nconst QuestionSchema = z.object({\n questionId: z.string(),\n globalId: z.string().optional(),\n questionNumber: z.number().optional(),\n questionType: z.string().optional(),\n questionTypeLabel: z.string().optional(),\n questionArchetype: z.string().optional(),\n prompt: z.string().min(1),\n hasCodeBlock: z.boolean().optional(),\n codeLanguage: z.string().nullable().optional(),\n codeContent: z.string().nullable().optional(),\n misconceptionTargets: z.array(z.any()).optional(),\n options: z.array(OptionSchema).min(2).max(6),\n correctAnswer: z.string(), // \"A\", \"B\", \"C\", \"D\"\n correctAnswerText: z.string().optional(),\n metadata: z.any().optional(),\n version: z.string().optional(),\n})\n\n// Legacy simple format (backward compatibility)\nconst LegacyQuestionSchema = z.object({\n id: z.string(),\n type: z.string().optional(),\n question: z.string().min(1),\n options: z.array(z.string()).min(2).max(6),\n correctAnswerIndex: z.number().min(0),\n})\n\n// Lesson schema for course exports\nconst LessonSchema = z.object({\n lessonId: z.string(),\n lessonNumber: z.number(),\n lessonTitle: z.string(),\n lessonSlug: z.string().optional(),\n totalQuestions: z.number().optional(),\n questions: z.array(QuestionSchema),\n})\n\n// Course export format (v1.1 hierarchical structure)\nconst CourseExportSchema = z.object({\n courseId: z.string(),\n courseName: z.string(),\n courseCode: z.string(),\n domain: z.string().optional(),\n tier: z.string().optional(),\n difficulty: z.number().or(z.string()).optional(),\n totalLessons: z.number().optional(),\n totalQuestions: z.number().optional(),\n sourceFile: z.string().optional(),\n lessons: z.array(LessonSchema),\n})\n\n// Simple flat questions format\nconst SimpleQuestionsSchema = z.object({\n questions: z.array(QuestionSchema.or(LegacyQuestionSchema)),\n})\n\n// Union of all supported formats\ntype ValidFile = z.infer<typeof CourseExportSchema> | z.infer<typeof SimpleQuestionsSchema>\n\nexport function validateCommand(program: Command): void {\n program\n .command('validate <file>')\n .description('Validate a question JSON file (local, no API required)')\n .option('-v, --verbose', 'Show detailed validation output')\n .action(async (file: string, options) => {\n const spin = spinners.validating()\n\n try {\n // Check file exists\n try {\n await fs.access(file)\n } catch {\n throw new ValidationError(\n `File not found: ${file}`,\n 'Make sure the file path is correct'\n )\n }\n\n // Read file\n const content = await fs.readFile(file, 'utf-8')\n let data: unknown\n\n try {\n data = JSON.parse(content)\n } catch {\n throw new ValidationError(\n 'Invalid JSON format',\n 'The file must contain valid JSON'\n )\n }\n\n // Try course export format first, then simple format\n const courseResult = CourseExportSchema.safeParse(data)\n const simpleResult = SimpleQuestionsSchema.safeParse(data)\n\n spin.stop()\n\n // Handle course export format\n if (courseResult.success) {\n const course = courseResult.data\n let totalQuestions = 0\n let lessonCount = course.lessons.length\n\n course.lessons.forEach(lesson => {\n totalQuestions += lesson.questions.length\n })\n\n console.log(`${symbols.success} ${colors.green(`Course validated successfully`)}`)\n console.log('')\n console.log(` ${colors.bold('Course:')} ${course.courseName} (${course.courseCode})`)\n console.log(` ${colors.bold('Lessons:')} ${lessonCount}`)\n console.log(` ${colors.bold('Questions:')} ${totalQuestions}`)\n\n if (options.verbose) {\n console.log('')\n course.lessons.forEach((lesson) => {\n console.log(` ${colors.green('✓')} Lesson ${lesson.lessonNumber}: ${lesson.questions.length} questions`)\n })\n }\n\n console.log('')\n return\n }\n\n // Handle simple format\n if (simpleResult.success) {\n const count = simpleResult.data.questions.length\n console.log(`${symbols.success} ${colors.green(`${count}/${count} questions validated successfully`)}`)\n\n if (options.verbose) {\n console.log('')\n simpleResult.data.questions.forEach((q, i) => {\n const id = 'questionId' in q ? q.questionId : q.id\n console.log(` ${colors.green('✓')} Question ${i + 1}: ${colors.dim(id)}`)\n })\n }\n\n console.log('')\n return\n }\n\n // Both formats failed - show course format errors (more likely intent)\n console.log(`${symbols.error} ${colors.red('Validation failed')}`)\n console.log('')\n\n // Use the result with fewer errors (better match)\n const result = courseResult.error.issues.length <= simpleResult.error.issues.length\n ? courseResult\n : simpleResult\n\n // Format errors (limit to first 5)\n const issues = result.error.issues.slice(0, 5)\n issues.forEach((issue, i) => {\n const path = issue.path.join('.')\n console.log(`${colors.red(`Error[E${String(i + 1).padStart(3, '0')}]:`)} ${issue.message}`)\n console.log(` ${colors.dim('-->')} ${file}:${colors.yellow(path || 'root')}`)\n\n // Add hints for common issues\n if (issue.code === 'too_small' && path.includes('options')) {\n console.log(` ${colors.dim('Hint:')} Questions need at least 2 options`)\n }\n if (issue.code === 'invalid_type' && path.includes('correctAnswerIndex')) {\n console.log(` ${colors.dim('Hint:')} correctAnswerIndex must be a number (0-based)`)\n }\n\n console.log('')\n })\n\n if (result.error.issues.length > 5) {\n console.log(colors.dim(`... and ${result.error.issues.length - 5} more errors`))\n console.log('')\n }\n\n console.log(colors.dim(`Learn more: https://docs.question-banks.dev/validation`))\n process.exit(1)\n } catch (error) {\n spin.stop()\n handleError(error)\n }\n })\n}\n","import type { Command } from 'commander'\nimport { formatDistanceToNow } from 'date-fns'\nimport { apiClient } from '../../api/client.js'\nimport { tokenManager } from '../../auth/token-manager.js'\nimport { ENDPOINTS } from '../../config/paths.js'\nimport { colors, createTable, spinners, symbols } from '../../ui/index.js'\nimport { handleError } from '../../utils/error-handler.js'\n\ninterface ApiKey {\n id: string\n publicKey: string\n name: string | null\n mode: 'test' | 'live'\n isActive: boolean\n createdAt: string\n lastUsedAt: string | null\n}\n\ninterface ListKeysResponse {\n keys: ApiKey[]\n}\n\nexport function apiKeysListCommand(parent: Command): void {\n parent\n .command('list')\n .description('List all API keys')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const spin = spinners.fetching()\n\n try {\n const accessToken = await tokenManager.getValidToken()\n const { data } = await apiClient.get<ListKeysResponse>(ENDPOINTS.apiKeys, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n spin.stop()\n\n if (options.json) {\n console.log(JSON.stringify(data, null, 2))\n return\n }\n\n if (data.keys.length === 0) {\n console.log('')\n console.log(colors.yellow('No API keys found.'))\n console.log(`Create one with: ${colors.cyan('question-banks api-keys create')}`)\n console.log('')\n return\n }\n\n const table = createTable({\n head: ['Name', 'Key (partial)', 'Mode', 'Last Used', 'Status'],\n colWidths: [20, 22, 8, 18, 10],\n })\n\n data.keys.forEach((key) => {\n const partial = key.publicKey.slice(0, 18) + '...'\n const lastUsed = key.lastUsedAt\n ? formatDistanceToNow(new Date(key.lastUsedAt), { addSuffix: true })\n : colors.dim('Never')\n const status = key.isActive\n ? colors.green('Active')\n : colors.red('Revoked')\n const mode = key.mode === 'live'\n ? colors.yellow('live')\n : colors.dim('test')\n\n table.push([\n key.name || colors.dim('(unnamed)'),\n partial,\n mode,\n lastUsed,\n status,\n ])\n })\n\n console.log('')\n console.log(table.toString())\n console.log('')\n } catch (error) {\n spin.stop()\n handleError(error)\n }\n })\n}\n","import type { Command } from 'commander'\nimport { apiClient } from '../../api/client.js'\nimport { tokenManager } from '../../auth/token-manager.js'\nimport { ENDPOINTS } from '../../config/paths.js'\nimport { colors, spinners, symbols, divider } from '../../ui/index.js'\nimport { handleError, ValidationError } from '../../utils/error-handler.js'\n\ninterface CreateKeyResponse {\n id: string\n publicKey: string\n secret: string // Only returned once!\n name: string | null\n mode: 'test' | 'live'\n}\n\nexport function apiKeysCreateCommand(parent: Command): void {\n parent\n .command('create')\n .description('Create a new API key')\n .option('-n, --name <name>', 'Key name (e.g., \"Production API Key\")')\n .option('-m, --mode <mode>', 'Key mode: test or live', 'test')\n .action(async (options) => {\n try {\n // Validate mode\n if (!['test', 'live'].includes(options.mode)) {\n throw new ValidationError(\n 'Invalid mode',\n 'Mode must be \"test\" or \"live\"'\n )\n }\n\n // Warn about live keys\n if (options.mode === 'live') {\n console.log('')\n console.log(`${symbols.warning} ${colors.yellow('Creating a LIVE API key')}`)\n console.log(colors.dim('Live keys can access production data and count against your quota.'))\n console.log('')\n }\n\n const spin = spinners.saving()\n spin.text('Creating API key...')\n\n const accessToken = await tokenManager.getValidToken()\n const { data } = await apiClient.post<CreateKeyResponse>(\n ENDPOINTS.apiKeys,\n {\n name: options.name || null,\n mode: options.mode,\n },\n { headers: { Authorization: `Bearer ${accessToken}` } }\n )\n\n spin.succeed('API key created successfully!')\n\n console.log('')\n console.log(divider())\n console.log('')\n console.log(colors.bold('Your new API key:'))\n console.log('')\n console.log(` ${colors.cyan(data.secret)}`)\n console.log('')\n console.log(divider())\n console.log('')\n console.log(`${symbols.warning} ${colors.yellow('Save this key now!')}`)\n console.log(colors.dim('This is the only time you will see the complete key.'))\n console.log('')\n\n // Usage example\n console.log(colors.bold('Quick start:'))\n console.log('')\n console.log(colors.dim(' // JavaScript/TypeScript'))\n console.log(` const client = new ValidationClient({`)\n console.log(` apiKey: '${data.secret.slice(0, 20)}...'`)\n console.log(` })`)\n console.log('')\n } catch (error) {\n handleError(error)\n }\n })\n}\n","import type { Command } from 'commander'\nimport { createInterface } from 'readline'\nimport { apiClient } from '../../api/client.js'\nimport { tokenManager } from '../../auth/token-manager.js'\nimport { ENDPOINTS } from '../../config/paths.js'\nimport { colors, spinners, symbols } from '../../ui/index.js'\nimport { handleError, ValidationError } from '../../utils/error-handler.js'\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N) `, (answer) => {\n rl.close()\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes')\n })\n })\n}\n\ninterface RevokeResponse {\n success: boolean\n revokedAt: string\n}\n\nexport function apiKeysRevokeCommand(parent: Command): void {\n parent\n .command('revoke <key-id>')\n .description('Revoke an API key')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (keyId: string, options) => {\n try {\n // Confirm unless --yes flag\n if (!options.yes) {\n console.log('')\n console.log(`${symbols.warning} ${colors.yellow('This action cannot be undone.')}`)\n console.log(colors.dim('Any applications using this key will stop working immediately.'))\n console.log('')\n\n const confirmed = await confirm('Are you sure you want to revoke this key?')\n if (!confirmed) {\n console.log(colors.dim('Cancelled.'))\n return\n }\n }\n\n const spin = spinners.saving()\n spin.text('Revoking API key...')\n\n const accessToken = await tokenManager.getValidToken()\n await apiClient.delete<RevokeResponse>(ENDPOINTS.apiKeyById(keyId), {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n spin.succeed('API key revoked successfully')\n console.log('')\n console.log(colors.dim('The key can no longer be used to access the API.'))\n console.log('')\n } catch (error) {\n handleError(error)\n }\n })\n}\n","import type { Command } from 'commander'\nimport { apiClient } from '../../api/client.js'\nimport { tokenManager } from '../../auth/token-manager.js'\nimport { ENDPOINTS } from '../../config/paths.js'\nimport { colors, spinners, symbols, divider } from '../../ui/index.js'\nimport { handleError, ValidationError } from '../../utils/error-handler.js'\n\ninterface RotateKeyResponse {\n id: string\n publicKey: string\n secret: string // New key, only returned once!\n oldKeyExpiresAt: string\n}\n\nexport function apiKeysRotateCommand(parent: Command): void {\n parent\n .command('rotate <key-id>')\n .description('Rotate an API key (creates new key, old key remains valid for grace period)')\n .option('-g, --grace <duration>', 'Grace period for old key (e.g., 24h, 7d)', '24h')\n .action(async (keyId: string, options) => {\n try {\n // Parse grace period\n const gracePeriod = parseGracePeriod(options.grace)\n if (!gracePeriod) {\n throw new ValidationError(\n 'Invalid grace period format',\n 'Use formats like: 1h, 24h, 7d, 30d'\n )\n }\n\n console.log('')\n console.log(`${symbols.info} ${colors.cyan('Rotating API key...')}`)\n console.log(colors.dim(`Old key will remain valid for ${options.grace}`))\n console.log('')\n\n const spin = spinners.saving()\n spin.text('Generating new key...')\n\n const accessToken = await tokenManager.getValidToken()\n const { data } = await apiClient.post<RotateKeyResponse>(\n ENDPOINTS.rotateKey(keyId),\n { gracePeriod: gracePeriod },\n { headers: { Authorization: `Bearer ${accessToken}` } }\n )\n\n spin.succeed('API key rotated successfully!')\n\n console.log('')\n console.log(divider())\n console.log('')\n console.log(colors.bold('Your new API key:'))\n console.log('')\n console.log(` ${colors.cyan(data.secret)}`)\n console.log('')\n console.log(divider())\n console.log('')\n console.log(`${symbols.warning} ${colors.yellow('Save this key now!')}`)\n console.log(colors.dim('This is the only time you will see the complete key.'))\n console.log('')\n console.log(`${symbols.info} Old key expires: ${colors.yellow(new Date(data.oldKeyExpiresAt).toLocaleString())}`)\n console.log(colors.dim('Update your applications before the old key expires.'))\n console.log('')\n } catch (error) {\n handleError(error)\n }\n })\n}\n\nfunction parseGracePeriod(duration: string): number | null {\n const match = duration.match(/^(\\d+)(h|d)$/)\n if (!match) return null\n\n const value = parseInt(match[1], 10)\n const unit = match[2]\n\n if (unit === 'h') return value * 60 * 60 * 1000 // hours to ms\n if (unit === 'd') return value * 24 * 60 * 60 * 1000 // days to ms\n\n return null\n}\n","import { Command } from 'commander'\nimport pc from 'picocolors'\n\n// Import commands\nimport { loginCommand } from './commands/login.js'\nimport { logoutCommand } from './commands/logout.js'\nimport { whoamiCommand } from './commands/whoami.js'\nimport { usageCommand } from './commands/usage.js'\nimport { billingCommand } from './commands/billing.js'\nimport { validateCommand } from './commands/validate.js'\nimport { apiKeysListCommand } from './commands/api-keys/list.js'\nimport { apiKeysCreateCommand } from './commands/api-keys/create.js'\nimport { apiKeysRevokeCommand } from './commands/api-keys/revoke.js'\nimport { apiKeysRotateCommand } from './commands/api-keys/rotate.js'\n\n// Import utilities\nimport { setupErrorHandlers } from './utils/error-handler.js'\n\nconst VERSION = '1.0.0'\n\nfunction createCLI(): Command {\n const program = new Command()\n\n program\n .name('question-banks')\n .description('CLI tool for Question Banks API - authentication, API keys, usage, billing')\n .version(VERSION, '-v, --version', 'Display version number')\n .helpOption('-h, --help', 'Display help information')\n\n // Authentication commands\n loginCommand(program)\n logoutCommand(program)\n whoamiCommand(program)\n\n // Usage & billing\n usageCommand(program)\n billingCommand(program)\n\n // Local validation\n validateCommand(program)\n\n // API key management (as subcommands)\n const apiKeys = program\n .command('api-keys')\n .description('Manage API keys')\n .alias('keys')\n\n apiKeysListCommand(apiKeys)\n apiKeysCreateCommand(apiKeys)\n apiKeysRevokeCommand(apiKeys)\n apiKeysRotateCommand(apiKeys)\n\n // Custom help\n program.addHelpText('after', `\n${pc.bold('Examples:')}\n $ question-banks login ${pc.dim('# Authenticate with Question Banks API')}\n $ question-banks whoami ${pc.dim('# Show account information')}\n $ question-banks usage ${pc.dim('# Display API usage statistics')}\n $ question-banks api-keys list ${pc.dim('# List all API keys')}\n $ question-banks billing ${pc.dim('# Open Stripe billing portal')}\n $ question-banks validate file.json ${pc.dim('# Validate questions locally')}\n\n${pc.bold('Documentation:')}\n https://docs.question-banks.dev\n`)\n\n return program\n}\n\nexport async function run(): Promise<void> {\n setupErrorHandlers()\n\n const program = createCLI()\n await program.parseAsync(process.argv)\n}\n\n// Export for programmatic use\nexport { createCLI }\n\n// Run if executed directly\nrun()\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@telebort/question-banks-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CLI tool for Question Banks API - authentication, API keys, usage, billing",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"question-banks": "./bin/question-banks.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"bin",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsup",
|
|
18
|
+
"dev": "tsup --watch",
|
|
19
|
+
"typecheck": "tsc --noEmit",
|
|
20
|
+
"test": "vitest",
|
|
21
|
+
"db:generate": "drizzle-kit generate",
|
|
22
|
+
"db:migrate": "drizzle-kit migrate",
|
|
23
|
+
"db:push": "drizzle-kit push",
|
|
24
|
+
"db:studio": "drizzle-kit studio",
|
|
25
|
+
"prepublishOnly": "npm run build"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@neondatabase/serverless": "^0.10.4",
|
|
29
|
+
"@telebort/question-banks": "^1.0.0",
|
|
30
|
+
"@upstash/ratelimit": "^2.0.5",
|
|
31
|
+
"@upstash/redis": "^1.34.3",
|
|
32
|
+
"@vercel/node": "^3.2.0",
|
|
33
|
+
"cli-table3": "^0.6.5",
|
|
34
|
+
"commander": "^12.1.0",
|
|
35
|
+
"date-fns": "^4.1.0",
|
|
36
|
+
"drizzle-orm": "^0.38.3",
|
|
37
|
+
"jose": "^6.1.3",
|
|
38
|
+
"open": "^10.1.0",
|
|
39
|
+
"ora": "^8.1.1",
|
|
40
|
+
"picocolors": "^1.1.1",
|
|
41
|
+
"stripe": "^17.4.0",
|
|
42
|
+
"zod": "^3.24.1"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^22.10.2",
|
|
46
|
+
"drizzle-kit": "^0.30.1",
|
|
47
|
+
"tsup": "^8.3.5",
|
|
48
|
+
"typescript": "^5.7.2",
|
|
49
|
+
"vitest": "^2.1.8"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18"
|
|
53
|
+
},
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public",
|
|
56
|
+
"registry": "https://registry.npmjs.org/"
|
|
57
|
+
},
|
|
58
|
+
"keywords": [
|
|
59
|
+
"question-banks",
|
|
60
|
+
"exit-tickets",
|
|
61
|
+
"cli",
|
|
62
|
+
"authentication",
|
|
63
|
+
"api-keys",
|
|
64
|
+
"billing",
|
|
65
|
+
"education",
|
|
66
|
+
"assessment"
|
|
67
|
+
],
|
|
68
|
+
"author": "Telebort",
|
|
69
|
+
"license": "MIT",
|
|
70
|
+
"repository": {
|
|
71
|
+
"type": "git",
|
|
72
|
+
"url": "https://github.com/telebort/question-banks"
|
|
73
|
+
},
|
|
74
|
+
"homepage": "https://docs.question-banks.dev/cli",
|
|
75
|
+
"bugs": {
|
|
76
|
+
"url": "https://github.com/telebort/question-banks/issues"
|
|
77
|
+
}
|
|
78
|
+
}
|