@donebear/cli 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.mjs","names":["isRecord","firstDefined","getOptionalSupabaseConfig","ISO_YMD_REGEX"],"sources":["../src/constants.ts","../src/errors.ts","../src/storage.ts","../src/env.ts","../src/supabase.ts","../src/auth-session.ts","../src/browser.ts","../src/command-parsers.ts","../src/oauth.ts","../src/oauth-callback.ts","../src/output.ts","../src/runtime.ts","../src/commands/auth.ts","../src/context-store.ts","../src/manage-api.ts","../src/command-context.ts","../src/task-defaults.ts","../src/command-helpers.ts","../src/workspace-context.ts","../src/commands/history.ts","../src/commands/interactive.ts","../src/commands/label.ts","../src/commands/project.ts","../src/commands/task.ts","../src/commands/search.ts","../src/commands/team.ts","../src/commands/today.ts","../src/commands/whoami.ts","../src/commands/workspace.ts","../src/cli.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const CLI_NAME = \"donebear\";\n\nexport const DONEBEAR_TOKEN_ENV = \"DONEBEAR_TOKEN\";\nexport const DONEBEAR_DEBUG_ENV = \"DONEBEAR_DEBUG\";\nexport const DONEBEAR_CONFIG_DIR_ENV = \"DONEBEAR_CONFIG_DIR\";\nexport const DONEBEAR_SUPABASE_URL_ENV = \"DONEBEAR_SUPABASE_URL\";\nexport const DONEBEAR_SUPABASE_KEY_ENV = \"DONEBEAR_SUPABASE_PUBLISHABLE_KEY\";\nexport const DONEBEAR_API_URL_ENV = \"DONEBEAR_API_URL\";\n\nexport const FALLBACK_SUPABASE_URL_ENV_KEYS = [\n \"NEXT_PUBLIC_SUPABASE_URL\",\n \"SUPABASE_URL\",\n] as const;\n\nexport const FALLBACK_SUPABASE_KEY_ENV_KEYS = [\n \"NEXT_PUBLIC_SUPABASE_PUBLISHABLE_OR_ANON_KEY\",\n \"SUPABASE_ANON_KEY\",\n] as const;\nexport const FALLBACK_API_URL_ENV_KEYS = [\n \"NEXT_PUBLIC_RESERVE_MANAGE_API\",\n] as const;\nexport const DEFAULT_API_URL = \"http://127.0.0.1:3001\";\n\nexport const DEFAULT_OAUTH_PROVIDER = \"google\";\nexport const DEFAULT_OAUTH_CALLBACK_PORT = 8787;\nexport const DEFAULT_OAUTH_CALLBACK_PATH = \"/auth/callback\";\nexport const DEFAULT_OAUTH_TIMEOUT_SECONDS = 180;\n\nfunction getDefaultConfigBaseDir(): string {\n if (process.platform === \"win32\") {\n return process.env.APPDATA ?? join(homedir(), \"AppData\", \"Roaming\");\n }\n\n return process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n}\n\nconst configBaseDir = getDefaultConfigBaseDir();\n\nexport const CONFIG_DIR =\n process.env[DONEBEAR_CONFIG_DIR_ENV] ?? join(configBaseDir, CLI_NAME);\n\nexport const AUTH_FILE_PATH = join(CONFIG_DIR, \"auth.json\");\nexport const CONTEXT_FILE_PATH = join(CONFIG_DIR, \"context.json\");\n","export const EXIT_CODES = {\n SUCCESS: 0,\n ERROR: 1,\n CANCELLED: 2,\n AUTH_REQUIRED: 4,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\nexport class CliError extends Error {\n readonly exitCode: ExitCode;\n\n constructor(message: string, exitCode: ExitCode = EXIT_CODES.ERROR) {\n super(message);\n this.name = \"CliError\";\n this.exitCode = exitCode;\n }\n}\n\nexport function toCliError(error: unknown): CliError {\n if (error instanceof CliError) {\n return error;\n }\n\n if (error instanceof Error) {\n return new CliError(error.message, EXIT_CODES.ERROR);\n }\n\n return new CliError(\"Unknown error\", EXIT_CODES.ERROR);\n}\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { AUTH_FILE_PATH, CONFIG_DIR } from \"./constants.js\";\nimport { CliError, EXIT_CODES } from \"./errors.js\";\nimport type {\n AuthFileData,\n OAuthProvider,\n StoredAuthSession,\n} from \"./types.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isOAuthProvider(value: unknown): value is OAuthProvider {\n return value === \"google\" || value === \"github\";\n}\n\nfunction parseStoredAuthSession(value: unknown): StoredAuthSession | null {\n if (!isRecord(value)) {\n return null;\n }\n\n if (typeof value.accessToken !== \"string\") {\n return null;\n }\n\n if (value.refreshToken !== null && typeof value.refreshToken !== \"string\") {\n return null;\n }\n\n if (value.tokenType !== null && typeof value.tokenType !== \"string\") {\n return null;\n }\n\n if (value.expiresAt !== null && typeof value.expiresAt !== \"string\") {\n return null;\n }\n\n if (!isOAuthProvider(value.provider)) {\n return null;\n }\n\n const user = value.user;\n if (\n user !== null &&\n (!isRecord(user) ||\n typeof user.id !== \"string\" ||\n (user.email !== null && typeof user.email !== \"string\"))\n ) {\n return null;\n }\n\n if (typeof value.createdAt !== \"string\") {\n return null;\n }\n\n const parsedUser =\n user === null\n ? null\n : {\n id: user.id as string,\n email: (user.email as string | null) ?? null,\n };\n\n return {\n accessToken: value.accessToken,\n refreshToken: value.refreshToken,\n tokenType: value.tokenType,\n expiresAt: value.expiresAt,\n provider: value.provider,\n user: parsedUser,\n createdAt: value.createdAt,\n };\n}\n\nfunction parseAuthFile(payload: string): AuthFileData {\n const parsed = JSON.parse(payload) as unknown;\n\n if (!isRecord(parsed) || parsed.version !== 1) {\n throw new CliError(\n `Invalid auth cache format in ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n\n const session = parseStoredAuthSession(parsed.session);\n\n if (!session) {\n throw new CliError(\n `Invalid auth session in ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n\n return {\n version: 1,\n session,\n };\n}\n\nexport async function readStoredAuthSession(): Promise<StoredAuthSession | null> {\n try {\n const raw = await readFile(AUTH_FILE_PATH, \"utf8\");\n const parsed = parseAuthFile(raw);\n return parsed.session;\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") {\n return null;\n }\n\n if (error instanceof CliError) {\n throw error;\n }\n\n throw new CliError(\n `Failed to read credentials from ${AUTH_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n}\n\nexport async function writeStoredAuthSession(\n session: StoredAuthSession\n): Promise<void> {\n const payload: AuthFileData = {\n version: 1,\n session,\n };\n\n await mkdir(CONFIG_DIR, {\n recursive: true,\n mode: 0o700,\n });\n\n await writeFile(AUTH_FILE_PATH, `${JSON.stringify(payload, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n\nexport async function clearStoredAuthSession(): Promise<void> {\n await rm(AUTH_FILE_PATH, {\n force: true,\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { config as loadDotEnvFile } from \"dotenv\";\n\nconst DEFAULT_ENV_FILES = [\n \".env.local\",\n \".env\",\n \"apps/manage-frontend/.env.local\",\n \"apps/manage-api/.env\",\n] as const;\n\nlet loaded = false;\n\nexport function loadCliEnvironmentFiles(): void {\n if (loaded) {\n return;\n }\n\n for (const relativePath of DEFAULT_ENV_FILES) {\n const absolutePath = resolve(process.cwd(), relativePath);\n\n if (!existsSync(absolutePath)) {\n continue;\n }\n\n loadDotEnvFile({\n path: absolutePath,\n override: false,\n quiet: true,\n });\n }\n\n loaded = true;\n}\n\nexport function readEnvValue(key: string): string | undefined {\n const value = process.env[key];\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n","import {\n createClient,\n type Session,\n type SupabaseClient,\n type SupportedStorage,\n type User,\n} from \"@supabase/supabase-js\";\nimport {\n DONEBEAR_SUPABASE_KEY_ENV,\n DONEBEAR_SUPABASE_URL_ENV,\n FALLBACK_SUPABASE_KEY_ENV_KEYS,\n FALLBACK_SUPABASE_URL_ENV_KEYS,\n} from \"./constants.js\";\nimport { readEnvValue } from \"./env.js\";\nimport { CliError, EXIT_CODES } from \"./errors.js\";\nimport type {\n OAuthProvider,\n StoredAuthSession,\n SupabaseConfig,\n} from \"./types.js\";\n\nclass MemoryStorage implements SupportedStorage {\n private readonly values = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.values.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.values.set(key, value);\n }\n\n removeItem(key: string): void {\n this.values.delete(key);\n }\n}\n\nfunction firstDefined(keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = readEnvValue(key);\n\n if (value) {\n return value;\n }\n }\n\n return undefined;\n}\n\nexport function resolveSupabaseConfig(): SupabaseConfig {\n const url =\n readEnvValue(DONEBEAR_SUPABASE_URL_ENV) ??\n firstDefined(FALLBACK_SUPABASE_URL_ENV_KEYS);\n\n const publishableKey =\n readEnvValue(DONEBEAR_SUPABASE_KEY_ENV) ??\n firstDefined(FALLBACK_SUPABASE_KEY_ENV_KEYS);\n\n if (!(url && publishableKey)) {\n throw new CliError(\n [\n \"Supabase configuration is missing.\",\n `Set ${DONEBEAR_SUPABASE_URL_ENV} and ${DONEBEAR_SUPABASE_KEY_ENV}.`,\n `Fallback keys are also supported: ${FALLBACK_SUPABASE_URL_ENV_KEYS.join(\n \", \"\n )} and ${FALLBACK_SUPABASE_KEY_ENV_KEYS.join(\", \")}.`,\n ].join(\" \"),\n EXIT_CODES.ERROR\n );\n }\n\n return {\n url,\n publishableKey,\n };\n}\n\nexport function createSupabaseClient(\n config: SupabaseConfig,\n options?: {\n storage?: SupportedStorage;\n persistSession?: boolean;\n }\n): SupabaseClient {\n return createClient(config.url, config.publishableKey, {\n auth: {\n flowType: \"pkce\",\n autoRefreshToken: false,\n detectSessionInUrl: false,\n persistSession: options?.persistSession ?? false,\n storage: options?.storage,\n },\n });\n}\n\nexport function createPkceSupabaseClient(\n config: SupabaseConfig\n): SupabaseClient {\n return createSupabaseClient(config, {\n storage: new MemoryStorage(),\n persistSession: true,\n });\n}\n\nexport function toStoredAuthSession(\n session: Session,\n provider: OAuthProvider\n): StoredAuthSession {\n const expiresAt =\n typeof session.expires_at === \"number\"\n ? new Date(session.expires_at * 1000).toISOString()\n : null;\n\n return {\n accessToken: session.access_token,\n refreshToken: session.refresh_token ?? null,\n tokenType: session.token_type ?? null,\n expiresAt,\n provider,\n user: session.user\n ? {\n id: session.user.id,\n email: session.user.email ?? null,\n }\n : null,\n createdAt: new Date().toISOString(),\n };\n}\n\nexport async function refreshSupabaseSession(\n config: SupabaseConfig,\n refreshToken: string\n): Promise<Session> {\n const client = createSupabaseClient(config);\n const { data, error } = await client.auth.refreshSession({\n refresh_token: refreshToken,\n });\n\n if (error) {\n throw new CliError(\n `Failed to refresh session: ${error.message}`,\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n if (!data.session) {\n throw new CliError(\n \"No session returned during refresh\",\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return data.session;\n}\n\nexport async function getSupabaseUser(\n config: SupabaseConfig,\n accessToken: string\n): Promise<User> {\n const client = createSupabaseClient(config);\n const { data, error } = await client.auth.getUser(accessToken);\n\n if (error) {\n throw new CliError(\n `Failed to load user: ${error.message}`,\n EXIT_CODES.ERROR\n );\n }\n\n if (!data.user) {\n throw new CliError(\"No user returned for current token\", EXIT_CODES.ERROR);\n }\n\n return data.user;\n}\n","import { DONEBEAR_TOKEN_ENV } from \"./constants.js\";\nimport {\n clearStoredAuthSession,\n readStoredAuthSession,\n writeStoredAuthSession,\n} from \"./storage.js\";\nimport { refreshSupabaseSession, toStoredAuthSession } from \"./supabase.js\";\nimport type {\n CliContext,\n ResolvedAuthToken,\n StoredAuthSession,\n SupabaseConfig,\n} from \"./types.js\";\n\ninterface JwtClaims {\n exp?: number;\n email?: string;\n sub?: string;\n}\n\nfunction parseJwtBase64Url(input: string): string {\n const normalized = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n return Buffer.from(padded, \"base64\").toString(\"utf8\");\n}\n\nexport function parseJwtClaims(token: string): JwtClaims | null {\n const parts = token.split(\".\");\n const payloadPart = parts.at(1);\n\n if (!payloadPart) {\n return null;\n }\n\n try {\n const payload = parseJwtBase64Url(payloadPart);\n const parsed = JSON.parse(payload) as unknown;\n\n if (typeof parsed !== \"object\" || parsed === null) {\n return null;\n }\n\n const claims = parsed as Record<string, unknown>;\n\n return {\n exp: typeof claims.exp === \"number\" ? claims.exp : undefined,\n email: typeof claims.email === \"string\" ? claims.email : undefined,\n sub: typeof claims.sub === \"string\" ? claims.sub : undefined,\n };\n } catch {\n return null;\n }\n}\n\nfunction expiryFromClaims(claims: JwtClaims | null): string | null {\n if (!claims || typeof claims.exp !== \"number\") {\n return null;\n }\n\n return new Date(claims.exp * 1000).toISOString();\n}\n\nfunction userFromClaims(claims: JwtClaims | null): ResolvedAuthToken[\"user\"] {\n if (!(claims?.sub || claims?.email)) {\n return null;\n }\n\n return {\n id: claims.sub ?? \"unknown\",\n email: claims.email ?? null,\n };\n}\n\nfunction nowUnixSeconds(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nfunction isExpired(session: StoredAuthSession): boolean {\n if (!session.expiresAt) {\n return false;\n }\n\n const expiresAtMs = Date.parse(session.expiresAt);\n\n if (Number.isNaN(expiresAtMs)) {\n return false;\n }\n\n return expiresAtMs <= Date.now();\n}\n\nfunction shouldRefresh(session: StoredAuthSession): boolean {\n if (!session.expiresAt) {\n return false;\n }\n\n const expiresAtMs = Date.parse(session.expiresAt);\n\n if (Number.isNaN(expiresAtMs)) {\n return false;\n }\n\n return expiresAtMs - Date.now() <= 60_000;\n}\n\nfunction tokenFromRaw(\n token: string,\n source: ResolvedAuthToken[\"source\"]\n): ResolvedAuthToken {\n const claims = parseJwtClaims(token);\n\n return {\n token,\n source,\n expiresAt: expiryFromClaims(claims),\n user: userFromClaims(claims),\n };\n}\n\nexport async function resolveAuthToken(\n context: CliContext,\n config: SupabaseConfig | null\n): Promise<ResolvedAuthToken | null> {\n if (context.tokenOverride) {\n return tokenFromRaw(context.tokenOverride, \"flag\");\n }\n\n const envToken = process.env[DONEBEAR_TOKEN_ENV]?.trim();\n\n if (envToken) {\n return tokenFromRaw(envToken, \"environment\");\n }\n\n const session = await readStoredAuthSession();\n\n if (!session) {\n return null;\n }\n\n if (!(shouldRefresh(session) || isExpired(session))) {\n return {\n token: session.accessToken,\n source: \"stored\",\n expiresAt: session.expiresAt,\n user: session.user,\n };\n }\n\n if (!(session.refreshToken && config)) {\n if (isExpired(session)) {\n await clearStoredAuthSession();\n return null;\n }\n\n return {\n token: session.accessToken,\n source: \"stored\",\n expiresAt: session.expiresAt,\n user: session.user,\n };\n }\n\n const refreshedSession = await refreshSupabaseSession(\n config,\n session.refreshToken\n );\n const updatedSession = toStoredAuthSession(\n refreshedSession,\n session.provider\n );\n await writeStoredAuthSession(updatedSession);\n\n return {\n token: updatedSession.accessToken,\n source: \"stored\",\n expiresAt: updatedSession.expiresAt,\n user: updatedSession.user,\n };\n}\n\nexport function resolveTokenStatus(token: ResolvedAuthToken): {\n expiresInSeconds: number | null;\n expired: boolean;\n} {\n const claims = parseJwtClaims(token.token);\n\n if (!claims?.exp) {\n return {\n expiresInSeconds: null,\n expired: false,\n };\n }\n\n const expiresInSeconds = claims.exp - nowUnixSeconds();\n\n return {\n expiresInSeconds,\n expired: expiresInSeconds <= 0,\n };\n}\n","import { spawn } from \"node:child_process\";\n\ninterface OpenCommand {\n command: string;\n args: string[];\n}\n\nfunction getOpenCommand(url: string): OpenCommand {\n if (process.platform === \"darwin\") {\n return {\n command: \"open\",\n args: [url],\n };\n }\n\n if (process.platform === \"win32\") {\n return {\n command: \"cmd\",\n args: [\"/c\", \"start\", \"\", url],\n };\n }\n\n return {\n command: \"xdg-open\",\n args: [url],\n };\n}\n\nexport async function openUrl(url: string): Promise<boolean> {\n const openCommand = getOpenCommand(url);\n\n return await new Promise<boolean>((resolve) => {\n try {\n const child = spawn(openCommand.command, openCommand.args, {\n detached: true,\n stdio: \"ignore\",\n });\n\n child.once(\"error\", () => {\n resolve(false);\n });\n\n child.once(\"spawn\", () => {\n child.unref();\n resolve(true);\n });\n } catch {\n resolve(false);\n }\n });\n}\n","export function parsePositiveInteger(value: string, label: string): number {\n const parsed = Number.parseInt(value, 10);\n\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive integer`);\n }\n\n return parsed;\n}\n","import { randomBytes } from \"node:crypto\";\n\nexport function createOAuthState(): string {\n return randomBytes(24).toString(\"hex\");\n}\n","import { createServer } from \"node:http\";\nimport { CliError, EXIT_CODES } from \"./errors.js\";\n\nexport interface OAuthCallbackOptions {\n redirectUrl: URL;\n expectedState: string;\n timeoutMs: number;\n}\n\nfunction successHtml(): string {\n return `<!doctype html><html><head><meta charset=\"utf-8\"/><title>Done Bear CLI</title></head><body><h1>Authentication complete</h1><p>You can return to your terminal.</p></body></html>`;\n}\n\nfunction errorHtml(message: string): string {\n return `<!doctype html><html><head><meta charset=\"utf-8\"/><title>Done Bear CLI</title></head><body><h1>Authentication failed</h1><p>${message}</p></body></html>`;\n}\n\nexport async function waitForOAuthCode(\n options: OAuthCallbackOptions\n): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const host = options.redirectUrl.hostname;\n const port = Number(options.redirectUrl.port);\n const pathname = options.redirectUrl.pathname;\n\n if (!Number.isInteger(port) || port <= 0) {\n reject(\n new CliError(\n \"OAuth redirect URL requires an explicit port\",\n EXIT_CODES.ERROR\n )\n );\n return;\n }\n\n let settled = false;\n\n const finish = (result: { code?: string; error?: CliError }): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeout);\n\n server.close(() => {\n if (result.error) {\n reject(result.error);\n return;\n }\n\n resolve(result.code ?? \"\");\n });\n };\n\n const server = createServer((request, response) => {\n if (!request.url) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Missing request URL\"));\n finish({\n error: new CliError(\n \"OAuth callback is missing a request URL\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const url = new URL(request.url, options.redirectUrl.origin);\n\n if (url.pathname !== pathname) {\n response.writeHead(404, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Invalid callback path\"));\n return;\n }\n\n const providerError = url.searchParams.get(\"error\");\n if (providerError) {\n const description =\n url.searchParams.get(\"error_description\") ?? providerError;\n\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(description));\n\n finish({\n error: new CliError(\n `OAuth provider returned an error: ${description}`,\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const state = url.searchParams.get(\"state\");\n if (state !== options.expectedState) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"State verification failed\"));\n\n finish({\n error: new CliError(\n \"OAuth state verification failed\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n const code = url.searchParams.get(\"code\");\n if (!code) {\n response.writeHead(400, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(errorHtml(\"Authorization code was missing\"));\n\n finish({\n error: new CliError(\n \"OAuth callback is missing an authorization code\",\n EXIT_CODES.ERROR\n ),\n });\n return;\n }\n\n response.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n response.end(successHtml());\n finish({ code });\n });\n\n server.on(\"error\", (error) => {\n finish({\n error: new CliError(\n `Failed to start callback server on ${host}:${port}: ${error.message}`,\n EXIT_CODES.ERROR\n ),\n });\n });\n\n const timeout = setTimeout(() => {\n finish({\n error: new CliError(\n \"Timed out waiting for OAuth callback\",\n EXIT_CODES.CANCELLED\n ),\n });\n }, options.timeoutMs);\n\n server.listen(port, host);\n });\n}\n","import { execSync } from \"node:child_process\";\nimport { styleText } from \"node:util\";\nimport type { CliContext } from \"./types.js\";\n\nfunction writeLine(stream: NodeJS.WriteStream, message: string): void {\n stream.write(`${message}\\n`);\n}\n\nfunction colorize(\n context: CliContext,\n format: Parameters<typeof styleText>[0],\n message: string\n): string {\n if (!context.color) {\n return message;\n }\n\n return styleText(format, message);\n}\n\nexport function writeJson(value: unknown): void {\n writeLine(process.stdout, JSON.stringify(value, null, 2));\n}\n\nexport function writeInfo(context: CliContext, message: string): void {\n writeLine(process.stdout, colorize(context, \"cyan\", message));\n}\n\nexport function writeSuccess(context: CliContext, message: string): void {\n writeLine(process.stdout, colorize(context, \"green\", message));\n}\n\nexport function writeWarning(context: CliContext, message: string): void {\n writeLine(process.stderr, colorize(context, \"yellow\", message));\n}\n\nexport function writeError(context: CliContext, message: string): void {\n writeLine(process.stderr, colorize(context, \"red\", message));\n}\n\nexport function writeDebug(context: CliContext, message: string): void {\n if (!context.debug) {\n return;\n }\n\n writeLine(process.stderr, colorize(context, \"gray\", `[debug] ${message}`));\n}\n\nexport function writeTotal(context: CliContext, count: number): void {\n writeLine(process.stdout, colorize(context, \"cyan\", String(count)));\n}\n\nfunction escapeCsvField(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport function writeCsv(headers: string[], rows: string[][]): void {\n writeLine(process.stdout, headers.map(escapeCsvField).join(\",\"));\n for (const row of rows) {\n writeLine(process.stdout, row.map(escapeCsvField).join(\",\"));\n }\n}\n\nexport function writeTsv(headers: string[], rows: string[][]): void {\n writeLine(process.stdout, headers.join(\"\\t\"));\n for (const row of rows) {\n writeLine(process.stdout, row.join(\"\\t\"));\n }\n}\n\n/**\n * Handles --total, --format csv, --format tsv output (including --copy for tabular data).\n * Returns true if the format was handled; caller renders text mode if false.\n */\nexport function writeFormattedRows(\n context: CliContext,\n totalCount: number,\n headers: string[],\n rows: string[][]\n): boolean {\n if (context.total) {\n writeTotal(context, totalCount);\n return true;\n }\n\n if (context.format === \"csv\") {\n writeCsv(headers, rows);\n if (context.copy) {\n copyToClipboard(\n [headers.join(\",\"), ...rows.map((r) => r.join(\",\"))].join(\"\\n\")\n );\n }\n return true;\n }\n\n if (context.format === \"tsv\") {\n writeTsv(headers, rows);\n if (context.copy) {\n copyToClipboard(\n [headers.join(\"\\t\"), ...rows.map((r) => r.join(\"\\t\"))].join(\"\\n\")\n );\n }\n return true;\n }\n\n return false;\n}\n\nexport function copyToClipboard(text: string): boolean {\n try {\n if (process.platform === \"darwin\") {\n execSync(\"pbcopy\", { input: text });\n } else if (process.platform === \"win32\") {\n execSync(\"clip\", { input: text });\n } else {\n try {\n execSync(\"xclip -selection clipboard\", { input: text });\n } catch {\n execSync(\"xsel --clipboard --input\", { input: text });\n }\n }\n return true;\n } catch {\n return false;\n }\n}\n","import type { Command } from \"commander\";\nimport { DONEBEAR_DEBUG_ENV, DONEBEAR_TOKEN_ENV } from \"./constants.js\";\nimport { toCliError } from \"./errors.js\";\nimport { writeDebug, writeError, writeJson } from \"./output.js\";\nimport type { CliContext, OutputFormat } from \"./types.js\";\n\ninterface GlobalOptions {\n json?: boolean;\n color?: boolean;\n debug?: boolean;\n token?: string;\n apiUrl?: string;\n format?: string;\n copy?: boolean;\n total?: boolean;\n}\n\nfunction parseOutputFormat(value: string | undefined): OutputFormat {\n switch (value?.trim().toLowerCase()) {\n case \"json\":\n return \"json\";\n case \"csv\":\n return \"csv\";\n case \"tsv\":\n return \"tsv\";\n default:\n return \"text\";\n }\n}\n\nexport function contextFromCommand(command: Command): CliContext {\n const options = command.optsWithGlobals<GlobalOptions>();\n const rawFormat = parseOutputFormat(options.format);\n const format = options.json === true ? \"json\" : rawFormat;\n\n return {\n json: format === \"json\",\n color: options.color !== false && process.env.NO_COLOR !== \"1\",\n debug: options.debug === true || process.env[DONEBEAR_DEBUG_ENV] === \"1\",\n tokenOverride: options.token?.trim() || null,\n apiUrlOverride: options.apiUrl?.trim() || null,\n format,\n copy: options.copy === true,\n total: options.total === true,\n };\n}\n\nexport function contextFromArgv(argv: string[]): CliContext {\n const hasJsonFlag = argv.includes(\"--json\");\n const rawFormat = argv.some(\n (a) =>\n a === \"--format=json\" ||\n (argv[argv.indexOf(\"--format\") + 1] === \"json\" && a === \"--format\")\n )\n ? \"json\"\n : \"text\";\n const format: OutputFormat = hasJsonFlag ? \"json\" : rawFormat;\n return {\n json: format === \"json\",\n color: !argv.includes(\"--no-color\") && process.env.NO_COLOR !== \"1\",\n debug: argv.includes(\"--debug\") || process.env[DONEBEAR_DEBUG_ENV] === \"1\",\n tokenOverride: null,\n apiUrlOverride: null,\n format,\n copy: argv.includes(\"--copy\"),\n total: argv.includes(\"--total\"),\n };\n}\n\nexport async function runWithErrorHandling(\n context: CliContext,\n action: () => Promise<void>\n): Promise<void> {\n try {\n await action();\n } catch (error) {\n const cliError = toCliError(error);\n\n if (context.json) {\n writeJson({\n ok: false,\n error: {\n message: cliError.message,\n exitCode: cliError.exitCode,\n },\n });\n } else {\n writeError(context, cliError.message);\n }\n\n if (\n context.debug &&\n error instanceof Error &&\n typeof error.stack === \"string\"\n ) {\n writeDebug(context, error.stack);\n }\n\n process.exitCode = cliError.exitCode;\n }\n}\n\nexport function resolveTokenFromEnv(context: CliContext): string | null {\n if (context.tokenOverride) {\n return context.tokenOverride;\n }\n\n return process.env[DONEBEAR_TOKEN_ENV]?.trim() || null;\n}\n","import type { Provider } from \"@supabase/supabase-js\";\nimport type { Command } from \"commander\";\nimport { resolveAuthToken, resolveTokenStatus } from \"../auth-session.js\";\nimport { openUrl } from \"../browser.js\";\nimport { parsePositiveInteger } from \"../command-parsers.js\";\nimport {\n DEFAULT_OAUTH_CALLBACK_PATH,\n DEFAULT_OAUTH_CALLBACK_PORT,\n DEFAULT_OAUTH_PROVIDER,\n DEFAULT_OAUTH_TIMEOUT_SECONDS,\n} from \"../constants.js\";\nimport { EXIT_CODES } from \"../errors.js\";\nimport { createOAuthState } from \"../oauth.js\";\nimport { waitForOAuthCode } from \"../oauth-callback.js\";\nimport { writeInfo, writeJson, writeSuccess, writeWarning } from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport {\n clearStoredAuthSession,\n readStoredAuthSession,\n writeStoredAuthSession,\n} from \"../storage.js\";\nimport {\n createPkceSupabaseClient,\n resolveSupabaseConfig,\n toStoredAuthSession,\n} from \"../supabase.js\";\nimport type { CliContext, OAuthProvider } from \"../types.js\";\n\ninterface AuthLoginOptions {\n provider: string;\n port: number;\n timeout: number;\n open: boolean;\n}\n\nconst SUPPORTED_PROVIDERS: readonly OAuthProvider[] = [\"google\", \"github\"];\n\nfunction parseProvider(value: string): OAuthProvider {\n const normalized = value.trim().toLowerCase();\n\n if (SUPPORTED_PROVIDERS.some((provider) => provider === normalized)) {\n return normalized as OAuthProvider;\n }\n\n throw new Error(\n `Unsupported provider \"${value}\". Supported providers: ${SUPPORTED_PROVIDERS.join(\", \")}.`\n );\n}\n\nasync function runLogin(\n context: CliContext,\n options: AuthLoginOptions\n): Promise<void> {\n const provider = parseProvider(options.provider);\n const config = resolveSupabaseConfig();\n const redirectUrl = new URL(\n `http://127.0.0.1:${options.port}${DEFAULT_OAUTH_CALLBACK_PATH}`\n );\n\n const state = createOAuthState();\n const client = createPkceSupabaseClient(config);\n\n const { data: oauthStart, error: oauthStartError } =\n await client.auth.signInWithOAuth({\n provider: provider as Provider,\n options: {\n redirectTo: redirectUrl.toString(),\n queryParams: {\n state,\n },\n skipBrowserRedirect: true,\n },\n });\n\n if (oauthStartError) {\n throw new Error(`Failed to start OAuth flow: ${oauthStartError.message}`);\n }\n\n if (!oauthStart.url) {\n throw new Error(\"Supabase did not return an OAuth URL\");\n }\n\n const callbackPromise = waitForOAuthCode({\n redirectUrl,\n expectedState: state,\n timeoutMs: options.timeout * 1000,\n });\n\n if (!options.open) {\n writeInfo(context, \"Open this URL to continue authentication:\");\n writeInfo(context, oauthStart.url);\n } else if (await openUrl(oauthStart.url)) {\n writeInfo(context, \"Opened browser for authentication.\");\n } else {\n writeWarning(\n context,\n \"Failed to open the browser automatically. Open this URL manually:\"\n );\n writeInfo(context, oauthStart.url);\n }\n\n const authorizationCode = await callbackPromise;\n\n const { data: sessionData, error: exchangeError } =\n await client.auth.exchangeCodeForSession(authorizationCode);\n\n if (exchangeError) {\n throw new Error(`OAuth callback exchange failed: ${exchangeError.message}`);\n }\n\n if (!sessionData.session) {\n throw new Error(\"OAuth callback did not return a session\");\n }\n\n const storedSession = toStoredAuthSession(sessionData.session, provider);\n await writeStoredAuthSession(storedSession);\n\n if (context.json) {\n writeJson({\n ok: true,\n provider,\n user: storedSession.user,\n expiresAt: storedSession.expiresAt,\n source: \"stored\",\n });\n return;\n }\n\n writeSuccess(context, \"Authentication succeeded.\");\n\n if (storedSession.user?.email) {\n writeInfo(context, `Signed in as ${storedSession.user.email}`);\n }\n}\n\nasync function runStatus(context: CliContext): Promise<void> {\n const config = getOptionalSupabaseConfig();\n\n const token = await resolveAuthToken(context, config);\n\n if (!token) {\n if (context.json) {\n writeJson({\n authenticated: false,\n source: null,\n });\n } else {\n writeInfo(context, \"Not authenticated.\");\n writeInfo(context, \"Run `donebear auth login` to authenticate.\");\n }\n\n process.exitCode = EXIT_CODES.AUTH_REQUIRED;\n return;\n }\n\n const tokenStatus = resolveTokenStatus(token);\n\n if (context.json) {\n writeJson({\n authenticated: true,\n source: token.source,\n user: token.user,\n expiresAt: token.expiresAt,\n expiresInSeconds: tokenStatus.expiresInSeconds,\n expired: tokenStatus.expired,\n });\n return;\n }\n\n writeSuccess(context, \"Authenticated.\");\n writeInfo(context, `Source: ${token.source}`);\n\n if (token.user?.email) {\n writeInfo(context, `User: ${token.user.email}`);\n }\n\n if (token.expiresAt) {\n writeInfo(context, `Expires at: ${token.expiresAt}`);\n }\n}\n\nasync function runLogout(context: CliContext): Promise<void> {\n const existingSession = await readStoredAuthSession();\n await clearStoredAuthSession();\n\n if (context.json) {\n writeJson({\n ok: true,\n removedStoredCredentials: existingSession !== null,\n });\n return;\n }\n\n if (existingSession) {\n writeSuccess(context, \"Stored credentials removed.\");\n } else {\n writeInfo(context, \"No stored credentials found.\");\n }\n}\n\nfunction getOptionalSupabaseConfig() {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n}\n\nexport function registerAuthCommands(program: Command): void {\n const auth = program\n .command(\"auth\")\n .description(\"Authenticate donebear CLI\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear auth\n donebear auth login --provider github\n donebear auth status --json\n donebear auth logout\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runStatus(context);\n });\n });\n\n auth\n .command(\"login\")\n .description(\"Authenticate with OAuth in the browser\")\n .option(\n \"-p, --provider <provider>\",\n `OAuth provider (${SUPPORTED_PROVIDERS.join(\"|\")})`,\n DEFAULT_OAUTH_PROVIDER\n )\n .option(\n \"--port <port>\",\n \"Loopback callback port\",\n (value: string): number => parsePositiveInteger(value, \"Port\"),\n DEFAULT_OAUTH_CALLBACK_PORT\n )\n .option(\n \"--timeout <seconds>\",\n \"OAuth timeout in seconds\",\n (value: string): number => parsePositiveInteger(value, \"Timeout\"),\n DEFAULT_OAUTH_TIMEOUT_SECONDS\n )\n .option(\"--no-open\", \"Print URL instead of opening the browser\")\n .action(async (options: AuthLoginOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLogin(context, options);\n });\n });\n\n auth\n .command(\"status\")\n .description(\"Check authentication status\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runStatus(context);\n });\n });\n\n auth\n .command(\"logout\")\n .alias(\"clear\")\n .description(\"Remove local cached credentials\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLogout(context);\n });\n });\n}\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { CONFIG_DIR, CONTEXT_FILE_PATH } from \"./constants.js\";\nimport { CliError, EXIT_CODES } from \"./errors.js\";\nimport type { CliContextFileData, LocalCliContext } from \"./types.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction parseLocalContext(value: unknown): LocalCliContext | null {\n if (!isRecord(value)) {\n return null;\n }\n\n if (value.workspaceId !== null && typeof value.workspaceId !== \"string\") {\n return null;\n }\n\n if (typeof value.clientId !== \"string\" || value.clientId.length === 0) {\n return null;\n }\n\n return {\n workspaceId: value.workspaceId,\n clientId: value.clientId,\n };\n}\n\nfunction parseContextFile(payload: string): CliContextFileData {\n const parsed = JSON.parse(payload) as unknown;\n\n if (!isRecord(parsed) || parsed.version !== 1) {\n throw new CliError(\n `Invalid CLI context format in ${CONTEXT_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n\n const context = parseLocalContext(parsed.context);\n\n if (!context) {\n throw new CliError(\n `Invalid CLI context in ${CONTEXT_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n\n return {\n version: 1,\n context,\n };\n}\n\nasync function writeContext(context: LocalCliContext): Promise<void> {\n const payload: CliContextFileData = {\n version: 1,\n context,\n };\n\n await mkdir(CONFIG_DIR, {\n recursive: true,\n mode: 0o700,\n });\n\n await writeFile(CONTEXT_FILE_PATH, `${JSON.stringify(payload, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n\nexport async function readLocalContext(): Promise<LocalCliContext | null> {\n try {\n const raw = await readFile(CONTEXT_FILE_PATH, \"utf8\");\n return parseContextFile(raw).context;\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") {\n return null;\n }\n\n if (error instanceof CliError) {\n throw error;\n }\n\n throw new CliError(\n `Failed to read context from ${CONTEXT_FILE_PATH}`,\n EXIT_CODES.ERROR\n );\n }\n}\n\nexport async function ensureLocalContext(): Promise<LocalCliContext> {\n const existing = await readLocalContext();\n\n if (existing) {\n return existing;\n }\n\n const created: LocalCliContext = {\n workspaceId: null,\n clientId: randomUUID(),\n };\n\n await writeContext(created);\n return created;\n}\n\nexport async function setCurrentWorkspace(\n workspaceId: string | null\n): Promise<LocalCliContext> {\n const context = await ensureLocalContext();\n\n const nextContext: LocalCliContext = {\n ...context,\n workspaceId,\n };\n\n await writeContext(nextContext);\n return nextContext;\n}\n","import {\n DEFAULT_API_URL,\n DONEBEAR_API_URL_ENV,\n FALLBACK_API_URL_ENV_KEYS,\n} from \"./constants.js\";\nimport { readEnvValue } from \"./env.js\";\nimport { CliError, EXIT_CODES } from \"./errors.js\";\nimport type {\n ChecklistItemRecord,\n CliContext,\n LabelRecord,\n ProjectRecord,\n TaskRecord,\n TeamRecord,\n WorkspaceInvitationRecord,\n WorkspaceJoinResult,\n WorkspaceMemberRecord,\n WorkspaceRecord,\n WorkspaceSummary,\n} from \"./types.js\";\n\ninterface ListWorkspacesResponse {\n workspaces: WorkspaceSummary[];\n}\n\ninterface CreateWorkspaceRequest {\n name: string;\n urlKey: string;\n logoUrl?: string;\n}\n\ninterface CreateWorkspaceResponse {\n workspace: WorkspaceRecord;\n}\n\ninterface SyncBatchRequest {\n requests: Array<{\n modelName: string;\n indexedKey: string;\n keyValue: string;\n }>;\n}\n\ninterface SyncMutateRequest {\n batchId: string;\n transactions: Array<{\n clientTxId: string;\n clientId: string;\n modelName: string;\n modelId: string;\n action: \"INSERT\" | \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\";\n payload: Record<string, unknown>;\n }>;\n}\n\ninterface SyncMutateResponse {\n success: boolean;\n lastSyncId: string;\n results: Array<{\n clientTxId: string;\n success: boolean;\n syncId?: string;\n error?: string;\n }>;\n}\n\ninterface GraphqlRequestBody {\n query: string;\n variables: Record<string, unknown>;\n}\n\ninterface GraphqlError {\n message?: string;\n}\n\ninterface GraphqlResponse<TData> {\n data?: TData;\n errors?: GraphqlError[];\n}\n\ninterface TasksQueryData {\n tasks: {\n nodes: Array<{\n id: string;\n title: string;\n description: string | null;\n createdAt: string;\n updatedAt: string;\n completedAt: string | null;\n archivedAt: string | null;\n start: string;\n startDate: string | null;\n startBucket: string;\n todayIndexReferenceDate: string | null;\n deadlineAt: string | null;\n creatorId: string;\n workspaceId: string;\n projectId: string | null;\n teamId: string | null;\n assigneeId: string | null;\n headingId: string | null;\n }>;\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n };\n}\n\ninterface ProjectsQueryData {\n projects: {\n nodes: Array<{\n id: string;\n key: string;\n name: string;\n description: string | null;\n status: string;\n sortOrder: number;\n targetDate: string | null;\n completedAt: string | null;\n archivedAt: string | null;\n createdAt: string;\n updatedAt: string;\n workspaceId: string;\n creatorId: string;\n }>;\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n };\n}\n\ninterface LabelsQueryData {\n labels: {\n nodes: Array<{\n id: string;\n title: string;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n }>;\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n };\n}\n\ninterface TeamsQueryData {\n teams: {\n nodes: Array<{\n id: string;\n key: string;\n name: string;\n description: string | null;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n archivedAt: string | null;\n }>;\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n };\n}\n\nconst TASKS_QUERY = `\n query DonebearTasks($first: Int!, $after: String, $workspaceId: ID!) {\n tasks(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes {\n id\n title\n description\n createdAt\n updatedAt\n completedAt\n archivedAt\n start\n startDate\n startBucket\n todayIndexReferenceDate\n deadlineAt\n creatorId\n workspaceId\n projectId\n teamId\n assigneeId\n headingId\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n`;\n\nconst PROJECTS_QUERY = `\n query DonebearProjects($first: Int!, $after: String, $workspaceId: ID!) {\n projects(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes {\n id\n key\n name\n description\n status\n sortOrder\n targetDate\n completedAt\n archivedAt\n createdAt\n updatedAt\n workspaceId\n creatorId\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n`;\n\nconst LABELS_QUERY = `\n query DonebearLabels($first: Int!, $after: String, $workspaceId: ID!) {\n labels(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes {\n id\n title\n workspaceId\n createdAt\n updatedAt\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n`;\n\nconst TEAMS_QUERY = `\n query DonebearTeams($first: Int!, $after: String, $workspaceId: ID!) {\n teams(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes {\n id\n key\n name\n description\n workspaceId\n createdAt\n updatedAt\n archivedAt\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n`;\n\nfunction normalizeApiUrl(url: string): string {\n return url.endsWith(\"/\") ? url.slice(0, -1) : url;\n}\n\nfunction firstDefined(keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = readEnvValue(key);\n\n if (value) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction extractErrorMessage(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return \"Request failed\";\n }\n\n const record = value as Record<string, unknown>;\n\n if (typeof record.message === \"string\") {\n return record.message;\n }\n\n if (typeof record.error === \"string\") {\n return record.error;\n }\n\n return \"Request failed\";\n}\n\nasync function request(\n _context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\";\n token: string;\n body?: unknown;\n }\n): Promise<Response> {\n const headers = new Headers({\n Authorization: `Bearer ${options.token}`,\n Accept: \"application/json\",\n });\n\n if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n const response = await fetch(endpoint, {\n method: options.method ?? \"GET\",\n headers,\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n });\n\n if (response.ok) {\n return response;\n }\n\n const raw = await response.text();\n\n let parsed: unknown = null;\n\n try {\n parsed = raw.length > 0 ? (JSON.parse(raw) as unknown) : null;\n } catch {\n parsed = null;\n }\n\n let message = `HTTP ${response.status}`;\n\n if (parsed !== null) {\n message = extractErrorMessage(parsed);\n } else if (raw.length > 0) {\n message = raw;\n }\n\n const exitCode =\n response.status === 401 || response.status === 403\n ? EXIT_CODES.AUTH_REQUIRED\n : EXIT_CODES.ERROR;\n\n throw new CliError(message, exitCode);\n}\n\nasync function requestJson<T>(\n context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\";\n token: string;\n body?: unknown;\n }\n): Promise<T> {\n const response = await request(context, endpoint, options);\n return (await response.json()) as T;\n}\n\nasync function requestNdjson(\n context: CliContext,\n endpoint: string,\n options: {\n token: string;\n body: unknown;\n }\n): Promise<unknown[]> {\n const response = await request(context, endpoint, {\n method: \"POST\",\n token: options.token,\n body: options.body,\n });\n\n const raw = await response.text();\n const lines = raw\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const parsed: unknown[] = [];\n\n for (const line of lines) {\n parsed.push(JSON.parse(line) as unknown);\n }\n\n return parsed;\n}\n\nasync function requestGraphql<TData>(\n context: CliContext,\n endpoint: string,\n options: {\n token: string;\n query: string;\n variables: Record<string, unknown>;\n }\n): Promise<TData> {\n const response = await requestJson<GraphqlResponse<TData>>(\n context,\n endpoint,\n {\n method: \"POST\",\n token: options.token,\n body: {\n query: options.query,\n variables: options.variables,\n } satisfies GraphqlRequestBody,\n }\n );\n\n if (Array.isArray(response.errors) && response.errors.length > 0) {\n const first = response.errors[0];\n throw new CliError(\n typeof first?.message === \"string\"\n ? first.message\n : \"GraphQL request failed\",\n EXIT_CODES.ERROR\n );\n }\n\n if (!response.data) {\n throw new CliError(\"GraphQL request returned no data\", EXIT_CODES.ERROR);\n }\n\n return response.data;\n}\n\nfunction toTaskRecord(value: unknown): TaskRecord | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const row = value as Record<string, unknown>;\n\n if (row.__class !== \"Task\") {\n return null;\n }\n\n if (typeof row.id !== \"string\" || typeof row.title !== \"string\") {\n return null;\n }\n\n if (\n typeof row.creatorId !== \"string\" ||\n typeof row.workspaceId !== \"string\" ||\n typeof row.start !== \"string\" ||\n typeof row.startBucket !== \"string\"\n ) {\n return null;\n }\n\n return {\n id: row.id,\n title: row.title,\n description: typeof row.description === \"string\" ? row.description : null,\n createdAt: toNullableNumber(row.createdAt),\n updatedAt: toNullableNumber(row.updatedAt),\n completedAt: toNullableNumber(row.completedAt),\n archivedAt: toNullableNumber(row.archivedAt),\n start: row.start,\n startDate: toNullableNumber(row.startDate),\n startBucket: row.startBucket,\n todayIndexReferenceDate: toNullableNumber(row.todayIndexReferenceDate),\n deadlineAt: toNullableNumber(row.deadlineAt),\n creatorId: row.creatorId,\n workspaceId: row.workspaceId,\n projectId: typeof row.projectId === \"string\" ? row.projectId : null,\n teamId: typeof row.teamId === \"string\" ? row.teamId : null,\n assigneeId: typeof row.assigneeId === \"string\" ? row.assigneeId : null,\n headingId: typeof row.headingId === \"string\" ? row.headingId : null,\n };\n}\n\nfunction toNullableNumber(input: unknown): number | null {\n if (input === null || typeof input === \"undefined\") {\n return null;\n }\n\n return typeof input === \"number\" ? input : null;\n}\n\nfunction parseIsoDateToEpoch(value: string | null): number | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? null : parsed;\n}\n\nfunction toTaskRecordFromGraphqlNode(\n node: TasksQueryData[\"tasks\"][\"nodes\"][number]\n): TaskRecord {\n return {\n id: node.id,\n title: node.title,\n description: node.description,\n createdAt: parseIsoDateToEpoch(node.createdAt),\n updatedAt: parseIsoDateToEpoch(node.updatedAt),\n completedAt: parseIsoDateToEpoch(node.completedAt),\n archivedAt: parseIsoDateToEpoch(node.archivedAt),\n start: node.start,\n startDate: parseIsoDateToEpoch(node.startDate),\n startBucket: node.startBucket,\n todayIndexReferenceDate: parseIsoDateToEpoch(node.todayIndexReferenceDate),\n deadlineAt: parseIsoDateToEpoch(node.deadlineAt),\n creatorId: node.creatorId,\n workspaceId: node.workspaceId,\n projectId: node.projectId,\n teamId: node.teamId,\n assigneeId: node.assigneeId,\n headingId: node.headingId,\n };\n}\n\nfunction toProjectRecordFromGraphqlNode(\n node: ProjectsQueryData[\"projects\"][\"nodes\"][number]\n): ProjectRecord {\n return {\n id: node.id,\n key: node.key,\n name: node.name,\n description: node.description,\n status: node.status,\n sortOrder: node.sortOrder,\n targetDate: parseIsoDateToEpoch(node.targetDate),\n completedAt: parseIsoDateToEpoch(node.completedAt),\n archivedAt: parseIsoDateToEpoch(node.archivedAt),\n createdAt: parseIsoDateToEpoch(node.createdAt),\n updatedAt: parseIsoDateToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n creatorId: node.creatorId,\n };\n}\n\nfunction toLabelRecordFromGraphqlNode(\n node: LabelsQueryData[\"labels\"][\"nodes\"][number]\n): LabelRecord {\n return {\n id: node.id,\n title: node.title,\n workspaceId: node.workspaceId,\n createdAt: parseIsoDateToEpoch(node.createdAt),\n updatedAt: parseIsoDateToEpoch(node.updatedAt),\n };\n}\n\nfunction toTeamRecordFromGraphqlNode(\n node: TeamsQueryData[\"teams\"][\"nodes\"][number]\n): TeamRecord {\n return {\n id: node.id,\n key: node.key,\n name: node.name,\n description: node.description,\n workspaceId: node.workspaceId,\n createdAt: parseIsoDateToEpoch(node.createdAt),\n updatedAt: parseIsoDateToEpoch(node.updatedAt),\n archivedAt: parseIsoDateToEpoch(node.archivedAt),\n };\n}\n\nfunction toChecklistItemRecord(value: unknown): ChecklistItemRecord | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const row = value as Record<string, unknown>;\n\n if (row.__class !== \"TaskChecklistItem\") {\n return null;\n }\n\n if (typeof row.id !== \"string\" || typeof row.title !== \"string\") {\n return null;\n }\n\n if (typeof row.taskId !== \"string\" || typeof row.workspaceId !== \"string\") {\n return null;\n }\n\n return {\n id: row.id,\n title: row.title,\n taskId: row.taskId,\n workspaceId: row.workspaceId,\n sortOrder: typeof row.sortOrder === \"number\" ? row.sortOrder : 0,\n completedAt: toNullableNumber(row.completedAt),\n createdAt: toNullableNumber(row.createdAt),\n updatedAt: toNullableNumber(row.updatedAt),\n };\n}\n\nexport function resolveApiBaseUrl(context: CliContext): string {\n const fromContext = context.apiUrlOverride?.trim();\n\n if (fromContext) {\n return normalizeApiUrl(fromContext);\n }\n\n const fromEnv =\n readEnvValue(DONEBEAR_API_URL_ENV) ??\n firstDefined(FALLBACK_API_URL_ENV_KEYS);\n\n return normalizeApiUrl(fromEnv ?? DEFAULT_API_URL);\n}\n\nexport async function listWorkspaces(\n context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<WorkspaceSummary[]> {\n const url = `${options.baseUrl}/api/workspaces`;\n const response = await requestJson<ListWorkspacesResponse>(context, url, {\n token: options.token,\n });\n\n return response.workspaces;\n}\n\nexport async function createWorkspace(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n body: CreateWorkspaceRequest;\n }\n): Promise<WorkspaceRecord> {\n const url = `${options.baseUrl}/api/workspaces`;\n const response = await requestJson<CreateWorkspaceResponse>(context, url, {\n method: \"POST\",\n token: options.token,\n body: options.body,\n });\n\n return response.workspace;\n}\n\nexport function joinWorkspace(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n code: string;\n }\n): Promise<WorkspaceJoinResult> {\n const url = `${options.baseUrl}/api/workspaces/join`;\n return requestJson<WorkspaceJoinResult>(context, url, {\n method: \"POST\",\n token: options.token,\n body: {\n code: options.code,\n },\n });\n}\n\nexport async function loadTasksByWorkspace(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<TaskRecord[]> {\n const endpoint = `${options.baseUrl}/graphql`;\n const results: TaskRecord[] = [];\n let after: string | null = null;\n let pageCount = 0;\n\n while (true) {\n pageCount += 1;\n\n if (pageCount > 1000) {\n throw new CliError(\n \"GraphQL pagination exceeded safe page limit\",\n EXIT_CODES.ERROR\n );\n }\n\n const data: TasksQueryData = await requestGraphql<TasksQueryData>(\n context,\n endpoint,\n {\n token: options.token,\n query: TASKS_QUERY,\n variables: {\n first: 100,\n after,\n workspaceId: options.workspaceId,\n },\n }\n );\n\n for (const node of data.tasks.nodes) {\n results.push(toTaskRecordFromGraphqlNode(node));\n }\n\n const nextCursor = data.tasks.pageInfo.hasNextPage\n ? data.tasks.pageInfo.endCursor\n : null;\n\n if (!nextCursor) {\n break;\n }\n\n after = nextCursor;\n }\n\n return results;\n}\n\nexport async function loadTaskById(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n taskId: string;\n }\n): Promise<TaskRecord | null> {\n const url = `${options.baseUrl}/sync/batch`;\n const body: SyncBatchRequest = {\n requests: [\n {\n modelName: \"Task\",\n indexedKey: \"id\",\n keyValue: options.taskId,\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n token: options.token,\n body,\n });\n\n for (const row of rows) {\n const task = toTaskRecord(row);\n\n if (task) {\n return task;\n }\n }\n\n return null;\n}\n\nexport async function mutateTask(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n request: SyncMutateRequest;\n }\n): Promise<void> {\n const url = `${options.baseUrl}/sync/mutate`;\n const response = await requestJson<SyncMutateResponse>(context, url, {\n method: \"POST\",\n token: options.token,\n body: options.request,\n });\n\n if (!response.success) {\n const error = response.results.find((result) => !result.success);\n\n if (error?.error) {\n throw new CliError(error.error, EXIT_CODES.ERROR);\n }\n\n throw new CliError(\"Sync mutation failed\", EXIT_CODES.ERROR);\n }\n}\n\nexport async function loadProjectsByWorkspace(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<ProjectRecord[]> {\n const endpoint = `${options.baseUrl}/graphql`;\n const results: ProjectRecord[] = [];\n let after: string | null = null;\n let pageCount = 0;\n\n while (true) {\n pageCount += 1;\n\n if (pageCount > 1000) {\n throw new CliError(\n \"GraphQL pagination exceeded safe page limit\",\n EXIT_CODES.ERROR\n );\n }\n\n const data: ProjectsQueryData = await requestGraphql<ProjectsQueryData>(\n context,\n endpoint,\n {\n token: options.token,\n query: PROJECTS_QUERY,\n variables: {\n first: 100,\n after,\n workspaceId: options.workspaceId,\n },\n }\n );\n\n for (const node of data.projects.nodes) {\n results.push(toProjectRecordFromGraphqlNode(node));\n }\n\n const nextCursor = data.projects.pageInfo.hasNextPage\n ? data.projects.pageInfo.endCursor\n : null;\n\n if (!nextCursor) {\n break;\n }\n\n after = nextCursor;\n }\n\n return results;\n}\n\nexport async function loadLabelsByWorkspace(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<LabelRecord[]> {\n const endpoint = `${options.baseUrl}/graphql`;\n const results: LabelRecord[] = [];\n let after: string | null = null;\n let pageCount = 0;\n\n while (true) {\n pageCount += 1;\n\n if (pageCount > 1000) {\n throw new CliError(\n \"GraphQL pagination exceeded safe page limit\",\n EXIT_CODES.ERROR\n );\n }\n\n const data: LabelsQueryData = await requestGraphql<LabelsQueryData>(\n context,\n endpoint,\n {\n token: options.token,\n query: LABELS_QUERY,\n variables: {\n first: 100,\n after,\n workspaceId: options.workspaceId,\n },\n }\n );\n\n for (const node of data.labels.nodes) {\n results.push(toLabelRecordFromGraphqlNode(node));\n }\n\n const nextCursor = data.labels.pageInfo.hasNextPage\n ? data.labels.pageInfo.endCursor\n : null;\n\n if (!nextCursor) {\n break;\n }\n\n after = nextCursor;\n }\n\n return results;\n}\n\nexport async function loadTeamsByWorkspace(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<TeamRecord[]> {\n const endpoint = `${options.baseUrl}/graphql`;\n const results: TeamRecord[] = [];\n let after: string | null = null;\n let pageCount = 0;\n\n while (true) {\n pageCount += 1;\n\n if (pageCount > 1000) {\n throw new CliError(\n \"GraphQL pagination exceeded safe page limit\",\n EXIT_CODES.ERROR\n );\n }\n\n const data: TeamsQueryData = await requestGraphql<TeamsQueryData>(\n context,\n endpoint,\n {\n token: options.token,\n query: TEAMS_QUERY,\n variables: {\n first: 100,\n after,\n workspaceId: options.workspaceId,\n },\n }\n );\n\n for (const node of data.teams.nodes) {\n results.push(toTeamRecordFromGraphqlNode(node));\n }\n\n const nextCursor = data.teams.pageInfo.hasNextPage\n ? data.teams.pageInfo.endCursor\n : null;\n\n if (!nextCursor) {\n break;\n }\n\n after = nextCursor;\n }\n\n return results;\n}\n\nexport async function loadChecklistItemsByTask(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n taskId: string;\n }\n): Promise<ChecklistItemRecord[]> {\n const url = `${options.baseUrl}/sync/batch`;\n const body: SyncBatchRequest = {\n requests: [\n {\n modelName: \"TaskChecklistItem\",\n indexedKey: \"taskId\",\n keyValue: options.taskId,\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n token: options.token,\n body,\n });\n\n const results: ChecklistItemRecord[] = [];\n\n for (const row of rows) {\n const item = toChecklistItemRecord(row);\n\n if (item) {\n results.push(item);\n }\n }\n\n return results;\n}\n\nexport async function mutateModel(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n request: {\n batchId: string;\n transactions: Array<{\n clientTxId: string;\n clientId: string;\n modelName: string;\n modelId: string;\n action: \"INSERT\" | \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\";\n payload: Record<string, unknown>;\n }>;\n };\n }\n): Promise<void> {\n const url = `${options.baseUrl}/sync/mutate`;\n const response = await requestJson<SyncMutateResponse>(context, url, {\n method: \"POST\",\n token: options.token,\n body: options.request,\n });\n\n if (!response.success) {\n const error = response.results.find((result) => !result.success);\n\n if (error?.error) {\n throw new CliError(error.error, EXIT_CODES.ERROR);\n }\n\n throw new CliError(\"Sync mutation failed\", EXIT_CODES.ERROR);\n }\n}\n\nexport async function listWorkspaceMembers(\n context: CliContext,\n options: { baseUrl: string; token: string; workspaceId: string }\n): Promise<WorkspaceMemberRecord[]> {\n const url = `${options.baseUrl}/api/workspaces/${options.workspaceId}/members`;\n const data = await requestJson<\n { members?: WorkspaceMemberRecord[] } | WorkspaceMemberRecord[]\n >(context, url, { token: options.token });\n\n return Array.isArray(data) ? data : (data.members ?? []);\n}\n\nexport async function listWorkspaceInvitations(\n context: CliContext,\n options: { baseUrl: string; token: string; workspaceId: string }\n): Promise<WorkspaceInvitationRecord[]> {\n const url = `${options.baseUrl}/api/workspaces/${options.workspaceId}/invitations`;\n const data = await requestJson<\n { invitations?: WorkspaceInvitationRecord[] } | WorkspaceInvitationRecord[]\n >(context, url, { token: options.token });\n\n return Array.isArray(data) ? data : (data.invitations ?? []);\n}\n\nexport async function createWorkspaceInvitation(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n email?: string;\n role?: string;\n }\n): Promise<WorkspaceInvitationRecord> {\n const url = `${options.baseUrl}/api/workspaces/${options.workspaceId}/invitations`;\n const body: Record<string, unknown> = {};\n\n if (options.email !== undefined) {\n body.email = options.email;\n }\n\n if (options.role !== undefined) {\n body.role = options.role;\n }\n\n const data = await requestJson<\n { invitation?: WorkspaceInvitationRecord } | WorkspaceInvitationRecord\n >(context, url, { method: \"POST\", token: options.token, body });\n\n if (\n \"id\" in data &&\n typeof (data as WorkspaceInvitationRecord).id === \"string\"\n ) {\n return data as WorkspaceInvitationRecord;\n }\n\n const nested = (data as { invitation?: WorkspaceInvitationRecord })\n .invitation;\n\n if (nested) {\n return nested;\n }\n\n throw new CliError(\n \"Invalid response from invitation endpoint\",\n EXIT_CODES.ERROR\n );\n}\n\nexport interface WorkspaceHistoryEntry {\n id: string;\n action: string;\n modelName: string;\n modelId: string;\n payload: Record<string, unknown> | null;\n createdAt: string;\n userId: string | null;\n}\n\ninterface ListWorkspaceHistoryResponse {\n history: WorkspaceHistoryEntry[];\n}\n\nexport async function listWorkspaceHistory(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n limit: number;\n model?: string;\n }\n): Promise<WorkspaceHistoryEntry[]> {\n const params = new URLSearchParams({ limit: String(options.limit) });\n if (options.model) {\n params.set(\"model\", options.model);\n }\n const url = `${options.baseUrl}/api/workspaces/${options.workspaceId}/history?${params.toString()}`;\n const response = await requestJson<ListWorkspaceHistoryResponse>(\n context,\n url,\n { token: options.token }\n );\n return response.history;\n}\n","import { resolveAuthToken } from \"./auth-session.js\";\nimport { ensureLocalContext } from \"./context-store.js\";\nimport { CliError, EXIT_CODES } from \"./errors.js\";\nimport { resolveApiBaseUrl } from \"./manage-api.js\";\nimport { resolveSupabaseConfig } from \"./supabase.js\";\nimport type { CliContext, ResolvedAuthToken } from \"./types.js\";\n\nfunction getOptionalSupabaseConfig() {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n}\n\nexport async function requireAuthToken(context: CliContext): Promise<{\n token: string;\n resolvedToken: ResolvedAuthToken;\n}> {\n const resolvedToken = await resolveAuthToken(\n context,\n getOptionalSupabaseConfig()\n );\n\n if (!resolvedToken) {\n throw new CliError(\n \"Not authenticated. Run `donebear auth login`.\",\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return {\n token: resolvedToken.token,\n resolvedToken,\n };\n}\n\nexport async function resolveCommandContext(context: CliContext): Promise<{\n token: string;\n apiBaseUrl: string;\n resolvedToken: ResolvedAuthToken;\n localContext: Awaited<ReturnType<typeof ensureLocalContext>>;\n}> {\n const { token, resolvedToken } = await requireAuthToken(context);\n\n if (!token) {\n throw new CliError(\"Missing access token\", EXIT_CODES.AUTH_REQUIRED);\n }\n\n return {\n token,\n resolvedToken,\n apiBaseUrl: resolveApiBaseUrl(context),\n localContext: await ensureLocalContext(),\n };\n}\n\nexport function requireUserId(resolvedToken: ResolvedAuthToken): string {\n const userId = resolvedToken.user?.id ?? null;\n\n if (!(typeof userId === \"string\" && userId.length > 0)) {\n throw new CliError(\n \"Could not determine user id from auth token\",\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return userId;\n}\n","import type { TaskRecord, TaskState, TaskView } from \"./types.js\";\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction startOfDayEpoch(now: Date): number {\n return new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();\n}\n\nexport function buildTaskStartFields(\n view: TaskView,\n now = new Date()\n): {\n start: string;\n startBucket: string;\n startDate: number | null;\n todayIndexReferenceDate: number | null;\n} {\n const today = startOfDayEpoch(now);\n const tomorrow = today + DAY_MS;\n\n switch (view) {\n case \"inbox\":\n return {\n start: \"not_started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n case \"anytime\":\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n case \"today\":\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: today,\n todayIndexReferenceDate: today,\n };\n case \"upcoming\":\n return {\n start: \"started\",\n startBucket: \"upcoming\",\n startDate: tomorrow,\n todayIndexReferenceDate: null,\n };\n case \"someday\":\n return {\n start: \"someday\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n default:\n return {\n start: \"not_started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n}\n\nexport function getTaskState(task: TaskRecord): Exclude<TaskState, \"all\"> {\n if (task.archivedAt !== null) {\n return \"archived\";\n }\n\n if (task.completedAt !== null) {\n return \"done\";\n }\n\n return \"open\";\n}\n\nexport function formatEpochDate(epochMs: number | null): string | null {\n if (epochMs === null) {\n return null;\n }\n\n const date = new Date(epochMs);\n\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date.toISOString();\n}\n\nexport function formatShortDate(epochMs: number | null): string | null {\n const iso = formatEpochDate(epochMs);\n\n if (!iso) {\n return null;\n }\n\n return iso.slice(0, 10);\n}\n","import { getTaskState } from \"./task-defaults.js\";\nimport type { TaskRecord, TaskState } from \"./types.js\";\n\nexport function normalizeWorkspaceRef(\n value: string | undefined\n): string | null {\n const normalized = value?.trim() ?? \"\";\n return normalized.length > 0 ? normalized : null;\n}\n\nexport function parseTaskState(value: string): TaskState {\n switch (value.trim().toLowerCase()) {\n case \"open\":\n case \"todo\":\n case \"pending\":\n return \"open\";\n case \"done\":\n case \"complete\":\n case \"completed\":\n return \"done\";\n case \"archived\":\n case \"archive\":\n return \"archived\";\n case \"all\":\n return \"all\";\n default:\n throw new Error(\n `Invalid state \"${value}\". Expected one of: open, done, archived, all.`\n );\n }\n}\n\nexport function toTaskMarker(task: TaskRecord): string {\n const state = getTaskState(task);\n\n if (state === \"done\") {\n return \"[x]\";\n }\n\n if (state === \"archived\") {\n return \"[-]\";\n }\n\n return \"[ ]\";\n}\n","import { setCurrentWorkspace } from \"./context-store.js\";\nimport { listWorkspaces } from \"./manage-api.js\";\nimport type { CliContext, WorkspaceSummary } from \"./types.js\";\n\nconst WORKSPACE_URL_KEY_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nfunction normalize(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction byReference(\n workspaces: WorkspaceSummary[],\n reference: string\n): WorkspaceSummary | null {\n const normalized = normalize(reference);\n\n for (const workspace of workspaces) {\n if (workspace.id === reference) {\n return workspace;\n }\n\n if (workspace.urlKey && normalize(workspace.urlKey) === normalized) {\n return workspace;\n }\n\n if (normalize(workspace.name) === normalized) {\n return workspace;\n }\n }\n\n return null;\n}\n\nexport function toWorkspaceUrlKey(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\");\n\n return slug.slice(0, 50);\n}\n\nexport function isValidWorkspaceUrlKey(value: string): boolean {\n return WORKSPACE_URL_KEY_REGEX.test(value) && value.length >= 3;\n}\n\nexport async function resolveWorkspace(\n context: CliContext,\n options: {\n token: string;\n apiBaseUrl: string;\n workspaceRef: string | null;\n storedWorkspaceId: string | null;\n }\n): Promise<{ workspace: WorkspaceSummary; autoSelected: boolean }> {\n const workspaces = await listWorkspaces(context, {\n token: options.token,\n baseUrl: options.apiBaseUrl,\n });\n\n if (workspaces.length === 0) {\n throw new Error(\"No workspaces available for this account\");\n }\n\n if (options.workspaceRef) {\n const selected = byReference(workspaces, options.workspaceRef);\n\n if (!selected) {\n throw new Error(\n `Workspace \"${options.workspaceRef}\" not found. Run \\`donebear workspace list\\`.`\n );\n }\n\n return { workspace: selected, autoSelected: false };\n }\n\n if (options.storedWorkspaceId) {\n const selected = byReference(workspaces, options.storedWorkspaceId);\n\n if (selected) {\n return { workspace: selected, autoSelected: false };\n }\n }\n\n if (workspaces.length === 1) {\n const workspace = workspaces[0];\n\n if (!workspace) {\n throw new Error(\"No workspaces available for this account\");\n }\n\n await setCurrentWorkspace(workspace.id);\n\n return {\n workspace,\n autoSelected: true,\n };\n }\n\n throw new Error(\n \"No default workspace selected. Run `donebear workspace use <id-or-slug>`.\"\n );\n}\n","// donebear history [--workspace <ws>] [--model Task|Project|Label|Team] [--limit 50] [--format]\n// Shows recent sync actions as an audit log\n\nimport type { Command } from \"commander\";\nimport { resolveCommandContext } from \"../command-context.js\";\nimport { normalizeWorkspaceRef } from \"../command-helpers.js\";\nimport { parsePositiveInteger } from \"../command-parsers.js\";\nimport type { WorkspaceHistoryEntry } from \"../manage-api.js\";\nimport { listWorkspaceHistory } from \"../manage-api.js\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeJson,\n writeWarning,\n} from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport { resolveWorkspace } from \"../workspace-context.js\";\n\nconst DEFAULT_HISTORY_LIMIT = 50;\n\n// Sync action code mapping: I=create U=update A=archive D=delete V=unarchive\nconst ACTION_LABELS: Record<string, string> = {\n I: \"CREATE\",\n U: \"UPDATE\",\n A: \"ARCHIVE\",\n D: \"DELETE\",\n V: \"UNARCHIVE\",\n};\n\ninterface HistoryOptions {\n workspace?: string;\n model?: string;\n limit: number;\n}\n\nfunction formatActionCode(action: string): string {\n return ACTION_LABELS[action] ?? action;\n}\n\nfunction formatHistoryDate(isoString: string): string {\n const date = new Date(isoString);\n if (Number.isNaN(date.getTime())) {\n return isoString;\n }\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, \"0\");\n const dd = String(date.getDate()).padStart(2, \"0\");\n const hh = String(date.getHours()).padStart(2, \"0\");\n const min = String(date.getMinutes()).padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd} ${hh}:${min}`;\n}\n\nfunction extractPayloadTitle(entry: WorkspaceHistoryEntry): string {\n if (!entry.payload) {\n return \"\";\n }\n const title = entry.payload.title;\n if (typeof title === \"string\") {\n return ` (title: \"${title}\")`;\n }\n return \"\";\n}\n\nasync function runHistory(\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: HistoryOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n try {\n const history = await listWorkspaceHistory(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n limit: options.limit,\n model: options.model,\n });\n\n if (context.json) {\n writeJson({ workspace, history });\n return;\n }\n\n const historyHeaders = [\"date\", \"action\", \"model\", \"modelId\", \"title\"];\n const historyRows = history.map((entry) => [\n formatHistoryDate(entry.createdAt),\n formatActionCode(entry.action),\n entry.modelName,\n entry.modelId.slice(0, 8),\n typeof entry.payload?.title === \"string\" ? entry.payload.title : \"\",\n ]);\n\n if (\n writeFormattedRows(context, history.length, historyHeaders, historyRows)\n ) {\n return;\n }\n\n if (history.length === 0) {\n writeInfo(context, \"No history entries found.\");\n return;\n }\n\n writeInfo(context, `History for ${workspace.name}:`);\n\n for (const entry of history) {\n const date = formatHistoryDate(entry.createdAt);\n const action = formatActionCode(entry.action);\n const modelId = entry.modelId.slice(0, 8);\n const title = extractPayloadTitle(entry);\n writeInfo(\n context,\n `${date} ${action} ${entry.modelName} ${modelId}...${title}`\n );\n }\n } catch {\n writeWarning(context, \"History is not available for this server version.\");\n writeWarning(context, \"Upgrade your manage-api to enable audit logs.\");\n }\n}\n\nexport function registerHistoryCommand(\n program: Command,\n workspaceOverride: string | null\n): void {\n program\n .command(\"history\")\n .description(\"Show recent workspace audit log\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--model <model>\", \"Filter by model name: Task|Project|Label|Team\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of entries\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_HISTORY_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear history\n donebear history --model Task --limit 20\n donebear history --format csv\n`\n )\n .action(async (options: HistoryOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runHistory(context, workspaceOverride, options);\n });\n });\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { Command } from \"commander\";\nimport { CONFIG_DIR } from \"../constants.js\";\nimport { writeInfo, writeSuccess } from \"../output.js\";\nimport type { CliContext } from \"../types.js\";\n\nconst HISTORY_FILE = join(CONFIG_DIR, \"history.json\");\nconst MAX_HISTORY = 200;\n\ninterface HistoryFile {\n version: 1;\n entries: string[];\n}\n\nfunction isHistoryFile(value: unknown): value is HistoryFile {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n record.version === 1 &&\n Array.isArray(record.entries) &&\n record.entries.every((e) => typeof e === \"string\")\n );\n}\n\nasync function loadHistory(historyFile: string): Promise<string[]> {\n try {\n const raw = await readFile(historyFile, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (isHistoryFile(parsed)) {\n return parsed.entries;\n }\n\n return [];\n } catch {\n return [];\n }\n}\n\nfunction tokenize(input: string): string[] {\n const tokens: string[] = [];\n let current = \"\";\n let inQuote = false;\n let quoteChar = \"\";\n\n for (const char of input) {\n if (inQuote) {\n if (char === quoteChar) {\n inQuote = false;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\") {\n inQuote = true;\n quoteChar = char;\n } else if (char === \" \") {\n if (current.length > 0) {\n tokens.push(current);\n current = \"\";\n }\n } else {\n current += char;\n }\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nfunction buildCompleter(program: Command) {\n return (line: string): [string[], string] => {\n const allCommands = program.commands.flatMap((cmd) => [\n cmd.name(),\n ...cmd.aliases(),\n ]);\n const hits = allCommands.filter((c) => c.startsWith(line));\n return [hits.length > 0 ? hits : allCommands, line];\n };\n}\n\nexport async function runInteractiveMode(\n context: CliContext,\n program: Command\n): Promise<void> {\n const history = await loadHistory(HISTORY_FILE);\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: \"donebear> \",\n historySize: MAX_HISTORY,\n completer: buildCompleter(program),\n });\n\n // Pre-populate readline history (reversed — readline stores newest first)\n for (const entry of [...history].reverse()) {\n // The history property exists on readline.Interface internals\n (rl as unknown as { history: string[] }).history.push(entry);\n }\n\n writeSuccess(\n context,\n 'Done Bear interactive mode. Type \"exit\" or Ctrl+D to quit.'\n );\n writeInfo(\n context,\n \"Commands: task, workspace, project, label, team, today, search, auth, whoami\"\n );\n\n rl.prompt();\n\n const sessionEntries: string[] = [];\n\n for await (const line of rl) {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n continue;\n }\n\n if (trimmed === \"exit\" || trimmed === \"quit\" || trimmed === \":q\") {\n break;\n }\n\n const tokens = tokenize(trimmed);\n\n try {\n await program.parseAsync([\"node\", \"donebear\", ...tokens]);\n } catch {\n // Errors are already handled by runWithErrorHandling inside each command\n }\n\n sessionEntries.push(trimmed);\n rl.prompt();\n }\n\n rl.close();\n\n // Persist session history on exit\n if (sessionEntries.length > 0) {\n try {\n const existing = await loadHistory(HISTORY_FILE);\n const updated = [...existing, ...sessionEntries].slice(-MAX_HISTORY);\n const payload: HistoryFile = { version: 1, entries: updated };\n await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });\n await writeFile(HISTORY_FILE, `${JSON.stringify(payload, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n } catch {\n // Ignore history write errors — not critical\n }\n }\n}\n","import type { Command } from \"commander\";\nimport { resolveCommandContext } from \"../command-context.js\";\nimport { normalizeWorkspaceRef } from \"../command-helpers.js\";\nimport { loadLabelsByWorkspace } from \"../manage-api.js\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeJson,\n writeSuccess,\n} from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport { formatEpochDate } from \"../task-defaults.js\";\nimport type { LabelRecord } from \"../types.js\";\nimport { resolveWorkspace } from \"../workspace-context.js\";\n\ninterface LabelListOptions {\n workspace?: string;\n sort: string;\n}\n\ninterface LabelShowOptions {\n workspace?: string;\n}\n\nfunction sortLabels(labels: LabelRecord[], sort: string): LabelRecord[] {\n const sorted = [...labels];\n\n if (sort === \"alpha\") {\n sorted.sort((a, b) => a.title.localeCompare(b.title));\n } else {\n // Default: alphabetical (count requires task data not available here)\n sorted.sort((a, b) => a.title.localeCompare(b.title));\n }\n\n return sorted;\n}\n\nasync function resolveLabel(\n context: ReturnType<typeof contextFromCommand>,\n options: {\n labelRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<LabelRecord> {\n const { workspace } = await resolveWorkspace(context, {\n token: options.commandContext.token,\n apiBaseUrl: options.commandContext.apiBaseUrl,\n workspaceRef: options.workspaceRef,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n });\n\n const labels = await loadLabelsByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n\n const normalized = options.labelRef.trim().toLowerCase();\n const found = labels.find(\n (l) =>\n l.id === options.labelRef ||\n l.title.toLowerCase() === normalized ||\n l.id.startsWith(options.labelRef)\n );\n\n if (!found) {\n throw new Error(`Label \"${options.labelRef}\" not found.`);\n }\n\n return found;\n}\n\nasync function runLabelList(\n context: ReturnType<typeof contextFromCommand>,\n options: LabelListOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const allLabels = await loadLabelsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const sorted = sortLabels(allLabels, options.sort);\n\n if (context.json) {\n writeJson({\n workspace,\n autoSelected,\n total: sorted.length,\n labels: sorted,\n });\n return;\n }\n\n const headers = [\"id\", \"title\", \"createdAt\", \"updatedAt\"];\n const rows = sorted.map((l) => [\n l.id,\n l.title,\n formatEpochDate(l.createdAt) ?? \"\",\n formatEpochDate(l.updatedAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, sorted.length, headers, rows)) {\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n if (sorted.length === 0) {\n writeInfo(context, \"No labels found.\");\n return;\n }\n\n writeInfo(context, `${workspace.name} (${sorted.length} label(s))`);\n\n for (const label of sorted) {\n writeInfo(context, `${label.id.slice(0, 8)} ${label.title}`);\n }\n\n if (context.copy) {\n const text = sorted\n .map((l) => `${l.id.slice(0, 8)} ${l.title}`)\n .join(\"\\n\");\n copyToClipboard(text);\n }\n}\n\nasync function runLabelShow(\n context: ReturnType<typeof contextFromCommand>,\n labelRef: string,\n options: LabelShowOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const label = await resolveLabel(context, {\n labelRef,\n commandContext,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeJson({\n label,\n createdAtIso: formatEpochDate(label.createdAt),\n updatedAtIso: formatEpochDate(label.updatedAt),\n });\n return;\n }\n\n writeSuccess(context, label.title);\n writeInfo(context, `id: ${label.id}`);\n writeInfo(context, `workspaceId: ${label.workspaceId}`);\n writeInfo(\n context,\n `createdAt: ${formatEpochDate(label.createdAt) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `updatedAt: ${formatEpochDate(label.updatedAt) ?? \"(none)\"}`\n );\n}\n\nexport function registerLabelCommands(\n program: Command,\n workspaceOverride: string | null\n): void {\n const label = program\n .command(\"label\")\n .alias(\"labels\")\n .description(\"Manage labels\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear label\n donebear label list --sort alpha\n donebear label show bug\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelList(context, { sort: \"alpha\" });\n });\n });\n\n label\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List labels\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--sort <order>\", \"Sort order: alpha|count\", \"alpha\")\n .action(async (options: LabelListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelList(context, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n });\n\n label\n .command(\"show\")\n .description(\"Show label details\")\n .argument(\"<id-or-title>\", \"Label id, title, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (labelRef: string, options: LabelShowOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runLabelShow(context, labelRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Command } from \"commander\";\nimport { requireUserId, resolveCommandContext } from \"../command-context.js\";\nimport { normalizeWorkspaceRef } from \"../command-helpers.js\";\nimport { loadProjectsByWorkspace, mutateModel } from \"../manage-api.js\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeJson,\n writeSuccess,\n} from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport { formatEpochDate, formatShortDate } from \"../task-defaults.js\";\nimport type { ProjectRecord, WorkspaceSummary } from \"../types.js\";\nimport { resolveWorkspace } from \"../workspace-context.js\";\n\nconst ISO_YMD_REGEX = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\ntype ProjectStatus = \"active\" | \"done\" | \"archived\" | \"all\";\n\ninterface ProjectListOptions {\n workspace?: string;\n status: string;\n total?: boolean;\n format?: string;\n}\n\ninterface ProjectShowOptions {\n workspace?: string;\n}\n\ninterface ProjectAddOptions {\n workspace?: string;\n key?: string;\n description?: string;\n targetDate?: string;\n}\n\ninterface ProjectEditOptions {\n workspace?: string;\n name?: string;\n description?: string;\n clearDescription: boolean;\n status?: string;\n targetDate?: string;\n clearTargetDate: boolean;\n}\n\ninterface ProjectTargetOptions {\n workspace?: string;\n}\n\nfunction parseProjectStatus(value: string): ProjectStatus {\n switch (value.trim().toLowerCase()) {\n case \"active\":\n return \"active\";\n case \"done\":\n case \"complete\":\n case \"completed\":\n return \"done\";\n case \"archived\":\n case \"archive\":\n return \"archived\";\n case \"all\":\n return \"all\";\n default:\n throw new Error(\n `Invalid status \"${value}\". Expected one of: active, done, archived, all.`\n );\n }\n}\n\nfunction getProjectStatus(\n project: ProjectRecord\n): Exclude<ProjectStatus, \"all\"> {\n if (project.archivedAt !== null) {\n return \"archived\";\n }\n\n if (project.completedAt !== null) {\n return \"done\";\n }\n\n return \"active\";\n}\n\nfunction parseTargetDate(value: string | undefined): number | null {\n if (!value) {\n return null;\n }\n\n const trimmed = value.trim();\n const ymdMatch = ISO_YMD_REGEX.exec(trimmed);\n\n if (ymdMatch) {\n const year = Number.parseInt(trimmed.slice(0, 4), 10);\n const month = Number.parseInt(trimmed.slice(5, 7), 10);\n const day = Number.parseInt(trimmed.slice(8, 10), 10);\n const date = new Date(year, month - 1, day);\n\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid target date: ${value}`);\n }\n\n return date.getTime();\n }\n\n const parsed = Date.parse(trimmed);\n\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid target date: ${value}`);\n }\n\n return parsed;\n}\n\nconst WHITESPACE_REGEX = /\\s+/;\n\nfunction autoGenerateKey(name: string): string {\n const words = name.trim().split(WHITESPACE_REGEX);\n const initials = words\n .map((word) => word[0]?.toUpperCase() ?? \"\")\n .join(\"\")\n .replace(/[^A-Z0-9]/g, \"\");\n\n return initials.slice(0, 5) || \"PROJ\";\n}\n\nfunction filterProjects(\n projects: ProjectRecord[],\n status: ProjectStatus\n): ProjectRecord[] {\n if (status === \"all\") {\n return projects;\n }\n\n return projects.filter((p) => getProjectStatus(p) === status);\n}\n\nfunction sortProjectsByUpdatedDesc(projects: ProjectRecord[]): ProjectRecord[] {\n return [...projects].sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n}\n\nasync function resolveProjectReference(\n context: ReturnType<typeof contextFromCommand>,\n options: {\n projectRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<{ project: ProjectRecord; workspace: WorkspaceSummary }> {\n const { workspace } = await resolveWorkspace(context, {\n token: options.commandContext.token,\n apiBaseUrl: options.commandContext.apiBaseUrl,\n workspaceRef: options.workspaceRef,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n });\n\n const projects = await loadProjectsByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n\n const normalized = options.projectRef.trim().toLowerCase();\n const found = projects.find(\n (p) =>\n p.id === options.projectRef ||\n p.key.toLowerCase() === normalized ||\n p.id.startsWith(options.projectRef)\n );\n\n if (!found) {\n throw new Error(`Project \"${options.projectRef}\" not found.`);\n }\n\n return { project: found, workspace };\n}\n\nasync function runProjectList(\n context: ReturnType<typeof contextFromCommand>,\n options: ProjectListOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const requestedStatus = parseProjectStatus(options.status);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const allProjects = await loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const filtered = filterProjects(\n sortProjectsByUpdatedDesc(allProjects),\n requestedStatus\n );\n\n if (context.json) {\n writeJson({\n workspace,\n autoSelected,\n status: requestedStatus,\n total: filtered.length,\n projects: filtered,\n });\n return;\n }\n\n const headers = [\"id\", \"key\", \"name\", \"status\", \"targetDate\", \"updatedAt\"];\n const rows = filtered.map((p) => [\n p.id,\n p.key,\n p.name,\n getProjectStatus(p),\n formatShortDate(p.targetDate) ?? \"\",\n formatShortDate(p.updatedAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, filtered.length, headers, rows)) {\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n if (filtered.length === 0) {\n writeInfo(context, \"No projects found.\");\n return;\n }\n\n writeInfo(context, `${workspace.name} (${filtered.length} project(s))`);\n\n for (const project of filtered) {\n const status = getProjectStatus(project);\n const target = formatShortDate(project.targetDate);\n const suffix = target ? ` due ${target}` : \"\";\n writeInfo(\n context,\n `${project.id.slice(0, 8)} [${project.key}] ${project.name} (${status})${suffix}`\n );\n }\n\n if (context.copy) {\n const text = filtered\n .map(\n (p) =>\n `${p.id.slice(0, 8)} [${p.key}] ${p.name} (${getProjectStatus(p)})`\n )\n .join(\"\\n\");\n copyToClipboard(text);\n }\n}\n\nasync function runProjectShow(\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n options: ProjectShowOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const { project, workspace } = await resolveProjectReference(context, {\n projectRef,\n commandContext,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeJson({\n project,\n status: getProjectStatus(project),\n workspace,\n createdAtIso: formatEpochDate(project.createdAt),\n updatedAtIso: formatEpochDate(project.updatedAt),\n completedAtIso: formatEpochDate(project.completedAt),\n archivedAtIso: formatEpochDate(project.archivedAt),\n targetDateIso: formatEpochDate(project.targetDate),\n });\n return;\n }\n\n writeSuccess(context, project.name);\n writeInfo(context, `id: ${project.id}`);\n writeInfo(context, `key: ${project.key}`);\n writeInfo(context, `status: ${getProjectStatus(project)}`);\n writeInfo(context, `workspaceId: ${project.workspaceId}`);\n writeInfo(\n context,\n `targetDate: ${formatEpochDate(project.targetDate) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `createdAt: ${formatEpochDate(project.createdAt) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `updatedAt: ${formatEpochDate(project.updatedAt) ?? \"(none)\"}`\n );\n\n if (project.description) {\n writeInfo(context, `description: ${project.description}`);\n }\n}\n\nasync function runProjectAdd(\n context: ReturnType<typeof contextFromCommand>,\n name: string,\n options: ProjectAddOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const userId = requireUserId(commandContext.resolvedToken);\n const normalizedName = name.trim();\n\n if (normalizedName.length === 0) {\n throw new Error(\"Project name cannot be empty.\");\n }\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const projectId = randomUUID();\n const now = Date.now();\n const key =\n options.key?.trim().toUpperCase() || autoGenerateKey(normalizedName);\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"Project\",\n modelId: projectId,\n action: \"INSERT\",\n payload: {\n name: normalizedName,\n key,\n description: options.description?.trim() || null,\n status: \"active\",\n sortOrder: 0,\n targetDate: parseTargetDate(options.targetDate),\n completedAt: null,\n archivedAt: null,\n creatorId: userId,\n workspaceId: workspace.id,\n createdAt: now,\n updatedAt: now,\n },\n },\n ],\n },\n });\n\n if (context.json) {\n writeJson({\n created: true,\n id: projectId,\n key,\n workspaceId: workspace.id,\n workspaceName: workspace.name,\n autoSelected,\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, `Added project: ${normalizedName}`);\n writeInfo(context, `id: ${projectId}`);\n writeInfo(context, `key: ${key}`);\n}\n\nfunction buildProjectUpdates(\n options: ProjectEditOptions\n): Record<string, unknown> {\n if (options.clearDescription && typeof options.description === \"string\") {\n throw new Error(\n \"Use either --description or --clear-description, not both.\"\n );\n }\n\n if (options.clearTargetDate && typeof options.targetDate === \"string\") {\n throw new Error(\n \"Use either --target-date or --clear-target-date, not both.\"\n );\n }\n\n const updates: Record<string, unknown> = {};\n\n if (typeof options.name === \"string\") {\n const name = options.name.trim();\n if (name.length === 0) {\n throw new Error(\"Project name cannot be empty.\");\n }\n updates.name = name;\n }\n\n if (options.clearDescription) {\n updates.description = null;\n } else if (typeof options.description === \"string\") {\n const desc = options.description.trim();\n updates.description = desc.length > 0 ? desc : null;\n }\n\n if (options.clearTargetDate) {\n updates.targetDate = null;\n } else if (typeof options.targetDate === \"string\") {\n updates.targetDate = parseTargetDate(options.targetDate);\n }\n\n if (typeof options.status === \"string\") {\n applyStatusToUpdates(updates, parseProjectStatus(options.status));\n }\n\n if (Object.keys(updates).length === 0) {\n throw new Error(\n \"No updates provided. Use --name, --description, --clear-description, --status, --target-date, or --clear-target-date.\"\n );\n }\n\n updates.updatedAt = Date.now();\n return updates;\n}\n\nfunction applyStatusToUpdates(\n updates: Record<string, unknown>,\n status: ProjectStatus\n): void {\n if (status === \"done\") {\n updates.completedAt = Date.now();\n updates.archivedAt = null;\n } else if (status === \"active\") {\n updates.completedAt = null;\n updates.archivedAt = null;\n } else if (status === \"archived\") {\n updates.archivedAt = Date.now();\n }\n}\n\nasync function runProjectEdit(\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n options: ProjectEditOptions\n): Promise<void> {\n const updates = buildProjectUpdates(options);\n\n const commandContext = await resolveCommandContext(context);\n const { project } = await resolveProjectReference(context, {\n projectRef,\n commandContext,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"Project\",\n modelId: project.id,\n action: \"UPDATE\",\n payload: updates,\n },\n ],\n },\n });\n\n if (context.json) {\n writeJson({ ok: true, id: project.id, action: \"UPDATE\" });\n return;\n }\n\n writeSuccess(context, `Updated project: ${project.id}`);\n}\n\nasync function runProjectMutation(\n context: ReturnType<typeof contextFromCommand>,\n projectRef: string,\n payload: {\n workspaceRef: string | null;\n action: \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\";\n data: Record<string, unknown>;\n successMessage: string;\n }\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const { project } = await resolveProjectReference(context, {\n projectRef,\n commandContext,\n workspaceRef: payload.workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"Project\",\n modelId: project.id,\n action: payload.action,\n payload: payload.data,\n },\n ],\n },\n });\n\n if (context.json) {\n writeJson({ ok: true, id: project.id, action: payload.action });\n return;\n }\n\n writeSuccess(context, `${payload.successMessage}: ${project.id}`);\n}\n\nexport function registerProjectCommands(\n program: Command,\n workspaceOverride: string | null\n): void {\n const project = program\n .command(\"project\")\n .alias(\"projects\")\n .description(\"Manage projects\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear project\n donebear project add \"Q1 Launch\" --key LAUNCH\n donebear project list --status active\n donebear project edit LAUNCH --target-date 2026-03-31\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectList(context, { status: \"active\" });\n });\n });\n\n project\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List projects\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --status <status>\", \"active|done|archived|all\", \"active\")\n .action(async (options: ProjectListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectList(context, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n });\n\n project\n .command(\"show\")\n .description(\"Show project details\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectShowOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectShow(context, projectRef, {\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"add\")\n .alias(\"create\")\n .description(\"Create a project\")\n .argument(\"<name>\", \"Project name\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--key <KEY>\", \"Short project key (auto-generated if not provided)\")\n .option(\"-d, --description <text>\", \"Project description\")\n .option(\"--target-date <date>\", \"Target date (YYYY-MM-DD)\")\n .action(\n async (name: string, options: ProjectAddOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectAdd(context, name, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"edit\")\n .description(\"Update project fields\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--name <name>\", \"Replace project name\")\n .option(\"-d, --description <text>\", \"Replace project description\")\n .option(\"--clear-description\", \"Clear project description\")\n .option(\"--status <status>\", \"Set status (active|done|archived)\")\n .option(\"--target-date <date>\", \"Set target date (YYYY-MM-DD)\")\n .option(\"--clear-target-date\", \"Clear target date\")\n .action(\n async (\n projectRef: string,\n options: ProjectEditOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectEdit(context, projectRef, {\n ...options,\n workspace:\n workspaceOverride ??\n normalizeWorkspaceRef(options.workspace) ??\n undefined,\n });\n });\n }\n );\n\n project\n .command(\"done\")\n .alias(\"complete\")\n .description(\"Mark a project as completed\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const now = Date.now();\n await runProjectMutation(context, projectRef, {\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"UPDATE\",\n data: { completedAt: now, updatedAt: now },\n successMessage: \"Marked done\",\n });\n });\n }\n );\n\n project\n .command(\"archive\")\n .description(\"Archive a project\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectMutation(context, projectRef, {\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"ARCHIVE\",\n data: { archivedAt: Date.now() },\n successMessage: \"Archived\",\n });\n });\n }\n );\n\n project\n .command(\"unarchive\")\n .alias(\"restore\")\n .description(\"Unarchive a project\")\n .argument(\"<id-or-key>\", \"Project id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n projectRef: string,\n options: ProjectTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runProjectMutation(context, projectRef, {\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"UNARCHIVE\",\n data: {},\n successMessage: \"Unarchived\",\n });\n });\n }\n );\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { Command } from \"commander\";\nimport { requireUserId, resolveCommandContext } from \"../command-context.js\";\nimport {\n normalizeWorkspaceRef,\n parseTaskState,\n toTaskMarker,\n} from \"../command-helpers.js\";\nimport { parsePositiveInteger } from \"../command-parsers.js\";\nimport {\n loadChecklistItemsByTask,\n loadProjectsByWorkspace,\n loadTaskById,\n loadTasksByWorkspace,\n loadTeamsByWorkspace,\n mutateModel,\n mutateTask,\n} from \"../manage-api.js\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeJson,\n writeSuccess,\n} from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport {\n buildTaskStartFields,\n formatEpochDate,\n formatShortDate,\n getTaskState,\n} from \"../task-defaults.js\";\nimport type { TaskRecord, TaskState, TaskView } from \"../types.js\";\nimport { resolveWorkspace } from \"../workspace-context.js\";\n\nconst ISO_YMD_REGEX = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst UUID_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst DEFAULT_TASK_LIST_LIMIT = 20;\nconst VALID_TASK_VIEWS = new Set<TaskView>([\n \"inbox\",\n \"anytime\",\n \"today\",\n \"upcoming\",\n \"someday\",\n]);\n\ninterface TaskListOptions {\n workspace?: string;\n state: string;\n limit: number;\n search?: string;\n}\n\ninterface TaskAddOptions {\n workspace?: string;\n notes?: string;\n when: string;\n deadline?: string;\n project?: string;\n team?: string;\n}\n\ninterface TaskTargetOptions {\n workspace?: string;\n}\n\ninterface TaskEditOptions extends TaskTargetOptions {\n title?: string;\n notes?: string;\n clearNotes: boolean;\n when?: string;\n deadline?: string;\n clearDeadline: boolean;\n project?: string;\n clearProject: boolean;\n team?: string;\n clearTeam: boolean;\n}\n\ninterface TaskRandomOptions {\n workspace?: string;\n state?: string;\n}\n\nfunction parseTaskView(value: string): TaskView {\n const normalized = value.trim().toLowerCase();\n\n if (VALID_TASK_VIEWS.has(normalized as TaskView)) {\n return normalized as TaskView;\n }\n\n throw new Error(\n `Invalid view \"${value}\". Expected one of: inbox, anytime, today, upcoming, someday.`\n );\n}\n\nfunction parseDeadline(value: string | undefined): number | null {\n if (!value) {\n return null;\n }\n\n const trimmed = value.trim();\n\n const ymdMatch = ISO_YMD_REGEX.exec(trimmed);\n\n if (ymdMatch) {\n const year = Number.parseInt(trimmed.slice(0, 4), 10);\n const month = Number.parseInt(trimmed.slice(5, 7), 10);\n const day = Number.parseInt(trimmed.slice(8, 10), 10);\n\n const date = new Date(year, month - 1, day);\n\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid deadline date: ${value}`);\n }\n\n return date.getTime();\n }\n\n const parsed = Date.parse(trimmed);\n\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid deadline date: ${value}`);\n }\n\n return parsed;\n}\n\nfunction sortTasksByUpdatedDesc(tasks: TaskRecord[]): TaskRecord[] {\n return [...tasks].sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n}\n\nexport async function resolveTaskReference(\n context: ReturnType<typeof contextFromCommand>,\n options: {\n taskRef: string;\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>;\n workspaceRef: string | null;\n }\n): Promise<TaskRecord> {\n const taskRef = options.taskRef.trim();\n\n if (!taskRef) {\n throw new Error(\"Task id is required.\");\n }\n\n const exact = await loadTaskById(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n taskId: taskRef,\n });\n\n if (exact) {\n return exact;\n }\n\n if (UUID_REGEX.test(taskRef)) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n\n if (taskRef.length < 4) {\n throw new Error(\"Task id prefix must be at least 4 characters.\");\n }\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: options.commandContext.token,\n apiBaseUrl: options.commandContext.apiBaseUrl,\n workspaceRef: options.workspaceRef,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: options.commandContext.apiBaseUrl,\n token: options.commandContext.token,\n workspaceId: workspace.id,\n });\n\n const matches = tasks.filter((task) => task.id.startsWith(taskRef));\n\n if (matches.length === 0) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n\n if (matches.length === 1) {\n const [match] = matches;\n\n if (!match) {\n throw new Error(`Task \"${taskRef}\" not found.`);\n }\n\n if (autoSelected && !context.json) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n return match;\n }\n\n throw new Error(\n `Task prefix \"${taskRef}\" is ambiguous (${matches.length} matches). Use the full id.`\n );\n}\n\nexport function filterTasks(\n tasks: TaskRecord[],\n options: { state: TaskState; search: string | null }\n): TaskRecord[] {\n const stateFiltered =\n options.state === \"all\"\n ? tasks\n : tasks.filter((task) => getTaskState(task) === options.state);\n\n if (!options.search) {\n return stateFiltered;\n }\n\n const query = options.search.trim().toLowerCase();\n\n if (query.length === 0) {\n return stateFiltered;\n }\n\n return stateFiltered.filter((task) => {\n const title = task.title.toLowerCase();\n const notes = task.description?.toLowerCase() ?? \"\";\n return title.includes(query) || notes.includes(query);\n });\n}\n\nasync function runTaskList(\n context: ReturnType<typeof contextFromCommand>,\n options: TaskListOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const requestedState = parseTaskState(options.state);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const filtered = filterTasks(sortTasksByUpdatedDesc(tasks), {\n state: requestedState,\n search: options.search?.trim() ?? null,\n });\n const limited = filtered.slice(0, options.limit);\n\n if (context.json) {\n writeJson({\n workspace,\n autoSelected,\n state: requestedState,\n total: filtered.length,\n count: limited.length,\n tasks: limited,\n });\n return;\n }\n\n const headers = [\"id\", \"title\", \"state\", \"deadline\"];\n const rows = limited.map((task) => [\n task.id,\n task.title,\n getTaskState(task),\n formatShortDate(task.deadlineAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, filtered.length, headers, rows)) {\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, \"No tasks found.\");\n return;\n }\n\n const lines: string[] = [];\n\n lines.push(`${workspace.name} (${limited.length}/${filtered.length})`);\n\n for (const task of limited) {\n const marker = toTaskMarker(task);\n const deadline = formatShortDate(task.deadlineAt);\n const suffix = deadline ? ` due ${deadline}` : \"\";\n lines.push(`${marker} ${task.id.slice(0, 8)} ${task.title}${suffix}`);\n }\n\n for (const line of lines) {\n writeInfo(context, line);\n }\n}\n\nexport async function runTaskShow(\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef,\n commandContext,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeJson({\n task,\n state: getTaskState(task),\n createdAtIso: formatEpochDate(task.createdAt),\n updatedAtIso: formatEpochDate(task.updatedAt),\n completedAtIso: formatEpochDate(task.completedAt),\n archivedAtIso: formatEpochDate(task.archivedAt),\n deadlineAtIso: formatEpochDate(task.deadlineAt),\n });\n return;\n }\n\n writeSuccess(context, task.title);\n writeInfo(context, `id: ${task.id}`);\n writeInfo(context, `state: ${getTaskState(task)}`);\n writeInfo(context, `workspaceId: ${task.workspaceId}`);\n writeInfo(context, `start: ${task.start}`);\n writeInfo(context, `startBucket: ${task.startBucket}`);\n writeInfo(\n context,\n `deadline: ${formatEpochDate(task.deadlineAt) ?? \"(none)\"}`\n );\n\n if (task.projectId) {\n writeInfo(context, `projectId: ${task.projectId}`);\n }\n\n if (task.teamId) {\n writeInfo(context, `teamId: ${task.teamId}`);\n }\n\n if (task.assigneeId) {\n writeInfo(context, `assigneeId: ${task.assigneeId}`);\n }\n\n if (task.description) {\n writeInfo(context, `notes: ${task.description}`);\n }\n}\n\nasync function runTaskAdd(\n context: ReturnType<typeof contextFromCommand>,\n title: string,\n options: TaskAddOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const userId = requireUserId(commandContext.resolvedToken);\n const normalizedTitle = title.trim();\n\n if (normalizedTitle.length === 0) {\n throw new Error(\"Task title cannot be empty.\");\n }\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const [projectId, teamId] = await Promise.all([\n options.project\n ? loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }).then((projects) =>\n resolveEntityId(projects, options.project as string, \"Project\")\n )\n : Promise.resolve(null),\n options.team\n ? loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }).then((teams) =>\n resolveEntityId(teams, options.team as string, \"Team\")\n )\n : Promise.resolve(null),\n ]);\n\n const taskId = randomUUID();\n const now = Date.now();\n const view = parseTaskView(options.when);\n const startFields = buildTaskStartFields(view);\n\n await mutateTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"Task\",\n modelId: taskId,\n action: \"INSERT\",\n payload: {\n title: normalizedTitle,\n description: options.notes?.trim() || null,\n creatorId: userId,\n workspaceId: workspace.id,\n createdAt: now,\n updatedAt: now,\n sortOrder: 0,\n todaySortOrder: 0,\n completedAt: null,\n archivedAt: null,\n deadlineAt: parseDeadline(options.deadline),\n projectId,\n teamId,\n ...startFields,\n },\n },\n ],\n },\n });\n\n if (context.json) {\n writeJson({\n created: true,\n id: taskId,\n workspaceId: workspace.id,\n workspaceName: workspace.name,\n autoSelected,\n view,\n projectId,\n teamId,\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, `Added task: ${normalizedTitle}`);\n writeInfo(context, `id: ${taskId}`);\n}\n\nasync function runTaskMutation(\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n payload: {\n workspaceRef: string | null;\n action: \"UPDATE\" | \"ARCHIVE\" | \"UNARCHIVE\";\n data: Record<string, unknown>;\n successMessage: string;\n }\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef,\n commandContext,\n workspaceRef: payload.workspaceRef,\n });\n\n await mutateTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"Task\",\n modelId: task.id,\n action: payload.action,\n payload: payload.data,\n },\n ],\n },\n });\n\n if (context.json) {\n writeJson({\n ok: true,\n id: task.id,\n action: payload.action,\n });\n return;\n }\n\n writeSuccess(context, `${payload.successMessage}: ${task.id}`);\n}\n\nfunction resolveEntityId(\n entities: Array<{ id: string; key: string }>,\n ref: string,\n label: string\n): string {\n const trimmed = ref.trim();\n const lower = trimmed.toLowerCase();\n const found = entities.find(\n (e) =>\n e.id === trimmed ||\n e.key.toLowerCase() === lower ||\n e.id.startsWith(trimmed)\n );\n\n if (!found) {\n throw new Error(`${label} \"${ref}\" not found.`);\n }\n\n return found.id;\n}\n\nasync function resolveProjectId(\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n projectRef: string,\n workspaceRef: string | null\n): Promise<string> {\n const { workspace } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n const projects = await loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n return resolveEntityId(projects, projectRef, \"Project\");\n}\n\nasync function resolveTeamId(\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n teamRef: string,\n workspaceRef: string | null\n): Promise<string> {\n const { workspace } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n const teams = await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n return resolveEntityId(teams, teamRef, \"Team\");\n}\n\nfunction validateTaskEditOptions(options: TaskEditOptions): void {\n if (options.clearNotes && typeof options.notes === \"string\") {\n throw new Error(\"Use either --notes or --clear-notes, not both.\");\n }\n if (options.clearDeadline && typeof options.deadline === \"string\") {\n throw new Error(\"Use either --deadline or --clear-deadline, not both.\");\n }\n if (options.clearProject && typeof options.project === \"string\") {\n throw new Error(\"Use either --project or --clear-project, not both.\");\n }\n if (options.clearTeam && typeof options.team === \"string\") {\n throw new Error(\"Use either --team or --clear-team, not both.\");\n }\n}\n\nfunction applyScalarEdits(\n updates: Record<string, unknown>,\n options: TaskEditOptions\n): void {\n if (typeof options.title === \"string\") {\n const title = options.title.trim();\n if (title.length === 0) {\n throw new Error(\"Task title cannot be empty.\");\n }\n updates.title = title;\n }\n if (options.clearNotes) {\n updates.description = null;\n } else if (typeof options.notes === \"string\") {\n const notes = options.notes.trim();\n updates.description = notes.length > 0 ? notes : null;\n }\n if (typeof options.when === \"string\") {\n Object.assign(updates, buildTaskStartFields(parseTaskView(options.when)));\n }\n if (options.clearDeadline) {\n updates.deadlineAt = null;\n } else if (typeof options.deadline === \"string\") {\n updates.deadlineAt = parseDeadline(options.deadline);\n }\n}\n\nasync function runTaskEdit(\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskEditOptions,\n workspaceOverride: string | null\n): Promise<void> {\n validateTaskEditOptions(options);\n\n const updates: Record<string, unknown> = {};\n applyScalarEdits(updates, options);\n\n const wsRef = workspaceOverride ?? normalizeWorkspaceRef(options.workspace);\n const commandContext = await resolveCommandContext(context);\n\n if (options.clearProject) {\n updates.projectId = null;\n } else if (typeof options.project === \"string\") {\n updates.projectId = await resolveProjectId(\n context,\n commandContext,\n options.project,\n wsRef\n );\n }\n\n if (options.clearTeam) {\n updates.teamId = null;\n } else if (typeof options.team === \"string\") {\n updates.teamId = await resolveTeamId(\n context,\n commandContext,\n options.team,\n wsRef\n );\n }\n\n if (Object.keys(updates).length === 0) {\n throw new Error(\n \"No updates provided. Use --title, --notes, --clear-notes, --when, --deadline, --clear-deadline, --project, --clear-project, --team, or --clear-team.\"\n );\n }\n\n updates.updatedAt = Date.now();\n\n await runTaskMutation(context, taskRef, {\n workspaceRef: wsRef,\n action: \"UPDATE\",\n data: updates,\n successMessage: \"Updated\",\n });\n}\n\nasync function runTaskRead(\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef,\n commandContext,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeJson({ id: task.id, description: task.description });\n return;\n }\n\n writeInfo(context, task.description ?? \"(empty)\");\n}\n\nasync function runTaskAppend(\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n text: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef,\n commandContext,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const newDesc = `${task.description ?? \"\"}\\n${text.trim()}`;\n\n await runTaskMutation(context, task.id, {\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"UPDATE\",\n data: { description: newDesc, updatedAt: Date.now() },\n successMessage: \"Appended\",\n });\n}\n\nasync function runTaskPrepend(\n context: ReturnType<typeof contextFromCommand>,\n taskRef: string,\n text: string,\n options: TaskTargetOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef,\n commandContext,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const existing = task.description ?? \"\";\n const newDesc =\n existing.length > 0 ? `${text.trim()}\\n${existing}` : text.trim();\n\n await runTaskMutation(context, task.id, {\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"UPDATE\",\n data: { description: newDesc, updatedAt: Date.now() },\n successMessage: \"Prepended\",\n });\n}\n\nasync function runTaskRandom(\n context: ReturnType<typeof contextFromCommand>,\n options: TaskRandomOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const requestedState = options.state ? parseTaskState(options.state) : \"open\";\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const filtered = filterTasks(tasks, {\n state: requestedState,\n search: null,\n });\n\n if (filtered.length === 0) {\n if (context.json) {\n writeJson({ task: null });\n return;\n }\n writeInfo(context, \"No tasks found.\");\n return;\n }\n\n const randomIndex = Math.floor(Math.random() * filtered.length);\n const task = filtered[randomIndex];\n\n if (!task) {\n throw new Error(\"Failed to pick a random task.\");\n }\n\n if (context.json) {\n writeJson({\n task,\n state: getTaskState(task),\n createdAtIso: formatEpochDate(task.createdAt),\n updatedAtIso: formatEpochDate(task.updatedAt),\n completedAtIso: formatEpochDate(task.completedAt),\n archivedAtIso: formatEpochDate(task.archivedAt),\n deadlineAtIso: formatEpochDate(task.deadlineAt),\n });\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n writeSuccess(context, task.title);\n writeInfo(context, `id: ${task.id}`);\n writeInfo(context, `state: ${getTaskState(task)}`);\n writeInfo(context, `workspaceId: ${task.workspaceId}`);\n writeInfo(context, `start: ${task.start}`);\n writeInfo(context, `startBucket: ${task.startBucket}`);\n writeInfo(\n context,\n `deadline: ${formatEpochDate(task.deadlineAt) ?? \"(none)\"}`\n );\n\n if (task.description) {\n writeInfo(context, `notes: ${task.description}`);\n }\n}\n\nasync function resolveChecklistItemReference(\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n taskId: string,\n itemRef: string\n): Promise<import(\"../types.js\").ChecklistItemRecord> {\n const trimmed = itemRef.trim();\n\n if (!trimmed) {\n throw new Error(\"Checklist item id is required.\");\n }\n\n const items = await loadChecklistItemsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n taskId,\n });\n\n const exact = items.find((item) => item.id === trimmed);\n\n if (exact) {\n return exact;\n }\n\n const matches = items.filter((item) => item.id.startsWith(trimmed));\n\n if (matches.length === 0) {\n throw new Error(`Checklist item \"${trimmed}\" not found.`);\n }\n\n if (matches.length === 1) {\n const [match] = matches;\n\n if (!match) {\n throw new Error(`Checklist item \"${trimmed}\" not found.`);\n }\n\n return match;\n }\n\n throw new Error(\n `Checklist item prefix \"${trimmed}\" is ambiguous (${matches.length} matches). Use the full id.`\n );\n}\n\nasync function runChecklistList(\n context: ReturnType<typeof contextFromCommand>,\n taskId: string,\n workspaceOption: string | undefined\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef: taskId,\n commandContext,\n workspaceRef: workspaceOption?.trim() ?? null,\n });\n const items = await loadChecklistItemsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n taskId: task.id,\n });\n const sorted = [...items].sort((a, b) => a.sortOrder - b.sortOrder);\n\n if (context.json) {\n writeJson({ taskId: task.id, items: sorted });\n return;\n }\n\n if (sorted.length === 0) {\n writeInfo(context, \"No checklist items.\");\n return;\n }\n\n writeInfo(context, `Checklist for: ${task.title}`);\n\n for (const item of sorted) {\n const marker = item.completedAt !== null ? \"[x]\" : \"[ ]\";\n writeInfo(context, `${marker} ${item.id.slice(0, 8)} ${item.title}`);\n }\n}\n\nexport function registerTaskCommands(\n program: Command,\n workspaceOverride: string | null\n): void {\n const task = program\n .command(\"task\")\n .alias(\"tasks\")\n .description(\"Manage tasks\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear task\n donebear task add \"Write launch post\" --when today\n donebear task list --state done --limit 50\n donebear task edit 8f2c1a --deadline 2026-03-05\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskList(\n context,\n { state: \"open\", limit: DEFAULT_TASK_LIST_LIMIT },\n workspaceOverride\n );\n });\n });\n\n task\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List tasks\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"open\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of tasks\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_TASK_LIST_LIMIT\n )\n .option(\"-q, --search <query>\", \"Filter by title or notes\")\n .action(async (options: TaskListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskList(context, options, workspaceOverride);\n });\n });\n\n task\n .command(\"show\")\n .description(\"Show task details\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskShow(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"read\")\n .description(\"Print the description (notes) of a task\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskRead(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"append\")\n .description(\"Append text to a task's description\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .argument(\"<text>\", \"Text to append\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n text: string,\n options: TaskTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskAppend(\n context,\n taskId,\n text,\n options,\n workspaceOverride\n );\n });\n }\n );\n\n task\n .command(\"prepend\")\n .description(\"Prepend text to a task's description\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .argument(\"<text>\", \"Text to prepend\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n text: string,\n options: TaskTargetOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskPrepend(\n context,\n taskId,\n text,\n options,\n workspaceOverride\n );\n });\n }\n );\n\n task\n .command(\"random\")\n .description(\"Show a random task\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"open\")\n .action(async (options: TaskRandomOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskRandom(context, options, workspaceOverride);\n });\n });\n\n task\n .command(\"add\")\n .alias(\"create\")\n .description(\"Create a task\")\n .argument(\"<title>\", \"Task title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-n, --notes <text>\", \"Task notes\")\n .option(\"--when <view>\", \"inbox|anytime|today|upcoming|someday\", \"inbox\")\n .option(\"--deadline <date>\", \"Deadline (YYYY-MM-DD or ISO datetime)\")\n .option(\"--project <key-or-id>\", \"Project key or id\")\n .option(\"--team <key-or-id>\", \"Team key or id\")\n .action(\n async (title: string, options: TaskAddOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskAdd(context, title, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"edit\")\n .description(\"Update task fields\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"--title <title>\", \"Replace task title\")\n .option(\"--notes <text>\", \"Replace task notes (empty string clears)\")\n .option(\"--clear-notes\", \"Clear task notes\")\n .option(\n \"--when <view>\",\n \"Set view bucket (inbox|anytime|today|upcoming|someday)\"\n )\n .option(\"--deadline <date>\", \"Set deadline (YYYY-MM-DD or ISO datetime)\")\n .option(\"--clear-deadline\", \"Clear deadline\")\n .option(\"--project <key-or-id>\", \"Set project (key or id)\")\n .option(\"--clear-project\", \"Remove project assignment\")\n .option(\"--team <key-or-id>\", \"Set team (key or id)\")\n .option(\"--clear-team\", \"Remove team assignment\")\n .action(\n async (taskId: string, options: TaskEditOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskEdit(context, taskId, options, workspaceOverride);\n });\n }\n );\n\n task\n .command(\"done\")\n .alias(\"complete\")\n .description(\"Mark a task as completed\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const now = Date.now();\n await runTaskMutation(context, taskId, {\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"UPDATE\",\n data: { completedAt: now, updatedAt: now },\n successMessage: \"Marked done\",\n });\n });\n }\n );\n\n task\n .command(\"reopen\")\n .alias(\"undo\")\n .description(\"Reopen a completed task\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskMutation(context, taskId, {\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"UPDATE\",\n data: { completedAt: null, updatedAt: Date.now() },\n successMessage: \"Reopened\",\n });\n });\n }\n );\n\n task\n .command(\"archive\")\n .description(\"Archive a task\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskMutation(context, taskId, {\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"ARCHIVE\",\n data: { archivedAt: Date.now() },\n successMessage: \"Archived\",\n });\n });\n }\n );\n\n task\n .command(\"unarchive\")\n .alias(\"restore\")\n .description(\"Unarchive a task\")\n .argument(\"<id>\", \"Task id or unique prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (taskId: string, options: TaskTargetOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTaskMutation(context, taskId, {\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n action: \"UNARCHIVE\",\n data: {},\n successMessage: \"Unarchived\",\n });\n });\n }\n );\n\n const checklist = task\n .command(\"checklist\")\n .alias(\"cl\")\n .description(\"Manage task checklist items\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runChecklistList(context, taskId, options.workspace);\n });\n }\n );\n\n checklist\n .command(\"add\")\n .description(\"Add a checklist item\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<title>\", \"Item title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n title: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef: taskId,\n commandContext,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const itemId = randomUUID();\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"TaskChecklistItem\",\n modelId: itemId,\n action: \"INSERT\",\n payload: {\n title: title.trim(),\n taskId: task.id,\n workspaceId: task.workspaceId,\n sortOrder: now,\n completedAt: null,\n createdAt: now,\n updatedAt: now,\n },\n },\n ],\n },\n });\n if (context.json) {\n writeJson({ created: true, id: itemId });\n return;\n }\n writeSuccess(context, `Added: ${title.trim()}`);\n });\n }\n );\n\n checklist\n .command(\"done\")\n .description(\"Mark a checklist item as complete\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef: taskId,\n commandContext,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n task.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"TaskChecklistItem\",\n modelId: item.id,\n action: \"UPDATE\",\n payload: { completedAt: now, updatedAt: now },\n },\n ],\n },\n });\n if (context.json) {\n writeJson({ ok: true, id: item.id });\n return;\n }\n writeSuccess(context, `Marked done: ${item.title}`);\n });\n }\n );\n\n checklist\n .command(\"reopen\")\n .description(\"Reopen a completed checklist item\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef: taskId,\n commandContext,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n task.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"TaskChecklistItem\",\n modelId: item.id,\n action: \"UPDATE\",\n payload: { completedAt: null, updatedAt: now },\n },\n ],\n },\n });\n if (context.json) {\n writeJson({ ok: true, id: item.id });\n return;\n }\n writeSuccess(context, `Reopened: ${item.title}`);\n });\n }\n );\n\n checklist\n .command(\"edit\")\n .description(\"Edit a checklist item title\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .requiredOption(\"--title <title>\", \"New item title\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { title: string; workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const newTitle = options.title.trim();\n\n if (newTitle.length === 0) {\n throw new Error(\"Checklist item title cannot be empty.\");\n }\n\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef: taskId,\n commandContext,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n task.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"TaskChecklistItem\",\n modelId: item.id,\n action: \"UPDATE\",\n payload: { title: newTitle, updatedAt: now },\n },\n ],\n },\n });\n if (context.json) {\n writeJson({ ok: true, id: item.id });\n return;\n }\n writeSuccess(context, `Updated: ${newTitle}`);\n });\n }\n );\n\n checklist\n .command(\"remove\")\n .alias(\"rm\")\n .description(\"Remove a checklist item\")\n .argument(\"<task-id>\", \"Task id or prefix\")\n .argument(\"<item-id>\", \"Checklist item id or prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n taskId: string,\n itemId: string,\n options: { workspace?: string },\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n const commandContext = await resolveCommandContext(context);\n const task = await resolveTaskReference(context, {\n taskRef: taskId,\n commandContext,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n task.id,\n itemId\n );\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n clientTxId: randomUUID(),\n clientId: commandContext.localContext.clientId,\n modelName: \"TaskChecklistItem\",\n modelId: item.id,\n action: \"ARCHIVE\",\n payload: {},\n },\n ],\n },\n });\n if (context.json) {\n writeJson({ removed: true, id: item.id });\n return;\n }\n writeSuccess(context, `Removed: ${item.title}`);\n });\n }\n );\n}\n","import type { Command } from \"commander\";\nimport { resolveCommandContext } from \"../command-context.js\";\nimport {\n normalizeWorkspaceRef,\n parseTaskState,\n toTaskMarker,\n} from \"../command-helpers.js\";\nimport { parsePositiveInteger } from \"../command-parsers.js\";\nimport { loadTasksByWorkspace } from \"../manage-api.js\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeJson,\n} from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport { formatShortDate, getTaskState } from \"../task-defaults.js\";\nimport { resolveWorkspace } from \"../workspace-context.js\";\nimport { filterTasks } from \"./task.js\";\n\nconst DEFAULT_SEARCH_LIMIT = 20;\n\ninterface SearchOptions {\n workspace?: string;\n state: string;\n limit: number;\n}\n\nasync function runSearch(\n context: ReturnType<typeof contextFromCommand>,\n query: string,\n options: SearchOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const requestedState = parseTaskState(options.state);\n const trimmedQuery = query.trim();\n\n if (trimmedQuery.length === 0) {\n throw new Error(\"Search query cannot be empty.\");\n }\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const filtered = filterTasks(tasks, {\n state: requestedState,\n search: trimmedQuery,\n });\n\n const limited = filtered.slice(0, options.limit);\n\n if (context.json) {\n writeJson({\n workspace,\n autoSelected,\n query: trimmedQuery,\n state: requestedState,\n total: filtered.length,\n count: limited.length,\n tasks: limited,\n });\n return;\n }\n\n const headers = [\"id\", \"title\", \"state\", \"deadline\"];\n const rows = limited.map((task) => [\n task.id,\n task.title,\n getTaskState(task),\n formatShortDate(task.deadlineAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, filtered.length, headers, rows)) {\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, `No tasks found matching \"${trimmedQuery}\".`);\n return;\n }\n\n const lines: string[] = [];\n\n lines.push(\n `${workspace.name} — \"${trimmedQuery}\" (${limited.length}/${filtered.length})`\n );\n\n for (const task of limited) {\n const marker = toTaskMarker(task);\n const deadline = formatShortDate(task.deadlineAt);\n const suffix = deadline ? ` due ${deadline}` : \"\";\n lines.push(`${marker} ${task.id.slice(0, 8)} ${task.title}${suffix}`);\n }\n\n for (const line of lines) {\n writeInfo(context, line);\n }\n\n if (context.copy) {\n copyToClipboard(lines.join(\"\\n\"));\n }\n}\n\nexport function registerSearchCommand(\n program: Command,\n workspaceOverride: string | null\n): void {\n program\n .command(\"search\")\n .description(\"Search tasks by title or notes\")\n .argument(\"<query>\", \"Search query\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-s, --state <state>\", \"open|done|archived|all\", \"all\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of results\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_SEARCH_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear search \"meeting\"\n donebear search \"launch\" --state open\n donebear search \"Q1\" --format csv --copy\n donebear search \"review\" --total\n`\n )\n .action(async (query: string, options: SearchOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runSearch(context, query, options, workspaceOverride);\n });\n });\n}\n","// donebear team [list|show]\n// donebear team list [--workspace <ws>]\n// donebear team show <id-or-key> [--workspace <ws>]\n\nimport type { Command } from \"commander\";\nimport { resolveCommandContext } from \"../command-context.js\";\nimport { normalizeWorkspaceRef } from \"../command-helpers.js\";\nimport { loadTeamsByWorkspace } from \"../manage-api.js\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeJson,\n writeSuccess,\n} from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport type { TeamRecord } from \"../types.js\";\nimport { resolveWorkspace } from \"../workspace-context.js\";\n\ninterface TeamListOptions {\n workspace?: string;\n}\n\ninterface TeamShowOptions {\n workspace?: string;\n}\n\nfunction findTeam(ref: string, teams: TeamRecord[]): TeamRecord | null {\n const normalized = ref.trim().toLowerCase();\n\n for (const team of teams) {\n if (team.id === ref) {\n return team;\n }\n\n if (team.key.toLowerCase() === normalized) {\n return team;\n }\n\n if (team.id.startsWith(ref)) {\n return team;\n }\n }\n\n return null;\n}\n\nasync function runTeamList(\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: TeamListOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const teams = await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeJson({ workspace, teams });\n return;\n }\n\n const headers = [\"id\", \"key\", \"name\"];\n const rows = teams.map((t) => [t.id, t.key, t.name]);\n\n if (writeFormattedRows(context, teams.length, headers, rows)) {\n return;\n }\n\n if (teams.length === 0) {\n writeInfo(context, \"No teams found.\");\n return;\n }\n\n writeInfo(context, `Teams in ${workspace.name}:`);\n\n for (const team of teams) {\n writeInfo(context, `${team.id.slice(0, 8)} [${team.key}] ${team.name}`);\n }\n}\n\nasync function runTeamShow(\n context: ReturnType<typeof contextFromCommand>,\n teamRef: string,\n workspaceOverride: string | null,\n options: TeamShowOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const teams = await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const team = findTeam(teamRef.trim(), teams);\n\n if (!team) {\n throw new Error(`Team \"${teamRef}\" not found. Run \\`donebear team list\\`.`);\n }\n\n if (context.json) {\n writeJson({ workspace, team });\n return;\n }\n\n writeSuccess(context, team.name);\n writeInfo(context, `id: ${team.id}`);\n writeInfo(context, `key: ${team.key}`);\n writeInfo(context, `name: ${team.name}`);\n writeInfo(context, `description: ${team.description ?? \"(none)\"}`);\n writeInfo(context, `workspaceId: ${team.workspaceId ?? \"(none)\"}`);\n}\n\nexport function registerTeamCommands(\n program: Command,\n workspaceOverride: string | null\n): void {\n const team = program\n .command(\"team\")\n .alias(\"teams\")\n .description(\"Manage teams\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear team\n donebear team list\n donebear team show ENG\n donebear team list --format csv\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamList(context, workspaceOverride, {});\n });\n });\n\n team\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List teams in the current or specified workspace\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(async (options: TeamListOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamList(context, workspaceOverride, options);\n });\n });\n\n team\n .command(\"show\")\n .description(\"Show team details\")\n .argument(\"<id-or-key>\", \"Team id, key, or id prefix\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (teamRef: string, options: TeamShowOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runTeamShow(context, teamRef, workspaceOverride, options);\n });\n }\n );\n}\n","import type { Command } from \"commander\";\nimport { resolveCommandContext } from \"../command-context.js\";\nimport { normalizeWorkspaceRef, toTaskMarker } from \"../command-helpers.js\";\nimport { parsePositiveInteger } from \"../command-parsers.js\";\nimport { loadTasksByWorkspace } from \"../manage-api.js\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeJson,\n} from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport { formatShortDate, getTaskState } from \"../task-defaults.js\";\nimport { resolveWorkspace } from \"../workspace-context.js\";\n\nconst DEFAULT_TODAY_LIMIT = 20;\n\ninterface TodayOptions {\n workspace?: string;\n limit: number;\n}\n\nasync function runToday(\n context: ReturnType<typeof contextFromCommand>,\n options: TodayOptions,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const tasks = await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n const todayTasks = tasks.filter(\n (task) =>\n task.todayIndexReferenceDate !== null &&\n task.completedAt === null &&\n task.archivedAt === null\n );\n\n const limited = todayTasks.slice(0, options.limit);\n\n if (context.json) {\n writeJson({\n workspace,\n autoSelected,\n total: todayTasks.length,\n count: limited.length,\n tasks: limited,\n });\n return;\n }\n\n const headers = [\"id\", \"title\", \"state\", \"deadline\"];\n const rows = limited.map((task) => [\n task.id,\n task.title,\n getTaskState(task),\n formatShortDate(task.deadlineAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, todayTasks.length, headers, rows)) {\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, \"No tasks for today.\");\n return;\n }\n\n const lines: string[] = [];\n\n lines.push(\n `${workspace.name} — Today (${limited.length}/${todayTasks.length})`\n );\n\n for (const task of limited) {\n const marker = toTaskMarker(task);\n const deadline = formatShortDate(task.deadlineAt);\n const suffix = deadline ? ` due ${deadline}` : \"\";\n lines.push(`${marker} ${task.id.slice(0, 8)} ${task.title}${suffix}`);\n }\n\n for (const line of lines) {\n writeInfo(context, line);\n }\n\n if (context.copy) {\n copyToClipboard(lines.join(\"\\n\"));\n }\n}\n\nexport function registerTodayCommand(\n program: Command,\n workspaceOverride: string | null\n): void {\n program\n .command(\"today\")\n .description(\"List today's tasks\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"-n, --limit <count>\",\n \"Maximum number of tasks\",\n (value: string): number => parsePositiveInteger(value, \"Limit\"),\n DEFAULT_TODAY_LIMIT\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear today\n donebear today --limit 10\n donebear today --format csv\n donebear today --total\n`\n )\n .action(async (options: TodayOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runToday(context, options, workspaceOverride);\n });\n });\n}\n","import type { Command } from \"commander\";\nimport { resolveAuthToken } from \"../auth-session.js\";\nimport { EXIT_CODES } from \"../errors.js\";\nimport { writeInfo, writeJson, writeSuccess } from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport { getSupabaseUser, resolveSupabaseConfig } from \"../supabase.js\";\n\nasync function runWhoAmI(\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> {\n const config = resolveSupabaseConfig();\n const resolvedToken = await resolveAuthToken(context, config);\n\n if (!resolvedToken) {\n process.exitCode = EXIT_CODES.AUTH_REQUIRED;\n\n if (context.json) {\n writeJson({\n ok: false,\n error: {\n message: \"Not authenticated\",\n exitCode: EXIT_CODES.AUTH_REQUIRED,\n },\n });\n return;\n }\n\n writeInfo(context, \"Not authenticated.\");\n writeInfo(context, \"Run `donebear auth login`.\");\n return;\n }\n\n const user = await getSupabaseUser(config, resolvedToken.token);\n\n if (context.json) {\n writeJson({\n ok: true,\n user: {\n id: user.id,\n email: user.email ?? null,\n },\n source: resolvedToken.source,\n });\n return;\n }\n\n writeSuccess(context, \"Authenticated user:\");\n writeInfo(context, `id: ${user.id}`);\n writeInfo(context, `email: ${user.email ?? \"(none)\"}`);\n writeInfo(context, `source: ${resolvedToken.source}`);\n}\n\nexport function registerWhoAmICommand(program: Command): void {\n program\n .command(\"whoami\")\n .alias(\"me\")\n .description(\"Show the current authenticated user\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWhoAmI(context);\n });\n });\n}\n","import type { Command } from \"commander\";\nimport { resolveCommandContext } from \"../command-context.js\";\nimport { setCurrentWorkspace } from \"../context-store.js\";\nimport {\n createWorkspace,\n createWorkspaceInvitation,\n joinWorkspace,\n listWorkspaceInvitations,\n listWorkspaceMembers,\n listWorkspaces,\n} from \"../manage-api.js\";\nimport {\n copyToClipboard,\n writeCsv,\n writeInfo,\n writeJson,\n writeSuccess,\n writeTotal,\n writeTsv,\n} from \"../output.js\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime.js\";\nimport {\n isValidWorkspaceUrlKey,\n resolveWorkspace,\n toWorkspaceUrlKey,\n} from \"../workspace-context.js\";\n\ninterface WorkspaceCreateOptions {\n slug?: string;\n logoUrl?: string;\n use: boolean;\n}\n\ninterface WorkspaceJoinOptions {\n use: boolean;\n}\n\ninterface WorkspaceMembersOptions {\n format?: string;\n total?: boolean;\n}\n\ninterface WorkspaceInviteOptions {\n email?: string;\n role?: string;\n}\n\nfunction findWorkspace(\n workspaceRef: string,\n workspaces: Awaited<ReturnType<typeof listWorkspaces>>\n) {\n const normalizedReference = workspaceRef.trim().toLowerCase();\n\n return workspaces.find((workspace) => {\n if (workspace.id === workspaceRef) {\n return true;\n }\n\n if (workspace.urlKey?.toLowerCase() === normalizedReference) {\n return true;\n }\n\n return workspace.name.toLowerCase() === normalizedReference;\n });\n}\n\nfunction writeCurrentWorkspaceNotAvailable(\n context: ReturnType<typeof contextFromCommand>,\n message: string\n): void {\n if (context.json) {\n writeJson({\n workspace: null,\n });\n return;\n }\n\n writeInfo(context, message);\n writeInfo(context, \"Run `donebear workspace use <id-or-slug>`.\");\n}\n\nasync function runWorkspaceList(\n context: ReturnType<typeof contextFromCommand>\n) {\n const commandContext = await resolveCommandContext(context);\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n if (context.json) {\n writeJson({\n workspaces,\n currentWorkspaceId: commandContext.localContext.workspaceId,\n });\n return;\n }\n\n if (workspaces.length === 0) {\n writeInfo(context, \"No workspaces found.\");\n return;\n }\n\n writeInfo(context, \"Workspaces:\");\n\n for (const workspace of workspaces) {\n const marker =\n workspace.id === commandContext.localContext.workspaceId ? \"*\" : \" \";\n\n writeInfo(\n context,\n `${marker} ${workspace.id} ${workspace.name}${workspace.urlKey ? ` (${workspace.urlKey})` : \"\"} role=${workspace.role}`\n );\n }\n}\n\nasync function runWorkspaceCurrent(\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n if (!commandContext.localContext.workspaceId) {\n writeCurrentWorkspaceNotAvailable(\n context,\n \"No default workspace selected.\"\n );\n return;\n }\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const workspace = workspaces.find(\n (item) => item.id === commandContext.localContext.workspaceId\n );\n\n if (!workspace) {\n writeCurrentWorkspaceNotAvailable(\n context,\n \"Saved workspace is no longer accessible.\"\n );\n return;\n }\n\n if (context.json) {\n writeJson({\n workspace,\n });\n return;\n }\n\n writeSuccess(context, `Current workspace: ${workspace.name}`);\n writeInfo(context, `id: ${workspace.id}`);\n writeInfo(context, `slug: ${workspace.urlKey ?? \"(none)\"}`);\n writeInfo(context, `role: ${workspace.role}`);\n}\n\nasync function runWorkspaceUse(\n context: ReturnType<typeof contextFromCommand>,\n reference: string\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const workspaces = await listWorkspaces(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const selected = findWorkspace(reference, workspaces);\n\n if (!selected) {\n throw new Error(\n `Workspace \"${reference}\" not found. Run \\`donebear workspace list\\`.`\n );\n }\n\n await setCurrentWorkspace(selected.id);\n\n if (context.json) {\n writeJson({\n workspace: selected,\n selected: true,\n });\n return;\n }\n\n writeSuccess(context, `Selected workspace: ${selected.name}`);\n writeInfo(context, `id: ${selected.id}`);\n}\n\nasync function runWorkspaceClear(\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> {\n await setCurrentWorkspace(null);\n\n if (context.json) {\n writeJson({\n cleared: true,\n workspace: null,\n });\n return;\n }\n\n writeSuccess(context, \"Cleared current workspace.\");\n}\n\nasync function runWorkspaceCreate(\n context: ReturnType<typeof contextFromCommand>,\n name: string,\n options: WorkspaceCreateOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const slug = (options.slug ?? toWorkspaceUrlKey(name)).trim();\n\n if (!isValidWorkspaceUrlKey(slug)) {\n throw new Error(\n \"Workspace slug must be lowercase alphanumeric with hyphens and at least 3 characters\"\n );\n }\n\n const workspace = await createWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n body: {\n name,\n urlKey: slug,\n logoUrl: options.logoUrl,\n },\n });\n\n if (options.use) {\n await setCurrentWorkspace(workspace.id);\n }\n\n if (context.json) {\n writeJson({\n workspace,\n selected: options.use,\n });\n return;\n }\n\n writeSuccess(context, `Created workspace: ${workspace.name}`);\n writeInfo(context, `id: ${workspace.id}`);\n writeInfo(context, `slug: ${workspace.urlKey ?? slug}`);\n\n if (options.use) {\n writeInfo(context, \"Set as current workspace.\");\n }\n}\n\nasync function runWorkspaceJoin(\n context: ReturnType<typeof contextFromCommand>,\n code: string,\n options: WorkspaceJoinOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n const trimmedCode = code.trim();\n\n if (!trimmedCode) {\n throw new Error(\"Invitation code is required.\");\n }\n\n const joined = await joinWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n code: trimmedCode,\n });\n\n if (options.use) {\n await setCurrentWorkspace(joined.workspace.id);\n }\n\n if (context.json) {\n writeJson({\n workspace: joined.workspace,\n role: joined.role,\n selected: options.use,\n });\n return;\n }\n\n writeSuccess(context, `Joined workspace: ${joined.workspace.name}`);\n writeInfo(context, `id: ${joined.workspace.id}`);\n writeInfo(context, `role: ${joined.role}`);\n\n if (options.use) {\n writeInfo(context, \"Set as current workspace.\");\n }\n}\n\nasync function runWorkspaceMembers(\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null,\n options: WorkspaceMembersOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const members = await listWorkspaceMembers(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeJson({ workspace, members });\n return;\n }\n\n if (context.total) {\n writeTotal(context, members.length);\n return;\n }\n\n const format = options.format?.trim().toLowerCase() ?? context.format;\n\n if (format === \"csv\") {\n writeCsv(\n [\"userId\", \"name\", \"email\", \"role\"],\n members.map((m) => [\n m.userId,\n m.user.name ?? \"\",\n m.user.email ?? \"\",\n m.role,\n ])\n );\n return;\n }\n\n if (format === \"tsv\") {\n writeTsv(\n [\"userId\", \"name\", \"email\", \"role\"],\n members.map((m) => [\n m.userId,\n m.user.name ?? \"\",\n m.user.email ?? \"\",\n m.role,\n ])\n );\n return;\n }\n\n if (members.length === 0) {\n writeInfo(context, \"No members found.\");\n return;\n }\n\n writeInfo(context, `Members of ${workspace.name}:`);\n\n for (const member of members) {\n writeInfo(\n context,\n `${member.userId} ${member.user.name ?? \"(no name)\"} ${member.user.email ?? \"(no email)\"} ${member.role}`\n );\n }\n}\n\nasync function runWorkspaceInvitations(\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const invitations = await listWorkspaceInvitations(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeJson({ workspace, invitations });\n return;\n }\n\n if (invitations.length === 0) {\n writeInfo(context, \"No invitations found.\");\n return;\n }\n\n writeInfo(context, `Invitations for ${workspace.name}:`);\n\n for (const invitation of invitations) {\n const used = invitation.usedAt ? \"yes\" : \"no\";\n writeInfo(\n context,\n `${invitation.id.slice(0, 8)} ${invitation.email ?? \"(open)\"} ${invitation.role} expires=${invitation.expiresAt} used=${used}`\n );\n }\n}\n\nasync function runWorkspaceInvite(\n context: ReturnType<typeof contextFromCommand>,\n workspaceRefArg: string | undefined,\n workspaceOverride: string | null,\n options: WorkspaceInviteOptions\n): Promise<void> {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n token: commandContext.token,\n apiBaseUrl: commandContext.apiBaseUrl,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n });\n\n const invitation = await createWorkspaceInvitation(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n email: options.email,\n role: options.role ?? \"member\",\n });\n\n if (context.json) {\n writeJson({ workspace, invitation });\n return;\n }\n\n writeSuccess(context, `Invitation created for ${workspace.name}`);\n writeInfo(context, `code: ${invitation.code}`);\n writeInfo(context, `role: ${invitation.role}`);\n writeInfo(context, `expires: ${invitation.expiresAt}`);\n\n if (invitation.email) {\n writeInfo(context, `email: ${invitation.email}`);\n }\n\n const link = `${commandContext.apiBaseUrl}/invite/${invitation.code}`;\n writeInfo(context, `link: ${link}`);\n\n if (context.copy) {\n const copied = copyToClipboard(link);\n if (copied) {\n writeInfo(context, \"Link copied to clipboard.\");\n }\n }\n}\n\nexport function registerWorkspaceCommands(\n program: Command,\n workspaceOverride: string | null\n): void {\n const workspace = program\n .command(\"workspace\")\n .alias(\"ws\")\n .description(\"Manage workspaces\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear workspace\n donebear workspace use personal\n donebear workspace create \"Personal\" --slug personal\n donebear workspace join ABCD2345\n donebear workspace members\n donebear workspace invitations\n donebear workspace invite --email user@example.com --role member\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceList(context);\n });\n });\n\n workspace\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List workspaces available to the current user\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceList(context);\n });\n });\n\n workspace\n .command(\"current\")\n .description(\"Show the current default workspace\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceCurrent(context);\n });\n });\n\n workspace\n .command(\"use\")\n .description(\"Set the default workspace\")\n .argument(\"<workspace>\", \"Workspace id, slug, or exact name\")\n .action(\n async (workspaceRef: string, _options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceUse(context, workspaceRef);\n });\n }\n );\n\n workspace\n .command(\"clear\")\n .description(\"Clear the default workspace\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceClear(context);\n });\n });\n\n workspace\n .command(\"create\")\n .description(\"Create a workspace\")\n .argument(\"<name>\", \"Workspace display name\")\n .option(\"--slug <slug>\", \"Workspace urlKey slug\")\n .option(\"--logo-url <url>\", \"Workspace logo URL\")\n .option(\"--no-use\", \"Do not set as current workspace\")\n .action(\n async (\n name: string,\n options: WorkspaceCreateOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceCreate(context, name, options);\n });\n }\n );\n\n workspace\n .command(\"join\")\n .description(\"Join a workspace with an invitation code\")\n .argument(\"<code>\", \"Invitation code\")\n .option(\"--no-use\", \"Do not set joined workspace as current\")\n .action(\n async (code: string, options: WorkspaceJoinOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceJoin(context, code, options);\n });\n }\n );\n\n workspace\n .command(\"members\")\n .description(\"List members of the current or specified workspace\")\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .option(\"--format <format>\", \"Output format: text|json|csv|tsv\")\n .option(\"--total\", \"Print member count only\")\n .action(\n async (\n workspaceRef: string | undefined,\n options: WorkspaceMembersOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceMembers(\n context,\n workspaceRef,\n workspaceOverride,\n options\n );\n });\n }\n );\n\n workspace\n .command(\"invitations\")\n .alias(\"invites\")\n .description(\n \"List pending invitations for the current or specified workspace\"\n )\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .action(\n async (\n workspaceRef: string | undefined,\n _options: unknown,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceInvitations(\n context,\n workspaceRef,\n workspaceOverride\n );\n });\n }\n );\n\n workspace\n .command(\"invite\")\n .description(\"Create an invitation for the current or specified workspace\")\n .argument(\"[workspace]\", \"Workspace id, slug, or exact name\")\n .option(\"--email <email>\", \"Email address to invite\")\n .option(\"--role <role>\", \"Role for the invitee: member|admin\", \"member\")\n .action(\n async (\n workspaceRef: string | undefined,\n options: WorkspaceInviteOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runWorkspaceInvite(\n context,\n workspaceRef,\n workspaceOverride,\n options\n );\n });\n }\n );\n}\n","import { createRequire } from \"node:module\";\nimport { Command } from \"commander\";\nimport { registerAuthCommands } from \"./commands/auth.js\";\nimport { registerHistoryCommand } from \"./commands/history.js\";\nimport { runInteractiveMode } from \"./commands/interactive.js\";\nimport { registerLabelCommands } from \"./commands/label.js\";\nimport { registerProjectCommands } from \"./commands/project.js\";\nimport { registerSearchCommand } from \"./commands/search.js\";\nimport { registerTaskCommands } from \"./commands/task.js\";\nimport { registerTeamCommands } from \"./commands/team.js\";\nimport { registerTodayCommand } from \"./commands/today.js\";\nimport { registerWhoAmICommand } from \"./commands/whoami.js\";\nimport { registerWorkspaceCommands } from \"./commands/workspace.js\";\nimport { CLI_NAME, DONEBEAR_DEBUG_ENV } from \"./constants.js\";\nimport { loadCliEnvironmentFiles } from \"./env.js\";\nimport { contextFromArgv, runWithErrorHandling } from \"./runtime.js\";\n\ninterface PackageManifest {\n version: string;\n}\n\nconst require = createRequire(import.meta.url);\nconst packageManifest = require(\"../package.json\") as PackageManifest;\n\nconst WORKSPACE_PREFIX_REGEX = /^workspace=(.+)$/i;\n\nfunction extractWorkspaceTarget(argv: string[]): {\n processedArgv: string[];\n workspaceOverride: string | null;\n} {\n const processedArgv = [...argv];\n const firstArg = processedArgv[2];\n\n if (firstArg) {\n const match = WORKSPACE_PREFIX_REGEX.exec(firstArg);\n if (match?.[1]) {\n processedArgv.splice(2, 1);\n return { processedArgv, workspaceOverride: match[1].trim() };\n }\n }\n\n return { processedArgv, workspaceOverride: null };\n}\n\nasync function main(): Promise<void> {\n loadCliEnvironmentFiles();\n\n const { processedArgv, workspaceOverride } = extractWorkspaceTarget(\n process.argv\n );\n\n const program = new Command();\n\n program\n .name(CLI_NAME)\n .description(\"Done Bear CLI for auth, workspace, and task workflows\")\n .version(packageManifest.version)\n .showHelpAfterError()\n .showSuggestionAfterError()\n .option(\"--json\", \"Output machine-readable JSON\")\n .option(\"--format <format>\", \"Output format: text|json|csv|tsv\", \"text\")\n .option(\"--copy\", \"Copy output to clipboard\")\n .option(\"--total\", \"Print count only\")\n .option(\n \"--token <token>\",\n \"Use an explicit token (overrides DONEBEAR_TOKEN)\"\n )\n .option(\n \"--api-url <url>\",\n \"Manage API base URL (overrides DONEBEAR_API_URL)\"\n )\n .option(\n \"--debug\",\n \"Enable debug logs\",\n process.env[DONEBEAR_DEBUG_ENV] === \"1\"\n )\n .option(\"--no-color\", \"Disable color output\")\n .addHelpText(\n \"after\",\n `\nQuick start:\n donebear auth login\n donebear workspace\n donebear task add \"Plan week\" --when today\n donebear task\n donebear today\n donebear search \"meeting\"\n donebear project\n donebear label\n\nWorkspace targeting:\n donebear workspace=myorg task list\n\nUse --json for scripting, --format csv|tsv for export, --total for counts.\n`\n );\n\n registerAuthCommands(program);\n registerWorkspaceCommands(program, workspaceOverride);\n registerTaskCommands(program, workspaceOverride);\n registerProjectCommands(program, workspaceOverride);\n registerLabelCommands(program, workspaceOverride);\n registerTeamCommands(program, workspaceOverride);\n registerTodayCommand(program, workspaceOverride);\n registerSearchCommand(program, workspaceOverride);\n registerHistoryCommand(program, workspaceOverride);\n registerWhoAmICommand(program);\n\n const hasUserArgs = processedArgv.length <= 2;\n const isTTY = process.stdin.isTTY === true;\n\n if (hasUserArgs && isTTY) {\n const ttyContext = contextFromArgv(processedArgv);\n await runInteractiveMode(ttyContext, program);\n return;\n }\n\n await program.parseAsync(processedArgv);\n}\n\nconst fallbackContext = contextFromArgv(process.argv);\n\nawait runWithErrorHandling(fallbackContext, main);\n"],"mappings":"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"}