donebear 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +129 -0
- package/README.md +251 -0
- package/dist/cli.d.mts +2 -0
- package/dist/cli.mjs +6754 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/context-store-B78SQdMW.mjs +4 -0
- package/dist/context-store-BP3Fw5Ki.mjs +139 -0
- package/dist/context-store-BP3Fw5Ki.mjs.map +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +1 -0
- package/dist/prompt-CYNcGB9p.mjs +4 -0
- package/dist/prompt-JbRe_zaa.mjs +37 -0
- package/dist/prompt-JbRe_zaa.mjs.map +1 -0
- package/package.json +64 -0
package/dist/cli.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["getOptionalSupabaseConfig","yamlStringify","packageManifest","fsConstants"],"sources":["../src/jwt.ts","../src/oauth-token.ts","../src/storage.ts","../src/env.ts","../src/supabase.ts","../src/auth-session.ts","../src/api/http.ts","../src/date-codecs.ts","../src/manage-api.ts","../src/command-context.ts","../src/output.ts","../src/options.ts","../src/runtime.ts","../src/commands/api-key.ts","../src/browser.ts","../src/command-parsers.ts","../src/oauth-callback.ts","../src/pkce.ts","../src/commands/auth.ts","../src/task-defaults.ts","../src/command-helpers.ts","../src/workspace-context.ts","../src/commands/context.ts","../src/commands/doctor.ts","../src/commands/history.ts","../src/import/things-output.ts","../src/import/things-labels.ts","../src/import/model-id.ts","../src/import/things-values.ts","../src/import/time-zone.ts","../src/import/things-recurrence.ts","../src/import/things-mapper.ts","../src/import/things-sqlite.ts","../src/import/things-runner.ts","../src/commands/import.ts","../src/commands/interactive.ts","../src/commands/label.ts","../src/confirm.ts","../src/commands/project.ts","../src/commands/task.ts","../src/commands/search.ts","../src/commands/spec.ts","../src/commands/team.ts","../src/commands/today.ts","../src/commands/whoami.ts","../src/commands/workspace.ts","../src/cli.ts"],"sourcesContent":["export interface JwtClaims {\n exp?: number;\n email?: string;\n sub?: string;\n}\n\nconst parseJwtBase64Url = (input: string): string => {\n const normalized = input.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, \"=\");\n return Buffer.from(padded, \"base64\").toString(\"utf8\");\n};\n\nexport const 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 email: typeof claims.email === \"string\" ? claims.email : undefined,\n exp: typeof claims.exp === \"number\" ? claims.exp : undefined,\n sub: typeof claims.sub === \"string\" ? claims.sub : undefined,\n };\n } catch {\n return null;\n }\n};\n","import { CliError, EXIT_CODES } from \"./errors\";\n\nexport interface OAuthTokenConfig {\n tokenUrl: string;\n clientId: string;\n}\n\nexport interface OAuthTokenResponse {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in: number;\n}\n\nconst postTokenRequest = async (\n url: string,\n body: URLSearchParams\n): Promise<OAuthTokenResponse> => {\n const response = await fetch(url, {\n body: body.toString(),\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new CliError(\n `OAuth token request failed (${response.status}): ${text}`,\n EXIT_CODES.AUTH_REQUIRED\n );\n }\n\n return (await response.json()) as OAuthTokenResponse;\n};\n\nexport const exchangeAuthorizationCode = (\n config: OAuthTokenConfig,\n code: string,\n codeVerifier: string,\n redirectUri: string\n): Promise<OAuthTokenResponse> => {\n const body = new URLSearchParams({\n client_id: config.clientId,\n code,\n code_verifier: codeVerifier,\n grant_type: \"authorization_code\",\n redirect_uri: redirectUri,\n });\n\n return postTokenRequest(config.tokenUrl, body);\n};\n\nexport const refreshAccessToken = (\n config: OAuthTokenConfig,\n refreshToken: string\n): Promise<OAuthTokenResponse> => {\n const body = new URLSearchParams({\n client_id: config.clientId,\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n });\n\n return postTokenRequest(config.tokenUrl, body);\n};\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\n\nimport { AUTH_FILE_PATH, CONFIG_DIR } from \"./constants\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport type { AuthFileData, OAuthProvider, StoredAuthSession } from \"./types\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\n\nconst isOAuthProvider = (value: unknown): value is OAuthProvider =>\n value === \"google\" || value === \"github\" || value === \"oauth2\";\n\nconst 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;\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 email: (user.email as string | null) ?? null,\n id: user.id as string,\n };\n\n return {\n accessToken: value.accessToken,\n createdAt: value.createdAt,\n expiresAt: value.expiresAt,\n provider: value.provider,\n refreshToken: value.refreshToken,\n tokenType: value.tokenType,\n user: parsedUser,\n };\n};\n\nconst 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 session,\n version: 1,\n };\n};\n\nexport const readStoredAuthSession =\n async (): 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 const writeStoredAuthSession = async (\n session: StoredAuthSession\n): Promise<void> => {\n const payload: AuthFileData = {\n session,\n version: 1,\n };\n\n await mkdir(CONFIG_DIR, {\n mode: 0o700,\n recursive: true,\n });\n\n await writeFile(AUTH_FILE_PATH, `${JSON.stringify(payload, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n};\n\nexport const clearStoredAuthSession = async (): Promise<void> => {\n await rm(AUTH_FILE_PATH, {\n force: true,\n });\n};\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\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 const 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 override: false,\n path: absolutePath,\n quiet: true,\n });\n }\n\n loaded = true;\n};\n\nexport const 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 CLI_OAUTH_CLIENT_ID,\n DEFAULT_SUPABASE_PUBLISHABLE_KEY,\n DEFAULT_SUPABASE_URL,\n DONEBEAR_OAUTH_CLIENT_ID_ENV,\n DONEBEAR_SUPABASE_KEY_ENV,\n DONEBEAR_SUPABASE_URL_ENV,\n} from \"./constants\";\nimport { readEnvValue } from \"./env\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport { parseJwtClaims } from \"./jwt\";\nimport type { OAuthTokenResponse } from \"./oauth-token\";\nimport type { StoredAuthSession, SupabaseConfig } from \"./types\";\n\nexport const resolveSupabaseConfig = (): SupabaseConfig => {\n const url = readEnvValue(DONEBEAR_SUPABASE_URL_ENV) ?? DEFAULT_SUPABASE_URL;\n\n const publishableKey =\n readEnvValue(DONEBEAR_SUPABASE_KEY_ENV) ?? DEFAULT_SUPABASE_PUBLISHABLE_KEY;\n\n return {\n publishableKey,\n url,\n };\n};\n\nexport const buildOAuthUrls = (\n config: SupabaseConfig\n): {\n authorizeUrl: string;\n tokenUrl: string;\n} => ({\n authorizeUrl: `${config.url}/auth/v1/oauth/authorize`,\n tokenUrl: `${config.url}/auth/v1/oauth/token`,\n});\n\nexport const resolveOAuthClientId = (): string =>\n readEnvValue(DONEBEAR_OAUTH_CLIENT_ID_ENV) ?? CLI_OAUTH_CLIENT_ID;\n\nexport const tokenResponseToStoredSession = (\n response: OAuthTokenResponse\n): StoredAuthSession => {\n const claims = parseJwtClaims(response.access_token);\n\n let expiresAt: string | null = null;\n if (typeof claims?.exp === \"number\") {\n expiresAt = new Date(claims.exp * 1000).toISOString();\n } else if (response.expires_in > 0) {\n expiresAt = new Date(Date.now() + response.expires_in * 1000).toISOString();\n }\n\n return {\n accessToken: response.access_token,\n createdAt: new Date().toISOString(),\n expiresAt,\n provider: \"oauth2\",\n refreshToken: response.refresh_token ?? null,\n tokenType: response.token_type ?? null,\n user:\n claims?.sub || claims?.email\n ? {\n email: claims.email ?? null,\n id: claims.sub ?? \"unknown\",\n }\n : null,\n };\n};\n\ninterface SupabaseUser {\n id: string;\n email: string | null;\n}\n\nexport const getSupabaseUser = async (\n supabaseUrl: string,\n publishableKey: string,\n accessToken: string\n): Promise<SupabaseUser> => {\n const response = await fetch(`${supabaseUrl}/auth/v1/user`, {\n headers: {\n apikey: publishableKey,\n authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n throw new CliError(\n `Failed to load user (${response.status})`,\n EXIT_CODES.ERROR\n );\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (typeof data.id !== \"string\") {\n throw new CliError(\"No user returned for current token\", EXIT_CODES.ERROR);\n }\n\n return {\n email: typeof data.email === \"string\" ? data.email : null,\n id: data.id,\n };\n};\n","import { DONEBEAR_TOKEN_ENV } from \"./constants\";\nimport { parseJwtClaims } from \"./jwt\";\nimport type { JwtClaims } from \"./jwt\";\nimport { refreshAccessToken } from \"./oauth-token\";\nimport {\n clearStoredAuthSession,\n readStoredAuthSession,\n writeStoredAuthSession,\n} from \"./storage\";\nimport {\n buildOAuthUrls,\n resolveOAuthClientId,\n tokenResponseToStoredSession,\n} from \"./supabase\";\nimport type {\n CliContext,\n ResolvedAuthToken,\n StoredAuthSession,\n SupabaseConfig,\n} from \"./types\";\n\nconst 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\nconst userFromClaims = (\n claims: JwtClaims | null\n): ResolvedAuthToken[\"user\"] => {\n if (!(claims?.sub || claims?.email)) {\n return null;\n }\n\n return {\n email: claims.email ?? null,\n id: claims.sub ?? \"unknown\",\n };\n};\n\nconst nowUnixSeconds = (): number => Math.floor(Date.now() / 1000);\n\nconst 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\nconst 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\nconst tokenFromRaw = (\n token: string,\n source: ResolvedAuthToken[\"source\"]\n): ResolvedAuthToken => {\n const claims = parseJwtClaims(token);\n\n return {\n expiresAt: expiryFromClaims(claims),\n source,\n token,\n user: userFromClaims(claims),\n };\n};\n\nexport const resolveAuthToken = async (\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 expiresAt: session.expiresAt,\n source: \"stored\",\n token: session.accessToken,\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 expiresAt: session.expiresAt,\n source: \"stored\",\n token: session.accessToken,\n user: session.user,\n };\n }\n\n const { tokenUrl } = buildOAuthUrls(config);\n const clientId = resolveOAuthClientId();\n const tokenResponse = await refreshAccessToken(\n { clientId, tokenUrl },\n session.refreshToken\n );\n const updatedSession = tokenResponseToStoredSession(tokenResponse);\n await writeStoredAuthSession(updatedSession);\n\n return {\n expiresAt: updatedSession.expiresAt,\n source: \"stored\",\n token: updatedSession.accessToken,\n user: updatedSession.user,\n };\n};\n\nexport const resolveTokenStatus = (\n token: ResolvedAuthToken\n): {\n expiresInSeconds: number | null;\n expired: boolean;\n} => {\n const claims = parseJwtClaims(token.token);\n\n if (!claims?.exp) {\n return {\n expired: false,\n expiresInSeconds: null,\n };\n }\n\n const expiresInSeconds = claims.exp - nowUnixSeconds();\n\n return {\n expired: expiresInSeconds <= 0,\n expiresInSeconds,\n };\n};\n","import { CliError, EXIT_CODES } from \"../errors\";\nimport type { CliContext } from \"../types\";\n\nconst extractErrorMessage = (value: unknown): string => {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value !== \"object\" || value === null) {\n return \"Request failed\";\n }\n const record = value as Record<string, unknown>;\n if (typeof record.message === \"string\") {\n return record.message;\n }\n if (typeof record.error === \"string\") {\n return record.error;\n }\n return \"Request failed\";\n};\n\nexport const apiRequest = async (\n _context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\" | \"DELETE\";\n token: string;\n body?: unknown;\n }\n): Promise<Response> => {\n const headers = new Headers({\n Accept: \"application/json\",\n Authorization: `Bearer ${options.token}`,\n });\n\n if (options.body !== undefined) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n const response = await fetch(endpoint, {\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n headers,\n method: options.method ?? \"GET\",\n });\n\n if (response.ok) {\n return response;\n }\n\n const raw = await response.text();\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\nexport const requestJson = async <T>(\n context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\" | \"DELETE\";\n token: string;\n body?: unknown;\n }\n): Promise<T> => {\n const response = await apiRequest(context, endpoint, options);\n return (await response.json()) as T;\n};\n\nexport const requestNdjson = async (\n context: CliContext,\n endpoint: string,\n options: {\n method?: \"GET\" | \"POST\";\n token: string;\n body?: unknown;\n }\n): Promise<unknown[]> => {\n const response = await apiRequest(context, endpoint, {\n body: options.body,\n method: options.method ?? (options.body === undefined ? \"GET\" : \"POST\"),\n token: options.token,\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","export interface DateOnlyParts {\n year: number;\n month: number;\n day: number;\n}\n\nconst ISO_DATE_ONLY_REGEX = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst ISO_INSTANT_REGEX =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\nconst pad = (value: number, length = 2): string =>\n String(value).padStart(length, \"0\");\n\nconst isFiniteEpoch = (value: number | null): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nexport const isValidDateOnlyParts = (parts: DateOnlyParts): boolean => {\n if (\n !(\n Number.isInteger(parts.year) &&\n Number.isInteger(parts.month) &&\n Number.isInteger(parts.day)\n )\n ) {\n return false;\n }\n\n if (\n parts.year < 1 ||\n parts.month < 1 ||\n parts.month > 12 ||\n parts.day < 1 ||\n parts.day > 31\n ) {\n return false;\n }\n\n const candidate = new Date(Date.UTC(parts.year, parts.month - 1, parts.day));\n\n return (\n candidate.getUTCFullYear() === parts.year &&\n candidate.getUTCMonth() === parts.month - 1 &&\n candidate.getUTCDate() === parts.day\n );\n};\n\nexport const dateOnlyPartsToEpoch = (parts: DateOnlyParts): number | null => {\n if (!isValidDateOnlyParts(parts)) {\n return null;\n }\n\n return Date.UTC(parts.year, parts.month - 1, parts.day);\n};\n\nexport const epochToDateOnlyParts = (\n epochMs: number | null\n): DateOnlyParts | null => {\n if (!isFiniteEpoch(epochMs)) {\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 {\n day: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n year: date.getUTCFullYear(),\n };\n};\n\nexport const formatDateOnlyParts = (parts: DateOnlyParts): string | null => {\n if (!isValidDateOnlyParts(parts)) {\n return null;\n }\n\n return `${pad(parts.year, 4)}-${pad(parts.month)}-${pad(parts.day)}`;\n};\n\nexport const formatDateOnlyEpoch = (epochMs: number | null): string | null => {\n const parts = epochToDateOnlyParts(epochMs);\n return parts ? formatDateOnlyParts(parts) : null;\n};\n\nexport const formatInstantEpoch = (epochMs: number | null): string | null => {\n if (!isFiniteEpoch(epochMs)) {\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\nconst parseDateOnlyString = (value: string | null): DateOnlyParts | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n const match = ISO_DATE_ONLY_REGEX.exec(trimmed);\n\n if (!match) {\n return null;\n }\n\n const year = Number.parseInt(match[1] ?? \"\", 10);\n const month = Number.parseInt(match[2] ?? \"\", 10);\n const day = Number.parseInt(match[3] ?? \"\", 10);\n const parts = { day, month, year };\n\n return isValidDateOnlyParts(parts) ? parts : null;\n};\n\nexport const parseApiDateOnlyToEpoch = (\n value: string | null\n): number | null => {\n const parts = parseDateOnlyString(value);\n return parts ? dateOnlyPartsToEpoch(parts) : null;\n};\n\nexport const parseApiInstantToEpoch = (value: string | null): number | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n\n if (trimmed.length === 0 || !ISO_INSTANT_REGEX.test(trimmed)) {\n return null;\n }\n\n const parsed = Date.parse(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n};\n\nexport const parseCliDateOnlyToEpoch = (\n value: string | undefined,\n fieldLabel: string\n): number | null => {\n if (!value) {\n return null;\n }\n\n const parts = parseDateOnlyString(value);\n\n if (!parts) {\n throw new Error(`Invalid ${fieldLabel}: ${value}. Expected YYYY-MM-DD.`);\n }\n\n return dateOnlyPartsToEpoch(parts);\n};\n\nexport const dateOnlyEpochFromLocalDate = (now = new Date()): number =>\n Date.UTC(now.getFullYear(), now.getMonth(), now.getDate());\n","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport { requestJson, requestNdjson } from \"./api/http\";\nimport { DEFAULT_API_URL, DONEBEAR_API_URL_ENV } from \"./constants\";\nimport { parseApiDateOnlyToEpoch, parseApiInstantToEpoch } from \"./date-codecs\";\nimport { readEnvValue } from \"./env\";\nimport { CliError, EXIT_CODES } from \"./errors\";\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\";\n\ninterface CreateWorkspaceRequest {\n name: string;\n urlKey: string;\n logoUrl?: string;\n}\n\ninterface SyncBatchRequest {\n requests: {\n modelName: string;\n indexedKey: string;\n keyValue: string;\n }[];\n}\n\ninterface SyncMutateResponse {\n success: boolean;\n lastSyncId: string;\n results: {\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 TaskGraphqlNode {\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\ninterface ProjectGraphqlNode {\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\ninterface LabelGraphqlNode {\n id: string;\n title: string;\n workspaceId: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface TeamGraphqlNode {\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\ninterface PaginatedConnection<TNode> {\n nodes: TNode[];\n pageInfo: {\n hasNextPage: boolean;\n endCursor: string | null;\n };\n}\n\nconst TASK_FIELDS = `\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\nconst TASKS_QUERY = `\n query DonebearTasks($first: Int!, $after: String, $workspaceId: ID!) {\n tasks(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { ${TASK_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TASKS_ALL_QUERY = `\n query DonebearTasksAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n tasks(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${TASK_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst PROJECT_FIELDS = `\n id key name description status sortOrder targetDate\n completedAt archivedAt createdAt updatedAt workspaceId creatorId\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 { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst PROJECTS_ALL_QUERY = `\n query DonebearProjectsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n projects(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${PROJECT_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst LABEL_FIELDS = \"id title workspaceId createdAt updatedAt\";\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 { ${LABEL_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst LABELS_ALL_QUERY = `\n query DonebearLabelsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n labels(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${LABEL_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TEAM_FIELDS =\n \"id key name description workspaceId createdAt updatedAt archivedAt\";\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 { ${TEAM_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst TEAMS_ALL_QUERY = `\n query DonebearTeamsAll($first: Int!, $after: String, $workspaceIds: [ID!]!) {\n teams(first: $first, after: $after, filter: { workspaceId: { in: $workspaceIds } }) {\n nodes { ${TEAM_FIELDS} }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst MY_WORKSPACES_QUERY = `\n query MyWorkspaces {\n myWorkspaces {\n id name urlKey logoUrl role createdAt updatedAt\n }\n }\n`;\n\nconst WORKSPACE_CREATE_MUTATION = `\n mutation WorkspaceCreate($input: WorkspaceCreateInput!) {\n workspaceCreate(input: $input) {\n success lastSyncId\n workspace { id name urlKey logoUrl createdAt updatedAt archivedAt }\n }\n }\n`;\n\nconst WORKSPACE_JOIN_MUTATION = `\n mutation WorkspaceJoin($code: String!) {\n workspaceJoin(code: $code) {\n success lastSyncId\n workspace { id name urlKey logoUrl createdAt updatedAt archivedAt }\n role\n }\n }\n`;\n\nconst WORKSPACE_MEMBERS_QUERY = `\n query WorkspaceMembers($first: Int!, $after: String, $workspaceId: ID!) {\n workspaceMemberships(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes {\n id userId workspaceId role createdAt\n user { id email name }\n }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst WORKSPACE_INVITATIONS_QUERY = `\n query WorkspaceInvitations($first: Int!, $after: String, $workspaceId: ID!) {\n workspaceInvitations(first: $first, after: $after, filter: { workspaceId: { eq: $workspaceId } }) {\n nodes { id email code role expiresAt createdAt usedAt usedByUserId workspaceId }\n pageInfo { hasNextPage endCursor }\n }\n }\n`;\n\nconst WORKSPACE_INVITATION_CREATE_MUTATION = `\n mutation WorkspaceInvitationCreate($input: WorkspaceInvitationCreateInput!) {\n workspaceInvitationCreate(input: $input) {\n success lastSyncId\n invitation { id email code role expiresAt createdAt usedAt usedByUserId workspaceId }\n }\n }\n`;\n\nconst WORKSPACE_HISTORY_QUERY = `\n query WorkspaceHistory($workspaceId: ID!, $limit: Int, $model: String) {\n workspaceHistory(workspaceId: $workspaceId, limit: $limit, model: $model) {\n id action modelName modelId payload createdAt userId\n }\n }\n`;\n\nconst API_KEY_CREATE_MUTATION = `\n mutation ApiKeyCreate($label: String!) {\n apiKeyCreate(label: $label) {\n success lastSyncId\n apiKey { id label keyPrefix createdAt }\n token\n }\n }\n`;\n\nconst API_KEYS_QUERY = `\n query ApiKeys {\n apiKeys { id label keyPrefix lastUsedAt revokedAt createdAt }\n }\n`;\n\nconst API_KEY_REVOKE_MUTATION = `\n mutation ApiKeyRevoke($id: ID!) {\n apiKeyRevoke(id: $id) { success lastSyncId }\n }\n`;\n\ninterface WorkspaceSummaryGraphqlNode {\n id: string;\n name: string;\n urlKey: string | null;\n logoUrl: string | null;\n role: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface WorkspaceGraphqlNode {\n id: string;\n name: string;\n urlKey: string | null;\n logoUrl: string | null;\n createdAt: string;\n updatedAt: string;\n archivedAt: string | null;\n}\n\ninterface WorkspaceMembershipGraphqlNode {\n id: string;\n userId: string;\n workspaceId: string;\n role: string;\n createdAt: string;\n user: {\n id: string;\n email: string | null;\n name: string | null;\n };\n}\n\ninterface WorkspaceInvitationGraphqlNode {\n id: string;\n email: string | null;\n code: string;\n role: string;\n expiresAt: string;\n createdAt: string;\n usedAt: string | null;\n usedByUserId: string | null;\n workspaceId: string;\n}\n\ninterface WorkspaceHistoryGraphqlNode {\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 ApiKeyGraphqlNode {\n id: string;\n label: string;\n keyPrefix: string;\n lastUsedAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n}\n\nconst normalizeApiUrl = (url: string): string =>\n url.endsWith(\"/\") ? url.slice(0, -1) : url;\n\nconst requestGraphql = async <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 body: {\n query: options.query,\n variables: options.variables,\n } satisfies GraphqlRequestBody,\n method: \"POST\",\n token: options.token,\n }\n );\n\n if (Array.isArray(response.errors) && response.errors.length > 0) {\n const [first] = response.errors;\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\nconst paginateGraphql = async <TNode, TRecord>(\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n query: string;\n variables: Record<string, unknown>;\n nodeKey: string;\n transform: (node: TNode) => TRecord;\n }\n): Promise<TRecord[]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const results: TRecord[] = [];\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: Record<\n string,\n PaginatedConnection<TNode>\n > = await requestGraphql(context, endpoint, {\n query: options.query,\n token: options.token,\n variables: {\n after,\n first: 100,\n ...options.variables,\n },\n });\n\n const connection = data[options.nodeKey] as PaginatedConnection<TNode>;\n\n for (const node of connection.nodes) {\n results.push(options.transform(node));\n }\n\n const nextCursor = connection.pageInfo.hasNextPage\n ? connection.pageInfo.endCursor\n : null;\n\n if (!nextCursor) {\n break;\n }\n\n after = nextCursor;\n }\n\n return results;\n};\n\nconst 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 archivedAt: toNullableNumber(row.archivedAt),\n assigneeId: typeof row.assigneeId === \"string\" ? row.assigneeId : null,\n completedAt: toNullableNumber(row.completedAt),\n createdAt: toNullableNumber(row.createdAt),\n creatorId: row.creatorId,\n deadlineAt: toNullableNumber(row.deadlineAt),\n description: typeof row.description === \"string\" ? row.description : null,\n headingId: typeof row.headingId === \"string\" ? row.headingId : null,\n id: row.id,\n projectId: typeof row.projectId === \"string\" ? row.projectId : null,\n start: row.start,\n startBucket: row.startBucket,\n startDate: toNullableNumber(row.startDate),\n teamId: typeof row.teamId === \"string\" ? row.teamId : null,\n title: row.title,\n todayIndexReferenceDate: toNullableNumber(row.todayIndexReferenceDate),\n updatedAt: toNullableNumber(row.updatedAt),\n workspaceId: row.workspaceId,\n };\n};\n\nconst toNullableNumber = (input: unknown): number | null => {\n if (input === null || input === undefined) {\n return null;\n }\n\n return typeof input === \"number\" ? input : null;\n};\n\nconst toTaskRecordFromGraphqlNode = (node: TaskGraphqlNode): TaskRecord => ({\n archivedAt: parseApiInstantToEpoch(node.archivedAt),\n assigneeId: node.assigneeId,\n completedAt: parseApiInstantToEpoch(node.completedAt),\n createdAt: parseApiInstantToEpoch(node.createdAt),\n creatorId: node.creatorId,\n deadlineAt: parseApiDateOnlyToEpoch(node.deadlineAt),\n description: node.description,\n headingId: node.headingId,\n id: node.id,\n projectId: node.projectId,\n start: node.start,\n startBucket: node.startBucket,\n startDate: parseApiDateOnlyToEpoch(node.startDate),\n teamId: node.teamId,\n title: node.title,\n todayIndexReferenceDate: parseApiDateOnlyToEpoch(\n node.todayIndexReferenceDate\n ),\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toProjectRecordFromGraphqlNode = (\n node: ProjectGraphqlNode\n): ProjectRecord => ({\n archivedAt: parseApiInstantToEpoch(node.archivedAt),\n completedAt: parseApiInstantToEpoch(node.completedAt),\n createdAt: parseApiInstantToEpoch(node.createdAt),\n creatorId: node.creatorId,\n description: node.description,\n id: node.id,\n key: node.key,\n name: node.name,\n sortOrder: node.sortOrder,\n status: node.status,\n targetDate: parseApiDateOnlyToEpoch(node.targetDate),\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toLabelRecordFromGraphqlNode = (node: LabelGraphqlNode): LabelRecord => ({\n createdAt: parseApiInstantToEpoch(node.createdAt),\n id: node.id,\n title: node.title,\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toTeamRecordFromGraphqlNode = (node: TeamGraphqlNode): TeamRecord => ({\n archivedAt: parseApiInstantToEpoch(node.archivedAt),\n createdAt: parseApiInstantToEpoch(node.createdAt),\n description: node.description,\n id: node.id,\n key: node.key,\n name: node.name,\n updatedAt: parseApiInstantToEpoch(node.updatedAt),\n workspaceId: node.workspaceId,\n});\n\nconst toWorkspaceSummaryFromGraphqlNode = (\n node: WorkspaceSummaryGraphqlNode\n): WorkspaceSummary => ({\n createdAt: node.createdAt,\n id: node.id,\n logoUrl: node.logoUrl,\n name: node.name,\n role: node.role,\n updatedAt: node.updatedAt,\n urlKey: node.urlKey,\n});\n\nconst toWorkspaceRecordFromGraphqlNode = (\n node: WorkspaceGraphqlNode\n): WorkspaceRecord => ({\n archivedAt: node.archivedAt,\n createdAt: node.createdAt,\n id: node.id,\n logoUrl: node.logoUrl,\n name: node.name,\n updatedAt: node.updatedAt,\n urlKey: node.urlKey,\n});\n\nconst toWorkspaceMemberRecordFromGraphqlNode = (\n node: WorkspaceMembershipGraphqlNode\n): WorkspaceMemberRecord => ({\n createdAt: node.createdAt,\n role: node.role,\n user: {\n avatarUrl: null,\n email: node.user.email,\n id: node.user.id,\n name: node.user.name,\n },\n userId: node.userId,\n});\n\nconst toWorkspaceInvitationRecordFromGraphqlNode = (\n node: WorkspaceInvitationGraphqlNode\n): WorkspaceInvitationRecord => ({\n code: node.code,\n email: node.email,\n expiresAt: node.expiresAt,\n id: node.id,\n role: node.role,\n usedAt: node.usedAt,\n});\n\nconst toWorkspaceHistoryEntryFromGraphqlNode = (\n node: WorkspaceHistoryGraphqlNode\n): WorkspaceHistoryEntry => ({\n action: node.action,\n createdAt: node.createdAt,\n id: node.id,\n modelId: node.modelId,\n modelName: node.modelName,\n payload: node.payload,\n userId: node.userId,\n});\n\nconst toApiKeyRecordFromGraphqlNode = (\n node: ApiKeyGraphqlNode\n): ApiKeyRecord => ({\n createdAt: node.createdAt,\n id: node.id,\n keyPrefix: node.keyPrefix,\n label: node.label,\n lastUsedAt: node.lastUsedAt,\n revokedAt: node.revokedAt,\n});\n\nconst 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 completedAt: toNullableNumber(row.completedAt),\n createdAt: toNullableNumber(row.createdAt),\n id: row.id,\n sortOrder: typeof row.sortOrder === \"number\" ? row.sortOrder : 0,\n taskId: row.taskId,\n title: row.title,\n updatedAt: toNullableNumber(row.updatedAt),\n workspaceId: row.workspaceId,\n };\n};\n\nexport const resolveApiBaseUrl = (context: CliContext): string => {\n const fromContext = context.apiUrlOverride?.trim();\n\n if (fromContext) {\n return normalizeApiUrl(fromContext);\n }\n\n const fromEnv = readEnvValue(DONEBEAR_API_URL_ENV);\n\n return normalizeApiUrl(fromEnv ?? DEFAULT_API_URL);\n};\n\nexport const listWorkspaces = async (\n context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<WorkspaceSummary[]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n myWorkspaces: WorkspaceSummaryGraphqlNode[];\n }>(context, endpoint, {\n query: MY_WORKSPACES_QUERY,\n token: options.token,\n variables: {},\n });\n\n return data.myWorkspaces.map(toWorkspaceSummaryFromGraphqlNode);\n};\n\nexport const createWorkspace = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n body: CreateWorkspaceRequest;\n }\n): Promise<WorkspaceRecord> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n workspaceCreate: {\n success: boolean;\n lastSyncId: string;\n workspace: WorkspaceGraphqlNode;\n };\n }>(context, endpoint, {\n query: WORKSPACE_CREATE_MUTATION,\n token: options.token,\n variables: { input: options.body },\n });\n\n return toWorkspaceRecordFromGraphqlNode(data.workspaceCreate.workspace);\n};\n\nexport const joinWorkspace = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n code: string;\n }\n): Promise<WorkspaceJoinResult> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n workspaceJoin: {\n success: boolean;\n lastSyncId: string;\n workspace: WorkspaceGraphqlNode;\n role: string;\n };\n }>(context, endpoint, {\n query: WORKSPACE_JOIN_MUTATION,\n token: options.token,\n variables: { code: options.code },\n });\n\n return {\n role: data.workspaceJoin.role,\n workspace: toWorkspaceRecordFromGraphqlNode(data.workspaceJoin.workspace),\n };\n};\n\nexport const loadTasksByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<TaskRecord[]> =>\n paginateGraphql<TaskGraphqlNode, TaskRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"tasks\",\n query: TASKS_QUERY,\n token: options.token,\n transform: toTaskRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadTasksByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<TaskRecord[]> =>\n paginateGraphql<TaskGraphqlNode, TaskRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"tasks\",\n query: TASKS_ALL_QUERY,\n token: options.token,\n transform: toTaskRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadTaskById = async (\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 indexedKey: \"id\",\n keyValue: options.taskId,\n modelName: \"Task\",\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n body,\n token: options.token,\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 const loadProjectsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<ProjectRecord[]> =>\n paginateGraphql<ProjectGraphqlNode, ProjectRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"projects\",\n query: PROJECTS_QUERY,\n token: options.token,\n transform: toProjectRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadProjectsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<ProjectRecord[]> =>\n paginateGraphql<ProjectGraphqlNode, ProjectRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"projects\",\n query: PROJECTS_ALL_QUERY,\n token: options.token,\n transform: toProjectRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadLabelsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<LabelRecord[]> =>\n paginateGraphql<LabelGraphqlNode, LabelRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"labels\",\n query: LABELS_QUERY,\n token: options.token,\n transform: toLabelRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadLabelsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<LabelRecord[]> =>\n paginateGraphql<LabelGraphqlNode, LabelRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"labels\",\n query: LABELS_ALL_QUERY,\n token: options.token,\n transform: toLabelRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadTeamsByWorkspace = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceId: string;\n }\n): Promise<TeamRecord[]> =>\n paginateGraphql<TeamGraphqlNode, TeamRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"teams\",\n query: TEAMS_QUERY,\n token: options.token,\n transform: toTeamRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const loadTeamsByWorkspaceIds = (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n workspaceIds: string[];\n }\n): Promise<TeamRecord[]> =>\n paginateGraphql<TeamGraphqlNode, TeamRecord>(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"teams\",\n query: TEAMS_ALL_QUERY,\n token: options.token,\n transform: toTeamRecordFromGraphqlNode,\n variables: { workspaceIds: options.workspaceIds },\n });\n\nexport const loadChecklistItemsByTask = async (\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 indexedKey: \"taskId\",\n keyValue: options.taskId,\n modelName: \"TaskChecklistItem\",\n },\n ],\n };\n\n const rows = await requestNdjson(context, url, {\n body,\n token: options.token,\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 const mutateModel = async (\n context: CliContext,\n options: {\n baseUrl: string;\n token: string;\n request: {\n batchId: string;\n transactions: {\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 body: options.request,\n method: \"POST\",\n token: options.token,\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 const listWorkspaceMembers = async (\n context: CliContext,\n options: { baseUrl: string; token: string; workspaceId: string }\n): Promise<WorkspaceMemberRecord[]> =>\n await paginateGraphql<WorkspaceMembershipGraphqlNode, WorkspaceMemberRecord>(\n context,\n {\n baseUrl: options.baseUrl,\n nodeKey: \"workspaceMemberships\",\n query: WORKSPACE_MEMBERS_QUERY,\n token: options.token,\n transform: toWorkspaceMemberRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n }\n );\n\nexport const listWorkspaceInvitations = async (\n context: CliContext,\n options: { baseUrl: string; token: string; workspaceId: string }\n): Promise<WorkspaceInvitationRecord[]> =>\n await paginateGraphql<\n WorkspaceInvitationGraphqlNode,\n WorkspaceInvitationRecord\n >(context, {\n baseUrl: options.baseUrl,\n nodeKey: \"workspaceInvitations\",\n query: WORKSPACE_INVITATIONS_QUERY,\n token: options.token,\n transform: toWorkspaceInvitationRecordFromGraphqlNode,\n variables: { workspaceId: options.workspaceId },\n });\n\nexport const createWorkspaceInvitation = async (\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 endpoint = `${options.baseUrl}/graphql`;\n const input: Record<string, unknown> = {\n workspaceId: options.workspaceId,\n };\n\n if (options.email !== undefined) {\n input.email = options.email;\n }\n\n if (options.role !== undefined) {\n input.role = options.role;\n }\n\n const data = await requestGraphql<{\n workspaceInvitationCreate: {\n success: boolean;\n lastSyncId: string;\n invitation: WorkspaceInvitationGraphqlNode;\n };\n }>(context, endpoint, {\n query: WORKSPACE_INVITATION_CREATE_MUTATION,\n token: options.token,\n variables: { input },\n });\n\n return toWorkspaceInvitationRecordFromGraphqlNode(\n data.workspaceInvitationCreate.invitation\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\nexport const listWorkspaceHistory = async (\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 endpoint = `${options.baseUrl}/graphql`;\n const variables: Record<string, unknown> = {\n limit: options.limit,\n workspaceId: options.workspaceId,\n };\n\n if (options.model) {\n variables.model = options.model;\n }\n\n const data = await requestGraphql<{\n workspaceHistory: WorkspaceHistoryGraphqlNode[];\n }>(context, endpoint, {\n query: WORKSPACE_HISTORY_QUERY,\n token: options.token,\n variables,\n });\n\n return data.workspaceHistory.map(toWorkspaceHistoryEntryFromGraphqlNode);\n};\n\n// --- API Keys ---\n\nexport interface ApiKeyRecord {\n id: string;\n label: string;\n keyPrefix: string;\n lastUsedAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n}\n\ninterface CreateApiKeyResponse {\n key: ApiKeyRecord & { token: string };\n}\n\nexport const createApiKey = async (\n context: CliContext,\n options: { baseUrl: string; token: string; label: string }\n): Promise<CreateApiKeyResponse[\"key\"]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n apiKeyCreate: {\n success: boolean;\n lastSyncId: string;\n apiKey: ApiKeyGraphqlNode;\n token: string;\n };\n }>(context, endpoint, {\n query: API_KEY_CREATE_MUTATION,\n token: options.token,\n variables: { label: options.label },\n });\n\n return {\n ...toApiKeyRecordFromGraphqlNode(data.apiKeyCreate.apiKey),\n token: data.apiKeyCreate.token,\n };\n};\n\nexport const listApiKeys = async (\n context: CliContext,\n options: { baseUrl: string; token: string }\n): Promise<ApiKeyRecord[]> => {\n const endpoint = `${options.baseUrl}/graphql`;\n const data = await requestGraphql<{\n apiKeys: ApiKeyGraphqlNode[];\n }>(context, endpoint, {\n query: API_KEYS_QUERY,\n token: options.token,\n variables: {},\n });\n\n return data.apiKeys.map(toApiKeyRecordFromGraphqlNode);\n};\n\nexport const revokeApiKey = async (\n context: CliContext,\n options: { baseUrl: string; token: string; keyId: string }\n): Promise<void> => {\n const endpoint = `${options.baseUrl}/graphql`;\n await requestGraphql<{\n apiKeyRevoke: { success: boolean; lastSyncId: string };\n }>(context, endpoint, {\n query: API_KEY_REVOKE_MUTATION,\n token: options.token,\n variables: { id: options.keyId },\n });\n};\n","import { resolveAuthToken } from \"./auth-session\";\nimport { ensureLocalContext } from \"./context-store\";\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport { resolveApiBaseUrl } from \"./manage-api\";\nimport { resolveSupabaseConfig } from \"./supabase\";\nimport type { CliContext, ResolvedAuthToken } from \"./types\";\n\nconst getOptionalSupabaseConfig = () => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n};\n\nexport const requireAuthToken = async (\n context: CliContext\n): 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 resolvedToken,\n token: resolvedToken.token,\n };\n};\n\nexport const resolveCommandContext = async (\n context: CliContext\n): 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 apiBaseUrl: resolveApiBaseUrl(context),\n localContext: await ensureLocalContext(),\n resolvedToken,\n token,\n };\n};\n\nexport const 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","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport { execSync } from \"node:child_process\";\nimport { styleText } from \"node:util\";\n\nimport jmespath from \"jmespath\";\nimport { stringify as yamlStringify } from \"yaml\";\n\nimport { CliError, EXIT_CODES } from \"./errors\";\nimport type { CliContext } from \"./types\";\n\nconst writeLine = (stream: NodeJS.WriteStream, message: string): void => {\n stream.write(`${message}\\n`);\n};\n\nconst 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\n// ---------------------------------------------------------------------------\n// Primitive writers\n// ---------------------------------------------------------------------------\n\nexport const writeJson = (value: unknown): void => {\n writeLine(process.stdout, JSON.stringify(value, null, 2));\n};\n\nconst writeYaml = (value: unknown): void => {\n process.stdout.write(yamlStringify(value));\n};\n\nexport const writeInfo = (context: CliContext, message: string): void => {\n writeLine(process.stdout, colorize(context, \"cyan\", message));\n};\n\nexport const writeSuccess = (context: CliContext, message: string): void => {\n writeLine(process.stdout, colorize(context, \"green\", message));\n};\n\nexport const writeWarning = (context: CliContext, message: string): void => {\n writeLine(process.stderr, colorize(context, \"yellow\", message));\n};\n\nexport const writeError = (context: CliContext, message: string): void => {\n writeLine(process.stderr, colorize(context, \"red\", message));\n};\n\nexport const 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 const writeTotal = (context: CliContext, count: number): void => {\n writeLine(process.stdout, colorize(context, \"cyan\", String(count)));\n};\n\n// ---------------------------------------------------------------------------\n// CSV / TSV\n// ---------------------------------------------------------------------------\n\nconst escapeCsvField = (value: string): string => {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return value;\n};\n\nexport const 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 const 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// Universal structured output (applies --jq, --limit, then format)\n// ---------------------------------------------------------------------------\n\n/**\n * Write structured data to stdout, applying --jq filter and --limit if set.\n * Use this for all JSON/YAML/structured output from commands.\n */\nexport const writeOutput = (context: CliContext, data: unknown): void => {\n let result = data;\n\n // Apply JMESPath filtering\n if (context.jq) {\n try {\n result = jmespath.search(result, context.jq);\n } catch (error) {\n throw new CliError(\n `Invalid --jq expression: ${error instanceof Error ? error.message : String(error)}`,\n EXIT_CODES.VALIDATION\n );\n }\n }\n\n // Apply limit\n if (context.limit !== null && Array.isArray(result)) {\n result = result.slice(0, context.limit);\n }\n\n // Format output\n switch (context.format) {\n case \"yaml\": {\n writeYaml(result);\n break;\n }\n case \"json\": {\n writeJson(result);\n break;\n }\n default: {\n // --jq implies structured output; fall through to JSON\n writeJson(result);\n break;\n }\n }\n\n if (context.copy) {\n copyToClipboard(JSON.stringify(result, null, 2));\n }\n};\n\n// ---------------------------------------------------------------------------\n// Tabular output (--total, --format csv/tsv/yaml, --copy)\n// ---------------------------------------------------------------------------\n\n/**\n * Handles --total, --format csv, --format tsv, --format yaml output.\n * Returns true if the format was handled; caller renders text mode if false.\n */\nexport const 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 === \"yaml\") {\n const objects = rows.map((row) =>\n Object.fromEntries(headers.map((h, i) => [h, row[i]]))\n );\n writeYaml(objects);\n if (context.copy) {\n copyToClipboard(yamlStringify(objects));\n }\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\n// ---------------------------------------------------------------------------\n// Clipboard\n// ---------------------------------------------------------------------------\n\nexport const 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 { InvalidArgumentError } from \"commander\";\nimport type { Command } from \"commander\";\n\nimport type { OutputFormat } from \"./types\";\n\nexport interface GlobalOptions {\n json?: boolean;\n quiet?: boolean;\n color?: boolean;\n debug?: boolean;\n token?: string;\n apiUrl?: string;\n format?: string;\n copy?: boolean;\n total?: boolean;\n jq?: string;\n limit?: number;\n dryRun?: boolean;\n yes?: boolean;\n}\n\nexport const parseOutputFormat = (value: string | undefined): OutputFormat => {\n switch (value?.trim().toLowerCase()) {\n case \"json\": {\n return \"json\";\n }\n case \"csv\": {\n return \"csv\";\n }\n case \"tsv\": {\n return \"tsv\";\n }\n case \"yaml\": {\n return \"yaml\";\n }\n default: {\n return \"text\";\n }\n }\n};\n\nconst parseLimit = (value: string): number => {\n const parsed = Number.parseInt(value, 10);\n\n if (`${parsed}` !== value || !Number.isInteger(parsed) || parsed < 1) {\n throw new InvalidArgumentError(\n `invalid limit \"${value}\" (expected a positive integer)`\n );\n }\n\n return parsed;\n};\n\nexport const addGlobalOptions = (program: Command): void => {\n program\n .option(\"--json\", \"Output machine-readable JSON\")\n .option(\"-q, --quiet\", \"Suppress status output (implies --json)\")\n .option(\n \"--format <format>\",\n \"Output format: text|json|csv|tsv|yaml\",\n \"text\"\n )\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(\"--debug\", \"Enable debug logs\")\n .option(\"--no-color\", \"Disable color output\")\n .option(\"--dry-run\", \"Preview mutations without executing\", false)\n .option(\"--jq <expression>\", \"Filter output with a JMESPath expression\")\n .option(\n \"--limit <n>\",\n \"Limit output to N items (for array results)\",\n parseLimit\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\", false);\n};\n\nexport const getGlobalOptions = (command: Command): GlobalOptions =>\n command.optsWithGlobals<GlobalOptions>();\n","import type { Command } from \"commander\";\n\nimport { DONEBEAR_DEBUG_ENV } from \"./constants\";\nimport { toCliError } from \"./errors\";\nimport { getGlobalOptions, parseOutputFormat } from \"./options\";\nimport { writeDebug, writeError, writeJson } from \"./output\";\nimport type { CliContext, OutputFormat } from \"./types\";\n\nexport const contextFromCommand = (command: Command): CliContext => {\n const options = getGlobalOptions(command);\n const quiet = options.quiet === true;\n const rawFormat = parseOutputFormat(options.format);\n const explicitFormat = options.json === true || quiet;\n const autoJson =\n !explicitFormat && rawFormat === \"text\" && !process.stdout.isTTY;\n const format = explicitFormat || autoJson ? \"json\" : rawFormat;\n\n return {\n apiUrlOverride: options.apiUrl?.trim() || null,\n color: options.color !== false && process.env.NO_COLOR !== \"1\",\n copy: options.copy === true,\n debug: options.debug === true || process.env[DONEBEAR_DEBUG_ENV] === \"1\",\n dryRun: options.dryRun === true,\n format,\n jq: options.jq?.trim() || null,\n json: format === \"json\",\n limit: options.limit ?? null,\n quiet,\n tokenOverride: options.token?.trim() || null,\n total: options.total === true,\n yes: options.yes === true,\n };\n};\n\nexport const contextFromArgv = (argv: string[]): CliContext => {\n const quiet = argv.includes(\"--quiet\") || argv.includes(\"-q\");\n const hasJsonFlag = argv.includes(\"--json\");\n const hasExplicitFormat = argv.some(\n (a) => a === \"--format\" || a.startsWith(\"--format=\")\n );\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 explicitJson = hasJsonFlag || quiet;\n const autoJson = !(explicitJson || hasExplicitFormat || process.stdout.isTTY);\n const format: OutputFormat = explicitJson || autoJson ? \"json\" : rawFormat;\n return {\n apiUrlOverride: null,\n color: !argv.includes(\"--no-color\") && process.env.NO_COLOR !== \"1\",\n copy: argv.includes(\"--copy\"),\n debug: argv.includes(\"--debug\") || process.env[DONEBEAR_DEBUG_ENV] === \"1\",\n dryRun: argv.includes(\"--dry-run\"),\n format,\n jq: null,\n json: format === \"json\",\n limit: null,\n quiet,\n tokenOverride: null,\n total: argv.includes(\"--total\"),\n yes: argv.includes(\"--yes\") || argv.includes(\"-y\"),\n };\n};\n\nexport const runWithErrorHandling = async (\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 error: {\n code: cliError.code,\n exitCode: cliError.exitCode,\n message: cliError.message,\n ...(cliError.hint ? { hint: cliError.hint } : {}),\n },\n ok: false,\n });\n } else {\n writeError(context, cliError.message);\n if (cliError.hint) {\n writeError(context, cliError.hint);\n }\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","import type { Command } from \"commander\";\n\nimport { requireAuthToken } from \"../command-context\";\nimport {\n createApiKey,\n listApiKeys,\n resolveApiBaseUrl,\n revokeApiKey,\n} from \"../manage-api\";\nimport { writeInfo, writeOutput, writeSuccess, writeWarning } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport type { CliContext } from \"../types\";\n\nconst runCreate = async (context: CliContext, label: string): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n const key = await createApiKey(context, { baseUrl, label, token });\n\n if (context.json) {\n writeOutput(context, {\n createdAt: key.createdAt,\n id: key.id,\n keyPrefix: key.keyPrefix,\n label: key.label,\n token: key.token,\n });\n return;\n }\n\n writeSuccess(context, \"API key created.\");\n writeInfo(context, \"\");\n writeInfo(context, ` ${key.token}`);\n writeInfo(context, \"\");\n writeWarning(context, \"Save this key now — it will not be shown again.\");\n};\n\nconst runList = async (context: CliContext): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n const keys = await listApiKeys(context, { baseUrl, token });\n\n if (context.json) {\n writeOutput(context, keys);\n return;\n }\n\n if (keys.length === 0) {\n writeInfo(context, \"No API keys found.\");\n return;\n }\n\n for (const key of keys) {\n const status = key.revokedAt ? \" (revoked)\" : \"\";\n const lastUsed = key.lastUsedAt\n ? `Last used: ${new Date(key.lastUsedAt).toLocaleDateString()}`\n : \"Never used\";\n writeInfo(\n context,\n `${key.keyPrefix}... ${key.label} ${lastUsed}${status} [${key.id}]`\n );\n }\n};\n\nconst runRevoke = async (context: CliContext, keyId: string): Promise<void> => {\n const { token } = await requireAuthToken(context);\n const baseUrl = resolveApiBaseUrl(context);\n\n await revokeApiKey(context, { baseUrl, keyId, token });\n\n if (context.json) {\n writeOutput(context, { id: keyId, ok: true });\n return;\n }\n\n writeSuccess(context, `API key ${keyId} revoked.`);\n};\n\nexport const registerApiKeyCommands = (program: Command): void => {\n const apiKey = program\n .command(\"api-key\")\n .alias(\"key\")\n .description(\"Manage personal API keys\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear api-key create \"Raycast\"\n donebear api-key list\n donebear api-key revoke <key-id>\n`\n )\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runList(context);\n });\n });\n\n apiKey\n .command(\"create <label>\")\n .description(\"Create a new personal API key\")\n .action(async (label: string, _options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runCreate(context, label);\n });\n });\n\n apiKey\n .command(\"list\")\n .description(\"List all personal API keys\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runList(context);\n });\n });\n\n apiKey\n .command(\"revoke <key-id>\")\n .description(\"Revoke an API key\")\n .action(async (keyId: string, _options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runRevoke(context, keyId);\n });\n });\n};\n","import { spawn } from \"node:child_process\";\n\ninterface OpenCommand {\n command: string;\n args: string[];\n}\n\nconst getOpenCommand = (url: string): OpenCommand => {\n if (process.platform === \"darwin\") {\n return {\n args: [url],\n command: \"open\",\n };\n }\n\n if (process.platform === \"win32\") {\n return {\n args: [\"/c\", \"start\", \"\", url],\n command: \"cmd\",\n };\n }\n\n return {\n args: [url],\n command: \"xdg-open\",\n };\n};\n\nexport const openUrl = async (url: string): Promise<boolean> => {\n const openCommand = getOpenCommand(url);\n\n // oxlint-disable-next-line avoid-new -- wrapping callback API in promise\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 const 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","// oxlint-disable no-use-before-define -- circular reference in callback pattern\nimport { createServer } from \"node:http\";\n\nimport { CliError, EXIT_CODES } from \"./errors\";\n\nexport interface OAuthCallbackOptions {\n redirectUrl: URL;\n expectedState: string;\n timeoutMs: number;\n}\n\nconst successHtml = (): string =>\n `<!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\nconst escapeHtml = (text: string): string =>\n text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\");\n\nconst errorHtml = (message: string): string =>\n `<!doctype html><html><head><meta charset=\"utf-8\"/><title>Done Bear CLI</title></head><body><h1>Authentication failed</h1><p>${escapeHtml(message)}</p></body></html>`;\n\nexport const waitForOAuthCode = async (\n options: OAuthCallbackOptions\n): Promise<string> =>\n // oxlint-disable-next-line avoid-new -- wrapping callback API in promise\n await new Promise<string>((resolve, reject) => {\n const host = options.redirectUrl.hostname;\n const port = Number(options.redirectUrl.port);\n const { pathname } = options.redirectUrl;\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","import { createHash, randomBytes } from \"node:crypto\";\n\nexport const createOAuthState = (): string => randomBytes(24).toString(\"hex\");\n\nexport const createCodeVerifier = (): string =>\n randomBytes(64).toString(\"base64url\");\n\nexport const createCodeChallenge = (verifier: string): string =>\n createHash(\"sha256\").update(verifier).digest().toString(\"base64url\");\n","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport type { Command } from \"commander\";\n\nimport { resolveAuthToken, resolveTokenStatus } from \"../auth-session\";\nimport { openUrl } from \"../browser\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport {\n DEFAULT_OAUTH_CALLBACK_PATH,\n DEFAULT_OAUTH_CALLBACK_PORT,\n DEFAULT_OAUTH_TIMEOUT_SECONDS,\n} from \"../constants\";\nimport { EXIT_CODES } from \"../errors\";\nimport { waitForOAuthCode } from \"../oauth-callback\";\nimport { exchangeAuthorizationCode } from \"../oauth-token\";\nimport type { OAuthTokenConfig } from \"../oauth-token\";\nimport { writeInfo, writeJson, writeSuccess, writeWarning } from \"../output\";\nimport {\n createCodeChallenge,\n createCodeVerifier,\n createOAuthState,\n} from \"../pkce\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n clearStoredAuthSession,\n readStoredAuthSession,\n writeStoredAuthSession,\n} from \"../storage\";\nimport {\n buildOAuthUrls,\n resolveOAuthClientId,\n resolveSupabaseConfig,\n tokenResponseToStoredSession,\n} from \"../supabase\";\nimport type { CliContext } from \"../types\";\n\ninterface AuthLoginOptions {\n port: number;\n timeout: number;\n open: boolean;\n}\n\nconst runLogin = async (\n context: CliContext,\n options: AuthLoginOptions\n): Promise<void> => {\n const config = resolveSupabaseConfig();\n const { authorizeUrl, tokenUrl } = buildOAuthUrls(config);\n const clientId = resolveOAuthClientId();\n\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 codeVerifier = createCodeVerifier();\n const codeChallenge = createCodeChallenge(codeVerifier);\n\n const authUrl = new URL(authorizeUrl);\n authUrl.searchParams.set(\"client_id\", clientId);\n authUrl.searchParams.set(\"redirect_uri\", redirectUrl.toString());\n authUrl.searchParams.set(\"response_type\", \"code\");\n authUrl.searchParams.set(\"code_challenge\", codeChallenge);\n authUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"scope\", \"\");\n\n const callbackPromise = waitForOAuthCode({\n expectedState: state,\n redirectUrl,\n timeoutMs: options.timeout * 1000,\n });\n\n const authUrlString = authUrl.toString();\n\n if (!options.open) {\n writeInfo(context, \"Open this URL to continue authentication:\");\n writeInfo(context, authUrlString);\n } else if (await openUrl(authUrlString)) {\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, authUrlString);\n }\n\n const authorizationCode = await callbackPromise;\n\n const tokenConfig: OAuthTokenConfig = { clientId, tokenUrl };\n const tokenResponse = await exchangeAuthorizationCode(\n tokenConfig,\n authorizationCode,\n codeVerifier,\n redirectUrl.toString()\n );\n\n const storedSession = tokenResponseToStoredSession(tokenResponse);\n await writeStoredAuthSession(storedSession);\n\n if (context.json) {\n writeJson({\n expiresAt: storedSession.expiresAt,\n ok: true,\n source: \"stored\",\n user: storedSession.user,\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\nconst runStatus = async (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 expired: tokenStatus.expired,\n expiresAt: token.expiresAt,\n expiresInSeconds: tokenStatus.expiresInSeconds,\n source: token.source,\n user: token.user,\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\nconst runLogout = async (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\nconst getOptionalSupabaseConfig = () => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n};\n\nexport const 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 login\n donebear auth login --no-open (print URL, don't open browser)\n donebear auth status --json\n donebear auth logout\n\nNon-interactive / CI use:\n export DONEBEAR_TOKEN=<your-token>\n donebear task list --json (no login required)\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 \"--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 .addHelpText(\n \"after\",\n `\nExamples:\n donebear auth login\n donebear auth login --no-open (print URL, copy and paste to browser)\n\nNon-interactive / CI use:\n Instead of logging in, set the DONEBEAR_TOKEN environment variable:\n export DONEBEAR_TOKEN=<your-api-token>\n`\n )\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 { dateOnlyEpochFromLocalDate, formatInstantEpoch } from \"./date-codecs\";\nimport type { TaskRecord, TaskState, TaskView } from \"./types\";\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nexport const 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 = dateOnlyEpochFromLocalDate(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 }\n case \"anytime\": {\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n case \"today\": {\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: today,\n todayIndexReferenceDate: today,\n };\n }\n case \"upcoming\": {\n return {\n start: \"started\",\n startBucket: \"upcoming\",\n startDate: tomorrow,\n todayIndexReferenceDate: null,\n };\n }\n case \"someday\": {\n return {\n start: \"someday\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n default: {\n return {\n start: \"not_started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n }\n};\n\nexport const 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 const resolveTaskView = (\n task: Pick<TaskRecord, \"start\" | \"startDate\" | \"startBucket\">\n): TaskView => {\n if (task.start === \"not_started\") {\n return \"inbox\";\n }\n if (task.start === \"someday\") {\n return \"someday\";\n }\n if (task.startDate !== null) {\n if (task.startDate <= dateOnlyEpochFromLocalDate()) {\n return \"today\";\n }\n return \"upcoming\";\n }\n return \"anytime\";\n};\n\nexport const formatEpochDate = (epochMs: number | null): string | null =>\n formatInstantEpoch(epochMs);\n","import { formatDateOnlyEpoch } from \"./date-codecs\";\nimport { getTaskState } from \"./task-defaults\";\nimport type { TaskRecord, TaskState } from \"./types\";\n\nconst SHORT_ID_SUFFIX_PATTERN = /-([a-f0-9]{8})$/;\n\n/**\n * Find a record by reference: exact ID, key, ID prefix, slug shortId, or name.\n * Works for any entity with id, key, and name fields.\n */\nexport const findByRef = <T extends { id: string; key: string; name: string }>(\n ref: string,\n items: T[]\n): T | null => {\n const normalized = ref.trim().toLowerCase();\n const shortIdMatch = normalized.match(SHORT_ID_SUFFIX_PATTERN);\n const shortId = shortIdMatch?.[1] ?? null;\n\n for (const item of items) {\n if (\n item.id === ref ||\n item.key.toLowerCase() === normalized ||\n item.id.startsWith(ref) ||\n (shortId && item.id.replaceAll(\"-\", \"\").slice(0, 8) === shortId) ||\n item.name.toLowerCase() === normalized\n ) {\n return item;\n }\n }\n\n return null;\n};\n\nexport const normalizeWorkspaceRef = (\n value: string | undefined\n): string | null => {\n const normalized = value?.trim() ?? \"\";\n return normalized.length > 0 ? normalized : null;\n};\n\nexport const parseTaskState = (value: string): TaskState => {\n switch (value.trim().toLowerCase()) {\n case \"open\":\n case \"pending\": {\n return \"open\";\n }\n case \"done\":\n case \"complete\":\n case \"completed\": {\n return \"done\";\n }\n case \"archived\":\n case \"archive\": {\n return \"archived\";\n }\n case \"all\": {\n return \"all\";\n }\n default: {\n throw new Error(\n `Invalid state \"${value}\". Expected one of: open, done, archived, all.`\n );\n }\n }\n};\n\nconst 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\nexport const taskListHeaders = (): string[] => [\n \"id\",\n \"title\",\n \"state\",\n \"deadline\",\n];\n\nexport const taskListRows = (tasks: TaskRecord[]): string[][] =>\n tasks.map((task) => [\n task.id,\n task.title,\n getTaskState(task),\n formatDateOnlyEpoch(task.deadlineAt) ?? \"\",\n ]);\n\nexport const taskListLines = (tasks: TaskRecord[]): string[] =>\n tasks.map((task) => {\n const marker = toTaskMarker(task);\n const deadline = formatDateOnlyEpoch(task.deadlineAt);\n const suffix = deadline ? ` due ${deadline}` : \"\";\n return `${marker} ${task.id.slice(0, 8)} ${task.title}${suffix}`;\n });\n","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport { setCurrentWorkspace } from \"./context-store\";\nimport { listWorkspaces } from \"./manage-api\";\nimport type { CliContext, WorkspaceScope, WorkspaceSummary } from \"./types\";\n\nconst WORKSPACE_URL_KEY_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nconst fetchWorkspaces = async (\n context: CliContext,\n options: { token: string; apiBaseUrl: string }\n): Promise<WorkspaceSummary[]> => {\n const workspaces = await listWorkspaces(context, {\n baseUrl: options.apiBaseUrl,\n token: options.token,\n });\n\n if (workspaces.length === 0) {\n throw new Error(\"No workspaces available for this account\");\n }\n\n return workspaces;\n};\n\nexport const resolveWorkspaceScope = async (\n context: CliContext,\n options: {\n token: string;\n apiBaseUrl: string;\n workspaceRef: string | null;\n storedWorkspaceId: string | null;\n }\n): Promise<WorkspaceScope> => {\n const workspaces = await fetchWorkspaces(context, options);\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 { autoSelected: false, mode: \"single\", workspace: selected };\n }\n\n if (options.storedWorkspaceId) {\n const selected = byReference(workspaces, options.storedWorkspaceId);\n\n if (selected) {\n return { autoSelected: false, mode: \"single\", workspace: selected };\n }\n }\n\n if (workspaces.length === 1) {\n const [workspace] = workspaces;\n\n if (!workspace) {\n throw new Error(\"No workspaces available for this account\");\n }\n\n await setCurrentWorkspace(workspace.id);\n\n return { autoSelected: true, mode: \"single\", workspace };\n }\n\n return { mode: \"all\", workspaces };\n};\n\nexport const scopeLabel = (scope: WorkspaceScope): string =>\n scope.mode === \"all\" ? \"All Workspaces\" : scope.workspace.name;\n\nexport const scopeJsonFields = (\n scope: WorkspaceScope\n): Record<string, unknown> =>\n scope.mode === \"all\"\n ? { workspaces: scope.workspaces }\n : { autoSelected: scope.autoSelected, workspace: scope.workspace };\n\nconst normalize = (value: string): string => value.trim().toLowerCase();\n\nconst 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 const toWorkspaceUrlKey = (name: string): string => {\n const slug = name\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"-\")\n .replaceAll(/^-+|-+$/g, \"\")\n .replaceAll(/-{2,}/g, \"-\");\n\n return slug.slice(0, 50);\n};\n\nexport const isValidWorkspaceUrlKey = (value: string): boolean =>\n WORKSPACE_URL_KEY_REGEX.test(value) && value.length >= 3;\n\nexport const resolveWorkspace = async (\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 scope = await resolveWorkspaceScope(context, options);\n\n if (scope.mode === \"single\") {\n return { autoSelected: scope.autoSelected, workspace: scope.workspace };\n }\n\n throw new Error(\n \"No default workspace selected. Run `donebear workspace use <id-or-slug>`.\"\n );\n};\n","// donebear context [--workspace <ws>] [--tasks-limit <n>] [--markdown]\n// Workspace state snapshot for agent orientation\n\nimport type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { formatDateOnlyEpoch } from \"../date-codecs\";\nimport { loadProjectsByWorkspace, loadTasksByWorkspace } from \"../manage-api\";\nimport { writeInfo, writeOutput } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { getTaskState, resolveTaskView } from \"../task-defaults\";\nimport type { ProjectRecord, StoredSessionUser, TaskRecord } from \"../types\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\nconst DEFAULT_TASKS_LIMIT = 10;\n\ninterface ContextOptions {\n workspace?: string;\n tasksLimit: number;\n markdown: boolean;\n}\n\ninterface TaskSummary {\n id: string;\n title: string;\n deadline: string | null;\n view: string;\n}\n\ninterface ProjectSummary {\n id: string;\n key: string;\n name: string;\n targetDate: string | null;\n}\n\ninterface TaskCounts {\n open: number;\n done: number;\n archived: number;\n total: number;\n}\n\nconst buildTaskCounts = (tasks: TaskRecord[]): TaskCounts => {\n const counts: TaskCounts = {\n archived: 0,\n done: 0,\n open: 0,\n total: tasks.length,\n };\n for (const task of tasks) {\n const state = getTaskState(task);\n if (state === \"open\") {\n counts.open += 1;\n } else if (state === \"done\") {\n counts.done += 1;\n } else if (state === \"archived\") {\n counts.archived += 1;\n }\n }\n return counts;\n};\n\nconst buildRecentTasks = (tasks: TaskRecord[], limit: number): TaskSummary[] =>\n [...tasks]\n .filter((t) => getTaskState(t) === \"open\")\n .toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))\n .slice(0, limit)\n .map((t) => ({\n deadline: formatDateOnlyEpoch(t.deadlineAt),\n id: t.id,\n title: t.title,\n view: resolveTaskView(t),\n }));\n\nconst buildActiveProjects = (projects: ProjectRecord[]): ProjectSummary[] =>\n projects\n .filter((p) => p.archivedAt === null && p.completedAt === null)\n .map((p) => ({\n id: p.id,\n key: p.key,\n name: p.name,\n targetDate: formatDateOnlyEpoch(p.targetDate),\n }));\n\nconst formatMarkdownOutput = (\n context: ReturnType<typeof contextFromCommand>,\n user: StoredSessionUser | null | undefined,\n workspace: { name: string; urlKey?: string | null },\n taskCounts: TaskCounts,\n recentTasks: TaskSummary[],\n activeProjects: ProjectSummary[]\n): void => {\n const lines: string[] = [\n \"# Donebear Context\",\n \"\",\n `## Workspace: ${workspace.name}${workspace.urlKey ? ` (${workspace.urlKey})` : \"\"}`,\n `User: ${user?.email ?? user?.id ?? \"(unknown)\"}`,\n \"\",\n `## Tasks: ${taskCounts.open} open / ${taskCounts.done} done / ${taskCounts.total} total`,\n ];\n\n if (recentTasks.length > 0) {\n lines.push(\"\", \"## Recent Open Tasks\");\n for (const t of recentTasks) {\n const deadline = t.deadline ? `, due ${t.deadline}` : \"\";\n lines.push(`- [${t.id.slice(0, 8)}] ${t.title} — ${t.view}${deadline}`);\n }\n }\n\n if (activeProjects.length > 0) {\n lines.push(\"\", \"## Active Projects\");\n for (const p of activeProjects) {\n const target = p.targetDate ? ` (target: ${p.targetDate})` : \"\";\n lines.push(`- [${p.key}] ${p.name}${target}`);\n }\n }\n\n lines.push(\n \"\",\n \"## Quick Commands\",\n \"donebear spec # full CLI spec, no auth needed\",\n \"donebear spec task add # detailed spec for one command\",\n \"donebear task list --json\",\n 'donebear task add \"Title\" --when today --json',\n 'donebear search \"query\" --json'\n );\n\n writeInfo(context, lines.join(\"\\n\"));\n};\n\nconst writeTextOutput = (\n context: ReturnType<typeof contextFromCommand>,\n workspace: { name: string },\n taskCounts: TaskCounts,\n recentTasks: TaskSummary[],\n activeProjects: ProjectSummary[]\n): void => {\n writeInfo(context, `Workspace: ${workspace.name}`);\n writeInfo(\n context,\n `Tasks: ${taskCounts.open} open / ${taskCounts.done} done / ${taskCounts.total} total`\n );\n if (recentTasks.length > 0) {\n writeInfo(context, `Recent open tasks (${recentTasks.length}):`);\n for (const t of recentTasks) {\n const deadline = t.deadline ? ` (due ${t.deadline})` : \"\";\n writeInfo(context, ` [${t.id.slice(0, 8)}] ${t.title}${deadline}`);\n }\n }\n if (activeProjects.length > 0) {\n writeInfo(context, `Active projects (${activeProjects.length}):`);\n for (const p of activeProjects) {\n writeInfo(context, ` [${p.key}] ${p.name}`);\n }\n }\n};\n\nconst runContext = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: ContextOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const { workspace } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const [tasks, projects] = await Promise.all([\n loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }),\n loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: workspace.id,\n }),\n ]);\n\n const taskCounts = buildTaskCounts(tasks);\n const recentTasks = buildRecentTasks(tasks, options.tasksLimit);\n const activeProjects = buildActiveProjects(projects);\n const { user } = commandContext.resolvedToken;\n\n if (options.markdown) {\n formatMarkdownOutput(\n context,\n user,\n workspace,\n taskCounts,\n recentTasks,\n activeProjects\n );\n return;\n }\n\n if (context.json) {\n writeOutput(context, {\n activeProjects,\n generatedAt: new Date().toISOString(),\n ok: true,\n recentTasks,\n taskCounts,\n user: {\n email: user?.email ?? null,\n id: user?.id ?? null,\n },\n workspace: {\n id: workspace.id,\n name: workspace.name,\n urlKey: workspace.urlKey,\n },\n });\n return;\n }\n\n writeTextOutput(context, workspace, taskCounts, recentTasks, activeProjects);\n};\n\nexport const registerContextCommand = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n program\n .command(\"context\")\n .description(\"Workspace snapshot for agent orientation\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"--tasks-limit <count>\",\n \"Max recent open tasks to include\",\n (value: string): number => parsePositiveInteger(value, \"Tasks limit\"),\n DEFAULT_TASKS_LIMIT\n )\n .option(\"--markdown\", \"Output as markdown (for system prompt injection)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear context --json\n donebear context --markdown\n donebear context --tasks-limit 20 --json\n donebear context --markdown > context.md\n`\n )\n .action(async (options: ContextOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runContext(context, workspaceOverride, options);\n });\n });\n};\n","import { existsSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { styleText } from \"node:util\";\n\nimport type { Command } from \"commander\";\n\nimport { resolveAuthToken } from \"../auth-session\";\nimport { CLI_NAME } from \"../constants\";\nimport { EXIT_CODES } from \"../errors\";\nimport { writeJson } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveSupabaseConfig } from \"../supabase\";\nimport type { CliContext } from \"../types\";\n\ninterface PackageManifest {\n version: string;\n}\n\nconst require = createRequire(import.meta.url);\nconst packageManifest = require(\"../../package.json\") as PackageManifest;\n\ntype CheckStatus = \"pass\" | \"warn\" | \"fail\";\n\ninterface CheckResult {\n name: string;\n status: CheckStatus;\n message: string;\n}\n\n// ---------------------------------------------------------------------------\n// Individual checks\n// ---------------------------------------------------------------------------\n\nconst checkCliVersion = async (): Promise<CheckResult> => {\n const current = packageManifest.version;\n\n try {\n const response = await fetch(\"https://registry.npmjs.org/donebear/latest\", {\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n\n const data = (await response.json()) as { version?: string };\n const latest = data.version;\n\n if (!latest) {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n\n if (current === latest) {\n return {\n message: `v${current} (latest)`,\n name: \"CLI Version\",\n status: \"pass\",\n };\n }\n\n return {\n message: `v${current} (update available: v${latest})`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n } catch {\n return {\n message: `v${current} (unable to check for updates)`,\n name: \"CLI Version\",\n status: \"warn\",\n };\n }\n};\n\nconst maskToken = (token: string): string => {\n if (token.length <= 8) {\n return \"***\";\n }\n\n return `${token.slice(0, 4)}...${token.slice(-4)}`;\n};\n\nconst checkAuth = async (context: CliContext): Promise<CheckResult> => {\n try {\n const config = (() => {\n try {\n return resolveSupabaseConfig();\n } catch {\n return null;\n }\n })();\n\n const token = await resolveAuthToken(context, config);\n\n if (!token) {\n return {\n message: \"No API key or token found\",\n name: \"Auth\",\n status: \"fail\",\n };\n }\n\n return {\n message: `${maskToken(token.token)} (source: ${token.source})`,\n name: \"Auth\",\n status: \"pass\",\n };\n } catch {\n return {\n message: \"Failed to resolve authentication\",\n name: \"Auth\",\n status: \"fail\",\n };\n }\n};\n\nconst checkWorkspace = async (): Promise<CheckResult> => {\n try {\n const { ensureLocalContext } = await import(\"../context-store\");\n const localContext = await ensureLocalContext();\n\n if (!localContext.workspaceId) {\n return {\n message: \"No workspace selected (run `donebear workspace use`)\",\n name: \"Workspace\",\n status: \"warn\",\n };\n }\n\n return {\n message: `Selected: ${localContext.workspaceId.slice(0, 8)}...`,\n name: \"Workspace\",\n status: \"pass\",\n };\n } catch {\n return {\n message: \"Unable to read workspace state\",\n name: \"Workspace\",\n status: \"warn\",\n };\n }\n};\n\ninterface AgentInfo {\n name: string;\n detected: boolean;\n}\n\nconst detectClaudeDesktop = (home: string): boolean => {\n if (process.platform === \"darwin\") {\n return existsSync(\n join(\n home,\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\"\n )\n );\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return existsSync(join(appData, \"Claude\", \"claude_desktop_config.json\"));\n }\n\n return existsSync(join(home, \".config\", \"claude\", \"config.json\"));\n};\n\nconst detectAgents = (): AgentInfo[] => {\n const home = homedir();\n\n const agents: AgentInfo[] = [\n {\n detected: existsSync(join(home, \".claude\")),\n name: \"Claude Code\",\n },\n {\n detected: existsSync(join(home, \".cursor\")),\n name: \"Cursor\",\n },\n {\n detected: detectClaudeDesktop(home),\n name: \"Claude Desktop\",\n },\n {\n detected: existsSync(join(process.cwd(), \".vscode\", \"mcp.json\")),\n name: \"VS Code\",\n },\n ];\n\n return agents;\n};\n\nconst checkAgents = (): CheckResult => {\n const agents = detectAgents();\n const detected = agents.filter((a) => a.detected);\n\n if (detected.length === 0) {\n return {\n message: \"None detected\",\n name: \"AI Agents\",\n status: \"pass\",\n };\n }\n\n return {\n message: `Detected: ${detected.map((a) => a.name).join(\", \")}`,\n name: \"AI Agents\",\n status: \"pass\",\n };\n};\n\n// ---------------------------------------------------------------------------\n// Output\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICONS: Record<CheckStatus, string> = {\n fail: \"\\u2718\",\n pass: \"\\u2714\",\n warn: \"\\u26A0\",\n};\n\nconst STATUS_COLORS: Record<CheckStatus, Parameters<typeof styleText>[0]> = {\n fail: \"red\",\n pass: \"green\",\n warn: \"yellow\",\n};\n\nconst writeInteractiveResult = (\n context: CliContext,\n checks: CheckResult[]\n): void => {\n const title = context.color\n ? styleText(\"bold\", ` ${CLI_NAME} doctor`)\n : ` ${CLI_NAME} doctor`;\n\n process.stdout.write(`\\n${title}\\n\\n`);\n\n for (const check of checks) {\n const icon = STATUS_ICONS[check.status];\n const line = ` ${icon} ${check.name}: ${check.message}`;\n const colored = context.color\n ? styleText(STATUS_COLORS[check.status], line)\n : line;\n process.stdout.write(`${colored}\\n`);\n }\n\n process.stdout.write(\"\\n\");\n};\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nconst runDoctor = async (context: CliContext): Promise<void> => {\n const checks = await Promise.all([\n checkCliVersion(),\n checkAuth(context),\n checkWorkspace(),\n ]);\n\n checks.push(checkAgents());\n\n const ok = checks.every((c) => c.status !== \"fail\");\n\n if (context.json) {\n writeJson({ checks, ok });\n } else {\n writeInteractiveResult(context, checks);\n }\n\n if (!ok) {\n process.exitCode = EXIT_CODES.ERROR;\n }\n};\n\nexport const registerDoctorCommand = (program: Command): void => {\n program\n .command(\"doctor\")\n .description(\"Run environment diagnostics\")\n .action(async (_options: unknown, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runDoctor(context);\n });\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\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport type { WorkspaceHistoryEntry } from \"../manage-api\";\nimport { listWorkspaceHistory } from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeWarning,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveWorkspace } from \"../workspace-context\";\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 A: \"ARCHIVE\",\n D: \"DELETE\",\n I: \"CREATE\",\n U: \"UPDATE\",\n V: \"UNARCHIVE\",\n};\n\ninterface HistoryOptions {\n workspace?: string;\n model?: string;\n limit: number;\n}\n\nconst formatActionCode = (action: string): string =>\n ACTION_LABELS[action] ?? action;\n\nconst 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\nconst extractPayloadTitle = (entry: WorkspaceHistoryEntry): string => {\n if (!entry.payload) {\n return \"\";\n }\n const { title } = entry.payload;\n if (typeof title === \"string\") {\n return ` (title: \"${title}\")`;\n }\n return \"\";\n};\n\nconst runHistory = async (\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 apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n try {\n const history = await listWorkspaceHistory(context, {\n baseUrl: commandContext.apiBaseUrl,\n limit: options.limit,\n model: options.model,\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { history, workspace });\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 const 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 type { ThingsImportResult } from \"./things-runner\";\n\nexport interface ThingsImportTextSummary {\n successMessage: string;\n infoLines: string[];\n}\n\nexport const summarizeThingsImportResult = (\n result: ThingsImportResult\n): ThingsImportTextSummary => {\n const infoLines = [\n `workspace: ${result.workspace.name}`,\n `database: ${result.databasePath}`,\n `source: ${result.counts.source.tasks} tasks, ${result.counts.source.projects} projects, ${result.counts.source.headings} headings, ${result.counts.source.areas} areas, ${result.counts.source.tags} tags, ${result.counts.source.checklistItems} checklist items`,\n `planned: ${result.counts.planned.teams ?? 0} teams, ${result.counts.planned.labels ?? 0} labels, ${result.counts.planned.projects ?? 0} projects, ${result.counts.planned.teamProjects ?? 0} team-project links, ${result.counts.planned.headings ?? 0} headings, ${result.counts.planned.tasks ?? 0} tasks, ${result.counts.planned.taskLabels ?? 0} task-label links, ${result.counts.planned.checklistItems ?? 0} checklist items`,\n ];\n\n if (result.dryRun) {\n infoLines.push(\"dry run: no mutations sent\");\n } else {\n infoLines.push(\n `mutations: ${result.execution.inserted} inserted, ${result.execution.updated} updated, ${result.execution.skipped} skipped across ${result.execution.batches} batch(es)`\n );\n }\n\n return {\n infoLines,\n successMessage: result.dryRun\n ? \"Things 3 import dry run complete\"\n : \"Things 3 import complete\",\n };\n};\n","export const normalizeThingsLabelLookupKey = (value: string): string =>\n value.trim().toLocaleLowerCase();\n","import { createHash } from \"node:crypto\";\n\nconst IMPORT_ID_NAMESPACE = \"b1f9f0ac-9f76-54ed-8eb0-7d6d3a0a0a31\";\nconst SYNC_COMPOSITE_ID_NAMESPACE = \"92a73695-d772-4b43-9fb4-d79f5fbef300\";\n\nconst uuidToBytes = (uuid: string): Uint8Array => {\n const normalized = uuid.replaceAll(\"-\", \"\");\n\n if (normalized.length !== 32) {\n throw new Error(`Invalid UUID namespace: ${uuid}`);\n }\n\n return Uint8Array.from(Buffer.from(normalized, \"hex\"));\n};\n\nconst bytesToUuid = (bytes: Uint8Array): string => {\n const hex = Buffer.from(bytes).toString(\"hex\");\n\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join(\"-\");\n};\n\nconst createUuidV5 = (name: string, namespace: string): string => {\n const namespaceBytes = uuidToBytes(namespace);\n const hash = createHash(\"sha1\")\n .update(namespaceBytes)\n .update(Buffer.from(name, \"utf8\"))\n .digest();\n\n const bytes = Uint8Array.from(hash.subarray(0, 16));\n // eslint-disable-next-line prefer-destructuring\n const versionByte = bytes[6];\n // eslint-disable-next-line prefer-destructuring\n const variantByte = bytes[8];\n\n if (typeof versionByte !== \"number\" || typeof variantByte !== \"number\") {\n throw new TypeError(\"Failed to generate a deterministic UUID.\");\n }\n\n // biome-ignore lint/suspicious/noBitwiseOperators: UUID v5 spec requires bitwise manipulation\n // eslint-disable-next-line no-bitwise\n // oxlint-disable-next-line no-bitwise, number-literal-case\n bytes[6] = (versionByte & 0x0f) | 0x50;\n // biome-ignore lint/suspicious/noBitwiseOperators: UUID v5 spec requires bitwise manipulation\n // eslint-disable-next-line no-bitwise\n // oxlint-disable-next-line no-bitwise, number-literal-case\n bytes[8] = (variantByte & 0x3f) | 0x80;\n\n return bytesToUuid(bytes);\n};\n\nconst createCompositeSyncId = (\n model: \"TaskLabel\" | \"TeamProject\",\n parts: readonly string[]\n): string =>\n createUuidV5(\n `${model}:${JSON.stringify(parts)}`,\n SYNC_COMPOSITE_ID_NAMESPACE\n );\n\nexport const createDeterministicImportId = (params: {\n workspaceId: string;\n modelName: string;\n sourceId: string;\n}): string =>\n createUuidV5(\n `things:${params.workspaceId}:${params.modelName}:${params.sourceId}`,\n IMPORT_ID_NAMESPACE\n );\n\nexport const createTaskLabelId = (params: {\n workspaceId: string;\n taskId: string;\n labelId: string;\n}): string =>\n createCompositeSyncId(\"TaskLabel\", [\n params.workspaceId,\n params.taskId,\n params.labelId,\n ]);\n\nexport const createTeamProjectId = (params: {\n workspaceId: string;\n teamId: string;\n projectId: string;\n}): string =>\n createCompositeSyncId(\"TeamProject\", [\n params.workspaceId,\n params.teamId,\n params.projectId,\n ]);\n","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport {\n dateOnlyPartsToEpoch,\n epochToDateOnlyParts,\n formatDateOnlyParts,\n isValidDateOnlyParts,\n} from \"../date-codecs\";\nimport type { DateOnlyParts } from \"../date-codecs\";\n\nconst PACKED_DATE_MULTIPLIER = 128;\nconst PACKED_DATE_DAY_MASK = 0b1_1111;\nconst PACKED_DATE_MONTH_MASK = 0b1111;\nconst PACKED_DATE_MONTH_SHIFT = 5;\nconst PACKED_DATE_YEAR_SHIFT = 9;\nconst THINGS_REMINDER_HOUR_SCALE = 67_108_864;\n\nexport type ThingsPackedDateParts = DateOnlyParts;\n\nconst isFiniteNumber = (value: number | null): value is number =>\n typeof value === \"number\" && Number.isFinite(value);\n\nconst isValidPackedDate = (parts: ThingsPackedDateParts): boolean =>\n isValidDateOnlyParts(parts);\n\nconst formatFloatingDate = (\n parts: ThingsPackedDateParts | null\n): string | null => {\n const formatted = parts ? formatDateOnlyParts(parts) : null;\n return formatted ? `${formatted.replaceAll(\"-\", \"\")}T000000` : null;\n};\n\nconst dateOnlyEpochToLocalMidnightInstant = (\n epochMs: number | null\n): number | null => {\n const parts = epochToDateOnlyParts(epochMs);\n\n if (!parts) {\n return null;\n }\n\n return new Date(parts.year, parts.month - 1, parts.day).getTime();\n};\n\nexport const decodeThingsPackedDateParts = (\n value: number | null\n): ThingsPackedDateParts | null => {\n if (!isFiniteNumber(value)) {\n return null;\n }\n\n const integer = Math.trunc(value);\n\n if (integer <= 0 || integer % PACKED_DATE_MULTIPLIER !== 0) {\n return null;\n }\n\n const packed = integer / PACKED_DATE_MULTIPLIER;\n // biome-ignore lint/suspicious/noBitwiseOperators: Things packed date bit extraction\n // eslint-disable-next-line no-bitwise\n const day = packed & PACKED_DATE_DAY_MASK;\n // biome-ignore lint/suspicious/noBitwiseOperators: Things packed date bit extraction\n // eslint-disable-next-line no-bitwise\n const month = (packed >> PACKED_DATE_MONTH_SHIFT) & PACKED_DATE_MONTH_MASK;\n // biome-ignore lint/suspicious/noBitwiseOperators: Things packed date bit extraction\n // eslint-disable-next-line no-bitwise\n const year = packed >> PACKED_DATE_YEAR_SHIFT;\n const parts = {\n day,\n month,\n year,\n };\n\n return isValidPackedDate(parts) ? parts : null;\n};\n\nexport const decodeThingsPackedDate = (value: number | null): number | null => {\n const parts = decodeThingsPackedDateParts(value);\n\n if (!parts) {\n return null;\n }\n\n return dateOnlyPartsToEpoch(parts);\n};\n\nexport const decodeThingsPackedCalendarDate = (\n value: number | null,\n _timeZone: string | null\n): number | null => decodeThingsPackedDate(value);\n\nexport const formatThingsPackedDateAsFloatingDate = (\n value: number | null\n): string | null => formatFloatingDate(decodeThingsPackedDateParts(value));\n\nexport const formatThingsUnixDateAsFloatingDate = (\n value: number | null\n): string | null =>\n formatFloatingDate(epochToDateOnlyParts(decodeThingsUnixSeconds(value)));\n\nexport const decodeThingsUnixSeconds = (\n value: number | null\n): number | null => {\n if (!isFiniteNumber(value)) {\n return null;\n }\n\n return Math.round(value * 1000);\n};\n\nexport const decodeThingsUnixCalendarDate = (\n value: number | null,\n _timeZone: string | null\n): number | null => {\n const epochMs = decodeThingsUnixSeconds(value);\n\n if (epochMs === null) {\n return null;\n }\n\n const parts = epochToDateOnlyParts(epochMs);\n return parts ? dateOnlyPartsToEpoch(parts) : null;\n};\n\nexport const decodeThingsReminderOffset = (\n value: number | null\n): number | null => {\n if (!isFiniteNumber(value) || value < 0) {\n return null;\n }\n\n return Math.round((value / THINGS_REMINDER_HOUR_SCALE) * 60 * 60 * 1000);\n};\n\nexport const combineThingsReminderAt = (options: {\n reminderTime: number | null;\n startDate: number | null;\n nextStartDate?: number | null;\n deadlineDate?: number | null;\n}): number | null => {\n const offset = decodeThingsReminderOffset(options.reminderTime);\n const baseDate =\n options.startDate ?? options.nextStartDate ?? options.deadlineDate ?? null;\n\n if (offset === null || baseDate === null) {\n return null;\n }\n\n const baseInstant = dateOnlyEpochToLocalMidnightInstant(baseDate);\n return baseInstant === null ? null : baseInstant + offset;\n};\n","export interface CalendarDateParts {\n year: number;\n month: number;\n day: number;\n}\n\ninterface CalendarDateTimeParts extends CalendarDateParts {\n hour: number;\n minute: number;\n second: number;\n}\n\nconst formatterCache = new Map<string, Intl.DateTimeFormat>();\n\nconst getFormatter = (timeZone: string): Intl.DateTimeFormat => {\n const cached = formatterCache.get(timeZone);\n\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n day: \"2-digit\",\n hour: \"2-digit\",\n hourCycle: \"h23\",\n minute: \"2-digit\",\n month: \"2-digit\",\n second: \"2-digit\",\n timeZone,\n year: \"numeric\",\n });\n\n formatterCache.set(timeZone, formatter);\n return formatter;\n};\n\nconst toDateTimeParts = (\n date: Date,\n timeZone: string\n): CalendarDateTimeParts | null => {\n const raw: Record<string, string> = {};\n\n for (const part of getFormatter(timeZone).formatToParts(date)) {\n if (part.type === \"literal\") {\n continue;\n }\n\n raw[part.type] = part.value;\n }\n\n const year = Number(raw.year);\n const month = Number(raw.month);\n const day = Number(raw.day);\n const hour = Number(raw.hour);\n const minute = Number(raw.minute);\n const second = Number(raw.second);\n\n if (\n !(\n Number.isFinite(year) &&\n Number.isFinite(month) &&\n Number.isFinite(day) &&\n Number.isFinite(hour) &&\n Number.isFinite(minute) &&\n Number.isFinite(second)\n )\n ) {\n return null;\n }\n\n return {\n day,\n hour,\n minute,\n month,\n second,\n year,\n };\n};\n\nexport const resolveTimeZoneOrNull = (\n value: string | null | undefined\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n\n if (trimmed.length === 0) {\n return null;\n }\n\n try {\n getFormatter(trimmed).format(new Date(0));\n return trimmed;\n } catch {\n return null;\n }\n};\n\nexport const resolveLocalTimeZone = (): string | null =>\n resolveTimeZoneOrNull(Intl.DateTimeFormat().resolvedOptions().timeZone);\n\nexport const getUtcCalendarDateParts = (date: Date): CalendarDateParts => ({\n day: date.getUTCDate(),\n month: date.getUTCMonth() + 1,\n year: date.getUTCFullYear(),\n});\n\nexport const getCalendarDatePartsInTimeZone = (\n date: Date,\n timeZone: string\n): CalendarDateParts => {\n const parts = toDateTimeParts(date, timeZone);\n\n if (!parts) {\n return getUtcCalendarDateParts(date);\n }\n\n return {\n day: parts.day,\n month: parts.month,\n year: parts.year,\n };\n};\n\nexport const calendarDateToUtcEpoch = (parts: CalendarDateParts): number =>\n Date.UTC(parts.year, parts.month - 1, parts.day);\n\nexport const getUtcCalendarDayEndEpoch = (date: Date): number => {\n const parts = getUtcCalendarDateParts(date);\n\n return Date.UTC(parts.year, parts.month - 1, parts.day, 23, 59, 59, 999);\n};\n","// oxlint-disable-next-line default\nimport rrule from \"rrule\";\n\nimport type { ThingsTaskRecord } from \"./things-sqlite\";\nimport {\n decodeThingsPackedCalendarDate,\n decodeThingsUnixCalendarDate,\n decodeThingsUnixSeconds,\n formatThingsPackedDateAsFloatingDate,\n formatThingsUnixDateAsFloatingDate,\n} from \"./things-values\";\nimport {\n calendarDateToUtcEpoch,\n getCalendarDatePartsInTimeZone,\n getUtcCalendarDateParts,\n getUtcCalendarDayEndEpoch,\n resolveTimeZoneOrNull,\n} from \"./time-zone\";\n\nconst THINGS_FREQUENCY_TO_RRULE = new Map<number, string>([\n [4, \"YEARLY\"],\n [8, \"MONTHLY\"],\n [16, \"DAILY\"],\n [256, \"WEEKLY\"],\n]);\n\nconst THINGS_WEEKDAY_TO_RRULE = [\n \"SU\",\n \"MO\",\n \"TU\",\n \"WE\",\n \"TH\",\n \"FR\",\n \"SA\",\n // oxlint-disable-next-line no-named-as-default-member\n // oxlint-disable-next-line no-named-as-default-member\n] as const;\n// oxlint-disable-next-line no-named-as-default-member\n// oxlint-disable-next-line no-named-as-default-member\nconst { RRule, rrulestr } = rrule;\n\ninterface ThingsRecurrenceOffset {\n wd?: number;\n dy?: number;\n}\n\ninterface ThingsRecurrenceDefinition {\n ia: number | null;\n sr: number | null;\n ed: number | null;\n rc: number | null;\n fu: number | null;\n fa: number | null;\n tp: number | null;\n ts: number | null;\n offsets: ThingsRecurrenceOffset[];\n}\n\nexport interface ThingsRepeatTemplateFields {\n repeatRule: string;\n repeatType: \"fixed\" | \"after_completion\";\n repeatStatus: \"active\" | \"paused\";\n repeatNextAt: number | null;\n currentInstanceDate: number | null;\n recurrence: ThingsRecurrenceDefinition;\n}\n\nconst parseNumericPlistField = (xml: string, key: string): number | null => {\n const match = new RegExp(\n `<key>${key}</key>\\\\s*<(integer|real)>([^<]+)</\\\\1>`\n ).exec(xml);\n\n if (!match?.[2]) {\n return null;\n }\n\n const parsed = Number(match[2]);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nconst PLIST_OFFSETS_ARRAY_PATTERN =\n /<key>of<\\/key>\\s*<array>([\\s\\S]*?)<\\/array>/;\n\nconst parseOffsets = (xml: string): ThingsRecurrenceOffset[] => {\n const arrayMatch = PLIST_OFFSETS_ARRAY_PATTERN.exec(xml);\n\n if (!arrayMatch?.[1]) {\n return [];\n }\n\n const offsets: ThingsRecurrenceOffset[] = [];\n\n for (const dictMatch of arrayMatch[1].matchAll(/<dict>([\\s\\S]*?)<\\/dict>/g)) {\n const [, fragment] = dictMatch;\n\n if (!fragment) {\n continue;\n }\n\n const weekday = parseNumericPlistField(fragment, \"wd\");\n const monthDay = parseNumericPlistField(fragment, \"dy\");\n\n offsets.push({\n dy: monthDay ?? undefined,\n wd: weekday ?? undefined,\n });\n }\n\n return offsets;\n};\n\nconst parseRRule = (rule: string): InstanceType<typeof RRule> | null => {\n try {\n const parsed = rrulestr(rule);\n return parsed instanceof RRule ? parsed : null;\n } catch {\n return null;\n }\n};\n\nconst buildByDayTokens = (definition: ThingsRecurrenceDefinition): string[] => {\n const tokens = definition.offsets\n .map((offset) =>\n typeof offset.wd === \"number\"\n ? (THINGS_WEEKDAY_TO_RRULE[offset.wd] ?? null)\n : null\n )\n .filter(\n (value): value is (typeof THINGS_WEEKDAY_TO_RRULE)[number] =>\n value !== null\n );\n\n if (tokens.length > 0) {\n return tokens;\n }\n\n if (definition.ia === null) {\n return [];\n }\n\n const weekday = new Date(definition.ia * 1000).getUTCDay();\n return [THINGS_WEEKDAY_TO_RRULE[weekday] ?? \"MO\"];\n};\n\nconst buildMonthDays = (definition: ThingsRecurrenceDefinition): number[] => {\n const monthDays = definition.offsets\n .map((offset) =>\n typeof offset.dy === \"number\" ? Math.trunc(offset.dy) + 1 : null\n )\n .filter((value): value is number => value !== null && value >= 1);\n\n if (monthDays.length > 0) {\n return monthDays;\n }\n\n if (definition.ia === null) {\n return [];\n }\n\n return [new Date(definition.ia * 1000).getUTCDate()];\n};\n\nconst buildAnchor = (\n definition: ThingsRecurrenceDefinition,\n task: ThingsTaskRecord,\n timeZone: string | null\n): string | null => {\n const anchor =\n formatThingsUnixDateAsFloatingDate(definition.ia) ??\n formatThingsUnixDateAsFloatingDate(definition.sr) ??\n formatThingsPackedDateAsFloatingDate(task.nextInstanceStartDate) ??\n formatThingsPackedDateAsFloatingDate(task.startDate) ??\n formatThingsPackedDateAsFloatingDate(task.instanceCreationStartDate) ??\n null;\n\n if (!anchor) {\n return null;\n }\n\n if (!timeZone) {\n return `DTSTART:${anchor}`;\n }\n\n return `DTSTART;TZID=${timeZone}:${anchor}`;\n};\n\nconst buildRepeatRule = (\n definition: ThingsRecurrenceDefinition,\n task: ThingsTaskRecord,\n timeZone: string | null\n): string | null => {\n const frequency =\n definition.fu === null\n ? null\n : (THINGS_FREQUENCY_TO_RRULE.get(definition.fu) ?? null);\n\n if (!frequency) {\n return null;\n }\n\n const parts = [`FREQ=${frequency}`];\n const interval =\n definition.fa !== null && definition.fa > 0 ? Math.trunc(definition.fa) : 1;\n\n if (interval > 1) {\n parts.push(`INTERVAL=${interval}`);\n }\n\n if (frequency === \"WEEKLY\") {\n const byDayTokens = buildByDayTokens(definition);\n\n if (byDayTokens.length > 0) {\n parts.push(`BYDAY=${byDayTokens.join(\",\")}`);\n }\n }\n\n if (frequency === \"MONTHLY\") {\n const monthDays = buildMonthDays(definition);\n\n if (monthDays.length > 0) {\n parts.push(`BYMONTHDAY=${monthDays.join(\",\")}`);\n }\n }\n\n if (frequency === \"YEARLY\" && definition.ia !== null) {\n const anchor = new Date(definition.ia * 1000);\n parts.push(`BYMONTH=${anchor.getUTCMonth() + 1}`);\n parts.push(`BYMONTHDAY=${anchor.getUTCDate()}`);\n }\n\n const anchor = buildAnchor(definition, task, timeZone);\n\n if (!anchor) {\n return `RRULE:${parts.join(\";\")}`;\n }\n\n return `${anchor}\\nRRULE:${parts.join(\";\")}`;\n};\n\nconst getRuleTimeZone = (rule: InstanceType<typeof RRule>): string | null =>\n resolveTimeZoneOrNull(\n typeof rule.origOptions.tzid === \"string\" ? rule.origOptions.tzid : null\n );\n\nconst getOccurrenceCalendarParts = (\n occurrence: Date,\n timeZone: string | null\n) =>\n timeZone\n ? getCalendarDatePartsInTimeZone(occurrence, timeZone)\n : getUtcCalendarDateParts(occurrence);\n\nconst normalizeOccurrenceEpoch = (\n occurrence: Date,\n timeZone: string | null\n): number =>\n calendarDateToUtcEpoch(getOccurrenceCalendarParts(occurrence, timeZone));\n\nconst calculateNextOccurrence = (\n repeatRule: string,\n currentInstanceDate: number | null\n): number | null => {\n if (currentInstanceDate === null) {\n return null;\n }\n\n const parsed = parseRRule(repeatRule);\n\n if (!parsed) {\n return null;\n }\n\n const timeZone = getRuleTimeZone(parsed);\n const comparisonDate = new Date(\n getUtcCalendarDayEndEpoch(new Date(currentInstanceDate))\n );\n const next = parsed.after(comparisonDate, false);\n\n return next ? normalizeOccurrenceEpoch(next, timeZone) : null;\n};\n\nconst parseThingsRecurrenceDefinition = (\n xml: string | null\n): ThingsRecurrenceDefinition | null => {\n if (typeof xml !== \"string\" || xml.trim().length === 0) {\n return null;\n }\n\n const definition: ThingsRecurrenceDefinition = {\n ed: parseNumericPlistField(xml, \"ed\"),\n fa: parseNumericPlistField(xml, \"fa\"),\n fu: parseNumericPlistField(xml, \"fu\"),\n ia: parseNumericPlistField(xml, \"ia\"),\n offsets: parseOffsets(xml),\n rc: parseNumericPlistField(xml, \"rc\"),\n sr: parseNumericPlistField(xml, \"sr\"),\n tp: parseNumericPlistField(xml, \"tp\"),\n ts: parseNumericPlistField(xml, \"ts\"),\n };\n\n if (\n definition.ia === null &&\n definition.sr === null &&\n definition.ed === null &&\n definition.rc === null &&\n definition.fu === null &&\n definition.fa === null &&\n definition.tp === null &&\n definition.ts === null &&\n definition.offsets.length === 0\n ) {\n return null;\n }\n\n return definition;\n};\n\nexport const isThingsRepeatTemplateTask = (task: ThingsTaskRecord): boolean =>\n task.recurrenceRuleRaw !== null && task.repeatTemplateSourceId === null;\n\nexport const isThingsRepeatInstanceTask = (task: ThingsTaskRecord): boolean =>\n task.repeatTemplateSourceId !== null;\n\nexport const resolveThingsRepeatTemplateFields = (\n task: ThingsTaskRecord,\n timeZone?: string | null\n): ThingsRepeatTemplateFields | null => {\n if (!isThingsRepeatTemplateTask(task)) {\n return null;\n }\n\n const recurrence = parseThingsRecurrenceDefinition(task.recurrenceRuleRaw);\n\n if (!recurrence) {\n return null;\n }\n\n const repeatTimeZone = resolveTimeZoneOrNull(timeZone);\n const repeatRule = buildRepeatRule(recurrence, task, repeatTimeZone);\n\n if (!repeatRule) {\n return null;\n }\n\n const currentInstanceDate =\n decodeThingsPackedCalendarDate(\n task.nextInstanceStartDate,\n repeatTimeZone\n ) ??\n decodeThingsPackedCalendarDate(task.startDate, repeatTimeZone) ??\n decodeThingsUnixCalendarDate(recurrence.ia, repeatTimeZone) ??\n decodeThingsUnixSeconds(recurrence.ia);\n const repeatType =\n recurrence.tp === 1 ? \"after_completion\" : (\"fixed\" as const);\n\n return {\n currentInstanceDate,\n recurrence,\n repeatNextAt:\n repeatType === \"fixed\"\n ? calculateNextOccurrence(repeatRule, currentInstanceDate)\n : null,\n repeatRule,\n repeatStatus:\n task.instanceCreationPaused || recurrence.ts === 1 ? \"paused\" : \"active\",\n repeatType,\n };\n};\n\nexport const resolveThingsRepeatInstanceDate = (\n task: ThingsTaskRecord,\n timeZone?: string | null\n): number | null => {\n const repeatTimeZone = resolveTimeZoneOrNull(timeZone);\n\n return (\n decodeThingsPackedCalendarDate(task.startDate, repeatTimeZone) ??\n decodeThingsPackedCalendarDate(\n task.nextInstanceStartDate,\n repeatTimeZone\n ) ??\n null\n );\n};\n","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport { dateOnlyEpochFromLocalDate } from \"../date-codecs\";\nimport {\n createDeterministicImportId,\n createTaskLabelId,\n createTeamProjectId,\n} from \"./model-id\";\nimport { normalizeThingsLabelLookupKey } from \"./things-labels\";\nimport {\n isThingsRepeatInstanceTask,\n isThingsRepeatTemplateTask,\n resolveThingsRepeatInstanceDate,\n resolveThingsRepeatTemplateFields,\n} from \"./things-recurrence\";\nimport type {\n ThingsAreaRecord,\n ThingsChecklistItemRecord,\n ThingsContactRecord,\n ThingsDatabaseSnapshot,\n ThingsTaskRecord,\n} from \"./things-sqlite\";\nimport {\n combineThingsReminderAt,\n decodeThingsPackedDate,\n decodeThingsUnixSeconds,\n} from \"./things-values\";\n\nexport type ThingsMetadataMode = \"note\" | \"none\";\n\nexport type ImportModelName =\n | \"Team\"\n | \"Label\"\n | \"Project\"\n | \"TeamProject\"\n | \"ProjectHeading\"\n | \"Task\"\n | \"TaskLabel\"\n | \"TaskChecklistItem\";\n\ninterface PlannedModelMutation {\n modelName: ImportModelName;\n modelId: string;\n payload: Record<string, unknown>;\n sourceId: string;\n}\n\nexport interface ThingsImportPlan {\n databasePath: string;\n taskColumns: string[];\n counts: {\n source: Record<string, number>;\n planned: Record<string, number>;\n };\n phases: {\n name: string;\n items: PlannedModelMutation[];\n }[];\n}\n\ninterface BuildThingsImportPlanOptions {\n snapshot: ThingsDatabaseSnapshot;\n workspaceId: string;\n creatorId: string;\n metadataMode: ThingsMetadataMode;\n skipTeams?: boolean;\n existingLabelsByTitle?: Map<string, string>;\n timeZone?: string | null;\n}\n\ntype JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nconst MAX_CHECKLIST_TITLE_LENGTH = 500;\n\nconst classifyTaskKind = (\n task: ThingsTaskRecord\n): \"task\" | \"project\" | \"heading\" => {\n if (task.type === 2) {\n return \"heading\";\n }\n\n if (task.type === 1 && task.projectId) {\n return \"heading\";\n }\n\n if (task.type === 1) {\n return \"project\";\n }\n\n return \"task\";\n};\n\nconst compareNullableNumber = (a: number | null, b: number | null): number =>\n (a ?? Number.MAX_SAFE_INTEGER) - (b ?? Number.MAX_SAFE_INTEGER);\n\nconst compareNullableString = (a: string | null, b: string | null): number =>\n (a ?? \"\").localeCompare(b ?? \"\");\n\nconst normalizeTitle = (\n value: string | null | undefined,\n fallback: string\n): string => {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : fallback;\n};\n\nconst NON_ALPHANUMERIC_PATTERN = /[^A-Z0-9]+/g;\nconst WHITESPACE_SPLIT_PATTERN = /\\s+/;\nconst NON_ALPHANUMERIC_STRICT_PATTERN = /[^A-Z0-9]/g;\nconst READABLE_TEXT_PATTERN = /^[\\t\\n\\r\\u0020-\\u007E\\u00A0-\\uFFFF]*$/u;\nconst EMAIL_SPLIT_PATTERN = /[,\\n;]/;\n\nconst normalizeKeyBase = (value: string, fallback: string): string => {\n const words = value\n .toUpperCase()\n .replace(NON_ALPHANUMERIC_PATTERN, \" \")\n .trim()\n .split(WHITESPACE_SPLIT_PATTERN)\n .filter((word) => word.length > 0);\n const initials = words.map((word) => word[0] ?? \"\").join(\"\");\n const compact = value\n .toUpperCase()\n .replace(NON_ALPHANUMERIC_STRICT_PATTERN, \"\");\n return initials || compact || fallback;\n};\n\nconst buildUniqueKeys = <T extends { uuid: string; title: string | null }>(\n items: T[],\n options: { fallback: string; maxLength: number }\n): Map<string, string> => {\n const sorted = [...items].toSorted((a, b) => {\n const titleComparison = compareNullableString(a.title, b.title);\n if (titleComparison !== 0) {\n return titleComparison;\n }\n\n return a.uuid.localeCompare(b.uuid);\n });\n\n const keys = new Map<string, string>();\n const used = new Set<string>();\n\n for (const item of sorted) {\n const base = normalizeKeyBase(\n normalizeTitle(item.title, options.fallback),\n options.fallback\n ).slice(0, options.maxLength);\n\n let candidate = base || options.fallback;\n\n if (used.has(candidate)) {\n const suffixBase = item.uuid.replaceAll(/[^a-zA-Z0-9]/g, \"\").slice(-4);\n const suffix = suffixBase.length > 0 ? suffixBase.toUpperCase() : \"X\";\n const headLength = Math.max(1, options.maxLength - suffix.length - 1);\n candidate = `${candidate.slice(0, headLength)}-${suffix}`;\n }\n\n let counter = 2;\n while (used.has(candidate)) {\n const suffix = String(counter);\n const headLength = Math.max(1, options.maxLength - suffix.length - 1);\n candidate = `${base.slice(0, headLength)}-${suffix}`;\n counter += 1;\n }\n\n used.add(candidate);\n keys.set(item.uuid, candidate);\n }\n\n return keys;\n};\n\nconst buildTaskFields = (\n task: ThingsTaskRecord\n): {\n start: string;\n startBucket: string;\n startDate: number | null;\n todayIndexReferenceDate: number | null;\n} => {\n const startDate =\n decodeThingsPackedDate(task.startDate) ??\n (isThingsRepeatTemplateTask(task)\n ? decodeThingsPackedDate(task.nextInstanceStartDate)\n : null);\n const todayReference = decodeThingsPackedDate(task.todayIndexReferenceDate);\n\n if (task.start === 0) {\n return {\n start: \"not_started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n\n if (task.start === 2) {\n if (startDate !== null || task.recurrenceRuleRaw !== null) {\n return {\n start: \"started\",\n startBucket: \"upcoming\",\n startDate,\n todayIndexReferenceDate: null,\n };\n }\n\n return {\n start: \"someday\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n }\n\n if (startDate !== null) {\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate,\n todayIndexReferenceDate: todayReference ?? startDate,\n };\n }\n\n return {\n start: \"started\",\n startBucket: \"today\",\n startDate: null,\n todayIndexReferenceDate: null,\n };\n};\n\nconst buildReminderAt = (\n task: ThingsTaskRecord,\n startDate: number | null\n): number | null =>\n combineThingsReminderAt({\n deadlineDate: decodeThingsPackedDate(task.deadline),\n nextStartDate: decodeThingsPackedDate(task.nextInstanceStartDate),\n reminderTime: task.reminderTime,\n startDate,\n });\n\nconst pickArchivedAt = (task: ThingsTaskRecord): number | null => {\n const updatedAt = decodeThingsUnixSeconds(task.userModificationDate);\n const completedAt = decodeThingsUnixSeconds(task.stopDate);\n const createdAt = decodeThingsUnixSeconds(task.creationDate);\n\n if (task.trashed || task.status === 2) {\n return updatedAt ?? completedAt ?? createdAt;\n }\n\n return null;\n};\n\nconst pickCompletedAt = (task: ThingsTaskRecord): number | null => {\n if (task.status !== 3) {\n return null;\n }\n\n return (\n decodeThingsUnixSeconds(task.stopDate) ??\n decodeThingsUnixSeconds(task.userModificationDate) ??\n decodeThingsUnixSeconds(task.creationDate)\n );\n};\n\nconst sortValue = (primary: number | null, fallback: number): number =>\n typeof primary === \"number\" ? primary : fallback;\n\nconst sanitizeBuffer = (buffer: Buffer): JsonValue => {\n const asText = buffer.toString(\"utf8\");\n const isReadable =\n !asText.includes(\"\\uFFFD\") && READABLE_TEXT_PATTERN.test(asText);\n\n if (isReadable) {\n const trimmed = asText.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n return {\n data: buffer.toString(\"base64\"),\n encoding: \"base64\",\n };\n};\n\nconst sanitizeValue = (value: unknown): JsonValue | undefined => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Buffer.isBuffer(value)) {\n return sanitizeBuffer(value);\n }\n\n if (Array.isArray(value)) {\n const items = value\n .map((entry) => sanitizeValue(entry))\n .filter((entry): entry is JsonValue => entry !== undefined);\n return items.length > 0 ? items : undefined;\n }\n\n if (typeof value === \"object\") {\n const record: Record<string, JsonValue> = {};\n\n for (const [key, entry] of Object.entries(\n value as Record<string, unknown>\n )) {\n const sanitized = sanitizeValue(entry);\n if (sanitized !== undefined) {\n record[key] = sanitized;\n }\n }\n\n return Object.keys(record).length > 0 ? record : undefined;\n }\n\n return String(value);\n};\n\nconst appendMetadataBlock = (\n base: string | null,\n metadataMode: ThingsMetadataMode,\n metadata: Record<string, unknown> | null\n): string | null => {\n const sanitized = sanitizeValue(metadata);\n\n if (metadataMode === \"none\" || sanitized === undefined) {\n const trimmed = base?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : null;\n }\n\n const block = [\n \"Things 3 import metadata\",\n \"```json\",\n JSON.stringify(sanitized, null, 2),\n \"```\",\n ].join(\"\\n\");\n const trimmed = base?.trim();\n\n return trimmed && trimmed.length > 0\n ? `${trimmed}\\n\\n---\\n\\n${block}`\n : block;\n};\n\nconst buildTaskMetadata = (\n task: ThingsTaskRecord,\n contact: ThingsContactRecord | null,\n extraMetadata?: Record<string, unknown> | null\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: task.uuid,\n };\n\n if (task.status === 2) {\n metadata.status = \"canceled\";\n }\n\n if (contact) {\n metadata.contact = {\n appleAddressBookId: contact.appleAddressBookId,\n displayName: contact.displayName,\n emails: decodeEmails(contact.emails),\n emailsRaw: contact.emails,\n firstName: contact.firstName,\n lastName: contact.lastName,\n uuid: contact.uuid,\n };\n }\n\n if (\n task.recurrenceRuleRaw !== null ||\n task.repeatTemplateSourceId !== null ||\n task.instanceCreationStartDate !== null ||\n task.instanceCreationPaused ||\n task.instanceCreationCount !== null ||\n task.afterCompletionReferenceDate !== null ||\n task.nextInstanceStartDate !== null ||\n task.repeaterRaw !== null ||\n task.repeaterMigrationDate !== null\n ) {\n metadata.repeating = {\n afterCompletionReferenceDate: decodeThingsPackedDate(\n task.afterCompletionReferenceDate\n ),\n instanceCreationCount: task.instanceCreationCount,\n instanceCreationPaused: task.instanceCreationPaused,\n instanceCreationStartDate: decodeThingsPackedDate(\n task.instanceCreationStartDate\n ),\n nextInstanceStartDate: decodeThingsPackedDate(task.nextInstanceStartDate),\n recurrenceRuleRaw: task.recurrenceRuleRaw,\n repeaterMigrationDate: decodeThingsUnixSeconds(\n task.repeaterMigrationDate\n ),\n repeaterRaw: task.repeaterRaw,\n templateSourceId: task.repeatTemplateSourceId,\n };\n }\n\n if (\n task.deadlineOffset !== null ||\n task.raw.cachedTags !== null ||\n task.raw.experimental !== null ||\n task.raw.leavesTombstone !== null ||\n task.raw.notesSync !== null\n ) {\n metadata.raw = {\n cachedTags: task.raw.cachedTags,\n deadlineOffset: task.deadlineOffset,\n experimental: task.raw.experimental,\n leavesTombstone: task.raw.leavesTombstone,\n notesSync: task.raw.notesSync,\n };\n }\n\n if (extraMetadata) {\n Object.assign(metadata, extraMetadata);\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildProjectMetadata = (\n project: ThingsTaskRecord,\n directTagTitles: string[],\n teamName: string | null\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: project.uuid,\n };\n\n if (project.status === 2) {\n metadata.status = \"canceled\";\n }\n\n if (project.start !== null && project.start !== 1) {\n metadata.when = {\n start: project.start,\n startDate: decodeThingsPackedDate(project.startDate),\n };\n }\n\n if (teamName) {\n metadata.area = teamName;\n }\n\n if (directTagTitles.length > 0) {\n metadata.directTags = directTagTitles;\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildAreaMetadata = (\n area: ThingsAreaRecord,\n directTagTitles: string[]\n): Record<string, unknown> | null => {\n const metadata: Record<string, unknown> = {\n sourceUuid: area.uuid,\n };\n\n if (area.visible === false) {\n metadata.visible = false;\n }\n\n if (directTagTitles.length > 0) {\n metadata.directTags = directTagTitles;\n }\n\n if (area.raw.cachedTags !== null || area.raw.experimental !== null) {\n metadata.raw = {\n cachedTags: area.raw.cachedTags,\n experimental: area.raw.experimental,\n };\n }\n\n return Object.keys(metadata).length > 1 ? metadata : null;\n};\n\nconst buildGroupMap = <T>(\n rows: T[],\n getKey: (row: T) => string | null\n): Map<string, T[]> => {\n const grouped = new Map<string, T[]>();\n\n for (const row of rows) {\n const key = getKey(row);\n if (!key) {\n continue;\n }\n\n const existing = grouped.get(key);\n if (existing) {\n existing.push(row);\n continue;\n }\n\n grouped.set(key, [row]);\n }\n\n return grouped;\n};\n\nconst decodeEmails = (value: string | null): string[] => {\n if (typeof value !== \"string\") {\n return [];\n }\n\n return value\n .split(EMAIL_SPLIT_PATTERN)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n};\n\nconst buildTagTitleMap = (\n tags: readonly {\n uuid: string;\n title: string | null;\n parentId: string | null;\n }[]\n): Map<string, string> => {\n const tagById = new Map(tags.map((tag) => [tag.uuid, tag]));\n const titleById = new Map<string, string>();\n\n const resolveTitle = (tagId: string, trail: Set<string>): string => {\n const cached = titleById.get(tagId);\n if (cached) {\n return cached;\n }\n\n const tag = tagById.get(tagId);\n if (!tag) {\n return `Tag ${tagId.slice(0, 8)}`;\n }\n\n const title = normalizeTitle(tag.title, `Tag ${tag.uuid.slice(0, 8)}`);\n\n if (!tag.parentId || trail.has(tag.parentId)) {\n titleById.set(tagId, title);\n return title;\n }\n\n const nextTrail = new Set(trail);\n // oxlint-disable-next-line no-immediate-mutation\n nextTrail.add(tagId);\n const parentTitle = resolveTitle(tag.parentId, nextTrail);\n const fullTitle = `${parentTitle} / ${title}`;\n\n titleById.set(tagId, fullTitle);\n return fullTitle;\n };\n\n for (const tag of tags) {\n resolveTitle(tag.uuid, new Set());\n }\n\n return titleById;\n};\n\nconst buildChecklistMutation = (options: {\n item: ThingsChecklistItemRecord;\n sourceId?: string;\n workspaceId: string;\n taskId: string;\n fallbackCreatedAt: number;\n}): PlannedModelMutation => {\n const sourceId = options.sourceId ?? options.item.uuid;\n const title = normalizeTitle(\n options.item.title,\n `Checklist item ${options.item.uuid.slice(0, 8)}`\n );\n const safeTitle =\n title.length > MAX_CHECKLIST_TITLE_LENGTH\n ? `${title.slice(0, MAX_CHECKLIST_TITLE_LENGTH - 3)}...`\n : title;\n\n return {\n modelId: createDeterministicImportId({\n modelName: \"TaskChecklistItem\",\n sourceId,\n workspaceId: options.workspaceId,\n }),\n modelName: \"TaskChecklistItem\",\n payload: {\n completedAt:\n options.item.status === 3\n ? (decodeThingsUnixSeconds(options.item.stopDate) ??\n decodeThingsUnixSeconds(options.item.userModificationDate) ??\n decodeThingsUnixSeconds(options.item.creationDate))\n : null,\n createdAt:\n decodeThingsUnixSeconds(options.item.creationDate) ??\n options.fallbackCreatedAt,\n sortOrder: sortValue(options.item.sortIndex, options.fallbackCreatedAt),\n taskId: options.taskId,\n title: safeTitle,\n updatedAt:\n decodeThingsUnixSeconds(options.item.userModificationDate) ??\n decodeThingsUnixSeconds(options.item.creationDate) ??\n options.fallbackCreatedAt,\n workspaceId: options.workspaceId,\n },\n sourceId,\n };\n};\n\ninterface ImportPlanContext {\n workspaceId: string;\n creatorId: string;\n metadataMode: ThingsMetadataMode;\n createdAtFallback: number;\n todayDateOnly: number;\n timeZone?: string | null;\n areaById: Map<string, ThingsAreaRecord>;\n contactById: Map<string, ThingsContactRecord>;\n tagTitleById: Map<string, string>;\n existingLabelIdByTitle: Map<string, string>;\n taskTagMap: Map<string, { taskId: string; tagId: string }[]>;\n areaTagMap: Map<string, { areaId: string; tagId: string }[]>;\n checklistByTaskId: Map<string, ThingsChecklistItemRecord[]>;\n teamKeys: Map<string, string>;\n projectKeyCandidates: Map<string, string>;\n areaTeamIdBySourceId: Map<string, string>;\n tagLabelIdBySourceId: Map<string, string>;\n projectIdBySourceId: Map<string, string>;\n headingIdBySourceId: Map<string, string>;\n taskIdBySourceId: Map<string, string>;\n}\n\nconst buildTeamActions = (\n ctx: ImportPlanContext,\n areas: ThingsAreaRecord[]\n): PlannedModelMutation[] => {\n const teams: PlannedModelMutation[] = [];\n\n for (const area of [...areas].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const teamId = createDeterministicImportId({\n modelName: \"Team\",\n sourceId: area.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.areaTeamIdBySourceId.set(area.uuid, teamId);\n\n const areaTagTitles = (ctx.areaTagMap.get(area.uuid) ?? [])\n .map((link) => ctx.tagTitleById.get(link.tagId) ?? null)\n .filter((title): title is string => typeof title === \"string\");\n\n teams.push({\n modelId: teamId,\n modelName: \"Team\",\n payload: {\n archivedAt: null,\n createdAt: ctx.createdAtFallback,\n description: appendMetadataBlock(\n null,\n ctx.metadataMode,\n buildAreaMetadata(area, areaTagTitles)\n ),\n icon: null,\n key: ctx.teamKeys.get(area.uuid) ?? \"AREA\",\n name: normalizeTitle(area.title, `Area ${area.uuid.slice(0, 8)}`),\n updatedAt: ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: area.uuid,\n });\n }\n\n return teams;\n};\n\nconst buildLabelActions = (\n ctx: ImportPlanContext,\n tags: readonly {\n uuid: string;\n title: string | null;\n parentId: string | null;\n usedDate: number | null;\n sortIndex: number | null;\n }[]\n): PlannedModelMutation[] => {\n const labels: PlannedModelMutation[] = [];\n\n for (const tag of [...tags].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const labelTitle =\n ctx.tagTitleById.get(tag.uuid) ??\n normalizeTitle(tag.title, `Tag ${tag.uuid.slice(0, 8)}`);\n const existingLabelId = ctx.existingLabelIdByTitle.get(\n normalizeThingsLabelLookupKey(labelTitle)\n );\n const labelId =\n existingLabelId ??\n createDeterministicImportId({\n modelName: \"Label\",\n sourceId: tag.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.tagLabelIdBySourceId.set(tag.uuid, labelId);\n\n if (!existingLabelId) {\n labels.push({\n modelId: labelId,\n modelName: \"Label\",\n payload: {\n createdAt:\n decodeThingsUnixSeconds(tag.usedDate) ?? ctx.createdAtFallback,\n title: labelTitle,\n updatedAt:\n decodeThingsUnixSeconds(tag.usedDate) ?? ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: tag.uuid,\n });\n }\n }\n\n return labels;\n};\n\nconst buildProjectActions = (\n ctx: ImportPlanContext,\n sourceProjects: ThingsTaskRecord[]\n): {\n projects: PlannedModelMutation[];\n teamProjects: PlannedModelMutation[];\n} => {\n const projects: PlannedModelMutation[] = [];\n const teamProjects: PlannedModelMutation[] = [];\n\n for (const project of [...sourceProjects].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const projectId = createDeterministicImportId({\n modelName: \"Project\",\n sourceId: project.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.projectIdBySourceId.set(project.uuid, projectId);\n\n const directTagTitles = (ctx.taskTagMap.get(project.uuid) ?? [])\n .map((link) => ctx.tagTitleById.get(link.tagId) ?? null)\n .filter((title): title is string => typeof title === \"string\");\n const teamName =\n project.areaId === null\n ? null\n : (ctx.areaById.get(project.areaId)?.title ?? null);\n\n projects.push({\n modelId: projectId,\n modelName: \"Project\",\n payload: {\n archivedAt: pickArchivedAt(project),\n color: null,\n completedAt: pickCompletedAt(project),\n createdAt:\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n creatorId: ctx.creatorId,\n description: appendMetadataBlock(\n project.notes,\n ctx.metadataMode,\n buildProjectMetadata(project, directTagTitles, teamName)\n ),\n icon: null,\n key: ctx.projectKeyCandidates.get(project.uuid) ?? \"PROJ\",\n name: normalizeTitle(\n project.title,\n `Project ${project.uuid.slice(0, 8)}`\n ),\n sortOrder: sortValue(project.sortIndex, projects.length),\n status: project.status === 3 ? \"completed\" : \"active\",\n targetDate: decodeThingsPackedDate(project.deadline),\n updatedAt:\n decodeThingsUnixSeconds(project.userModificationDate) ??\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: project.uuid,\n });\n\n if (project.areaId !== null) {\n const teamId = ctx.areaTeamIdBySourceId.get(project.areaId);\n if (teamId) {\n teamProjects.push({\n modelId: createTeamProjectId({\n projectId,\n teamId,\n workspaceId: ctx.workspaceId,\n }),\n modelName: \"TeamProject\",\n payload: {\n createdAt:\n decodeThingsUnixSeconds(project.creationDate) ??\n ctx.createdAtFallback,\n projectId,\n teamId,\n workspaceId: ctx.workspaceId,\n },\n sourceId: `${project.areaId}:${project.uuid}`,\n });\n }\n }\n }\n\n return { projects, teamProjects };\n};\n\nconst buildHeadingActions = (\n ctx: ImportPlanContext,\n sourceHeadings: ThingsTaskRecord[]\n): PlannedModelMutation[] => {\n const headings: PlannedModelMutation[] = [];\n\n for (const heading of [...sourceHeadings].toSorted((a, b) => {\n const projectComparison = compareNullableString(a.projectId, b.projectId);\n if (projectComparison !== 0) {\n return projectComparison;\n }\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n const parentProjectId =\n heading.projectId === null\n ? null\n : (ctx.projectIdBySourceId.get(heading.projectId) ?? null);\n if (!parentProjectId) {\n continue;\n }\n\n const headingId = createDeterministicImportId({\n modelName: \"ProjectHeading\",\n sourceId: heading.uuid,\n workspaceId: ctx.workspaceId,\n });\n ctx.headingIdBySourceId.set(heading.uuid, headingId);\n\n headings.push({\n modelId: headingId,\n modelName: \"ProjectHeading\",\n payload: {\n archivedAt: pickArchivedAt(heading),\n createdAt:\n decodeThingsUnixSeconds(heading.creationDate) ??\n ctx.createdAtFallback,\n projectId: parentProjectId,\n sortOrder: sortValue(heading.sortIndex, headings.length),\n title: normalizeTitle(\n heading.title,\n `Heading ${heading.uuid.slice(0, 8)}`\n ),\n updatedAt:\n decodeThingsUnixSeconds(heading.userModificationDate) ??\n decodeThingsUnixSeconds(heading.creationDate) ??\n ctx.createdAtFallback,\n workspaceId: ctx.workspaceId,\n },\n sourceId: heading.uuid,\n });\n }\n\n return headings;\n};\n\nconst collectEffectiveTagIds = (\n task: ThingsTaskRecord,\n taskTagMap: Map<string, { taskId: string; tagId: string }[]>,\n areaTagMap: Map<string, { areaId: string; tagId: string }[]>\n): Set<string> => {\n const effectiveTagIds = new Set<string>();\n\n for (const link of taskTagMap.get(task.uuid) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n\n if (task.areaId !== null) {\n for (const link of areaTagMap.get(task.areaId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n if (task.projectId !== null) {\n for (const link of taskTagMap.get(task.projectId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n if (task.headingId !== null) {\n for (const link of taskTagMap.get(task.headingId) ?? []) {\n effectiveTagIds.add(link.tagId);\n }\n }\n\n return effectiveTagIds;\n};\n\nconst buildChecklistOverflowMetadata = (\n task: ThingsTaskRecord,\n checklistByTaskId: Map<string, ThingsChecklistItemRecord[]>\n): Record<string, unknown> | null => {\n const overflowItems = (checklistByTaskId.get(task.uuid) ?? [])\n .map((item) => ({\n title: normalizeTitle(\n item.title,\n `Checklist item ${item.uuid.slice(0, 8)}`\n ),\n uuid: item.uuid,\n }))\n .filter((item) => item.title.length > MAX_CHECKLIST_TITLE_LENGTH);\n\n return overflowItems.length > 0\n ? {\n checklistOverflow: overflowItems,\n }\n : null;\n};\n\nconst appendTaskRelations = (\n ctx: ImportPlanContext,\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[],\n relationOptions: {\n task: ThingsTaskRecord;\n taskId: string;\n createdAt: number;\n sourcePrefix?: string;\n }\n): void => {\n const tagIds = collectEffectiveTagIds(\n relationOptions.task,\n ctx.taskTagMap,\n ctx.areaTagMap\n );\n\n for (const sourceTagId of tagIds) {\n const labelId = ctx.tagLabelIdBySourceId.get(sourceTagId);\n if (!labelId) {\n continue;\n }\n\n taskLabels.push({\n modelId: createTaskLabelId({\n labelId,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n }),\n modelName: \"TaskLabel\",\n payload: {\n createdAt: relationOptions.createdAt,\n labelId,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n },\n sourceId: relationOptions.sourcePrefix\n ? `${relationOptions.sourcePrefix}:${sourceTagId}`\n : `${relationOptions.task.uuid}:${sourceTagId}`,\n });\n }\n\n for (const item of [\n ...(ctx.checklistByTaskId.get(relationOptions.task.uuid) ?? []),\n ].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n })) {\n checklistItems.push(\n buildChecklistMutation({\n fallbackCreatedAt: relationOptions.createdAt,\n item,\n sourceId: relationOptions.sourcePrefix\n ? `${relationOptions.sourcePrefix}:checklist:${item.uuid}`\n : undefined,\n taskId: relationOptions.taskId,\n workspaceId: ctx.workspaceId,\n })\n );\n }\n};\n\n// oxlint-ignore-next-line complexity -- Things 3 import maps many task fields and relationships\n// oxlint-disable-next-line complexity -- complex but clear\nconst pushTaskMutation = (\n ctx: ImportPlanContext,\n tasks: PlannedModelMutation[],\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[],\n mutationOptions: {\n task: ThingsTaskRecord;\n taskId: string;\n sourceId: string;\n taskFields?: ReturnType<typeof buildTaskFields>;\n repeat?: {\n repeatRule: string | null;\n repeatType: \"fixed\" | \"after_completion\" | null;\n repeatStatus: \"active\" | \"paused\" | null;\n repeatTemplateId: string | null;\n repeatInstanceDate: number | null;\n repeatNextAt: number | null;\n };\n }\n): number => {\n const contact =\n mutationOptions.task.contactId === null\n ? null\n : (ctx.contactById.get(mutationOptions.task.contactId) ?? null);\n const taskFields =\n mutationOptions.taskFields ?? buildTaskFields(mutationOptions.task);\n const createdAt =\n decodeThingsUnixSeconds(mutationOptions.task.creationDate) ??\n ctx.createdAtFallback;\n const updatedAt =\n decodeThingsUnixSeconds(mutationOptions.task.userModificationDate) ??\n decodeThingsUnixSeconds(mutationOptions.task.creationDate) ??\n ctx.createdAtFallback;\n const sortOrder = sortValue(\n mutationOptions.task.sortIndex,\n tasks.length * 1000\n );\n\n tasks.push({\n modelId: mutationOptions.taskId,\n modelName: \"Task\",\n payload: {\n archivedAt: pickArchivedAt(mutationOptions.task),\n assigneeId: null,\n completedAt: pickCompletedAt(mutationOptions.task),\n createdAt,\n creatorId: ctx.creatorId,\n deadlineAt: decodeThingsPackedDate(mutationOptions.task.deadline),\n deadlineSuppressionAt: decodeThingsPackedDate(\n mutationOptions.task.deadlineSuppressionDate\n ),\n delegateId: null,\n delegatedAt: null,\n description: appendMetadataBlock(\n mutationOptions.task.notes,\n ctx.metadataMode,\n buildTaskMetadata(\n mutationOptions.task,\n contact,\n buildChecklistOverflowMetadata(\n mutationOptions.task,\n ctx.checklistByTaskId\n )\n )\n ),\n headingId:\n mutationOptions.task.headingId === null\n ? null\n : (ctx.headingIdBySourceId.get(mutationOptions.task.headingId) ??\n null),\n lastReminderInteractionAt: decodeThingsUnixSeconds(\n mutationOptions.task.lastReminderInteractionDate\n ),\n projectId:\n mutationOptions.task.projectId === null\n ? null\n : (ctx.projectIdBySourceId.get(mutationOptions.task.projectId) ??\n null),\n projectSortOrder: sortOrder,\n reminderAt: buildReminderAt(mutationOptions.task, taskFields.startDate),\n repeatInstanceDate: mutationOptions.repeat?.repeatInstanceDate ?? null,\n repeatNextAt: mutationOptions.repeat?.repeatNextAt ?? null,\n repeatRule: mutationOptions.repeat?.repeatRule ?? null,\n repeatStatus: mutationOptions.repeat?.repeatStatus ?? null,\n repeatTemplateId: mutationOptions.repeat?.repeatTemplateId ?? null,\n repeatType: mutationOptions.repeat?.repeatType ?? null,\n sortOrder,\n start: taskFields.start,\n startBucket: taskFields.startBucket,\n startDate: taskFields.startDate,\n teamId:\n mutationOptions.task.areaId === null\n ? null\n : (ctx.areaTeamIdBySourceId.get(mutationOptions.task.areaId) ?? null),\n title: normalizeTitle(\n mutationOptions.task.title,\n `Task ${mutationOptions.task.uuid.slice(0, 8)}`\n ),\n todayIndexReferenceDate: taskFields.todayIndexReferenceDate,\n todaySortOrder: sortValue(mutationOptions.task.todayIndex, sortOrder),\n updatedAt,\n workspaceId: ctx.workspaceId,\n },\n sourceId: mutationOptions.sourceId,\n });\n\n appendTaskRelations(ctx, taskLabels, checklistItems, {\n createdAt,\n sourcePrefix:\n mutationOptions.sourceId === mutationOptions.task.uuid\n ? undefined\n : mutationOptions.sourceId,\n task: mutationOptions.task,\n taskId: mutationOptions.taskId,\n });\n\n return createdAt;\n};\n\nconst planRepeatTemplateTask = (\n ctx: ImportPlanContext,\n task: ThingsTaskRecord,\n taskId: string,\n openRepeatInstanceTemplateIds: Set<string>,\n tasks: PlannedModelMutation[],\n taskLabels: PlannedModelMutation[],\n checklistItems: PlannedModelMutation[]\n): void => {\n const repeatTemplate = resolveThingsRepeatTemplateFields(task, ctx.timeZone);\n\n if (!repeatTemplate) {\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n sourceId: task.uuid,\n task,\n taskId,\n });\n return;\n }\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: null,\n repeatNextAt: repeatTemplate.repeatNextAt,\n repeatRule: repeatTemplate.repeatRule,\n repeatStatus: repeatTemplate.repeatStatus,\n repeatTemplateId: null,\n repeatType: repeatTemplate.repeatType,\n },\n sourceId: task.uuid,\n task,\n taskId,\n });\n\n if (\n pickCompletedAt(task) !== null ||\n pickArchivedAt(task) !== null ||\n openRepeatInstanceTemplateIds.has(task.uuid)\n ) {\n return;\n }\n\n const currentInstanceTaskId = createDeterministicImportId({\n modelName: \"Task\",\n sourceId: `${task.uuid}:current-instance`,\n workspaceId: ctx.workspaceId,\n });\n const { currentInstanceDate } = repeatTemplate;\n const currentTaskFields =\n currentInstanceDate === null\n ? buildTaskFields(task)\n : {\n start: \"started\",\n startBucket:\n currentInstanceDate <= ctx.todayDateOnly ? \"today\" : \"upcoming\",\n startDate: currentInstanceDate,\n todayIndexReferenceDate:\n currentInstanceDate <= ctx.todayDateOnly\n ? currentInstanceDate\n : null,\n };\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: currentInstanceDate,\n repeatNextAt: null,\n repeatRule: null,\n repeatStatus: null,\n repeatTemplateId: taskId,\n repeatType: null,\n },\n sourceId: `${task.uuid}:current-instance`,\n task,\n taskFields: currentTaskFields,\n taskId: currentInstanceTaskId,\n });\n};\n\nconst buildTaskActions = (\n ctx: ImportPlanContext,\n sourceTasks: ThingsTaskRecord[]\n): {\n tasks: PlannedModelMutation[];\n taskLabels: PlannedModelMutation[];\n checklistItems: PlannedModelMutation[];\n} => {\n const tasks: PlannedModelMutation[] = [];\n const taskLabels: PlannedModelMutation[] = [];\n const checklistItems: PlannedModelMutation[] = [];\n\n const sortedSourceTasks = [...sourceTasks].toSorted((a, b) => {\n const indexComparison = compareNullableNumber(a.sortIndex, b.sortIndex);\n if (indexComparison !== 0) {\n return indexComparison;\n }\n const todayComparison = compareNullableNumber(a.todayIndex, b.todayIndex);\n if (todayComparison !== 0) {\n return todayComparison;\n }\n return a.uuid.localeCompare(b.uuid);\n });\n\n const openRepeatInstanceTemplateIds = new Set(\n sourceTasks\n .filter(isThingsRepeatInstanceTask)\n .filter(\n (task) =>\n pickCompletedAt(task) === null && pickArchivedAt(task) === null\n )\n .map((task) => task.repeatTemplateSourceId)\n .filter((value): value is string => typeof value === \"string\")\n );\n\n for (const task of sortedSourceTasks) {\n ctx.taskIdBySourceId.set(\n task.uuid,\n createDeterministicImportId({\n modelName: \"Task\",\n sourceId: task.uuid,\n workspaceId: ctx.workspaceId,\n })\n );\n }\n\n const taskPlanningOrder = [\n ...sortedSourceTasks.filter(isThingsRepeatTemplateTask),\n ...sortedSourceTasks.filter((task) => !isThingsRepeatTemplateTask(task)),\n ];\n\n for (const task of taskPlanningOrder) {\n const taskId = ctx.taskIdBySourceId.get(task.uuid);\n\n if (!taskId) {\n continue;\n }\n\n if (isThingsRepeatTemplateTask(task)) {\n planRepeatTemplateTask(\n ctx,\n task,\n taskId,\n openRepeatInstanceTemplateIds,\n tasks,\n taskLabels,\n checklistItems\n );\n continue;\n }\n\n if (isThingsRepeatInstanceTask(task)) {\n const repeatTemplateId =\n task.repeatTemplateSourceId === null\n ? null\n : (ctx.taskIdBySourceId.get(task.repeatTemplateSourceId) ?? null);\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n repeat: {\n repeatInstanceDate: resolveThingsRepeatInstanceDate(\n task,\n ctx.timeZone\n ),\n repeatNextAt: null,\n repeatRule: null,\n repeatStatus: null,\n repeatTemplateId,\n repeatType: null,\n },\n sourceId: task.uuid,\n task,\n taskId,\n });\n\n continue;\n }\n\n pushTaskMutation(ctx, tasks, taskLabels, checklistItems, {\n sourceId: task.uuid,\n task,\n taskId,\n });\n }\n\n return { checklistItems, taskLabels, tasks };\n};\n\nexport const buildThingsImportPlan = (\n options: BuildThingsImportPlanOptions\n): ThingsImportPlan => {\n const { snapshot, workspaceId, existingLabelsByTitle } = options;\n\n const ctx: ImportPlanContext = {\n areaById: new Map(snapshot.areas.map((area) => [area.uuid, area])),\n areaTagMap: buildGroupMap(snapshot.areaTags, (row) => row.areaId),\n areaTeamIdBySourceId: new Map<string, string>(),\n checklistByTaskId: buildGroupMap(\n snapshot.checklistItems,\n (row) => row.taskId\n ),\n contactById: new Map(\n snapshot.contacts.map((contact) => [contact.uuid, contact])\n ),\n createdAtFallback: Date.now(),\n creatorId: options.creatorId,\n existingLabelIdByTitle: existingLabelsByTitle ?? new Map<string, string>(),\n headingIdBySourceId: new Map<string, string>(),\n metadataMode: options.metadataMode,\n projectIdBySourceId: new Map<string, string>(),\n projectKeyCandidates: buildUniqueKeys(\n snapshot.tasks.filter((task) => classifyTaskKind(task) === \"project\"),\n {\n fallback: \"PROJ\",\n maxLength: 12,\n }\n ),\n tagLabelIdBySourceId: new Map<string, string>(),\n tagTitleById: buildTagTitleMap(snapshot.tags),\n taskIdBySourceId: new Map<string, string>(),\n taskTagMap: buildGroupMap(snapshot.taskTags, (row) => row.taskId),\n teamKeys: options.skipTeams\n ? new Map<string, string>()\n : buildUniqueKeys(snapshot.areas, {\n fallback: \"AREA\",\n maxLength: 24,\n }),\n timeZone: options.timeZone,\n todayDateOnly: dateOnlyEpochFromLocalDate(),\n workspaceId,\n };\n\n const teams = options.skipTeams ? [] : buildTeamActions(ctx, snapshot.areas);\n const labels = buildLabelActions(ctx, snapshot.tags);\n\n const sourceProjects = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"project\"\n );\n const sourceHeadings = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"heading\"\n );\n const sourceTasks = snapshot.tasks.filter(\n (task) => classifyTaskKind(task) === \"task\"\n );\n\n const { projects, teamProjects } = buildProjectActions(ctx, sourceProjects);\n const headings = buildHeadingActions(ctx, sourceHeadings);\n const { tasks, taskLabels, checklistItems } = buildTaskActions(\n ctx,\n sourceTasks\n );\n\n const phases = [\n { items: teams, name: \"teams\" },\n { items: labels, name: \"labels\" },\n { items: projects, name: \"projects\" },\n { items: teamProjects, name: \"teamProjects\" },\n { items: headings, name: \"headings\" },\n { items: tasks, name: \"tasks\" },\n { items: taskLabels, name: \"taskLabels\" },\n { items: checklistItems, name: \"checklistItems\" },\n ];\n\n return {\n counts: {\n planned: Object.fromEntries(\n phases.map((phase) => [phase.name, phase.items.length])\n ),\n source: {\n areaTagLinks: snapshot.areaTags.length,\n areas: snapshot.areas.length,\n checklistItems: snapshot.checklistItems.length,\n headings: sourceHeadings.length,\n projects: sourceProjects.length,\n tags: snapshot.tags.length,\n taskTagLinks: snapshot.taskTags.length,\n tasks: sourceTasks.length,\n },\n },\n databasePath: snapshot.databasePath,\n phases,\n taskColumns: snapshot.taskColumns,\n };\n};\n","import {\n accessSync,\n constants as fsConstants,\n readdirSync,\n statSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport Database from \"better-sqlite3\";\n\nconst THINGS_CONTAINER_PATH = join(\n homedir(),\n \"Library/Group Containers/JLMPQHK86H.com.culturedcode.ThingsMac\"\n);\nconst THINGS_BUNDLE_NAME = \"Things Database.thingsdatabase\";\nconst THINGS_SQLITE_FILE = \"main.sqlite\";\nconst LEGACY_THINGS_SQLITE_FILE = \"Things.sqlite3\";\n\ntype SqlitePrimitive = Buffer | number | string | null;\ntype SqliteRow = Record<string, SqlitePrimitive>;\n\nexport interface ThingsTaskRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n notes: string | null;\n status: number | null;\n stopDate: number | null;\n trashed: boolean;\n type: number | null;\n start: number | null;\n startDate: number | null;\n startBucket: number | null;\n reminderTime: number | null;\n lastReminderInteractionDate: number | null;\n deadline: number | null;\n deadlineSuppressionDate: number | null;\n deadlineOffset: number | null;\n sortIndex: number | null;\n todayIndex: number | null;\n todayIndexReferenceDate: number | null;\n areaId: string | null;\n projectId: string | null;\n headingId: string | null;\n contactId: string | null;\n creationDate: number | null;\n userModificationDate: number | null;\n repeatTemplateSourceId: string | null;\n recurrenceRuleRaw: string | null;\n instanceCreationStartDate: number | null;\n instanceCreationPaused: boolean;\n instanceCreationCount: number | null;\n afterCompletionReferenceDate: number | null;\n nextInstanceStartDate: number | null;\n repeaterRaw: string | null;\n repeaterMigrationDate: number | null;\n}\n\nexport interface ThingsAreaRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n visible: boolean | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsTagRecord {\n raw: SqliteRow;\n uuid: string;\n title: string | null;\n shortcut: string | null;\n parentId: string | null;\n usedDate: number | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsChecklistItemRecord {\n raw: SqliteRow;\n uuid: string;\n taskId: string | null;\n title: string | null;\n status: number | null;\n stopDate: number | null;\n creationDate: number | null;\n userModificationDate: number | null;\n sortIndex: number | null;\n}\n\nexport interface ThingsTaskTagRecord {\n taskId: string;\n tagId: string;\n}\n\nexport interface ThingsAreaTagRecord {\n areaId: string;\n tagId: string;\n}\n\nexport interface ThingsContactRecord {\n raw: SqliteRow;\n uuid: string;\n displayName: string | null;\n firstName: string | null;\n lastName: string | null;\n emails: string | null;\n appleAddressBookId: string | null;\n}\n\nexport interface ThingsDatabaseSnapshot {\n databasePath: string;\n taskColumns: string[];\n tasks: ThingsTaskRecord[];\n areas: ThingsAreaRecord[];\n tags: ThingsTagRecord[];\n checklistItems: ThingsChecklistItemRecord[];\n taskTags: ThingsTaskTagRecord[];\n areaTags: ThingsAreaTagRecord[];\n contacts: ThingsContactRecord[];\n}\n\nconst URL_SCHEME_PATTERN = /^[a-z][a-z0-9+.-]*:/i;\n\nconst isUrlLike = (value: string): boolean => URL_SCHEME_PATTERN.test(value);\n\nconst resolveInputPath = (databaseUrl: string): string => {\n if (!isUrlLike(databaseUrl)) {\n return resolve(databaseUrl);\n }\n\n const parsed = new URL(databaseUrl);\n\n if (parsed.protocol === \"file:\") {\n return fileURLToPath(parsed);\n }\n\n if (parsed.protocol === \"sqlite:\") {\n return resolve(decodeURIComponent(parsed.pathname));\n }\n\n throw new Error(\n `Unsupported Things database URL scheme \"${parsed.protocol}\". Use a file path, file:// URL, or sqlite:// URL.`\n );\n};\n\nconst expandThingsDatabasePath = (inputPath: string): string => {\n const resolvedPath = resolve(inputPath);\n const lastSegment = basename(resolvedPath);\n\n if (\n lastSegment === THINGS_SQLITE_FILE ||\n lastSegment === LEGACY_THINGS_SQLITE_FILE\n ) {\n return resolvedPath;\n }\n\n if (lastSegment === THINGS_BUNDLE_NAME) {\n return join(resolvedPath, THINGS_SQLITE_FILE);\n }\n\n if (lastSegment.startsWith(\"ThingsData-\")) {\n return join(resolvedPath, THINGS_BUNDLE_NAME, THINGS_SQLITE_FILE);\n }\n\n return resolvedPath;\n};\n\nconst isReadableFile = (path: string): boolean => {\n try {\n accessSync(path, fsConstants.R_OK);\n return statSync(path).isFile();\n } catch {\n return false;\n }\n};\n\nconst findLatestThingsDatabasePath = (): string | null => {\n const candidates: { path: string; mtimeMs: number }[] = [];\n\n for (const name of [\n join(THINGS_CONTAINER_PATH, THINGS_BUNDLE_NAME, THINGS_SQLITE_FILE),\n join(THINGS_CONTAINER_PATH, LEGACY_THINGS_SQLITE_FILE),\n ]) {\n if (isReadableFile(name)) {\n candidates.push({ mtimeMs: statSync(name).mtimeMs, path: name });\n }\n }\n\n try {\n const entries = readdirSync(THINGS_CONTAINER_PATH, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!(entry.isDirectory() && entry.name.startsWith(\"ThingsData-\"))) {\n continue;\n }\n\n const candidate = join(\n THINGS_CONTAINER_PATH,\n entry.name,\n THINGS_BUNDLE_NAME,\n THINGS_SQLITE_FILE\n );\n\n if (!isReadableFile(candidate)) {\n continue;\n }\n\n candidates.push({\n mtimeMs: statSync(candidate).mtimeMs,\n path: candidate,\n });\n }\n } catch {\n return null;\n }\n\n if (candidates.length === 0) {\n return null;\n }\n\n candidates.sort((left, right) => right.mtimeMs - left.mtimeMs);\n return candidates[0]?.path ?? null;\n};\n\nconst readRows = (\n database: Database.Database,\n tableName: string\n): SqliteRow[] =>\n database.prepare(`SELECT * FROM ${tableName}`).all() as SqliteRow[];\n\nconst hasTable = (database: Database.Database, tableName: string): boolean => {\n const row = database\n .prepare(\n \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1\"\n )\n .get(tableName) as { name?: string } | undefined;\n\n return row?.name === tableName;\n};\n\nconst getTableColumns = (\n database: Database.Database,\n tableName: string\n): string[] => {\n if (!hasTable(database, tableName)) {\n return [];\n }\n\n const rows = database.prepare(`PRAGMA table_info(${tableName})`).all() as {\n name?: string;\n }[];\n\n return rows\n .map((row) => (typeof row.name === \"string\" ? row.name : null))\n .filter((name): name is string => name !== null);\n};\n\nconst toStringValue = (value: SqlitePrimitive | undefined): string | null => {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (Buffer.isBuffer(value)) {\n const text = value.toString(\"utf8\").trim();\n return text.length > 0 ? text : null;\n }\n\n return null;\n};\n\nconst toNumberValue = (value: SqlitePrimitive | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) ? value : null;\n\nconst toBooleanValue = (value: SqlitePrimitive | undefined): boolean | null => {\n const numeric = toNumberValue(value);\n return numeric === null ? null : numeric !== 0;\n};\n\nconst normalizeTaskRecord = (row: SqliteRow): ThingsTaskRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n afterCompletionReferenceDate: toNumberValue(\n row.rt1_afterCompletionReferenceDate ?? row.afterCompletionReferenceDate\n ),\n areaId: toStringValue(row.area),\n contactId: toStringValue(row.contact ?? row.delegate),\n creationDate: toNumberValue(row.creationDate),\n deadline: toNumberValue(row.deadline ?? row.dueDate),\n deadlineOffset: toNumberValue(row.t2_deadlineOffset ?? row.dueDateOffset),\n deadlineSuppressionDate: toNumberValue(\n row.deadlineSuppressionDate ?? row.dueDateSuppressionDate\n ),\n headingId: toStringValue(row.heading ?? row.actionGroup),\n instanceCreationCount: toNumberValue(\n row.rt1_instanceCreationCount ?? row.instanceCreationCount\n ),\n instanceCreationPaused:\n toBooleanValue(\n row.rt1_instanceCreationPaused ?? row.instanceCreationPaused\n ) ?? false,\n instanceCreationStartDate: toNumberValue(\n row.rt1_instanceCreationStartDate ?? row.instanceCreationStartDate\n ),\n lastReminderInteractionDate: toNumberValue(\n row.lastReminderInteractionDate ?? row.lastAlarmInteractionDate\n ),\n nextInstanceStartDate: toNumberValue(\n row.rt1_nextInstanceStartDate ?? row.nextInstanceStartDate\n ),\n notes: toStringValue(row.notes),\n projectId: toStringValue(row.project),\n raw: row,\n recurrenceRuleRaw: toStringValue(\n row.rt1_recurrenceRule ?? row.recurrenceRule\n ),\n reminderTime: toNumberValue(row.reminderTime),\n repeatTemplateSourceId: toStringValue(\n row.rt1_repeatingTemplate ?? row.repeatingTemplate\n ),\n repeaterMigrationDate: toNumberValue(row.repeaterMigrationDate),\n repeaterRaw: toStringValue(row.repeater),\n sortIndex: toNumberValue(row.index),\n start: toNumberValue(row.start),\n startBucket: toNumberValue(row.startBucket),\n startDate: toNumberValue(row.startDate),\n status: toNumberValue(row.status),\n stopDate: toNumberValue(row.stopDate),\n title: toStringValue(row.title),\n todayIndex: toNumberValue(row.todayIndex),\n todayIndexReferenceDate: toNumberValue(row.todayIndexReferenceDate),\n trashed: toBooleanValue(row.trashed) ?? false,\n type: toNumberValue(row.type),\n userModificationDate: toNumberValue(row.userModificationDate),\n uuid,\n };\n};\n\nconst normalizeAreaRecord = (row: SqliteRow): ThingsAreaRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n raw: row,\n sortIndex: toNumberValue(row.index),\n title: toStringValue(row.title),\n uuid,\n visible: toBooleanValue(row.visible),\n };\n};\n\nconst normalizeTagRecord = (row: SqliteRow): ThingsTagRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n parentId: toStringValue(row.parent),\n raw: row,\n shortcut: toStringValue(row.shortcut),\n sortIndex: toNumberValue(row.index),\n title: toStringValue(row.title),\n usedDate: toNumberValue(row.usedDate),\n uuid,\n };\n};\n\nconst normalizeChecklistItemRecord = (\n row: SqliteRow\n): ThingsChecklistItemRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n creationDate: toNumberValue(row.creationDate),\n raw: row,\n sortIndex: toNumberValue(row.index),\n status: toNumberValue(row.status),\n stopDate: toNumberValue(row.stopDate),\n taskId: toStringValue(row.task),\n title: toStringValue(row.title),\n userModificationDate: toNumberValue(row.userModificationDate),\n uuid,\n };\n};\n\nconst normalizeTaskTagRecord = (row: SqliteRow): ThingsTaskTagRecord | null => {\n const taskId = toStringValue(row.tasks);\n const tagId = toStringValue(row.tags);\n return taskId && tagId ? { tagId, taskId } : null;\n};\n\nconst normalizeAreaTagRecord = (row: SqliteRow): ThingsAreaTagRecord | null => {\n const areaId = toStringValue(row.areas);\n const tagId = toStringValue(row.tags);\n return areaId && tagId ? { areaId, tagId } : null;\n};\n\nconst normalizeContactRecord = (row: SqliteRow): ThingsContactRecord | null => {\n const uuid = toStringValue(row.uuid);\n\n if (!uuid) {\n return null;\n }\n\n return {\n appleAddressBookId: toStringValue(row.appleAddressBookId),\n displayName: toStringValue(row.displayName),\n emails: toStringValue(row.emails),\n firstName: toStringValue(row.firstName),\n lastName: toStringValue(row.lastName),\n raw: row,\n uuid,\n };\n};\n\nexport const resolveThingsDatabasePath = (databaseUrl: string): string =>\n expandThingsDatabasePath(resolveInputPath(databaseUrl));\n\nexport const resolveDefaultThingsDatabasePath = (): string => {\n const resolved = findLatestThingsDatabasePath();\n\n if (!resolved) {\n throw new Error(\n `Could not find a Things database under ${THINGS_CONTAINER_PATH}. Pass --database-url with a main.sqlite path, a .thingsdatabase bundle, or a ThingsData-* directory.`\n );\n }\n\n return resolved;\n};\n\nexport const loadThingsDatabase = (\n databaseUrl?: string | null\n): ThingsDatabaseSnapshot => {\n const databasePath = databaseUrl\n ? resolveThingsDatabasePath(databaseUrl)\n : resolveDefaultThingsDatabasePath();\n\n if (!isReadableFile(databasePath)) {\n throw new Error(`Things database file not found: ${databasePath}`);\n }\n\n const database = new Database(databasePath, {\n fileMustExist: true,\n readonly: true,\n });\n\n try {\n return {\n areaTags: hasTable(database, \"TMAreaTag\")\n ? readRows(database, \"TMAreaTag\")\n .map(normalizeAreaTagRecord)\n .filter((record): record is ThingsAreaTagRecord => record !== null)\n : [],\n areas: hasTable(database, \"TMArea\")\n ? readRows(database, \"TMArea\")\n .map(normalizeAreaRecord)\n .filter((record): record is ThingsAreaRecord => record !== null)\n : [],\n checklistItems: hasTable(database, \"TMChecklistItem\")\n ? readRows(database, \"TMChecklistItem\")\n .map(normalizeChecklistItemRecord)\n .filter(\n (record): record is ThingsChecklistItemRecord => record !== null\n )\n : [],\n contacts: hasTable(database, \"TMContact\")\n ? readRows(database, \"TMContact\")\n .map(normalizeContactRecord)\n .filter((record): record is ThingsContactRecord => record !== null)\n : [],\n databasePath,\n tags: hasTable(database, \"TMTag\")\n ? readRows(database, \"TMTag\")\n .map(normalizeTagRecord)\n .filter((record): record is ThingsTagRecord => record !== null)\n : [],\n taskColumns: getTableColumns(database, \"TMTask\"),\n taskTags: hasTable(database, \"TMTaskTag\")\n ? readRows(database, \"TMTaskTag\")\n .map(normalizeTaskTagRecord)\n .filter((record): record is ThingsTaskTagRecord => record !== null)\n : [],\n tasks: readRows(database, \"TMTask\")\n .map(normalizeTaskRecord)\n .filter((record): record is ThingsTaskRecord => record !== null),\n };\n } finally {\n database.close();\n }\n};\n","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport { randomUUID } from \"node:crypto\";\n\nimport { requestNdjson } from \"../api/http\";\nimport { mutateModel } from \"../manage-api\";\nimport type { CliContext, WorkspaceSummary } from \"../types\";\nimport { normalizeThingsLabelLookupKey } from \"./things-labels\";\n// oxlint-disable-next-line no-duplicates\nimport type { ThingsMetadataMode } from \"./things-mapper\";\n// oxlint-disable-next-line no-duplicate-imports\nimport { buildThingsImportPlan } from \"./things-mapper\";\n// oxlint-disable-next-line no-duplicate-imports\nimport type { ImportModelName } from \"./things-mapper\";\nimport { loadThingsDatabase } from \"./things-sqlite\";\nimport { resolveLocalTimeZone } from \"./time-zone\";\n\ninterface CommandContextLike {\n apiBaseUrl: string;\n token: string;\n localContext: {\n clientId: string;\n };\n}\n\ninterface RunThingsImportOptions {\n context: CliContext;\n commandContext: CommandContextLike;\n workspace: WorkspaceSummary;\n creatorId: string;\n databaseUrl?: string;\n metadataMode: ThingsMetadataMode;\n batchSize: number;\n dryRun: boolean;\n skipTeams: boolean;\n}\n\ntype SyncAction = \"INSERT\" | \"UPDATE\";\n\ninterface ImportTransaction {\n clientTxId: string;\n clientId: string;\n modelName: ImportModelName;\n modelId: string;\n action: SyncAction;\n payload: Record<string, unknown>;\n}\n\ninterface ImportExecutionSummary {\n inserted: number;\n updated: number;\n skipped: number;\n batches: number;\n}\n\ninterface PreparedTransactions {\n transactions: ImportTransaction[];\n inserted: number;\n updated: number;\n skipped: number;\n}\n\ninterface ExistingImportState {\n rowsByModel: Map<ImportModelName, unknown[]>;\n existingLabelIdsByTitle: Map<string, string>;\n}\n\nexport interface ThingsImportResult {\n workspace: WorkspaceSummary;\n databasePath: string;\n taskColumns: string[];\n counts: {\n source: Record<string, number>;\n planned: Record<string, number>;\n };\n execution: ImportExecutionSummary;\n dryRun: boolean;\n}\n\nconst WORKSPACE_SCOPED_MODELS: ImportModelName[] = [\n \"Team\",\n \"Label\",\n \"Project\",\n \"TeamProject\",\n \"ProjectHeading\",\n \"Task\",\n \"TaskLabel\",\n \"TaskChecklistItem\",\n];\n\nconst INSERT_ONLY_MODELS = new Set<ImportModelName>([\n \"TaskLabel\",\n \"TeamProject\",\n]);\n\nconst chunk = <T>(items: T[], size: number): T[][] => {\n const result: T[][] = [];\n\n for (let index = 0; index < items.length; index += size) {\n result.push(items.slice(index, index + size));\n }\n\n return result;\n};\n\nconst collectRowIds = (\n rows: unknown[],\n modelName: ImportModelName\n): Set<string> => {\n const ids = new Set<string>();\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.__class !== modelName || typeof record.id !== \"string\") {\n continue;\n }\n\n ids.add(record.id);\n }\n\n return ids;\n};\n\nconst createWorkspaceScopedRowMap = (\n modelNames: readonly ImportModelName[]\n): Map<ImportModelName, unknown[]> =>\n new Map(\n modelNames.map((modelName): [ImportModelName, unknown[]] => [modelName, []])\n );\n\nexport const collectWorkspaceScopedRowsByModel = (\n rows: unknown[],\n options: {\n workspaceId: string;\n modelNames: readonly ImportModelName[];\n }\n): Map<ImportModelName, unknown[]> => {\n const modelNames = new Set<string>(options.modelNames);\n const rowsByModel = createWorkspaceScopedRowMap(options.modelNames);\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.workspaceId !== options.workspaceId) {\n continue;\n }\n\n const modelName = record.__class;\n if (typeof modelName !== \"string\" || !modelNames.has(modelName)) {\n continue;\n }\n\n rowsByModel.get(modelName as ImportModelName)?.push(row);\n }\n\n return rowsByModel;\n};\n\nconst loadWorkspaceScopedRowsByModel = async (\n context: CliContext,\n options: {\n apiBaseUrl: string;\n token: string;\n workspaceId: string;\n modelNames: readonly ImportModelName[];\n }\n): Promise<Map<ImportModelName, unknown[]>> => {\n const query = new URLSearchParams({\n onlyModels: options.modelNames.join(\",\"),\n schemaHash: \"\",\n syncGroups: options.workspaceId,\n });\n\n const rows = await requestNdjson(\n context,\n `${options.apiBaseUrl}/sync/bootstrap?${query.toString()}`,\n {\n method: \"GET\",\n token: options.token,\n }\n );\n\n return collectWorkspaceScopedRowsByModel(rows, {\n modelNames: options.modelNames,\n workspaceId: options.workspaceId,\n });\n};\n\nconst loadExistingImportState = async (\n options: RunThingsImportOptions\n): Promise<ExistingImportState> => {\n let modelNames: readonly ImportModelName[];\n if (options.dryRun) {\n modelNames = [\"Label\"];\n } else if (options.skipTeams) {\n modelNames = WORKSPACE_SCOPED_MODELS.filter(\n (m) => m !== \"Team\" && m !== \"TeamProject\"\n );\n } else {\n modelNames = WORKSPACE_SCOPED_MODELS;\n }\n const rowsByModel = await loadWorkspaceScopedRowsByModel(options.context, {\n apiBaseUrl: options.commandContext.apiBaseUrl,\n modelNames,\n token: options.commandContext.token,\n workspaceId: options.workspace.id,\n });\n\n return {\n existingLabelIdsByTitle: buildExistingLabelIdsByTitle(rowsByModel),\n rowsByModel,\n };\n};\n\nconst buildExistingLabelIdsByTitle = (\n rowsByModel: Map<ImportModelName, unknown[]>\n): Map<string, string> => {\n const rows = rowsByModel.get(\"Label\") ?? [];\n const labelsByTitle = new Map<string, string>();\n\n for (const row of rows) {\n if (typeof row !== \"object\" || row === null) {\n continue;\n }\n\n const record = row as Record<string, unknown>;\n if (record.__class !== \"Label\") {\n continue;\n }\n\n const id = typeof record.id === \"string\" ? record.id : null;\n const title = typeof record.title === \"string\" ? record.title.trim() : \"\";\n\n if (!id || title.length === 0) {\n continue;\n }\n\n labelsByTitle.set(normalizeThingsLabelLookupKey(title), id);\n }\n\n return labelsByTitle;\n};\n\nconst buildExistingIds = (\n rowsByModel: Map<ImportModelName, unknown[]>\n): Map<ImportModelName, Set<string>> => {\n const entries = WORKSPACE_SCOPED_MODELS.map(\n (modelName): readonly [ImportModelName, Set<string>] => [\n modelName,\n collectRowIds(rowsByModel.get(modelName) ?? [], modelName),\n ]\n );\n\n return new Map(entries);\n};\n\nconst buildTransactions = (\n phaseItems: ReturnType<\n typeof buildThingsImportPlan\n >[\"phases\"][number][\"items\"],\n options: {\n existingIds: Map<ImportModelName, Set<string>>;\n clientId: string;\n }\n): PreparedTransactions => {\n const transactions: ImportTransaction[] = [];\n let inserted = 0;\n let updated = 0;\n let skipped = 0;\n\n for (const item of phaseItems) {\n const existingIds = options.existingIds.get(item.modelName) ?? new Set();\n const exists = existingIds.has(item.modelId);\n\n if (exists && INSERT_ONLY_MODELS.has(item.modelName)) {\n skipped += 1;\n continue;\n }\n\n const action: SyncAction = exists ? \"UPDATE\" : \"INSERT\";\n\n if (action === \"INSERT\") {\n inserted += 1;\n existingIds.add(item.modelId);\n } else {\n updated += 1;\n }\n\n transactions.push({\n action,\n clientId: options.clientId,\n clientTxId: randomUUID(),\n modelId: item.modelId,\n modelName: item.modelName,\n payload: item.payload,\n });\n }\n\n return { inserted, skipped, transactions, updated };\n};\n\nconst executeImportPlan = async (\n options: RunThingsImportOptions,\n plan: ReturnType<typeof buildThingsImportPlan>,\n rowsByModel: Map<ImportModelName, unknown[]>\n): Promise<ImportExecutionSummary> => {\n const execution: ImportExecutionSummary = {\n batches: 0,\n inserted: 0,\n skipped: 0,\n updated: 0,\n };\n const existingIds = buildExistingIds(rowsByModel);\n\n for (const phase of plan.phases) {\n const prepared = buildTransactions(phase.items, {\n clientId: options.commandContext.localContext.clientId,\n existingIds,\n });\n\n execution.inserted += prepared.inserted;\n execution.updated += prepared.updated;\n execution.skipped += prepared.skipped;\n\n const transactionBatches = chunk(prepared.transactions, options.batchSize);\n\n for (const transactionBatch of transactionBatches) {\n if (transactionBatch.length === 0) {\n continue;\n }\n\n await mutateModel(options.context, {\n baseUrl: options.commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: transactionBatch,\n },\n token: options.commandContext.token,\n });\n\n execution.batches += 1;\n }\n }\n\n return execution;\n};\n\nexport const runThingsImport = async (\n options: RunThingsImportOptions\n): Promise<ThingsImportResult> => {\n const snapshot = loadThingsDatabase(options.databaseUrl);\n const existingState = await loadExistingImportState(options);\n const plan = buildThingsImportPlan({\n creatorId: options.creatorId,\n existingLabelsByTitle: existingState.existingLabelIdsByTitle,\n metadataMode: options.metadataMode,\n skipTeams: options.skipTeams,\n snapshot,\n timeZone: resolveLocalTimeZone(),\n workspaceId: options.workspace.id,\n });\n\n if (options.dryRun) {\n return {\n counts: plan.counts,\n databasePath: plan.databasePath,\n dryRun: true,\n execution: {\n batches: 0,\n inserted: 0,\n skipped: 0,\n updated: 0,\n },\n taskColumns: plan.taskColumns,\n workspace: options.workspace,\n };\n }\n const execution = await executeImportPlan(\n options,\n plan,\n existingState.rowsByModel\n );\n\n return {\n counts: plan.counts,\n databasePath: plan.databasePath,\n dryRun: false,\n execution,\n taskColumns: plan.taskColumns,\n workspace: options.workspace,\n };\n};\n","import type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport type { ThingsMetadataMode } from \"../import/things-mapper\";\nimport { summarizeThingsImportResult } from \"../import/things-output\";\nimport { runThingsImport } from \"../import/things-runner\";\nimport { writeInfo, writeOutput, writeSuccess } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { resolveWorkspace } from \"../workspace-context\";\n\ninterface ThingsImportOptions {\n databaseUrl?: string;\n workspace?: string;\n skipTeams: boolean;\n metadataMode: string;\n batchSize: number;\n}\n\nconst parseMetadataMode = (value: string): ThingsMetadataMode => {\n const normalized = value.trim().toLowerCase();\n\n if (normalized === \"note\" || normalized === \"none\") {\n return normalized;\n }\n\n throw new Error(\n `Invalid metadata mode \"${value}\". Expected one of: note, none.`\n );\n};\n\nconst runThingsImportCommand = async (\n context: ReturnType<typeof contextFromCommand>,\n options: ThingsImportOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const creatorId = requireUserId(commandContext.resolvedToken);\n const metadataMode = parseMetadataMode(options.metadataMode);\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n const result = await runThingsImport({\n batchSize: options.batchSize,\n commandContext,\n context,\n creatorId,\n databaseUrl: options.databaseUrl,\n dryRun: context.dryRun,\n metadataMode,\n skipTeams: options.skipTeams,\n workspace,\n });\n\n if (context.json) {\n writeOutput(context, result);\n return;\n }\n\n if (autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${workspace.name}`);\n }\n\n const summary = summarizeThingsImportResult(result);\n writeSuccess(context, summary.successMessage);\n\n for (const line of summary.infoLines) {\n writeInfo(context, line);\n }\n};\n\nexport const registerImportCommands = (\n program: Command,\n workspaceOverride: string | null\n): void => {\n const importCommand = program\n .command(\"import\")\n .description(\"Import external data into Done Bear\");\n\n importCommand\n .command(\"things\")\n .description(\"Import a Things 3 SQLite export\")\n .option(\n \"--database-url <database-url>\",\n \"Path, file:// URL, sqlite:// URL, .thingsdatabase bundle, or ThingsData-* directory\"\n )\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\n \"--skip-teams\",\n \"Skip importing Things Areas as Teams and TeamProject links\",\n false\n )\n .option(\n \"--metadata-mode <mode>\",\n \"How to preserve Things-only metadata: note|none\",\n \"note\"\n )\n .option(\n \"--batch-size <count>\",\n \"Maximum sync mutations per batch\",\n (value: string): number => parsePositiveInteger(value, \"Batch size\"),\n 100\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear import things --dry-run --json\n donebear import things --database-url ~/Backups/Things\\\\ Database.thingsdatabase --json\n donebear import things --database-url file:///Users/me/Backups/main.sqlite --workspace personal\n\nNotes:\n --database-url accepts a copied Things 3 export bundle, a direct main.sqlite path, or a ThingsData-* directory.\n --metadata-mode note preserves Things-only fields in task/project/team descriptions using a structured appendix.\n`\n )\n .action(async (options: ThingsImportOptions, command: Command) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runThingsImportCommand(context, options, workspaceOverride);\n });\n });\n};\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\n\nimport type { Command } from \"commander\";\n\nimport { CONFIG_DIR } from \"../constants\";\nimport { writeInfo, writeSuccess } from \"../output\";\nimport type { CliContext } from \"../types\";\n\nconst HISTORY_FILE = join(CONFIG_DIR, \"history.json\");\nconst MAX_HISTORY = 200;\n\ninterface HistoryFile {\n version: 1;\n entries: string[];\n}\n\nconst 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\nconst loadHistory = async (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\nconst 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\nconst buildCompleter =\n (program: Command) =>\n (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\nexport const runInteractiveMode = async (\n context: CliContext,\n program: Command\n): Promise<void> => {\n const history = await loadHistory(HISTORY_FILE);\n\n const rl = createInterface({\n completer: buildCompleter(program),\n historySize: MAX_HISTORY,\n input: process.stdin,\n output: process.stdout,\n prompt: \"donebear> \",\n });\n\n // Pre-populate readline history (reversed — readline stores newest first)\n for (const entry of [...history].toReversed()) {\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 = { entries: updated, version: 1 };\n await mkdir(CONFIG_DIR, { mode: 0o700, recursive: true });\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\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { normalizeWorkspaceRef } from \"../command-helpers\";\nimport { loadLabelsByWorkspace, loadLabelsByWorkspaceIds } from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { formatEpochDate } from \"../task-defaults\";\nimport type { LabelRecord } from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\ninterface LabelListOptions {\n workspace?: string;\n sort: string;\n}\n\ninterface LabelShowOptions {\n workspace?: string;\n}\n\nconst 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\nconst resolveLabel = async (\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 apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\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\nconst runLabelList = async (\n context: ReturnType<typeof contextFromCommand>,\n options: LabelListOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const allLabels =\n scope.mode === \"all\"\n ? await loadLabelsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadLabelsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const sorted = sortLabels(allLabels, options.sort);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n labels: sorted,\n total: sorted.length,\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 (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (sorted.length === 0) {\n writeInfo(context, \"No labels found.\");\n return;\n }\n\n writeInfo(context, `${scopeLabel(scope)} (${sorted.length} label(s))`);\n\n for (const labelRecord of sorted) {\n writeInfo(context, `${labelRecord.id.slice(0, 8)} ${labelRecord.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\nconst runLabelShow = async (\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 commandContext,\n labelRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n createdAtIso: formatEpochDate(label.createdAt),\n label,\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 const 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 { createInterface } from \"node:readline\";\n\nimport type { CliContext } from \"./types\";\n\n/**\n * Prompt for confirmation on destructive actions.\n * Auto-skips when: --yes, --json, --dry-run, or non-TTY stdin.\n */\nexport const confirmAction = (\n context: CliContext,\n message: string\n): Promise<boolean> => {\n if (context.yes || context.json || context.dryRun || !process.stdin.isTTY) {\n return Promise.resolve(true);\n }\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stderr,\n });\n\n // oxlint-disable-next-line avoid-new -- wrapping callback API in promise\n return new Promise((resolve) => {\n rl.question(`${message} [y/N] `, (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === \"y\");\n });\n });\n};\n","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport { randomUUID } from \"node:crypto\";\n\nimport type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport { findByRef, normalizeWorkspaceRef } from \"../command-helpers\";\nimport { confirmAction } from \"../confirm\";\nimport {\n formatDateOnlyEpoch,\n formatInstantEpoch,\n parseCliDateOnlyToEpoch,\n} from \"../date-codecs\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport {\n loadProjectsByWorkspace,\n loadProjectsByWorkspaceIds,\n mutateModel,\n} from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport type { ProjectRecord, WorkspaceSummary } from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\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 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\nconst parseProjectStatus = (value: string): ProjectStatus => {\n switch (value.trim().toLowerCase()) {\n case \"active\": {\n return \"active\";\n }\n case \"done\":\n case \"complete\":\n case \"completed\": {\n return \"done\";\n }\n case \"archived\":\n case \"archive\": {\n return \"archived\";\n }\n case \"all\": {\n return \"all\";\n }\n default: {\n throw new Error(\n `Invalid status \"${value}\". Expected one of: active, done, archived, all.`\n );\n }\n }\n};\n\nconst 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\nconst parseTargetDate = (value: string | undefined): number | null =>\n parseCliDateOnlyToEpoch(value, \"target date\");\n\nconst generateProjectSlug = (name: string, id: string): string => {\n const slug = name\n .toLowerCase()\n .trim()\n .replaceAll(/[^a-z0-9]+/g, \"-\")\n .replaceAll(/^-|-$/g, \"\")\n .slice(0, 39);\n const shortId = id.replaceAll(\"-\", \"\").slice(0, 8);\n return slug ? `${slug}-${shortId}` : shortId;\n};\n\nconst 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\nconst sortProjectsByUpdatedDesc = (\n projects: ProjectRecord[]\n): ProjectRecord[] =>\n [...projects].toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n\nconst resolveProjectReference = async (\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 apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\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 found = findByRef(options.projectRef, projects);\n\n if (!found) {\n throw new Error(`Project \"${options.projectRef}\" not found.`);\n }\n\n return { project: found, workspace };\n};\n\nconst runProjectList = async (\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 scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const allProjects =\n scope.mode === \"all\"\n ? await loadProjectsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadProjectsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const filtered = filterProjects(\n sortProjectsByUpdatedDesc(allProjects),\n requestedStatus\n );\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n projects: filtered,\n status: requestedStatus,\n total: filtered.length,\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 formatDateOnlyEpoch(p.targetDate) ?? \"\",\n formatInstantEpoch(p.updatedAt) ?? \"\",\n ]);\n\n if (writeFormattedRows(context, filtered.length, headers, rows)) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (filtered.length === 0) {\n writeInfo(context, \"No projects found.\");\n return;\n }\n\n writeInfo(context, `${scopeLabel(scope)} (${filtered.length} project(s))`);\n\n for (const project of filtered) {\n const status = getProjectStatus(project);\n const target = formatDateOnlyEpoch(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\nconst runProjectShow = async (\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 commandContext,\n projectRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n archivedAtIso: formatInstantEpoch(project.archivedAt),\n completedAtIso: formatInstantEpoch(project.completedAt),\n createdAtIso: formatInstantEpoch(project.createdAt),\n project,\n status: getProjectStatus(project),\n targetDateIso: formatDateOnlyEpoch(project.targetDate),\n updatedAtIso: formatInstantEpoch(project.updatedAt),\n workspace,\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: ${formatDateOnlyEpoch(project.targetDate) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `createdAt: ${formatInstantEpoch(project.createdAt) ?? \"(none)\"}`\n );\n writeInfo(\n context,\n `updatedAt: ${formatInstantEpoch(project.updatedAt) ?? \"(none)\"}`\n );\n\n if (project.description) {\n writeInfo(context, `description: ${project.description}`);\n }\n};\n\nconst resolveProjectName = async (\n context: ReturnType<typeof contextFromCommand>,\n rawName: string | undefined\n): Promise<string> => {\n if (rawName) {\n const trimmed = rawName.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const { promptForValue } = await import(\"../prompt\");\n const prompted = await promptForValue(context, \"Project name\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Project name is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a name: donebear project add \"My project\"'\n );\n};\n\nconst runProjectAdd = async (\n context: ReturnType<typeof contextFromCommand>,\n name: string | undefined,\n options: ProjectAddOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n const userId = requireUserId(commandContext.resolvedToken);\n const normalizedName = await resolveProjectName(context, name);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n const projectId = randomUUID();\n const now = Date.now();\n const key = generateProjectSlug(normalizedName, projectId);\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: projectId,\n modelName: \"Project\",\n payload: {\n archivedAt: null,\n completedAt: null,\n createdAt: now,\n creatorId: userId,\n description: options.description?.trim() || null,\n key,\n name: normalizedName,\n sortOrder: 0,\n status: \"active\",\n targetDate: parseTargetDate(options.targetDate),\n updatedAt: now,\n workspaceId: workspace.id,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n autoSelected,\n created: true,\n id: projectId,\n key,\n workspaceId: workspace.id,\n workspaceName: workspace.name,\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\nconst 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\nconst 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\nconst runProjectEdit = async (\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 commandContext,\n projectRef,\n workspaceRef: normalizeWorkspaceRef(options.workspace),\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: project.id,\n modelName: \"Project\",\n payload: updates,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { action: \"UPDATE\", id: project.id, ok: true });\n return;\n }\n\n writeSuccess(context, `Updated project: ${project.id}`);\n};\n\nconst runProjectMutation = async (\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 commandContext,\n projectRef,\n workspaceRef: payload.workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: payload.action,\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: project.id,\n modelName: \"Project\",\n payload: payload.data,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, { action: payload.action, id: project.id, ok: true });\n return;\n }\n\n writeSuccess(context, `${payload.successMessage}: ${project.id}`);\n};\n\nexport const 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 list --json\n donebear project add \"Q1 Launch\" --json\n donebear project add \"Website Redesign\" --target-date 2026-06-30 --json\n donebear project edit \"Q1 Launch\" --target-date 2026-03-31 --json\n donebear project done \"Q1 Launch\" --json\n\nDate format: YYYY-MM-DD (e.g. 2026-03-31)\nProject id: full UUID, slug, id prefix, or name\nStatus: active | done | archived | all\n\nAgent tip: run \"donebear spec project add\" for full option reference\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 (prompted interactively if omitted)\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-d, --description <text>\", \"Project description\")\n .option(\"--target-date <date>\", \"Target date (YYYY-MM-DD)\")\n .action(\n async (\n name: string | undefined,\n options: ProjectAddOptions,\n command: Command\n ) => {\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 action: \"UPDATE\",\n data: { completedAt: now, updatedAt: now },\n successMessage: \"Marked done\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 const confirmed = await confirmAction(\n context,\n `Archive project \"${projectRef}\"?`\n );\n if (!confirmed) {\n throw new CliError(\"Cancelled\", EXIT_CODES.CANCELLED);\n }\n await runProjectMutation(context, projectRef, {\n action: \"ARCHIVE\",\n data: { archivedAt: Date.now() },\n successMessage: \"Archived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 action: \"UNARCHIVE\",\n data: {},\n successMessage: \"Unarchived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n });\n }\n );\n};\n","// oxlint-disable no-use-before-define -- helper functions grouped after main exports\nimport { randomUUID } from \"node:crypto\";\n\nimport type { Command } from \"commander\";\n\nimport { requireUserId, resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n parseTaskState,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { confirmAction } from \"../confirm\";\nimport {\n formatDateOnlyEpoch,\n formatInstantEpoch,\n parseCliDateOnlyToEpoch,\n} from \"../date-codecs\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport {\n loadChecklistItemsByTask,\n loadProjectsByWorkspace,\n loadTaskById,\n loadTasksByWorkspace,\n loadTasksByWorkspaceIds,\n loadTeamsByWorkspace,\n mutateModel,\n} from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { promptForValue, readStdin } from \"../prompt\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n buildTaskStartFields,\n getTaskState,\n resolveTaskView,\n} from \"../task-defaults\";\nimport type {\n ChecklistItemRecord,\n TaskRecord,\n TaskState,\n TaskView,\n WorkspaceScope,\n} from \"../types\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\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 view?: 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\nconst 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\nconst parseDeadline = (value: string | undefined): number | null =>\n parseCliDateOnlyToEpoch(value, \"deadline date\");\n\nconst sortTasksByUpdatedDesc = (tasks: TaskRecord[]): TaskRecord[] =>\n [...tasks].toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n\nconst resolveTaskReference = async (\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 taskId: taskRef,\n token: options.commandContext.token,\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 apiBaseUrl: options.commandContext.apiBaseUrl,\n storedWorkspaceId: options.commandContext.localContext.workspaceId,\n token: options.commandContext.token,\n workspaceRef: options.workspaceRef,\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 const filterTasks = (\n tasks: TaskRecord[],\n options: {\n state: TaskState;\n search: string | null;\n view: TaskView | null;\n }\n): TaskRecord[] => {\n const stateFiltered =\n options.state === \"all\"\n ? tasks\n : tasks.filter((task) => getTaskState(task) === options.state);\n\n const viewFiltered = options.view\n ? stateFiltered.filter((task) => resolveTaskView(task) === options.view)\n : stateFiltered;\n\n if (!options.search) {\n return viewFiltered;\n }\n\n const query = options.search.trim().toLowerCase();\n\n if (query.length === 0) {\n return viewFiltered;\n }\n\n return viewFiltered.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\nconst loadTasksForScope = (\n context: ReturnType<typeof contextFromCommand>,\n scope: WorkspaceScope,\n apiOptions: { baseUrl: string; token: string }\n): Promise<TaskRecord[]> => {\n if (scope.mode === \"all\") {\n return loadTasksByWorkspaceIds(context, {\n ...apiOptions,\n workspaceIds: scope.workspaces.map((w) => w.id),\n });\n }\n\n return loadTasksByWorkspace(context, {\n ...apiOptions,\n workspaceId: scope.workspace.id,\n });\n};\n\nconst runTaskList = async (\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 scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks = await loadTasksForScope(context, scope, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n });\n\n const parsedView = options.view ? parseTaskView(options.view) : null;\n const filtered = filterTasks(sortTasksByUpdatedDesc(tasks), {\n search: options.search?.trim() ?? null,\n state: requestedState,\n view: parsedView,\n });\n const limited = filtered.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n state: requestedState,\n tasks: limited,\n total: filtered.length,\n view: parsedView,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n filtered.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, \"No tasks found.\");\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)} (${limited.length}/${filtered.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n};\n\nconst runTaskShow = async (\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 commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, {\n archivedAtIso: formatInstantEpoch(task.archivedAt),\n completedAtIso: formatInstantEpoch(task.completedAt),\n createdAtIso: formatInstantEpoch(task.createdAt),\n deadlineAtIso: formatDateOnlyEpoch(task.deadlineAt),\n state: getTaskState(task),\n task,\n updatedAtIso: formatInstantEpoch(task.updatedAt),\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: ${formatDateOnlyEpoch(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\nconst resolveTitle = async (\n context: ReturnType<typeof contextFromCommand>,\n rawTitle: string | undefined\n): Promise<string> => {\n if (rawTitle) {\n const trimmed = rawTitle.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const prompted = await promptForValue(context, \"Title\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Task title is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a title as an argument: donebear task add \"My task\"'\n );\n};\n\nconst resolveNotes = async (\n _context: ReturnType<typeof contextFromCommand>,\n flagNotes: string | undefined\n): Promise<string | null> => {\n // Explicit --notes flag takes priority\n if (typeof flagNotes === \"string\") {\n const trimmed = flagNotes.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n // Try reading from stdin pipe\n const stdinContent = await readStdin();\n if (stdinContent) {\n return stdinContent;\n }\n\n return null;\n};\n\nconst runTaskAdd = async (\n context: ReturnType<typeof contextFromCommand>,\n title: string | undefined,\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 = await resolveTitle(context, title);\n const notes = await resolveNotes(context, options.notes);\n\n const { workspace, autoSelected } = await resolveWorkspace(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 const deadlineEpoch = parseDeadline(options.deadline);\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: taskId,\n modelName: \"Task\",\n payload: {\n archivedAt: null,\n completedAt: null,\n createdAt: now,\n creatorId: userId,\n deadlineAt: deadlineEpoch,\n description: notes,\n projectId,\n sortOrder: 0,\n teamId,\n title: normalizedTitle,\n todaySortOrder: 0,\n updatedAt: now,\n workspaceId: workspace.id,\n ...startFields,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n autoSelected,\n created: true,\n deadlineAt: deadlineEpoch,\n id: taskId,\n projectId,\n teamId,\n title: normalizedTitle,\n view,\n workspaceId: workspace.id,\n workspaceName: workspace.name,\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\nconst runTaskMutation = async (\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 commandContext,\n taskRef,\n workspaceRef: payload.workspaceRef,\n });\n\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: payload.action,\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: task.id,\n modelName: \"Task\",\n payload: payload.data,\n },\n ],\n },\n token: commandContext.token,\n });\n\n if (context.json) {\n writeOutput(context, {\n action: payload.action,\n id: task.id,\n ok: true,\n });\n return;\n }\n\n writeSuccess(context, `${payload.successMessage}: ${task.id}`);\n};\n\nconst resolveEntityId = (\n entities: { 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\nconst resolveProjectId = async (\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 apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef,\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\nconst resolveTeamId = async (\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 apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef,\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\nconst 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\nconst 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\nconst runTaskEdit = async (\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 action: \"UPDATE\",\n data: updates,\n successMessage: \"Updated\",\n workspaceRef: wsRef,\n });\n};\n\nconst runTaskRead = async (\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 commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n if (context.json) {\n writeOutput(context, { description: task.description, id: task.id });\n return;\n }\n\n writeInfo(context, task.description ?? \"(empty)\");\n};\n\nconst runTaskAppend = async (\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 commandContext,\n taskRef,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const newDesc = `${task.description ?? \"\"}\\n${text.trim()}`;\n\n await runTaskMutation(context, task.id, {\n action: \"UPDATE\",\n data: { description: newDesc, updatedAt: Date.now() },\n successMessage: \"Appended\",\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n};\n\nconst runTaskPrepend = async (\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 commandContext,\n taskRef,\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 action: \"UPDATE\",\n data: { description: newDesc, updatedAt: Date.now() },\n successMessage: \"Prepended\",\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n};\n\nconst runTaskRandom = async (\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 apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 search: null,\n state: requestedState,\n view: null,\n });\n\n if (filtered.length === 0) {\n if (context.json) {\n writeOutput(context, { 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 writeOutput(context, {\n archivedAtIso: formatInstantEpoch(task.archivedAt),\n completedAtIso: formatInstantEpoch(task.completedAt),\n createdAtIso: formatInstantEpoch(task.createdAt),\n deadlineAtIso: formatDateOnlyEpoch(task.deadlineAt),\n state: getTaskState(task),\n task,\n updatedAtIso: formatInstantEpoch(task.updatedAt),\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: ${formatDateOnlyEpoch(task.deadlineAt) ?? \"(none)\"}`\n );\n\n if (task.description) {\n writeInfo(context, `notes: ${task.description}`);\n }\n};\n\nconst resolveChecklistItemReference = async (\n context: ReturnType<typeof contextFromCommand>,\n commandContext: Awaited<ReturnType<typeof resolveCommandContext>>,\n taskId: string,\n itemRef: string\n): Promise<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 taskId,\n token: commandContext.token,\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\nconst runChecklistList = async (\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 commandContext,\n taskRef: taskId,\n workspaceRef: workspaceOption?.trim() ?? null,\n });\n const items = await loadChecklistItemsByTask(context, {\n baseUrl: commandContext.apiBaseUrl,\n taskId: task.id,\n token: commandContext.token,\n });\n const sorted = [...items].toSorted((a, b) => a.sortOrder - b.sortOrder);\n\n if (context.json) {\n writeOutput(context, { items: sorted, taskId: task.id });\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 const 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 list --json\n donebear task add \"Fix login bug\" --when today --json\n donebear task add \"Write tests\" --deadline 2026-03-15 --project PROJ --json\n donebear task edit 8f2c1a --deadline 2026-03-05 --json\n donebear task done 8f2c1a --json\n donebear task list --state done --limit 50 --json\n\nDate format: YYYY-MM-DD (e.g. 2026-03-15)\nTask id: full UUID or prefix of >= 4 chars (e.g. 8f2c)\nView buckets: inbox | anytime | today | upcoming | someday\n\nAgent tip: run \"donebear spec task add\" for full option reference\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 { limit: DEFAULT_TASK_LIST_LIMIT, state: \"open\" },\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 .option(\n \"-v, --view <view>\",\n \"Filter by view bucket (inbox|anytime|today|upcoming|someday)\"\n )\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear task list --json\n donebear task list --state done --json\n donebear task list --view today --json\n donebear task list --search \"login\" --limit 50 --json\n\nStates: open (default) | done | archived | all\nViews: inbox | anytime | today | upcoming | someday\n`\n )\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 (prompted interactively if omitted)\")\n .option(\"-w, --workspace <workspace>\", \"Workspace id, slug, or exact name\")\n .option(\"-n, --notes <text>\", \"Task notes (or pipe via stdin)\")\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 .addHelpText(\n \"after\",\n `\nExamples:\n donebear task add \"Fix login bug\" --when today --json\n donebear task add \"Write tests\" --deadline 2026-03-15 --project PROJ --json\n donebear task add \"Review PR\" --when anytime --notes \"Check for XSS\" --json\n echo \"Multi-line notes\" | donebear task add \"My task\"\n donebear task add # prompts for title interactively\n\nDate format: YYYY-MM-DD (e.g. 2026-03-15)\nView (--when): inbox | anytime | today | upcoming | someday\n`\n )\n .action(\n async (\n title: string | undefined,\n options: TaskAddOptions,\n command: Command\n ) => {\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 action: \"UPDATE\",\n data: { completedAt: now, updatedAt: now },\n successMessage: \"Marked done\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 action: \"UPDATE\",\n data: { completedAt: null, updatedAt: Date.now() },\n successMessage: \"Reopened\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 const confirmed = await confirmAction(\n context,\n `Archive task \"${taskId}\"?`\n );\n if (!confirmed) {\n throw new CliError(\"Cancelled\", EXIT_CODES.CANCELLED);\n }\n await runTaskMutation(context, taskId, {\n action: \"ARCHIVE\",\n data: { archivedAt: Date.now() },\n successMessage: \"Archived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 action: \"UNARCHIVE\",\n data: {},\n successMessage: \"Unarchived\",\n workspaceRef:\n workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\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 request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"INSERT\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: itemId,\n modelName: \"TaskChecklistItem\",\n payload: {\n completedAt: null,\n createdAt: now,\n sortOrder: now,\n taskId: resolvedTask.id,\n title: title.trim(),\n updatedAt: now,\n workspaceId: resolvedTask.workspaceId,\n },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { 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 resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { completedAt: now, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\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 resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { completedAt: null, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\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 resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n const now = Date.now();\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"UPDATE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: { title: newTitle, updatedAt: now },\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, ok: true });\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 resolvedTask = await resolveTaskReference(context, {\n commandContext,\n taskRef: taskId,\n workspaceRef: options.workspace?.trim() ?? null,\n });\n const item = await resolveChecklistItemReference(\n context,\n commandContext,\n resolvedTask.id,\n itemId\n );\n await mutateModel(context, {\n baseUrl: commandContext.apiBaseUrl,\n request: {\n batchId: randomUUID(),\n transactions: [\n {\n action: \"ARCHIVE\",\n clientId: commandContext.localContext.clientId,\n clientTxId: randomUUID(),\n modelId: item.id,\n modelName: \"TaskChecklistItem\",\n payload: {},\n },\n ],\n },\n token: commandContext.token,\n });\n if (context.json) {\n writeOutput(context, { id: item.id, removed: true });\n return;\n }\n writeSuccess(context, `Removed: ${item.title}`);\n });\n }\n );\n};\n","import type { Command } from \"commander\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n parseTaskState,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { CliError, EXIT_CODES } from \"../errors\";\nimport { loadTasksByWorkspace, loadTasksByWorkspaceIds } from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n} from \"../output\";\nimport { promptForValue } from \"../prompt\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\nimport { filterTasks } from \"./task\";\n\nconst DEFAULT_SEARCH_LIMIT = 20;\n\ninterface SearchOptions {\n workspace?: string;\n state: string;\n limit: number;\n}\n\nconst resolveQuery = async (\n context: ReturnType<typeof contextFromCommand>,\n rawQuery: string | undefined\n): Promise<string> => {\n if (rawQuery) {\n const trimmed = rawQuery.trim();\n if (trimmed.length > 0) {\n return trimmed;\n }\n }\n\n const prompted = await promptForValue(context, \"Search query\");\n\n if (prompted) {\n return prompted;\n }\n\n throw new CliError(\n \"Search query is required.\",\n EXIT_CODES.VALIDATION,\n 'Provide a query: donebear search \"my query\"'\n );\n};\n\nconst runSearch = async (\n context: ReturnType<typeof contextFromCommand>,\n query: string | undefined,\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 = await resolveQuery(context, query);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks =\n scope.mode === \"all\"\n ? await loadTasksByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const filtered = filterTasks(tasks, {\n search: trimmedQuery,\n state: requestedState,\n view: null,\n });\n\n const limited = filtered.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n query: trimmedQuery,\n state: requestedState,\n tasks: limited,\n total: filtered.length,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n filtered.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, `No tasks found matching \"${trimmedQuery}\".`);\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)} — \"${trimmedQuery}\" (${limited.length}/${filtered.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n\n if (context.copy) {\n copyToClipboard(taskListLines(limited).join(\"\\n\"));\n }\n};\n\nexport const 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 (prompted interactively if omitted)\")\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 donebear search # prompts for query interactively\n`\n )\n .action(\n async (\n query: string | undefined,\n options: SearchOptions,\n command: Command\n ) => {\n const context = contextFromCommand(command);\n await runWithErrorHandling(context, async () => {\n await runSearch(context, query, options, workspaceOverride);\n });\n }\n );\n};\n","// donebear spec [command] [subcommand]\n// Progressive CLI spec for agent discovery — no auth required\n\nimport type { Command } from \"commander\";\n\nimport { writeJson } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\n\nconst OVERVIEW = {\n authentication: \"Set DONEBEAR_TOKEN env var, or run: donebear auth login\",\n commands: {\n auth: {\n description: \"Authentication\",\n quick_example: \"donebear auth status --json\",\n subcommands: [\"login\", \"status\", \"logout\"],\n },\n context: {\n description:\n \"Current workspace snapshot: user, task counts, recent tasks, active projects\",\n quick_example: \"donebear context --json\",\n },\n doctor: {\n description:\n \"Run environment diagnostics: CLI version, auth, workspace, AI agent detection\",\n quick_example: \"donebear doctor --json\",\n },\n history: {\n description: \"Workspace audit log (recent sync actions)\",\n quick_example: \"donebear history --json\",\n },\n import: {\n description: \"Import external data into Done Bear\",\n quick_example: \"donebear import things --dry-run --json\",\n subcommands: [\"things\"],\n },\n label: {\n description: \"List workspace labels\",\n quick_example: \"donebear label list --json\",\n subcommands: [\"list\", \"show\"],\n },\n project: {\n description: \"Manage projects\",\n quick_example: \"donebear project list --json\",\n subcommands: [\n \"list\",\n \"show\",\n \"add\",\n \"edit\",\n \"done\",\n \"archive\",\n \"unarchive\",\n ],\n },\n search: {\n description: \"Search tasks by title/description across the workspace\",\n quick_example: 'donebear search \"login bug\" --json',\n },\n spec: {\n description: \"Progressive CLI spec for agent discovery (this command)\",\n quick_example: \"donebear spec task add\",\n },\n task: {\n description: \"Create and manage tasks\",\n quick_example: 'donebear task add \"Fix bug\" --when today --json',\n subcommands: [\n \"list\",\n \"show\",\n \"add\",\n \"edit\",\n \"done\",\n \"reopen\",\n \"archive\",\n \"unarchive\",\n \"read\",\n \"append\",\n \"prepend\",\n \"checklist\",\n ],\n },\n team: {\n description: \"List workspace teams\",\n quick_example: \"donebear team list --json\",\n subcommands: [\"list\", \"show\"],\n },\n today: {\n description: \"List today's tasks (shortcut for task list --view today)\",\n quick_example: \"donebear today --json\",\n },\n whoami: {\n description: \"Show the current authenticated user\",\n quick_example: \"donebear whoami --json\",\n },\n workspace: {\n description: \"Manage workspaces\",\n quick_example: \"donebear workspace list --json\",\n subcommands: [\n \"list\",\n \"current\",\n \"use\",\n \"clear\",\n \"create\",\n \"join\",\n \"members\",\n \"invitations\",\n \"invite\",\n ],\n },\n },\n global_options: {\n \"--copy\": \"Copy output to clipboard\",\n \"--dry-run\": \"Preview mutations without executing\",\n \"--format\": \"text|json|csv|tsv|yaml\",\n \"--jq <expression>\": \"Filter output with a JMESPath expression\",\n \"--json\": \"Machine-readable JSON output (use this for agent scripting)\",\n \"--limit <n>\": \"Limit output to N items (for array results)\",\n \"--total\": \"Print count only\",\n \"-q, --quiet\": \"Suppress status output (implies --json)\",\n \"-y, --yes\": \"Skip confirmation prompts\",\n },\n output_behavior:\n \"Auto-detects TTY vs pipe: JSON output activates automatically when piped to another command.\",\n tip: \"Drill into any command: donebear spec <command> [subcommand] e.g. donebear spec task add\",\n workspace_targeting:\n \"Prefix any command: donebear workspace=<slug> task list\",\n};\n\n// Detailed specs keyed by \"command\" or \"command subcommand\"\nconst COMMAND_SPECS: Record<string, object> = {\n \"auth login\": {\n command: \"auth login\",\n examples: [\n \"donebear auth login\",\n \"donebear auth login --no-open\",\n \"donebear auth login --no-open\",\n ],\n json_output: { ok: \"boolean\", source: \"string\", user: \"{ id, email }\" },\n non_interactive:\n \"For CI/scripts, set DONEBEAR_TOKEN=<token> instead of using auth login.\",\n options: {\n \"--no-open\": {\n description: \"Print auth URL instead of opening browser\",\n type: \"boolean\",\n },\n },\n usage: \"donebear auth login [options]\",\n },\n \"auth status\": {\n command: \"auth status\",\n examples: [\"donebear auth status --json\"],\n json_output: {\n authenticated: \"boolean\",\n ok: \"boolean\",\n source: \"string | null\",\n user: \"{ id, email } | null\",\n },\n options: {},\n usage: \"donebear auth status\",\n },\n context: {\n command: \"context\",\n description:\n \"Current workspace snapshot: user, task counts, recent tasks, active projects\",\n examples: [\n \"donebear context --json\",\n \"donebear context --markdown\",\n \"donebear context --tasks-limit 20 --json\",\n ],\n json_output: {\n activeProjects: \"Array<{ id, key, name, targetDate }>\",\n generatedAt: \"ISO 8601 timestamp\",\n ok: \"boolean\",\n recentTasks: \"Array<{ id, title, deadline, view }>\",\n taskCounts: \"{ open, done, archived, total }\",\n user: \"{ id, email }\",\n workspace: \"{ id, name, urlKey }\",\n },\n options: {\n \"--markdown\": {\n description: \"Output as markdown (for system prompt injection)\",\n type: \"boolean\",\n },\n \"--tasks-limit\": {\n default: 10,\n description: \"Max recent tasks to return\",\n type: \"number\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear context [options]\",\n },\n doctor: {\n command: \"doctor\",\n description:\n \"Run environment diagnostics: CLI version, auth status, workspace, AI agent detection\",\n examples: [\"donebear doctor\", \"donebear doctor --json\"],\n json_output: {\n checks:\n \"Array<{ name: string, status: 'pass' | 'warn' | 'fail', message: string }>\",\n ok: \"boolean\",\n },\n notes:\n \"Exits 0 if all checks pass or warn. Exits 1 if any check fails. Detects Claude Code, Cursor, Claude Desktop, and VS Code.\",\n options: {},\n usage: \"donebear doctor\",\n },\n history: {\n command: \"history\",\n examples: [\n \"donebear history --json\",\n \"donebear history --model Task --limit 20 --json\",\n ],\n json_output: {\n history: \"WorkspaceHistoryEntry[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 50, type: \"number\" },\n \"--model\": {\n description: \"Filter by model\",\n enum: [\"Task\", \"Project\", \"Label\", \"Team\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear history [options]\",\n },\n \"import things\": {\n command: \"import things\",\n description: \"Import a Things 3 SQLite export into the selected workspace\",\n examples: [\n \"donebear import things --dry-run --json\",\n \"donebear import things --database-url ~/Backups/Things\\\\ Database.thingsdatabase --json\",\n \"donebear import things --database-url file:///Users/me/Backups/main.sqlite --workspace personal\",\n ],\n json_output: {\n counts:\n \"{ source: Record<string, number>, planned: Record<string, number> }\",\n databasePath: \"string\",\n dryRun: \"boolean\",\n execution: \"{ inserted, updated, skipped, batches }\",\n taskColumns: \"string[]\",\n workspace: \"WorkspaceSummary\",\n },\n notes:\n \"The importer reads the official Things SQLite export (`main.sqlite`) and preserves unmapped Things-only fields in descriptions when `--metadata-mode note` is used.\",\n options: {\n \"--batch-size\": {\n default: 100,\n description: \"Maximum sync mutations per batch\",\n type: \"number\",\n },\n \"--database-url\": {\n description:\n \"Path, file:// URL, sqlite:// URL, .thingsdatabase bundle, or ThingsData-* directory\",\n type: \"string\",\n },\n \"--dry-run\": {\n description: \"Plan the import without sending sync mutations\",\n type: \"boolean\",\n },\n \"--metadata-mode\": {\n default: \"note\",\n description:\n \"Preserve Things-only metadata in descriptions (`note`) or drop it (`none`)\",\n enum: [\"note\", \"none\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear import things [options]\",\n },\n \"label list\": {\n command: \"label list\",\n examples: [\"donebear label list --json\"],\n json_output: {\n labels: \"LabelRecord[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear label list [options]\",\n },\n \"project add\": {\n arguments: { name: { required: true, type: \"string\" } },\n command: \"project add\",\n examples: [\n 'donebear project add \"Q2 Launch\" --json',\n 'donebear project add \"Website Redesign\" --target-date 2026-06-30 --json',\n ],\n json_output: {\n id: \"string\",\n key: \"string\",\n ok: \"boolean\",\n workspaceId: \"string\",\n },\n notes:\n \"URL slug is auto-generated from name (e.g. 'Q2 Launch' → 'q2-launch-a1b2c3d4').\",\n options: {\n \"--description\": { type: \"string\" },\n \"--target-date\": {\n description: \"Target completion date\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project add <name> [options]\",\n },\n \"project done\": {\n arguments: {\n id: {\n description: \"Project UUID, key, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"project done\",\n examples: [\"donebear project done PROJ --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear project done <id> [options]\",\n },\n \"project edit\": {\n arguments: {\n id: {\n description: \"Project UUID, key, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"project edit\",\n examples: ['donebear project edit PROJ --name \"Updated Name\" --json'],\n json_output: { action: \"string\", id: \"string\", ok: \"boolean\" },\n options: {\n \"--description\": { type: \"string\" },\n \"--name\": { type: \"string\" },\n \"--target-date\": { format: \"YYYY-MM-DD\", type: \"string\" },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project edit <id> [options]\",\n },\n \"project list\": {\n command: \"project list\",\n examples: [\n \"donebear project list --json\",\n \"donebear project list --status all --json\",\n ],\n json_output: {\n count: \"number\",\n ok: \"boolean\",\n projects: \"ProjectRecord[]\",\n status: \"string\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--status\": {\n default: \"active\",\n enum: [\"active\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear project list [options]\",\n },\n search: {\n arguments: {\n query: {\n description: \"Prompted interactively in TTY if omitted.\",\n required: false,\n type: \"string\",\n },\n },\n command: \"search\",\n examples: [\n 'donebear search \"login bug\" --json',\n 'donebear search \"Q1\" --state open --json',\n ],\n json_output: {\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n query: \"string\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 20, type: \"number\" },\n \"--state\": {\n default: \"all\",\n enum: [\"open\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--workspace\": { type: \"string\" },\n },\n usage: \"donebear search [query] [options]\",\n },\n \"task add\": {\n arguments: {\n title: {\n description:\n \"Task title. Prompted interactively in TTY if omitted. Required in non-TTY.\",\n required: false,\n type: \"string\",\n },\n },\n command: \"task add\",\n examples: [\n 'donebear task add \"Fix login bug\" --when today --json',\n 'donebear task add \"Write tests\" --deadline 2026-03-15 --project PROJ --json',\n 'donebear task add \"Review PR\" --when anytime --notes \"Triage for bugs\" --json',\n 'echo \"Multi-line notes\" | donebear task add \"My task\"',\n \"donebear task add # prompts for title interactively in TTY\",\n ],\n json_output: {\n created: \"boolean\",\n deadlineAt: \"number | null\",\n id: \"string (UUID)\",\n projectId: \"string | null\",\n teamId: \"string | null\",\n title: \"string\",\n view: \"string\",\n workspaceId: \"string\",\n workspaceName: \"string\",\n },\n notes:\n \"Title is prompted interactively when omitted in TTY. Notes can be piped via stdin. Task id accepts full UUID or prefix of >= 4 chars in all other task subcommands.\",\n options: {\n \"--deadline\": {\n description: \"Due date\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--notes\": {\n description: \"Body / description text (or pipe via stdin)\",\n type: \"string\",\n },\n \"--project\": { description: \"Project id, key, or name\", type: \"string\" },\n \"--team\": { description: \"Team id, key, or name\", type: \"string\" },\n \"--when\": {\n default: \"inbox\",\n description: \"View bucket\",\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task add [title] [options]\",\n },\n \"task append\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n text: { required: true, type: \"string\" },\n },\n command: \"task append\",\n description: \"Append text to task notes\",\n examples: ['donebear task append abc1 \"Additional context\" --json'],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task append <id> <text> [options]\",\n },\n \"task archive\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task archive\",\n examples: [\"donebear task archive abc1 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task archive <id> [options]\",\n },\n \"task done\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task done\",\n examples: [\"donebear task done abc1 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task done <id> [options]\",\n },\n \"task edit\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix (>= 4 chars)\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task edit\",\n examples: [\n 'donebear task edit abc1 --title \"Updated title\" --json',\n \"donebear task edit abc1 --when today --deadline 2026-03-20 --json\",\n ],\n json_output: { action: \"string\", id: \"string\", ok: \"boolean\" },\n options: {\n \"--deadline\": {\n description: \"Set due date (pass empty string to clear)\",\n format: \"YYYY-MM-DD\",\n type: \"string\",\n },\n \"--notes\": { description: \"Replace notes/description\", type: \"string\" },\n \"--project\": { description: \"Project id, key, or name\", type: \"string\" },\n \"--team\": { description: \"Team id, key, or name\", type: \"string\" },\n \"--title\": { type: \"string\" },\n \"--when\": {\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task edit <id> [options]\",\n },\n \"task list\": {\n command: \"task list\",\n examples: [\n \"donebear task list --json\",\n \"donebear task list --state done --json\",\n \"donebear task list --view today --json\",\n 'donebear task list --search \"login\" --json',\n ],\n json_output: {\n autoSelected: \"boolean\",\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n search: \"string | null\",\n state: \"string\",\n view: \"string | null\",\n workspace: \"WorkspaceSummary\",\n },\n options: {\n \"--limit\": { default: 20, description: \"Max results\", type: \"number\" },\n \"--search\": {\n description: \"Filter by title/description substring\",\n type: \"string\",\n },\n \"--state\": {\n default: \"open\",\n enum: [\"open\", \"done\", \"archived\", \"all\"],\n type: \"string\",\n },\n \"--view\": {\n description: \"Filter by view bucket\",\n enum: [\"inbox\", \"anytime\", \"today\", \"upcoming\", \"someday\"],\n type: \"string\",\n },\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task list [options]\",\n },\n \"task prepend\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n text: { required: true, type: \"string\" },\n },\n command: \"task prepend\",\n description: \"Prepend text to task notes\",\n examples: ['donebear task prepend abc1 \"URGENT: \" --json'],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task prepend <id> <text> [options]\",\n },\n \"task read\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task read\",\n description: \"Print task description/notes as plain text\",\n examples: [\"donebear task read abc1\"],\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task read <id> [options]\",\n },\n \"task reopen\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task reopen\",\n examples: [\"donebear task reopen abc1 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task reopen <id> [options]\",\n },\n \"task show\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix (>= 4 chars)\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task show\",\n examples: [\n \"donebear task show abc1 --json\",\n \"donebear task show abc12345-0000-0000-0000-000000000000 --json\",\n ],\n json_output: {\n checklistItems: \"ChecklistItemRecord[]\",\n ok: \"boolean\",\n task: \"TaskRecord\",\n },\n options: {\n \"--workspace\": {\n description: \"Workspace id, slug, or name\",\n type: \"string\",\n },\n },\n usage: \"donebear task show <id> [options]\",\n },\n \"task unarchive\": {\n arguments: {\n id: {\n description: \"Task UUID or prefix\",\n required: true,\n type: \"string\",\n },\n },\n command: \"task unarchive\",\n examples: [\"donebear task unarchive abc1 --json\"],\n json_output: { id: \"string\", ok: \"boolean\" },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear task unarchive <id> [options]\",\n },\n \"team list\": {\n command: \"team list\",\n examples: [\"donebear team list --json\"],\n json_output: {\n ok: \"boolean\",\n teams: \"TeamRecord[]\",\n workspace: \"WorkspaceSummary\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear team list [options]\",\n },\n today: {\n command: \"today\",\n description: \"List today's open tasks\",\n examples: [\"donebear today --json\"],\n json_output: {\n count: \"number\",\n limited: \"TaskRecord[]\",\n ok: \"boolean\",\n workspace: \"WorkspaceSummary\",\n },\n options: { \"--workspace\": { type: \"string\" } },\n usage: \"donebear today [options]\",\n },\n whoami: {\n command: \"whoami\",\n examples: [\"donebear whoami --json\"],\n json_output: { ok: \"boolean\", source: \"string\", user: \"{ id, email }\" },\n options: {},\n usage: \"donebear whoami\",\n },\n \"workspace list\": {\n command: \"workspace list\",\n examples: [\"donebear workspace list --json\"],\n json_output: {\n currentWorkspaceId: \"string | null\",\n ok: \"boolean\",\n workspaces: \"WorkspaceSummary[]\",\n },\n options: {},\n usage: \"donebear workspace list [options]\",\n },\n \"workspace use\": {\n arguments: {\n id: {\n description: \"Workspace id, urlKey, or name\",\n required: true,\n type: \"string\",\n },\n },\n command: \"workspace use\",\n examples: [\n \"donebear workspace use my-org --json\",\n \"donebear workspace use abc12345 --json\",\n ],\n json_output: { ok: \"boolean\", workspace: \"WorkspaceSummary\" },\n notes: \"Persists selected workspace to ~/.config/donebear/context.json\",\n options: {},\n usage: \"donebear workspace use <id-or-slug>\",\n },\n};\n\n// Top-level command summaries (for \"donebear spec task\" without subcommand)\nconst TOP_LEVEL_SPECS: Record<string, object> = {\n auth: {\n command: \"auth\",\n description: \"Authentication\",\n non_interactive: \"Set DONEBEAR_TOKEN=<token> to skip interactive login.\",\n subcommands: {\n login: \"OAuth login (Google or GitHub)\",\n logout: \"Sign out and remove stored session\",\n status: \"Show auth status\",\n },\n tip: \"donebear spec auth login — get full spec for auth login\",\n },\n import: {\n command: \"import\",\n description: \"Import external data into Done Bear\",\n subcommands: {\n things: \"Import a Things 3 SQLite export into the selected workspace\",\n },\n tip: \"donebear spec import things — get full spec for the Things importer\",\n },\n label: {\n command: \"label\",\n description: \"List workspace labels\",\n subcommands: { list: \"List all labels\", show: \"Get label details\" },\n },\n project: {\n command: \"project\",\n description: \"Manage projects\",\n subcommands: {\n add: \"Create a new project\",\n archive: \"Archive a project\",\n done: \"Mark a project as complete\",\n edit: \"Update project fields\",\n list: \"List projects (--status: active|done|archived|all)\",\n show: \"Get project details by id, key, or name\",\n unarchive: \"Restore an archived project\",\n },\n tip: \"donebear spec project add — get full spec for project add\",\n },\n task: {\n command: \"task\",\n description: \"Create and manage tasks\",\n notes: \"Task id accepts full UUID or a prefix of >= 4 chars.\",\n subcommands: {\n add: \"Create a new task\",\n append: \"Append text to task notes\",\n archive: \"Archive a task\",\n checklist: \"Manage task checklist items\",\n done: \"Mark a task as complete\",\n edit: \"Update task fields\",\n list: \"List tasks (--state, --view, --search, --limit)\",\n prepend: \"Prepend text to task notes\",\n read: \"Print task notes as plain text\",\n reopen: \"Reopen a completed task\",\n show: \"Get task details by id\",\n unarchive: \"Restore an archived task\",\n },\n tip: \"donebear spec task add — get full spec for task add\",\n },\n team: {\n command: \"team\",\n description: \"List workspace teams\",\n subcommands: { list: \"List all teams\", show: \"Get team details\" },\n },\n workspace: {\n command: \"workspace\",\n description: \"Manage workspaces\",\n subcommands: {\n clear: \"Clear the default workspace\",\n create: \"Create a new workspace\",\n current: \"Show the active workspace\",\n invitations: \"List pending invitations\",\n invite: \"Invite a user by email\",\n join: \"Join a workspace by invite\",\n list: \"List all workspaces\",\n members: \"List workspace members\",\n use: \"Set the default workspace\",\n },\n tip: \"donebear spec workspace use — get full spec for workspace use\",\n },\n};\n\nconst runSpec = (\n _context: ReturnType<typeof contextFromCommand>,\n args: string[]\n): void => {\n // No args: return overview\n if (args.length === 0) {\n writeJson({ ok: true, ...OVERVIEW });\n return;\n }\n\n // Build lookup key: \"task add\" or just \"task\"\n const key = args.join(\" \");\n\n // Check detailed spec first\n const detail = COMMAND_SPECS[key];\n if (detail) {\n writeJson({ ok: true, ...detail });\n return;\n }\n\n // Check top-level command summary\n const topLevel = TOP_LEVEL_SPECS[key];\n if (topLevel) {\n writeJson({ ok: true, ...topLevel });\n return;\n }\n\n writeJson({\n error: {\n message: `No spec found for \"${key}\". Run \\`donebear spec\\` to see all commands.`,\n },\n ok: false,\n });\n};\n\nexport const registerSpecCommand = (program: Command): void => {\n program\n .command(\"spec\")\n .description(\"Progressive CLI spec for agent discovery — no auth required\")\n .argument(\"[command]\", \"Command name (e.g. task, project)\")\n .argument(\"[subcommand]\", \"Subcommand name (e.g. add, list)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n donebear spec Full CLI overview (~500 tokens)\n donebear spec task All task subcommands\n donebear spec task add Detailed spec: options, output shape, examples\n donebear spec project list Detailed spec for project list\n donebear spec import things Detailed spec for the Things importer\n donebear spec search Detailed spec for search\n donebear spec auth login Auth login options and non-interactive notes\n`\n )\n .action(\n async (\n command: string | undefined,\n subcommand: string | undefined,\n _options: unknown,\n cmd: Command\n ) => {\n const context = contextFromCommand(cmd);\n await runWithErrorHandling(context, () => {\n const args: string[] = [];\n if (command) {\n args.push(command.trim().toLowerCase());\n }\n if (subcommand) {\n args.push(subcommand.trim().toLowerCase());\n }\n runSpec(context, args);\n return Promise.resolve();\n });\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\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { findByRef, normalizeWorkspaceRef } from \"../command-helpers\";\nimport { loadTeamsByWorkspace, loadTeamsByWorkspaceIds } from \"../manage-api\";\nimport {\n writeFormattedRows,\n writeInfo,\n writeOutput,\n writeSuccess,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n resolveWorkspace,\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\ninterface TeamListOptions {\n workspace?: string;\n}\n\ninterface TeamShowOptions {\n workspace?: string;\n}\n\nconst runTeamList = async (\n context: ReturnType<typeof contextFromCommand>,\n workspaceOverride: string | null,\n options: TeamListOptions\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const teams =\n scope.mode === \"all\"\n ? await loadTeamsByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTeamsByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n teams,\n });\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 ${scopeLabel(scope)}:`);\n\n for (const team of teams) {\n writeInfo(context, `${team.id.slice(0, 8)} [${team.key}] ${team.name}`);\n }\n};\n\nconst runTeamShow = async (\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 apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\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 = findByRef(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 writeOutput(context, { team, workspace });\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 const 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 engineering-a1b2c3d4\n donebear team show Engineering\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(\"<ref>\", \"Team id, key, slug, name, 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\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport {\n normalizeWorkspaceRef,\n taskListHeaders,\n taskListLines,\n taskListRows,\n} from \"../command-helpers\";\nimport { parsePositiveInteger } from \"../command-parsers\";\nimport { loadTasksByWorkspace, loadTasksByWorkspaceIds } from \"../manage-api\";\nimport {\n copyToClipboard,\n writeFormattedRows,\n writeInfo,\n writeOutput,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport type { TaskRecord } from \"../types\";\nimport {\n resolveWorkspaceScope,\n scopeJsonFields,\n scopeLabel,\n} from \"../workspace-context\";\n\nconst DEFAULT_TODAY_LIMIT = 20;\n\ninterface TodayOptions {\n workspace?: string;\n limit: number;\n}\n\nconst filterToday = (tasks: TaskRecord[]): TaskRecord[] =>\n tasks.filter(\n (task) =>\n task.todayIndexReferenceDate !== null &&\n task.completedAt === null &&\n task.archivedAt === null\n );\n\nconst runToday = async (\n context: ReturnType<typeof contextFromCommand>,\n options: TodayOptions,\n workspaceOverride: string | null\n): Promise<void> => {\n const commandContext = await resolveCommandContext(context);\n\n const scope = await resolveWorkspaceScope(context, {\n apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? normalizeWorkspaceRef(options.workspace),\n });\n\n const tasks =\n scope.mode === \"all\"\n ? await loadTasksByWorkspaceIds(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceIds: scope.workspaces.map((w) => w.id),\n })\n : await loadTasksByWorkspace(context, {\n baseUrl: commandContext.apiBaseUrl,\n token: commandContext.token,\n workspaceId: scope.workspace.id,\n });\n\n const todayTasks = filterToday(tasks);\n const limited = todayTasks.slice(0, options.limit);\n\n if (context.json) {\n writeOutput(context, {\n ...scopeJsonFields(scope),\n count: limited.length,\n tasks: limited,\n total: todayTasks.length,\n });\n return;\n }\n\n if (\n writeFormattedRows(\n context,\n todayTasks.length,\n taskListHeaders(),\n taskListRows(limited)\n )\n ) {\n return;\n }\n\n if (scope.mode === \"single\" && scope.autoSelected) {\n writeInfo(context, `Auto-selected workspace: ${scope.workspace.name}`);\n }\n\n if (limited.length === 0) {\n writeInfo(context, \"No tasks for today.\");\n return;\n }\n\n writeInfo(\n context,\n `${scopeLabel(scope)} — Today (${limited.length}/${todayTasks.length})`\n );\n\n for (const line of taskListLines(limited)) {\n writeInfo(context, line);\n }\n\n if (context.copy) {\n copyToClipboard(taskListLines(limited).join(\"\\n\"));\n }\n};\n\nexport const 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\";\n\nimport { resolveAuthToken } from \"../auth-session\";\nimport { EXIT_CODES } from \"../errors\";\nimport { writeInfo, writeOutput, writeSuccess } from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport { getSupabaseUser, resolveSupabaseConfig } from \"../supabase\";\n\nconst runWhoAmI = async (\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 writeOutput(context, {\n error: {\n exitCode: EXIT_CODES.AUTH_REQUIRED,\n message: \"Not authenticated\",\n },\n ok: false,\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(\n config.url,\n config.publishableKey,\n resolvedToken.token\n );\n\n if (context.json) {\n writeOutput(context, {\n ok: true,\n source: resolvedToken.source,\n user: {\n email: user.email ?? null,\n id: user.id,\n },\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 const 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\";\n\nimport { resolveCommandContext } from \"../command-context\";\nimport { setCurrentWorkspace } from \"../context-store\";\nimport {\n createWorkspace,\n createWorkspaceInvitation,\n joinWorkspace,\n listWorkspaceInvitations,\n listWorkspaceMembers,\n listWorkspaces,\n} from \"../manage-api\";\nimport {\n copyToClipboard,\n writeCsv,\n writeInfo,\n writeOutput,\n writeSuccess,\n writeTotal,\n writeTsv,\n} from \"../output\";\nimport { contextFromCommand, runWithErrorHandling } from \"../runtime\";\nimport {\n isValidWorkspaceUrlKey,\n resolveWorkspace,\n toWorkspaceUrlKey,\n} from \"../workspace-context\";\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\nconst 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\nconst writeCurrentWorkspaceNotAvailable = (\n context: ReturnType<typeof contextFromCommand>,\n message: string\n): void => {\n if (context.json) {\n writeOutput(context, {\n workspace: null,\n });\n return;\n }\n\n writeInfo(context, message);\n writeInfo(context, \"Run `donebear workspace use <id-or-slug>`.\");\n};\n\nconst runWorkspaceList = async (\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 writeOutput(context, {\n currentWorkspaceId: commandContext.localContext.workspaceId,\n workspaces,\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\nconst runWorkspaceCurrent = async (\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 writeOutput(context, {\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\nconst runWorkspaceUse = async (\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 writeOutput(context, {\n selected: true,\n workspace: selected,\n });\n return;\n }\n\n writeSuccess(context, `Selected workspace: ${selected.name}`);\n writeInfo(context, `id: ${selected.id}`);\n};\n\nconst runWorkspaceClear = async (\n context: ReturnType<typeof contextFromCommand>\n): Promise<void> => {\n await setCurrentWorkspace(null);\n\n if (context.json) {\n writeOutput(context, {\n cleared: true,\n workspace: null,\n });\n return;\n }\n\n writeSuccess(context, \"Cleared current workspace.\");\n};\n\nconst runWorkspaceCreate = async (\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 body: {\n logoUrl: options.logoUrl,\n name,\n urlKey: slug,\n },\n token: commandContext.token,\n });\n\n if (options.use) {\n await setCurrentWorkspace(workspace.id);\n }\n\n if (context.json) {\n writeOutput(context, {\n selected: options.use,\n workspace,\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\nconst runWorkspaceJoin = async (\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 code: trimmedCode,\n token: commandContext.token,\n });\n\n if (options.use) {\n await setCurrentWorkspace(joined.workspace.id);\n }\n\n if (context.json) {\n writeOutput(context, {\n role: joined.role,\n selected: options.use,\n workspace: joined.workspace,\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\nconst runWorkspaceMembers = async (\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 apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\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 writeOutput(context, { members, workspace });\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\nconst runWorkspaceInvitations = async (\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 apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\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 writeOutput(context, { invitations, workspace });\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\nconst runWorkspaceInvite = async (\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 apiBaseUrl: commandContext.apiBaseUrl,\n storedWorkspaceId: commandContext.localContext.workspaceId,\n token: commandContext.token,\n workspaceRef: workspaceOverride ?? workspaceRefArg ?? null,\n });\n\n const invitation = await createWorkspaceInvitation(context, {\n baseUrl: commandContext.apiBaseUrl,\n email: options.email,\n role: options.role ?? \"member\",\n token: commandContext.token,\n workspaceId: workspace.id,\n });\n\n if (context.json) {\n writeOutput(context, { invitation, workspace });\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 const 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\";\n\nimport { Command } from \"commander\";\n\nimport { registerApiKeyCommands } from \"./commands/api-key\";\nimport { registerAuthCommands } from \"./commands/auth\";\nimport { registerContextCommand } from \"./commands/context\";\nimport { registerDoctorCommand } from \"./commands/doctor\";\nimport { registerHistoryCommand } from \"./commands/history\";\nimport { registerImportCommands } from \"./commands/import\";\nimport { runInteractiveMode } from \"./commands/interactive\";\nimport { registerLabelCommands } from \"./commands/label\";\nimport { registerProjectCommands } from \"./commands/project\";\nimport { registerSearchCommand } from \"./commands/search\";\nimport { registerSpecCommand } from \"./commands/spec\";\nimport { registerTaskCommands } from \"./commands/task\";\nimport { registerTeamCommands } from \"./commands/team\";\nimport { registerTodayCommand } from \"./commands/today\";\nimport { registerWhoAmICommand } from \"./commands/whoami\";\nimport { registerWorkspaceCommands } from \"./commands/workspace\";\nimport { CLI_NAME } from \"./constants\";\nimport { loadCliEnvironmentFiles } from \"./env\";\nimport { addGlobalOptions } from \"./options\";\nimport { contextFromArgv, runWithErrorHandling } from \"./runtime\";\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\nconst extractWorkspaceTarget = (\n argv: string[]\n): {\n processedArgv: string[];\n workspaceOverride: string | null;\n} => {\n const processedArgv = [...argv];\n // oxlint-disable-next-line no-unreadable-array-destructuring\n const [, , firstArg] = processedArgv;\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\nconst main = async (): 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\n addGlobalOptions(program);\n\n program.addHelpText(\n \"after\",\n `\nAgent quickstart (no auth needed):\n donebear spec Full CLI spec (~500 tokens)\n donebear spec task add Detailed spec for one command\n\nWith auth:\n donebear context Current workspace state\n donebear context --markdown Markdown snapshot for system prompts\n donebear task list --json List open tasks\n donebear task add \"Fix bug\" --when today --json\n donebear import things --dry-run --json\n\nAuth:\n donebear auth login OAuth browser login\n DONEBEAR_TOKEN=<token> Non-interactive / CI — set this env var\n\nWorkspace targeting:\n donebear workspace=myorg task list\n\nFiltering & output:\n donebear task list --json --jq \"[0].title\" JMESPath filter\n donebear task list --format yaml YAML output\n donebear task list --limit 5 Limit results\n donebear task add \"X\" --dry-run Preview mutation\n`\n );\n\n registerSpecCommand(program);\n registerDoctorCommand(program);\n registerContextCommand(program, workspaceOverride);\n registerAuthCommands(program);\n registerApiKeyCommands(program);\n registerWorkspaceCommands(program, workspaceOverride);\n registerTaskCommands(program, workspaceOverride);\n registerProjectCommands(program, workspaceOverride);\n registerImportCommands(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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CA;IACA;IACA;IACA;IACD;GACF;EACD,MAAM;GACJ,aAAa;GACb,eAAe;GACf,aAAa,CAAC,QAAQ,OAAO;GAC9B;EACD,OAAO;GACL,aAAa;GACb,eAAe;GAChB;EACD,QAAQ;GACN,aAAa;GACb,eAAe;GAChB;EACD,WAAW;GACT,aAAa;GACb,eAAe;GACf,aAAa;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF;EACF;CACD,gBAAgB;EACd,UAAU;EACV,aAAa;EACb,YAAY;EACZ,qBAAqB;EACrB,UAAU;EACV,eAAe;EACf,WAAW;EACX,eAAe;EACf,aAAa;EACd;CACD,iBACE;CACF,KAAK;CACL,qBACE;CACH;AAGD,MAAM,gBAAwC;CAC5C,cAAc;EACZ,SAAS;EACT,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GAAE,IAAI;GAAW,QAAQ;GAAU,MAAM;GAAiB;EACvE,iBACE;EACF,SAAS,EACP,aAAa;GACX,aAAa;GACb,MAAM;GACP,EACF;EACD,OAAO;EACR;CACD,eAAe;EACb,SAAS;EACT,UAAU,CAAC,8BAA8B;EACzC,aAAa;GACX,eAAe;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACP;EACD,SAAS,EAAE;EACX,OAAO;EACR;CACD,SAAS;EACP,SAAS;EACT,aACE;EACF,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GACX,gBAAgB;GAChB,aAAa;GACb,IAAI;GACJ,aAAa;GACb,YAAY;GACZ,MAAM;GACN,WAAW;GACZ;EACD,SAAS;GACP,cAAc;IACZ,aAAa;IACb,MAAM;IACP;GACD,iBAAiB;IACf,SAAS;IACT,aAAa;IACb,MAAM;IACP;GACD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,QAAQ;EACN,SAAS;EACT,aACE;EACF,UAAU,CAAC,mBAAmB,yBAAyB;EACvD,aAAa;GACX,QACE;GACF,IAAI;GACL;EACD,OACE;EACF,SAAS,EAAE;EACX,OAAO;EACR;CACD,SAAS;EACP,SAAS;EACT,UAAU,CACR,2BACA,kDACD;EACD,aAAa;GACX,SAAS;GACT,IAAI;GACJ,WAAW;GACZ;EACD,SAAS;GACP,WAAW;IAAE,SAAS;IAAI,MAAM;IAAU;GAC1C,WAAW;IACT,aAAa;IACb,MAAM;KAAC;KAAQ;KAAW;KAAS;KAAO;IAC1C,MAAM;IACP;GACD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,iBAAiB;EACf,SAAS;EACT,aAAa;EACb,UAAU;GACR;GACA;GACA;GACD;EACD,aAAa;GACX,QACE;GACF,cAAc;GACd,QAAQ;GACR,WAAW;GACX,aAAa;GACb,WAAW;GACZ;EACD,OACE;EACF,SAAS;GACP,gBAAgB;IACd,SAAS;IACT,aAAa;IACb,MAAM;IACP;GACD,kBAAkB;IAChB,aACE;IACF,MAAM;IACP;GACD,aAAa;IACX,aAAa;IACb,MAAM;IACP;GACD,mBAAmB;IACjB,SAAS;IACT,aACE;IACF,MAAM,CAAC,QAAQ,OAAO;IACtB,MAAM;IACP;GACD,eAAe;IACb,aAAa;IACb,MAAM;IACP;GACF;EACD,OAAO;EACR;CACD,cAAc;EACZ,SAAS;EACT,UAAU,CAAC,6BAA6B;EACxC,aAAa;GACX,QAAQ;GACR,IAAI;GACJ,WAAW;GACZ;EACD,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,eAAe;EACb,WAAW,EAAE,MAAM;GAAE,UAAU;GAAM,MAAM;GAAU,EAAE;EACvD,SAAS;EACT,UAAU,CACR,6CACA,4EACD;EACD,aAAa;GACX,IAAI;GACJ,KAAK;GACL,IAAI;GACJ,aAAa;GACd;EACD,OACE;EACF,SAAS;GACP,iBAAiB,EAAE,MAAM,UAAU;GACnC,iBAAiB;IACf,aAAa;IACb,QAAQ;IACR,MAAM;IACP;GACD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,gBAAgB;EACd,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CAAC,oCAAoC;EAC/C,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,gBAAgB;EACd,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CAAC,4DAA0D;EACrE,aAAa;GAAE,QAAQ;GAAU,IAAI;GAAU,IAAI;GAAW;EAC9D,SAAS;GACP,iBAAiB,EAAE,MAAM,UAAU;GACnC,UAAU,EAAE,MAAM,UAAU;GAC5B,iBAAiB;IAAE,QAAQ;IAAc,MAAM;IAAU;GACzD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,gBAAgB;EACd,SAAS;EACT,UAAU,CACR,gCACA,4CACD;EACD,aAAa;GACX,OAAO;GACP,IAAI;GACJ,UAAU;GACV,QAAQ;GACR,WAAW;GACZ;EACD,SAAS;GACP,YAAY;IACV,SAAS;IACT,MAAM;KAAC;KAAU;KAAQ;KAAY;KAAM;IAC3C,MAAM;IACP;GACD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,QAAQ;EACN,WAAW,EACT,OAAO;GACL,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CACR,wCACA,6CACD;EACD,aAAa;GACX,OAAO;GACP,SAAS;GACT,IAAI;GACJ,OAAO;GACP,WAAW;GACZ;EACD,SAAS;GACP,WAAW;IAAE,SAAS;IAAI,MAAM;IAAU;GAC1C,WAAW;IACT,SAAS;IACT,MAAM;KAAC;KAAQ;KAAQ;KAAY;KAAM;IACzC,MAAM;IACP;GACD,eAAe,EAAE,MAAM,UAAU;GAClC;EACD,OAAO;EACR;CACD,YAAY;EACV,WAAW,EACT,OAAO;GACL,aACE;GACF,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU;GACR;GACA;GACA;GACA;GACA;GACD;EACD,aAAa;GACX,SAAS;GACT,YAAY;GACZ,IAAI;GACJ,WAAW;GACX,QAAQ;GACR,OAAO;GACP,MAAM;GACN,aAAa;GACb,eAAe;GAChB;EACD,OACE;EACF,SAAS;GACP,cAAc;IACZ,aAAa;IACb,QAAQ;IACR,MAAM;IACP;GACD,WAAW;IACT,aAAa;IACb,MAAM;IACP;GACD,aAAa;IAAE,aAAa;IAA4B,MAAM;IAAU;GACxE,UAAU;IAAE,aAAa;IAAyB,MAAM;IAAU;GAClE,UAAU;IACR,SAAS;IACT,aAAa;IACb,MAAM;KAAC;KAAS;KAAW;KAAS;KAAY;KAAU;IAC1D,MAAM;IACP;GACD,eAAe;IACb,aAAa;IACb,MAAM;IACP;GACF;EACD,OAAO;EACR;CACD,eAAe;EACb,WAAW;GACT,IAAI;IACF,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACD,MAAM;IAAE,UAAU;IAAM,MAAM;IAAU;GACzC;EACD,SAAS;EACT,aAAa;EACb,UAAU,CAAC,0DAAwD;EACnE,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,gBAAgB;EACd,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CAAC,oCAAoC;EAC/C,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,aAAa;EACX,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CAAC,iCAAiC;EAC5C,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,aAAa;EACX,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CACR,4DACA,oEACD;EACD,aAAa;GAAE,QAAQ;GAAU,IAAI;GAAU,IAAI;GAAW;EAC9D,SAAS;GACP,cAAc;IACZ,aAAa;IACb,QAAQ;IACR,MAAM;IACP;GACD,WAAW;IAAE,aAAa;IAA6B,MAAM;IAAU;GACvE,aAAa;IAAE,aAAa;IAA4B,MAAM;IAAU;GACxE,UAAU;IAAE,aAAa;IAAyB,MAAM;IAAU;GAClE,WAAW,EAAE,MAAM,UAAU;GAC7B,UAAU;IACR,MAAM;KAAC;KAAS;KAAW;KAAS;KAAY;KAAU;IAC1D,MAAM;IACP;GACD,eAAe;IACb,aAAa;IACb,MAAM;IACP;GACF;EACD,OAAO;EACR;CACD,aAAa;EACX,SAAS;EACT,UAAU;GACR;GACA;GACA;GACA;GACD;EACD,aAAa;GACX,cAAc;GACd,OAAO;GACP,SAAS;GACT,IAAI;GACJ,QAAQ;GACR,OAAO;GACP,MAAM;GACN,WAAW;GACZ;EACD,SAAS;GACP,WAAW;IAAE,SAAS;IAAI,aAAa;IAAe,MAAM;IAAU;GACtE,YAAY;IACV,aAAa;IACb,MAAM;IACP;GACD,WAAW;IACT,SAAS;IACT,MAAM;KAAC;KAAQ;KAAQ;KAAY;KAAM;IACzC,MAAM;IACP;GACD,UAAU;IACR,aAAa;IACb,MAAM;KAAC;KAAS;KAAW;KAAS;KAAY;KAAU;IAC1D,MAAM;IACP;GACD,eAAe;IACb,aAAa;IACb,MAAM;IACP;GACF;EACD,OAAO;EACR;CACD,gBAAgB;EACd,WAAW;GACT,IAAI;IACF,aAAa;IACb,UAAU;IACV,MAAM;IACP;GACD,MAAM;IAAE,UAAU;IAAM,MAAM;IAAU;GACzC;EACD,SAAS;EACT,aAAa;EACb,UAAU,CAAC,iDAA+C;EAC1D,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,aAAa;EACX,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,aAAa;EACb,UAAU,CAAC,0BAA0B;EACrC,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,eAAe;EACb,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CAAC,mCAAmC;EAC9C,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,aAAa;EACX,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CACR,kCACA,iEACD;EACD,aAAa;GACX,gBAAgB;GAChB,IAAI;GACJ,MAAM;GACP;EACD,SAAS,EACP,eAAe;GACb,aAAa;GACb,MAAM;GACP,EACF;EACD,OAAO;EACR;CACD,kBAAkB;EAChB,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CAAC,sCAAsC;EACjD,aAAa;GAAE,IAAI;GAAU,IAAI;GAAW;EAC5C,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,aAAa;EACX,SAAS;EACT,UAAU,CAAC,4BAA4B;EACvC,aAAa;GACX,IAAI;GACJ,OAAO;GACP,WAAW;GACZ;EACD,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,OAAO;EACL,SAAS;EACT,aAAa;EACb,UAAU,CAAC,wBAAwB;EACnC,aAAa;GACX,OAAO;GACP,SAAS;GACT,IAAI;GACJ,WAAW;GACZ;EACD,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,EAAE;EAC9C,OAAO;EACR;CACD,QAAQ;EACN,SAAS;EACT,UAAU,CAAC,yBAAyB;EACpC,aAAa;GAAE,IAAI;GAAW,QAAQ;GAAU,MAAM;GAAiB;EACvE,SAAS,EAAE;EACX,OAAO;EACR;CACD,kBAAkB;EAChB,SAAS;EACT,UAAU,CAAC,iCAAiC;EAC5C,aAAa;GACX,oBAAoB;GACpB,IAAI;GACJ,YAAY;GACb;EACD,SAAS,EAAE;EACX,OAAO;EACR;CACD,iBAAiB;EACf,WAAW,EACT,IAAI;GACF,aAAa;GACb,UAAU;GACV,MAAM;GACP,EACF;EACD,SAAS;EACT,UAAU,CACR,wCACA,yCACD;EACD,aAAa;GAAE,IAAI;GAAW,WAAW;GAAoB;EAC7D,OAAO;EACP,SAAS,EAAE;EACX,OAAO;EACR;CACF;AAGD,MAAM,kBAA0C;CAC9C,MAAM;EACJ,SAAS;EACT,aAAa;EACb,iBAAiB;EACjB,aAAa;GACX,OAAO;GACP,QAAQ;GACR,QAAQ;GACT;EACD,KAAK;EACN;CACD,QAAQ;EACN,SAAS;EACT,aAAa;EACb,aAAa,EACX,QAAQ,+DACT;EACD,KAAK;EACN;CACD,OAAO;EACL,SAAS;EACT,aAAa;EACb,aAAa;GAAE,MAAM;GAAmB,MAAM;GAAqB;EACpE;CACD,SAAS;EACP,SAAS;EACT,aAAa;EACb,aAAa;GACX,KAAK;GACL,SAAS;GACT,MAAM;GACN,MAAM;GACN,MAAM;GACN,MAAM;GACN,WAAW;GACZ;EACD,KAAK;EACN;CACD,MAAM;EACJ,SAAS;EACT,aAAa;EACb,OAAO;EACP,aAAa;GACX,KAAK;GACL,QAAQ;GACR,SAAS;GACT,WAAW;GACX,MAAM;GACN,MAAM;GACN,MAAM;GACN,SAAS;GACT,MAAM;GACN,QAAQ;GACR,MAAM;GACN,WAAW;GACZ;EACD,KAAK;EACN;CACD,MAAM;EACJ,SAAS;EACT,aAAa;EACb,aAAa;GAAE,MAAM;GAAkB,MAAM;GAAoB;EAClE;CACD,WAAW;EACT,SAAS;EACT,aAAa;EACb,aAAa;GACX,OAAO;GACP,QAAQ;GACR,SAAS;GACT,aAAa;GACb,QAAQ;GACR,MAAM;GACN,MAAM;GACN,SAAS;GACT,KAAK;GACN;EACD,KAAK;EACN;CACF;AAED,MAAM,WACJ,UACA,SACS;AAET,KAAI,KAAK,WAAW,GAAG;AACrB,YAAU;GAAE,IAAI;GAAM,GAAG;GAAU,CAAC;AACpC;;CAIF,MAAM,MAAM,KAAK,KAAK,IAAI;CAG1B,MAAM,SAAS,cAAc;AAC7B,KAAI,QAAQ;AACV,YAAU;GAAE,IAAI;GAAM,GAAG;GAAQ,CAAC;AAClC;;CAIF,MAAM,WAAW,gBAAgB;AACjC,KAAI,UAAU;AACZ,YAAU;GAAE,IAAI;GAAM,GAAG;GAAU,CAAC;AACpC;;AAGF,WAAU;EACR,OAAO,EACL,SAAS,sBAAsB,IAAI,gDACpC;EACD,IAAI;EACL,CAAC;;AAGJ,MAAa,uBAAuB,YAA2B;AAC7D,SACG,QAAQ,OAAO,CACf,YAAY,8DAA8D,CAC1E,SAAS,aAAa,oCAAoC,CAC1D,SAAS,gBAAgB,mCAAmC,CAC5D,YACC,SACA;;;;;;;;;EAUD,CACA,OACC,OACE,SACA,YACA,UACA,QACG;EACH,MAAM,UAAU,mBAAmB,IAAI;AACvC,QAAM,qBAAqB,eAAe;GACxC,MAAM,OAAiB,EAAE;AACzB,OAAI,QACF,MAAK,KAAK,QAAQ,MAAM,CAAC,aAAa,CAAC;AAEzC,OAAI,WACF,MAAK,KAAK,WAAW,MAAM,CAAC,aAAa,CAAC;AAE5C,WAAQ,SAAS,KAAK;AACtB,UAAO,QAAQ,SAAS;IACxB;GAEL;;;;;AC90BL,MAAM,cAAc,OAClB,SACA,mBACA,YACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAE3D,MAAM,QAAQ,MAAM,sBAAsB,SAAS;EACjD,YAAY,eAAe;EAC3B,mBAAmB,eAAe,aAAa;EAC/C,OAAO,eAAe;EACtB,cAAc,qBAAqB,sBAAsB,QAAQ,UAAU;EAC5E,CAAC;CAEF,MAAM,QACJ,MAAM,SAAS,QACX,MAAM,wBAAwB,SAAS;EACrC,SAAS,eAAe;EACxB,OAAO,eAAe;EACtB,cAAc,MAAM,WAAW,KAAK,MAAM,EAAE,GAAG;EAChD,CAAC,GACF,MAAM,qBAAqB,SAAS;EAClC,SAAS,eAAe;EACxB,OAAO,eAAe;EACtB,aAAa,MAAM,UAAU;EAC9B,CAAC;AAER,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GACnB,GAAG,gBAAgB,MAAM;GACzB;GACD,CAAC;AACF;;CAGF,MAAM,UAAU;EAAC;EAAM;EAAO;EAAO;CACrC,MAAM,OAAO,MAAM,KAAK,MAAM;EAAC,EAAE;EAAI,EAAE;EAAK,EAAE;EAAK,CAAC;AAEpD,KAAI,mBAAmB,SAAS,MAAM,QAAQ,SAAS,KAAK,CAC1D;AAGF,KAAI,MAAM,WAAW,GAAG;AACtB,YAAU,SAAS,kBAAkB;AACrC;;AAGF,WAAU,SAAS,YAAY,WAAW,MAAM,CAAC,GAAG;AAEpD,MAAK,MAAM,QAAQ,MACjB,WAAU,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO;;AAI7E,MAAM,cAAc,OAClB,SACA,SACA,mBACA,YACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAE3D,MAAM,EAAE,cAAc,MAAM,iBAAiB,SAAS;EACpD,YAAY,eAAe;EAC3B,mBAAmB,eAAe,aAAa;EAC/C,OAAO,eAAe;EACtB,cAAc,qBAAqB,sBAAsB,QAAQ,UAAU;EAC5E,CAAC;CAEF,MAAM,QAAQ,MAAM,qBAAqB,SAAS;EAChD,SAAS,eAAe;EACxB,OAAO,eAAe;EACtB,aAAa,UAAU;EACxB,CAAC;CAEF,MAAM,OAAO,UAAU,QAAQ,MAAM,EAAE,MAAM;AAE7C,KAAI,CAAC,KACH,OAAM,IAAI,MAAM,SAAS,QAAQ,0CAA0C;AAG7E,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GAAE;GAAM;GAAW,CAAC;AACzC;;AAGF,cAAa,SAAS,KAAK,KAAK;AAChC,WAAU,SAAS,OAAO,KAAK,KAAK;AACpC,WAAU,SAAS,QAAQ,KAAK,MAAM;AACtC,WAAU,SAAS,SAAS,KAAK,OAAO;AACxC,WAAU,SAAS,gBAAgB,KAAK,eAAe,WAAW;AAClE,WAAU,SAAS,gBAAgB,KAAK,eAAe,WAAW;;AAGpE,MAAa,wBACX,SACA,sBACS;CACT,MAAM,OAAO,QACV,QAAQ,OAAO,CACf,MAAM,QAAQ,CACd,YAAY,eAAe,CAC3B,YACC,SACA;;;;;;;EAQD,CACA,OAAO,OAAO,UAAmB,YAAqB;EACrD,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,YAAY,SAAS,mBAAmB,EAAE,CAAC;IACjD;GACF;AAEJ,MACG,QAAQ,OAAO,CACf,MAAM,KAAK,CACX,YAAY,mDAAmD,CAC/D,OAAO,+BAA+B,oCAAoC,CAC1E,OAAO,OAAO,SAA0B,YAAqB;EAC5D,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,YAAY,SAAS,mBAAmB,QAAQ;IACtD;GACF;AAEJ,MACG,QAAQ,OAAO,CACf,YAAY,oBAAoB,CAChC,SAAS,SAAS,yCAAyC,CAC3D,OAAO,+BAA+B,oCAAoC,CAC1E,OACC,OAAO,SAAiB,SAA0B,YAAqB;EACrE,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,YAAY,SAAS,SAAS,mBAAmB,QAAQ;IAC/D;GAEL;;;;;ACtJL,MAAM,sBAAsB;AAO5B,MAAM,eAAe,UACnB,MAAM,QACH,SACC,KAAK,4BAA4B,QACjC,KAAK,gBAAgB,QACrB,KAAK,eAAe,KACvB;AAEH,MAAM,WAAW,OACf,SACA,SACA,sBACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAE3D,MAAM,QAAQ,MAAM,sBAAsB,SAAS;EACjD,YAAY,eAAe;EAC3B,mBAAmB,eAAe,aAAa;EAC/C,OAAO,eAAe;EACtB,cAAc,qBAAqB,sBAAsB,QAAQ,UAAU;EAC5E,CAAC;CAeF,MAAM,aAAa,YAZjB,MAAM,SAAS,QACX,MAAM,wBAAwB,SAAS;EACrC,SAAS,eAAe;EACxB,OAAO,eAAe;EACtB,cAAc,MAAM,WAAW,KAAK,MAAM,EAAE,GAAG;EAChD,CAAC,GACF,MAAM,qBAAqB,SAAS;EAClC,SAAS,eAAe;EACxB,OAAO,eAAe;EACtB,aAAa,MAAM,UAAU;EAC9B,CAAC,CAE6B;CACrC,MAAM,UAAU,WAAW,MAAM,GAAG,QAAQ,MAAM;AAElD,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GACnB,GAAG,gBAAgB,MAAM;GACzB,OAAO,QAAQ;GACf,OAAO;GACP,OAAO,WAAW;GACnB,CAAC;AACF;;AAGF,KACE,mBACE,SACA,WAAW,QACX,iBAAiB,EACjB,aAAa,QAAQ,CACtB,CAED;AAGF,KAAI,MAAM,SAAS,YAAY,MAAM,aACnC,WAAU,SAAS,4BAA4B,MAAM,UAAU,OAAO;AAGxE,KAAI,QAAQ,WAAW,GAAG;AACxB,YAAU,SAAS,sBAAsB;AACzC;;AAGF,WACE,SACA,GAAG,WAAW,MAAM,CAAC,YAAY,QAAQ,OAAO,GAAG,WAAW,OAAO,GACtE;AAED,MAAK,MAAM,QAAQ,cAAc,QAAQ,CACvC,WAAU,SAAS,KAAK;AAG1B,KAAI,QAAQ,KACV,iBAAgB,cAAc,QAAQ,CAAC,KAAK,KAAK,CAAC;;AAItD,MAAa,wBACX,SACA,sBACS;AACT,SACG,QAAQ,QAAQ,CAChB,YAAY,qBAAqB,CACjC,OAAO,+BAA+B,oCAAoC,CAC1E,OACC,uBACA,4BACC,UAA0B,qBAAqB,OAAO,QAAQ,EAC/D,oBACD,CACA,YACC,SACA;;;;;;EAOD,CACA,OAAO,OAAO,SAAuB,YAAqB;EACzD,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,SAAS,SAAS,SAAS,kBAAkB;IACnD;GACF;;;;;ACvIN,MAAM,YAAY,OAChB,YACkB;CAClB,MAAM,SAAS,uBAAuB;CACtC,MAAM,gBAAgB,MAAM,iBAAiB,SAAS,OAAO;AAE7D,KAAI,CAAC,eAAe;AAClB,UAAQ,WAAW,WAAW;AAE9B,MAAI,QAAQ,MAAM;AAChB,eAAY,SAAS;IACnB,OAAO;KACL,UAAU,WAAW;KACrB,SAAS;KACV;IACD,IAAI;IACL,CAAC;AACF;;AAGF,YAAU,SAAS,qBAAqB;AACxC,YAAU,SAAS,6BAA6B;AAChD;;CAGF,MAAM,OAAO,MAAM,gBACjB,OAAO,KACP,OAAO,gBACP,cAAc,MACf;AAED,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GACnB,IAAI;GACJ,QAAQ,cAAc;GACtB,MAAM;IACJ,OAAO,KAAK,SAAS;IACrB,IAAI,KAAK;IACV;GACF,CAAC;AACF;;AAGF,cAAa,SAAS,sBAAsB;AAC5C,WAAU,SAAS,OAAO,KAAK,KAAK;AACpC,WAAU,SAAS,UAAU,KAAK,SAAS,WAAW;AACtD,WAAU,SAAS,WAAW,cAAc,SAAS;;AAGvD,MAAa,yBAAyB,YAA2B;AAC/D,SACG,QAAQ,SAAS,CACjB,MAAM,KAAK,CACX,YAAY,sCAAsC,CAClD,OAAO,OAAO,UAAmB,YAAqB;EACrD,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,UAAU,QAAQ;IACxB;GACF;;;;;ACnBN,MAAM,iBACJ,cACA,eACG;CACH,MAAM,sBAAsB,aAAa,MAAM,CAAC,aAAa;AAE7D,QAAO,WAAW,MAAM,cAAc;AACpC,MAAI,UAAU,OAAO,aACnB,QAAO;AAGT,MAAI,UAAU,QAAQ,aAAa,KAAK,oBACtC,QAAO;AAGT,SAAO,UAAU,KAAK,aAAa,KAAK;GACxC;;AAGJ,MAAM,qCACJ,SACA,YACS;AACT,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS,EACnB,WAAW,MACZ,CAAC;AACF;;AAGF,WAAU,SAAS,QAAQ;AAC3B,WAAU,SAAS,6CAA6C;;AAGlE,MAAM,mBAAmB,OACvB,YACG;CACH,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAE3D,MAAM,aAAa,MAAM,eAAe,SAAS;EAC/C,SAAS,eAAe;EACxB,OAAO,eAAe;EACvB,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GACnB,oBAAoB,eAAe,aAAa;GAChD;GACD,CAAC;AACF;;AAGF,KAAI,WAAW,WAAW,GAAG;AAC3B,YAAU,SAAS,uBAAuB;AAC1C;;AAGF,WAAU,SAAS,cAAc;AAEjC,MAAK,MAAM,aAAa,WAItB,WACE,SACA,GAJA,UAAU,OAAO,eAAe,aAAa,cAAc,MAAM,IAIvD,GAAG,UAAU,GAAG,IAAI,UAAU,OAAO,UAAU,SAAS,KAAK,UAAU,OAAO,KAAK,GAAG,SAAS,UAAU,OACpH;;AAIL,MAAM,sBAAsB,OAC1B,YACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;AAE3D,KAAI,CAAC,eAAe,aAAa,aAAa;AAC5C,oCACE,SACA,iCACD;AACD;;CAQF,MAAM,aALa,MAAM,eAAe,SAAS;EAC/C,SAAS,eAAe;EACxB,OAAO,eAAe;EACvB,CAAC,EAE2B,MAC1B,SAAS,KAAK,OAAO,eAAe,aAAa,YACnD;AAED,KAAI,CAAC,WAAW;AACd,oCACE,SACA,2CACD;AACD;;AAGF,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS,EACnB,WACD,CAAC;AACF;;AAGF,cAAa,SAAS,sBAAsB,UAAU,OAAO;AAC7D,WAAU,SAAS,OAAO,UAAU,KAAK;AACzC,WAAU,SAAS,SAAS,UAAU,UAAU,WAAW;AAC3D,WAAU,SAAS,SAAS,UAAU,OAAO;;AAG/C,MAAM,kBAAkB,OACtB,SACA,cACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAO3D,MAAM,WAAW,cAAc,WALZ,MAAM,eAAe,SAAS;EAC/C,SAAS,eAAe;EACxB,OAAO,eAAe;EACvB,CAAC,CAEmD;AAErD,KAAI,CAAC,SACH,OAAM,IAAI,MACR,cAAc,UAAU,+CACzB;AAGH,OAAM,oBAAoB,SAAS,GAAG;AAEtC,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GACnB,UAAU;GACV,WAAW;GACZ,CAAC;AACF;;AAGF,cAAa,SAAS,uBAAuB,SAAS,OAAO;AAC7D,WAAU,SAAS,OAAO,SAAS,KAAK;;AAG1C,MAAM,oBAAoB,OACxB,YACkB;AAClB,OAAM,oBAAoB,KAAK;AAE/B,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GACnB,SAAS;GACT,WAAW;GACZ,CAAC;AACF;;AAGF,cAAa,SAAS,6BAA6B;;AAGrD,MAAM,qBAAqB,OACzB,SACA,MACA,YACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAE3D,MAAM,QAAQ,QAAQ,QAAQ,kBAAkB,KAAK,EAAE,MAAM;AAE7D,KAAI,CAAC,uBAAuB,KAAK,CAC/B,OAAM,IAAI,MACR,uFACD;CAGH,MAAM,YAAY,MAAM,gBAAgB,SAAS;EAC/C,SAAS,eAAe;EACxB,MAAM;GACJ,SAAS,QAAQ;GACjB;GACA,QAAQ;GACT;EACD,OAAO,eAAe;EACvB,CAAC;AAEF,KAAI,QAAQ,IACV,OAAM,oBAAoB,UAAU,GAAG;AAGzC,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GACnB,UAAU,QAAQ;GAClB;GACD,CAAC;AACF;;AAGF,cAAa,SAAS,sBAAsB,UAAU,OAAO;AAC7D,WAAU,SAAS,OAAO,UAAU,KAAK;AACzC,WAAU,SAAS,SAAS,UAAU,UAAU,OAAO;AAEvD,KAAI,QAAQ,IACV,WAAU,SAAS,4BAA4B;;AAInD,MAAM,mBAAmB,OACvB,SACA,MACA,YACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAC3D,MAAM,cAAc,KAAK,MAAM;AAE/B,KAAI,CAAC,YACH,OAAM,IAAI,MAAM,+BAA+B;CAGjD,MAAM,SAAS,MAAM,cAAc,SAAS;EAC1C,SAAS,eAAe;EACxB,MAAM;EACN,OAAO,eAAe;EACvB,CAAC;AAEF,KAAI,QAAQ,IACV,OAAM,oBAAoB,OAAO,UAAU,GAAG;AAGhD,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GACnB,MAAM,OAAO;GACb,UAAU,QAAQ;GAClB,WAAW,OAAO;GACnB,CAAC;AACF;;AAGF,cAAa,SAAS,qBAAqB,OAAO,UAAU,OAAO;AACnE,WAAU,SAAS,OAAO,OAAO,UAAU,KAAK;AAChD,WAAU,SAAS,SAAS,OAAO,OAAO;AAE1C,KAAI,QAAQ,IACV,WAAU,SAAS,4BAA4B;;AAInD,MAAM,sBAAsB,OAC1B,SACA,iBACA,mBACA,YACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAE3D,MAAM,EAAE,cAAc,MAAM,iBAAiB,SAAS;EACpD,YAAY,eAAe;EAC3B,mBAAmB,eAAe,aAAa;EAC/C,OAAO,eAAe;EACtB,cAAc,qBAAqB,mBAAmB;EACvD,CAAC;CAEF,MAAM,UAAU,MAAM,qBAAqB,SAAS;EAClD,SAAS,eAAe;EACxB,OAAO,eAAe;EACtB,aAAa,UAAU;EACxB,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GAAE;GAAS;GAAW,CAAC;AAC5C;;AAGF,KAAI,QAAQ,OAAO;AACjB,aAAW,SAAS,QAAQ,OAAO;AACnC;;CAGF,MAAM,SAAS,QAAQ,QAAQ,MAAM,CAAC,aAAa,IAAI,QAAQ;AAE/D,KAAI,WAAW,OAAO;AACpB,WACE;GAAC;GAAU;GAAQ;GAAS;GAAO,EACnC,QAAQ,KAAK,MAAM;GACjB,EAAE;GACF,EAAE,KAAK,QAAQ;GACf,EAAE,KAAK,SAAS;GAChB,EAAE;GACH,CAAC,CACH;AACD;;AAGF,KAAI,WAAW,OAAO;AACpB,WACE;GAAC;GAAU;GAAQ;GAAS;GAAO,EACnC,QAAQ,KAAK,MAAM;GACjB,EAAE;GACF,EAAE,KAAK,QAAQ;GACf,EAAE,KAAK,SAAS;GAChB,EAAE;GACH,CAAC,CACH;AACD;;AAGF,KAAI,QAAQ,WAAW,GAAG;AACxB,YAAU,SAAS,oBAAoB;AACvC;;AAGF,WAAU,SAAS,cAAc,UAAU,KAAK,GAAG;AAEnD,MAAK,MAAM,UAAU,QACnB,WACE,SACA,GAAG,OAAO,OAAO,IAAI,OAAO,KAAK,QAAQ,YAAY,IAAI,OAAO,KAAK,SAAS,aAAa,IAAI,OAAO,OACvG;;AAIL,MAAM,0BAA0B,OAC9B,SACA,iBACA,sBACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAE3D,MAAM,EAAE,cAAc,MAAM,iBAAiB,SAAS;EACpD,YAAY,eAAe;EAC3B,mBAAmB,eAAe,aAAa;EAC/C,OAAO,eAAe;EACtB,cAAc,qBAAqB,mBAAmB;EACvD,CAAC;CAEF,MAAM,cAAc,MAAM,yBAAyB,SAAS;EAC1D,SAAS,eAAe;EACxB,OAAO,eAAe;EACtB,aAAa,UAAU;EACxB,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GAAE;GAAa;GAAW,CAAC;AAChD;;AAGF,KAAI,YAAY,WAAW,GAAG;AAC5B,YAAU,SAAS,wBAAwB;AAC3C;;AAGF,WAAU,SAAS,mBAAmB,UAAU,KAAK,GAAG;AAExD,MAAK,MAAM,cAAc,aAAa;EACpC,MAAM,OAAO,WAAW,SAAS,QAAQ;AACzC,YACE,SACA,GAAG,WAAW,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,WAAW,SAAS,SAAS,IAAI,WAAW,KAAK,YAAY,WAAW,UAAU,SAAS,OAC7H;;;AAIL,MAAM,qBAAqB,OACzB,SACA,iBACA,mBACA,YACkB;CAClB,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ;CAE3D,MAAM,EAAE,cAAc,MAAM,iBAAiB,SAAS;EACpD,YAAY,eAAe;EAC3B,mBAAmB,eAAe,aAAa;EAC/C,OAAO,eAAe;EACtB,cAAc,qBAAqB,mBAAmB;EACvD,CAAC;CAEF,MAAM,aAAa,MAAM,0BAA0B,SAAS;EAC1D,SAAS,eAAe;EACxB,OAAO,QAAQ;EACf,MAAM,QAAQ,QAAQ;EACtB,OAAO,eAAe;EACtB,aAAa,UAAU;EACxB,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,cAAY,SAAS;GAAE;GAAY;GAAW,CAAC;AAC/C;;AAGF,cAAa,SAAS,0BAA0B,UAAU,OAAO;AACjE,WAAU,SAAS,SAAS,WAAW,OAAO;AAC9C,WAAU,SAAS,SAAS,WAAW,OAAO;AAC9C,WAAU,SAAS,YAAY,WAAW,YAAY;AAEtD,KAAI,WAAW,MACb,WAAU,SAAS,UAAU,WAAW,QAAQ;CAGlD,MAAM,OAAO,GAAG,eAAe,WAAW,UAAU,WAAW;AAC/D,WAAU,SAAS,SAAS,OAAO;AAEnC,KAAI,QAAQ,MAEV;MADe,gBAAgB,KAAK,CAElC,WAAU,SAAS,4BAA4B;;;AAKrD,MAAa,6BACX,SACA,sBACS;CACT,MAAM,YAAY,QACf,QAAQ,YAAY,CACpB,MAAM,KAAK,CACX,YAAY,oBAAoB,CAChC,YACC,SACA;;;;;;;;;EAUD,CACA,OAAO,OAAO,UAAmB,YAAqB;EACrD,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,iBAAiB,QAAQ;IAC/B;GACF;AAEJ,WACG,QAAQ,OAAO,CACf,MAAM,KAAK,CACX,YAAY,gDAAgD,CAC5D,OAAO,OAAO,UAAmB,YAAqB;EACrD,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,iBAAiB,QAAQ;IAC/B;GACF;AAEJ,WACG,QAAQ,UAAU,CAClB,YAAY,qCAAqC,CACjD,OAAO,OAAO,UAAmB,YAAqB;EACrD,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,oBAAoB,QAAQ;IAClC;GACF;AAEJ,WACG,QAAQ,MAAM,CACd,YAAY,4BAA4B,CACxC,SAAS,eAAe,oCAAoC,CAC5D,OACC,OAAO,cAAsB,UAAmB,YAAqB;EACnE,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,gBAAgB,SAAS,aAAa;IAC5C;GAEL;AAEH,WACG,QAAQ,QAAQ,CAChB,YAAY,8BAA8B,CAC1C,OAAO,OAAO,UAAmB,YAAqB;EACrD,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,kBAAkB,QAAQ;IAChC;GACF;AAEJ,WACG,QAAQ,SAAS,CACjB,YAAY,qBAAqB,CACjC,SAAS,UAAU,yBAAyB,CAC5C,OAAO,iBAAiB,wBAAwB,CAChD,OAAO,oBAAoB,qBAAqB,CAChD,OAAO,YAAY,kCAAkC,CACrD,OACC,OACE,MACA,SACA,YACG;EACH,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,mBAAmB,SAAS,MAAM,QAAQ;IAChD;GAEL;AAEH,WACG,QAAQ,OAAO,CACf,YAAY,2CAA2C,CACvD,SAAS,UAAU,kBAAkB,CACrC,OAAO,YAAY,yCAAyC,CAC5D,OACC,OAAO,MAAc,SAA+B,YAAqB;EACvE,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,iBAAiB,SAAS,MAAM,QAAQ;IAC9C;GAEL;AAEH,WACG,QAAQ,UAAU,CAClB,YAAY,qDAAqD,CACjE,SAAS,eAAe,oCAAoC,CAC5D,OAAO,qBAAqB,mCAAmC,CAC/D,OAAO,WAAW,0BAA0B,CAC5C,OACC,OACE,cACA,SACA,YACG;EACH,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,oBACJ,SACA,cACA,mBACA,QACD;IACD;GAEL;AAEH,WACG,QAAQ,cAAc,CACtB,MAAM,UAAU,CAChB,YACC,kEACD,CACA,SAAS,eAAe,oCAAoC,CAC5D,OACC,OACE,cACA,UACA,YACG;EACH,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,wBACJ,SACA,cACA,kBACD;IACD;GAEL;AAEH,WACG,QAAQ,SAAS,CACjB,YAAY,8DAA8D,CAC1E,SAAS,eAAe,oCAAoC,CAC5D,OAAO,mBAAmB,0BAA0B,CACpD,OAAO,iBAAiB,sCAAsC,SAAS,CACvE,OACC,OACE,cACA,SACA,YACG;EACH,MAAM,UAAU,mBAAmB,QAAQ;AAC3C,QAAM,qBAAqB,SAAS,YAAY;AAC9C,SAAM,mBACJ,SACA,cACA,mBACA,QACD;IACD;GAEL;;;;;AC7lBL,MAAM,kBADU,cAAc,OAAO,KAAK,IAAI,CACd,kBAAkB;AAElD,MAAM,yBAAyB;AAE/B,MAAM,0BACJ,SAIG;CACH,MAAM,gBAAgB,CAAC,GAAG,KAAK;CAE/B,MAAM,KAAK,YAAY;AAEvB,KAAI,UAAU;EACZ,MAAM,QAAQ,uBAAuB,KAAK,SAAS;AACnD,MAAI,QAAQ,IAAI;AACd,iBAAc,OAAO,GAAG,EAAE;AAC1B,UAAO;IAAE;IAAe,mBAAmB,MAAM,GAAG,MAAM;IAAE;;;AAIhE,QAAO;EAAE;EAAe,mBAAmB;EAAM;;AAGnD,MAAM,OAAO,YAA2B;AACtC,0BAAyB;CAEzB,MAAM,EAAE,eAAe,sBAAsB,uBAC3C,QAAQ,KACT;CAED,MAAM,UAAU,IAAI,SAAS;AAE7B,SACG,KAAK,SAAS,CACd,YAAY,wDAAwD,CACpE,QAAQ,gBAAgB,QAAQ,CAChC,oBAAoB,CACpB,0BAA0B;AAE7B,kBAAiB,QAAQ;AAEzB,SAAQ,YACN,SACA;;;;;;;;;;;;;;;;;;;;;;;;EAyBD;AAED,qBAAoB,QAAQ;AAC5B,uBAAsB,QAAQ;AAC9B,wBAAuB,SAAS,kBAAkB;AAClD,sBAAqB,QAAQ;AAC7B,wBAAuB,QAAQ;AAC/B,2BAA0B,SAAS,kBAAkB;AACrD,sBAAqB,SAAS,kBAAkB;AAChD,yBAAwB,SAAS,kBAAkB;AACnD,wBAAuB,SAAS,kBAAkB;AAClD,uBAAsB,SAAS,kBAAkB;AACjD,sBAAqB,SAAS,kBAAkB;AAChD,sBAAqB,SAAS,kBAAkB;AAChD,uBAAsB,SAAS,kBAAkB;AACjD,wBAAuB,SAAS,kBAAkB;AAClD,uBAAsB,QAAQ;CAE9B,MAAM,cAAc,cAAc,UAAU;CAC5C,MAAM,QAAQ,QAAQ,MAAM,UAAU;AAEtC,KAAI,eAAe,OAAO;AAExB,QAAM,mBADa,gBAAgB,cAAc,EACZ,QAAQ;AAC7C;;AAGF,OAAM,QAAQ,WAAW,cAAc;;AAKzC,MAAM,qBAFkB,gBAAgB,QAAQ,KAAK,EAET,KAAK"}
|